/ Hex Artifact Content
Login

Artifact c93a12edf5384bde1fa3c0a8bf9b3f58ca87d098:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 57 69 6e 64 6f 77 73 2e  ific to Windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
0210: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75   */../*.** Inclu
0220: 64 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20  de code that is 
0230: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73  common to all os
0240: 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69  _*.c files.*/.#i
0250: 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f  nclude "os_commo
0260: 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c  n.h"../*.** Incl
0270: 75 64 65 20 74 68 65 20 68 65 61 64 65 72 20 66  ude the header f
0280: 69 6c 65 20 66 6f 72 20 74 68 65 20 57 69 6e 64  ile for the Wind
0290: 6f 77 73 20 56 46 53 2e 0a 2a 2f 0a 23 69 6e 63  ows VFS..*/.#inc
02a0: 6c 75 64 65 20 22 6f 73 5f 77 69 6e 2e 68 22 0a  lude "os_win.h".
02b0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 69 6e 67  ./*.** Compiling
02c0: 20 61 6e 64 20 75 73 69 6e 67 20 57 41 4c 20 6d   and using WAL m
02d0: 6f 64 65 20 72 65 71 75 69 72 65 73 20 73 65 76  ode requires sev
02e0: 65 72 61 6c 20 41 50 49 73 20 74 68 61 74 20 61  eral APIs that a
02f0: 72 65 20 6f 6e 6c 79 0a 2a 2a 20 61 76 61 69 6c  re only.** avail
0300: 61 62 6c 65 20 69 6e 20 57 69 6e 64 6f 77 73 20  able in Windows 
0310: 70 6c 61 74 66 6f 72 6d 73 20 62 61 73 65 64 20  platforms based 
0320: 6f 6e 20 74 68 65 20 4e 54 20 6b 65 72 6e 65 6c  on the NT kernel
0330: 2e 0a 2a 2f 0a 23 69 66 20 21 53 51 4c 49 54 45  ..*/.#if !SQLITE
0340: 5f 4f 53 5f 57 49 4e 4e 54 20 26 26 20 21 64 65  _OS_WINNT && !de
0350: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
0360: 54 5f 57 41 4c 29 0a 23 20 20 65 72 72 6f 72 20  T_WAL).#  error 
0370: 22 57 41 4c 20 6d 6f 64 65 20 72 65 71 75 69 72  "WAL mode requir
0380: 65 73 20 73 75 70 70 6f 72 74 20 66 72 6f 6d 20  es support from 
0390: 74 68 65 20 57 69 6e 64 6f 77 73 20 4e 54 20 6b  the Windows NT k
03a0: 65 72 6e 65 6c 2c 20 63 6f 6d 70 69 6c 65 5c 0a  ernel, compile\.
03b0: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 4d 49   with SQLITE_OMI
03c0: 54 5f 57 41 4c 2e 22 0a 23 65 6e 64 69 66 0a 0a  T_WAL.".#endif..
03d0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
03e0: 49 4e 4e 54 20 26 26 20 53 51 4c 49 54 45 5f 4d  INNT && SQLITE_M
03f0: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23  AX_MMAP_SIZE>0.#
0400: 20 20 65 72 72 6f 72 20 22 4d 65 6d 6f 72 79 20    error "Memory 
0410: 6d 61 70 70 65 64 20 66 69 6c 65 73 20 72 65 71  mapped files req
0420: 75 69 72 65 20 73 75 70 70 6f 72 74 20 66 72 6f  uire support fro
0430: 6d 20 74 68 65 20 57 69 6e 64 6f 77 73 20 4e 54  m the Windows NT
0440: 20 6b 65 72 6e 65 6c 2c 5c 0a 20 63 6f 6d 70 69   kernel,\. compi
0450: 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4d  le with SQLITE_M
0460: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3d 30 2e 22  AX_MMAP_SIZE=0."
0470: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
0480: 72 65 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 57  re most of the W
0490: 69 6e 33 32 20 41 4e 53 49 20 41 50 49 73 20 61  in32 ANSI APIs a
04a0: 76 61 69 6c 61 62 6c 65 20 28 69 2e 65 2e 20 77  vailable (i.e. w
04b0: 69 74 68 20 63 65 72 74 61 69 6e 20 65 78 63 65  ith certain exce
04c0: 70 74 69 6f 6e 73 0a 2a 2a 20 62 61 73 65 64 20  ptions.** based 
04d0: 6f 6e 20 74 68 65 20 73 75 62 2d 70 6c 61 74 66  on the sub-platf
04e0: 6f 72 6d 29 3f 0a 2a 2f 0a 23 69 66 20 21 53 51  orm)?.*/.#if !SQ
04f0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
0500: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
0510: 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  T && !defined(SQ
0520: 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 41 4e  LITE_WIN32_NO_AN
0530: 53 49 29 0a 23 20 20 64 65 66 69 6e 65 20 53 51  SI).#  define SQ
0540: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
0550: 4e 53 49 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  NSI.#endif../*.*
0560: 2a 20 41 72 65 20 6d 6f 73 74 20 6f 66 20 74 68  * Are most of th
0570: 65 20 57 69 6e 33 32 20 55 6e 69 63 6f 64 65 20  e Win32 Unicode 
0580: 41 50 49 73 20 61 76 61 69 6c 61 62 6c 65 20 28  APIs available (
0590: 69 2e 65 2e 20 77 69 74 68 20 63 65 72 74 61 69  i.e. with certai
05a0: 6e 20 65 78 63 65 70 74 69 6f 6e 73 0a 2a 2a 20  n exceptions.** 
05b0: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 75 62  based on the sub
05c0: 2d 70 6c 61 74 66 6f 72 6d 29 3f 0a 2a 2f 0a 23  -platform)?.*/.#
05d0: 69 66 20 28 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if (SQLITE_OS_WI
05e0: 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53  NCE || SQLITE_OS
05f0: 5f 57 49 4e 4e 54 20 7c 7c 20 53 51 4c 49 54 45  _WINNT || SQLITE
0600: 5f 4f 53 5f 57 49 4e 52 54 29 20 26 26 20 5c 0a  _OS_WINRT) && \.
0610: 20 20 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c      !defined(SQL
0620: 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 57 49 44  ITE_WIN32_NO_WID
0630: 45 29 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  E).#  define SQL
0640: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
0650: 44 45 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  DE.#endif../*.**
0660: 20 4d 61 6b 65 20 73 75 72 65 20 61 74 20 6c 65   Make sure at le
0670: 61 73 74 20 6f 6e 65 20 73 65 74 20 6f 66 20 57  ast one set of W
0680: 69 6e 33 32 20 41 50 49 73 20 69 73 20 61 76 61  in32 APIs is ava
0690: 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 20 21  ilable..*/.#if !
06a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
06b0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26  IN32_HAS_ANSI) &
06c0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
06d0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
06e0: 29 0a 23 20 20 65 72 72 6f 72 20 22 41 74 20 6c  ).#  error "At l
06f0: 65 61 73 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49  east one of SQLI
0700: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
0710: 49 20 61 6e 64 20 53 51 4c 49 54 45 5f 57 49 4e  I and SQLITE_WIN
0720: 33 32 5f 48 41 53 5f 57 49 44 45 5c 0a 20 6d 75  32_HAS_WIDE\. mu
0730: 73 74 20 62 65 20 64 65 66 69 6e 65 64 2e 22 0a  st be defined.".
0740: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
0750: 66 69 6e 65 20 74 68 65 20 72 65 71 75 69 72 65  fine the require
0760: 64 20 57 69 6e 64 6f 77 73 20 53 44 4b 20 76 65  d Windows SDK ve
0770: 72 73 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 20  rsion constants 
0780: 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a  if they are not.
0790: 2a 2a 20 61 6c 72 65 61 64 79 20 61 76 61 69 6c  ** already avail
07a0: 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  able..*/.#ifndef
07b0: 20 4e 54 44 44 49 5f 57 49 4e 38 0a 23 20 20 64   NTDDI_WIN8.#  d
07c0: 65 66 69 6e 65 20 4e 54 44 44 49 5f 57 49 4e 38  efine NTDDI_WIN8
07d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07e0: 20 20 20 20 20 20 20 20 30 78 30 36 30 32 30 30          0x060200
07f0: 30 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  00.#endif..#ifnd
0800: 65 66 20 4e 54 44 44 49 5f 57 49 4e 42 4c 55 45  ef NTDDI_WINBLUE
0810: 0a 23 20 20 64 65 66 69 6e 65 20 4e 54 44 44 49  .#  define NTDDI
0820: 5f 57 49 4e 42 4c 55 45 20 20 20 20 20 20 20 20  _WINBLUE        
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30               0x0
0840: 36 30 33 30 30 30 30 0a 23 65 6e 64 69 66 0a 0a  6030000.#endif..
0850: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
0860: 65 65 20 69 66 20 74 68 65 20 47 65 74 56 65 72  ee if the GetVer
0870: 73 69 6f 6e 45 78 5b 41 57 5d 20 66 75 6e 63 74  sionEx[AW] funct
0880: 69 6f 6e 73 20 61 72 65 20 64 65 70 72 65 63 61  ions are depreca
0890: 74 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 74 61  ted on the.** ta
08a0: 72 67 65 74 20 73 79 73 74 65 6d 2e 20 20 47 65  rget system.  Ge
08b0: 74 56 65 72 73 69 6f 6e 45 78 20 77 61 73 20 66  tVersionEx was f
08c0: 69 72 73 74 20 64 65 70 72 65 63 61 74 65 64 20  irst deprecated 
08d0: 69 6e 20 57 69 6e 38 2e 31 2e 0a 2a 2f 0a 23 69  in Win8.1..*/.#i
08e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
08f0: 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a  32_GETVERSIONEX.
0900: 23 20 20 69 66 20 64 65 66 69 6e 65 64 28 4e 54  #  if defined(NT
0910: 44 44 49 5f 56 45 52 53 49 4f 4e 29 20 26 26 20  DDI_VERSION) && 
0920: 4e 54 44 44 49 5f 56 45 52 53 49 4f 4e 20 3e 3d  NTDDI_VERSION >=
0930: 20 4e 54 44 44 49 5f 57 49 4e 42 4c 55 45 0a 23   NTDDI_WINBLUE.#
0940: 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54      define SQLIT
0950: 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49  E_WIN32_GETVERSI
0960: 4f 4e 45 58 20 20 20 30 20 20 20 2f 2a 20 47 65  ONEX   0   /* Ge
0970: 74 56 65 72 73 69 6f 6e 45 78 28 29 20 69 73 20  tVersionEx() is 
0980: 64 65 70 72 65 63 61 74 65 64 20 2a 2f 0a 23 20  deprecated */.# 
0990: 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66 69 6e   else.#    defin
09a0: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47  e SQLITE_WIN32_G
09b0: 45 54 56 45 52 53 49 4f 4e 45 58 20 20 20 31 20  ETVERSIONEX   1 
09c0: 20 20 2f 2a 20 47 65 74 56 65 72 73 69 6f 6e 45    /* GetVersionE
09d0: 78 28 29 20 69 73 20 63 75 72 72 65 6e 74 20 2a  x() is current *
09e0: 2f 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  /.#  endif.#endi
09f0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 63 6f  f../*.** This co
0a00: 6e 73 74 61 6e 74 20 73 68 6f 75 6c 64 20 61 6c  nstant should al
0a10: 72 65 61 64 79 20 62 65 20 64 65 66 69 6e 65 64  ready be defined
0a20: 20 28 69 6e 20 74 68 65 20 22 57 69 6e 44 65 66   (in the "WinDef
0a30: 2e 68 22 20 53 44 4b 20 66 69 6c 65 29 2e 0a 2a  .h" SDK file)..*
0a40: 2f 0a 23 69 66 6e 64 65 66 20 4d 41 58 5f 50 41  /.#ifndef MAX_PA
0a50: 54 48 0a 23 20 20 64 65 66 69 6e 65 20 4d 41 58  TH.#  define MAX
0a60: 5f 50 41 54 48 20 20 20 20 20 20 20 20 20 20 20  _PATH           
0a70: 20 20 20 20 20 20 20 20 20 20 20 28 32 36 30 29             (260)
0a80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
0a90: 61 78 69 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20  aximum pathname 
0aa0: 6c 65 6e 67 74 68 20 28 69 6e 20 63 68 61 72 73  length (in chars
0ab0: 29 20 66 6f 72 20 57 69 6e 33 32 2e 20 20 54 68  ) for Win32.  Th
0ac0: 69 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c  is should normal
0ad0: 6c 79 20 62 65 0a 2a 2a 20 4d 41 58 5f 50 41 54  ly be.** MAX_PAT
0ae0: 48 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  H..*/.#ifndef SQ
0af0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50  LITE_WIN32_MAX_P
0b00: 41 54 48 5f 43 48 41 52 53 0a 23 20 20 64 65 66  ATH_CHARS.#  def
0b10: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
0b20: 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41 52 53 20  _MAX_PATH_CHARS 
0b30: 20 20 28 4d 41 58 5f 50 41 54 48 29 0a 23 65 6e    (MAX_PATH).#en
0b40: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
0b50: 63 6f 6e 73 74 61 6e 74 20 73 68 6f 75 6c 64 20  constant should 
0b60: 61 6c 72 65 61 64 79 20 62 65 20 64 65 66 69 6e  already be defin
0b70: 65 64 20 28 69 6e 20 74 68 65 20 22 57 69 6e 4e  ed (in the "WinN
0b80: 54 2e 68 22 20 53 44 4b 20 66 69 6c 65 29 2e 0a  T.h" SDK file)..
0b90: 2a 2f 0a 23 69 66 6e 64 65 66 20 55 4e 49 43 4f  */.#ifndef UNICO
0ba0: 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48  DE_STRING_MAX_CH
0bb0: 41 52 53 0a 23 20 20 64 65 66 69 6e 65 20 55 4e  ARS.#  define UN
0bc0: 49 43 4f 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58  ICODE_STRING_MAX
0bd0: 5f 43 48 41 52 53 20 20 20 20 20 20 28 33 32 37  _CHARS      (327
0be0: 36 37 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  67).#endif../*.*
0bf0: 2a 20 4d 61 78 69 6d 75 6d 20 70 61 74 68 6e 61  * Maximum pathna
0c00: 6d 65 20 6c 65 6e 67 74 68 20 28 69 6e 20 63 68  me length (in ch
0c10: 61 72 73 29 20 66 6f 72 20 57 69 6e 4e 54 2e 20  ars) for WinNT. 
0c20: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 72   This should nor
0c30: 6d 61 6c 6c 79 20 62 65 0a 2a 2a 20 55 4e 49 43  mally be.** UNIC
0c40: 4f 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58 5f 43  ODE_STRING_MAX_C
0c50: 48 41 52 53 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  HARS..*/.#ifndef
0c60: 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41   SQLITE_WINNT_MA
0c70: 58 5f 50 41 54 48 5f 43 48 41 52 53 0a 23 20 20  X_PATH_CHARS.#  
0c80: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
0c90: 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41  NNT_MAX_PATH_CHA
0ca0: 52 53 20 20 20 28 55 4e 49 43 4f 44 45 5f 53 54  RS   (UNICODE_ST
0cb0: 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52 53 29 0a  RING_MAX_CHARS).
0cc0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
0cd0: 78 69 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c  ximum pathname l
0ce0: 65 6e 67 74 68 20 28 69 6e 20 62 79 74 65 73 29  ength (in bytes)
0cf0: 20 66 6f 72 20 57 69 6e 33 32 2e 20 20 54 68 65   for Win32.  The
0d00: 20 4d 41 58 5f 50 41 54 48 20 6d 61 63 72 6f 20   MAX_PATH macro 
0d10: 69 73 20 69 6e 0a 2a 2a 20 63 68 61 72 61 63 74  is in.** charact
0d20: 65 72 73 2c 20 73 6f 20 77 65 20 61 6c 6c 6f 63  ers, so we alloc
0d30: 61 74 65 20 34 20 62 79 74 65 73 20 70 65 72 20  ate 4 bytes per 
0d40: 63 68 61 72 61 63 74 65 72 20 61 73 73 75 6d 69  character assumi
0d50: 6e 67 20 77 6f 72 73 74 2d 63 61 73 65 20 6f 66  ng worst-case of
0d60: 0a 2a 2a 20 34 2d 62 79 74 65 73 2d 70 65 72 2d  .** 4-bytes-per-
0d70: 63 68 61 72 61 63 74 65 72 20 66 6f 72 20 55 54  character for UT
0d80: 46 38 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  F8..*/.#ifndef S
0d90: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f  QLITE_WIN32_MAX_
0da0: 50 41 54 48 5f 42 59 54 45 53 0a 23 20 20 64 65  PATH_BYTES.#  de
0db0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
0dc0: 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53  2_MAX_PATH_BYTES
0dd0: 20 20 20 28 53 51 4c 49 54 45 5f 57 49 4e 33 32     (SQLITE_WIN32
0de0: 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41 52 53 2a  _MAX_PATH_CHARS*
0df0: 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  4).#endif../*.**
0e00: 20 4d 61 78 69 6d 75 6d 20 70 61 74 68 6e 61 6d   Maximum pathnam
0e10: 65 20 6c 65 6e 67 74 68 20 28 69 6e 20 62 79 74  e length (in byt
0e20: 65 73 29 20 66 6f 72 20 57 69 6e 4e 54 2e 20 20  es) for WinNT.  
0e30: 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d  This should norm
0e40: 61 6c 6c 79 20 62 65 0a 2a 2a 20 55 4e 49 43 4f  ally be.** UNICO
0e50: 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48  DE_STRING_MAX_CH
0e60: 41 52 53 20 2a 20 73 69 7a 65 6f 66 28 57 43 48  ARS * sizeof(WCH
0e70: 41 52 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  AR)..*/.#ifndef 
0e80: 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58  SQLITE_WINNT_MAX
0e90: 5f 50 41 54 48 5f 42 59 54 45 53 0a 23 20 20 64  _PATH_BYTES.#  d
0ea0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
0eb0: 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45  NT_MAX_PATH_BYTE
0ec0: 53 20 20 20 5c 0a 20 20 20 20 20 20 20 20 20 20  S   \.          
0ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ee0: 20 20 28 73 69 7a 65 6f 66 28 57 43 48 41 52 29    (sizeof(WCHAR)
0ef0: 20 2a 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f   * SQLITE_WINNT_
0f00: 4d 41 58 5f 50 41 54 48 5f 43 48 41 52 53 29 0a  MAX_PATH_CHARS).
0f10: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
0f20: 78 69 6d 75 6d 20 65 72 72 6f 72 20 6d 65 73 73  ximum error mess
0f30: 61 67 65 20 6c 65 6e 67 74 68 20 28 69 6e 20 63  age length (in c
0f40: 68 61 72 73 29 20 66 6f 72 20 57 69 6e 52 54 2e  hars) for WinRT.
0f50: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
0f60: 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52  TE_WIN32_MAX_ERR
0f70: 4d 53 47 5f 43 48 41 52 53 0a 23 20 20 64 65 66  MSG_CHARS.#  def
0f80: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
0f90: 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41 52  _MAX_ERRMSG_CHAR
0fa0: 53 20 28 31 30 32 34 29 0a 23 65 6e 64 69 66 0a  S (1024).#endif.
0fb0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e  ./*.** Returns n
0fc0: 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 63  on-zero if the c
0fd0: 68 61 72 61 63 74 65 72 20 73 68 6f 75 6c 64 20  haracter should 
0fe0: 62 65 20 74 72 65 61 74 65 64 20 61 73 20 61 20  be treated as a 
0ff0: 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 73 65 70  directory.** sep
1000: 61 72 61 74 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64  arator..*/.#ifnd
1010: 65 66 20 77 69 6e 49 73 44 69 72 53 65 70 0a 23  ef winIsDirSep.#
1020: 20 20 64 65 66 69 6e 65 20 77 69 6e 49 73 44 69    define winIsDi
1030: 72 53 65 70 28 61 29 20 20 20 20 20 20 20 20 20  rSep(a)         
1040: 20 20 20 20 20 20 20 28 28 28 61 29 20 3d 3d 20         (((a) == 
1050: 27 2f 27 29 20 7c 7c 20 28 28 61 29 20 3d 3d 20  '/') || ((a) == 
1060: 27 5c 5c 27 29 29 0a 23 65 6e 64 69 66 0a 0a 2f  '\\')).#endif../
1070: 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20  *.** This macro 
1080: 69 73 20 75 73 65 64 20 77 68 65 6e 20 61 20 6c  is used when a l
1090: 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73  ocal variable is
10a0: 20 73 65 74 20 74 6f 20 61 20 76 61 6c 75 65 20   set to a value 
10b0: 74 68 61 74 20 69 73 0a 2a 2a 20 5b 73 6f 6d 65  that is.** [some
10c0: 74 69 6d 65 73 5d 20 6e 6f 74 20 75 73 65 64 20  times] not used 
10d0: 62 79 20 74 68 65 20 63 6f 64 65 20 28 65 2e 67  by the code (e.g
10e0: 2e 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 61  . via conditiona
10f0: 6c 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 29 2e 0a  l compilation)..
1100: 2a 2f 0a 23 69 66 6e 64 65 66 20 55 4e 55 53 45  */.#ifndef UNUSE
1110: 44 5f 56 41 52 49 41 42 4c 45 5f 56 41 4c 55 45  D_VARIABLE_VALUE
1120: 0a 23 20 20 64 65 66 69 6e 65 20 55 4e 55 53 45  .#  define UNUSE
1130: 44 5f 56 41 52 49 41 42 4c 45 5f 56 41 4c 55 45  D_VARIABLE_VALUE
1140: 28 78 29 20 20 20 20 20 20 28 76 6f 69 64 29 28  (x)      (void)(
1150: 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
1160: 20 52 65 74 75 72 6e 73 20 74 68 65 20 63 68 61   Returns the cha
1170: 72 61 63 74 65 72 20 74 68 61 74 20 73 68 6f 75  racter that shou
1180: 6c 64 20 62 65 20 75 73 65 64 20 61 73 20 74 68  ld be used as th
1190: 65 20 64 69 72 65 63 74 6f 72 79 20 73 65 70 61  e directory sepa
11a0: 72 61 74 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65  rator..*/.#ifnde
11b0: 66 20 77 69 6e 47 65 74 44 69 72 53 65 70 0a 23  f winGetDirSep.#
11c0: 20 20 64 65 66 69 6e 65 20 77 69 6e 47 65 74 44    define winGetD
11d0: 69 72 53 65 70 28 29 20 20 20 20 20 20 20 20 20  irSep()         
11e0: 20 20 20 20 20 20 20 27 5c 5c 27 0a 23 65 6e 64         '\\'.#end
11f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 77 65 20  if../*.** Do we 
1200: 6e 65 65 64 20 74 6f 20 6d 61 6e 75 61 6c 6c 79  need to manually
1210: 20 64 65 66 69 6e 65 20 74 68 65 20 57 69 6e 33   define the Win3
1220: 32 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 41  2 file mapping A
1230: 50 49 73 20 66 6f 72 20 75 73 65 20 77 69 74 68  PIs for use with
1240: 20 57 41 4c 0a 2a 2a 20 6d 6f 64 65 20 6f 72 20   WAL.** mode or 
1250: 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 66 69  memory mapped fi
1260: 6c 65 73 20 28 65 2e 67 2e 20 74 68 65 73 65 20  les (e.g. these 
1270: 41 50 49 73 20 61 72 65 20 61 76 61 69 6c 61 62  APIs are availab
1280: 6c 65 20 69 6e 20 74 68 65 20 57 69 6e 64 6f 77  le in the Window
1290: 73 0a 2a 2a 20 43 45 20 53 44 4b 3b 20 68 6f 77  s.** CE SDK; how
12a0: 65 76 65 72 2c 20 74 68 65 79 20 61 72 65 20 6e  ever, they are n
12b0: 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  ot present in th
12c0: 65 20 68 65 61 64 65 72 20 66 69 6c 65 29 3f 0a  e header file)?.
12d0: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 57 49  */.#if SQLITE_WI
12e0: 4e 33 32 5f 46 49 4c 45 4d 41 50 50 49 4e 47 5f  N32_FILEMAPPING_
12f0: 41 50 49 20 26 26 20 5c 0a 20 20 20 20 20 20 20  API && \.       
1300: 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54   (!defined(SQLIT
1310: 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53  E_OMIT_WAL) || S
1320: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
1330: 49 5a 45 3e 30 29 0a 2f 2a 0a 2a 2a 20 54 77 6f  IZE>0)./*.** Two
1340: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6d 61 70   of the file map
1350: 70 69 6e 67 20 41 50 49 73 20 61 72 65 20 64 69  ping APIs are di
1360: 66 66 65 72 65 6e 74 20 75 6e 64 65 72 20 57 69  fferent under Wi
1370: 6e 52 54 2e 20 20 46 69 67 75 72 65 20 6f 75 74  nRT.  Figure out
1380: 20 77 68 69 63 68 0a 2a 2a 20 73 65 74 20 77 65   which.** set we
1390: 20 6e 65 65 64 2e 0a 2a 2f 0a 23 69 66 20 53 51   need..*/.#if SQ
13a0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 57 49  LITE_OS_WINRT.WI
13b0: 4e 42 41 53 45 41 50 49 20 48 41 4e 44 4c 45 20  NBASEAPI HANDLE 
13c0: 57 49 4e 41 50 49 20 43 72 65 61 74 65 46 69 6c  WINAPI CreateFil
13d0: 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 28  eMappingFromApp(
13e0: 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20  HANDLE, \.      
13f0: 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54    LPSECURITY_ATT
1400: 52 49 42 55 54 45 53 2c 20 55 4c 4f 4e 47 2c 20  RIBUTES, ULONG, 
1410: 55 4c 4f 4e 47 36 34 2c 20 4c 50 43 57 53 54 52  ULONG64, LPCWSTR
1420: 29 3b 0a 0a 57 49 4e 42 41 53 45 41 50 49 20 4c  );..WINBASEAPI L
1430: 50 56 4f 49 44 20 57 49 4e 41 50 49 20 4d 61 70  PVOID WINAPI Map
1440: 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70  ViewOfFileFromAp
1450: 70 28 48 41 4e 44 4c 45 2c 20 55 4c 4f 4e 47 2c  p(HANDLE, ULONG,
1460: 20 55 4c 4f 4e 47 36 34 2c 20 53 49 5a 45 5f 54   ULONG64, SIZE_T
1470: 29 3b 0a 23 65 6c 73 65 0a 23 69 66 20 64 65 66  );.#else.#if def
1480: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
1490: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 57 49 4e 42  2_HAS_ANSI).WINB
14a0: 41 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49  ASEAPI HANDLE WI
14b0: 4e 41 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d  NAPI CreateFileM
14c0: 61 70 70 69 6e 67 41 28 48 41 4e 44 4c 45 2c 20  appingA(HANDLE, 
14d0: 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49  LPSECURITY_ATTRI
14e0: 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20  BUTES, \.       
14f0: 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44   DWORD, DWORD, D
1500: 57 4f 52 44 2c 20 4c 50 43 53 54 52 29 3b 0a 23  WORD, LPCSTR);.#
1510: 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
1520: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
1530: 53 5f 41 4e 53 49 29 20 2a 2f 0a 0a 23 69 66 20  S_ANSI) */..#if 
1540: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
1550: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 57  IN32_HAS_WIDE).W
1560: 49 4e 42 41 53 45 41 50 49 20 48 41 4e 44 4c 45  INBASEAPI HANDLE
1570: 20 57 49 4e 41 50 49 20 43 72 65 61 74 65 46 69   WINAPI CreateFi
1580: 6c 65 4d 61 70 70 69 6e 67 57 28 48 41 4e 44 4c  leMappingW(HANDL
1590: 45 2c 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54  E, LPSECURITY_AT
15a0: 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20 20 20  TRIBUTES, \.    
15b0: 20 20 20 20 44 57 4f 52 44 2c 20 44 57 4f 52 44      DWORD, DWORD
15c0: 2c 20 44 57 4f 52 44 2c 20 4c 50 43 57 53 54 52  , DWORD, LPCWSTR
15d0: 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  );.#endif /* def
15e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
15f0: 32 5f 48 41 53 5f 57 49 44 45 29 20 2a 2f 0a 0a  2_HAS_WIDE) */..
1600: 57 49 4e 42 41 53 45 41 50 49 20 4c 50 56 4f 49  WINBASEAPI LPVOI
1610: 44 20 57 49 4e 41 50 49 20 4d 61 70 56 69 65 77  D WINAPI MapView
1620: 4f 66 46 69 6c 65 28 48 41 4e 44 4c 45 2c 20 44  OfFile(HANDLE, D
1630: 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f  WORD, DWORD, DWO
1640: 52 44 2c 20 53 49 5a 45 5f 54 29 3b 0a 23 65 6e  RD, SIZE_T);.#en
1650: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53  dif /* SQLITE_OS
1660: 5f 57 49 4e 52 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _WINRT */../*.**
1670: 20 54 68 69 73 20 66 69 6c 65 20 6d 61 70 70 69   This file mappi
1680: 6e 67 20 41 50 49 20 69 73 20 63 6f 6d 6d 6f 6e  ng API is common
1690: 20 74 6f 20 62 6f 74 68 20 57 69 6e 33 32 20 61   to both Win32 a
16a0: 6e 64 20 57 69 6e 52 54 2e 0a 2a 2f 0a 57 49 4e  nd WinRT..*/.WIN
16b0: 42 41 53 45 41 50 49 20 42 4f 4f 4c 20 57 49 4e  BASEAPI BOOL WIN
16c0: 41 50 49 20 55 6e 6d 61 70 56 69 65 77 4f 66 46  API UnmapViewOfF
16d0: 69 6c 65 28 4c 50 43 56 4f 49 44 29 3b 0a 23 65  ile(LPCVOID);.#e
16e0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57  ndif /* SQLITE_W
16f0: 49 4e 33 32 5f 46 49 4c 45 4d 41 50 50 49 4e 47  IN32_FILEMAPPING
1700: 5f 41 50 49 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  _API */../*.** S
1710: 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f  ome Microsoft co
1720: 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74 68 69  mpilers lack thi
1730: 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f  s definition..*/
1740: 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c 49 44  .#ifndef INVALID
1750: 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
1760: 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49  .# define INVALI
1770: 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
1780: 53 20 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65  S ((DWORD)-1).#e
1790: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 46 49  ndif..#ifndef FI
17a0: 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 0a 23 20 64  LE_FLAG_MASK.# d
17b0: 65 66 69 6e 65 20 46 49 4c 45 5f 46 4c 41 47 5f  efine FILE_FLAG_
17c0: 4d 41 53 4b 20 20 20 20 20 20 20 20 20 20 28 30  MASK          (0
17d0: 78 46 46 33 43 30 30 30 30 29 0a 23 65 6e 64 69  xFF3C0000).#endi
17e0: 66 0a 0a 23 69 66 6e 64 65 66 20 46 49 4c 45 5f  f..#ifndef FILE_
17f0: 41 54 54 52 49 42 55 54 45 5f 4d 41 53 4b 0a 23  ATTRIBUTE_MASK.#
1800: 20 64 65 66 69 6e 65 20 46 49 4c 45 5f 41 54 54   define FILE_ATT
1810: 52 49 42 55 54 45 5f 4d 41 53 4b 20 20 20 20 20  RIBUTE_MASK     
1820: 28 30 78 30 30 30 33 46 46 46 37 29 0a 23 65 6e  (0x0003FFF7).#en
1830: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
1840: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 20  ITE_OMIT_WAL./* 
1850: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
1860: 65 73 20 74 6f 20 73 74 72 75 63 74 75 72 65 73  es to structures
1870: 20 75 73 65 64 20 66 6f 72 20 57 41 4c 20 2a 2f   used for WAL */
1880: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1890: 77 69 6e 53 68 6d 20 77 69 6e 53 68 6d 3b 20 20  winShm winShm;  
18a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f           /* A co
18b0: 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72  nnection to shar
18c0: 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70  ed-memory */.typ
18d0: 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 53  edef struct winS
18e0: 68 6d 4e 6f 64 65 20 77 69 6e 53 68 6d 4e 6f 64  hmNode winShmNod
18f0: 65 3b 20 20 20 2f 2a 20 41 20 72 65 67 69 6f 6e  e;   /* A region
1900: 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   of shared-memor
1910: 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y */.#endif../*.
1920: 2a 2a 20 57 69 6e 43 45 20 6c 61 63 6b 73 20 6e  ** WinCE lacks n
1930: 61 74 69 76 65 20 73 75 70 70 6f 72 74 20 66 6f  ative support fo
1940: 72 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73  r file locking s
1950: 6f 20 77 65 20 68 61 76 65 20 74 6f 20 66 61 6b  o we have to fak
1960: 65 20 69 74 0a 2a 2a 20 77 69 74 68 20 73 6f 6d  e it.** with som
1970: 65 20 63 6f 64 65 20 6f 66 20 6f 75 72 20 6f 77  e code of our ow
1980: 6e 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  n..*/.#if SQLITE
1990: 5f 4f 53 5f 57 49 4e 43 45 0a 74 79 70 65 64 65  _OS_WINCE.typede
19a0: 66 20 73 74 72 75 63 74 20 77 69 6e 63 65 4c 6f  f struct winceLo
19b0: 63 6b 20 7b 0a 20 20 69 6e 74 20 6e 52 65 61 64  ck {.  int nRead
19c0: 65 72 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  ers;       /* Nu
19d0: 6d 62 65 72 20 6f 66 20 72 65 61 64 65 72 20 6c  mber of reader l
19e0: 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 2a 2f  ocks obtained */
19f0: 0a 20 20 42 4f 4f 4c 20 62 50 65 6e 64 69 6e 67  .  BOOL bPending
1a00: 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61  ;      /* Indica
1a10: 74 65 73 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f  tes a pending lo
1a20: 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61  ck has been obta
1a30: 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62  ined */.  BOOL b
1a40: 52 65 73 65 72 76 65 64 3b 20 20 20 20 20 2f 2a  Reserved;     /*
1a50: 20 49 6e 64 69 63 61 74 65 73 20 61 20 72 65 73   Indicates a res
1a60: 65 72 76 65 64 20 6c 6f 63 6b 20 68 61 73 20 62  erved lock has b
1a70: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a  een obtained */.
1a80: 20 20 42 4f 4f 4c 20 62 45 78 63 6c 75 73 69 76    BOOL bExclusiv
1a90: 65 3b 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74  e;    /* Indicat
1aa0: 65 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  es an exclusive 
1ab0: 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62  lock has been ob
1ac0: 74 61 69 6e 65 64 20 2a 2f 0a 7d 20 77 69 6e 63  tained */.} winc
1ad0: 65 4c 6f 63 6b 3b 0a 23 65 6e 64 69 66 0a 0a 2f  eLock;.#endif../
1ae0: 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 46 69 6c 65  *.** The winFile
1af0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 20   structure is a 
1b00: 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71 6c 69  subclass of sqli
1b10: 74 65 33 5f 66 69 6c 65 2a 20 73 70 65 63 69 66  te3_file* specif
1b20: 69 63 20 74 6f 20 74 68 65 20 77 69 6e 33 32 0a  ic to the win32.
1b30: 2a 2a 20 70 6f 72 74 61 62 69 6c 69 74 79 20 6c  ** portability l
1b40: 61 79 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ayer..*/.typedef
1b50: 20 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20   struct winFile 
1b60: 77 69 6e 46 69 6c 65 3b 0a 73 74 72 75 63 74 20  winFile;.struct 
1b70: 77 69 6e 46 69 6c 65 20 7b 0a 20 20 63 6f 6e 73  winFile {.  cons
1b80: 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
1b90: 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 3b 20 2f  hods *pMethod; /
1ba0: 2a 2a 2a 20 4d 75 73 74 20 62 65 20 66 69 72 73  *** Must be firs
1bb0: 74 20 2a 2a 2a 2f 0a 20 20 73 71 6c 69 74 65 33  t ***/.  sqlite3
1bc0: 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20  _vfs *pVfs;     
1bd0: 20 2f 2a 20 54 68 65 20 56 46 53 20 75 73 65 64   /* The VFS used
1be0: 20 74 6f 20 6f 70 65 6e 20 74 68 69 73 20 66 69   to open this fi
1bf0: 6c 65 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68  le */.  HANDLE h
1c00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c10: 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 61 63  /* Handle for ac
1c20: 63 65 73 73 69 6e 67 20 74 68 65 20 66 69 6c 65  cessing the file
1c30: 20 2a 2f 0a 20 20 75 38 20 6c 6f 63 6b 74 79 70   */.  u8 locktyp
1c40: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
1c50: 20 54 79 70 65 20 6f 66 20 6c 6f 63 6b 20 63 75   Type of lock cu
1c60: 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 20  rrently held on 
1c70: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 73  this file */.  s
1c80: 68 6f 72 74 20 73 68 61 72 65 64 4c 6f 63 6b 42  hort sharedLockB
1c90: 79 74 65 3b 20 20 20 2f 2a 20 52 61 6e 64 6f 6d  yte;   /* Random
1ca0: 6c 79 20 63 68 6f 73 65 6e 20 62 79 74 65 20 75  ly chosen byte u
1cb0: 73 65 64 20 61 73 20 61 20 73 68 61 72 65 64 20  sed as a shared 
1cc0: 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 63 74 72  lock */.  u8 ctr
1cd0: 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  lFlags;         
1ce0: 20 20 2f 2a 20 46 6c 61 67 73 2e 20 20 53 65 65    /* Flags.  See
1cf0: 20 57 49 4e 46 49 4c 45 5f 2a 20 62 65 6c 6f 77   WINFILE_* below
1d00: 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74   */.  DWORD last
1d10: 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 2f 2a  Errno;        /*
1d20: 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72 72   The Windows err
1d30: 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74  no from the last
1d40: 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 23 69   I/O error */.#i
1d50: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1d60: 54 5f 57 41 4c 0a 20 20 77 69 6e 53 68 6d 20 2a  T_WAL.  winShm *
1d70: 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pShm;           
1d80: 2f 2a 20 49 6e 73 74 61 6e 63 65 20 6f 66 20 73  /* Instance of s
1d90: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e 20  hared memory on 
1da0: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 23 65 6e  this file */.#en
1db0: 64 69 66 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  dif.  const char
1dc0: 20 2a 7a 50 61 74 68 3b 20 20 20 20 20 20 2f 2a   *zPath;      /*
1dd0: 20 46 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   Full pathname o
1de0: 66 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  f this file */. 
1df0: 20 69 6e 74 20 73 7a 43 68 75 6e 6b 3b 20 20 20   int szChunk;   
1e00: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 75 6e           /* Chun
1e10: 6b 20 73 69 7a 65 20 63 6f 6e 66 69 67 75 72 65  k size configure
1e20: 64 20 62 79 20 46 43 4e 54 4c 5f 43 48 55 4e 4b  d by FCNTL_CHUNK
1e30: 5f 53 49 5a 45 20 2a 2f 0a 23 69 66 20 53 51 4c  _SIZE */.#if SQL
1e40: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 4c  ITE_OS_WINCE.  L
1e50: 50 57 53 54 52 20 7a 44 65 6c 65 74 65 4f 6e 43  PWSTR zDeleteOnC
1e60: 6c 6f 73 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f  lose;  /* Name o
1e70: 66 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65  f file to delete
1e80: 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f   when closing */
1e90: 0a 20 20 48 41 4e 44 4c 45 20 68 4d 75 74 65 78  .  HANDLE hMutex
1ea0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75  ;          /* Mu
1eb0: 74 65 78 20 75 73 65 64 20 74 6f 20 63 6f 6e 74  tex used to cont
1ec0: 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 73 68  rol access to sh
1ed0: 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 48  ared lock */.  H
1ee0: 41 4e 44 4c 45 20 68 53 68 61 72 65 64 3b 20 20  ANDLE hShared;  
1ef0: 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
1f00: 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20   memory segment 
1f10: 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
1f20: 20 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20   */.  winceLock 
1f30: 6c 6f 63 61 6c 3b 20 20 20 20 20 20 20 20 2f 2a  local;        /*
1f40: 20 4c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20   Locks obtained 
1f50: 62 79 20 74 68 69 73 20 69 6e 73 74 61 6e 63 65  by this instance
1f60: 20 6f 66 20 77 69 6e 46 69 6c 65 20 2a 2f 0a 20   of winFile */. 
1f70: 20 77 69 6e 63 65 4c 6f 63 6b 20 2a 73 68 61 72   winceLock *shar
1f80: 65 64 3b 20 20 20 20 20 20 2f 2a 20 47 6c 6f 62  ed;      /* Glob
1f90: 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6d  al shared lock m
1fa0: 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 66 69  emory for the fi
1fb0: 6c 65 20 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  le  */.#endif.#i
1fc0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
1fd0: 50 5f 53 49 5a 45 3e 30 0a 20 20 69 6e 74 20 6e  P_SIZE>0.  int n
1fe0: 46 65 74 63 68 4f 75 74 3b 20 20 20 20 20 20 20  FetchOut;       
1ff0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2000: 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  er of outstandin
2010: 67 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e  g xFetch referen
2020: 63 65 73 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20  ces */.  HANDLE 
2030: 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20  hMap;           
2040: 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
2050: 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20 6d   for accessing m
2060: 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 2a 2f  emory mapping */
2070: 0a 20 20 76 6f 69 64 20 2a 70 4d 61 70 52 65 67  .  void *pMapReg
2080: 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
2090: 20 2f 2a 20 41 72 65 61 20 6d 65 6d 6f 72 79 20   /* Area memory 
20a0: 6d 61 70 70 65 64 20 2a 2f 0a 20 20 73 71 6c 69  mapped */.  sqli
20b0: 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69  te3_int64 mmapSi
20c0: 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20 55 73 61  ze;       /* Usa
20d0: 62 6c 65 20 73 69 7a 65 20 6f 66 20 6d 61 70 70  ble size of mapp
20e0: 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20 73  ed region */.  s
20f0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61  qlite3_int64 mma
2100: 70 53 69 7a 65 41 63 74 75 61 6c 3b 20 2f 2a 20  pSizeActual; /* 
2110: 41 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 6d  Actual size of m
2120: 61 70 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a  apped region */.
2130: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
2140: 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 20 20 20 20  mmapSizeMax;    
2150: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 46 43  /* Configured FC
2160: 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 76 61  NTL_MMAP_SIZE va
2170: 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  lue */.#endif.};
2180: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20  ../*.** Allowed 
2190: 76 61 6c 75 65 73 20 66 6f 72 20 77 69 6e 46 69  values for winFi
21a0: 6c 65 2e 63 74 72 6c 46 6c 61 67 73 0a 2a 2f 0a  le.ctrlFlags.*/.
21b0: 23 64 65 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f  #define WINFILE_
21c0: 52 44 4f 4e 4c 59 20 20 20 20 20 20 20 20 20 20  RDONLY          
21d0: 30 78 30 32 20 20 20 2f 2a 20 43 6f 6e 6e 65 63  0x02   /* Connec
21e0: 74 69 6f 6e 20 69 73 20 72 65 61 64 20 6f 6e 6c  tion is read onl
21f0: 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e  y */.#define WIN
2200: 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c  FILE_PERSIST_WAL
2210: 20 20 20 20 20 30 78 30 34 20 20 20 2f 2a 20 50       0x04   /* P
2220: 65 72 73 69 73 74 65 6e 74 20 57 41 4c 20 6d 6f  ersistent WAL mo
2230: 64 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49  de */.#define WI
2240: 4e 46 49 4c 45 5f 50 53 4f 57 20 20 20 20 20 20  NFILE_PSOW      
2250: 20 20 20 20 20 20 30 78 31 30 20 20 20 2f 2a 20        0x10   /* 
2260: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57  SQLITE_IOCAP_POW
2270: 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
2280: 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 73   */../*. * The s
2290: 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65  ize of the buffe
22a0: 72 20 75 73 65 64 20 62 79 20 73 71 6c 69 74 65  r used by sqlite
22b0: 33 5f 77 69 6e 33 32 5f 77 72 69 74 65 5f 64 65  3_win32_write_de
22c0: 62 75 67 28 29 2e 0a 20 2a 2f 0a 23 69 66 6e 64  bug().. */.#ifnd
22d0: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
22e0: 44 42 47 5f 42 55 46 5f 53 49 5a 45 0a 23 20 20  DBG_BUF_SIZE.#  
22f0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
2300: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
2310: 20 20 20 28 28 69 6e 74 29 28 34 30 39 36 2d 73     ((int)(4096-s
2320: 69 7a 65 6f 66 28 44 57 4f 52 44 29 29 29 0a 23  izeof(DWORD))).#
2330: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65  endif../*. * The
2340: 20 76 61 6c 75 65 20 75 73 65 64 20 77 69 74 68   value used with
2350: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
2360: 65 74 5f 64 69 72 65 63 74 6f 72 79 28 29 20 74  et_directory() t
2370: 6f 20 73 70 65 63 69 66 79 20 74 68 61 74 0a 20  o specify that. 
2380: 2a 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63  * the data direc
2390: 74 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20 63  tory should be c
23a0: 68 61 6e 67 65 64 2e 0a 20 2a 2f 0a 23 69 66 6e  hanged.. */.#ifn
23b0: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
23c0: 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f  _DATA_DIRECTORY_
23d0: 54 59 50 45 0a 23 20 20 64 65 66 69 6e 65 20 53  TYPE.#  define S
23e0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41  QLITE_WIN32_DATA
23f0: 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20  _DIRECTORY_TYPE 
2400: 28 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20  (1).#endif../*. 
2410: 2a 20 54 68 65 20 76 61 6c 75 65 20 75 73 65 64  * The value used
2420: 20 77 69 74 68 20 73 71 6c 69 74 65 33 5f 77 69   with sqlite3_wi
2430: 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
2440: 79 28 29 20 74 6f 20 73 70 65 63 69 66 79 20 74  y() to specify t
2450: 68 61 74 0a 20 2a 20 74 68 65 20 74 65 6d 70 6f  hat. * the tempo
2460: 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 73  rary directory s
2470: 68 6f 75 6c 64 20 62 65 20 63 68 61 6e 67 65 64  hould be changed
2480: 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .. */.#ifndef SQ
2490: 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f  LITE_WIN32_TEMP_
24a0: 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 23  DIRECTORY_TYPE.#
24b0: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
24c0: 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43  WIN32_TEMP_DIREC
24d0: 54 4f 52 59 5f 54 59 50 45 20 28 32 29 0a 23 65  TORY_TYPE (2).#e
24e0: 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 49 66 20 63  ndif../*. * If c
24f0: 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c  ompiled with SQL
2500: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
2510: 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20 77 65 20   on Windows, we 
2520: 77 69 6c 6c 20 75 73 65 20 74 68 65 0a 20 2a 20  will use the. * 
2530: 76 61 72 69 6f 75 73 20 57 69 6e 33 32 20 41 50  various Win32 AP
2540: 49 20 68 65 61 70 20 66 75 6e 63 74 69 6f 6e 73  I heap functions
2550: 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 75 72 20   instead of our 
2560: 6f 77 6e 2e 0a 20 2a 2f 0a 23 69 66 64 65 66 20  own.. */.#ifdef 
2570: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
2580: 4c 4f 43 0a 0a 2f 2a 0a 20 2a 20 49 66 20 74 68  LOC../*. * If th
2590: 69 73 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  is is non-zero, 
25a0: 61 6e 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70  an isolated heap
25b0: 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64   will be created
25c0: 20 62 79 20 74 68 65 20 6e 61 74 69 76 65 20 57   by the native W
25d0: 69 6e 33 32 0a 20 2a 20 61 6c 6c 6f 63 61 74 6f  in32. * allocato
25e0: 72 20 73 75 62 73 79 73 74 65 6d 3b 20 6f 74 68  r subsystem; oth
25f0: 65 72 77 69 73 65 2c 20 74 68 65 20 64 65 66 61  erwise, the defa
2600: 75 6c 74 20 70 72 6f 63 65 73 73 20 68 65 61 70  ult process heap
2610: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 20 20   will be used.  
2620: 54 68 69 73 0a 20 2a 20 73 65 74 74 69 6e 67 20  This. * setting 
2630: 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 77 68  has no effect wh
2640: 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72  en compiling for
2650: 20 57 69 6e 52 54 2e 20 20 42 79 20 64 65 66 61   WinRT.  By defa
2660: 75 6c 74 2c 20 74 68 69 73 20 69 73 20 65 6e 61  ult, this is ena
2670: 62 6c 65 64 0a 20 2a 20 61 6e 64 20 61 6e 20 69  bled. * and an i
2680: 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c  solated heap wil
2690: 6c 20 62 65 20 63 72 65 61 74 65 64 20 74 6f 20  l be created to 
26a0: 73 74 6f 72 65 20 61 6c 6c 20 61 6c 6c 6f 63 61  store all alloca
26b0: 74 65 64 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 2a  ted data.. *. **
26c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 20  ************. * 
2710: 57 41 52 4e 49 4e 47 3a 20 49 74 20 69 73 20 69  WARNING: It is i
2720: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 65  mportant to note
2730: 20 74 68 61 74 20 77 68 65 6e 20 74 68 69 73 20   that when this 
2740: 73 65 74 74 69 6e 67 20 69 73 20 6e 6f 6e 2d 7a  setting is non-z
2750: 65 72 6f 20 61 6e 64 20 74 68 65 0a 20 2a 20 20  ero and the. *  
2760: 20 20 20 20 20 20 20 20 77 69 6e 4d 65 6d 53 68          winMemSh
2770: 75 74 64 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 20  utdown function 
2780: 69 73 20 63 61 6c 6c 65 64 20 28 65 2e 67 2e 20  is called (e.g. 
2790: 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f 73  by the sqlite3_s
27a0: 68 75 74 64 6f 77 6e 0a 20 2a 20 20 20 20 20 20  hutdown. *      
27b0: 20 20 20 20 66 75 6e 63 74 69 6f 6e 29 2c 20 61      function), a
27c0: 6c 6c 20 64 61 74 61 20 74 68 61 74 20 77 61 73  ll data that was
27d0: 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67   allocated using
27e0: 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 68 65   the isolated he
27f0: 61 70 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20 20  ap will. *      
2800: 20 20 20 20 62 65 20 66 72 65 65 64 20 69 6d 6d      be freed imm
2810: 65 64 69 61 74 65 6c 79 20 61 6e 64 20 61 6e 79  ediately and any
2820: 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 63 65   attempt to acce
2830: 73 73 20 61 6e 79 20 6f 66 20 74 68 61 74 20 66  ss any of that f
2840: 72 65 65 64 0a 20 2a 20 20 20 20 20 20 20 20 20  reed. *         
2850: 20 64 61 74 61 20 77 69 6c 6c 20 61 6c 6d 6f 73   data will almos
2860: 74 20 63 65 72 74 61 69 6e 6c 79 20 72 65 73 75  t certainly resu
2870: 6c 74 20 69 6e 20 61 6e 20 69 6d 6d 65 64 69 61  lt in an immedia
2880: 74 65 20 61 63 63 65 73 73 20 76 69 6f 6c 61 74  te access violat
2890: 69 6f 6e 2e 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion.. **********
28a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28e0: 2a 2a 2a 2a 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ****. */.#ifndef
28f0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
2900: 41 50 5f 43 52 45 41 54 45 0a 23 20 20 64 65 66  AP_CREATE.#  def
2910: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
2920: 5f 48 45 41 50 5f 43 52 45 41 54 45 20 20 20 20  _HEAP_CREATE    
2930: 28 54 52 55 45 29 0a 23 65 6e 64 69 66 0a 0a 2f  (TRUE).#endif../
2940: 2a 0a 20 2a 20 54 68 65 20 69 6e 69 74 69 61 6c  *. * The initial
2950: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 57 69 6e   size of the Win
2960: 33 32 2d 73 70 65 63 69 66 69 63 20 68 65 61 70  32-specific heap
2970: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61  .  This value ma
2980: 79 20 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23  y be zero.. */.#
2990: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
29a0: 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49  N32_HEAP_INIT_SI
29b0: 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  ZE.#  define SQL
29c0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49  ITE_WIN32_HEAP_I
29d0: 4e 49 54 5f 53 49 5a 45 20 28 28 53 51 4c 49 54  NIT_SIZE ((SQLIT
29e0: 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f  E_DEFAULT_CACHE_
29f0: 53 49 5a 45 29 20 2a 20 5c 0a 20 20 20 20 20 20  SIZE) * \.      
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a20: 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54   (SQLITE_DEFAULT
2a30: 5f 50 41 47 45 5f 53 49 5a 45 29 20 2b 20 34 31  _PAGE_SIZE) + 41
2a40: 39 34 33 30 34 29 0a 23 65 6e 64 69 66 0a 0a 2f  94304).#endif../
2a50: 2a 0a 20 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *. * The maximum
2a60: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 57 69 6e   size of the Win
2a70: 33 32 2d 73 70 65 63 69 66 69 63 20 68 65 61 70  32-specific heap
2a80: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61  .  This value ma
2a90: 79 20 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23  y be zero.. */.#
2aa0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
2ab0: 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a  N32_HEAP_MAX_SIZ
2ac0: 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  E.#  define SQLI
2ad0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41  TE_WIN32_HEAP_MA
2ae0: 58 5f 53 49 5a 45 20 20 28 30 29 0a 23 65 6e 64  X_SIZE  (0).#end
2af0: 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 65 78  if../*. * The ex
2b00: 74 72 61 20 66 6c 61 67 73 20 74 6f 20 75 73 65  tra flags to use
2b10: 20 69 6e 20 63 61 6c 6c 73 20 74 6f 20 74 68 65   in calls to the
2b20: 20 57 69 6e 33 32 20 68 65 61 70 20 41 50 49 73   Win32 heap APIs
2b30: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61  .  This value ma
2b40: 79 20 62 65 0a 20 2a 20 7a 65 72 6f 20 66 6f 72  y be. * zero for
2b50: 20 74 68 65 20 64 65 66 61 75 6c 74 20 62 65 68   the default beh
2b60: 61 76 69 6f 72 2e 0a 20 2a 2f 0a 23 69 66 6e 64  avior.. */.#ifnd
2b70: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
2b80: 48 45 41 50 5f 46 4c 41 47 53 0a 23 20 20 64 65  HEAP_FLAGS.#  de
2b90: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
2ba0: 32 5f 48 45 41 50 5f 46 4c 41 47 53 20 20 20 20  2_HEAP_FLAGS    
2bb0: 20 28 30 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   (0).#endif.../*
2bc0: 0a 2a 2a 20 54 68 65 20 77 69 6e 4d 65 6d 44 61  .** The winMemDa
2bd0: 74 61 20 73 74 72 75 63 74 75 72 65 20 73 74 6f  ta structure sto
2be0: 72 65 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  res information 
2bf0: 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
2c00: 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63 0a 2a  Win32-specific.*
2c10: 2a 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  * sqlite3_mem_me
2c20: 74 68 6f 64 73 20 69 6d 70 6c 65 6d 65 6e 74 61  thods implementa
2c30: 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  tion..*/.typedef
2c40: 20 73 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61   struct winMemDa
2c50: 74 61 20 77 69 6e 4d 65 6d 44 61 74 61 3b 0a 73  ta winMemData;.s
2c60: 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61  truct winMemData
2c70: 20 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   {.#ifndef NDEBU
2c80: 47 0a 20 20 75 33 32 20 6d 61 67 69 63 31 3b 20  G.  u32 magic1; 
2c90: 20 20 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65    /* Magic numbe
2ca0: 72 20 74 6f 20 64 65 74 65 63 74 20 73 74 72 75  r to detect stru
2cb0: 63 74 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e  cture corruption
2cc0: 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 48 41  . */.#endif.  HA
2cd0: 4e 44 4c 45 20 68 48 65 61 70 3b 20 2f 2a 20 54  NDLE hHeap; /* T
2ce0: 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 6f 75 72  he handle to our
2cf0: 20 68 65 61 70 2e 20 2a 2f 0a 20 20 42 4f 4f 4c   heap. */.  BOOL
2d00: 20 62 4f 77 6e 65 64 3b 20 20 2f 2a 20 44 6f 20   bOwned;  /* Do 
2d10: 77 65 20 6f 77 6e 20 74 68 65 20 68 65 61 70 20  we own the heap 
2d20: 28 69 2e 65 2e 20 64 65 73 74 72 6f 79 20 69 74  (i.e. destroy it
2d30: 20 6f 6e 20 73 68 75 74 64 6f 77 6e 29 3f 20 2a   on shutdown)? *
2d40: 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
2d50: 0a 20 20 75 33 32 20 6d 61 67 69 63 32 3b 20 20  .  u32 magic2;  
2d60: 20 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72   /* Magic number
2d70: 20 74 6f 20 64 65 74 65 63 74 20 73 74 72 75 63   to detect struc
2d80: 74 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  ture corruption.
2d90: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 23   */.#endif.};..#
2da0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 64  ifndef NDEBUG.#d
2db0: 65 66 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41 47  efine WINMEM_MAG
2dc0: 49 43 31 20 20 20 20 20 30 78 34 32 62 32 38 33  IC1     0x42b283
2dd0: 30 62 0a 23 64 65 66 69 6e 65 20 57 49 4e 4d 45  0b.#define WINME
2de0: 4d 5f 4d 41 47 49 43 32 20 20 20 20 20 30 78 62  M_MAGIC2     0xb
2df0: 64 34 64 37 63 66 34 0a 23 65 6e 64 69 66 0a 0a  d4d7cf4.#endif..
2e00: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 77 69  static struct wi
2e10: 6e 4d 65 6d 44 61 74 61 20 77 69 6e 5f 6d 65 6d  nMemData win_mem
2e20: 5f 64 61 74 61 20 3d 20 7b 0a 23 69 66 6e 64 65  _data = {.#ifnde
2e30: 66 20 4e 44 45 42 55 47 0a 20 20 57 49 4e 4d 45  f NDEBUG.  WINME
2e40: 4d 5f 4d 41 47 49 43 31 2c 0a 23 65 6e 64 69 66  M_MAGIC1,.#endif
2e50: 0a 20 20 4e 55 4c 4c 2c 20 46 41 4c 53 45 0a 23  .  NULL, FALSE.#
2e60: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
2e70: 2c 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 0a 23  ,WINMEM_MAGIC2.#
2e80: 65 6e 64 69 66 0a 7d 3b 0a 0a 23 69 66 6e 64 65  endif.};..#ifnde
2e90: 66 20 4e 44 45 42 55 47 0a 23 64 65 66 69 6e 65  f NDEBUG.#define
2ea0: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
2eb0: 69 63 31 28 29 20 61 73 73 65 72 74 28 20 77 69  ic1() assert( wi
2ec0: 6e 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69 63  n_mem_data.magic
2ed0: 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31  1==WINMEM_MAGIC1
2ee0: 20 29 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65   ).#define winMe
2ef0: 6d 41 73 73 65 72 74 4d 61 67 69 63 32 28 29 20  mAssertMagic2() 
2f00: 61 73 73 65 72 74 28 20 77 69 6e 5f 6d 65 6d 5f  assert( win_mem_
2f10: 64 61 74 61 2e 6d 61 67 69 63 32 3d 3d 57 49 4e  data.magic2==WIN
2f20: 4d 45 4d 5f 4d 41 47 49 43 32 20 29 0a 23 64 65  MEM_MAGIC2 ).#de
2f30: 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72  fine winMemAsser
2f40: 74 4d 61 67 69 63 28 29 20 20 77 69 6e 4d 65 6d  tMagic()  winMem
2f50: 41 73 73 65 72 74 4d 61 67 69 63 31 28 29 3b 20  AssertMagic1(); 
2f60: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
2f70: 63 32 28 29 3b 0a 23 65 6c 73 65 0a 23 64 65 66  c2();.#else.#def
2f80: 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ine winMemAssert
2f90: 4d 61 67 69 63 28 29 0a 23 65 6e 64 69 66 0a 0a  Magic().#endif..
2fa0: 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65  #define winMemGe
2fb0: 74 44 61 74 61 50 74 72 28 29 20 20 26 77 69 6e  tDataPtr()  &win
2fc0: 5f 6d 65 6d 5f 64 61 74 61 0a 23 64 65 66 69 6e  _mem_data.#defin
2fd0: 65 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  e winMemGetHeap(
2fe0: 29 20 20 20 20 20 77 69 6e 5f 6d 65 6d 5f 64 61  )     win_mem_da
2ff0: 74 61 2e 68 48 65 61 70 0a 23 64 65 66 69 6e 65  ta.hHeap.#define
3000: 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28   winMemGetOwned(
3010: 29 20 20 20 20 77 69 6e 5f 6d 65 6d 5f 64 61 74  )    win_mem_dat
3020: 61 2e 62 4f 77 6e 65 64 0a 0a 73 74 61 74 69 63  a.bOwned..static
3030: 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c   void *winMemMal
3040: 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 73 29 3b  loc(int nBytes);
3050: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
3060: 4d 65 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50  MemFree(void *pP
3070: 72 69 6f 72 29 3b 0a 73 74 61 74 69 63 20 76 6f  rior);.static vo
3080: 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f  id *winMemReallo
3090: 63 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20  c(void *pPrior, 
30a0: 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73 74 61  int nBytes);.sta
30b0: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69  tic int winMemSi
30c0: 7a 65 28 76 6f 69 64 20 2a 70 29 3b 0a 73 74 61  ze(void *p);.sta
30d0: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f  tic int winMemRo
30e0: 75 6e 64 75 70 28 69 6e 74 20 6e 29 3b 0a 73 74  undup(int n);.st
30f0: 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49  atic int winMemI
3100: 6e 69 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61  nit(void *pAppDa
3110: 74 61 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  ta);.static void
3120: 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28   winMemShutdown(
3130: 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 3b  void *pAppData);
3140: 0a 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  ..const sqlite3_
3150: 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c  mem_methods *sql
3160: 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28  ite3MemGetWin32(
3170: 76 6f 69 64 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  void);.#endif /*
3180: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
3190: 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  LLOC */../*.** T
31a0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
31b0: 69 61 62 6c 65 20 69 73 20 28 6e 6f 72 6d 61 6c  iable is (normal
31c0: 6c 79 29 20 73 65 74 20 6f 6e 63 65 20 61 6e 64  ly) set once and
31d0: 20 6e 65 76 65 72 20 63 68 61 6e 67 65 73 0a 2a   never changes.*
31e0: 2a 20 74 68 65 72 65 61 66 74 65 72 2e 20 20 49  * thereafter.  I
31f0: 74 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65  t records whethe
3200: 72 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  r the operating 
3210: 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39 78 0a  system is Win9x.
3220: 2a 2a 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2a 0a  ** or WinNT..**.
3230: 2a 2a 20 30 3a 20 20 20 4f 70 65 72 61 74 69 6e  ** 0:   Operatin
3240: 67 20 73 79 73 74 65 6d 20 75 6e 6b 6e 6f 77 6e  g system unknown
3250: 2e 0a 2a 2a 20 31 3a 20 20 20 4f 70 65 72 61 74  ..** 1:   Operat
3260: 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57 69  ing system is Wi
3270: 6e 39 78 2e 0a 2a 2a 20 32 3a 20 20 20 4f 70 65  n9x..** 2:   Ope
3280: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73  rating system is
3290: 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e   WinNT..**.** In
32a0: 20 6f 72 64 65 72 20 74 6f 20 66 61 63 69 6c 69   order to facili
32b0: 74 61 74 65 20 74 65 73 74 69 6e 67 20 6f 6e 20  tate testing on 
32c0: 61 20 57 69 6e 4e 54 20 73 79 73 74 65 6d 2c 20  a WinNT system, 
32d0: 74 68 65 20 74 65 73 74 20 66 69 78 74 75 72 65  the test fixture
32e0: 0a 2a 2a 20 63 61 6e 20 6d 61 6e 75 61 6c 6c 79  .** can manually
32f0: 20 73 65 74 20 74 68 69 73 20 76 61 6c 75 65 20   set this value 
3300: 74 6f 20 31 20 74 6f 20 65 6d 75 6c 61 74 65 20  to 1 to emulate 
3310: 57 69 6e 39 38 20 62 65 68 61 76 69 6f 72 2e 0a  Win98 behavior..
3320: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
3330: 5f 54 45 53 54 0a 4c 4f 4e 47 20 53 51 4c 49 54  _TEST.LONG SQLIT
3340: 45 5f 57 49 4e 33 32 5f 56 4f 4c 41 54 49 4c 45  E_WIN32_VOLATILE
3350: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65   sqlite3_os_type
3360: 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61 74   = 0;.#else.stat
3370: 69 63 20 4c 4f 4e 47 20 53 51 4c 49 54 45 5f 57  ic LONG SQLITE_W
3380: 49 4e 33 32 5f 56 4f 4c 41 54 49 4c 45 20 73 71  IN32_VOLATILE sq
3390: 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20  lite3_os_type = 
33a0: 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  0;.#endif..#ifnd
33b0: 65 66 20 53 59 53 43 41 4c 4c 0a 23 20 20 64 65  ef SYSCALL.#  de
33c0: 66 69 6e 65 20 53 59 53 43 41 4c 4c 20 73 71 6c  fine SYSCALL sql
33d0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
33e0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
33f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
3400: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  not available on
3410: 20 57 69 6e 64 6f 77 73 20 43 45 20 6f 72 20 57   Windows CE or W
3420: 69 6e 52 54 2e 0a 20 2a 2f 0a 0a 23 69 66 20 53  inRT.. */..#if S
3430: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
3440: 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  | SQLITE_OS_WINR
3450: 54 0a 23 20 20 64 65 66 69 6e 65 20 6f 73 41 72  T.#  define osAr
3460: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20  eFileApisANSI() 
3470: 20 20 20 20 20 20 31 0a 23 65 6e 64 69 66 0a 0a        1.#endif..
3480: 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65  /*.** Many syste
3490: 6d 20 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65  m calls are acce
34a0: 73 73 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69  ssed through poi
34b0: 6e 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e  nter-to-function
34c0: 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65  s so that.** the
34d0: 79 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64  y may be overrid
34e0: 64 65 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74  den at runtime t
34f0: 6f 20 66 61 63 69 6c 69 74 61 74 65 20 66 61 75  o facilitate fau
3500: 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72  lt injection dur
3510: 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  ing.** testing a
3520: 6e 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20  nd sandboxing.  
3530: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  The following ar
3540: 72 61 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61  ray holds the na
3550: 6d 65 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73  mes and pointers
3560: 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72  .** to all overr
3570: 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63  ideable system c
3580: 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alls..*/.static 
3590: 73 74 72 75 63 74 20 77 69 6e 5f 73 79 73 63 61  struct win_sysca
35a0: 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ll {.  const cha
35b0: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
35c0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
35d0: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  the system call 
35e0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
35f0: 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72 65 6e  call_ptr pCurren
3600: 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 61  t; /* Current va
3610: 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73 74 65  lue of the syste
3620: 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  m call */.  sqli
3630: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
3640: 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66  pDefault; /* Def
3650: 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20  ault value */.} 
3660: 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 23  aSyscall[] = {.#
3670: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
3680: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
3690: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 41 72 65  S_WINRT.  { "Are
36a0: 46 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20 20  FileApisANSI",  
36b0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
36c0: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 2c  AreFileApisANSI,
36d0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
36e0: 6c 73 65 0a 20 20 7b 20 22 41 72 65 46 69 6c 65  lse.  { "AreFile
36f0: 41 70 69 73 41 4e 53 49 22 2c 20 20 20 20 20 20  ApisANSI",      
3700: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
3710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3720: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3730: 0a 0a 23 69 66 6e 64 65 66 20 6f 73 41 72 65 46  ..#ifndef osAreF
3740: 69 6c 65 41 70 69 73 41 4e 53 49 0a 23 64 65 66  ileApisANSI.#def
3750: 69 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70 69  ine osAreFileApi
3760: 73 41 4e 53 49 20 28 28 42 4f 4f 4c 28 57 49 4e  sANSI ((BOOL(WIN
3770: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
3780: 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74  call[0].pCurrent
3790: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  ).#endif..#if SQ
37a0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
37b0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
37c0: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
37d0: 20 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57 22    { "CharLowerW"
37e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
37f0: 53 59 53 43 41 4c 4c 29 43 68 61 72 4c 6f 77 65  SYSCALL)CharLowe
3800: 72 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rW,             
3810: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
3820: 22 43 68 61 72 4c 6f 77 65 72 57 22 2c 20 20 20  "CharLowerW",   
3830: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
3840: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
3850: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3860: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
3870: 65 20 6f 73 43 68 61 72 4c 6f 77 65 72 57 20 28  e osCharLowerW (
3880: 28 4c 50 57 53 54 52 28 57 49 4e 41 50 49 2a 29  (LPWSTR(WINAPI*)
3890: 28 4c 50 57 53 54 52 29 29 61 53 79 73 63 61 6c  (LPWSTR))aSyscal
38a0: 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[1].pCurrent)..
38b0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
38c0: 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28 53  NCE && defined(S
38d0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
38e0: 57 49 44 45 29 0a 20 20 7b 20 22 43 68 61 72 55  WIDE).  { "CharU
38f0: 70 70 65 72 57 22 2c 20 20 20 20 20 20 20 20 20  pperW",         
3900: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 68       (SYSCALL)Ch
3910: 61 72 55 70 70 65 72 57 2c 20 20 20 20 20 20 20  arUpperW,       
3920: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
3930: 65 0a 20 20 7b 20 22 43 68 61 72 55 70 70 65 72  e.  { "CharUpper
3940: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
3950: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
3960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3970: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
3980: 23 64 65 66 69 6e 65 20 6f 73 43 68 61 72 55 70  #define osCharUp
3990: 70 65 72 57 20 28 28 4c 50 57 53 54 52 28 57 49  perW ((LPWSTR(WI
39a0: 4e 41 50 49 2a 29 28 4c 50 57 53 54 52 29 29 61  NAPI*)(LPWSTR))a
39b0: 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72  Syscall[2].pCurr
39c0: 65 6e 74 29 0a 0a 20 20 7b 20 22 43 6c 6f 73 65  ent)..  { "Close
39d0: 48 61 6e 64 6c 65 22 2c 20 20 20 20 20 20 20 20  Handle",        
39e0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 6c       (SYSCALL)Cl
39f0: 6f 73 65 48 61 6e 64 6c 65 2c 20 20 20 20 20 20  oseHandle,      
3a00: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
3a10: 66 69 6e 65 20 6f 73 43 6c 6f 73 65 48 61 6e 64  fine osCloseHand
3a20: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
3a30: 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63  *)(HANDLE))aSysc
3a40: 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29  all[3].pCurrent)
3a50: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
3a60: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
3a70: 4e 53 49 29 0a 20 20 7b 20 22 43 72 65 61 74 65  NSI).  { "Create
3a80: 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20  FileA",         
3a90: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
3aa0: 61 74 65 46 69 6c 65 41 2c 20 20 20 20 20 20 20  ateFileA,       
3ab0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
3ac0: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
3ad0: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  A",             
3ae0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
3af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b00: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
3b10: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46  define osCreateF
3b20: 69 6c 65 41 20 28 28 48 41 4e 44 4c 45 28 57 49  ileA ((HANDLE(WI
3b30: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44 57  NAPI*)(LPCSTR,DW
3b40: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
3b50: 20 20 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f       LPSECURITY_
3b60: 41 54 54 52 49 42 55 54 45 53 2c 44 57 4f 52 44  ATTRIBUTES,DWORD
3b70: 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61  ,DWORD,HANDLE))a
3b80: 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72  Syscall[4].pCurr
3b90: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
3ba0: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
3bb0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
3bc0: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
3bd0: 20 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c 20   "CreateFileW", 
3be0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3bf0: 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 57  CALL)CreateFileW
3c00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
3c10: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72  },.#else.  { "Cr
3c20: 65 61 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20  eateFileW",     
3c30: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3c40: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
3c50: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3c60: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
3c70: 73 43 72 65 61 74 65 46 69 6c 65 57 20 28 28 48  sCreateFileW ((H
3c80: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ANDLE(WINAPI*)(L
3c90: 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f  PCWSTR,DWORD,DWO
3ca0: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
3cb0: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
3cc0: 54 45 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  TES,DWORD,DWORD,
3cd0: 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c  HANDLE))aSyscall
3ce0: 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [5].pCurrent)..#
3cf0: 69 66 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57  if (!SQLITE_OS_W
3d00: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
3d10: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
3d20: 5f 41 4e 53 49 29 20 26 26 20 5c 0a 20 20 20 20  _ANSI) && \.    
3d30: 20 20 20 20 28 21 64 65 66 69 6e 65 64 28 53 51      (!defined(SQ
3d40: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c  LITE_OMIT_WAL) |
3d50: 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  | SQLITE_MAX_MMA
3d60: 50 5f 53 49 5a 45 3e 30 29 29 0a 20 20 7b 20 22  P_SIZE>0)).  { "
3d70: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
3d80: 67 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  gA",      (SYSCA
3d90: 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70  LL)CreateFileMap
3da0: 70 69 6e 67 41 2c 20 20 20 20 20 20 30 20 7d 2c  pingA,      0 },
3db0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
3dc0: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 22 2c  teFileMappingA",
3dd0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
3de0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3df0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3e00: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
3e10: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
3e20: 41 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  A ((HANDLE(WINAP
3e30: 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43  I*)(HANDLE,LPSEC
3e40: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
3e50: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
3e60: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50  D,DWORD,DWORD,LP
3e70: 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 36  CSTR))aSyscall[6
3e80: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3e90: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
3ea0: 20 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f   || (!SQLITE_OS_
3eb0: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
3ec0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
3ed0: 53 5f 57 49 44 45 29 20 26 26 20 5c 0a 20 20 20  S_WIDE) && \.   
3ee0: 20 20 20 20 20 28 21 64 65 66 69 6e 65 64 28 53       (!defined(S
3ef0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20  QLITE_OMIT_WAL) 
3f00: 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  || SQLITE_MAX_MM
3f10: 41 50 5f 53 49 5a 45 3e 30 29 29 0a 20 20 7b 20  AP_SIZE>0)).  { 
3f20: 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  "CreateFileMappi
3f30: 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 43  ngW",      (SYSC
3f40: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61  ALL)CreateFileMa
3f50: 70 70 69 6e 67 57 2c 20 20 20 20 20 20 30 20 7d  ppingW,      0 }
3f60: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
3f70: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 22  ateFileMappingW"
3f80: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
3f90: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3fa0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3fb0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
3fc0: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
3fd0: 67 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  gW ((HANDLE(WINA
3fe0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45  PI*)(HANDLE,LPSE
3ff0: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
4000: 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  S, \.        DWO
4010: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c  RD,DWORD,DWORD,L
4020: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
4030: 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [7].pCurrent)..#
4040: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
4050: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
4060: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4070: 57 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74  WIDE).  { "Creat
4080: 65 4d 75 74 65 78 57 22 2c 20 20 20 20 20 20 20  eMutexW",       
4090: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
40a0: 65 61 74 65 4d 75 74 65 78 57 2c 20 20 20 20 20  eateMutexW,     
40b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
40c0: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74  e.  { "CreateMut
40d0: 65 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  exW",           
40e0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4100: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4110: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
4120: 4d 75 74 65 78 57 20 28 28 48 41 4e 44 4c 45 28  MutexW ((HANDLE(
4130: 57 49 4e 41 50 49 2a 29 28 4c 50 53 45 43 55 52  WINAPI*)(LPSECUR
4140: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 42  ITY_ATTRIBUTES,B
4150: 4f 4f 4c 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  OOL, \.        L
4160: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
4170: 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [8].pCurrent)..#
4180: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
4190: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
41a0: 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c  ).  { "DeleteFil
41b0: 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eA",            
41c0: 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65 74 65   (SYSCALL)Delete
41d0: 46 69 6c 65 41 2c 20 20 20 20 20 20 20 20 20 20  FileA,          
41e0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
41f0: 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c  { "DeleteFileA",
4200: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
4210: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4230: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4240: 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 6c 65  ine osDeleteFile
4250: 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  A ((BOOL(WINAPI*
4260: 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61  )(LPCSTR))aSysca
4270: 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[9].pCurrent).
4280: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
4290: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
42a0: 44 45 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46  DE).  { "DeleteF
42b0: 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20  ileW",          
42c0: 20 20 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65     (SYSCALL)Dele
42d0: 74 65 46 69 6c 65 57 2c 20 20 20 20 20 20 20 20  teFileW,        
42e0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
42f0: 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57    { "DeleteFileW
4300: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
4310: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4330: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4340: 65 66 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69  efine osDeleteFi
4350: 6c 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  leW ((BOOL(WINAP
4360: 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79  I*)(LPCWSTR))aSy
4370: 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65  scall[10].pCurre
4380: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
4390: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69  OS_WINCE.  { "Fi
43a0: 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c  leTimeToLocalFil
43b0: 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c  eTime", (SYSCALL
43c0: 29 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c  )FileTimeToLocal
43d0: 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23  FileTime, 0 },.#
43e0: 65 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69  else.  { "FileTi
43f0: 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d  meToLocalFileTim
4400: 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20  e", (SYSCALL)0, 
4410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4420: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4430: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c  f..#define osFil
4440: 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65  eTimeToLocalFile
4450: 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  Time ((BOOL(WINA
4460: 50 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45 54  PI*)(CONST FILET
4470: 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20  IME*, \.        
4480: 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73  LPFILETIME))aSys
4490: 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e  call[11].pCurren
44a0: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
44b0: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c  S_WINCE.  { "Fil
44c0: 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d  eTimeToSystemTim
44d0: 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29  e",    (SYSCALL)
44e0: 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d  FileTimeToSystem
44f0: 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 23 65  Time,    0 },.#e
4500: 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d  lse.  { "FileTim
4510: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c 20  eToSystemTime", 
4520: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4540: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
4550: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65  ..#define osFile
4560: 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65  TimeToSystemTime
4570: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
4580: 28 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a  (CONST FILETIME*
4590: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 59  , \.        LPSY
45a0: 53 54 45 4d 54 49 4d 45 29 29 61 53 79 73 63 61  STEMTIME))aSysca
45b0: 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[12].pCurrent)
45c0: 0a 0a 20 20 7b 20 22 46 6c 75 73 68 46 69 6c 65  ..  { "FlushFile
45d0: 42 75 66 66 65 72 73 22 2c 20 20 20 20 20 20 20  Buffers",       
45e0: 20 28 53 59 53 43 41 4c 4c 29 46 6c 75 73 68 46   (SYSCALL)FlushF
45f0: 69 6c 65 42 75 66 66 65 72 73 2c 20 20 20 20 20  ileBuffers,     
4600: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
4610: 20 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66   osFlushFileBuff
4620: 65 72 73 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ers ((BOOL(WINAP
4630: 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73  I*)(HANDLE))aSys
4640: 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e  call[13].pCurren
4650: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
4660: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
4670: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 46 6f 72 6d  _ANSI).  { "Form
4680: 61 74 4d 65 73 73 61 67 65 41 22 2c 20 20 20 20  atMessageA",    
4690: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46        (SYSCALL)F
46a0: 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 2c 20 20  ormatMessageA,  
46b0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
46c0: 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65  se.  { "FormatMe
46d0: 73 73 61 67 65 41 22 2c 20 20 20 20 20 20 20 20  ssageA",        
46e0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4700: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4710: 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61  .#define osForma
4720: 74 4d 65 73 73 61 67 65 41 20 28 28 44 57 4f 52  tMessageA ((DWOR
4730: 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44  D(WINAPI*)(DWORD
4740: 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44  ,LPCVOID,DWORD,D
4750: 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20  WORD,LPSTR, \.  
4760: 20 20 20 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c        DWORD,va_l
4770: 69 73 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31  ist*))aSyscall[1
4780: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
4790: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
47a0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
47b0: 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73  .  { "FormatMess
47c0: 61 67 65 57 22 2c 20 20 20 20 20 20 20 20 20 20  ageW",          
47d0: 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d  (SYSCALL)FormatM
47e0: 65 73 73 61 67 65 57 2c 20 20 20 20 20 20 20 20  essageW,        
47f0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4800: 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57   "FormatMessageW
4810: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
4820: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4840: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4850: 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61  ne osFormatMessa
4860: 67 65 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41  geW ((DWORD(WINA
4870: 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f  PI*)(DWORD,LPCVO
4880: 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c  ID,DWORD,DWORD,L
4890: 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20  PWSTR, \.       
48a0: 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29   DWORD,va_list*)
48b0: 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43  )aSyscall[15].pC
48c0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65  urrent)..#if !de
48d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
48e0: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
48f0: 29 0a 20 20 7b 20 22 46 72 65 65 4c 69 62 72 61  ).  { "FreeLibra
4900: 72 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ry",            
4910: 20 28 53 59 53 43 41 4c 4c 29 46 72 65 65 4c 69   (SYSCALL)FreeLi
4920: 62 72 61 72 79 2c 20 20 20 20 20 20 20 20 20 20  brary,          
4930: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
4940: 7b 20 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c  { "FreeLibrary",
4950: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
4960: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4980: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4990: 69 6e 65 20 6f 73 46 72 65 65 4c 69 62 72 61 72  ine osFreeLibrar
49a0: 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  y ((BOOL(WINAPI*
49b0: 29 28 48 4d 4f 44 55 4c 45 29 29 61 53 79 73 63  )(HMODULE))aSysc
49c0: 61 6c 6c 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74  all[16].pCurrent
49d0: 29 0a 0a 20 20 7b 20 22 47 65 74 43 75 72 72 65  )..  { "GetCurre
49e0: 6e 74 50 72 6f 63 65 73 73 49 64 22 2c 20 20 20  ntProcessId",   
49f0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 43 75    (SYSCALL)GetCu
4a00: 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 2c 20  rrentProcessId, 
4a10: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
4a20: 65 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  e osGetCurrentPr
4a30: 6f 63 65 73 73 49 64 20 28 28 44 57 4f 52 44 28  ocessId ((DWORD(
4a40: 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61  WINAPI*)(VOID))a
4a50: 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72  Syscall[17].pCur
4a60: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
4a70: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64  TE_OS_WINCE && d
4a80: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
4a90: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
4aa0: 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53 70  { "GetDiskFreeSp
4ab0: 61 63 65 41 22 2c 20 20 20 20 20 20 20 28 53 59  aceA",       (SY
4ac0: 53 43 41 4c 4c 29 47 65 74 44 69 73 6b 46 72 65  SCALL)GetDiskFre
4ad0: 65 53 70 61 63 65 41 2c 20 20 20 20 20 20 20 30  eSpaceA,       0
4ae0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
4af0: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41  etDiskFreeSpaceA
4b00: 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ",       (SYSCAL
4b10: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4b20: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4b30: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4b40: 6f 73 47 65 74 44 69 73 6b 46 72 65 65 53 70 61  osGetDiskFreeSpa
4b50: 63 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ceA ((BOOL(WINAP
4b60: 49 2a 29 28 4c 50 43 53 54 52 2c 4c 50 44 57 4f  I*)(LPCSTR,LPDWO
4b70: 52 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f  RD,LPDWORD,LPDWO
4b80: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
4b90: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
4ba0: 31 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  18].pCurrent)..#
4bb0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
4bc0: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
4bd0: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
4be0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
4bf0: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
4c00: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57  etDiskFreeSpaceW
4c10: 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ",       (SYSCAL
4c20: 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53 70 61  L)GetDiskFreeSpa
4c30: 63 65 57 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a  ceW,       0 },.
4c40: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44 69  #else.  { "GetDi
4c50: 73 6b 46 72 65 65 53 70 61 63 65 57 22 2c 20 20  skFreeSpaceW",  
4c60: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
4c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c80: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4c90: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
4ca0: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 20  tDiskFreeSpaceW 
4cb0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
4cc0: 4c 50 43 57 53 54 52 2c 4c 50 44 57 4f 52 44 2c  LPCWSTR,LPDWORD,
4cd0: 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c  LPDWORD,LPDWORD,
4ce0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f   \.        LPDWO
4cf0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d  RD))aSyscall[19]
4d00: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4d10: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
4d20: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
4d30: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
4d40: 62 75 74 65 73 41 22 2c 20 20 20 20 20 20 28 53  butesA",      (S
4d50: 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74  YSCALL)GetFileAt
4d60: 74 72 69 62 75 74 65 73 41 2c 20 20 20 20 20 20  tributesA,      
4d70: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4d80: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
4d90: 73 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  sA",      (SYSCA
4da0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4db0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4dc0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4dd0: 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
4de0: 75 74 65 73 41 20 28 28 44 57 4f 52 44 28 57 49  utesA ((DWORD(WI
4df0: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61  NAPI*)(LPCSTR))a
4e00: 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43 75 72  Syscall[20].pCur
4e10: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
4e20: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
4e30: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
4e40: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
4e50: 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62  { "GetFileAttrib
4e60: 75 74 65 73 57 22 2c 20 20 20 20 20 20 28 53 59  utesW",      (SY
4e70: 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74  SCALL)GetFileAtt
4e80: 72 69 62 75 74 65 73 57 2c 20 20 20 20 20 20 30  ributesW,      0
4e90: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
4ea0: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
4eb0: 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  W",      (SYSCAL
4ec0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4ed0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4ee0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4ef0: 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
4f00: 74 65 73 57 20 28 28 44 57 4f 52 44 28 57 49 4e  tesW ((DWORD(WIN
4f10: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61  API*)(LPCWSTR))a
4f20: 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72  Syscall[21].pCur
4f30: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
4f40: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
4f50: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
4f60: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
4f70: 45 78 57 22 2c 20 20 20 20 28 53 59 53 43 41 4c  ExW",    (SYSCAL
4f80: 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  L)GetFileAttribu
4f90: 74 65 73 45 78 57 2c 20 20 20 20 30 20 7d 2c 0a  tesExW,    0 },.
4fa0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69  #else.  { "GetFi
4fb0: 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 22  leAttributesExW"
4fc0: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c  ,    (SYSCALL)0,
4fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fe0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4ff0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
5000: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
5010: 78 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  xW ((BOOL(WINAPI
5020: 2a 29 28 4c 50 43 57 53 54 52 2c 47 45 54 5f 46  *)(LPCWSTR,GET_F
5030: 49 4c 45 45 58 5f 49 4e 46 4f 5f 4c 45 56 45 4c  ILEEX_INFO_LEVEL
5040: 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 56  S, \.        LPV
5050: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 32  OID))aSyscall[22
5060: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5070: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
5080: 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 53 69  T.  { "GetFileSi
5090: 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ze",            
50a0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c   (SYSCALL)GetFil
50b0: 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  eSize,          
50c0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
50d0: 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22 2c  { "GetFileSize",
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
50f0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5110: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5120: 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 53 69 7a  ine osGetFileSiz
5130: 65 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  e ((DWORD(WINAPI
5140: 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 44 57 4f 52  *)(HANDLE,LPDWOR
5150: 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e  D))aSyscall[23].
5160: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
5170: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
5180: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
5190: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
51a0: 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61  ).  { "GetFullPa
51b0: 74 68 4e 61 6d 65 41 22 2c 20 20 20 20 20 20 20  thNameA",       
51c0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c   (SYSCALL)GetFul
51d0: 6c 50 61 74 68 4e 61 6d 65 41 2c 20 20 20 20 20  lPathNameA,     
51e0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
51f0: 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  { "GetFullPathNa
5200: 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28 53 59  meA",        (SY
5210: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5230: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5240: 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74  ine osGetFullPat
5250: 68 4e 61 6d 65 41 20 28 28 44 57 4f 52 44 28 57  hNameA ((DWORD(W
5260: 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44  INAPI*)(LPCSTR,D
5270: 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20  WORD,LPSTR, \.  
5280: 20 20 20 20 20 20 4c 50 53 54 52 2a 29 29 61 53        LPSTR*))aS
5290: 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72  yscall[24].pCurr
52a0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
52b0: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
52c0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
52d0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
52e0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
52f0: 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74  .  { "GetFullPat
5300: 68 4e 61 6d 65 57 22 2c 20 20 20 20 20 20 20 20  hNameW",        
5310: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c  (SYSCALL)GetFull
5320: 50 61 74 68 4e 61 6d 65 57 2c 20 20 20 20 20 20  PathNameW,      
5330: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5340: 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d   "GetFullPathNam
5350: 65 57 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  eW",        (SYS
5360: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5380: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5390: 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68  ne osGetFullPath
53a0: 4e 61 6d 65 57 20 28 28 44 57 4f 52 44 28 57 49  NameW ((DWORD(WI
53b0: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44  NAPI*)(LPCWSTR,D
53c0: 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20  WORD,LPWSTR, \. 
53d0: 20 20 20 20 20 20 20 4c 50 57 53 54 52 2a 29 29         LPWSTR*))
53e0: 61 53 79 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75  aSyscall[25].pCu
53f0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74  rrent)..  { "Get
5400: 4c 61 73 74 45 72 72 6f 72 22 2c 20 20 20 20 20  LastError",     
5410: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5420: 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20  GetLastError,   
5430: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
5440: 64 65 66 69 6e 65 20 6f 73 47 65 74 4c 61 73 74  define osGetLast
5450: 45 72 72 6f 72 20 28 28 44 57 4f 52 44 28 57 49  Error ((DWORD(WI
5460: 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79  NAPI*)(VOID))aSy
5470: 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65  scall[26].pCurre
5480: 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  nt)..#if !define
5490: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  d(SQLITE_OMIT_LO
54a0: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 23 69  AD_EXTENSION).#i
54b0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
54c0: 45 0a 20 20 2f 2a 20 54 68 65 20 47 65 74 50 72  E.  /* The GetPr
54d0: 6f 63 41 64 64 72 65 73 73 41 28 29 20 72 6f 75  ocAddressA() rou
54e0: 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 61 76 61  tine is only ava
54f0: 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77  ilable on Window
5500: 73 20 43 45 2e 20 2a 2f 0a 20 20 7b 20 22 47 65  s CE. */.  { "Ge
5510: 74 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20  tProcAddressA", 
5520: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5530: 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  )GetProcAddressA
5540: 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  ,         0 },.#
5550: 65 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74  else.  /* All ot
5560: 68 65 72 20 57 69 6e 64 6f 77 73 20 70 6c 61 74  her Windows plat
5570: 66 6f 72 6d 73 20 65 78 70 65 63 74 20 47 65 74  forms expect Get
5580: 50 72 6f 63 41 64 64 72 65 73 73 28 29 20 74 6f  ProcAddress() to
5590: 20 74 61 6b 65 0a 20 20 2a 2a 20 61 6e 20 41 4e   take.  ** an AN
55a0: 53 49 20 73 74 72 69 6e 67 20 72 65 67 61 72 64  SI string regard
55b0: 6c 65 73 73 20 6f 66 20 74 68 65 20 5f 55 4e 49  less of the _UNI
55c0: 43 4f 44 45 20 73 65 74 74 69 6e 67 20 2a 2f 0a  CODE setting */.
55d0: 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72    { "GetProcAddr
55e0: 65 73 73 41 22 2c 20 20 20 20 20 20 20 20 20 28  essA",         (
55f0: 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 41  SYSCALL)GetProcA
5600: 64 64 72 65 73 73 2c 20 20 20 20 20 20 20 20 20  ddress,         
5610: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 65 6c   0 },.#endif.#el
5620: 73 65 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41  se.  { "GetProcA
5630: 64 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20  ddressA",       
5640: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5660: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5670: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 50 72  .#define osGetPr
5680: 6f 63 41 64 64 72 65 73 73 41 20 28 28 46 41 52  ocAddressA ((FAR
5690: 50 52 4f 43 28 57 49 4e 41 50 49 2a 29 28 48 4d  PROC(WINAPI*)(HM
56a0: 4f 44 55 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20  ODULE, \.       
56b0: 20 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c   LPCSTR))aSyscal
56c0: 6c 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[27].pCurrent).
56d0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
56e0: 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 53 79  WINRT.  { "GetSy
56f0: 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20  stemInfo",      
5700: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
5710: 74 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20  tSystemInfo,    
5720: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
5730: 65 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d  e.  { "GetSystem
5740: 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20 20  Info",          
5750: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5770: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5780: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73  #define osGetSys
5790: 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28 57  temInfo ((VOID(W
57a0: 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45 4d  INAPI*)(LPSYSTEM
57b0: 5f 49 4e 46 4f 29 29 61 53 79 73 63 61 6c 6c 5b  _INFO))aSyscall[
57c0: 32 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  28].pCurrent).. 
57d0: 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d   { "GetSystemTim
57e0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  e",           (S
57f0: 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d  YSCALL)GetSystem
5800: 54 69 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Time,           
5810: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
5820: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 20 28 28  GetSystemTime ((
5830: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50  VOID(WINAPI*)(LP
5840: 53 59 53 54 45 4d 54 49 4d 45 29 29 61 53 79 73  SYSTEMTIME))aSys
5850: 63 61 6c 6c 5b 32 39 5d 2e 70 43 75 72 72 65 6e  call[29].pCurren
5860: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
5870: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 47 65  OS_WINCE.  { "Ge
5880: 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c  tSystemTimeAsFil
5890: 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c  eTime", (SYSCALL
58a0: 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73  )GetSystemTimeAs
58b0: 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23  FileTime, 0 },.#
58c0: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 53 79 73  else.  { "GetSys
58d0: 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
58e0: 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20  e", (SYSCALL)0, 
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5900: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5910: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
5920: 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65  SystemTimeAsFile
5930: 54 69 6d 65 20 28 28 56 4f 49 44 28 57 49 4e 41  Time ((VOID(WINA
5940: 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20  PI*)( \.        
5950: 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73  LPFILETIME))aSys
5960: 63 61 6c 6c 5b 33 30 5d 2e 70 43 75 72 72 65 6e  call[30].pCurren
5970: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
5980: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
5990: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 54  _ANSI).  { "GetT
59a0: 65 6d 70 50 61 74 68 41 22 2c 20 20 20 20 20 20  empPathA",      
59b0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
59c0: 65 74 54 65 6d 70 50 61 74 68 41 2c 20 20 20 20  etTempPathA,    
59d0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
59e0: 73 65 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50  se.  { "GetTempP
59f0: 61 74 68 41 22 2c 20 20 20 20 20 20 20 20 20 20  athA",          
5a00: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a20: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5a30: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65  .#define osGetTe
5a40: 6d 70 50 61 74 68 41 20 28 28 44 57 4f 52 44 28  mpPathA ((DWORD(
5a50: 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c  WINAPI*)(DWORD,L
5a60: 50 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33  PSTR))aSyscall[3
5a70: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
5a80: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
5a90: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
5aa0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
5ab0: 49 44 45 29 0a 20 20 7b 20 22 47 65 74 54 65 6d  IDE).  { "GetTem
5ac0: 70 50 61 74 68 57 22 2c 20 20 20 20 20 20 20 20  pPathW",        
5ad0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
5ae0: 54 65 6d 70 50 61 74 68 57 2c 20 20 20 20 20 20  TempPathW,      
5af0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
5b00: 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74  .  { "GetTempPat
5b10: 68 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  hW",            
5b20: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
5b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b40: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
5b50: 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65 6d 70  define osGetTemp
5b60: 50 61 74 68 57 20 28 28 44 57 4f 52 44 28 57 49  PathW ((DWORD(WI
5b70: 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 57  NAPI*)(DWORD,LPW
5b80: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33 32  STR))aSyscall[32
5b90: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5ba0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
5bb0: 54 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f  T.  { "GetTickCo
5bc0: 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  unt",           
5bd0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69 63   (SYSCALL)GetTic
5be0: 6b 43 6f 75 6e 74 2c 20 20 20 20 20 20 20 20 20  kCount,         
5bf0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5c00: 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 22  { "GetTickCount"
5c10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
5c20: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5c40: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5c50: 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43 6f 75  ine osGetTickCou
5c60: 6e 74 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  nt ((DWORD(WINAP
5c70: 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61  I*)(VOID))aSysca
5c80: 6c 6c 5b 33 33 5d 2e 70 43 75 72 72 65 6e 74 29  ll[33].pCurrent)
5c90: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
5ca0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
5cb0: 4e 53 49 29 20 26 26 20 64 65 66 69 6e 65 64 28  NSI) && defined(
5cc0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54  SQLITE_WIN32_GET
5cd0: 56 45 52 53 49 4f 4e 45 58 29 20 26 26 20 5c 0a  VERSIONEX) && \.
5ce0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57          SQLITE_W
5cf0: 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45  IN32_GETVERSIONE
5d00: 58 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f  X.  { "GetVersio
5d10: 6e 45 78 41 22 2c 20 20 20 20 20 20 20 20 20 20  nExA",          
5d20: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 56 65 72   (SYSCALL)GetVer
5d30: 73 69 6f 6e 45 78 41 2c 20 20 20 20 20 20 20 20  sionExA,        
5d40: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5d50: 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41  { "GetVersionExA
5d60: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
5d70: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5d90: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5da0: 69 6e 65 20 6f 73 47 65 74 56 65 72 73 69 6f 6e  ine osGetVersion
5db0: 45 78 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ExA ((BOOL(WINAP
5dc0: 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c  I*)( \.        L
5dd0: 50 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 29  POSVERSIONINFOA)
5de0: 29 61 53 79 73 63 61 6c 6c 5b 33 34 5d 2e 70 43  )aSyscall[34].pC
5df0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
5e00: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
5e10: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
5e20: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20  WIN32_HAS_WIDE) 
5e30: 26 26 20 5c 0a 20 20 20 20 20 20 20 20 64 65 66  && \.        def
5e40: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
5e50: 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 29 20  2_GETVERSIONEX) 
5e60: 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  && SQLITE_WIN32_
5e70: 47 45 54 56 45 52 53 49 4f 4e 45 58 0a 20 20 7b  GETVERSIONEX.  {
5e80: 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 57 22   "GetVersionExW"
5e90: 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ,           (SYS
5ea0: 43 41 4c 4c 29 47 65 74 56 65 72 73 69 6f 6e 45  CALL)GetVersionE
5eb0: 78 57 2c 20 20 20 20 20 20 20 20 20 20 20 30 20  xW,           0 
5ec0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
5ed0: 74 56 65 72 73 69 6f 6e 45 78 57 22 2c 20 20 20  tVersionExW",   
5ee0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5ef0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
5f00: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5f10: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
5f20: 73 47 65 74 56 65 72 73 69 6f 6e 45 78 57 20 28  sGetVersionExW (
5f30: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20  (BOOL(WINAPI*)( 
5f40: 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 53 56 45  \.        LPOSVE
5f50: 52 53 49 4f 4e 49 4e 46 4f 57 29 29 61 53 79 73  RSIONINFOW))aSys
5f60: 63 61 6c 6c 5b 33 35 5d 2e 70 43 75 72 72 65 6e  call[35].pCurren
5f70: 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 41 6c 6c  t)..  { "HeapAll
5f80: 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  oc",            
5f90: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70     (SYSCALL)Heap
5fa0: 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20 20 20  Alloc,          
5fb0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
5fc0: 6e 65 20 6f 73 48 65 61 70 41 6c 6c 6f 63 20 28  ne osHeapAlloc (
5fd0: 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29  (LPVOID(WINAPI*)
5fe0: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c  (HANDLE,DWORD, \
5ff0: 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29  .        SIZE_T)
6000: 29 61 53 79 73 63 61 6c 6c 5b 33 36 5d 2e 70 43  )aSyscall[36].pC
6010: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
6020: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
6030: 7b 20 22 48 65 61 70 43 72 65 61 74 65 22 2c 20  { "HeapCreate", 
6040: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6050: 53 43 41 4c 4c 29 48 65 61 70 43 72 65 61 74 65  SCALL)HeapCreate
6060: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ,              0
6070: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48   },.#else.  { "H
6080: 65 61 70 43 72 65 61 74 65 22 2c 20 20 20 20 20  eapCreate",     
6090: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
60a0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
60b0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
60c0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
60d0: 6f 73 48 65 61 70 43 72 65 61 74 65 20 28 28 48  osHeapCreate ((H
60e0: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 44  ANDLE(WINAPI*)(D
60f0: 57 4f 52 44 2c 53 49 5a 45 5f 54 2c 20 5c 0a 20  WORD,SIZE_T, \. 
6100: 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61         SIZE_T))a
6110: 53 79 73 63 61 6c 6c 5b 33 37 5d 2e 70 43 75 72  Syscall[37].pCur
6120: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
6130: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
6140: 22 48 65 61 70 44 65 73 74 72 6f 79 22 2c 20 20  "HeapDestroy",  
6150: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6160: 41 4c 4c 29 48 65 61 70 44 65 73 74 72 6f 79 2c  ALL)HeapDestroy,
6170: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6180: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61  ,.#else.  { "Hea
6190: 70 44 65 73 74 72 6f 79 22 2c 20 20 20 20 20 20  pDestroy",      
61a0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
61b0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
61c0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
61d0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
61e0: 48 65 61 70 44 65 73 74 72 6f 79 20 28 28 42 4f  HeapDestroy ((BO
61f0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
6200: 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 38 5d  LE))aSyscall[38]
6210: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
6220: 22 48 65 61 70 46 72 65 65 22 2c 20 20 20 20 20  "HeapFree",     
6230: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6240: 41 4c 4c 29 48 65 61 70 46 72 65 65 2c 20 20 20  ALL)HeapFree,   
6250: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6260: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61  ,..#define osHea
6270: 70 46 72 65 65 20 28 28 42 4f 4f 4c 28 57 49 4e  pFree ((BOOL(WIN
6280: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
6290: 52 44 2c 4c 50 56 4f 49 44 29 29 61 53 79 73 63  RD,LPVOID))aSysc
62a0: 61 6c 6c 5b 33 39 5d 2e 70 43 75 72 72 65 6e 74  all[39].pCurrent
62b0: 29 0a 0a 20 20 7b 20 22 48 65 61 70 52 65 41 6c  )..  { "HeapReAl
62c0: 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20 20  loc",           
62d0: 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 52    (SYSCALL)HeapR
62e0: 65 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20 20  eAlloc,         
62f0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
6300: 65 20 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63 20  e osHeapReAlloc 
6310: 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a  ((LPVOID(WINAPI*
6320: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c  )(HANDLE,DWORD,L
6330: 50 56 4f 49 44 2c 20 5c 0a 20 20 20 20 20 20 20  PVOID, \.       
6340: 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c   SIZE_T))aSyscal
6350: 6c 5b 34 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[40].pCurrent).
6360: 0a 20 20 7b 20 22 48 65 61 70 53 69 7a 65 22 2c  .  { "HeapSize",
6370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6380: 28 53 59 53 43 41 4c 4c 29 48 65 61 70 53 69 7a  (SYSCALL)HeapSiz
6390: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
63a0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
63b0: 6f 73 48 65 61 70 53 69 7a 65 20 28 28 53 49 5a  osHeapSize ((SIZ
63c0: 45 5f 54 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  E_T(WINAPI*)(HAN
63d0: 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  DLE,DWORD, \.   
63e0: 20 20 20 20 20 4c 50 43 56 4f 49 44 29 29 61 53       LPCVOID))aS
63f0: 79 73 63 61 6c 6c 5b 34 31 5d 2e 70 43 75 72 72  yscall[41].pCurr
6400: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
6410: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
6420: 48 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20 20  HeapValidate",  
6430: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6440: 4c 4c 29 48 65 61 70 56 61 6c 69 64 61 74 65 2c  LL)HeapValidate,
6450: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6460: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70  .#else.  { "Heap
6470: 56 61 6c 69 64 61 74 65 22 2c 20 20 20 20 20 20  Validate",      
6480: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6490: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
64a0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
64b0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48  dif..#define osH
64c0: 65 61 70 56 61 6c 69 64 61 74 65 20 28 28 42 4f  eapValidate ((BO
64d0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
64e0: 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  LE,DWORD, \.    
64f0: 20 20 20 20 4c 50 43 56 4f 49 44 29 29 61 53 79      LPCVOID))aSy
6500: 73 63 61 6c 6c 5b 34 32 5d 2e 70 43 75 72 72 65  scall[42].pCurre
6510: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
6520: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
6530: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
6540: 7b 20 22 48 65 61 70 43 6f 6d 70 61 63 74 22 2c  { "HeapCompact",
6550: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6560: 53 43 41 4c 4c 29 48 65 61 70 43 6f 6d 70 61 63  SCALL)HeapCompac
6570: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  t,             0
6580: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48   },.#else.  { "H
6590: 65 61 70 43 6f 6d 70 61 63 74 22 2c 20 20 20 20  eapCompact",    
65a0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
65b0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
65c0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
65d0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
65e0: 6f 73 48 65 61 70 43 6f 6d 70 61 63 74 20 28 28  osHeapCompact ((
65f0: 55 49 4e 54 28 57 49 4e 41 50 49 2a 29 28 48 41  UINT(WINAPI*)(HA
6600: 4e 44 4c 45 2c 44 57 4f 52 44 29 29 61 53 79 73  NDLE,DWORD))aSys
6610: 63 61 6c 6c 5b 34 33 5d 2e 70 43 75 72 72 65 6e  call[43].pCurren
6620: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
6630: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
6640: 5f 41 4e 53 49 29 20 26 26 20 21 64 65 66 69 6e  _ANSI) && !defin
6650: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ed(SQLITE_OMIT_L
6660: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20  OAD_EXTENSION). 
6670: 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 41   { "LoadLibraryA
6680: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
6690: 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61  YSCALL)LoadLibra
66a0: 72 79 41 2c 20 20 20 20 20 20 20 20 20 20 20 20  ryA,            
66b0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
66c0: 4c 6f 61 64 4c 69 62 72 61 72 79 41 22 2c 20 20  LoadLibraryA",  
66d0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
66e0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
66f0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6700: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6710: 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 20   osLoadLibraryA 
6720: 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49  ((HMODULE(WINAPI
6730: 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63  *)(LPCSTR))aSysc
6740: 61 6c 6c 5b 34 34 5d 2e 70 43 75 72 72 65 6e 74  all[44].pCurrent
6750: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
6760: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
6770: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
6780: 48 41 53 5f 57 49 44 45 29 20 26 26 20 5c 0a 20  HAS_WIDE) && \. 
6790: 20 20 20 20 20 20 20 21 64 65 66 69 6e 65 64 28         !defined(
67a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
67b0: 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20  _EXTENSION).  { 
67c0: 22 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c 20  "LoadLibraryW", 
67d0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
67e0: 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79 57  ALL)LoadLibraryW
67f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
6800: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61  ,.#else.  { "Loa
6810: 64 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20 20  dLibraryW",     
6820: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6830: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6840: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6850: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6860: 4c 6f 61 64 4c 69 62 72 61 72 79 57 20 28 28 48  LoadLibraryW ((H
6870: 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28  MODULE(WINAPI*)(
6880: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
6890: 6c 5b 34 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[45].pCurrent).
68a0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
68b0: 57 49 4e 52 54 0a 20 20 7b 20 22 4c 6f 63 61 6c  WINRT.  { "Local
68c0: 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20 20  Free",          
68d0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f       (SYSCALL)Lo
68e0: 63 61 6c 46 72 65 65 2c 20 20 20 20 20 20 20 20  calFree,        
68f0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
6900: 65 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65  e.  { "LocalFree
6910: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
6920: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
6930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6940: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
6950: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 61 6c 46  #define osLocalF
6960: 72 65 65 20 28 28 48 4c 4f 43 41 4c 28 57 49 4e  ree ((HLOCAL(WIN
6970: 41 50 49 2a 29 28 48 4c 4f 43 41 4c 29 29 61 53  API*)(HLOCAL))aS
6980: 79 73 63 61 6c 6c 5b 34 36 5d 2e 70 43 75 72 72  yscall[46].pCurr
6990: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
69a0: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
69b0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
69c0: 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20   { "LockFile",  
69d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
69e0: 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65 2c  YSCALL)LockFile,
69f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a00: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6a10: 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20  LockFile",      
6a20: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6a30: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6a40: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6a50: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
6a60: 20 6f 73 4c 6f 63 6b 46 69 6c 65 0a 23 64 65 66   osLockFile.#def
6a70: 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 20 28  ine osLockFile (
6a80: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
6a90: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52  ANDLE,DWORD,DWOR
6aa0: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
6ab0: 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61     DWORD))aSysca
6ac0: 6c 6c 5b 34 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[47].pCurrent)
6ad0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51  .#endif..#if !SQ
6ae0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
6af0: 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 20  { "LockFileEx", 
6b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6b10: 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65 45 78  SCALL)LockFileEx
6b20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ,              0
6b30: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c   },.#else.  { "L
6b40: 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20  ockFileEx",     
6b50: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6b60: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
6b70: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6b80: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
6b90: 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 0a 23 64 65  osLockFileEx.#de
6ba0: 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 45  fine osLockFileE
6bb0: 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  x ((BOOL(WINAPI*
6bc0: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44  )(HANDLE,DWORD,D
6bd0: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
6be0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56  , \.        LPOV
6bf0: 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63 61  ERLAPPED))aSysca
6c00: 6c 6c 5b 34 38 5d 2e 70 43 75 72 72 65 6e 74 29  ll[48].pCurrent)
6c10: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
6c20: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20  ITE_OS_WINCE || 
6c30: 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  (!SQLITE_OS_WINR
6c40: 54 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 28  T && \.        (
6c50: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6c60: 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c  OMIT_WAL) || SQL
6c70: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
6c80: 45 3e 30 29 29 0a 20 20 7b 20 22 4d 61 70 56 69  E>0)).  { "MapVi
6c90: 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ewOfFile",      
6ca0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 61       (SYSCALL)Ma
6cb0: 70 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20  pViewOfFile,    
6cc0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
6cd0: 65 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66  e.  { "MapViewOf
6ce0: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
6cf0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
6d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d10: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
6d20: 23 64 65 66 69 6e 65 20 6f 73 4d 61 70 56 69 65  #define osMapVie
6d30: 77 4f 66 46 69 6c 65 20 28 28 4c 50 56 4f 49 44  wOfFile ((LPVOID
6d40: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
6d50: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f  ,DWORD,DWORD,DWO
6d60: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49  RD, \.        SI
6d70: 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 34  ZE_T))aSyscall[4
6d80: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  9].pCurrent)..  
6d90: 7b 20 22 4d 75 6c 74 69 42 79 74 65 54 6f 57 69  { "MultiByteToWi
6da0: 64 65 43 68 61 72 22 2c 20 20 20 20 20 28 53 59  deChar",     (SY
6db0: 53 43 41 4c 4c 29 4d 75 6c 74 69 42 79 74 65 54  SCALL)MultiByteT
6dc0: 6f 57 69 64 65 43 68 61 72 2c 20 20 20 20 20 30  oWideChar,     0
6dd0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d   },..#define osM
6de0: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
6df0: 61 72 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a  ar ((int(WINAPI*
6e00: 29 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43  )(UINT,DWORD,LPC
6e10: 53 54 52 2c 69 6e 74 2c 4c 50 57 53 54 52 2c 20  STR,int,LPWSTR, 
6e20: 5c 0a 20 20 20 20 20 20 20 20 69 6e 74 29 29 61  \.        int))a
6e30: 53 79 73 63 61 6c 6c 5b 35 30 5d 2e 70 43 75 72  Syscall[50].pCur
6e40: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 51 75 65 72  rent)..  { "Quer
6e50: 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e  yPerformanceCoun
6e60: 74 65 72 22 2c 20 28 53 59 53 43 41 4c 4c 29 51  ter", (SYSCALL)Q
6e70: 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43  ueryPerformanceC
6e80: 6f 75 6e 74 65 72 2c 20 30 20 7d 2c 0a 0a 23 64  ounter, 0 },..#d
6e90: 65 66 69 6e 65 20 6f 73 51 75 65 72 79 50 65 72  efine osQueryPer
6ea0: 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20  formanceCounter 
6eb0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
6ec0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 41 52 47 45   \.        LARGE
6ed0: 5f 49 4e 54 45 47 45 52 2a 29 29 61 53 79 73 63  _INTEGER*))aSysc
6ee0: 61 6c 6c 5b 35 31 5d 2e 70 43 75 72 72 65 6e 74  all[51].pCurrent
6ef0: 29 0a 0a 20 20 7b 20 22 52 65 61 64 46 69 6c 65  )..  { "ReadFile
6f00: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
6f10: 20 20 28 53 59 53 43 41 4c 4c 29 52 65 61 64 46    (SYSCALL)ReadF
6f20: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
6f30: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
6f40: 65 20 6f 73 52 65 61 64 46 69 6c 65 20 28 28 42  e osReadFile ((B
6f50: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
6f60: 44 4c 45 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44  DLE,LPVOID,DWORD
6f70: 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  ,LPDWORD, \.    
6f80: 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44      LPOVERLAPPED
6f90: 29 29 61 53 79 73 63 61 6c 6c 5b 35 32 5d 2e 70  ))aSyscall[52].p
6fa0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53  Current)..  { "S
6fb0: 65 74 45 6e 64 4f 66 46 69 6c 65 22 2c 20 20 20  etEndOfFile",   
6fc0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6fd0: 4c 29 53 65 74 45 6e 64 4f 66 46 69 6c 65 2c 20  L)SetEndOfFile, 
6fe0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6ff0: 0a 23 64 65 66 69 6e 65 20 6f 73 53 65 74 45 6e  .#define osSetEn
7000: 64 4f 66 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57  dOfFile ((BOOL(W
7010: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29  INAPI*)(HANDLE))
7020: 61 53 79 73 63 61 6c 6c 5b 35 33 5d 2e 70 43 75  aSyscall[53].pCu
7030: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
7040: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
7050: 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72   "SetFilePointer
7060: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
7070: 43 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e  CALL)SetFilePoin
7080: 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 30 20  ter,          0 
7090: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 65  },.#else.  { "Se
70a0: 74 46 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20  tFilePointer",  
70b0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
70c0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
70d0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
70e0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
70f0: 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 20  sSetFilePointer 
7100: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
7110: 28 48 41 4e 44 4c 45 2c 4c 4f 4e 47 2c 50 4c 4f  (HANDLE,LONG,PLO
7120: 4e 47 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  NG, \.        DW
7130: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 34  ORD))aSyscall[54
7140: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
7150: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
7160: 54 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c 20 20  T.  { "Sleep",  
7170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7180: 20 28 53 59 53 43 41 4c 4c 29 53 6c 65 65 70 2c   (SYSCALL)Sleep,
7190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71a0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
71b0: 7b 20 22 53 6c 65 65 70 22 2c 20 20 20 20 20 20  { "Sleep",      
71c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
71d0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
71e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
71f0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
7200: 69 6e 65 20 6f 73 53 6c 65 65 70 20 28 28 56 4f  ine osSleep ((VO
7210: 49 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52  ID(WINAPI*)(DWOR
7220: 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 35 5d 2e  D))aSyscall[55].
7230: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
7240: 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65  SystemTimeToFile
7250: 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41  Time",    (SYSCA
7260: 4c 4c 29 53 79 73 74 65 6d 54 69 6d 65 54 6f 46  LL)SystemTimeToF
7270: 69 6c 65 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c  ileTime,    0 },
7280: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 79 73 74  ..#define osSyst
7290: 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65  emTimeToFileTime
72a0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
72b0: 28 43 4f 4e 53 54 20 53 59 53 54 45 4d 54 49 4d  (CONST SYSTEMTIM
72c0: 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  E*, \.        LP
72d0: 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61  FILETIME))aSysca
72e0: 6c 6c 5b 35 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[56].pCurrent)
72f0: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
7300: 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
7310: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
7320: 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20  UnlockFile",    
7330: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
7340: 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 2c 20 20  LL)UnlockFile,  
7350: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7360: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f  .#else.  { "Unlo
7370: 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  ckFile",        
7380: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
7390: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
73a0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
73b0: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 55  dif..#ifndef osU
73c0: 6e 6c 6f 63 6b 46 69 6c 65 0a 23 64 65 66 69 6e  nlockFile.#defin
73d0: 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 20 28  e osUnlockFile (
73e0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
73f0: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52  ANDLE,DWORD,DWOR
7400: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
7410: 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61     DWORD))aSysca
7420: 6c 6c 5b 35 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[57].pCurrent)
7430: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51  .#endif..#if !SQ
7440: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
7450: 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22  { "UnlockFileEx"
7460: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
7470: 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65  SCALL)UnlockFile
7480: 45 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  Ex,            0
7490: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55   },.#else.  { "U
74a0: 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20  nlockFileEx",   
74b0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
74c0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
74d0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
74e0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
74f0: 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 20 28  osUnlockFileEx (
7500: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
7510: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52  ANDLE,DWORD,DWOR
7520: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
7530: 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29     LPOVERLAPPED)
7540: 29 61 53 79 73 63 61 6c 6c 5b 35 38 5d 2e 70 43  )aSyscall[58].pC
7550: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
7560: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20  ITE_OS_WINCE || 
7570: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
7580: 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c  OMIT_WAL) || SQL
7590: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
75a0: 45 3e 30 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69  E>0.  { "UnmapVi
75b0: 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ewOfFile",      
75c0: 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6d 61     (SYSCALL)Unma
75d0: 70 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20  pViewOfFile,    
75e0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
75f0: 20 20 7b 20 22 55 6e 6d 61 70 56 69 65 77 4f 66    { "UnmapViewOf
7600: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 28  File",         (
7610: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
7620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7630: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
7640: 65 66 69 6e 65 20 6f 73 55 6e 6d 61 70 56 69 65  efine osUnmapVie
7650: 77 4f 66 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57  wOfFile ((BOOL(W
7660: 49 4e 41 50 49 2a 29 28 4c 50 43 56 4f 49 44 29  INAPI*)(LPCVOID)
7670: 29 61 53 79 73 63 61 6c 6c 5b 35 39 5d 2e 70 43  )aSyscall[59].pC
7680: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 57 69  urrent)..  { "Wi
7690: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
76a0: 65 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c  e",     (SYSCALL
76b0: 29 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69  )WideCharToMulti
76c0: 42 79 74 65 2c 20 20 20 20 20 30 20 7d 2c 0a 0a  Byte,     0 },..
76d0: 23 64 65 66 69 6e 65 20 6f 73 57 69 64 65 43 68  #define osWideCh
76e0: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 20 28 28  arToMultiByte ((
76f0: 69 6e 74 28 57 49 4e 41 50 49 2a 29 28 55 49 4e  int(WINAPI*)(UIN
7700: 54 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54 52 2c  T,DWORD,LPCWSTR,
7710: 69 6e 74 2c 4c 50 53 54 52 2c 69 6e 74 2c 20 5c  int,LPSTR,int, \
7720: 0a 20 20 20 20 20 20 20 20 4c 50 43 53 54 52 2c  .        LPCSTR,
7730: 4c 50 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c  LPBOOL))aSyscall
7740: 5b 36 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [60].pCurrent)..
7750: 20 20 7b 20 22 57 72 69 74 65 46 69 6c 65 22 2c    { "WriteFile",
7760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
7770: 53 59 53 43 41 4c 4c 29 57 72 69 74 65 46 69 6c  SYSCALL)WriteFil
7780: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
7790: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
77a0: 73 57 72 69 74 65 46 69 6c 65 20 28 28 42 4f 4f  sWriteFile ((BOO
77b0: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
77c0: 45 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c  E,LPCVOID,DWORD,
77d0: 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  LPDWORD, \.     
77e0: 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29     LPOVERLAPPED)
77f0: 29 61 53 79 73 63 61 6c 6c 5b 36 31 5d 2e 70 43  )aSyscall[61].pC
7800: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
7810: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
7820: 20 22 43 72 65 61 74 65 45 76 65 6e 74 45 78 57   "CreateEventExW
7830: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
7840: 43 41 4c 4c 29 43 72 65 61 74 65 45 76 65 6e 74  CALL)CreateEvent
7850: 45 78 57 2c 20 20 20 20 20 20 20 20 20 20 30 20  ExW,          0 
7860: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72  },.#else.  { "Cr
7870: 65 61 74 65 45 76 65 6e 74 45 78 57 22 2c 20 20  eateEventExW",  
7880: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7890: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
78a0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
78b0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
78c0: 73 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 20  sCreateEventExW 
78d0: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
78e0: 29 28 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54  )(LPSECURITY_ATT
78f0: 52 49 42 55 54 45 53 2c 4c 50 43 57 53 54 52 2c  RIBUTES,LPCWSTR,
7900: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
7910: 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  ,DWORD))aSyscall
7920: 5b 36 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [62].pCurrent)..
7930: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
7940: 49 4e 52 54 0a 20 20 7b 20 22 57 61 69 74 46 6f  INRT.  { "WaitFo
7950: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 22 2c 20  rSingleObject", 
7960: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 61 69      (SYSCALL)Wai
7970: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
7980: 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65  ,     0 },.#else
7990: 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e  .  { "WaitForSin
79a0: 67 6c 65 4f 62 6a 65 63 74 22 2c 20 20 20 20 20  gleObject",     
79b0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
79c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79d0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
79e0: 64 65 66 69 6e 65 20 6f 73 57 61 69 74 46 6f 72  define osWaitFor
79f0: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 20 28 28 44  SingleObject ((D
7a00: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41  WORD(WINAPI*)(HA
7a10: 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20  NDLE, \.        
7a20: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
7a30: 36 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  63].pCurrent)..#
7a40: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
7a50: 4e 43 45 0a 20 20 7b 20 22 57 61 69 74 46 6f 72  NCE.  { "WaitFor
7a60: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c  SingleObjectEx",
7a70: 20 20 20 28 53 59 53 43 41 4c 4c 29 57 61 69 74     (SYSCALL)Wait
7a80: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45  ForSingleObjectE
7a90: 78 2c 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  x,   0 },.#else.
7aa0: 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67    { "WaitForSing
7ab0: 6c 65 4f 62 6a 65 63 74 45 78 22 2c 20 20 20 28  leObjectEx",   (
7ac0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ae0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
7af0: 65 66 69 6e 65 20 6f 73 57 61 69 74 46 6f 72 53  efine osWaitForS
7b00: 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 20 28 28  ingleObjectEx ((
7b10: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48  DWORD(WINAPI*)(H
7b20: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20  ANDLE,DWORD, \. 
7b30: 20 20 20 20 20 20 20 42 4f 4f 4c 29 29 61 53 79         BOOL))aSy
7b40: 73 63 61 6c 6c 5b 36 34 5d 2e 70 43 75 72 72 65  scall[64].pCurre
7b50: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
7b60: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 65  OS_WINRT.  { "Se
7b70: 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c  tFilePointerEx",
7b80: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7b90: 29 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45  )SetFilePointerE
7ba0: 78 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  x,        0 },.#
7bb0: 65 6c 73 65 0a 20 20 7b 20 22 53 65 74 46 69 6c  else.  { "SetFil
7bc0: 65 50 6f 69 6e 74 65 72 45 78 22 2c 20 20 20 20  ePointerEx",    
7bd0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bf0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7c00: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65 74  f..#define osSet
7c10: 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 20 28 28  FilePointerEx ((
7c20: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
7c30: 4e 44 4c 45 2c 4c 41 52 47 45 5f 49 4e 54 45 47  NDLE,LARGE_INTEG
7c40: 45 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 50 4c  ER, \.        PL
7c50: 41 52 47 45 5f 49 4e 54 45 47 45 52 2c 44 57 4f  ARGE_INTEGER,DWO
7c60: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 35 5d  RD))aSyscall[65]
7c70: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
7c80: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
7c90: 20 20 7b 20 22 47 65 74 46 69 6c 65 49 6e 66 6f    { "GetFileInfo
7ca0: 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45  rmationByHandleE
7cb0: 78 22 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74  x", (SYSCALL)Get
7cc0: 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42  FileInformationB
7cd0: 79 48 61 6e 64 6c 65 45 78 2c 20 30 20 7d 2c 0a  yHandleEx, 0 },.
7ce0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69  #else.  { "GetFi
7cf0: 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48  leInformationByH
7d00: 61 6e 64 6c 65 45 78 22 2c 20 28 53 59 53 43 41  andleEx", (SYSCA
7d10: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
7d20: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
7d30: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
7d40: 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e  tFileInformation
7d50: 42 79 48 61 6e 64 6c 65 45 78 20 28 28 42 4f 4f  ByHandleEx ((BOO
7d60: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
7d70: 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 46 49 4c  E, \.        FIL
7d80: 45 5f 49 4e 46 4f 5f 42 59 5f 48 41 4e 44 4c 45  E_INFO_BY_HANDLE
7d90: 5f 43 4c 41 53 53 2c 4c 50 56 4f 49 44 2c 44 57  _CLASS,LPVOID,DW
7da0: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 36  ORD))aSyscall[66
7db0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
7dc0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
7dd0: 20 26 26 20 28 21 64 65 66 69 6e 65 64 28 53 51   && (!defined(SQ
7de0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c  LITE_OMIT_WAL) |
7df0: 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  | SQLITE_MAX_MMA
7e00: 50 5f 53 49 5a 45 3e 30 29 0a 20 20 7b 20 22 4d  P_SIZE>0).  { "M
7e10: 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d  apViewOfFileFrom
7e20: 41 70 70 22 2c 20 20 20 20 28 53 59 53 43 41 4c  App",    (SYSCAL
7e30: 4c 29 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46  L)MapViewOfFileF
7e40: 72 6f 6d 41 70 70 2c 20 20 20 20 30 20 7d 2c 0a  romApp,    0 },.
7e50: 23 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70 56 69  #else.  { "MapVi
7e60: 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 22  ewOfFileFromApp"
7e70: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c  ,    (SYSCALL)0,
7e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e90: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
7ea0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61  if..#define osMa
7eb0: 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41  pViewOfFileFromA
7ec0: 70 70 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41  pp ((LPVOID(WINA
7ed0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 55 4c 4f 4e  PI*)(HANDLE,ULON
7ee0: 47 2c 55 4c 4f 4e 47 36 34 2c 20 5c 0a 20 20 20  G,ULONG64, \.   
7ef0: 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79       SIZE_T))aSy
7f00: 73 63 61 6c 6c 5b 36 37 5d 2e 70 43 75 72 72 65  scall[67].pCurre
7f10: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
7f20: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43 72  OS_WINRT.  { "Cr
7f30: 65 61 74 65 46 69 6c 65 32 22 2c 20 20 20 20 20  eateFile2",     
7f40: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7f50: 29 43 72 65 61 74 65 46 69 6c 65 32 2c 20 20 20  )CreateFile2,   
7f60: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7f70: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
7f80: 46 69 6c 65 32 22 2c 20 20 20 20 20 20 20 20 20  File2",         
7f90: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fb0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7fc0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
7fd0: 61 74 65 46 69 6c 65 32 20 28 28 48 41 4e 44 4c  ateFile2 ((HANDL
7fe0: 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53  E(WINAPI*)(LPCWS
7ff0: 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44  TR,DWORD,DWORD,D
8000: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
8010: 4c 50 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58  LPCREATEFILE2_EX
8020: 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52  TENDED_PARAMETER
8030: 53 29 29 61 53 79 73 63 61 6c 6c 5b 36 38 5d 2e  S))aSyscall[68].
8040: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
8050: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
8060: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
8070: 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
8080: 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64  NSION).  { "Load
8090: 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 22  PackagedLibrary"
80a0: 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c  ,     (SYSCALL)L
80b0: 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61  oadPackagedLibra
80c0: 72 79 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ry,     0 },.#el
80d0: 73 65 0a 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b  se.  { "LoadPack
80e0: 61 67 65 64 4c 69 62 72 61 72 79 22 2c 20 20 20  agedLibrary",   
80f0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
8100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8110: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
8120: 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 50  .#define osLoadP
8130: 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 20 28  ackagedLibrary (
8140: 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a  (HMODULE(WINAPI*
8150: 29 28 4c 50 43 57 53 54 52 2c 20 5c 0a 20 20 20  )(LPCWSTR, \.   
8160: 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73       DWORD))aSys
8170: 63 61 6c 6c 5b 36 39 5d 2e 70 43 75 72 72 65 6e  call[69].pCurren
8180: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
8190: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74  S_WINRT.  { "Get
81a0: 54 69 63 6b 43 6f 75 6e 74 36 34 22 2c 20 20 20  TickCount64",   
81b0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
81c0: 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 2c 20  GetTickCount64, 
81d0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
81e0: 6c 73 65 0a 20 20 7b 20 22 47 65 74 54 69 63 6b  lse.  { "GetTick
81f0: 43 6f 75 6e 74 36 34 22 2c 20 20 20 20 20 20 20  Count64",       
8200: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
8210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8220: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
8230: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54  ..#define osGetT
8240: 69 63 6b 43 6f 75 6e 74 36 34 20 28 28 55 4c 4f  ickCount64 ((ULO
8250: 4e 47 4c 4f 4e 47 28 57 49 4e 41 50 49 2a 29 28  NGLONG(WINAPI*)(
8260: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 37  VOID))aSyscall[7
8270: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
8280: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
8290: 54 0a 20 20 7b 20 22 47 65 74 4e 61 74 69 76 65  T.  { "GetNative
82a0: 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20  SystemInfo",    
82b0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 4e 61 74   (SYSCALL)GetNat
82c0: 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20  iveSystemInfo,  
82d0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
82e0: 7b 20 22 47 65 74 4e 61 74 69 76 65 53 79 73 74  { "GetNativeSyst
82f0: 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 28 53 59  emInfo",     (SY
8300: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
8320: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
8330: 69 6e 65 20 6f 73 47 65 74 4e 61 74 69 76 65 53  ine osGetNativeS
8340: 79 73 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44  ystemInfo ((VOID
8350: 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20  (WINAPI*)( \.   
8360: 20 20 20 20 20 4c 50 53 59 53 54 45 4d 5f 49 4e       LPSYSTEM_IN
8370: 46 4f 29 29 61 53 79 73 63 61 6c 6c 5b 37 31 5d  FO))aSyscall[71]
8380: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
8390: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
83a0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
83b0: 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67 53   { "OutputDebugS
83c0: 74 72 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53  tringA",      (S
83d0: 59 53 43 41 4c 4c 29 4f 75 74 70 75 74 44 65 62  YSCALL)OutputDeb
83e0: 75 67 53 74 72 69 6e 67 41 2c 20 20 20 20 20 20  ugStringA,      
83f0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
8400: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
8410: 67 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  gA",      (SYSCA
8420: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
8430: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
8440: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
8450: 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74   osOutputDebugSt
8460: 72 69 6e 67 41 20 28 28 56 4f 49 44 28 57 49 4e  ringA ((VOID(WIN
8470: 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53  API*)(LPCSTR))aS
8480: 79 73 63 61 6c 6c 5b 37 32 5d 2e 70 43 75 72 72  yscall[72].pCurr
8490: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
84a0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
84b0: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 4f 75  AS_WIDE).  { "Ou
84c0: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57  tputDebugStringW
84d0: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
84e0: 29 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  )OutputDebugStri
84f0: 6e 67 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23  ngW,      0 },.#
8500: 65 6c 73 65 0a 20 20 7b 20 22 4f 75 74 70 75 74  else.  { "Output
8510: 44 65 62 75 67 53 74 72 69 6e 67 57 22 2c 20 20  DebugStringW",  
8520: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
8530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8540: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
8550: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4f 75 74  f..#define osOut
8560: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 20  putDebugStringW 
8570: 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  ((VOID(WINAPI*)(
8580: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
8590: 6c 5b 37 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[73].pCurrent).
85a0: 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 65 73 73  .  { "GetProcess
85b0: 48 65 61 70 22 2c 20 20 20 20 20 20 20 20 20 20  Heap",          
85c0: 28 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63  (SYSCALL)GetProc
85d0: 65 73 73 48 65 61 70 2c 20 20 20 20 20 20 20 20  essHeap,        
85e0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
85f0: 6f 73 47 65 74 50 72 6f 63 65 73 73 48 65 61 70  osGetProcessHeap
8600: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
8610: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c  *)(VOID))aSyscal
8620: 6c 5b 37 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[74].pCurrent).
8630: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
8640: 49 4e 52 54 20 26 26 20 28 21 64 65 66 69 6e 65  INRT && (!define
8650: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
8660: 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  L) || SQLITE_MAX
8670: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 29 0a 20 20  _MMAP_SIZE>0).  
8680: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70  { "CreateFileMap
8690: 70 69 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28 53  pingFromApp", (S
86a0: 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c  YSCALL)CreateFil
86b0: 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 2c  eMappingFromApp,
86c0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
86d0: 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  "CreateFileMappi
86e0: 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28 53 59 53  ngFromApp", (SYS
86f0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
8700: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
8710: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
8720: 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  e osCreateFileMa
8730: 70 70 69 6e 67 46 72 6f 6d 41 70 70 20 28 28 48  ppingFromApp ((H
8740: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48  ANDLE(WINAPI*)(H
8750: 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20  ANDLE, \.       
8760: 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52   LPSECURITY_ATTR
8770: 49 42 55 54 45 53 2c 55 4c 4f 4e 47 2c 55 4c 4f  IBUTES,ULONG,ULO
8780: 4e 47 36 34 2c 4c 50 43 57 53 54 52 29 29 61 53  NG64,LPCWSTR))aS
8790: 79 73 63 61 6c 6c 5b 37 35 5d 2e 70 43 75 72 72  yscall[75].pCurr
87a0: 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 4e 4f 54 45  ent)../*.** NOTE
87b0: 3a 20 4f 6e 20 73 6f 6d 65 20 73 75 62 2d 70 6c  : On some sub-pl
87c0: 61 74 66 6f 72 6d 73 2c 20 74 68 65 20 49 6e 74  atforms, the Int
87d0: 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45  erlockedCompareE
87e0: 78 63 68 61 6e 67 65 20 22 66 75 6e 63 74 69 6f  xchange "functio
87f0: 6e 22 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 72  n".**       is r
8800: 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6d 61 63  eally just a mac
8810: 72 6f 20 74 68 61 74 20 75 73 65 73 20 61 20 63  ro that uses a c
8820: 6f 6d 70 69 6c 65 72 20 69 6e 74 72 69 6e 73 69  ompiler intrinsi
8830: 63 20 28 65 2e 67 2e 20 78 36 34 29 2e 0a 2a 2a  c (e.g. x64)..**
8840: 20 20 20 20 20 20 20 53 6f 20 64 6f 20 6e 6f 74         So do not
8850: 20 74 72 79 20 74 6f 20 6d 61 6b 65 20 74 68 69   try to make thi
8860: 73 20 69 73 20 69 6e 74 6f 20 61 20 72 65 64 65  s is into a rede
8870: 66 69 6e 61 62 6c 65 20 69 6e 74 65 72 66 61 63  finable interfac
8880: 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  e..*/.#if define
8890: 64 28 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d  d(InterlockedCom
88a0: 70 61 72 65 45 78 63 68 61 6e 67 65 29 0a 20 20  pareExchange).  
88b0: 7b 20 22 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f  { "InterlockedCo
88c0: 6d 70 61 72 65 45 78 63 68 61 6e 67 65 22 2c 20  mpareExchange", 
88d0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
88e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
88f0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 49   },..#define osI
8900: 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72  nterlockedCompar
8910: 65 45 78 63 68 61 6e 67 65 20 49 6e 74 65 72 6c  eExchange Interl
8920: 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68  ockedCompareExch
8930: 61 6e 67 65 0a 23 65 6c 73 65 0a 20 20 7b 20 22  ange.#else.  { "
8940: 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61  InterlockedCompa
8950: 72 65 45 78 63 68 61 6e 67 65 22 2c 20 28 53 59  reExchange", (SY
8960: 53 43 41 4c 4c 29 49 6e 74 65 72 6c 6f 63 6b 65  SCALL)Interlocke
8970: 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65  dCompareExchange
8980: 2c 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20  , 0 },..#define 
8990: 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d  osInterlockedCom
89a0: 70 61 72 65 45 78 63 68 61 6e 67 65 20 28 28 4c  pareExchange ((L
89b0: 4f 4e 47 28 57 49 4e 41 50 49 2a 29 28 4c 4f 4e  ONG(WINAPI*)(LON
89c0: 47 20 5c 0a 20 20 20 20 20 20 20 20 53 51 4c 49  G \.        SQLI
89d0: 54 45 5f 57 49 4e 33 32 5f 56 4f 4c 41 54 49 4c  TE_WIN32_VOLATIL
89e0: 45 2a 2c 20 4c 4f 4e 47 2c 4c 4f 4e 47 29 29 61  E*, LONG,LONG))a
89f0: 53 79 73 63 61 6c 6c 5b 37 36 5d 2e 70 43 75 72  Syscall[76].pCur
8a00: 72 65 6e 74 29 0a 23 65 6e 64 69 66 20 2f 2a 20  rent).#endif /* 
8a10: 64 65 66 69 6e 65 64 28 49 6e 74 65 72 6c 6f 63  defined(Interloc
8a20: 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e  kedCompareExchan
8a30: 67 65 29 20 2a 2f 0a 0a 23 69 66 20 21 53 51 4c  ge) */..#if !SQL
8a40: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
8a50: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
8a60: 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   && SQLITE_WIN32
8a70: 5f 55 53 45 5f 55 55 49 44 0a 20 20 7b 20 22 55  _USE_UUID.  { "U
8a80: 75 69 64 43 72 65 61 74 65 22 2c 20 20 20 20 20  uidCreate",     
8a90: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
8aa0: 4c 4c 29 55 75 69 64 43 72 65 61 74 65 2c 20 20  LL)UuidCreate,  
8ab0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
8ac0: 23 65 6c 73 65 0a 20 20 7b 20 22 55 75 69 64 43  #else.  { "UuidC
8ad0: 72 65 61 74 65 22 2c 20 20 20 20 20 20 20 20 20  reate",         
8ae0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
8af0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8b00: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
8b10: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 75  if..#define osUu
8b20: 69 64 43 72 65 61 74 65 20 28 28 52 50 43 5f 53  idCreate ((RPC_S
8b30: 54 41 54 55 53 28 52 50 43 5f 45 4e 54 52 59 2a  TATUS(RPC_ENTRY*
8b40: 29 28 55 55 49 44 2a 29 29 61 53 79 73 63 61 6c  )(UUID*))aSyscal
8b50: 6c 5b 37 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[77].pCurrent).
8b60: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
8b70: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
8b80: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 53 51 4c  _OS_WINRT && SQL
8b90: 49 54 45 5f 57 49 4e 33 32 5f 55 53 45 5f 55 55  ITE_WIN32_USE_UU
8ba0: 49 44 0a 20 20 7b 20 22 55 75 69 64 43 72 65 61  ID.  { "UuidCrea
8bb0: 74 65 53 65 71 75 65 6e 74 69 61 6c 22 2c 20 20  teSequential",  
8bc0: 20 20 20 28 53 59 53 43 41 4c 4c 29 55 75 69 64     (SYSCALL)Uuid
8bd0: 43 72 65 61 74 65 53 65 71 75 65 6e 74 69 61 6c  CreateSequential
8be0: 2c 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20  ,   0 },.#else. 
8bf0: 20 7b 20 22 55 75 69 64 43 72 65 61 74 65 53 65   { "UuidCreateSe
8c00: 71 75 65 6e 74 69 61 6c 22 2c 20 20 20 20 20 28  quential",     (
8c10: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
8c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c30: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
8c40: 66 69 6e 65 20 6f 73 55 75 69 64 43 72 65 61 74  fine osUuidCreat
8c50: 65 53 65 71 75 65 6e 74 69 61 6c 20 5c 0a 20 20  eSequential \.  
8c60: 20 20 20 20 20 20 28 28 52 50 43 5f 53 54 41 54        ((RPC_STAT
8c70: 55 53 28 52 50 43 5f 45 4e 54 52 59 2a 29 28 55  US(RPC_ENTRY*)(U
8c80: 55 49 44 2a 29 29 61 53 79 73 63 61 6c 6c 5b 37  UID*))aSyscall[7
8c90: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 7d 3b  8].pCurrent)..};
8ca0: 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6f   /* End of the o
8cb0: 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74  verrideable syst
8cc0: 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a  em calls */../*.
8cd0: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78  ** This is the x
8ce0: 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29 20  SetSystemCall() 
8cf0: 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74 65  method of sqlite
8d00: 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66  3_vfs for all of
8d10: 20 74 68 65 0a 2a 2a 20 22 77 69 6e 33 32 22 20   the.** "win32" 
8d20: 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53  VFSes.  Return S
8d30: 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75  QLITE_OK opon su
8d40: 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74  ccessfully updat
8d50: 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65  ing the.** syste
8d60: 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20  m call pointer, 
8d70: 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  or SQLITE_NOTFOU
8d80: 4e 44 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  ND if there is n
8d90: 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a  o configurable.*
8da0: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61  * system call na
8db0: 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74  med zName..*/.st
8dc0: 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 74 53  atic int winSetS
8dd0: 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c  ystemCall(.  sql
8de0: 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73  ite3_vfs *pNotUs
8df0: 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ed,        /* Th
8e00: 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20 20  e VFS pointer.  
8e10: 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f  Not used */.  co
8e20: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
8e30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8e40: 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61  ame of system ca
8e50: 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a  ll to override *
8e60: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63  /.  sqlite3_sysc
8e70: 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e 63  all_ptr pNewFunc
8e80: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
8e90: 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  new system call 
8ea0: 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e  value */.){.  un
8eb0: 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20  signed int i;.  
8ec0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
8ed0: 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55  NOTFOUND;..  UNU
8ee0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
8ef0: 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 7a  otUsed);.  if( z
8f00: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Name==0 ){.    /
8f10: 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73  * If no zName is
8f20: 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65 20   given, restore 
8f30: 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  all system calls
8f40: 20 74 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c   to their defaul
8f50: 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67  t.    ** setting
8f60: 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  s and return NUL
8f70: 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  L.    */.    rc 
8f80: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
8f90: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
8fa0: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
8fb0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
8fc0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
8fd0: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  ( aSyscall[i].pD
8fe0: 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20  efault ){.      
8ff0: 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43    aSyscall[i].pC
9000: 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c  urrent = aSyscal
9010: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20  l[i].pDefault;. 
9020: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
9030: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
9040: 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69  zName is specifi
9050: 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f  ed, operate on o
9060: 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73 74  nly the one syst
9070: 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  em call.    ** s
9080: 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f  pecified..    */
9090: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
90a0: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29  sizeof(aSyscall)
90b0: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  /sizeof(aSyscall
90c0: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
90d0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61    if( strcmp(zNa
90e0: 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  me, aSyscall[i].
90f0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
9100: 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c       if( aSyscal
9110: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30  l[i].pDefault==0
9120: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53   ){.          aS
9130: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
9140: 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  lt = aSyscall[i]
9150: 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 20  .pCurrent;.     
9160: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
9170: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
9180: 20 20 20 20 20 69 66 28 20 70 4e 65 77 46 75 6e       if( pNewFun
9190: 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63 20  c==0 ) pNewFunc 
91a0: 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  = aSyscall[i].pD
91b0: 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20  efault;.        
91c0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
91d0: 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b  rent = pNewFunc;
91e0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
91f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9200: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
9210: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
9220: 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 79  he value of a sy
9230: 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75  stem call.  Retu
9240: 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65  rn NULL if zName
9250: 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63   is not a.** rec
9260: 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20 63  ognized system c
9270: 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20  all name.  NULL 
9280: 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64  is also returned
9290: 20 69 66 20 74 68 65 20 73 79 73 74 65 6d 20 63   if the system c
92a0: 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e  all.** is curren
92b0: 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a  tly undefined..*
92c0: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
92d0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 77 69 6e  _syscall_ptr win
92e0: 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20  GetSystemCall(. 
92f0: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e   sqlite3_vfs *pN
9300: 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20  otUsed,.  const 
9310: 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20  char *zName.){. 
9320: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
9330: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
9340: 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a  ETER(pNotUsed);.
9350: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
9360: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
9370: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
9380: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
9390: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
93a0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
93b0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53  )==0 ) return aS
93c0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
93d0: 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  nt;.  }.  return
93e0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
93f0: 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
9400: 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d  the first system
9410: 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d   call after zNam
9420: 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55  e.  If zName==NU
9430: 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  LL.** then retur
9440: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
9450: 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63  e first system c
9460: 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  all.  Return NUL
9470: 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73  L if zName.** is
9480: 20 74 68 65 20 6c 61 73 74 20 73 79 73 74 65 6d   the last system
9490: 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d   call or if zNam
94a0: 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d  e is not the nam
94b0: 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20  e of a valid.** 
94c0: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a  system call..*/.
94d0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
94e0: 72 20 2a 77 69 6e 4e 65 78 74 53 79 73 74 65 6d  r *winNextSystem
94f0: 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73  Call(sqlite3_vfs
9500: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
9510: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
9520: 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44   = -1;..  UNUSED
9530: 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20  _PARAMETER(p);. 
9540: 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
9550: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
9560: 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29  aySize(aSyscall)
9570: 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  -1; i++){.      
9580: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
9590: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  , aSyscall[i].zN
95a0: 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
95b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
95c0: 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i++; i<ArraySiz
95d0: 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b  e(aSyscall); i++
95e0: 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73 63  ){.    if( aSysc
95f0: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21  all[i].pCurrent!
9600: 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73  =0 ) return aSys
9610: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  call[i].zName;. 
9620: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
9630: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
9640: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a  WIN32_MALLOC./*.
9650: 2a 2a 20 49 66 20 61 20 57 69 6e 33 32 20 6e 61  ** If a Win32 na
9660: 74 69 76 65 20 68 65 61 70 20 68 61 73 20 62 65  tive heap has be
9670: 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 74  en configured, t
9680: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
9690: 6c 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20  l attempt to.** 
96a0: 63 6f 6d 70 61 63 74 20 69 74 2e 20 20 55 70 6f  compact it.  Upo
96b0: 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c 49 54  n success, SQLIT
96c0: 45 5f 4f 4b 20 77 69 6c 6c 20 62 65 20 72 65 74  E_OK will be ret
96d0: 75 72 6e 65 64 2e 20 20 55 70 6f 6e 20 66 61 69  urned.  Upon fai
96e0: 6c 75 72 65 2c 20 6f 6e 65 0a 2a 2a 20 6f 66 20  lure, one.** of 
96f0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 53 51  SQLITE_NOMEM, SQ
9700: 4c 49 54 45 5f 45 52 52 4f 52 2c 20 6f 72 20 53  LITE_ERROR, or S
9710: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 77  QLITE_NOTFOUND w
9720: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e  ill be returned.
9730: 20 20 54 68 65 0a 2a 2a 20 22 70 6e 4c 61 72 67    The.** "pnLarg
9740: 65 73 74 22 20 61 72 67 75 6d 65 6e 74 2c 20 69  est" argument, i
9750: 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 69 6c 6c  f non-zero, will
9760: 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 74 75   be used to retu
9770: 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
9780: 68 65 0a 2a 2a 20 6c 61 72 67 65 73 74 20 63 6f  he.** largest co
9790: 6d 6d 69 74 74 65 64 20 66 72 65 65 20 62 6c 6f  mmitted free blo
97a0: 63 6b 20 69 6e 20 74 68 65 20 68 65 61 70 2c 20  ck in the heap, 
97b0: 69 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a 69 6e 74  in bytes..*/.int
97c0: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 63   sqlite3_win32_c
97d0: 6f 6d 70 61 63 74 5f 68 65 61 70 28 4c 50 55 49  ompact_heap(LPUI
97e0: 4e 54 20 70 6e 4c 61 72 67 65 73 74 29 7b 0a 20  NT pnLargest){. 
97f0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
9800: 5f 4f 4b 3b 0a 20 20 55 49 4e 54 20 6e 4c 61 72  _OK;.  UINT nLar
9810: 67 65 73 74 20 3d 20 30 3b 0a 20 20 48 41 4e 44  gest = 0;.  HAND
9820: 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20 77 69 6e  LE hHeap;..  win
9830: 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29  MemAssertMagic()
9840: 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d  ;.  hHeap = winM
9850: 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61  emGetHeap();.  a
9860: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20  ssert( hHeap!=0 
9870: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
9880: 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ap!=INVALID_HAND
9890: 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20  LE_VALUE );.#if 
98a0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
98b0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
98c0: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f  TE_WIN32_MALLOC_
98d0: 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65  VALIDATE).  asse
98e0: 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61  rt( osHeapValida
98f0: 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  te(hHeap, SQLITE
9900: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
9910: 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64  S, NULL) );.#end
9920: 69 66 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  if.#if !SQLITE_O
9930: 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
9940: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66  TE_OS_WINRT.  if
9950: 28 20 28 6e 4c 61 72 67 65 73 74 3d 6f 73 48 65  ( (nLargest=osHe
9960: 61 70 43 6f 6d 70 61 63 74 28 68 48 65 61 70 2c  apCompact(hHeap,
9970: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
9980: 41 50 5f 46 4c 41 47 53 29 29 3d 3d 30 20 29 7b  AP_FLAGS))==0 ){
9990: 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45  .    DWORD lastE
99a0: 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
99b0: 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 69 66 28  Error();.    if(
99c0: 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 4e 4f 5f 45   lastErrno==NO_E
99d0: 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 73 71  RROR ){.      sq
99e0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
99f0: 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20  _NOMEM, "failed 
9a00: 74 6f 20 48 65 61 70 43 6f 6d 70 61 63 74 20 28  to HeapCompact (
9a10: 6e 6f 20 73 70 61 63 65 29 2c 20 68 65 61 70 3d  no space), heap=
9a20: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
9a30: 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68 48         (void*)hH
9a40: 65 61 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  eap);.      rc =
9a50: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
9a60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9a70: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
9a80: 54 45 5f 45 52 52 4f 52 2c 20 22 66 61 69 6c 65  TE_ERROR, "faile
9a90: 64 20 74 6f 20 48 65 61 70 43 6f 6d 70 61 63 74  d to HeapCompact
9aa0: 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22   (%lu), heap=%p"
9ab0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9ac0: 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72      osGetLastErr
9ad0: 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65  or(), (void*)hHe
9ae0: 61 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ap);.      rc = 
9af0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
9b00: 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20    }.  }.#else.  
9b10: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
9b20: 54 45 5f 4e 4f 54 46 4f 55 4e 44 2c 20 22 66 61  TE_NOTFOUND, "fa
9b30: 69 6c 65 64 20 74 6f 20 48 65 61 70 43 6f 6d 70  iled to HeapComp
9b40: 61 63 74 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20  act, heap=%p",. 
9b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
9b60: 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 72 63  id*)hHeap);.  rc
9b70: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55   = SQLITE_NOTFOU
9b80: 4e 44 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  ND;.#endif.  if(
9b90: 20 70 6e 4c 61 72 67 65 73 74 20 29 20 2a 70 6e   pnLargest ) *pn
9ba0: 4c 61 72 67 65 73 74 20 3d 20 6e 4c 61 72 67 65  Largest = nLarge
9bb0: 73 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  st;.  return rc;
9bc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 57  .}../*.** If a W
9bd0: 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61 70  in32 native heap
9be0: 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67   has been config
9bf0: 75 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ured, this funct
9c00: 69 6f 6e 20 77 69 6c 6c 20 61 74 74 65 6d 70 74  ion will attempt
9c10: 20 74 6f 0a 2a 2a 20 64 65 73 74 72 6f 79 20 61   to.** destroy a
9c20: 6e 64 20 72 65 63 72 65 61 74 65 20 69 74 2e 20  nd recreate it. 
9c30: 20 49 66 20 74 68 65 20 57 69 6e 33 32 20 6e 61   If the Win32 na
9c40: 74 69 76 65 20 68 65 61 70 20 69 73 20 6e 6f 74  tive heap is not
9c50: 20 69 73 6f 6c 61 74 65 64 20 61 6e 64 2f 6f 72   isolated and/or
9c60: 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f  .** the sqlite3_
9c70: 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 20 66 75  memory_used() fu
9c80: 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
9c90: 72 65 74 75 72 6e 20 7a 65 72 6f 2c 20 53 51 4c  return zero, SQL
9ca0: 49 54 45 5f 42 55 53 59 20 77 69 6c 6c 0a 2a 2a  ITE_BUSY will.**
9cb0: 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 6e 64   be returned and
9cc0: 20 6e 6f 20 63 68 61 6e 67 65 73 20 77 69 6c 6c   no changes will
9cd0: 20 62 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20   be made to the 
9ce0: 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61  Win32 native hea
9cf0: 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  p..*/.int sqlite
9d00: 33 5f 77 69 6e 33 32 5f 72 65 73 65 74 5f 68 65  3_win32_reset_he
9d10: 61 70 28 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ap(){.  int rc;.
9d20: 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73    MUTEX_LOGIC( s
9d30: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d  qlite3_mutex *pM
9d40: 61 73 74 65 72 3b 20 29 20 2f 2a 20 54 68 65 20  aster; ) /* The 
9d50: 6d 61 69 6e 20 73 74 61 74 69 63 20 6d 75 74 65  main static mute
9d60: 78 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47  x */.  MUTEX_LOG
9d70: 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
9d80: 78 20 2a 70 4d 65 6d 3b 20 29 20 20 20 20 2f 2a  x *pMem; )    /*
9d90: 20 54 68 65 20 6d 65 6d 73 79 73 20 73 74 61 74   The memsys stat
9da0: 69 63 20 6d 75 74 65 78 20 2a 2f 0a 20 20 4d 55  ic mutex */.  MU
9db0: 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74  TEX_LOGIC( pMast
9dc0: 65 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74  er = sqlite3_mut
9dd0: 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
9de0: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
9df0: 54 45 52 29 3b 20 29 0a 20 20 4d 55 54 45 58 5f  TER); ).  MUTEX_
9e00: 4c 4f 47 49 43 28 20 70 4d 65 6d 20 3d 20 73 71  LOGIC( pMem = sq
9e10: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
9e20: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
9e30: 54 41 54 49 43 5f 4d 45 4d 29 3b 20 29 0a 20 20  TATIC_MEM); ).  
9e40: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
9e50: 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ter(pMaster);.  
9e60: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
9e70: 74 65 72 28 70 4d 65 6d 29 3b 0a 20 20 77 69 6e  ter(pMem);.  win
9e80: 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29  MemAssertMagic()
9e90: 3b 0a 20 20 69 66 28 20 77 69 6e 4d 65 6d 47 65  ;.  if( winMemGe
9ea0: 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c 20 26 26  tHeap()!=NULL &&
9eb0: 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28   winMemGetOwned(
9ec0: 29 20 26 26 20 73 71 6c 69 74 65 33 5f 6d 65 6d  ) && sqlite3_mem
9ed0: 6f 72 79 5f 75 73 65 64 28 29 3d 3d 30 20 29 7b  ory_used()==0 ){
9ee0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 41  .    /*.    ** A
9ef0: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  t this point, th
9f00: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f  ere should be no
9f10: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6d 65 6d   outstanding mem
9f20: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  ory allocations 
9f30: 6f 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 68 65  on.    ** the he
9f40: 61 70 2e 20 20 41 6c 73 6f 2c 20 73 69 6e 63 65  ap.  Also, since
9f50: 20 62 6f 74 68 20 74 68 65 20 6d 61 73 74 65 72   both the master
9f60: 20 61 6e 64 20 6d 65 6d 73 79 73 20 6c 6f 63 6b   and memsys lock
9f70: 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a  s are currently.
9f80: 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 68 65 6c      ** being hel
9f90: 64 20 62 79 20 75 73 2c 20 6e 6f 20 6f 74 68 65  d by us, no othe
9fa0: 72 20 66 75 6e 63 74 69 6f 6e 20 28 69 2e 65 2e  r function (i.e.
9fb0: 20 66 72 6f 6d 20 61 6e 6f 74 68 65 72 20 74 68   from another th
9fc0: 72 65 61 64 29 20 73 68 6f 75 6c 64 0a 20 20 20  read) should.   
9fd0: 20 2a 2a 20 62 65 20 61 62 6c 65 20 74 6f 20 65   ** be able to e
9fe0: 76 65 6e 20 61 63 63 65 73 73 20 74 68 65 20 68  ven access the h
9ff0: 65 61 70 2e 20 20 41 74 74 65 6d 70 74 20 74 6f  eap.  Attempt to
a000: 20 64 65 73 74 72 6f 79 20 61 6e 64 20 72 65 63   destroy and rec
a010: 72 65 61 74 65 20 6f 75 72 0a 20 20 20 20 2a 2a  reate our.    **
a020: 20 69 73 6f 6c 61 74 65 64 20 57 69 6e 33 32 20   isolated Win32 
a030: 6e 61 74 69 76 65 20 68 65 61 70 20 6e 6f 77 2e  native heap now.
a040: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
a050: 72 74 28 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  rt( winMemGetHea
a060: 70 28 29 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20  p()!=NULL );.   
a070: 20 61 73 73 65 72 74 28 20 77 69 6e 4d 65 6d 47   assert( winMemG
a080: 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20 20  etOwned() );.   
a090: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a0a0: 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d  _memory_used()==
a0b0: 30 20 29 3b 0a 20 20 20 20 77 69 6e 4d 65 6d 53  0 );.    winMemS
a0c0: 68 75 74 64 6f 77 6e 28 77 69 6e 4d 65 6d 47 65  hutdown(winMemGe
a0d0: 74 44 61 74 61 50 74 72 28 29 29 3b 0a 20 20 20  tDataPtr());.   
a0e0: 20 61 73 73 65 72 74 28 20 77 69 6e 4d 65 6d 47   assert( winMemG
a0f0: 65 74 48 65 61 70 28 29 3d 3d 4e 55 4c 4c 20 29  etHeap()==NULL )
a100: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 77  ;.    assert( !w
a110: 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20  inMemGetOwned() 
a120: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
a130: 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73  qlite3_memory_us
a140: 65 64 28 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72  ed()==0 );.    r
a150: 63 20 3d 20 77 69 6e 4d 65 6d 49 6e 69 74 28 77  c = winMemInit(w
a160: 69 6e 4d 65 6d 47 65 74 44 61 74 61 50 74 72 28  inMemGetDataPtr(
a170: 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ));.    assert( 
a180: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
a190: 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29   winMemGetHeap()
a1a0: 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 61 73  !=NULL );.    as
a1b0: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
a1c0: 5f 4f 4b 20 7c 7c 20 77 69 6e 4d 65 6d 47 65 74  _OK || winMemGet
a1d0: 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20 20 20 61  Owned() );.    a
a1e0: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
a1f0: 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 5f  E_OK || sqlite3_
a200: 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d 30  memory_used()==0
a210: 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
a220: 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 57   /*.    ** The W
a230: 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61 70  in32 native heap
a240: 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69 66   cannot be modif
a250: 69 65 64 20 62 65 63 61 75 73 65 20 69 74 20 6d  ied because it m
a260: 61 79 20 62 65 20 69 6e 20 75 73 65 2e 0a 20 20  ay be in use..  
a270: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51    */.    rc = SQ
a280: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20  LITE_BUSY;.  }. 
a290: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
a2a0: 65 61 76 65 28 70 4d 65 6d 29 3b 0a 20 20 73 71  eave(pMem);.  sq
a2b0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
a2c0: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65  e(pMaster);.  re
a2d0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
a2e0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33  f /* SQLITE_WIN3
a2f0: 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a  2_MALLOC */../*.
a300: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
a310: 20 6f 75 74 70 75 74 73 20 74 68 65 20 73 70 65   outputs the spe
a320: 63 69 66 69 65 64 20 28 41 4e 53 49 29 20 73 74  cified (ANSI) st
a330: 72 69 6e 67 20 74 6f 20 74 68 65 20 57 69 6e 33  ring to the Win3
a340: 32 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 28 69  2 debugger.** (i
a350: 66 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f  f available)..*/
a360: 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 77  ..void sqlite3_w
a370: 69 6e 33 32 5f 77 72 69 74 65 5f 64 65 62 75 67  in32_write_debug
a380: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 75  (const char *zBu
a390: 66 2c 20 69 6e 74 20 6e 42 75 66 29 7b 0a 20 20  f, int nBuf){.  
a3a0: 63 68 61 72 20 7a 44 62 67 42 75 66 5b 53 51 4c  char zDbgBuf[SQL
a3b0: 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55  ITE_WIN32_DBG_BU
a3c0: 46 5f 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 6e  F_SIZE];.  int n
a3d0: 4d 69 6e 20 3d 20 4d 49 4e 28 6e 42 75 66 2c 20  Min = MIN(nBuf, 
a3e0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42  (SQLITE_WIN32_DB
a3f0: 47 5f 42 55 46 5f 53 49 5a 45 20 2d 20 31 29 29  G_BUF_SIZE - 1))
a400: 3b 20 2f 2a 20 6d 61 79 20 62 65 20 6e 65 67 61  ; /* may be nega
a410: 74 69 76 65 2e 20 2a 2f 0a 20 20 69 66 28 20 6e  tive. */.  if( n
a420: 4d 69 6e 3c 2d 31 20 29 20 6e 4d 69 6e 20 3d 20  Min<-1 ) nMin = 
a430: 2d 31 3b 20 2f 2a 20 61 6c 6c 20 6e 65 67 61 74  -1; /* all negat
a440: 69 76 65 20 76 61 6c 75 65 73 20 62 65 63 6f 6d  ive values becom
a450: 65 20 2d 31 2e 20 2a 2f 0a 20 20 61 73 73 65 72  e -1. */.  asser
a460: 74 28 20 6e 4d 69 6e 3d 3d 2d 31 20 7c 7c 20 6e  t( nMin==-1 || n
a470: 4d 69 6e 3d 3d 30 20 7c 7c 20 6e 4d 69 6e 3c 53  Min==0 || nMin<S
a480: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
a490: 42 55 46 5f 53 49 5a 45 20 29 3b 0a 23 69 66 20  BUF_SIZE );.#if 
a4a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
a4b0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
a4c0: 20 69 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20   if( nMin>0 ){. 
a4d0: 20 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75     memset(zDbgBu
a4e0: 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e  f, 0, SQLITE_WIN
a4f0: 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29  32_DBG_BUF_SIZE)
a500: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62  ;.    memcpy(zDb
a510: 67 42 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e  gBuf, zBuf, nMin
a520: 29 3b 0a 20 20 20 20 6f 73 4f 75 74 70 75 74 44  );.    osOutputD
a530: 65 62 75 67 53 74 72 69 6e 67 41 28 7a 44 62 67  ebugStringA(zDbg
a540: 42 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Buf);.  }else{. 
a550: 20 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67     osOutputDebug
a560: 53 74 72 69 6e 67 41 28 7a 42 75 66 29 3b 0a 20  StringA(zBuf);. 
a570: 20 7d 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64   }.#elif defined
a580: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
a590: 53 5f 57 49 44 45 29 0a 20 20 6d 65 6d 73 65 74  S_WIDE).  memset
a5a0: 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c  (zDbgBuf, 0, SQL
a5b0: 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55  ITE_WIN32_DBG_BU
a5c0: 46 5f 53 49 5a 45 29 3b 0a 20 20 69 66 20 28 20  F_SIZE);.  if ( 
a5d0: 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  osMultiByteToWid
a5e0: 65 43 68 61 72 28 0a 20 20 20 20 20 20 20 20 20  eChar(.         
a5f0: 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e   osAreFileApisAN
a600: 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a 20  SI() ? CP_ACP : 
a610: 43 50 5f 4f 45 4d 43 50 2c 20 30 2c 20 7a 42 75  CP_OEMCP, 0, zBu
a620: 66 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4d 69  f,.          nMi
a630: 6e 2c 20 28 4c 50 57 53 54 52 29 7a 44 62 67 42  n, (LPWSTR)zDbgB
a640: 75 66 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  uf, SQLITE_WIN32
a650: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 2f 73 69  _DBG_BUF_SIZE/si
a660: 7a 65 6f 66 28 57 43 48 41 52 29 29 3c 3d 30 20  zeof(WCHAR))<=0 
a670: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
a680: 20 7d 0a 20 20 6f 73 4f 75 74 70 75 74 44 65 62   }.  osOutputDeb
a690: 75 67 53 74 72 69 6e 67 57 28 28 4c 50 43 57 53  ugStringW((LPCWS
a6a0: 54 52 29 7a 44 62 67 42 75 66 29 3b 0a 23 65 6c  TR)zDbgBuf);.#el
a6b0: 73 65 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30 20  se.  if( nMin>0 
a6c0: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 44  ){.    memset(zD
a6d0: 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45  bgBuf, 0, SQLITE
a6e0: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
a6f0: 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  IZE);.    memcpy
a700: 28 7a 44 62 67 42 75 66 2c 20 7a 42 75 66 2c 20  (zDbgBuf, zBuf, 
a710: 6e 4d 69 6e 29 3b 0a 20 20 20 20 66 70 72 69 6e  nMin);.    fprin
a720: 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 22 2c  tf(stderr, "%s",
a730: 20 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d 65 6c   zDbgBuf);.  }el
a740: 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  se{.    fprintf(
a750: 73 74 64 65 72 72 2c 20 22 25 73 22 2c 20 7a 42  stderr, "%s", zB
a760: 75 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  uf);.  }.#endif.
a770: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
a780: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 73  lowing routine s
a790: 75 73 70 65 6e 64 73 20 74 68 65 20 63 75 72 72  uspends the curr
a7a0: 65 6e 74 20 74 68 72 65 61 64 20 66 6f 72 20 61  ent thread for a
a7b0: 74 20 6c 65 61 73 74 20 6d 73 0a 2a 2a 20 6d 69  t least ms.** mi
a7c0: 6c 6c 69 73 65 63 6f 6e 64 73 2e 20 20 54 68 69  lliseconds.  Thi
a7d0: 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  s is equivalent 
a7e0: 74 6f 20 74 68 65 20 57 69 6e 33 32 20 53 6c 65  to the Win32 Sle
a7f0: 65 70 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0a  ep() interface..
a800: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
a810: 5f 57 49 4e 52 54 0a 73 74 61 74 69 63 20 48 41  _WINRT.static HA
a820: 4e 44 4c 45 20 73 6c 65 65 70 4f 62 6a 20 3d 20  NDLE sleepObj = 
a830: 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 76 6f  NULL;.#endif..vo
a840: 69 64 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  id sqlite3_win32
a850: 5f 73 6c 65 65 70 28 44 57 4f 52 44 20 6d 69 6c  _sleep(DWORD mil
a860: 6c 69 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20  liseconds){.#if 
a870: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
a880: 20 20 69 66 20 28 20 73 6c 65 65 70 4f 62 6a 3d    if ( sleepObj=
a890: 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 73 6c 65  =NULL ){.    sle
a8a0: 65 70 4f 62 6a 20 3d 20 6f 73 43 72 65 61 74 65  epObj = osCreate
a8b0: 45 76 65 6e 74 45 78 57 28 4e 55 4c 4c 2c 20 4e  EventExW(NULL, N
a8c0: 55 4c 4c 2c 20 43 52 45 41 54 45 5f 45 56 45 4e  ULL, CREATE_EVEN
a8d0: 54 5f 4d 41 4e 55 41 4c 5f 52 45 53 45 54 2c 0a  T_MANUAL_RESET,.
a8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a900: 53 59 4e 43 48 52 4f 4e 49 5a 45 29 3b 0a 20 20  SYNCHRONIZE);.  
a910: 7d 0a 20 20 61 73 73 65 72 74 28 20 73 6c 65 65  }.  assert( slee
a920: 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20  pObj!=NULL );.  
a930: 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f  osWaitForSingleO
a940: 62 6a 65 63 74 45 78 28 73 6c 65 65 70 4f 62 6a  bjectEx(sleepObj
a950: 2c 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20  , milliseconds, 
a960: 46 41 4c 53 45 29 3b 0a 23 65 6c 73 65 0a 20 20  FALSE);.#else.  
a970: 6f 73 53 6c 65 65 70 28 6d 69 6c 6c 69 73 65 63  osSleep(millisec
a980: 6f 6e 64 73 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  onds);.#endif.}.
a990: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
a9a0: 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3e 30  WORKER_THREADS>0
a9b0: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
a9c0: 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
a9d0: 4f 53 5f 57 49 4e 52 54 20 26 26 20 5c 0a 20 20  OS_WINRT && \.  
a9e0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 48 52        SQLITE_THR
a9f0: 45 41 44 53 41 46 45 3e 30 0a 44 57 4f 52 44 20  EADSAFE>0.DWORD 
aa00: 73 71 6c 69 74 65 33 57 69 6e 33 32 57 61 69 74  sqlite3Win32Wait
aa10: 28 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 29  (HANDLE hObject)
aa20: 7b 0a 20 20 44 57 4f 52 44 20 72 63 3b 0a 20 20  {.  DWORD rc;.  
aa30: 77 68 69 6c 65 28 20 28 72 63 20 3d 20 6f 73 57  while( (rc = osW
aa40: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
aa50: 63 74 45 78 28 68 4f 62 6a 65 63 74 2c 20 49 4e  ctEx(hObject, IN
aa60: 46 49 4e 49 54 45 2c 0a 20 20 20 20 20 20 20 20  FINITE,.        
aa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
aa90: 52 55 45 29 29 3d 3d 57 41 49 54 5f 49 4f 5f 43  RUE))==WAIT_IO_C
aaa0: 4f 4d 50 4c 45 54 49 4f 4e 20 29 7b 7d 0a 20 20  OMPLETION ){}.  
aab0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
aac0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
aad0: 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f  n true (non-zero
aae0: 29 20 69 66 20 77 65 20 61 72 65 20 72 75 6e 6e  ) if we are runn
aaf0: 69 6e 67 20 75 6e 64 65 72 20 57 69 6e 4e 54 2c  ing under WinNT,
ab00: 20 57 69 6e 32 4b 2c 20 57 69 6e 58 50 2c 0a 2a   Win2K, WinXP,.*
ab10: 2a 20 6f 72 20 57 69 6e 43 45 2e 20 20 52 65 74  * or WinCE.  Ret
ab20: 75 72 6e 20 66 61 6c 73 65 20 28 7a 65 72 6f 29  urn false (zero)
ab30: 20 66 6f 72 20 57 69 6e 39 35 2c 20 57 69 6e 39   for Win95, Win9
ab40: 38 2c 20 6f 72 20 57 69 6e 4d 45 2e 0a 2a 2a 0a  8, or WinME..**.
ab50: 2a 2a 20 48 65 72 65 20 69 73 20 61 6e 20 69 6e  ** Here is an in
ab60: 74 65 72 65 73 74 69 6e 67 20 6f 62 73 65 72 76  teresting observ
ab70: 61 74 69 6f 6e 3a 20 20 57 69 6e 39 35 2c 20 57  ation:  Win95, W
ab80: 69 6e 39 38 2c 20 61 6e 64 20 57 69 6e 4d 45 20  in98, and WinME 
ab90: 6c 61 63 6b 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b  lack.** the Lock
aba0: 46 69 6c 65 45 78 28 29 20 41 50 49 2e 20 20 42  FileEx() API.  B
abb0: 75 74 20 77 65 20 63 61 6e 20 73 74 69 6c 6c 20  ut we can still 
abc0: 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 20  statically link 
abd0: 61 67 61 69 6e 73 74 20 74 68 61 74 0a 2a 2a 20  against that.** 
abe0: 41 50 49 20 61 73 20 6c 6f 6e 67 20 61 73 20 77  API as long as w
abf0: 65 20 64 6f 6e 27 74 20 63 61 6c 6c 20 69 74 20  e don't call it 
ac00: 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 57 69 6e  when running Win
ac10: 39 35 2f 39 38 2f 4d 45 2e 20 20 41 20 63 61 6c  95/98/ME.  A cal
ac20: 6c 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75  l to.** this rou
ac30: 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
ac40: 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
ac50: 20 68 6f 73 74 20 69 73 20 57 69 6e 39 35 2f 39   host is Win95/9
ac60: 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e 54  8/ME or.** WinNT
ac70: 2f 32 4b 2f 58 50 20 73 6f 20 74 68 61 74 20 77  /2K/XP so that w
ac80: 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 74  e will know whet
ac90: 68 65 72 20 6f 72 20 6e 6f 74 20 77 65 20 63 61  her or not we ca
aca0: 6e 20 73 61 66 65 6c 79 20 63 61 6c 6c 0a 2a 2a  n safely call.**
acb0: 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28   the LockFileEx(
acc0: 29 20 41 50 49 2e 0a 2a 2f 0a 0a 23 69 66 20 21  ) API..*/..#if !
acd0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
ace0: 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45  IN32_GETVERSIONE
acf0: 58 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f 57 49  X) || !SQLITE_WI
ad00: 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58  N32_GETVERSIONEX
ad10: 0a 23 20 64 65 66 69 6e 65 20 6f 73 49 73 4e 54  .# define osIsNT
ad20: 28 29 20 20 28 31 29 0a 23 65 6c 69 66 20 53 51  ()  (1).#elif SQ
ad30: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c  LITE_OS_WINCE ||
ad40: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
ad50: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
ad60: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
ad70: 53 49 29 0a 23 20 64 65 66 69 6e 65 20 6f 73 49  SI).# define osI
ad80: 73 4e 54 28 29 20 20 28 31 29 0a 23 65 6c 69 66  sNT()  (1).#elif
ad90: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
ada0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
adb0: 0a 23 20 64 65 66 69 6e 65 20 6f 73 49 73 4e 54  .# define osIsNT
adc0: 28 29 20 20 28 30 29 0a 23 65 6c 73 65 0a 23 20  ()  (0).#else.# 
add0: 64 65 66 69 6e 65 20 6f 73 49 73 4e 54 28 29 20  define osIsNT() 
ade0: 20 28 28 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79   ((sqlite3_os_ty
adf0: 70 65 3d 3d 32 29 20 7c 7c 20 73 71 6c 69 74 65  pe==2) || sqlite
ae00: 33 5f 77 69 6e 33 32 5f 69 73 5f 6e 74 28 29 29  3_win32_is_nt())
ae10: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
ae20: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74  his function det
ae30: 65 72 6d 69 6e 65 73 20 69 66 20 74 68 65 20 6d  ermines if the m
ae40: 61 63 68 69 6e 65 20 69 73 20 72 75 6e 6e 69 6e  achine is runnin
ae50: 67 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 57  g a version of W
ae60: 69 6e 64 6f 77 73 0a 2a 2a 20 62 61 73 65 64 20  indows.** based 
ae70: 6f 6e 20 74 68 65 20 4e 54 20 6b 65 72 6e 65 6c  on the NT kernel
ae80: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ae90: 5f 77 69 6e 33 32 5f 69 73 5f 6e 74 28 76 6f 69  _win32_is_nt(voi
aea0: 64 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  d){.#if SQLITE_O
aeb0: 53 5f 57 49 4e 52 54 0a 20 20 2f 2a 0a 20 20 2a  S_WINRT.  /*.  *
aec0: 2a 20 4e 4f 54 45 3a 20 54 68 65 20 57 69 6e 52  * NOTE: The WinR
aed0: 54 20 73 75 62 2d 70 6c 61 74 66 6f 72 6d 20 69  T sub-platform i
aee0: 73 20 61 6c 77 61 79 73 20 61 73 73 75 6d 65 64  s always assumed
aef0: 20 74 6f 20 62 65 20 62 61 73 65 64 20 6f 6e 20   to be based on 
af00: 74 68 65 20 4e 54 0a 20 20 2a 2a 20 20 20 20 20  the NT.  **     
af10: 20 20 6b 65 72 6e 65 6c 2e 0a 20 20 2a 2f 0a 20    kernel..  */. 
af20: 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6c 69 66   return 1;.#elif
af30: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
af40: 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e  WIN32_GETVERSION
af50: 45 58 29 20 26 26 20 53 51 4c 49 54 45 5f 57 49  EX) && SQLITE_WI
af60: 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58  N32_GETVERSIONEX
af70: 0a 20 20 69 66 28 20 6f 73 49 6e 74 65 72 6c 6f  .  if( osInterlo
af80: 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61  ckedCompareExcha
af90: 6e 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f  nge(&sqlite3_os_
afa0: 74 79 70 65 2c 20 30 2c 20 30 29 3d 3d 30 20 29  type, 0, 0)==0 )
afb0: 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  {.#if defined(SQ
afc0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
afd0: 4e 53 49 29 0a 20 20 20 20 4f 53 56 45 52 53 49  NSI).    OSVERSI
afe0: 4f 4e 49 4e 46 4f 41 20 73 49 6e 66 6f 3b 0a 20  ONINFOA sInfo;. 
aff0: 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72     sInfo.dwOSVer
b000: 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73  sionInfoSize = s
b010: 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20  izeof(sInfo);.  
b020: 20 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78    osGetVersionEx
b030: 41 28 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f  A(&sInfo);.    o
b040: 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70  sInterlockedComp
b050: 61 72 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c  areExchange(&sql
b060: 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 0a 20 20  ite3_os_type,.  
b070: 20 20 20 20 20 20 28 73 49 6e 66 6f 2e 64 77 50        (sInfo.dwP
b080: 6c 61 74 66 6f 72 6d 49 64 20 3d 3d 20 56 45 52  latformId == VER
b090: 5f 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f  _PLATFORM_WIN32_
b0a0: 4e 54 29 20 3f 20 32 20 3a 20 31 2c 20 30 29 3b  NT) ? 2 : 1, 0);
b0b0: 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
b0c0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
b0d0: 57 49 44 45 29 0a 20 20 20 20 4f 53 56 45 52 53  WIDE).    OSVERS
b0e0: 49 4f 4e 49 4e 46 4f 57 20 73 49 6e 66 6f 3b 0a  IONINFOW sInfo;.
b0f0: 20 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65      sInfo.dwOSVe
b100: 72 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20  rsionInfoSize = 
b110: 73 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20  sizeof(sInfo);. 
b120: 20 20 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45     osGetVersionE
b130: 78 57 28 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20  xW(&sInfo);.    
b140: 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d  osInterlockedCom
b150: 70 61 72 65 45 78 63 68 61 6e 67 65 28 26 73 71  pareExchange(&sq
b160: 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 0a 20  lite3_os_type,. 
b170: 20 20 20 20 20 20 20 28 73 49 6e 66 6f 2e 64 77         (sInfo.dw
b180: 50 6c 61 74 66 6f 72 6d 49 64 20 3d 3d 20 56 45  PlatformId == VE
b190: 52 5f 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32  R_PLATFORM_WIN32
b1a0: 5f 4e 54 29 20 3f 20 32 20 3a 20 31 2c 20 30 29  _NT) ? 2 : 1, 0)
b1b0: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72  ;.#endif.  }.  r
b1c0: 65 74 75 72 6e 20 6f 73 49 6e 74 65 72 6c 6f 63  eturn osInterloc
b1d0: 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e  kedCompareExchan
b1e0: 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74  ge(&sqlite3_os_t
b1f0: 79 70 65 2c 20 32 2c 20 32 29 3d 3d 32 3b 0a 23  ype, 2, 2)==2;.#
b200: 65 6c 69 66 20 53 51 4c 49 54 45 5f 54 45 53 54  elif SQLITE_TEST
b210: 0a 20 20 72 65 74 75 72 6e 20 6f 73 49 6e 74 65  .  return osInte
b220: 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78  rlockedCompareEx
b230: 63 68 61 6e 67 65 28 26 73 71 6c 69 74 65 33 5f  change(&sqlite3_
b240: 6f 73 5f 74 79 70 65 2c 20 32 2c 20 32 29 3d 3d  os_type, 2, 2)==
b250: 32 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 0a 20 20  2;.#else.  /*.  
b260: 2a 2a 20 4e 4f 54 45 3a 20 41 6c 6c 20 73 75 62  ** NOTE: All sub
b270: 2d 70 6c 61 74 66 6f 72 6d 73 20 77 68 65 72 65  -platforms where
b280: 20 74 68 65 20 47 65 74 56 65 72 73 69 6f 6e 45   the GetVersionE
b290: 78 5b 41 57 5d 20 66 75 6e 63 74 69 6f 6e 73 20  x[AW] functions 
b2a0: 61 72 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 64  are.  **       d
b2b0: 65 70 72 65 63 61 74 65 64 20 61 72 65 20 61 6c  eprecated are al
b2c0: 77 61 79 73 20 61 73 73 75 6d 65 64 20 74 6f 20  ways assumed to 
b2d0: 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  be based on the 
b2e0: 4e 54 20 6b 65 72 6e 65 6c 2e 0a 20 20 2a 2f 0a  NT kernel..  */.
b2f0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64    return 1;.#end
b300: 69 66 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  if.}..#ifdef SQL
b310: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
b320: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
b330: 6e 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79  nBytes of memory
b340: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b350: 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69   *winMemMalloc(i
b360: 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41  nt nBytes){.  HA
b370: 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f  NDLE hHeap;.  vo
b380: 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d  id *p;..  winMem
b390: 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20  AssertMagic();. 
b3a0: 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47   hHeap = winMemG
b3b0: 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65  etHeap();.  asse
b3c0: 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a  rt( hHeap!=0 );.
b3d0: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
b3e0: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
b3f0: 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51  VALUE );.#if !SQ
b400: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
b410: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
b420: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c  WIN32_MALLOC_VAL
b430: 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28  IDATE).  assert(
b440: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28   osHeapValidate(
b450: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
b460: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
b470: 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a  NULL) );.#endif.
b480: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 73    assert( nBytes
b490: 3e 3d 30 20 29 3b 0a 20 20 70 20 3d 20 6f 73 48  >=0 );.  p = osH
b4a0: 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20  eapAlloc(hHeap, 
b4b0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
b4c0: 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54  P_FLAGS, (SIZE_T
b4d0: 29 6e 42 79 74 65 73 29 3b 0a 20 20 69 66 28 20  )nBytes);.  if( 
b4e0: 21 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  !p ){.    sqlite
b4f0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d  3_log(SQLITE_NOM
b500: 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48  EM, "failed to H
b510: 65 61 70 41 6c 6c 6f 63 20 25 75 20 62 79 74 65  eapAlloc %u byte
b520: 73 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70  s (%lu), heap=%p
b530: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
b540: 20 20 20 6e 42 79 74 65 73 2c 20 6f 73 47 65 74     nBytes, osGet
b550: 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f  LastError(), (vo
b560: 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a  id*)hHeap);.  }.
b570: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
b580: 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79  *.** Free memory
b590: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b5a0: 20 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64   winMemFree(void
b5b0: 20 2a 70 50 72 69 6f 72 29 7b 0a 20 20 48 41 4e   *pPrior){.  HAN
b5c0: 44 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20 77 69  DLE hHeap;..  wi
b5d0: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
b5e0: 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e  );.  hHeap = win
b5f0: 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20  MemGetHeap();.  
b600: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30  assert( hHeap!=0
b610: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48   );.  assert( hH
b620: 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  eap!=INVALID_HAN
b630: 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66  DLE_VALUE );.#if
b640: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
b650: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
b660: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
b670: 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73  _VALIDATE).  ass
b680: 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64  ert( osHeapValid
b690: 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54  ate(hHeap, SQLIT
b6a0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
b6b0: 47 53 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23  GS, pPrior) );.#
b6c0: 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70 50 72  endif.  if( !pPr
b6d0: 69 6f 72 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a  ior ) return; /*
b6e0: 20 50 61 73 73 69 6e 67 20 4e 55 4c 4c 20 74 6f   Passing NULL to
b6f0: 20 48 65 61 70 46 72 65 65 20 69 73 20 75 6e 64   HeapFree is und
b700: 65 66 69 6e 65 64 2e 20 2a 2f 0a 20 20 69 66 28  efined. */.  if(
b710: 20 21 6f 73 48 65 61 70 46 72 65 65 28 68 48 65   !osHeapFree(hHe
b720: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
b730: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72  _HEAP_FLAGS, pPr
b740: 69 6f 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ior) ){.    sqli
b750: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
b760: 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f  OMEM, "failed to
b770: 20 48 65 61 70 46 72 65 65 20 62 6c 6f 63 6b 20   HeapFree block 
b780: 25 70 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25  %p (%lu), heap=%
b790: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
b7a0: 20 20 20 20 70 50 72 69 6f 72 2c 20 6f 73 47 65      pPrior, osGe
b7b0: 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76  tLastError(), (v
b7c0: 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d  oid*)hHeap);.  }
b7d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
b7e0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20   the size of an 
b7f0: 65 78 69 73 74 69 6e 67 20 6d 65 6d 6f 72 79 20  existing memory 
b800: 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74  allocation.*/.st
b810: 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65  atic void *winMe
b820: 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70  mRealloc(void *p
b830: 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65  Prior, int nByte
b840: 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65  s){.  HANDLE hHe
b850: 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a  ap;.  void *p;..
b860: 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61    winMemAssertMa
b870: 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d  gic();.  hHeap =
b880: 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29   winMemGetHeap()
b890: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
b8a0: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
b8b0: 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44  ( hHeap!=INVALID
b8c0: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b  _HANDLE_VALUE );
b8d0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
b8e0: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
b8f0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
b900: 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20  LLOC_VALIDATE). 
b910: 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56   assert( osHeapV
b920: 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53  alidate(hHeap, S
b930: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
b940: 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20  _FLAGS, pPrior) 
b950: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
b960: 72 74 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b  rt( nBytes>=0 );
b970: 0a 20 20 69 66 28 20 21 70 50 72 69 6f 72 20 29  .  if( !pPrior )
b980: 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70  {.    p = osHeap
b990: 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c  Alloc(hHeap, SQL
b9a0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
b9b0: 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42  LAGS, (SIZE_T)nB
b9c0: 79 74 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ytes);.  }else{.
b9d0: 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70 52 65      p = osHeapRe
b9e0: 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c  Alloc(hHeap, SQL
b9f0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
ba00: 4c 41 47 53 2c 20 70 50 72 69 6f 72 2c 20 28 53  LAGS, pPrior, (S
ba10: 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20  IZE_T)nBytes);. 
ba20: 20 7d 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20   }.  if( !p ){. 
ba30: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
ba40: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61  QLITE_NOMEM, "fa
ba50: 69 6c 65 64 20 74 6f 20 25 73 20 25 75 20 62 79  iled to %s %u by
ba60: 74 65 73 20 28 25 6c 75 29 2c 20 68 65 61 70 3d  tes (%lu), heap=
ba70: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
ba80: 20 20 20 20 20 70 50 72 69 6f 72 20 3f 20 22 48       pPrior ? "H
ba90: 65 61 70 52 65 41 6c 6c 6f 63 22 20 3a 20 22 48  eapReAlloc" : "H
baa0: 65 61 70 41 6c 6c 6f 63 22 2c 20 6e 42 79 74 65  eapAlloc", nByte
bab0: 73 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  s, osGetLastErro
bac0: 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
bad0: 20 20 20 20 20 28 76 6f 69 64 2a 29 68 48 65 61       (void*)hHea
bae0: 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
baf0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   p;.}../*.** Ret
bb00: 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
bb10: 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 61  an outstanding a
bb20: 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 62 79  llocation, in by
bb30: 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tes..*/.static i
bb40: 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f  nt winMemSize(vo
bb50: 69 64 20 2a 70 29 7b 0a 20 20 48 41 4e 44 4c 45  id *p){.  HANDLE
bb60: 20 68 48 65 61 70 3b 0a 20 20 53 49 5a 45 5f 54   hHeap;.  SIZE_T
bb70: 20 6e 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73   n;..  winMemAss
bb80: 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48  ertMagic();.  hH
bb90: 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48  eap = winMemGetH
bba0: 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28  eap();.  assert(
bbb0: 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61   hHeap!=0 );.  a
bbc0: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e  ssert( hHeap!=IN
bbd0: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
bbe0: 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54  UE );.#if !SQLIT
bbf0: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
bc00: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
bc10: 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41  32_MALLOC_VALIDA
bc20: 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73  TE).  assert( os
bc30: 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65  HeapValidate(hHe
bc40: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
bc50: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 29 20  _HEAP_FLAGS, p) 
bc60: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  );.#endif.  if( 
bc70: 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  !p ) return 0;. 
bc80: 20 6e 20 3d 20 6f 73 48 65 61 70 53 69 7a 65 28   n = osHeapSize(
bc90: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
bca0: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
bcb0: 70 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 28 53 49  p);.  if( n==(SI
bcc0: 5a 45 5f 54 29 2d 31 20 29 7b 0a 20 20 20 20 73  ZE_T)-1 ){.    s
bcd0: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
bce0: 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64  E_NOMEM, "failed
bcf0: 20 74 6f 20 48 65 61 70 53 69 7a 65 20 62 6c 6f   to HeapSize blo
bd00: 63 6b 20 25 70 20 28 25 6c 75 29 2c 20 68 65 61  ck %p (%lu), hea
bd10: 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20  p=%p",.         
bd20: 20 20 20 20 20 20 20 70 2c 20 6f 73 47 65 74 4c         p, osGetL
bd30: 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69  astError(), (voi
bd40: 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20 72  d*)hHeap);.    r
bd50: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
bd60: 65 74 75 72 6e 20 28 69 6e 74 29 6e 3b 0a 7d 0a  eturn (int)n;.}.
bd70: 0a 2f 2a 0a 2a 2a 20 52 6f 75 6e 64 20 75 70 20  ./*.** Round up 
bd80: 61 20 72 65 71 75 65 73 74 20 73 69 7a 65 20 74  a request size t
bd90: 6f 20 74 68 65 20 6e 65 78 74 20 76 61 6c 69 64  o the next valid
bda0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65   allocation size
bdb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bdc0: 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e  winMemRoundup(in
bdd0: 74 20 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20 6e  t n){.  return n
bde0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
bdf0: 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c  alize this modul
be00: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
be10: 20 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64   winMemInit(void
be20: 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20 77   *pAppData){.  w
be30: 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d  inMemData *pWinM
be40: 65 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d  emData = (winMem
be50: 44 61 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b  Data *)pAppData;
be60: 0a 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d  ..  if( !pWinMem
be70: 44 61 74 61 20 29 20 72 65 74 75 72 6e 20 53 51  Data ) return SQ
be80: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 61 73  LITE_ERROR;.  as
be90: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
bea0: 61 2d 3e 6d 61 67 69 63 31 3d 3d 57 49 4e 4d 45  a->magic1==WINME
beb0: 4d 5f 4d 41 47 49 43 31 20 29 3b 0a 20 20 61 73  M_MAGIC1 );.  as
bec0: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
bed0: 61 2d 3e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d 45  a->magic2==WINME
bee0: 4d 5f 4d 41 47 49 43 32 20 29 3b 0a 0a 23 69 66  M_MAGIC2 );..#if
bef0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
bf00: 54 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33  T && SQLITE_WIN3
bf10: 32 5f 48 45 41 50 5f 43 52 45 41 54 45 0a 20 20  2_HEAP_CREATE.  
bf20: 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  if( !pWinMemData
bf30: 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 44  ->hHeap ){.    D
bf40: 57 4f 52 44 20 64 77 49 6e 69 74 69 61 6c 53 69  WORD dwInitialSi
bf50: 7a 65 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33  ze = SQLITE_WIN3
bf60: 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45  2_HEAP_INIT_SIZE
bf70: 3b 0a 20 20 20 20 44 57 4f 52 44 20 64 77 4d 61  ;.    DWORD dwMa
bf80: 78 69 6d 75 6d 53 69 7a 65 20 3d 20 28 44 57 4f  ximumSize = (DWO
bf90: 52 44 29 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  RD)sqlite3Global
bfa0: 43 6f 6e 66 69 67 2e 6e 48 65 61 70 3b 0a 20 20  Config.nHeap;.  
bfb0: 20 20 69 66 28 20 64 77 4d 61 78 69 6d 75 6d 53    if( dwMaximumS
bfc0: 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize==0 ){.      
bfd0: 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 20 3d 20  dwMaximumSize = 
bfe0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
bff0: 50 5f 4d 41 58 5f 53 49 5a 45 3b 0a 20 20 20 20  P_MAX_SIZE;.    
c000: 7d 65 6c 73 65 20 69 66 28 20 64 77 49 6e 69 74  }else if( dwInit
c010: 69 61 6c 53 69 7a 65 3e 64 77 4d 61 78 69 6d 75  ialSize>dwMaximu
c020: 6d 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 64  mSize ){.      d
c030: 77 49 6e 69 74 69 61 6c 53 69 7a 65 20 3d 20 64  wInitialSize = d
c040: 77 4d 61 78 69 6d 75 6d 53 69 7a 65 3b 0a 20 20  wMaximumSize;.  
c050: 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44    }.    pWinMemD
c060: 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73 48  ata->hHeap = osH
c070: 65 61 70 43 72 65 61 74 65 28 53 51 4c 49 54 45  eapCreate(SQLITE
c080: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
c090: 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
c0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0b0: 20 20 20 20 20 20 20 20 20 64 77 49 6e 69 74 69           dwIniti
c0c0: 61 6c 53 69 7a 65 2c 20 64 77 4d 61 78 69 6d 75  alSize, dwMaximu
c0d0: 6d 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  mSize);.    if( 
c0e0: 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  !pWinMemData->hH
c0f0: 65 61 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  eap ){.      sql
c100: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
c110: 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20 20  NOMEM,.         
c120: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
c130: 43 72 65 61 74 65 20 28 25 6c 75 29 2c 20 66 6c  Create (%lu), fl
c140: 61 67 73 3d 25 75 2c 20 69 6e 69 74 53 69 7a 65  ags=%u, initSize
c150: 3d 25 6c 75 2c 20 6d 61 78 53 69 7a 65 3d 25 6c  =%lu, maxSize=%l
c160: 75 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6f 73  u",.          os
c170: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
c180: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
c190: 50 5f 46 4c 41 47 53 2c 20 64 77 49 6e 69 74 69  P_FLAGS, dwIniti
c1a0: 61 6c 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  alSize,.        
c1b0: 20 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 29    dwMaximumSize)
c1c0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
c1d0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
c1e0: 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61   }.    pWinMemDa
c1f0: 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 54 52 55  ta->bOwned = TRU
c200: 45 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  E;.    assert( p
c210: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e  WinMemData->bOwn
c220: 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  ed );.  }.#else.
c230: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68    pWinMemData->h
c240: 48 65 61 70 20 3d 20 6f 73 47 65 74 50 72 6f 63  Heap = osGetProc
c250: 65 73 73 48 65 61 70 28 29 3b 0a 20 20 69 66 28  essHeap();.  if(
c260: 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68   !pWinMemData->h
c270: 48 65 61 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  Heap ){.    sqli
c280: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
c290: 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20 22 66  OMEM,.        "f
c2a0: 61 69 6c 65 64 20 74 6f 20 47 65 74 50 72 6f 63  ailed to GetProc
c2b0: 65 73 73 48 65 61 70 20 28 25 6c 75 29 22 2c 20  essHeap (%lu)", 
c2c0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
c2d0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
c2e0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
c2f0: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62    pWinMemData->b
c300: 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  Owned = FALSE;. 
c310: 20 61 73 73 65 72 74 28 20 21 70 57 69 6e 4d 65   assert( !pWinMe
c320: 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 3b  mData->bOwned );
c330: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
c340: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  ( pWinMemData->h
c350: 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  Heap!=0 );.  ass
c360: 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61  ert( pWinMemData
c370: 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44  ->hHeap!=INVALID
c380: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b  _HANDLE_VALUE );
c390: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
c3a0: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
c3b0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
c3c0: 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20  LLOC_VALIDATE). 
c3d0: 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56   assert( osHeapV
c3e0: 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d 44  alidate(pWinMemD
c3f0: 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49  ata->hHeap, SQLI
c400: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
c410: 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65  AGS, NULL) );.#e
c420: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
c430: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
c440: 2a 20 44 65 69 6e 69 74 69 61 6c 69 7a 65 20 74  * Deinitialize t
c450: 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73  his module..*/.s
c460: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65  tatic void winMe
c470: 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a  mShutdown(void *
c480: 70 41 70 70 44 61 74 61 29 7b 0a 20 20 77 69 6e  pAppData){.  win
c490: 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d  MemData *pWinMem
c4a0: 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61  Data = (winMemDa
c4b0: 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a  ta *)pAppData;..
c4c0: 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61    if( !pWinMemDa
c4d0: 74 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  ta ) return;.  a
c4e0: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
c4f0: 74 61 2d 3e 6d 61 67 69 63 31 3d 3d 57 49 4e 4d  ta->magic1==WINM
c500: 45 4d 5f 4d 41 47 49 43 31 20 29 3b 0a 20 20 61  EM_MAGIC1 );.  a
c510: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
c520: 74 61 2d 3e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d  ta->magic2==WINM
c530: 45 4d 5f 4d 41 47 49 43 32 20 29 3b 0a 0a 20 20  EM_MAGIC2 );..  
c540: 69 66 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  if( pWinMemData-
c550: 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 61 73  >hHeap ){.    as
c560: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
c570: 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  a->hHeap!=INVALI
c580: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
c590: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
c5a0: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
c5b0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
c5c0: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a  ALLOC_VALIDATE).
c5d0: 20 20 20 20 61 73 73 65 72 74 28 20 6f 73 48 65      assert( osHe
c5e0: 61 70 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d  apValidate(pWinM
c5f0: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53  emData->hHeap, S
c600: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
c610: 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b  _FLAGS, NULL) );
c620: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
c630: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77  pWinMemData->bOw
c640: 6e 65 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ned ){.      if(
c650: 20 21 6f 73 48 65 61 70 44 65 73 74 72 6f 79 28   !osHeapDestroy(
c660: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
c670: 61 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ap) ){.        s
c680: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
c690: 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64  E_NOMEM, "failed
c6a0: 20 74 6f 20 48 65 61 70 44 65 73 74 72 6f 79 20   to HeapDestroy 
c6b0: 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c  (%lu), heap=%p",
c6c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c6d0: 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72       osGetLastEr
c6e0: 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 70 57  ror(), (void*)pW
c6f0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
c700: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
c710: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f   pWinMemData->bO
c720: 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  wned = FALSE;.  
c730: 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44    }.    pWinMemD
c740: 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 4e 55 4c  ata->hHeap = NUL
c750: 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  L;.  }.}../*.** 
c760: 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6c 6f 77  Populate the low
c770: 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c  -level memory al
c780: 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  location functio
c790: 6e 20 70 6f 69 6e 74 65 72 73 20 69 6e 0a 2a 2a  n pointers in.**
c7a0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
c7b0: 6e 66 69 67 2e 6d 20 77 69 74 68 20 70 6f 69 6e  nfig.m with poin
c7c0: 74 65 72 73 20 74 6f 20 74 68 65 20 72 6f 75 74  ters to the rout
c7d0: 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69 6c  ines in this fil
c7e0: 65 2e 20 54 68 65 0a 2a 2a 20 61 72 67 75 6d 65  e. The.** argume
c7f0: 6e 74 73 20 73 70 65 63 69 66 79 20 74 68 65 20  nts specify the 
c800: 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20  block of memory 
c810: 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a 0a 2a 2a  to manage..**.**
c820: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
c830: 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20   only called by 
c840: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29  sqlite3_config()
c850: 2c 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 0a  , and therefore.
c860: 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  ** is not requir
c870: 65 64 20 74 6f 20 62 65 20 74 68 72 65 61 64 73  ed to be threads
c880: 61 66 65 20 28 69 74 20 69 73 20 6e 6f 74 29 2e  afe (it is not).
c890: 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65  .*/.const sqlite
c8a0: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73  3_mem_methods *s
c8b0: 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33  qlite3MemGetWin3
c8c0: 32 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  2(void){.  stati
c8d0: 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
c8e0: 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 77 69 6e 4d  mem_methods winM
c8f0: 65 6d 4d 65 74 68 6f 64 73 20 3d 20 7b 0a 20 20  emMethods = {.  
c900: 20 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c 0a    winMemMalloc,.
c910: 20 20 20 20 77 69 6e 4d 65 6d 46 72 65 65 2c 0a      winMemFree,.
c920: 20 20 20 20 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f      winMemReallo
c930: 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 69 7a  c,.    winMemSiz
c940: 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 6f 75  e,.    winMemRou
c950: 6e 64 75 70 2c 0a 20 20 20 20 77 69 6e 4d 65 6d  ndup,.    winMem
c960: 49 6e 69 74 2c 0a 20 20 20 20 77 69 6e 4d 65 6d  Init,.    winMem
c970: 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20 20 26 77  Shutdown,.    &w
c980: 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20 20 7d 3b  in_mem_data.  };
c990: 0a 20 20 72 65 74 75 72 6e 20 26 77 69 6e 4d 65  .  return &winMe
c9a0: 6d 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a 76 6f 69  mMethods;.}..voi
c9b0: 64 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74 44  d sqlite3MemSetD
c9c0: 65 66 61 75 6c 74 28 76 6f 69 64 29 7b 0a 20 20  efault(void){.  
c9d0: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53  sqlite3_config(S
c9e0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c  QLITE_CONFIG_MAL
c9f0: 4c 4f 43 2c 20 73 71 6c 69 74 65 33 4d 65 6d 47  LOC, sqlite3MemG
ca00: 65 74 57 69 6e 33 32 28 29 29 3b 0a 7d 0a 23 65  etWin32());.}.#e
ca10: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57  ndif /* SQLITE_W
ca20: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a  IN32_MALLOC */..
ca30: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
ca40: 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74 6f 20  UTF-8 string to 
ca50: 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64  Microsoft Unicod
ca60: 65 20 28 55 54 46 2d 31 36 3f 29 2e 0a 2a 2a 0a  e (UTF-16?)..**.
ca70: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
ca80: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
ca90: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
caa0: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f   from malloc..*/
cab0: 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52 20 77  .static LPWSTR w
cac0: 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28  inUtf8ToUnicode(
cad0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
cae0: 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 43  ename){.  int nC
caf0: 68 61 72 3b 0a 20 20 4c 50 57 53 54 52 20 7a 57  har;.  LPWSTR zW
cb00: 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20  ideFilename;..  
cb10: 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42  nChar = osMultiB
cb20: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50  yteToWideChar(CP
cb30: 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e  _UTF8, 0, zFilen
cb40: 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30  ame, -1, NULL, 0
cb50: 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d  );.  if( nChar==
cb60: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
cb70: 30 3b 0a 20 20 7d 0a 20 20 7a 57 69 64 65 46 69  0;.  }.  zWideFi
cb80: 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  lename = sqlite3
cb90: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 43 68 61  MallocZero( nCha
cba0: 72 2a 73 69 7a 65 6f 66 28 7a 57 69 64 65 46 69  r*sizeof(zWideFi
cbb0: 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20  lename[0]) );.  
cbc0: 69 66 28 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  if( zWideFilenam
cbd0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
cbe0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 68 61  rn 0;.  }.  nCha
cbf0: 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54  r = osMultiByteT
cc00: 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55 54 46  oWideChar(CP_UTF
cc10: 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  8, 0, zFilename,
cc20: 20 2d 31 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61   -1, zWideFilena
cc30: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
cc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc50: 20 20 20 20 6e 43 68 61 72 29 3b 0a 20 20 69 66      nChar);.  if
cc60: 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20  ( nChar==0 ){.  
cc70: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
cc80: 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  WideFilename);. 
cc90: 20 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65     zWideFilename
cca0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
ccb0: 72 6e 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  rn zWideFilename
ccc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
ccd0: 72 74 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69  rt Microsoft Uni
cce0: 63 6f 64 65 20 74 6f 20 55 54 46 2d 38 2e 20 20  code to UTF-8.  
ccf0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
cd00: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
cd10: 67 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64  g is.** obtained
cd20: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
cd30: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  lloc()..*/.stati
cd40: 63 20 63 68 61 72 20 2a 77 69 6e 55 6e 69 63 6f  c char *winUnico
cd50: 64 65 54 6f 55 74 66 38 28 4c 50 43 57 53 54 52  deToUtf8(LPCWSTR
cd60: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b   zWideFilename){
cd70: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
cd80: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
cd90: 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69  ..  nByte = osWi
cda0: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
cdb0: 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57  e(CP_UTF8, 0, zW
cdc0: 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  ideFilename, -1,
cdd0: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
cde0: 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29  if( nByte == 0 )
cdf0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
ce00: 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20    }.  zFilename 
ce10: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
ce20: 65 72 6f 28 20 6e 42 79 74 65 20 29 3b 0a 20 20  ero( nByte );.  
ce30: 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  if( zFilename==0
ce40: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
ce50: 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
ce60: 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  osWideCharToMult
ce70: 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30  iByte(CP_UTF8, 0
ce80: 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c  , zWideFilename,
ce90: 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20   -1, zFilename, 
cea0: 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20  nByte,.         
ceb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cec0: 20 20 20 20 20 20 20 30 2c 20 30 29 3b 0a 20 20         0, 0);.  
ced0: 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29  if( nByte == 0 )
cee0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
cef0: 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ee(zFilename);. 
cf00: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30     zFilename = 0
cf10: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
cf20: 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
cf30: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 41 4e  ** Convert an AN
cf40: 53 49 20 73 74 72 69 6e 67 20 74 6f 20 4d 69 63  SI string to Mic
cf50: 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 2c 20  rosoft Unicode, 
cf60: 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20  based on the.** 
cf70: 63 75 72 72 65 6e 74 20 63 6f 64 65 70 61 67 65  current codepage
cf80: 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20 66 69   settings for fi
cf90: 6c 65 20 61 70 69 73 2e 0a 2a 2a 0a 2a 2a 20 53  le apis..**.** S
cfa0: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
cfb0: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
cfc0: 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20   is obtained.** 
cfd0: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
cfe0: 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c  loc..*/.static L
cff0: 50 57 53 54 52 20 77 69 6e 4d 62 63 73 54 6f 55  PWSTR winMbcsToU
d000: 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61  nicode(const cha
d010: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
d020: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 4c 50   int nByte;.  LP
d030: 57 53 54 52 20 7a 4d 62 63 73 46 69 6c 65 6e 61  WSTR zMbcsFilena
d040: 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61  me;.  int codepa
d050: 67 65 20 3d 20 6f 73 41 72 65 46 69 6c 65 41 70  ge = osAreFileAp
d060: 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43  isANSI() ? CP_AC
d070: 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20  P : CP_OEMCP;.. 
d080: 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69   nByte = osMulti
d090: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 63  ByteToWideChar(c
d0a0: 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c  odepage, 0, zFil
d0b0: 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c  ename, -1, NULL,
d0c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0e0: 20 30 29 2a 73 69 7a 65 6f 66 28 57 43 48 41 52   0)*sizeof(WCHAR
d0f0: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d  );.  if( nByte==
d100: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
d110: 30 3b 0a 20 20 7d 0a 20 20 7a 4d 62 63 73 46 69  0;.  }.  zMbcsFi
d120: 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  lename = sqlite3
d130: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74  MallocZero( nByt
d140: 65 2a 73 69 7a 65 6f 66 28 7a 4d 62 63 73 46 69  e*sizeof(zMbcsFi
d150: 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20  lename[0]) );.  
d160: 69 66 28 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  if( zMbcsFilenam
d170: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
d180: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  rn 0;.  }.  nByt
d190: 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54  e = osMultiByteT
d1a0: 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65 70 61  oWideChar(codepa
d1b0: 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65  ge, 0, zFilename
d1c0: 2c 20 2d 31 2c 20 7a 4d 62 63 73 46 69 6c 65 6e  , -1, zMbcsFilen
d1d0: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1f0: 20 20 20 20 20 6e 42 79 74 65 29 3b 0a 20 20 69       nByte);.  i
d200: 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20  f( nByte==0 ){. 
d210: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
d220: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 29 3b 0a  zMbcsFilename);.
d230: 20 20 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d      zMbcsFilenam
d240: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
d250: 75 72 6e 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  urn zMbcsFilenam
d260: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  e;.}../*.** Conv
d270: 65 72 74 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e  ert Microsoft Un
d280: 69 63 6f 64 65 20 74 6f 20 6d 75 6c 74 69 2d 62  icode to multi-b
d290: 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74  yte character st
d2a0: 72 69 6e 67 2c 20 62 61 73 65 64 20 6f 6e 20 74  ring, based on t
d2b0: 68 65 0a 2a 2a 20 75 73 65 72 27 73 20 41 4e 53  he.** user's ANS
d2c0: 49 20 63 6f 64 65 70 61 67 65 2e 0a 2a 2a 0a 2a  I codepage..**.*
d2d0: 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
d2e0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
d2f0: 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ing is obtained 
d300: 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  from.** sqlite3_
d310: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61  malloc()..*/.sta
d320: 74 69 63 20 63 68 61 72 20 2a 77 69 6e 55 6e 69  tic char *winUni
d330: 63 6f 64 65 54 6f 4d 62 63 73 28 4c 50 43 57 53  codeToMbcs(LPCWS
d340: 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  TR zWideFilename
d350: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  ){.  int nByte;.
d360: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
d370: 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67  e;.  int codepag
d380: 65 20 3d 20 6f 73 41 72 65 46 69 6c 65 41 70 69  e = osAreFileApi
d390: 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50  sANSI() ? CP_ACP
d3a0: 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20   : CP_OEMCP;..  
d3b0: 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68  nByte = osWideCh
d3c0: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f  arToMultiByte(co
d3d0: 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65  depage, 0, zWide
d3e0: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c  Filename, -1, 0,
d3f0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28   0, 0, 0);.  if(
d400: 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20   nByte == 0 ){. 
d410: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
d420: 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73  .  zFilename = s
d430: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
d440: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  ( nByte );.  if(
d450: 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b   zFilename==0 ){
d460: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
d470: 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57   }.  nByte = osW
d480: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
d490: 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20  te(codepage, 0, 
d4a0: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d  zWideFilename, -
d4b0: 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  1, zFilename,.  
d4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 42                nB
d4e0: 79 74 65 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  yte, 0, 0);.  if
d4f0: 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a  ( nByte == 0 ){.
d500: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
d510: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (zFilename);.   
d520: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a   zFilename = 0;.
d530: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69    }.  return zFi
d540: 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
d550: 20 43 6f 6e 76 65 72 74 20 6d 75 6c 74 69 62 79   Convert multiby
d560: 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72  te character str
d570: 69 6e 67 20 74 6f 20 55 54 46 2d 38 2e 20 20 53  ing to UTF-8.  S
d580: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
d590: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74 72  .** returned str
d5a0: 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ing is obtained 
d5b0: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
d5c0: 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a  loc()..*/.char *
d5d0: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62  sqlite3_win32_mb
d5e0: 63 73 5f 74 6f 5f 75 74 66 38 28 63 6f 6e 73 74  cs_to_utf8(const
d5f0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
d600: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  ){.  char *zFile
d610: 6e 61 6d 65 55 74 66 38 3b 0a 20 20 4c 50 57 53  nameUtf8;.  LPWS
d620: 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20  TR zTmpWide;..  
d630: 7a 54 6d 70 57 69 64 65 20 3d 20 77 69 6e 4d 62  zTmpWide = winMb
d640: 63 73 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c  csToUnicode(zFil
d650: 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54  ename);.  if( zT
d660: 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20  mpWide==0 ){.   
d670: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
d680: 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 20 3d   zFilenameUtf8 =
d690: 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66   winUnicodeToUtf
d6a0: 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 73  8(zTmpWide);.  s
d6b0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70  qlite3_free(zTmp
d6c0: 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Wide);.  return 
d6d0: 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 7d  zFilenameUtf8;.}
d6e0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
d6f0: 55 54 46 2d 38 20 74 6f 20 6d 75 6c 74 69 62 79  UTF-8 to multiby
d700: 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72  te character str
d710: 69 6e 67 2e 20 20 53 70 61 63 65 20 74 6f 20 68  ing.  Space to h
d720: 6f 6c 64 20 74 68 65 0a 2a 2a 20 72 65 74 75 72  old the.** retur
d730: 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62  ned string is ob
d740: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
d750: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  te3_malloc()..*/
d760: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77  .char *sqlite3_w
d770: 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63  in32_utf8_to_mbc
d780: 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  s(const char *zF
d790: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72  ilename){.  char
d7a0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b   *zFilenameMbcs;
d7b0: 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69  .  LPWSTR zTmpWi
d7c0: 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20  de;..  zTmpWide 
d7d0: 3d 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f  = winUtf8ToUnico
d7e0: 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  de(zFilename);. 
d7f0: 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30   if( zTmpWide==0
d800: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
d810: 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d  ;.  }.  zFilenam
d820: 65 4d 62 63 73 20 3d 20 77 69 6e 55 6e 69 63 6f  eMbcs = winUnico
d830: 64 65 54 6f 4d 62 63 73 28 7a 54 6d 70 57 69 64  deToMbcs(zTmpWid
d840: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  e);.  sqlite3_fr
d850: 65 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20  ee(zTmpWide);.  
d860: 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65  return zFilename
d870: 4d 62 63 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Mbcs;.}../*.** T
d880: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74  his function set
d890: 73 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63  s the data direc
d8a0: 74 6f 72 79 20 6f 72 20 74 68 65 20 74 65 6d 70  tory or the temp
d8b0: 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20  orary directory 
d8c0: 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20  based on.** the 
d8d0: 70 72 6f 76 69 64 65 64 20 61 72 67 75 6d 65 6e  provided argumen
d8e0: 74 73 2e 20 20 54 68 65 20 74 79 70 65 20 61 72  ts.  The type ar
d8f0: 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 31  gument must be 1
d900: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 74   in order to set
d910: 20 74 68 65 0a 2a 2a 20 64 61 74 61 20 64 69 72   the.** data dir
d920: 65 63 74 6f 72 79 20 6f 72 20 32 20 69 6e 20 6f  ectory or 2 in o
d930: 72 64 65 72 20 74 6f 20 73 65 74 20 74 68 65 20  rder to set the 
d940: 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
d950: 6f 72 79 2e 20 20 54 68 65 20 7a 56 61 6c 75 65  ory.  The zValue
d960: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20  .** argument is 
d970: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
d980: 64 69 72 65 63 74 6f 72 79 20 74 6f 20 75 73 65  directory to use
d990: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
d9a0: 6c 75 65 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 53  lue will be.** S
d9b0: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
d9c0: 65 73 73 66 75 6c 2e 0a 2a 2f 0a 69 6e 74 20 73  essful..*/.int s
d9d0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
d9e0: 5f 64 69 72 65 63 74 6f 72 79 28 44 57 4f 52 44  _directory(DWORD
d9f0: 20 74 79 70 65 2c 20 4c 50 43 57 53 54 52 20 7a   type, LPCWSTR z
da00: 56 61 6c 75 65 29 7b 0a 20 20 63 68 61 72 20 2a  Value){.  char *
da10: 2a 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20 30  *ppDirectory = 0
da20: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
da30: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20  _OMIT_AUTOINIT. 
da40: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
da50: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a  3_initialize();.
da60: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
da70: 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 69  n rc;.#endif.  i
da80: 66 28 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f  f( type==SQLITE_
da90: 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43  WIN32_DATA_DIREC
daa0: 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a 20 20 20  TORY_TYPE ){.   
dab0: 20 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20 26   ppDirectory = &
dac0: 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
dad0: 65 63 74 6f 72 79 3b 0a 20 20 7d 65 6c 73 65 20  ectory;.  }else 
dae0: 69 66 28 20 74 79 70 65 3d 3d 53 51 4c 49 54 45  if( type==SQLITE
daf0: 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45  _WIN32_TEMP_DIRE
db00: 43 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a 20 20  CTORY_TYPE ){.  
db10: 20 20 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20    ppDirectory = 
db20: 26 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  &sqlite3_temp_di
db30: 72 65 63 74 6f 72 79 3b 0a 20 20 7d 0a 20 20 61  rectory;.  }.  a
db40: 73 73 65 72 74 28 20 21 70 70 44 69 72 65 63 74  ssert( !ppDirect
db50: 6f 72 79 20 7c 7c 20 74 79 70 65 3d 3d 53 51 4c  ory || type==SQL
db60: 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44  ITE_WIN32_DATA_D
db70: 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 20 20  IRECTORY_TYPE.  
db80: 20 20 20 20 20 20 20 20 7c 7c 20 74 79 70 65 3d          || type=
db90: 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45  =SQLITE_WIN32_TE
dba0: 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50  MP_DIRECTORY_TYP
dbb0: 45 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  E.  );.  assert(
dbc0: 20 21 70 70 44 69 72 65 63 74 6f 72 79 20 7c 7c   !ppDirectory ||
dbd0: 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67   sqlite3Memdebug
dbe0: 48 61 73 54 79 70 65 28 2a 70 70 44 69 72 65 63  HasType(*ppDirec
dbf0: 74 6f 72 79 2c 20 4d 45 4d 54 59 50 45 5f 48 45  tory, MEMTYPE_HE
dc00: 41 50 29 20 29 3b 0a 20 20 69 66 28 20 70 70 44  AP) );.  if( ppD
dc10: 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20  irectory ){.    
dc20: 63 68 61 72 20 2a 7a 56 61 6c 75 65 55 74 66 38  char *zValueUtf8
dc30: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 56   = 0;.    if( zV
dc40: 61 6c 75 65 20 26 26 20 7a 56 61 6c 75 65 5b 30  alue && zValue[0
dc50: 5d 20 29 7b 0a 20 20 20 20 20 20 7a 56 61 6c 75  ] ){.      zValu
dc60: 65 55 74 66 38 20 3d 20 77 69 6e 55 6e 69 63 6f  eUtf8 = winUnico
dc70: 64 65 54 6f 55 74 66 38 28 7a 56 61 6c 75 65 29  deToUtf8(zValue)
dc80: 3b 0a 20 20 20 20 20 20 69 66 20 28 20 7a 56 61  ;.      if ( zVa
dc90: 6c 75 65 55 74 66 38 3d 3d 30 20 29 7b 0a 20 20  lueUtf8==0 ){.  
dca0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
dcb0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
dcc0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
dcd0: 69 74 65 33 5f 66 72 65 65 28 2a 70 70 44 69 72  ite3_free(*ppDir
dce0: 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 2a 70 70  ectory);.    *pp
dcf0: 44 69 72 65 63 74 6f 72 79 20 3d 20 7a 56 61 6c  Directory = zVal
dd00: 75 65 55 74 66 38 3b 0a 20 20 20 20 72 65 74 75  ueUtf8;.    retu
dd10: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
dd20: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
dd30: 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a  E_ERROR;.}../*.*
dd40: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
dd50: 75 65 20 6f 66 20 77 69 6e 47 65 74 4c 61 73 74  ue of winGetLast
dd60: 45 72 72 6f 72 4d 73 67 0a 2a 2a 20 69 73 20 7a  ErrorMsg.** is z
dd70: 65 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72  ero if the error
dd80: 20 6d 65 73 73 61 67 65 20 66 69 74 73 20 69 6e   message fits in
dd90: 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f 72 20   the buffer, or 
dda0: 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65  non-zero.** othe
ddb0: 72 77 69 73 65 20 28 69 66 20 74 68 65 20 6d 65  rwise (if the me
ddc0: 73 73 61 67 65 20 77 61 73 20 74 72 75 6e 63 61  ssage was trunca
ddd0: 74 65 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ted)..*/.static 
dde0: 69 6e 74 20 77 69 6e 47 65 74 4c 61 73 74 45 72  int winGetLastEr
ddf0: 72 6f 72 4d 73 67 28 44 57 4f 52 44 20 6c 61 73  rorMsg(DWORD las
de00: 74 45 72 72 6e 6f 2c 20 69 6e 74 20 6e 42 75 66  tErrno, int nBuf
de10: 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
de20: 20 2f 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 67   /* FormatMessag
de30: 65 20 72 65 74 75 72 6e 73 20 30 20 6f 6e 20 66  e returns 0 on f
de40: 61 69 6c 75 72 65 2e 20 20 4f 74 68 65 72 77 69  ailure.  Otherwi
de50: 73 65 20 69 74 0a 20 20 2a 2a 20 72 65 74 75 72  se it.  ** retur
de60: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
de70: 20 54 43 48 41 52 73 20 77 72 69 74 74 65 6e 20   TCHARs written 
de80: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20  to the output.  
de90: 2a 2a 20 62 75 66 66 65 72 2c 20 65 78 63 6c 75  ** buffer, exclu
dea0: 64 69 6e 67 20 74 68 65 20 74 65 72 6d 69 6e 61  ding the termina
deb0: 74 69 6e 67 20 6e 75 6c 6c 20 63 68 61 72 2e 0a  ting null char..
dec0: 20 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 4c    */.  DWORD dwL
ded0: 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  en = 0;.  char *
dee0: 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28  zOut = 0;..  if(
def0: 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66   osIsNT() ){.#if
df00: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
df10: 0a 20 20 20 20 57 43 48 41 52 20 7a 54 65 6d 70  .    WCHAR zTemp
df20: 57 69 64 65 5b 53 51 4c 49 54 45 5f 57 49 4e 33  Wide[SQLITE_WIN3
df30: 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41  2_MAX_ERRMSG_CHA
df40: 52 53 2b 31 5d 3b 0a 20 20 20 20 64 77 4c 65 6e  RS+1];.    dwLen
df50: 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61   = osFormatMessa
df60: 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41  geW(FORMAT_MESSA
df70: 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c  GE_FROM_SYSTEM |
df80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
df90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f                FO
dfa0: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e  RMAT_MESSAGE_IGN
dfb0: 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20  ORE_INSERTS,.   
dfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfd0: 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a            NULL,.
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 73               las
e000: 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
e010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e020: 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20       0,.        
e030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e040: 20 20 20 20 20 7a 54 65 6d 70 57 69 64 65 2c 0a       zTempWide,.
e050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e060: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
e070: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52  ITE_WIN32_MAX_ER
e080: 52 4d 53 47 5f 43 48 41 52 53 2c 0a 20 20 20 20  RMSG_CHARS,.    
e090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0a0: 20 20 20 20 20 20 20 20 20 30 29 3b 0a 23 65 6c           0);.#el
e0b0: 73 65 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54  se.    LPWSTR zT
e0c0: 65 6d 70 57 69 64 65 20 3d 20 4e 55 4c 4c 3b 0a  empWide = NULL;.
e0d0: 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f      dwLen = osFo
e0e0: 72 6d 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52  rmatMessageW(FOR
e0f0: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f  MAT_MESSAGE_ALLO
e100: 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20  CATE_BUFFER |.  
e110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e120: 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41             FORMA
e130: 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53  T_MESSAGE_FROM_S
e140: 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20  YSTEM |.        
e150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e160: 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53       FORMAT_MESS
e170: 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52  AGE_IGNORE_INSER
e180: 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TS,.            
e190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1a0: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
e1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1c0: 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20      lastErrno,. 
e1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1e0: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20              0,. 
e1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e200: 20 20 20 20 20 20 20 20 20 20 20 20 28 4c 50 57              (LPW
e210: 53 54 52 29 20 26 7a 54 65 6d 70 57 69 64 65 2c  STR) &zTempWide,
e220: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
e240: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29                0)
e260: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
e270: 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20   dwLen > 0 ){.  
e280: 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20      /* allocate 
e290: 61 20 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e  a buffer and con
e2a0: 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a  vert to UTF8 */.
e2b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
e2c0: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
e2d0: 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 77  ;.      zOut = w
e2e0: 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  inUnicodeToUtf8(
e2f0: 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20 20 20 20  zTempWide);.    
e300: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
e310: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23 69 66 20  gnMalloc();.#if 
e320: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
e330: 0a 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74  .      /* free t
e340: 68 65 20 73 79 73 74 65 6d 20 62 75 66 66 65 72  he system buffer
e350: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f   allocated by Fo
e360: 72 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20  rmatMessage */. 
e370: 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65       osLocalFree
e380: 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 23 65 6e  (zTempWide);.#en
e390: 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69  dif.    }.  }.#i
e3a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
e3b0: 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
e3c0: 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65  e{.    char *zTe
e3d0: 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64  mp = NULL;.    d
e3e0: 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d  wLen = osFormatM
e3f0: 65 73 73 61 67 65 41 28 46 4f 52 4d 41 54 5f 4d  essageA(FORMAT_M
e400: 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f  ESSAGE_ALLOCATE_
e410: 42 55 46 46 45 52 20 7c 0a 20 20 20 20 20 20 20  BUFFER |.       
e420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e430: 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53        FORMAT_MES
e440: 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d  SAGE_FROM_SYSTEM
e450: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
e460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e470: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49  FORMAT_MESSAGE_I
e480: 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20  GNORE_INSERTS,. 
e490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4a0: 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
e4b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
e4d0: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
e4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4f0: 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20         0,.      
e500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e510: 20 20 20 20 20 20 20 28 4c 50 53 54 52 29 20 26         (LPSTR) &
e520: 7a 54 65 6d 70 2c 0a 20 20 20 20 20 20 20 20 20  zTemp,.         
e530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e540: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
e550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e560: 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20      0);.    if( 
e570: 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20  dwLen > 0 ){.   
e580: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61     /* allocate a
e590: 20 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e 76   buffer and conv
e5a0: 65 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20  ert to UTF8 */. 
e5b0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
e5c0: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
e5d0: 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 73 71  .      zOut = sq
e5e0: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73  lite3_win32_mbcs
e5f0: 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b  _to_utf8(zTemp);
e600: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e  .      sqlite3En
e610: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
e620: 0a 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74  .      /* free t
e630: 68 65 20 73 79 73 74 65 6d 20 62 75 66 66 65 72  he system buffer
e640: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f   allocated by Fo
e650: 72 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20  rmatMessage */. 
e660: 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65       osLocalFree
e670: 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 7d 0a 20  (zTemp);.    }. 
e680: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
e690: 30 20 3d 3d 20 64 77 4c 65 6e 20 29 7b 0a 20 20  0 == dwLen ){.  
e6a0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
e6b0: 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22  tf(nBuf, zBuf, "
e6c0: 4f 73 45 72 72 6f 72 20 30 78 25 6c 78 20 28 25  OsError 0x%lx (%
e6d0: 6c 75 29 22 2c 20 6c 61 73 74 45 72 72 6e 6f 2c  lu)", lastErrno,
e6e0: 20 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 20 20 7d   lastErrno);.  }
e6f0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 63 6f 70  else{.    /* cop
e700: 79 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6e  y a maximum of n
e710: 42 75 66 20 63 68 61 72 73 20 74 6f 20 6f 75 74  Buf chars to out
e720: 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  put buffer */.  
e730: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
e740: 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22  tf(nBuf, zBuf, "
e750: 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20  %s", zOut);.    
e760: 2f 2a 20 66 72 65 65 20 74 68 65 20 55 54 46 38  /* free the UTF8
e770: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 73   buffer */.    s
e780: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74  qlite3_free(zOut
e790: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
e7a0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54  0;.}../*.**.** T
e7b0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20 77  his function - w
e7c0: 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  inLogErrorAtLine
e7d0: 28 29 20 2d 20 69 73 20 6f 6e 6c 79 20 65 76 65  () - is only eve
e7e0: 72 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65  r called via the
e7f0: 20 6d 61 63 72 6f 0a 2a 2a 20 77 69 6e 4c 6f 67   macro.** winLog
e800: 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  Error()..**.** T
e810: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69  his routine is i
e820: 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e 20  nvoked after an 
e830: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
e840: 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 2e 0a  an OS function..
e850: 2a 2a 20 49 74 20 6c 6f 67 73 20 61 20 6d 65 73  ** It logs a mes
e860: 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74  sage using sqlit
e870: 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e  e3_log() contain
e880: 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
e890: 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6f  value of.** erro
e8a0: 72 20 63 6f 64 65 20 61 6e 64 2c 20 69 66 20 70  r code and, if p
e8b0: 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68 75 6d  ossible, the hum
e8c0: 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71 75 69  an-readable equi
e8d0: 76 61 6c 65 6e 74 20 66 72 6f 6d 0a 2a 2a 20 46  valent from.** F
e8e0: 6f 72 6d 61 74 4d 65 73 73 61 67 65 2e 0a 2a 2a  ormatMessage..**
e8f0: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
e900: 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
e910: 20 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c   the macro shoul
e920: 64 20 62 65 20 74 68 65 20 65 72 72 6f 72 20 63  d be the error c
e930: 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c  ode that.** will
e940: 20 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20   be returned to 
e950: 53 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c  SQLite (e.g. SQL
e960: 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
e970: 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  , SQLITE_CANTOPE
e980: 4e 29 2e 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73  N)..** The two s
e990: 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65  ubsequent argume
e9a0: 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68  nts should be th
e9b0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f 53  e name of the OS
e9c0: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a   function that.*
e9d0: 2a 20 66 61 69 6c 65 64 20 61 6e 64 20 74 68 65  * failed and the
e9e0: 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65   associated file
e9f0: 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 20 69 66  -system path, if
ea00: 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65   any..*/.#define
ea10: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 61 2c 62   winLogError(a,b
ea20: 2c 63 2c 64 29 20 20 20 77 69 6e 4c 6f 67 45 72  ,c,d)   winLogEr
ea30: 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c  rorAtLine(a,b,c,
ea40: 64 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74  d,__LINE__).stat
ea50: 69 63 20 69 6e 74 20 77 69 6e 4c 6f 67 45 72 72  ic int winLogErr
ea60: 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20  orAtLine(.  int 
ea70: 65 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20 20  errcode,        
ea80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
ea90: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
eaa0: 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74   */.  DWORD last
eab0: 45 72 72 6e 6f 2c 20 20 20 20 20 20 20 20 20 20  Errno,          
eac0: 20 20 20 20 20 20 2f 2a 20 57 69 6e 33 32 20 6c        /* Win32 l
ead0: 61 73 74 20 65 72 72 6f 72 20 2a 2f 0a 20 20 63  ast error */.  c
eae0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
eaf0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
eb00: 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e  * Name of OS fun
eb10: 63 74 69 6f 6e 20 74 68 61 74 20 66 61 69 6c 65  ction that faile
eb20: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
eb30: 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
eb40: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 70         /* File p
eb50: 61 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 77  ath associated w
eb60: 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69  ith error */.  i
eb70: 6e 74 20 69 4c 69 6e 65 20 20 20 20 20 20 20 20  nt iLine        
eb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
eb90: 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75  * Source line nu
eba0: 6d 62 65 72 20 77 68 65 72 65 20 65 72 72 6f 72  mber where error
ebb0: 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a   occurred */.){.
ebc0: 20 20 63 68 61 72 20 7a 4d 73 67 5b 35 30 30 5d    char zMsg[500]
ebd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ebe0: 20 20 2f 2a 20 48 75 6d 61 6e 20 72 65 61 64 61    /* Human reada
ebf0: 62 6c 65 20 65 72 72 6f 72 20 74 65 78 74 20 2a  ble error text *
ec00: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
ec10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec20: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
ec30: 74 65 72 20 2a 2f 0a 0a 20 20 7a 4d 73 67 5b 30  ter */..  zMsg[0
ec40: 5d 20 3d 20 30 3b 0a 20 20 77 69 6e 47 65 74 4c  ] = 0;.  winGetL
ec50: 61 73 74 45 72 72 6f 72 4d 73 67 28 6c 61 73 74  astErrorMsg(last
ec60: 45 72 72 6e 6f 2c 20 73 69 7a 65 6f 66 28 7a 4d  Errno, sizeof(zM
ec70: 73 67 29 2c 20 7a 4d 73 67 29 3b 0a 20 20 61 73  sg), zMsg);.  as
ec80: 73 65 72 74 28 20 65 72 72 63 6f 64 65 21 3d 53  sert( errcode!=S
ec90: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66  QLITE_OK );.  if
eca0: 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61  ( zPath==0 ) zPa
ecb0: 74 68 20 3d 20 22 22 3b 0a 20 20 66 6f 72 28 69  th = "";.  for(i
ecc0: 3d 30 3b 20 7a 4d 73 67 5b 69 5d 20 26 26 20 7a  =0; zMsg[i] && z
ecd0: 4d 73 67 5b 69 5d 21 3d 27 5c 72 27 20 26 26 20  Msg[i]!='\r' && 
ece0: 7a 4d 73 67 5b 69 5d 21 3d 27 5c 6e 27 3b 20 69  zMsg[i]!='\n'; i
ecf0: 2b 2b 29 7b 7d 0a 20 20 7a 4d 73 67 5b 69 5d 20  ++){}.  zMsg[i] 
ed00: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c  = 0;.  sqlite3_l
ed10: 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20 20  og(errcode,.    
ed20: 20 20 22 6f 73 5f 77 69 6e 2e 63 3a 25 64 3a 20    "os_win.c:%d: 
ed30: 28 25 6c 75 29 20 25 73 28 25 73 29 20 2d 20 25  (%lu) %s(%s) - %
ed40: 73 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c  s",.      iLine,
ed50: 20 6c 61 73 74 45 72 72 6e 6f 2c 20 7a 46 75 6e   lastErrno, zFun
ed60: 63 2c 20 7a 50 61 74 68 2c 20 7a 4d 73 67 0a 20  c, zPath, zMsg. 
ed70: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72   );..  return er
ed80: 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rcode;.}../*.** 
ed90: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69  The number of ti
eda0: 6d 65 73 20 74 68 61 74 20 61 20 52 65 61 64 46  mes that a ReadF
edb0: 69 6c 65 28 29 2c 20 57 72 69 74 65 46 69 6c 65  ile(), WriteFile
edc0: 28 29 2c 20 61 6e 64 20 44 65 6c 65 74 65 46 69  (), and DeleteFi
edd0: 6c 65 28 29 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  le().** will be 
ede0: 72 65 74 72 69 65 64 20 66 6f 6c 6c 6f 77 69 6e  retried followin
edf0: 67 20 61 20 6c 6f 63 6b 69 6e 67 20 65 72 72 6f  g a locking erro
ee00: 72 20 2d 20 70 72 6f 62 61 62 6c 79 20 63 61 75  r - probably cau
ee10: 73 65 64 20 62 79 0a 2a 2a 20 61 6e 74 69 76 69  sed by.** antivi
ee20: 72 75 73 20 73 6f 66 74 77 61 72 65 2e 20 20 41  rus software.  A
ee30: 6c 73 6f 20 74 68 65 20 69 6e 69 74 69 61 6c 20  lso the initial 
ee40: 64 65 6c 61 79 20 62 65 66 6f 72 65 20 74 68 65  delay before the
ee50: 20 66 69 72 73 74 20 72 65 74 72 79 2e 0a 2a 2a   first retry..**
ee60: 20 54 68 65 20 64 65 6c 61 79 20 69 6e 63 72 65   The delay incre
ee70: 61 73 65 73 20 6c 69 6e 65 61 72 6c 79 20 77 69  ases linearly wi
ee80: 74 68 20 65 61 63 68 20 72 65 74 72 79 2e 0a 2a  th each retry..*
ee90: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
eea0: 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54  _WIN32_IOERR_RET
eeb0: 52 59 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  RY.# define SQLI
eec0: 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52  TE_WIN32_IOERR_R
eed0: 45 54 52 59 20 31 30 0a 23 65 6e 64 69 66 0a 23  ETRY 10.#endif.#
eee0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
eef0: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f  N32_IOERR_RETRY_
ef00: 44 45 4c 41 59 0a 23 20 64 65 66 69 6e 65 20 53  DELAY.# define S
ef10: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
ef20: 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 20 32 35  R_RETRY_DELAY 25
ef30: 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 69  .#endif.static i
ef40: 6e 74 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79  nt winIoerrRetry
ef50: 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f   = SQLITE_WIN32_
ef60: 49 4f 45 52 52 5f 52 45 54 52 59 3b 0a 73 74 61  IOERR_RETRY;.sta
ef70: 74 69 63 20 69 6e 74 20 77 69 6e 49 6f 65 72 72  tic int winIoerr
ef80: 52 65 74 72 79 44 65 6c 61 79 20 3d 20 53 51 4c  RetryDelay = SQL
ef90: 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f  ITE_WIN32_IOERR_
efa0: 52 45 54 52 59 5f 44 45 4c 41 59 3b 0a 0a 2f 2a  RETRY_DELAY;../*
efb0: 0a 2a 2a 20 54 68 65 20 22 77 69 6e 49 6f 65 72  .** The "winIoer
efc0: 72 43 61 6e 52 65 74 72 79 31 22 20 6d 61 63 72  rCanRetry1" macr
efd0: 6f 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  o is used to det
efe0: 65 72 6d 69 6e 65 20 69 66 20 61 20 70 61 72 74  ermine if a part
eff0: 69 63 75 6c 61 72 20 49 2f 4f 0a 2a 2a 20 65 72  icular I/O.** er
f000: 72 6f 72 20 63 6f 64 65 20 6f 62 74 61 69 6e 65  ror code obtaine
f010: 64 20 76 69 61 20 47 65 74 4c 61 73 74 45 72 72  d via GetLastErr
f020: 6f 72 28 29 20 69 73 20 65 6c 69 67 69 62 6c 65  or() is eligible
f030: 20 74 6f 20 62 65 20 72 65 74 72 69 65 64 2e 20   to be retried. 
f040: 20 49 74 0a 2a 2a 20 6d 75 73 74 20 61 63 63 65   It.** must acce
f050: 70 74 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  pt the error cod
f060: 65 20 44 57 4f 52 44 20 61 73 20 69 74 73 20 6f  e DWORD as its o
f070: 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 61 6e 64  nly argument and
f080: 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 0a 2a   should return.*
f090: 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  * non-zero if th
f0a0: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
f0b0: 74 72 61 6e 73 69 65 6e 74 20 69 6e 20 6e 61 74  transient in nat
f0c0: 75 72 65 20 61 6e 64 20 74 68 65 20 6f 70 65 72  ure and the oper
f0d0: 61 74 69 6f 6e 0a 2a 2a 20 72 65 73 70 6f 6e 73  ation.** respons
f0e0: 69 62 6c 65 20 66 6f 72 20 67 65 6e 65 72 61 74  ible for generat
f0f0: 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ing the original
f100: 20 65 72 72 6f 72 20 6d 69 67 68 74 20 73 75 63   error might suc
f110: 63 65 65 64 20 75 70 6f 6e 20 62 65 69 6e 67 0a  ceed upon being.
f120: 2a 2a 20 72 65 74 72 69 65 64 2e 20 20 54 68 65  ** retried.  The
f130: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
f140: 73 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62  s macro should b
f150: 65 20 61 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2a  e a variable..**
f160: 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79  .** Additionally
f170: 2c 20 61 20 6d 61 63 72 6f 20 6e 61 6d 65 64 20  , a macro named 
f180: 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72  "winIoerrCanRetr
f190: 79 32 22 20 6d 61 79 20 62 65 20 64 65 66 69 6e  y2" may be defin
f1a0: 65 64 2e 20 20 49 66 20 69 74 0a 2a 2a 20 69 73  ed.  If it.** is
f1b0: 20 64 65 66 69 6e 65 64 2c 20 69 74 20 77 69 6c   defined, it wil
f1c0: 6c 20 62 65 20 63 6f 6e 73 75 6c 74 65 64 20 6f  l be consulted o
f1d0: 6e 6c 79 20 77 68 65 6e 20 74 68 65 20 6d 61 63  nly when the mac
f1e0: 72 6f 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52  ro "winIoerrCanR
f1f0: 65 74 72 79 31 22 0a 2a 2a 20 72 65 74 75 72 6e  etry1".** return
f200: 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 22 77 69  s zero.  The "wi
f210: 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32 22  nIoerrCanRetry2"
f220: 20 6d 61 63 72 6f 20 69 73 20 63 6f 6d 70 6c 65   macro is comple
f230: 74 65 6c 79 20 6f 70 74 69 6f 6e 61 6c 20 61 6e  tely optional an
f240: 64 0a 2a 2a 20 6d 61 79 20 62 65 20 75 73 65 64  d.** may be used
f250: 20 74 6f 20 69 6e 63 6c 75 64 65 20 61 64 64 69   to include addi
f260: 74 69 6f 6e 61 6c 20 65 72 72 6f 72 20 63 6f 64  tional error cod
f270: 65 73 20 69 6e 20 74 68 65 20 73 65 74 20 74 68  es in the set th
f280: 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 72 65 73  at should.** res
f290: 75 6c 74 20 69 6e 20 74 68 65 20 66 61 69 6c 69  ult in the faili
f2a0: 6e 67 20 49 2f 4f 20 6f 70 65 72 61 74 69 6f 6e  ng I/O operation
f2b0: 20 62 65 69 6e 67 20 72 65 74 72 69 65 64 20 62   being retried b
f2c0: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 20 49  y the caller.  I
f2d0: 66 0a 2a 2a 20 64 65 66 69 6e 65 64 2c 20 74 68  f.** defined, th
f2e0: 65 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65  e "winIoerrCanRe
f2f0: 74 72 79 32 22 20 6d 61 63 72 6f 20 6d 75 73 74  try2" macro must
f300: 20 65 78 68 69 62 69 74 20 65 78 74 65 72 6e 61   exhibit externa
f310: 6c 20 73 65 6d 61 6e 74 69 63 73 0a 2a 2a 20 69  l semantics.** i
f320: 64 65 6e 74 69 63 61 6c 20 74 6f 20 74 68 6f 73  dentical to thos
f330: 65 20 6f 66 20 74 68 65 20 22 77 69 6e 49 6f 65  e of the "winIoe
f340: 72 72 43 61 6e 52 65 74 72 79 31 22 20 6d 61 63  rrCanRetry1" mac
f350: 72 6f 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  ro..*/.#if !defi
f360: 6e 65 64 28 77 69 6e 49 6f 65 72 72 43 61 6e 52  ned(winIoerrCanR
f370: 65 74 72 79 31 29 0a 23 64 65 66 69 6e 65 20 77  etry1).#define w
f380: 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31  inIoerrCanRetry1
f390: 28 61 29 20 28 28 28 61 29 3d 3d 45 52 52 4f 52  (a) (((a)==ERROR
f3a0: 5f 41 43 43 45 53 53 5f 44 45 4e 49 45 44 29 20  _ACCESS_DENIED) 
f3b0: 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20         || \.    
f3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3d0: 20 20 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d            ((a)==
f3e0: 45 52 52 4f 52 5f 53 48 41 52 49 4e 47 5f 56 49  ERROR_SHARING_VI
f3f0: 4f 4c 41 54 49 4f 4e 29 20 20 20 20 7c 7c 20 5c  OLATION)    || \
f400: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
f420: 28 61 29 3d 3d 45 52 52 4f 52 5f 4c 4f 43 4b 5f  (a)==ERROR_LOCK_
f430: 56 49 4f 4c 41 54 49 4f 4e 29 20 20 20 20 20 20  VIOLATION)      
f440: 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20   || \.          
f450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f460: 20 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f      ((a)==ERROR_
f470: 44 45 56 5f 4e 4f 54 5f 45 58 49 53 54 29 20 20  DEV_NOT_EXIST)  
f480: 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20        || \.     
f490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4a0: 20 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45           ((a)==E
f4b0: 52 52 4f 52 5f 4e 45 54 4e 41 4d 45 5f 44 45 4c  RROR_NETNAME_DEL
f4c0: 45 54 45 44 29 20 20 20 20 20 20 7c 7c 20 5c 0a  ETED)      || \.
f4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
f4f0: 61 29 3d 3d 45 52 52 4f 52 5f 53 45 4d 5f 54 49  a)==ERROR_SEM_TI
f500: 4d 45 4f 55 54 29 20 20 20 20 20 20 20 20 20 20  MEOUT)          
f510: 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  || \.           
f520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f530: 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 4e     ((a)==ERROR_N
f540: 45 54 57 4f 52 4b 5f 55 4e 52 45 41 43 48 41 42  ETWORK_UNREACHAB
f550: 4c 45 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  LE)).#endif../*.
f560: 2a 2a 20 49 66 20 61 20 52 65 61 64 46 69 6c 65  ** If a ReadFile
f570: 28 29 20 6f 72 20 57 72 69 74 65 46 69 6c 65 28  () or WriteFile(
f580: 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  ) error occurs, 
f590: 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74  invoke this rout
f5a0: 69 6e 65 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66  ine.** to see if
f5b0: 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 72 65   it should be re
f5c0: 74 72 69 65 64 2e 20 20 52 65 74 75 72 6e 20 54  tried.  Return T
f5d0: 52 55 45 20 74 6f 20 72 65 74 72 79 2e 20 20 52  RUE to retry.  R
f5e0: 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 74  eturn FALSE.** t
f5f0: 6f 20 67 69 76 65 20 75 70 20 77 69 74 68 20 61  o give up with a
f600: 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  n error..*/.stat
f610: 69 63 20 69 6e 74 20 77 69 6e 52 65 74 72 79 49  ic int winRetryI
f620: 6f 65 72 72 28 69 6e 74 20 2a 70 6e 52 65 74 72  oerr(int *pnRetr
f630: 79 2c 20 44 57 4f 52 44 20 2a 70 45 72 72 6f 72  y, DWORD *pError
f640: 29 7b 0a 20 20 44 57 4f 52 44 20 65 20 3d 20 6f  ){.  DWORD e = o
f650: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
f660: 0a 20 20 69 66 28 20 2a 70 6e 52 65 74 72 79 3e  .  if( *pnRetry>
f670: 3d 77 69 6e 49 6f 65 72 72 52 65 74 72 79 20 29  =winIoerrRetry )
f680: 7b 0a 20 20 20 20 69 66 28 20 70 45 72 72 6f 72  {.    if( pError
f690: 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 72 72 6f   ){.      *pErro
f6a0: 72 20 3d 20 65 3b 0a 20 20 20 20 7d 0a 20 20 20  r = e;.    }.   
f6b0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
f6c0: 20 69 66 28 20 77 69 6e 49 6f 65 72 72 43 61 6e   if( winIoerrCan
f6d0: 52 65 74 72 79 31 28 65 29 20 29 7b 0a 20 20 20  Retry1(e) ){.   
f6e0: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
f6f0: 6c 65 65 70 28 77 69 6e 49 6f 65 72 72 52 65 74  leep(winIoerrRet
f700: 72 79 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65  ryDelay*(1+*pnRe
f710: 74 72 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e  try));.    ++*pn
f720: 52 65 74 72 79 3b 0a 20 20 20 20 72 65 74 75 72  Retry;.    retur
f730: 6e 20 31 3b 0a 20 20 7d 0a 23 69 66 20 64 65 66  n 1;.  }.#if def
f740: 69 6e 65 64 28 77 69 6e 49 6f 65 72 72 43 61 6e  ined(winIoerrCan
f750: 52 65 74 72 79 32 29 0a 20 20 65 6c 73 65 20 69  Retry2).  else i
f760: 66 28 20 77 69 6e 49 6f 65 72 72 43 61 6e 52 65  f( winIoerrCanRe
f770: 74 72 79 32 28 65 29 20 29 7b 0a 20 20 20 20 73  try2(e) ){.    s
f780: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
f790: 65 70 28 77 69 6e 49 6f 65 72 72 52 65 74 72 79  ep(winIoerrRetry
f7a0: 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72  Delay*(1+*pnRetr
f7b0: 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 65  y));.    ++*pnRe
f7c0: 74 72 79 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  try;.    return 
f7d0: 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  1;.  }.#endif.  
f7e0: 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20  if( pError ){.  
f7f0: 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20    *pError = e;. 
f800: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
f810: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 67 20 61 20 49 2f  ../*.** Log a I/
f820: 4f 20 65 72 72 6f 72 20 72 65 74 72 79 20 65 70  O error retry ep
f830: 69 73 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  isode..*/.static
f840: 20 76 6f 69 64 20 77 69 6e 4c 6f 67 49 6f 65 72   void winLogIoer
f850: 72 28 69 6e 74 20 6e 52 65 74 72 79 2c 20 69 6e  r(int nRetry, in
f860: 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66 28  t lineno){.  if(
f870: 20 6e 52 65 74 72 79 20 29 7b 0a 20 20 20 20 73   nRetry ){.    s
f880: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
f890: 45 5f 49 4f 45 52 52 2c 0a 20 20 20 20 20 20 22  E_IOERR,.      "
f8a0: 64 65 6c 61 79 65 64 20 25 64 6d 73 20 66 6f 72  delayed %dms for
f8b0: 20 6c 6f 63 6b 2f 73 68 61 72 69 6e 67 20 63 6f   lock/sharing co
f8c0: 6e 66 6c 69 63 74 20 61 74 20 6c 69 6e 65 20 25  nflict at line %
f8d0: 64 22 2c 0a 20 20 20 20 20 20 77 69 6e 49 6f 65  d",.      winIoe
f8e0: 72 72 52 65 74 72 79 44 65 6c 61 79 2a 6e 52 65  rrRetryDelay*nRe
f8f0: 74 72 79 2a 28 6e 52 65 74 72 79 2b 31 29 2f 32  try*(nRetry+1)/2
f900: 2c 20 6c 69 6e 65 6e 6f 0a 20 20 20 20 29 3b 0a  , lineno.    );.
f910: 20 20 7d 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54    }.}..#if SQLIT
f920: 45 5f 4f 53 5f 57 49 4e 43 45 0a 2f 2a 2a 2a 2a  E_OS_WINCE./****
f930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f970: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 65  *****.** This se
f980: 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 63  ction contains c
f990: 6f 64 65 20 66 6f 72 20 57 69 6e 43 45 20 6f 6e  ode for WinCE on
f9a0: 6c 79 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  ly..*/.#if !defi
f9b0: 6e 65 64 28 53 51 4c 49 54 45 5f 4d 53 56 43 5f  ned(SQLITE_MSVC_
f9c0: 4c 4f 43 41 4c 54 49 4d 45 5f 41 50 49 29 20 7c  LOCALTIME_API) |
f9d0: 7c 20 21 53 51 4c 49 54 45 5f 4d 53 56 43 5f 4c  | !SQLITE_MSVC_L
f9e0: 4f 43 41 4c 54 49 4d 45 5f 41 50 49 0a 2f 2a 0a  OCALTIME_API./*.
f9f0: 2a 2a 20 54 68 65 20 4d 53 56 43 20 43 52 54 20  ** The MSVC CRT 
fa00: 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 20 6d 61  on Windows CE ma
fa10: 79 20 6e 6f 74 20 68 61 76 65 20 61 20 6c 6f 63  y not have a loc
fa20: 61 6c 74 69 6d 65 28 29 20 66 75 6e 63 74 69 6f  altime() functio
fa30: 6e 2e 20 20 53 6f 0a 2a 2a 20 63 72 65 61 74 65  n.  So.** create
fa40: 20 61 20 73 75 62 73 74 69 74 75 74 65 2e 0a 2a   a substitute..*
fa50: 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65  /.#include <time
fa60: 2e 68 3e 0a 73 74 72 75 63 74 20 74 6d 20 2a 5f  .h>.struct tm *_
fa70: 5f 63 64 65 63 6c 20 6c 6f 63 61 6c 74 69 6d 65  _cdecl localtime
fa80: 28 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20 2a 74  (const time_t *t
fa90: 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72  ).{.  static str
faa0: 75 63 74 20 74 6d 20 79 3b 0a 20 20 46 49 4c 45  uct tm y;.  FILE
fab0: 54 49 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b 0a 20  TIME uTm, lTm;. 
fac0: 20 53 59 53 54 45 4d 54 49 4d 45 20 70 54 6d 3b   SYSTEMTIME pTm;
fad0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
fae0: 20 74 36 34 3b 0a 20 20 74 36 34 20 3d 20 2a 74   t64;.  t64 = *t
faf0: 3b 0a 20 20 74 36 34 20 3d 20 28 74 36 34 20 2b  ;.  t64 = (t64 +
fb00: 20 31 31 36 34 34 34 37 33 36 30 30 29 2a 31 30   11644473600)*10
fb10: 30 30 30 30 30 30 3b 0a 20 20 75 54 6d 2e 64 77  000000;.  uTm.dw
fb20: 4c 6f 77 44 61 74 65 54 69 6d 65 20 3d 20 28 44  LowDateTime = (D
fb30: 57 4f 52 44 29 28 74 36 34 20 26 20 30 78 46 46  WORD)(t64 & 0xFF
fb40: 46 46 46 46 46 46 29 3b 0a 20 20 75 54 6d 2e 64  FFFFFF);.  uTm.d
fb50: 77 48 69 67 68 44 61 74 65 54 69 6d 65 3d 20 28  wHighDateTime= (
fb60: 44 57 4f 52 44 29 28 74 36 34 20 3e 3e 20 33 32  DWORD)(t64 >> 32
fb70: 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65 54  );.  osFileTimeT
fb80: 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 28 26  oLocalFileTime(&
fb90: 75 54 6d 2c 26 6c 54 6d 29 3b 0a 20 20 6f 73 46  uTm,&lTm);.  osF
fba0: 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54  ileTimeToSystemT
fbb0: 69 6d 65 28 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a  ime(&lTm,&pTm);.
fbc0: 20 20 79 2e 74 6d 5f 79 65 61 72 20 3d 20 70 54    y.tm_year = pT
fbd0: 6d 2e 77 59 65 61 72 20 2d 20 31 39 30 30 3b 0a  m.wYear - 1900;.
fbe0: 20 20 79 2e 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d    y.tm_mon = pTm
fbf0: 2e 77 4d 6f 6e 74 68 20 2d 20 31 3b 0a 20 20 79  .wMonth - 1;.  y
fc00: 2e 74 6d 5f 77 64 61 79 20 3d 20 70 54 6d 2e 77  .tm_wday = pTm.w
fc10: 44 61 79 4f 66 57 65 65 6b 3b 0a 20 20 79 2e 74  DayOfWeek;.  y.t
fc20: 6d 5f 6d 64 61 79 20 3d 20 70 54 6d 2e 77 44 61  m_mday = pTm.wDa
fc30: 79 3b 0a 20 20 79 2e 74 6d 5f 68 6f 75 72 20 3d  y;.  y.tm_hour =
fc40: 20 70 54 6d 2e 77 48 6f 75 72 3b 0a 20 20 79 2e   pTm.wHour;.  y.
fc50: 74 6d 5f 6d 69 6e 20 3d 20 70 54 6d 2e 77 4d 69  tm_min = pTm.wMi
fc60: 6e 75 74 65 3b 0a 20 20 79 2e 74 6d 5f 73 65 63  nute;.  y.tm_sec
fc70: 20 3d 20 70 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a   = pTm.wSecond;.
fc80: 20 20 72 65 74 75 72 6e 20 26 79 3b 0a 7d 0a 23    return &y;.}.#
fc90: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 48  endif..#define H
fca0: 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45  ANDLE_TO_WINFILE
fcb0: 28 61 29 20 28 77 69 6e 46 69 6c 65 2a 29 26 28  (a) (winFile*)&(
fcc0: 28 63 68 61 72 2a 29 61 29 5b 2d 28 69 6e 74 29  (char*)a)[-(int)
fcd0: 6f 66 66 73 65 74 6f 66 28 77 69 6e 46 69 6c 65  offsetof(winFile
fce0: 2c 68 29 5d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  ,h)]../*.** Acqu
fcf0: 69 72 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  ire a lock on th
fd00: 65 20 68 61 6e 64 6c 65 20 68 0a 2a 2f 0a 73 74  e handle h.*/.st
fd10: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65 4d  atic void winceM
fd20: 75 74 65 78 41 63 71 75 69 72 65 28 48 41 4e 44  utexAcquire(HAND
fd30: 4c 45 20 68 29 7b 0a 20 20 20 44 57 4f 52 44 20  LE h){.   DWORD 
fd40: 64 77 45 72 72 3b 0a 20 20 20 64 6f 20 7b 0a 20  dwErr;.   do {. 
fd50: 20 20 20 20 64 77 45 72 72 20 3d 20 6f 73 57 61      dwErr = osWa
fd60: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
fd70: 74 28 68 2c 20 49 4e 46 49 4e 49 54 45 29 3b 0a  t(h, INFINITE);.
fd80: 20 20 20 7d 20 77 68 69 6c 65 20 28 64 77 45 72     } while (dwEr
fd90: 72 20 21 3d 20 57 41 49 54 5f 4f 42 4a 45 43 54  r != WAIT_OBJECT
fda0: 5f 30 20 26 26 20 64 77 45 72 72 20 21 3d 20 57  _0 && dwErr != W
fdb0: 41 49 54 5f 41 42 41 4e 44 4f 4e 45 44 29 3b 0a  AIT_ABANDONED);.
fdc0: 7d 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  }./*.** Release 
fdd0: 61 20 6c 6f 63 6b 20 61 63 71 75 69 72 65 64 20  a lock acquired 
fde0: 62 79 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  by winceMutexAcq
fdf0: 75 69 72 65 28 29 0a 2a 2f 0a 23 64 65 66 69 6e  uire().*/.#defin
fe00: 65 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65  e winceMutexRele
fe10: 61 73 65 28 68 29 20 52 65 6c 65 61 73 65 4d 75  ase(h) ReleaseMu
fe20: 74 65 78 28 68 29 0a 0a 2f 2a 0a 2a 2a 20 43 72  tex(h)../*.** Cr
fe30: 65 61 74 65 20 74 68 65 20 6d 75 74 65 78 20 61  eate the mutex a
fe40: 6e 64 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  nd shared memory
fe50: 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
fe60: 67 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a  g in the file.**
fe70: 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
fe80: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
fe90: 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28  winceCreateLock(
fea0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
feb0: 65 6e 61 6d 65 2c 20 77 69 6e 46 69 6c 65 20 2a  ename, winFile *
fec0: 70 46 69 6c 65 29 7b 0a 20 20 4c 50 57 53 54 52  pFile){.  LPWSTR
fed0: 20 7a 54 6f 6b 3b 0a 20 20 4c 50 57 53 54 52 20   zTok;.  LPWSTR 
fee0: 7a 4e 61 6d 65 3b 0a 20 20 44 57 4f 52 44 20 6c  zName;.  DWORD l
fef0: 61 73 74 45 72 72 6e 6f 3b 0a 20 20 42 4f 4f 4c  astErrno;.  BOOL
ff00: 20 62 4c 6f 67 67 65 64 20 3d 20 46 41 4c 53 45   bLogged = FALSE
ff10: 3b 0a 20 20 42 4f 4f 4c 20 62 49 6e 69 74 20 3d  ;.  BOOL bInit =
ff20: 20 54 52 55 45 3b 0a 0a 20 20 7a 4e 61 6d 65 20   TRUE;..  zName 
ff30: 3d 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f  = winUtf8ToUnico
ff40: 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  de(zFilename);. 
ff50: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b   if( zName==0 ){
ff60: 0a 20 20 20 20 2f 2a 20 6f 75 74 20 6f 66 20 6d  .    /* out of m
ff70: 65 6d 6f 72 79 20 2a 2f 0a 20 20 20 20 72 65 74  emory */.    ret
ff80: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
ff90: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f  _NOMEM;.  }..  /
ffa0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
ffb0: 20 6c 6f 63 61 6c 20 6c 6f 63 6b 64 61 74 61 20   local lockdata 
ffc0: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 46 69  */.  memset(&pFi
ffd0: 6c 65 2d 3e 6c 6f 63 61 6c 2c 20 30 2c 20 73 69  le->local, 0, si
ffe0: 7a 65 6f 66 28 70 46 69 6c 65 2d 3e 6c 6f 63 61  zeof(pFile->loca
fff0: 6c 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 70 6c 61  l));..  /* Repla
10000 63 65 20 74 68 65 20 62 61 63 6b 73 6c 61 73 68  ce the backslash
10010 65 73 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  es from the file
10020 6e 61 6d 65 20 61 6e 64 20 6c 6f 77 65 72 63 61  name and lowerca
10030 73 65 20 69 74 0a 20 20 2a 2a 20 74 6f 20 64 65  se it.  ** to de
10040 72 69 76 65 20 61 20 6d 75 74 65 78 20 6e 61 6d  rive a mutex nam
10050 65 2e 20 2a 2f 0a 20 20 7a 54 6f 6b 20 3d 20 6f  e. */.  zTok = o
10060 73 43 68 61 72 4c 6f 77 65 72 57 28 7a 4e 61 6d  sCharLowerW(zNam
10070 65 29 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a 54 6f  e);.  for (;*zTo
10080 6b 3b 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69  k;zTok++){.    i
10090 66 20 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27  f (*zTok == '\\'
100a0 29 20 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20  ) *zTok = '_';. 
100b0 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 2f   }..  /* Create/
100c0 6f 70 65 6e 20 74 68 65 20 6e 61 6d 65 64 20 6d  open the named m
100d0 75 74 65 78 20 2a 2f 0a 20 20 70 46 69 6c 65 2d  utex */.  pFile-
100e0 3e 68 4d 75 74 65 78 20 3d 20 6f 73 43 72 65 61  >hMutex = osCrea
100f0 74 65 4d 75 74 65 78 57 28 4e 55 4c 4c 2c 20 46  teMutexW(NULL, F
10100 41 4c 53 45 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ALSE, zName);.  
10110 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74  if (!pFile->hMut
10120 65 78 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ex){.    pFile->
10130 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
10140 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
10150 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
10160 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
10170 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
10180 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c  LITE_IOERR, pFil
10190 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
101a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101b0 20 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74       "winceCreat
101c0 65 4c 6f 63 6b 31 22 2c 20 7a 46 69 6c 65 6e 61  eLock1", zFilena
101d0 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  me);.  }..  /* A
101e0 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 65 78  cquire the mutex
101f0 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69   before continui
10200 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4d 75 74  ng */.  winceMut
10210 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d  exAcquire(pFile-
10220 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  >hMutex);..  /* 
10230 53 69 6e 63 65 20 74 68 65 20 6e 61 6d 65 73 20  Since the names 
10240 6f 66 20 6e 61 6d 65 64 20 6d 75 74 65 78 65 73  of named mutexes
10250 2c 20 73 65 6d 61 70 68 6f 72 65 73 2c 20 66 69  , semaphores, fi
10260 6c 65 20 6d 61 70 70 69 6e 67 73 20 65 74 63 20  le mappings etc 
10270 61 72 65 0a 20 20 2a 2a 20 63 61 73 65 2d 73 65  are.  ** case-se
10280 6e 73 69 74 69 76 65 2c 20 74 61 6b 65 20 61 64  nsitive, take ad
10290 76 61 6e 74 61 67 65 20 6f 66 20 74 68 61 74 20  vantage of that 
102a0 62 79 20 75 70 70 65 72 63 61 73 69 6e 67 20 74  by uppercasing t
102b0 68 65 20 6d 75 74 65 78 20 6e 61 6d 65 0a 20 20  he mutex name.  
102c0 2a 2a 20 61 6e 64 20 75 73 69 6e 67 20 74 68 61  ** and using tha
102d0 74 20 61 73 20 74 68 65 20 73 68 61 72 65 64 20  t as the shared 
102e0 66 69 6c 65 6d 61 70 70 69 6e 67 20 6e 61 6d 65  filemapping name
102f0 2e 0a 20 20 2a 2f 0a 20 20 6f 73 43 68 61 72 55  ..  */.  osCharU
10300 70 70 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20  pperW(zName);.  
10310 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d  pFile->hShared =
10320 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70   osCreateFileMap
10330 70 69 6e 67 57 28 49 4e 56 41 4c 49 44 5f 48 41  pingW(INVALID_HA
10340 4e 44 4c 45 5f 56 41 4c 55 45 2c 20 4e 55 4c 4c  NDLE_VALUE, NULL
10350 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10370 20 20 20 20 20 20 20 20 20 20 50 41 47 45 5f 52            PAGE_R
10380 45 41 44 57 52 49 54 45 2c 20 30 2c 20 73 69 7a  EADWRITE, 0, siz
10390 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 2c 0a  eof(winceLock),.
103a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103c0 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 29 3b 0a          zName);.
103d0 0a 20 20 2f 2a 20 53 65 74 20 61 20 66 6c 61 67  .  /* Set a flag
103e0 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 20   that indicates 
103f0 77 65 27 72 65 20 74 68 65 20 66 69 72 73 74 20  we're the first 
10400 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 6d 65  to create the me
10410 6d 6f 72 79 20 73 6f 20 69 74 0a 20 20 2a 2a 20  mory so it.  ** 
10420 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 69 6e 69  must be zero-ini
10430 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 6c 61  tialized */.  la
10440 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
10450 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69 66  astError();.  if
10460 20 28 6c 61 73 74 45 72 72 6e 6f 20 3d 3d 20 45   (lastErrno == E
10470 52 52 4f 52 5f 41 4c 52 45 41 44 59 5f 45 58 49  RROR_ALREADY_EXI
10480 53 54 53 29 7b 0a 20 20 20 20 62 49 6e 69 74 20  STS){.    bInit 
10490 3d 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20  = FALSE;.  }..  
104a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61  sqlite3_free(zNa
104b0 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  me);..  /* If we
104c0 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 6d 61   succeeded in ma
104d0 6b 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  king the shared 
104e0 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 2c 20 6d  memory handle, m
104f0 61 70 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20  ap it. */.  if( 
10500 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 29  pFile->hShared )
10510 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61  {.    pFile->sha
10520 72 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f 63 6b  red = (winceLock
10530 2a 29 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c  *)osMapViewOfFil
10540 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64  e(pFile->hShared
10550 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 46  ,.             F
10560 49 4c 45 5f 4d 41 50 5f 52 45 41 44 7c 46 49 4c  ILE_MAP_READ|FIL
10570 45 5f 4d 41 50 5f 57 52 49 54 45 2c 20 30 2c 20  E_MAP_WRITE, 0, 
10580 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c  0, sizeof(winceL
10590 6f 63 6b 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66  ock));.    /* If
105a0 20 6d 61 70 70 69 6e 67 20 66 61 69 6c 65 64 2c   mapping failed,
105b0 20 63 6c 6f 73 65 20 74 68 65 20 73 68 61 72 65   close the share
105c0 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20  d memory handle 
105d0 61 6e 64 20 65 72 61 73 65 20 69 74 20 2a 2f 0a  and erase it */.
105e0 20 20 20 20 69 66 28 20 21 70 46 69 6c 65 2d 3e      if( !pFile->
105f0 73 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20  shared ){.      
10600 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
10610 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
10620 72 28 29 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f  r();.      winLo
10630 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
10640 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  ERR, pFile->last
10650 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
10660 20 20 20 20 20 20 20 20 20 22 77 69 6e 63 65 43           "winceC
10670 72 65 61 74 65 4c 6f 63 6b 32 22 2c 20 7a 46 69  reateLock2", zFi
10680 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62  lename);.      b
10690 4c 6f 67 67 65 64 20 3d 20 54 52 55 45 3b 0a 20  Logged = TRUE;. 
106a0 20 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64       osCloseHand
106b0 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  le(pFile->hShare
106c0 64 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  d);.      pFile-
106d0 3e 68 53 68 61 72 65 64 20 3d 20 4e 55 4c 4c 3b  >hShared = NULL;
106e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
106f0 20 49 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   If shared memor
10700 79 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63  y could not be c
10710 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63 6c 6f  reated, then clo
10720 73 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64  se the mutex and
10730 20 66 61 69 6c 20 2a 2f 0a 20 20 69 66 28 20 70   fail */.  if( p
10740 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 3d 3d 4e  File->hShared==N
10750 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ULL ){.    if( !
10760 62 4c 6f 67 67 65 64 20 29 7b 0a 20 20 20 20 20  bLogged ){.     
10770 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
10780 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
10790 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72       winLogError
107a0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70  (SQLITE_IOERR, p
107b0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
107c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
107d0 20 20 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c     "winceCreateL
107e0 6f 63 6b 33 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  ock3", zFilename
107f0 29 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67 65 64  );.      bLogged
10800 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
10810 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c     winceMutexRel
10820 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
10830 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65  ex);.    osClose
10840 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d  Handle(pFile->hM
10850 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65  utex);.    pFile
10860 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  ->hMutex = NULL;
10870 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
10880 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 20  TE_IOERR;.  }.. 
10890 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
108a0 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
108b0 20 69 66 20 77 65 27 72 65 20 73 75 70 70 6f 73   if we're suppos
108c0 65 64 20 74 6f 20 2a 2f 0a 20 20 69 66 28 20 62  ed to */.  if( b
108d0 49 6e 69 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73  Init ){.    mems
108e0 65 74 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  et(pFile->shared
108f0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63  , 0, sizeof(winc
10900 65 4c 6f 63 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20  eLock));.  }..  
10910 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73  winceMutexReleas
10920 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
10930 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
10940 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
10950 65 73 74 72 6f 79 20 74 68 65 20 70 61 72 74 20  estroy the part 
10960 6f 66 20 77 69 6e 46 69 6c 65 20 74 68 61 74 20  of winFile that 
10970 64 65 61 6c 73 20 77 69 74 68 20 77 69 6e 63 65  deals with wince
10980 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74 61 74 69 63   locks.*/.static
10990 20 76 6f 69 64 20 77 69 6e 63 65 44 65 73 74 72   void winceDestr
109a0 6f 79 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a  oyLock(winFile *
109b0 70 46 69 6c 65 29 7b 0a 20 20 69 66 20 28 70 46  pFile){.  if (pF
109c0 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20  ile->hMutex){.  
109d0 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65    /* Acquire the
109e0 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69   mutex */.    wi
109f0 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
10a00 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
10a10 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
10a20 6f 77 69 6e 67 20 62 6c 6f 63 6b 73 20 73 68 6f  owing blocks sho
10a30 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 61 73 73  uld probably ass
10a40 65 72 74 20 69 6e 20 64 65 62 75 67 20 6d 6f 64  ert in debug mod
10a50 65 2c 20 62 75 74 20 74 68 65 79 0a 20 20 20 20  e, but they.    
10a60 20 20 20 61 72 65 20 74 6f 20 63 6c 65 61 6e 75     are to cleanu
10a70 70 20 69 6e 20 63 61 73 65 20 61 6e 79 20 6c 6f  p in case any lo
10a80 63 6b 73 20 72 65 6d 61 69 6e 65 64 20 6f 70 65  cks remained ope
10a90 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69  n */.    if (pFi
10aa0 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
10ab0 72 73 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  rs){.      pFile
10ac0 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65  ->shared->nReade
10ad0 72 73 20 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  rs --;.    }.   
10ae0 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
10af0 6c 2e 62 52 65 73 65 72 76 65 64 29 7b 0a 20 20  l.bReserved){.  
10b00 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
10b10 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46  d->bReserved = F
10b20 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ALSE;.    }.    
10b30 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
10b40 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20  .bPending){.    
10b50 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
10b60 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53  >bPending = FALS
10b70 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  E;.    }.    if 
10b80 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45  (pFile->local.bE
10b90 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20  xclusive){.     
10ba0 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
10bb0 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c  bExclusive = FAL
10bc0 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  SE;.    }..    /
10bd0 2a 20 44 65 2d 72 65 66 65 72 65 6e 63 65 20 61  * De-reference a
10be0 6e 64 20 63 6c 6f 73 65 20 6f 75 72 20 63 6f 70  nd close our cop
10bf0 79 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20  y of the shared 
10c00 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 2a 2f  memory handle */
10c10 0a 20 20 20 20 6f 73 55 6e 6d 61 70 56 69 65 77  .    osUnmapView
10c20 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 73 68  OfFile(pFile->sh
10c30 61 72 65 64 29 3b 0a 20 20 20 20 6f 73 43 6c 6f  ared);.    osClo
10c40 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
10c50 68 53 68 61 72 65 64 29 3b 0a 0a 20 20 20 20 2f  hShared);..    /
10c60 2a 20 44 6f 6e 65 20 77 69 74 68 20 74 68 65 20  * Done with the 
10c70 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e  mutex */.    win
10c80 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
10c90 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
10ca0 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65     osCloseHandle
10cb0 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
10cc0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74  .    pFile->hMut
10cd0 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d  ex = NULL;.  }.}
10ce0 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65  ../*.** An imple
10cf0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
10d00 20 4c 6f 63 6b 46 69 6c 65 28 29 20 41 50 49 20   LockFile() API 
10d10 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43  of Windows for C
10d20 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c  E.*/.static BOOL
10d30 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 0a   winceLockFile(.
10d40 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c    LPHANDLE phFil
10d50 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c  e,.  DWORD dwFil
10d60 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57  eOffsetLow,.  DW
10d70 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74  ORD dwFileOffset
10d80 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e  High,.  DWORD nN
10d90 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
10da0 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e  ckLow,.  DWORD n
10db0 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
10dc0 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e  ockHigh.){.  win
10dd0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41  File *pFile = HA
10de0 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28  NDLE_TO_WINFILE(
10df0 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20  phFile);.  BOOL 
10e00 62 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b  bReturn = FALSE;
10e10 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
10e20 45 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65  ETER(dwFileOffse
10e30 74 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44  tHigh);.  UNUSED
10e40 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62  _PARAMETER(nNumb
10e50 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48  erOfBytesToLockH
10e60 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70 46  igh);..  if (!pF
10e70 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74  ile->hMutex) ret
10e80 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63  urn TRUE;.  winc
10e90 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46  eMutexAcquire(pF
10ea0 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20  ile->hMutex);.. 
10eb0 20 2f 2a 20 57 61 6e 74 69 6e 67 20 61 6e 20 65   /* Wanting an e
10ec0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a  xclusive lock? *
10ed0 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66  /.  if (dwFileOf
10ee0 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
10ef0 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 0a 20  D)SHARED_FIRST. 
10f00 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72        && nNumber
10f10 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77  OfBytesToLockLow
10f20 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
10f30 44 5f 53 49 5a 45 29 7b 0a 20 20 20 20 69 66 20  D_SIZE){.    if 
10f40 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e  (pFile->shared->
10f50 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 20 26 26  nReaders == 0 &&
10f60 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
10f70 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29  bExclusive == 0)
10f80 7b 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  {.       pFile->
10f90 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69  shared->bExclusi
10fa0 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ve = TRUE;.     
10fb0 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62    pFile->local.b
10fc0 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45  Exclusive = TRUE
10fd0 3b 0a 20 20 20 20 20 20 20 62 52 65 74 75 72 6e  ;.       bReturn
10fe0 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
10ff0 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20   }..  /* Want a 
11000 72 65 61 64 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f 20  read-only lock? 
11010 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77  */.  else if (dw
11020 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
11030 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46   (DWORD)SHARED_F
11040 49 52 53 54 20 26 26 0a 20 20 20 20 20 20 20 20  IRST &&.        
11050 20 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65     nNumberOfByte
11060 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  sToLockLow == 1)
11070 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
11080 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
11090 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20  ive == 0){.     
110a0 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52   pFile->local.nR
110b0 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20 20  eaders ++;.     
110c0 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
110d0 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 31 29  l.nReaders == 1)
110e0 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
110f0 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72  >shared->nReader
11100 73 20 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  s ++;.      }.  
11110 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
11120 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
11130 20 2f 2a 20 57 61 6e 74 20 61 20 70 65 6e 64 69   /* Want a pendi
11140 6e 67 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c  ng lock? */.  el
11150 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
11160 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
11170 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a 20 20  )PENDING_BYTE.  
11180 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d           && nNum
11190 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
111a0 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 2f  Low == 1){.    /
111b0 2a 20 49 66 20 6e 6f 20 70 65 6e 64 69 6e 67 20  * If no pending 
111c0 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 61 63  lock has been ac
111d0 71 75 69 72 65 64 2c 20 74 68 65 6e 20 61 63 71  quired, then acq
111e0 75 69 72 65 20 69 74 20 2a 2f 0a 20 20 20 20 69  uire it */.    i
111f0 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  f (pFile->shared
11200 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 3d 20 30 29  ->bPending == 0)
11210 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
11220 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67  shared->bPending
11230 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70   = TRUE;.      p
11240 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e  File->local.bPen
11250 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20 20  ding = TRUE;.   
11260 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
11270 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
11280 2f 2a 20 57 61 6e 74 20 61 20 72 65 73 65 72 76  /* Want a reserv
11290 65 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c  ed lock? */.  el
112a0 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
112b0 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
112c0 29 52 45 53 45 52 56 45 44 5f 42 59 54 45 0a 20  )RESERVED_BYTE. 
112d0 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75            && nNu
112e0 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
112f0 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20  kLow == 1){.    
11300 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  if (pFile->share
11310 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 3d 20  d->bReserved == 
11320 30 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  0) {.      pFile
11330 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72  ->shared->bReser
11340 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ved = TRUE;.    
11350 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62    pFile->local.b
11360 52 65 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b  Reserved = TRUE;
11370 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
11380 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d   TRUE;.    }.  }
11390 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65  ..  winceMutexRe
113a0 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75  lease(pFile->hMu
113b0 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62  tex);.  return b
113c0 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Return;.}../*.**
113d0 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   An implementati
113e0 6f 6e 20 6f 66 20 74 68 65 20 55 6e 6c 6f 63 6b  on of the Unlock
113f0 46 69 6c 65 20 41 50 49 20 6f 66 20 57 69 6e 64  File API of Wind
11400 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74  ows for CE.*/.st
11410 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 55  atic BOOL winceU
11420 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48  nlockFile(.  LPH
11430 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20  ANDLE phFile,.  
11440 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73  DWORD dwFileOffs
11450 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64  etLow,.  DWORD d
11460 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c  wFileOffsetHigh,
11470 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
11480 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
11490 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d  ow,.  DWORD nNum
114a0 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
114b0 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46  ckHigh.){.  winF
114c0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e  ile *pFile = HAN
114d0 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70  DLE_TO_WINFILE(p
114e0 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62  hFile);.  BOOL b
114f0 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a  Return = FALSE;.
11500 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
11510 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65 74  TER(dwFileOffset
11520 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f  High);.  UNUSED_
11530 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65  PARAMETER(nNumbe
11540 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
11550 48 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70  High);..  if (!p
11560 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65  File->hMutex) re
11570 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e  turn TRUE;.  win
11580 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70  ceMutexAcquire(p
11590 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a  File->hMutex);..
115a0 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61    /* Releasing a
115b0 20 72 65 61 64 65 72 20 6c 6f 63 6b 20 6f 72 20   reader lock or 
115c0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
115d0 6b 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c  k */.  if (dwFil
115e0 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44  eOffsetLow == (D
115f0 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53  WORD)SHARED_FIRS
11600 54 29 7b 0a 20 20 20 20 2f 2a 20 44 69 64 20 77  T){.    /* Did w
11610 65 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73  e have an exclus
11620 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20  ive lock? */.   
11630 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
11640 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20  l.bExclusive){. 
11650 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d       assert(nNum
11660 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
11670 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  ckLow == (DWORD)
11680 53 48 41 52 45 44 5f 53 49 5a 45 29 3b 0a 20 20  SHARED_SIZE);.  
11690 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
116a0 2e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41  .bExclusive = FA
116b0 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  LSE;.      pFile
116c0 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
116d0 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20  sive = FALSE;.  
116e0 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
116f0 55 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  UE;.    }..    /
11700 2a 20 44 69 64 20 77 65 20 6a 75 73 74 20 68 61  * Did we just ha
11710 76 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b  ve a reader lock
11720 3f 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66  ? */.    else if
11730 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e   (pFile->local.n
11740 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20  Readers){.      
11750 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66  assert(nNumberOf
11760 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
11770 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
11780 44 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20  D_SIZE.         
11790 20 20 20 20 7c 7c 20 6e 4e 75 6d 62 65 72 4f 66      || nNumberOf
117a0 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
117b0 20 3d 3d 20 31 29 3b 0a 20 20 20 20 20 20 70 46   == 1);.      pF
117c0 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
117d0 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 69 66  ers --;.      if
117e0 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e   (pFile->local.n
117f0 52 65 61 64 65 72 73 20 3d 3d 20 30 29 0a 20 20  Readers == 0).  
11800 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70 46      {.        pF
11810 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65  ile->shared->nRe
11820 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20  aders --;.      
11830 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  }.      bReturn 
11840 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
11850 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e  }..  /* Releasin
11860 67 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b  g a pending lock
11870 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64   */.  else if (d
11880 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d  wFileOffsetLow =
11890 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47  = (DWORD)PENDING
118a0 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20 20 20  _BYTE.          
118b0 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74   && nNumberOfByt
118c0 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d  esToUnlockLow ==
118d0 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69   1){.    if (pFi
118e0 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69  le->local.bPendi
118f0 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ng){.      pFile
11900 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67  ->local.bPending
11910 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
11920 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
11930 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b  Pending = FALSE;
11940 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
11950 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d   TRUE;.    }.  }
11960 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20  .  /* Releasing 
11970 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  a reserved lock 
11980 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77  */.  else if (dw
11990 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
119a0 20 28 44 57 4f 52 44 29 52 45 53 45 52 56 45 44   (DWORD)RESERVED
119b0 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20 20 20  _BYTE.          
119c0 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74   && nNumberOfByt
119d0 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d  esToUnlockLow ==
119e0 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69   1){.    if (pFi
119f0 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
11a00 76 65 64 29 20 7b 0a 20 20 20 20 20 20 70 46 69  ved) {.      pFi
11a10 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
11a20 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ved = FALSE;.   
11a30 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
11a40 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46 41  ->bReserved = FA
11a50 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75  LSE;.      bRetu
11a60 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
11a70 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74  .  }..  winceMut
11a80 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d  exRelease(pFile-
11a90 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  >hMutex);.  retu
11aa0 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 2f 2a  rn bReturn;.}./*
11ab0 0a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73  .** End of the s
11ac0 70 65 63 69 61 6c 20 63 6f 64 65 20 66 6f 72 20  pecial code for 
11ad0 77 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  wince.**********
11ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b20 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ***/.#endif /* S
11b30 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a  QLITE_OS_WINCE *
11b40 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61 20  /../*.** Lock a 
11b50 66 69 6c 65 20 72 65 67 69 6f 6e 2e 0a 2a 2f 0a  file region..*/.
11b60 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 4c  static BOOL winL
11b70 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e  ockFile(.  LPHAN
11b80 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57  DLE phFile,.  DW
11b90 4f 52 44 20 66 6c 61 67 73 2c 0a 20 20 44 57 4f  ORD flags,.  DWO
11ba0 52 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20  RD offsetLow,.  
11bb0 44 57 4f 52 44 20 6f 66 66 73 65 74 48 69 67 68  DWORD offsetHigh
11bc0 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74  ,.  DWORD numByt
11bd0 65 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e  esLow,.  DWORD n
11be0 75 6d 42 79 74 65 73 48 69 67 68 0a 29 7b 0a 23  umBytesHigh.){.#
11bf0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
11c00 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54  CE.  /*.  ** NOT
11c10 45 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73  E: Windows CE is
11c20 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65   handled differe
11c30 6e 74 6c 79 20 68 65 72 65 20 64 75 65 20 69 74  ntly here due it
11c40 73 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69  s lack of the Wi
11c50 6e 33 32 0a 20 20 2a 2a 20 20 20 20 20 20 20 41  n32.  **       A
11c60 50 49 20 4c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a  PI LockFile..  *
11c70 2f 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65  /.  return wince
11c80 4c 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c  LockFile(phFile,
11c90 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73   offsetLow, offs
11ca0 65 74 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20  etHigh,.        
11cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
11cc0 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42  umBytesLow, numB
11cd0 79 74 65 73 48 69 67 68 29 3b 0a 23 65 6c 73 65  ytesHigh);.#else
11ce0 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
11cf0 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45  ){.    OVERLAPPE
11d00 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73  D ovlp;.    mems
11d10 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a  et(&ovlp, 0, siz
11d20 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29  eof(OVERLAPPED))
11d30 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65  ;.    ovlp.Offse
11d40 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20  t = offsetLow;. 
11d50 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69     ovlp.OffsetHi
11d60 67 68 20 3d 20 6f 66 66 73 65 74 48 69 67 68 3b  gh = offsetHigh;
11d70 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f  .    return osLo
11d80 63 6b 46 69 6c 65 45 78 28 2a 70 68 46 69 6c 65  ckFileEx(*phFile
11d90 2c 20 66 6c 61 67 73 2c 20 30 2c 20 6e 75 6d 42  , flags, 0, numB
11da0 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65  ytesLow, numByte
11db0 73 48 69 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20  sHigh, &ovlp);. 
11dc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
11dd0 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 28 2a 70  rn osLockFile(*p
11de0 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77  hFile, offsetLow
11df0 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75  , offsetHigh, nu
11e00 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20  mBytesLow,.     
11e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e20 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a   numBytesHigh);.
11e30 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
11e40 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 20 66 69 6c  .** Unlock a fil
11e50 65 20 72 65 67 69 6f 6e 2e 0a 20 2a 2f 0a 73 74  e region.. */.st
11e60 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 55 6e 6c  atic BOOL winUnl
11e70 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e  ockFile(.  LPHAN
11e80 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57  DLE phFile,.  DW
11e90 4f 52 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20  ORD offsetLow,. 
11ea0 20 44 57 4f 52 44 20 6f 66 66 73 65 74 48 69 67   DWORD offsetHig
11eb0 68 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79  h,.  DWORD numBy
11ec0 74 65 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  tesLow,.  DWORD 
11ed0 6e 75 6d 42 79 74 65 73 48 69 67 68 0a 29 7b 0a  numBytesHigh.){.
11ee0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
11ef0 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f  NCE.  /*.  ** NO
11f00 54 45 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69  TE: Windows CE i
11f10 73 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72  s handled differ
11f20 65 6e 74 6c 79 20 68 65 72 65 20 64 75 65 20 69  ently here due i
11f30 74 73 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57  ts lack of the W
11f40 69 6e 33 32 0a 20 20 2a 2a 20 20 20 20 20 20 20  in32.  **       
11f50 41 50 49 20 55 6e 6c 6f 63 6b 46 69 6c 65 2e 0a  API UnlockFile..
11f60 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 77 69    */.  return wi
11f70 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 68  nceUnlockFile(ph
11f80 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c  File, offsetLow,
11f90 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 20   offsetHigh,.   
11fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fb0 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73 4c 6f        numBytesLo
11fc0 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29  w, numBytesHigh)
11fd0 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6f 73  ;.#else.  if( os
11fe0 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f 56  IsNT() ){.    OV
11ff0 45 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20  ERLAPPED ovlp;. 
12000 20 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c     memset(&ovlp,
12010 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c   0, sizeof(OVERL
12020 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 6c  APPED));.    ovl
12030 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66 73 65  p.Offset = offse
12040 74 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f  tLow;.    ovlp.O
12050 66 66 73 65 74 48 69 67 68 20 3d 20 6f 66 66 73  ffsetHigh = offs
12060 65 74 48 69 67 68 3b 0a 20 20 20 20 72 65 74 75  etHigh;.    retu
12070 72 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 45  rn osUnlockFileE
12080 78 28 2a 70 68 46 69 6c 65 2c 20 30 2c 20 6e 75  x(*phFile, 0, nu
12090 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79  mBytesLow, numBy
120a0 74 65 73 48 69 67 68 2c 20 26 6f 76 6c 70 29 3b  tesHigh, &ovlp);
120b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
120c0 74 75 72 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c  turn osUnlockFil
120d0 65 28 2a 70 68 46 69 6c 65 2c 20 6f 66 66 73 65  e(*phFile, offse
120e0 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68  tLow, offsetHigh
120f0 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20  , numBytesLow,. 
12100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12110 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73 48         numBytesH
12120 69 67 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  igh);.  }.#endif
12130 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
12140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12180 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 67  **.** The next g
12190 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73  roup of routines
121a0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49   implement the I
121b0 2f 4f 20 6d 65 74 68 6f 64 73 20 73 70 65 63 69  /O methods speci
121c0 66 69 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73  fied.** by the s
121d0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
121e0 73 20 6f 62 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a  s object..******
121f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12230 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
12240 20 53 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20   Some Microsoft 
12250 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74  compilers lack t
12260 68 69 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a  his definition..
12270 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c  */.#ifndef INVAL
12280 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e  ID_SET_FILE_POIN
12290 54 45 52 0a 23 20 64 65 66 69 6e 65 20 49 4e 56  TER.# define INV
122a0 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f  ALID_SET_FILE_PO
122b0 49 4e 54 45 52 20 28 28 44 57 4f 52 44 29 2d 31  INTER ((DWORD)-1
122c0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
122d0 4d 6f 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  Move the current
122e0 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65   position of the
122f0 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 61 73   file handle pas
12300 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
12310 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  .** argument to 
12320 6f 66 66 73 65 74 20 69 4f 66 66 73 65 74 20 77  offset iOffset w
12330 69 74 68 69 6e 20 74 68 65 20 66 69 6c 65 2e 20  ithin the file. 
12340 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72  If successful, r
12350 65 74 75 72 6e 20 30 2e 0a 2a 2a 20 4f 74 68 65  eturn 0..** Othe
12360 72 77 69 73 65 2c 20 73 65 74 20 70 46 69 6c 65  rwise, set pFile
12370 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 61 6e 64 20  ->lastErrno and 
12380 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e  return non-zero.
12390 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
123a0 69 6e 53 65 65 6b 46 69 6c 65 28 77 69 6e 46 69  inSeekFile(winFi
123b0 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74  le *pFile, sqlit
123c0 65 33 5f 69 6e 74 36 34 20 69 4f 66 66 73 65 74  e3_int64 iOffset
123d0 29 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  ){.#if !SQLITE_O
123e0 53 5f 57 49 4e 52 54 0a 20 20 4c 4f 4e 47 20 75  S_WINRT.  LONG u
123f0 70 70 65 72 42 69 74 73 3b 20 20 20 20 20 20 20  pperBits;       
12400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73            /* Mos
12410 74 20 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f  t sig. 32 bits o
12420 66 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a  f new offset */.
12430 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73    LONG lowerBits
12440 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12450 20 20 2f 2a 20 4c 65 61 73 74 20 73 69 67 2e 20    /* Least sig. 
12460 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77 20 6f  32 bits of new o
12470 66 66 73 65 74 20 2a 2f 0a 20 20 44 57 4f 52 44  ffset */.  DWORD
12480 20 64 77 52 65 74 3b 20 20 20 20 20 20 20 20 20   dwRet;         
12490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
124a0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
124b0 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 29  SetFilePointer()
124c0 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74   */.  DWORD last
124d0 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  Errno;          
124e0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
124f0 65 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61  eturned by GetLa
12500 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 20 20  stError() */..  
12510 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66  OSTRACE(("SEEK f
12520 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25  ile=%p, offset=%
12530 6c 6c 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  lld\n", pFile->h
12540 2c 20 69 4f 66 66 73 65 74 29 29 3b 0a 0a 20 20  , iOffset));..  
12550 75 70 70 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e  upperBits = (LON
12560 47 29 28 28 69 4f 66 66 73 65 74 3e 3e 33 32 29  G)((iOffset>>32)
12570 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a   & 0x7fffffff);.
12580 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 28 4c    lowerBits = (L
12590 4f 4e 47 29 28 69 4f 66 66 73 65 74 20 26 20 30  ONG)(iOffset & 0
125a0 78 66 66 66 66 66 66 66 66 29 3b 0a 0a 20 20 2f  xffffffff);..  /
125b0 2a 20 41 50 49 20 6f 64 64 69 74 79 3a 20 49 66  * API oddity: If
125c0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 65 74   successful, Set
125d0 46 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 72 65  FilePointer() re
125e0 74 75 72 6e 73 20 61 20 64 77 6f 72 64 0a 20 20  turns a dword.  
125f0 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ** containing th
12600 65 20 6c 6f 77 65 72 20 33 32 2d 62 69 74 73 20  e lower 32-bits 
12610 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 2d  of the new file-
12620 6f 66 66 73 65 74 2e 20 4f 72 2c 20 69 66 20 69  offset. Or, if i
12630 74 20 66 61 69 6c 73 2c 0a 20 20 2a 2a 20 69 74  t fails,.  ** it
12640 20 72 65 74 75 72 6e 73 20 49 4e 56 41 4c 49 44   returns INVALID
12650 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45  _SET_FILE_POINTE
12660 52 2e 20 48 6f 77 65 76 65 72 20 61 63 63 6f 72  R. However accor
12670 64 69 6e 67 20 74 6f 20 4d 53 44 4e 2c 0a 20 20  ding to MSDN,.  
12680 2a 2a 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46  ** INVALID_SET_F
12690 49 4c 45 5f 50 4f 49 4e 54 45 52 20 6d 61 79 20  ILE_POINTER may 
126a0 61 6c 73 6f 20 62 65 20 61 20 76 61 6c 69 64 20  also be a valid 
126b0 6e 65 77 20 6f 66 66 73 65 74 2e 20 53 6f 20 74  new offset. So t
126c0 6f 20 64 65 74 65 72 6d 69 6e 65 0a 20 20 2a 2a  o determine.  **
126d0 20 77 68 65 74 68 65 72 20 61 6e 20 65 72 72 6f   whether an erro
126e0 72 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 6f  r has actually o
126f0 63 63 75 72 72 65 64 2c 20 69 74 20 69 73 20 61  ccurred, it is a
12700 6c 73 6f 20 6e 65 63 65 73 73 61 72 79 20 74 6f  lso necessary to
12710 20 63 61 6c 6c 0a 20 20 2a 2a 20 47 65 74 4c 61   call.  ** GetLa
12720 73 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a  stError()..  */.
12730 20 20 64 77 52 65 74 20 3d 20 6f 73 53 65 74 46    dwRet = osSetF
12740 69 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65  ilePointer(pFile
12750 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20  ->h, lowerBits, 
12760 26 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45  &upperBits, FILE
12770 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 20  _BEGIN);..  if( 
12780 28 64 77 52 65 74 3d 3d 49 4e 56 41 4c 49 44 5f  (dwRet==INVALID_
12790 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
127a0 0a 20 20 20 20 20 20 26 26 20 28 28 6c 61 73 74  .      && ((last
127b0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
127c0 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52  tError())!=NO_ER
127d0 52 4f 52 29 29 20 29 7b 0a 20 20 20 20 70 46 69  ROR)) ){.    pFi
127e0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
127f0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77  lastErrno;.    w
12800 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
12810 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46  E_IOERR_SEEK, pF
12820 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
12830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12840 22 77 69 6e 53 65 65 6b 46 69 6c 65 22 2c 20 70  "winSeekFile", p
12850 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
12860 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b    OSTRACE(("SEEK
12870 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
12880 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 5c 6e  ITE_IOERR_SEEK\n
12890 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
128a0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
128b0 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 45  ..  OSTRACE(("SE
128c0 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  EK file=%p, rc=S
128d0 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
128e0 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72  le->h));.  retur
128f0 6e 20 30 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 0a  n 0;.#else.  /*.
12900 20 20 2a 2a 20 53 61 6d 65 20 61 73 20 61 62 6f    ** Same as abo
12910 76 65 2c 20 65 78 63 65 70 74 20 74 68 61 74 20  ve, except that 
12920 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74  this implementat
12930 69 6f 6e 20 77 6f 72 6b 73 20 66 6f 72 20 57 69  ion works for Wi
12940 6e 52 54 2e 0a 20 20 2a 2f 0a 0a 20 20 4c 41 52  nRT..  */..  LAR
12950 47 45 5f 49 4e 54 45 47 45 52 20 78 3b 20 20 20  GE_INTEGER x;   
12960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12970 54 68 65 20 6e 65 77 20 6f 66 66 73 65 74 20 2a  The new offset *
12980 2f 0a 20 20 42 4f 4f 4c 20 62 52 65 74 3b 20 20  /.  BOOL bRet;  
12990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129a0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74      /* Value ret
129b0 75 72 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65  urned by SetFile
129c0 50 6f 69 6e 74 65 72 45 78 28 29 20 2a 2f 0a 0a  PointerEx() */..
129d0 20 20 78 2e 51 75 61 64 50 61 72 74 20 3d 20 69    x.QuadPart = i
129e0 4f 66 66 73 65 74 3b 0a 20 20 62 52 65 74 20 3d  Offset;.  bRet =
129f0 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65   osSetFilePointe
12a00 72 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 78 2c  rEx(pFile->h, x,
12a10 20 30 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b   0, FILE_BEGIN);
12a20 0a 0a 20 20 69 66 28 21 62 52 65 74 29 7b 0a 20  ..  if(!bRet){. 
12a30 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
12a40 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
12a50 72 72 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c  rror();.    winL
12a60 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
12a70 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65  OERR_SEEK, pFile
12a80 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
12a90 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
12aa0 6e 53 65 65 6b 46 69 6c 65 22 2c 20 70 46 69 6c  nSeekFile", pFil
12ab0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 4f  e->zPath);.    O
12ac0 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69  STRACE(("SEEK fi
12ad0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
12ae0 5f 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22 2c 20  _IOERR_SEEK\n", 
12af0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
12b00 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
12b10 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20   OSTRACE(("SEEK 
12b20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
12b30 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
12b40 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  >h));.  return 0
12b50 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 20  ;.#endif.}..#if 
12b60 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
12b70 53 49 5a 45 3e 30 0a 2f 2a 20 46 6f 72 77 61 72  SIZE>0./* Forwar
12b80 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  d references to 
12b90 56 46 53 20 68 65 6c 70 65 72 20 6d 65 74 68 6f  VFS helper metho
12ba0 64 73 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 6f  ds used for memo
12bb0 72 79 20 6d 61 70 70 65 64 20 66 69 6c 65 73 20  ry mapped files 
12bc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
12bd0 6e 4d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65  nMapfile(winFile
12be0 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  *, sqlite3_int64
12bf0 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  );.static int wi
12c00 6e 55 6e 6d 61 70 66 69 6c 65 28 77 69 6e 46 69  nUnmapfile(winFi
12c10 6c 65 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  le*);.#endif../*
12c20 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
12c30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 72 65  ..**.** It is re
12c40 70 6f 72 74 65 64 20 74 68 61 74 20 61 6e 20 61  ported that an a
12c50 74 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73 65 20  ttempt to close 
12c60 61 20 68 61 6e 64 6c 65 20 6d 69 67 68 74 20 73  a handle might s
12c70 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 66 61 69 6c  ometimes.** fail
12c80 2e 20 20 54 68 69 73 20 69 73 20 61 20 76 65 72  .  This is a ver
12c90 79 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 72  y unreasonable r
12ca0 65 73 75 6c 74 2c 20 62 75 74 20 57 69 6e 64 6f  esult, but Windo
12cb0 77 73 20 69 73 20 6e 6f 74 6f 72 69 6f 75 73 0a  ws is notorious.
12cc0 2a 2a 20 66 6f 72 20 62 65 69 6e 67 20 75 6e 72  ** for being unr
12cd0 65 61 73 6f 6e 61 62 6c 65 20 73 6f 20 49 20 64  easonable so I d
12ce0 6f 20 6e 6f 74 20 64 6f 75 62 74 20 74 68 61 74  o not doubt that
12cf0 20 69 74 20 6d 69 67 68 74 20 68 61 70 70 65 6e   it might happen
12d00 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 63 6c 6f  .  If.** the clo
12d10 73 65 20 66 61 69 6c 73 2c 20 77 65 20 70 61 75  se fails, we pau
12d20 73 65 20 66 6f 72 20 31 30 30 20 6d 69 6c 6c 69  se for 100 milli
12d30 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20  seconds and try 
12d40 61 67 61 69 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61  again.  As.** ma
12d50 6e 79 20 61 73 20 4d 58 5f 43 4c 4f 53 45 5f 41  ny as MX_CLOSE_A
12d60 54 54 45 4d 50 54 20 61 74 74 65 6d 70 74 73 20  TTEMPT attempts 
12d70 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 68 61 6e  to close the han
12d80 64 6c 65 20 61 72 65 20 6d 61 64 65 20 62 65 66  dle are made bef
12d90 6f 72 65 0a 2a 2a 20 67 69 76 69 6e 67 20 75 70  ore.** giving up
12da0 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61   and returning a
12db0 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66  n error..*/.#def
12dc0 69 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54  ine MX_CLOSE_ATT
12dd0 45 4d 50 54 20 33 0a 73 74 61 74 69 63 20 69 6e  EMPT 3.static in
12de0 74 20 77 69 6e 43 6c 6f 73 65 28 73 71 6c 69 74  t winClose(sqlit
12df0 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
12e00 69 6e 74 20 72 63 2c 20 63 6e 74 20 3d 20 30 3b  int rc, cnt = 0;
12e10 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
12e20 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
12e30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  ;..  assert( id!
12e40 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  =0 );.#ifndef SQ
12e50 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
12e60 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70  assert( pFile->p
12e70 53 68 6d 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66  Shm==0 );.#endif
12e80 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
12e90 2d 3e 68 21 3d 4e 55 4c 4c 20 26 26 20 70 46 69  ->h!=NULL && pFi
12ea0 6c 65 2d 3e 68 21 3d 49 4e 56 41 4c 49 44 5f 48  le->h!=INVALID_H
12eb0 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 20  ANDLE_VALUE );. 
12ec0 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45   OSTRACE(("CLOSE
12ed0 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
12ee0 25 70 2c 20 66 69 6c 65 3d 25 70 5c 6e 22 2c 0a  %p, file=%p\n",.
12ef0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
12f00 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
12f10 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
12f20 2d 3e 68 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49  ->h));..#if SQLI
12f30 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
12f40 3e 30 0a 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c  >0.  winUnmapfil
12f50 65 28 70 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66  e(pFile);.#endif
12f60 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 72 63 20 3d  ..  do{.    rc =
12f70 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
12f80 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 2f 2a  File->h);.    /*
12f90 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
12fa0 28 20 72 63 3d 30 3b 20 63 6e 74 3d 4d 58 5f 43  ( rc=0; cnt=MX_C
12fb0 4c 4f 53 45 5f 41 54 54 45 4d 50 54 3b 20 29 3b  LOSE_ATTEMPT; );
12fc0 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 72 63   */.  }while( rc
12fd0 3d 3d 30 20 26 26 20 2b 2b 63 6e 74 20 3c 20 4d  ==0 && ++cnt < M
12fe0 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20  X_CLOSE_ATTEMPT 
12ff0 26 26 20 28 73 71 6c 69 74 65 33 5f 77 69 6e 33  && (sqlite3_win3
13000 32 5f 73 6c 65 65 70 28 31 30 30 29 2c 20 31 29  2_sleep(100), 1)
13010 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   );.#if SQLITE_O
13020 53 5f 57 49 4e 43 45 0a 23 64 65 66 69 6e 65 20  S_WINCE.#define 
13030 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41  WINCE_DELETION_A
13040 54 54 45 4d 50 54 53 20 33 0a 20 20 77 69 6e 63  TTEMPTS 3.  winc
13050 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 70 46 69  eDestroyLock(pFi
13060 6c 65 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  le);.  if( pFile
13070 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  ->zDeleteOnClose
13080 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20   ){.    int cnt 
13090 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 0a  = 0;.    while(.
130a0 20 20 20 20 20 20 20 20 20 20 20 6f 73 44 65 6c             osDel
130b0 65 74 65 46 69 6c 65 57 28 70 46 69 6c 65 2d 3e  eteFileW(pFile->
130c0 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3d  zDeleteOnClose)=
130d0 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 6f 73  =0.        && os
130e0 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
130f0 73 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74  sW(pFile->zDelet
13100 65 4f 6e 43 6c 6f 73 65 29 21 3d 30 78 66 66 66  eOnClose)!=0xfff
13110 66 66 66 66 66 0a 20 20 20 20 20 20 20 20 26 26  fffff.        &&
13120 20 63 6e 74 2b 2b 20 3c 20 57 49 4e 43 45 5f 44   cnt++ < WINCE_D
13130 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53  ELETION_ATTEMPTS
13140 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 73  .    ){.       s
13150 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
13160 65 70 28 31 30 30 29 3b 20 20 2f 2a 20 57 61 69  ep(100);  /* Wai
13170 74 20 61 20 6c 69 74 74 6c 65 20 62 65 66 6f 72  t a little befor
13180 65 20 74 72 79 69 6e 67 20 61 67 61 69 6e 20 2a  e trying again *
13190 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  /.    }.    sqli
131a0 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
131b0 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3b  zDeleteOnClose);
131c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
131d0 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c  ( rc ){.    pFil
131e0 65 2d 3e 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  e->h = NULL;.  }
131f0 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d  .  OpenCounter(-
13200 31 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  1);.  OSTRACE(("
13210 43 4c 4f 53 45 20 70 69 64 3d 25 6c 75 2c 20 70  CLOSE pid=%lu, p
13220 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70  File=%p, file=%p
13230 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
13240 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
13250 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
13260 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c  pFile, pFile->h,
13270 20 72 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61   rc ? "ok" : "fa
13280 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
13290 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  n rc ? SQLITE_OK
132a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 77  .            : w
132b0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
132c0 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 6f  E_IOERR_CLOSE, o
132d0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
132e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
132f0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 43             "winC
13300 6c 6f 73 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  lose", pFile->zP
13310 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ath);.}../*.** R
13320 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ead data from a 
13330 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66  file into a buff
13340 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  er.  Return SQLI
13350 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20  TE_OK if all.** 
13360 62 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20  bytes were read 
13370 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64  successfully and
13380 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66   SQLITE_IOERR if
13390 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
133a0 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  * wrong..*/.stat
133b0 69 63 20 69 6e 74 20 77 69 6e 52 65 61 64 28 0a  ic int winRead(.
133c0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
133d0 69 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  id,          /* 
133e0 46 69 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f  File to read fro
133f0 6d 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  m */.  void *pBu
13400 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
13410 20 20 2f 2a 20 57 72 69 74 65 20 63 6f 6e 74 65    /* Write conte
13420 6e 74 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66  nt into this buf
13430 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74  fer */.  int amt
13440 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13450 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
13460 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a   bytes to read *
13470 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
13480 34 20 6f 66 66 73 65 74 20 20 20 20 20 20 20 2f  4 offset       /
13490 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20  * Begin reading 
134a0 61 74 20 74 68 69 73 20 6f 66 66 73 65 74 20 2a  at this offset *
134b0 2f 0a 29 7b 0a 23 69 66 20 21 53 51 4c 49 54 45  /.){.#if !SQLITE
134c0 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 64 65  _OS_WINCE && !de
134d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
134e0 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44  32_NO_OVERLAPPED
134f0 29 0a 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f  ).  OVERLAPPED o
13500 76 65 72 6c 61 70 70 65 64 3b 20 20 20 20 20 20  verlapped;      
13510 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73 65      /* The offse
13520 74 20 66 6f 72 20 52 65 61 64 46 69 6c 65 2e 20  t for ReadFile. 
13530 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46  */.#endif.  winF
13540 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
13550 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 66  nFile*)id;  /* f
13560 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ile handle */.  
13570 44 57 4f 52 44 20 6e 52 65 61 64 3b 20 20 20 20  DWORD nRead;    
13580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13590 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
135a0 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  es actually read
135b0 20 66 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a 20 20   from file */.  
135c0 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20  int nRetry = 0; 
135d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74  /* Number of ret
135f0 72 79 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  rys */..  assert
13600 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( id!=0 );.  ass
13610 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20  ert( amt>0 );.  
13620 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d  assert( offset>=
13630 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  0 );.  SimulateI
13640 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
13650 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 29  LITE_IOERR_READ)
13660 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  ;.  OSTRACE(("RE
13670 41 44 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  AD pid=%lu, pFil
13680 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 62  e=%p, file=%p, b
13690 75 66 66 65 72 3d 25 70 2c 20 61 6d 6f 75 6e 74  uffer=%p, amount
136a0 3d 25 64 2c 20 22 0a 20 20 20 20 20 20 20 20 20  =%d, ".         
136b0 20 20 22 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20    "offset=%lld, 
136c0 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 6f 73 47 65  lock=%d\n", osGe
136d0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
136e0 64 28 29 2c 20 70 46 69 6c 65 2c 0a 20 20 20 20  d(), pFile,.    
136f0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
13700 20 70 42 75 66 2c 20 61 6d 74 2c 20 6f 66 66 73   pBuf, amt, offs
13710 65 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  et, pFile->lockt
13720 79 70 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49  ype));..#if SQLI
13730 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
13740 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74  >0.  /* Deal wit
13750 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69  h as much of thi
13760 73 20 72 65 61 64 20 72 65 71 75 65 73 74 20 61  s read request a
13770 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72  s possible by tr
13780 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64  ansfering.  ** d
13790 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d  ata from the mem
137a0 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e  ory mapping usin
137b0 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a  g memcpy().  */.
137c0 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69    if( offset<pFi
137d0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
137e0 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61      if( offset+a
137f0 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  mt <= pFile->mma
13800 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d  pSize ){.      m
13810 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75  emcpy(pBuf, &((u
13820 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70  8 *)(pFile->pMap
13830 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d  Region))[offset]
13840 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 4f 53  , amt);.      OS
13850 54 52 41 43 45 28 28 22 52 45 41 44 2d 4d 4d 41  TRACE(("READ-MMA
13860 50 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  P pid=%lu, pFile
13870 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63  =%p, file=%p, rc
13880 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
13890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
138a0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
138b0 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
138c0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
138d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
138e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
138f0 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28     int nCopy = (
13900 69 6e 74 29 28 70 46 69 6c 65 2d 3e 6d 6d 61 70  int)(pFile->mmap
13910 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 29 3b 0a  Size - offset);.
13920 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75        memcpy(pBu
13930 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c  f, &((u8 *)(pFil
13940 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b  e->pMapRegion))[
13950 6f 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b  offset], nCopy);
13960 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28  .      pBuf = &(
13970 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70  (u8 *)pBuf)[nCop
13980 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d  y];.      amt -=
13990 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66   nCopy;.      of
139a0 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20  fset += nCopy;. 
139b0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
139c0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
139d0 49 4e 43 45 20 7c 7c 20 64 65 66 69 6e 65 64 28  INCE || defined(
139e0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f  SQLITE_WIN32_NO_
139f0 4f 56 45 52 4c 41 50 50 45 44 29 0a 20 20 69 66  OVERLAPPED).  if
13a00 28 20 77 69 6e 53 65 65 6b 46 69 6c 65 28 70 46  ( winSeekFile(pF
13a10 69 6c 65 2c 20 6f 66 66 73 65 74 29 20 29 7b 0a  ile, offset) ){.
13a20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 52 45      OSTRACE(("RE
13a30 41 44 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  AD pid=%lu, pFil
13a40 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72  e=%p, file=%p, r
13a50 63 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22  c=SQLITE_FULL\n"
13a60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  ,.             o
13a70 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
13a80 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70  ssId(), pFile, p
13a90 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
13aa0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
13ab0 4c 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  L;.  }.  while( 
13ac0 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46 69 6c  !osReadFile(pFil
13ad0 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c  e->h, pBuf, amt,
13ae0 20 26 6e 52 65 61 64 2c 20 30 29 20 29 7b 0a 23   &nRead, 0) ){.#
13af0 65 6c 73 65 0a 20 20 6d 65 6d 73 65 74 28 26 6f  else.  memset(&o
13b00 76 65 72 6c 61 70 70 65 64 2c 20 30 2c 20 73 69  verlapped, 0, si
13b10 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29  zeof(OVERLAPPED)
13b20 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65 64 2e  );.  overlapped.
13b30 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28  Offset = (LONG)(
13b40 6f 66 66 73 65 74 20 26 20 30 78 66 66 66 66 66  offset & 0xfffff
13b50 66 66 66 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70  fff);.  overlapp
13b60 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20  ed.OffsetHigh = 
13b70 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e  (LONG)((offset>>
13b80 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66  32) & 0x7fffffff
13b90 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 52  );.  while( !osR
13ba0 65 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  eadFile(pFile->h
13bb0 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52  , pBuf, amt, &nR
13bc0 65 61 64 2c 20 26 6f 76 65 72 6c 61 70 70 65 64  ead, &overlapped
13bd0 29 20 26 26 0a 20 20 20 20 20 20 20 20 20 6f 73  ) &&.         os
13be0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 21 3d  GetLastError()!=
13bf0 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 45 4f 46  ERROR_HANDLE_EOF
13c00 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20 44   ){.#endif.    D
13c10 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  WORD lastErrno;.
13c20 20 20 20 20 69 66 28 20 77 69 6e 52 65 74 72 79      if( winRetry
13c30 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c 20 26  Ioerr(&nRetry, &
13c40 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e  lastErrno) ) con
13c50 74 69 6e 75 65 3b 0a 20 20 20 20 70 46 69 6c 65  tinue;.    pFile
13c60 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
13c70 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54  stErrno;.    OST
13c80 52 41 43 45 28 28 22 52 45 41 44 20 70 69 64 3d  RACE(("READ pid=
13c90 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66  %lu, pFile=%p, f
13ca0 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
13cb0 45 5f 49 4f 45 52 52 5f 52 45 41 44 5c 6e 22 2c  E_IOERR_READ\n",
13cc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73  .             os
13cd0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
13ce0 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
13cf0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65  ile->h));.    re
13d00 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
13d10 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45  (SQLITE_IOERR_RE
13d20 41 44 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  AD, pFile->lastE
13d30 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
13d40 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
13d50 6e 52 65 61 64 22 2c 20 70 46 69 6c 65 2d 3e 7a  nRead", pFile->z
13d60 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 77 69 6e  Path);.  }.  win
13d70 4c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72 79 2c  LogIoerr(nRetry,
13d80 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 69 66   __LINE__);.  if
13d90 28 20 6e 52 65 61 64 3c 28 44 57 4f 52 44 29 61  ( nRead<(DWORD)a
13da0 6d 74 20 29 7b 0a 20 20 20 20 2f 2a 20 55 6e 72  mt ){.    /* Unr
13db0 65 61 64 20 70 61 72 74 73 20 6f 66 20 74 68 65  ead parts of the
13dc0 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20   buffer must be 
13dd0 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20  zero-filled */. 
13de0 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61     memset(&((cha
13df0 72 2a 29 70 42 75 66 29 5b 6e 52 65 61 64 5d 2c  r*)pBuf)[nRead],
13e00 20 30 2c 20 61 6d 74 2d 6e 52 65 61 64 29 3b 0a   0, amt-nRead);.
13e10 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 52 45      OSTRACE(("RE
13e20 41 44 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  AD pid=%lu, pFil
13e30 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72  e=%p, file=%p, r
13e40 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  c=SQLITE_IOERR_S
13e50 48 4f 52 54 5f 52 45 41 44 5c 6e 22 2c 0a 20 20  HORT_READ\n",.  
13e60 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
13e70 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
13e80 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
13e90 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
13ea0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  n SQLITE_IOERR_S
13eb0 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a  HORT_READ;.  }..
13ec0 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44    OSTRACE(("READ
13ed0 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
13ee0 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  %p, file=%p, rc=
13ef0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20  SQLITE_OK\n",.  
13f00 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
13f10 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
13f20 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  , pFile, pFile->
13f30 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  h));.  return SQ
13f40 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
13f50 2a 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f  * Write data fro
13f60 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20  m a buffer into 
13f70 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20  a file.  Return 
13f80 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
13f90 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20  cess.** or some 
13fa0 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
13fb0 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a   on failure..*/.
13fc0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 57 72  static int winWr
13fd0 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ite(.  sqlite3_f
13fe0 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20  ile *id,        
13ff0 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74         /* File t
14000 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 2f 0a  o write into */.
14010 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42    const void *pB
14020 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
14030 20 20 2f 2a 20 54 68 65 20 62 79 74 65 73 20 74    /* The bytes t
14040 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a  o be written */.
14050 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20    int amt,      
14060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14070 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
14080 79 74 65 73 20 74 6f 20 77 72 69 74 65 20 2a 2f  ytes to write */
14090 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
140a0 20 6f 66 66 73 65 74 20 20 20 20 20 20 20 20 20   offset         
140b0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
140c0 6f 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  o the file to be
140d0 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a  gin writing at *
140e0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
140f0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
14100 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
14110 66 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  f error has occu
14120 72 72 65 64 2c 20 65 6c 73 65 20 66 61 6c 73 65  rred, else false
14130 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70   */.  winFile *p
14140 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
14150 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61  )id;  /* File ha
14160 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ndle */.  int nR
14170 65 74 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20  etry = 0;       
14180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
14190 62 65 72 20 6f 66 20 72 65 74 72 69 65 73 20 2a  ber of retries *
141a0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74  /..  assert( amt
141b0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
141c0 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c  pFile );.  Simul
141d0 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72  ateIOError(retur
141e0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
141f0 52 49 54 45 29 3b 0a 20 20 53 69 6d 75 6c 61 74  RITE);.  Simulat
14200 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 72  eDiskfullError(r
14210 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
14220 4c 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  L);..  OSTRACE((
14230 22 57 52 49 54 45 20 70 69 64 3d 25 6c 75 2c 20  "WRITE pid=%lu, 
14240 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25  pFile=%p, file=%
14250 70 2c 20 62 75 66 66 65 72 3d 25 70 2c 20 61 6d  p, buffer=%p, am
14260 6f 75 6e 74 3d 25 64 2c 20 22 0a 20 20 20 20 20  ount=%d, ".     
14270 20 20 20 20 20 20 22 6f 66 66 73 65 74 3d 25 6c        "offset=%l
14280 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20  ld, lock=%d\n", 
14290 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
142a0 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 0a  essId(), pFile,.
142b0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
142c0 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20  ->h, pBuf, amt, 
142d0 6f 66 66 73 65 74 2c 20 70 46 69 6c 65 2d 3e 6c  offset, pFile->l
142e0 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 20  ocktype));..#if 
142f0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
14300 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c  SIZE>0.  /* Deal
14310 20 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66   with as much of
14320 20 74 68 69 73 20 77 72 69 74 65 20 72 65 71 75   this write requ
14330 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20  est as possible 
14340 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20  by transfering. 
14350 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68   ** data from th
14360 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67  e memory mapping
14370 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e   using memcpy().
14380 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65    */.  if( offse
14390 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  t<pFile->mmapSiz
143a0 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66  e ){.    if( off
143b0 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65  set+amt <= pFile
143c0 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
143d0 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38      memcpy(&((u8
143e0 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52   *)(pFile->pMapR
143f0 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c  egion))[offset],
14400 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20   pBuf, amt);.   
14410 20 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49     OSTRACE(("WRI
14420 54 45 2d 4d 4d 41 50 20 70 69 64 3d 25 6c 75 2c  TE-MMAP pid=%lu,
14430 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d   pFile=%p, file=
14440 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
14450 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
14460 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
14470 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
14480 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  le, pFile->h));.
14490 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
144a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
144b0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  e{.      int nCo
144c0 70 79 20 3d 20 28 69 6e 74 29 28 70 46 69 6c 65  py = (int)(pFile
144d0 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66  ->mmapSize - off
144e0 73 65 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  set);.      memc
144f0 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c  py(&((u8 *)(pFil
14500 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b  e->pMapRegion))[
14510 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 6e  offset], pBuf, n
14520 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75  Copy);.      pBu
14530 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66  f = &((u8 *)pBuf
14540 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20  )[nCopy];.      
14550 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20  amt -= nCopy;.  
14560 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43      offset += nC
14570 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  opy;.    }.  }.#
14580 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
14590 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 64 65  E_OS_WINCE || de
145a0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
145b0 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44  32_NO_OVERLAPPED
145c0 29 0a 20 20 72 63 20 3d 20 77 69 6e 53 65 65 6b  ).  rc = winSeek
145d0 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73  File(pFile, offs
145e0 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30  et);.  if( rc==0
145f0 20 29 7b 0a 23 65 6c 73 65 0a 20 20 7b 0a 23 65   ){.#else.  {.#e
14600 6e 64 69 66 0a 23 69 66 20 21 53 51 4c 49 54 45  ndif.#if !SQLITE
14610 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 64 65  _OS_WINCE && !de
14620 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
14630 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44  32_NO_OVERLAPPED
14640 29 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44  ).    OVERLAPPED
14650 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20 20   overlapped;    
14660 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73 65      /* The offse
14670 74 20 66 6f 72 20 57 72 69 74 65 46 69 6c 65 2e  t for WriteFile.
14680 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 75   */.#endif.    u
14690 38 20 2a 61 52 65 6d 20 3d 20 28 75 38 20 2a 29  8 *aRem = (u8 *)
146a0 70 42 75 66 3b 20 20 20 20 20 20 20 20 2f 2a 20  pBuf;        /* 
146b0 44 61 74 61 20 79 65 74 20 74 6f 20 62 65 20 77  Data yet to be w
146c0 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e  ritten */.    in
146d0 74 20 6e 52 65 6d 20 3d 20 61 6d 74 3b 20 20 20  t nRem = amt;   
146e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
146f0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 79  umber of bytes y
14700 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  et to be written
14710 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6e 57   */.    DWORD nW
14720 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
14730 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 77        /* Bytes w
14740 72 69 74 74 65 6e 20 62 79 20 65 61 63 68 20 57  ritten by each W
14750 72 69 74 65 46 69 6c 65 28 29 20 63 61 6c 6c 20  riteFile() call 
14760 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73  */.    DWORD las
14770 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f  tErrno = NO_ERRO
14780 52 3b 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65  R;   /* Value re
14790 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61 73  turned by GetLas
147a0 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 23 69 66  tError() */..#if
147b0 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
147c0 45 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  E && !defined(SQ
147d0 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56  LITE_WIN32_NO_OV
147e0 45 52 4c 41 50 50 45 44 29 0a 20 20 20 20 6d 65  ERLAPPED).    me
147f0 6d 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65 64  mset(&overlapped
14800 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52  , 0, sizeof(OVER
14810 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76  LAPPED));.    ov
14820 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20  erlapped.Offset 
14830 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20  = (LONG)(offset 
14840 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  & 0xffffffff);. 
14850 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66     overlapped.Of
14860 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47  fsetHigh = (LONG
14870 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26  )((offset>>32) &
14880 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 23 65   0x7fffffff);.#e
14890 6e 64 69 66 0a 0a 20 20 20 20 77 68 69 6c 65 28  ndif..    while(
148a0 20 6e 52 65 6d 3e 30 20 29 7b 0a 23 69 66 20 53   nRem>0 ){.#if S
148b0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
148c0 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
148d0 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41  _WIN32_NO_OVERLA
148e0 50 50 45 44 29 0a 20 20 20 20 20 20 69 66 28 20  PPED).      if( 
148f0 21 6f 73 57 72 69 74 65 46 69 6c 65 28 70 46 69  !osWriteFile(pFi
14900 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65  le->h, aRem, nRe
14910 6d 2c 20 26 6e 57 72 69 74 65 2c 20 30 29 20 29  m, &nWrite, 0) )
14920 7b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69 66  {.#else.      if
14930 28 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28 70  ( !osWriteFile(p
14940 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e  File->h, aRem, n
14950 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 26 6f  Rem, &nWrite, &o
14960 76 65 72 6c 61 70 70 65 64 29 20 29 7b 0a 23 65  verlapped) ){.#e
14970 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66 28  ndif.        if(
14980 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26   winRetryIoerr(&
14990 6e 52 65 74 72 79 2c 20 26 6c 61 73 74 45 72 72  nRetry, &lastErr
149a0 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  no) ) continue;.
149b0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
149c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
149d0 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c  ert( nWrite==0 |
149e0 7c 20 6e 57 72 69 74 65 3c 3d 28 44 57 4f 52 44  | nWrite<=(DWORD
149f0 29 6e 52 65 6d 20 29 3b 0a 20 20 20 20 20 20 69  )nRem );.      i
14a00 66 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20  f( nWrite==0 || 
14a10 6e 57 72 69 74 65 3e 28 44 57 4f 52 44 29 6e 52  nWrite>(DWORD)nR
14a20 65 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61  em ){.        la
14a30 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
14a40 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
14a50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
14a60 20 7d 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f   }.#if !SQLITE_O
14a70 53 5f 57 49 4e 43 45 20 26 26 20 21 64 65 66 69  S_WINCE && !defi
14a80 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
14a90 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a  _NO_OVERLAPPED).
14aa0 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20        offset += 
14ab0 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6f 76  nWrite;.      ov
14ac0 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20  erlapped.Offset 
14ad0 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20  = (LONG)(offset 
14ae0 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  & 0xffffffff);. 
14af0 20 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e       overlapped.
14b00 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f  OffsetHigh = (LO
14b10 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29  NG)((offset>>32)
14b20 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a   & 0x7fffffff);.
14b30 23 65 6e 64 69 66 0a 20 20 20 20 20 20 61 52 65  #endif.      aRe
14b40 6d 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20  m += nWrite;.   
14b50 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 57 72 69 74     nRem -= nWrit
14b60 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
14b70 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20 20   nRem>0 ){.     
14b80 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
14b90 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
14ba0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
14bb0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
14bc0 20 29 7b 0a 20 20 20 20 69 66 28 20 20 20 28 20   ){.    if(   ( 
14bd0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
14be0 3d 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 44  ==ERROR_HANDLE_D
14bf0 49 53 4b 5f 46 55 4c 4c 20 29 0a 20 20 20 20 20  ISK_FULL ).     
14c00 20 20 7c 7c 20 28 20 70 46 69 6c 65 2d 3e 6c 61    || ( pFile->la
14c10 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 44  stErrno==ERROR_D
14c20 49 53 4b 5f 46 55 4c 4c 20 29 29 7b 0a 20 20 20  ISK_FULL )){.   
14c30 20 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49     OSTRACE(("WRI
14c40 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  TE pid=%lu, pFil
14c50 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72  e=%p, file=%p, r
14c60 63 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22  c=SQLITE_FULL\n"
14c70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14c80 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
14c90 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
14ca0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
14cb0 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
14cc0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 46 55 4c  Error(SQLITE_FUL
14cd0 4c 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  L, pFile->lastEr
14ce0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
14cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
14d00 69 6e 57 72 69 74 65 31 22 2c 20 70 46 69 6c 65  inWrite1", pFile
14d10 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
14d20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 57 52      OSTRACE(("WR
14d30 49 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ITE pid=%lu, pFi
14d40 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20  le=%p, file=%p, 
14d50 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
14d60 57 52 49 54 45 5c 6e 22 2c 0a 20 20 20 20 20 20  WRITE\n",.      
14d70 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
14d80 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
14d90 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29  pFile, pFile->h)
14da0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69  );.    return wi
14db0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
14dc0 5f 49 4f 45 52 52 5f 57 52 49 54 45 2c 20 70 46  _IOERR_WRITE, pF
14dd0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
14de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14df0 20 20 20 20 20 20 20 22 77 69 6e 57 72 69 74 65         "winWrite
14e00 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  2", pFile->zPath
14e10 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
14e20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 6e 52 65 74  winLogIoerr(nRet
14e30 72 79 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  ry, __LINE__);. 
14e40 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57   }.  OSTRACE(("W
14e50 52 49 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  RITE pid=%lu, pF
14e60 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c  ile=%p, file=%p,
14e70 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
14e80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
14e90 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
14ea0 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69  Id(), pFile, pFi
14eb0 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72  le->h));.  retur
14ec0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
14ed0 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61  /*.** Truncate a
14ee0 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61  n open file to a
14ef0 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a   specified size.
14f00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
14f10 6e 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65  nTruncate(sqlite
14f20 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69  3_file *id, sqli
14f30 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29  te3_int64 nByte)
14f40 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  {.  winFile *pFi
14f50 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
14f60 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64  d;  /* File hand
14f70 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  le object */.  i
14f80 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14f90 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
14fa0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 6f  * Return code fo
14fb0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
14fc0 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  */.  DWORD lastE
14fd0 72 72 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  rrno;..  assert(
14fe0 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75   pFile );.  Simu
14ff0 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
15000 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
15010 54 52 55 4e 43 41 54 45 29 3b 0a 20 20 4f 53 54  TRUNCATE);.  OST
15020 52 41 43 45 28 28 22 54 52 55 4e 43 41 54 45 20  RACE(("TRUNCATE 
15030 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
15040 70 2c 20 66 69 6c 65 3d 25 70 2c 20 73 69 7a 65  p, file=%p, size
15050 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e  =%lld, lock=%d\n
15060 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
15070 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
15080 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
15090 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 2c 20 70  ile->h, nByte, p
150a0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29  File->locktype))
150b0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75  ;..  /* If the u
150c0 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72  ser has configur
150d0 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20  ed a chunk-size 
150e0 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74  for this file, t
150f0 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a  runcate the.  **
15100 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74   file so that it
15110 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20   consists of an 
15120 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f  integer number o
15130 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74  f chunks (i.e. t
15140 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66  he.  ** actual f
15150 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20 74  ile size after t
15160 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79  he operation may
15170 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20   be larger than 
15180 74 68 65 20 72 65 71 75 65 73 74 65 64 0a 20 20  the requested.  
15190 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20  ** size)..  */. 
151a0 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68   if( pFile->szCh
151b0 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79  unk>0 ){.    nBy
151c0 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70  te = ((nByte + p
151d0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20  File->szChunk - 
151e0 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  1)/pFile->szChun
151f0 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68  k) * pFile->szCh
15200 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  unk;.  }..  /* S
15210 65 74 45 6e 64 4f 66 46 69 6c 65 28 29 20 72 65  etEndOfFile() re
15220 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77  turns non-zero w
15230 68 65 6e 20 73 75 63 63 65 73 73 66 75 6c 2c 20  hen successful, 
15240 6f 72 20 7a 65 72 6f 20 77 68 65 6e 20 69 74 20  or zero when it 
15250 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 69 66 28 20  fails. */.  if( 
15260 77 69 6e 53 65 65 6b 46 69 6c 65 28 70 46 69 6c  winSeekFile(pFil
15270 65 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20 20 20  e, nByte) ){.   
15280 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
15290 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  r(SQLITE_IOERR_T
152a0 52 55 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e  RUNCATE, pFile->
152b0 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
152c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152d0 22 77 69 6e 54 72 75 6e 63 61 74 65 31 22 2c 20  "winTruncate1", 
152e0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
152f0 20 7d 65 6c 73 65 20 69 66 28 20 30 3d 3d 6f 73   }else if( 0==os
15300 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 70 46 69  SetEndOfFile(pFi
15310 6c 65 2d 3e 68 29 20 26 26 0a 20 20 20 20 20 20  le->h) &&.      
15320 20 20 20 20 20 20 28 28 6c 61 73 74 45 72 72 6e        ((lastErrn
15330 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
15340 6f 72 28 29 29 21 3d 45 52 52 4f 52 5f 55 53 45  or())!=ERROR_USE
15350 52 5f 4d 41 50 50 45 44 5f 46 49 4c 45 29 20 29  R_MAPPED_FILE) )
15360 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
15370 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
15380 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e  no;.    rc = win
15390 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
153a0 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20  IOERR_TRUNCATE, 
153b0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
153c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
153d0 20 20 20 20 20 20 20 22 77 69 6e 54 72 75 6e 63         "winTrunc
153e0 61 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  ate2", pFile->zP
153f0 61 74 68 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53  ath);.  }..#if S
15400 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
15410 49 5a 45 3e 30 0a 20 20 2f 2a 20 49 66 20 74 68  IZE>0.  /* If th
15420 65 20 66 69 6c 65 20 77 61 73 20 74 72 75 6e 63  e file was trunc
15430 61 74 65 64 20 74 6f 20 61 20 73 69 7a 65 20 73  ated to a size s
15440 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
15450 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 6d  currently.  ** m
15460 61 70 70 65 64 20 72 65 67 69 6f 6e 2c 20 72 65  apped region, re
15470 64 75 63 65 20 74 68 65 20 65 66 66 65 63 74 69  duce the effecti
15480 76 65 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20  ve mapping size 
15490 61 73 20 77 65 6c 6c 2e 20 53 51 4c 69 74 65 20  as well. SQLite 
154a0 77 69 6c 6c 0a 20 20 2a 2a 20 75 73 65 20 72 65  will.  ** use re
154b0 61 64 28 29 20 61 6e 64 20 77 72 69 74 65 28 29  ad() and write()
154c0 20 74 6f 20 61 63 63 65 73 73 20 64 61 74 61 20   to access data 
154d0 62 65 79 6f 6e 64 20 74 68 69 73 20 70 6f 69 6e  beyond this poin
154e0 74 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 0a 20  t from now on.. 
154f0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
15500 3e 70 4d 61 70 52 65 67 69 6f 6e 20 26 26 20 6e  >pMapRegion && n
15510 42 79 74 65 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70  Byte<pFile->mmap
15520 53 69 7a 65 20 29 7b 0a 20 20 20 20 70 46 69 6c  Size ){.    pFil
15530 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 42  e->mmapSize = nB
15540 79 74 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  yte;.  }.#endif.
15550 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 55  .  OSTRACE(("TRU
15560 4e 43 41 54 45 20 70 69 64 3d 25 6c 75 2c 20 70  NCATE pid=%lu, p
15570 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70  File=%p, file=%p
15580 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
15590 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
155a0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
155b0 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c  pFile, pFile->h,
155c0 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
155d0 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  rc)));.  return 
155e0 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
155f0 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20  LITE_TEST./*.** 
15600 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
15610 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e   of fullsyncs an
15620 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20  d normal syncs. 
15630 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
15640 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79   test.** that sy
15650 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63  ncs and fullsync
15660 73 20 61 72 65 20 6f 63 63 75 72 69 6e 67 20 61  s are occuring a
15670 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65  t the right time
15680 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
15690 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30  3_sync_count = 0
156a0 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75  ;.int sqlite3_fu
156b0 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30  llsync_count = 0
156c0 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
156d0 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72  Make sure all wr
156e0 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63  ites to a partic
156f0 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f  ular file are co
15700 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e  mmitted to disk.
15710 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
15720 69 6e 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66  inSync(sqlite3_f
15730 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61  ile *id, int fla
15740 67 73 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  gs){.#ifndef SQL
15750 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 2f 2a  ITE_NO_SYNC.  /*
15760 0a 20 20 2a 2a 20 55 73 65 64 20 6f 6e 6c 79 20  .  ** Used only 
15770 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  when SQLITE_NO_S
15780 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  YNC is not defin
15790 65 64 2e 0a 20 20 20 2a 2f 0a 20 20 42 4f 4f 4c  ed..   */.  BOOL
157a0 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20   rc;.#endif.#if 
157b0 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
157c0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
157d0 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 7c 7c 20  ITE_NO_SYNC) || 
157e0 5c 0a 20 20 20 20 28 64 65 66 69 6e 65 64 28 53  \.    (defined(S
157f0 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 64  QLITE_TEST) && d
15800 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
15810 42 55 47 29 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20  BUG)).  /*.  ** 
15820 55 73 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45  Used when SQLITE
15830 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20  _NO_SYNC is not 
15840 64 65 66 69 6e 65 64 20 61 6e 64 20 62 79 20 74  defined and by t
15850 68 65 20 61 73 73 65 72 74 28 29 20 61 6e 64 2f  he assert() and/
15860 6f 72 0a 20 20 2a 2a 20 4f 53 54 52 41 43 45 28  or.  ** OSTRACE(
15870 29 20 6d 61 63 72 6f 73 2e 0a 20 20 20 2a 2f 0a  ) macros..   */.
15880 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
15890 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
158a0 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
158b0 50 41 52 41 4d 45 54 45 52 28 69 64 29 3b 0a 23  PARAMETER(id);.#
158c0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
158d0 20 70 46 69 6c 65 20 29 3b 0a 20 20 2f 2a 20 43   pFile );.  /* C
158e0 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66  heck that one of
158f0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
15900 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20  MAL or FULL was 
15910 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65  passed */.  asse
15920 72 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d  rt((flags&0x0F)=
15930 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52  =SQLITE_SYNC_NOR
15940 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c  MAL.      || (fl
15950 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
15960 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b  E_SYNC_FULL.  );
15970 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e  ..  /* Unix cann
15980 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73  ot, but some sys
15990 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20  tems may return 
159a0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d  SQLITE_FULL from
159b0 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a   here. This.  **
159c0 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74   line is to test
159d0 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64   that doing so d
159e0 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e  oes not cause an
159f0 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f  y problems..  */
15a00 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
15a10 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e  ullError( return
15a20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a   SQLITE_FULL );.
15a30 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e  .  OSTRACE(("SYN
15a40 43 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  C pid=%lu, pFile
15a50 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 66 6c  =%p, file=%p, fl
15a60 61 67 73 3d 25 78 2c 20 6c 6f 63 6b 3d 25 64 5c  ags=%x, lock=%d\
15a70 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
15a80 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
15a90 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70  ssId(), pFile, p
15aa0 46 69 6c 65 2d 3e 68 2c 20 66 6c 61 67 73 2c 0a  File->h, flags,.
15ab0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
15ac0 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23  ->locktype));..#
15ad0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 54 45  ifndef SQLITE_TE
15ae0 53 54 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ST.  UNUSED_PARA
15af0 4d 45 54 45 52 28 66 6c 61 67 73 29 3b 0a 23 65  METER(flags);.#e
15b00 6c 73 65 0a 20 20 69 66 28 20 28 66 6c 61 67 73  lse.  if( (flags
15b10 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
15b20 59 4e 43 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  YNC_FULL ){.    
15b30 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
15b40 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20  _count++;.  }.  
15b50 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
15b60 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nt++;.#endif..  
15b70 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65  /* If we compile
15b80 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  d with the SQLIT
15b90 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20  E_NO_SYNC flag, 
15ba0 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20  then syncing is 
15bb0 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a  a.  ** no-op.  *
15bc0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
15bd0 4e 4f 5f 53 59 4e 43 0a 20 20 4f 53 54 52 41 43  NO_SYNC.  OSTRAC
15be0 45 28 28 22 53 59 4e 43 2d 4e 4f 50 20 70 69 64  E(("SYNC-NOP pid
15bf0 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
15c00 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
15c10 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
15c20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
15c30 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
15c40 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  ile, pFile->h));
15c50 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
15c60 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20  _OK;.#else.  rc 
15c70 3d 20 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66  = osFlushFileBuf
15c80 66 65 72 73 28 70 46 69 6c 65 2d 3e 68 29 3b 0a  fers(pFile->h);.
15c90 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
15ca0 72 28 20 72 63 3d 46 41 4c 53 45 20 29 3b 0a 20  r( rc=FALSE );. 
15cb0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 4f   if( rc ){.    O
15cc0 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 70 69  STRACE(("SYNC pi
15cd0 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
15ce0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
15cf0 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20  ITE_OK\n",.     
15d00 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
15d10 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
15d20 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
15d30 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
15d40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
15d50 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  e{.    pFile->la
15d60 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
15d70 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
15d80 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 70  OSTRACE(("SYNC p
15d90 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
15da0 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  , file=%p, rc=SQ
15db0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
15dc0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
15dd0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
15de0 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
15df0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
15e00 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
15e10 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
15e20 52 5f 46 53 59 4e 43 2c 20 70 46 69 6c 65 2d 3e  R_FSYNC, pFile->
15e30 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
15e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e50 20 20 22 77 69 6e 53 79 6e 63 22 2c 20 70 46 69    "winSync", pFi
15e60 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  le->zPath);.  }.
15e70 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
15e80 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75  Determine the cu
15e90 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20  rrent size of a 
15ea0 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f  file in bytes.*/
15eb0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46  .static int winF
15ec0 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  ileSize(sqlite3_
15ed0 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65  file *id, sqlite
15ee0 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b  3_int64 *pSize){
15ef0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
15f00 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
15f10 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
15f20 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
15f30 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73  t( id!=0 );.  as
15f40 73 65 72 74 28 20 70 53 69 7a 65 21 3d 30 20 29  sert( pSize!=0 )
15f50 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
15f60 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
15f70 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a  E_IOERR_FSTAT);.
15f80 20 20 4f 53 54 52 41 43 45 28 28 22 53 49 5a 45    OSTRACE(("SIZE
15f90 20 66 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d   file=%p, pSize=
15fa0 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %p\n", pFile->h,
15fb0 20 70 53 69 7a 65 29 29 3b 0a 0a 23 69 66 20 53   pSize));..#if S
15fc0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
15fd0 20 7b 0a 20 20 20 20 46 49 4c 45 5f 53 54 41 4e   {.    FILE_STAN
15fe0 44 41 52 44 5f 49 4e 46 4f 20 69 6e 66 6f 3b 0a  DARD_INFO info;.
15ff0 20 20 20 20 69 66 28 20 6f 73 47 65 74 46 69 6c      if( osGetFil
16000 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61  eInformationByHa
16010 6e 64 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68 2c  ndleEx(pFile->h,
16020 20 46 69 6c 65 53 74 61 6e 64 61 72 64 49 6e 66   FileStandardInf
16030 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
16040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16050 20 20 20 20 20 20 20 20 26 69 6e 66 6f 2c 20 73          &info, s
16060 69 7a 65 6f 66 28 69 6e 66 6f 29 29 20 29 7b 0a  izeof(info)) ){.
16070 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 69        *pSize = i
16080 6e 66 6f 2e 45 6e 64 4f 66 46 69 6c 65 2e 51 75  nfo.EndOfFile.Qu
16090 61 64 50 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73  adPart;.    }els
160a0 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e{.      pFile->
160b0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
160c0 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
160d0 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
160e0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
160f0 52 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e  R_FSTAT, pFile->
16100 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
16110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16120 20 20 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c    "winFileSize",
16130 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
16140 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a      }.  }.#else.
16150 20 20 7b 0a 20 20 20 20 44 57 4f 52 44 20 75 70    {.    DWORD up
16160 70 65 72 42 69 74 73 3b 0a 20 20 20 20 44 57 4f  perBits;.    DWO
16170 52 44 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20  RD lowerBits;.  
16180 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
16190 6f 3b 0a 0a 20 20 20 20 6c 6f 77 65 72 42 69 74  o;..    lowerBit
161a0 73 20 3d 20 6f 73 47 65 74 46 69 6c 65 53 69 7a  s = osGetFileSiz
161b0 65 28 70 46 69 6c 65 2d 3e 68 2c 20 26 75 70 70  e(pFile->h, &upp
161c0 65 72 42 69 74 73 29 3b 0a 20 20 20 20 2a 70 53  erBits);.    *pS
161d0 69 7a 65 20 3d 20 28 28 28 73 71 6c 69 74 65 33  ize = (((sqlite3
161e0 5f 69 6e 74 36 34 29 75 70 70 65 72 42 69 74 73  _int64)upperBits
161f0 29 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69  )<<32) + lowerBi
16200 74 73 3b 0a 20 20 20 20 69 66 28 20 20 20 28 6c  ts;.    if(   (l
16210 6f 77 65 72 42 69 74 73 20 3d 3d 20 49 4e 56 41  owerBits == INVA
16220 4c 49 44 5f 46 49 4c 45 5f 53 49 5a 45 29 0a 20  LID_FILE_SIZE). 
16230 20 20 20 20 20 20 26 26 20 28 28 6c 61 73 74 45        && ((lastE
16240 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
16250 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52  Error())!=NO_ERR
16260 4f 52 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  OR) ){.      pFi
16270 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
16280 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
16290 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
162a0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  r(SQLITE_IOERR_F
162b0 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  STAT, pFile->las
162c0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
162d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
162e0 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46  winFileSize", pF
162f0 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
16300 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
16310 4f 53 54 52 41 43 45 28 28 22 53 49 5a 45 20 66  OSTRACE(("SIZE f
16320 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25 70  ile=%p, pSize=%p
16330 2c 20 2a 70 53 69 7a 65 3d 25 6c 6c 64 2c 20 72  , *pSize=%lld, r
16340 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
16350 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53      pFile->h, pS
16360 69 7a 65 2c 20 2a 70 53 69 7a 65 2c 20 73 71 6c  ize, *pSize, sql
16370 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
16380 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
16390 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c  }../*.** LOCKFIL
163a0 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
163b0 4c 59 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  LY is undefined 
163c0 6f 6e 20 73 6f 6d 65 20 57 69 6e 64 6f 77 73 20  on some Windows 
163d0 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e  systems..*/.#ifn
163e0 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49  def LOCKFILE_FAI
163f0 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 0a 23 20  L_IMMEDIATELY.# 
16400 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f  define LOCKFILE_
16410 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
16420 20 31 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64   1.#endif..#ifnd
16430 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c  ef LOCKFILE_EXCL
16440 55 53 49 56 45 5f 4c 4f 43 4b 0a 23 20 64 65 66  USIVE_LOCK.# def
16450 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43  ine LOCKFILE_EXC
16460 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 32 0a 23 65  LUSIVE_LOCK 2.#e
16470 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 69 73 74  ndif../*.** Hist
16480 6f 72 69 63 61 6c 6c 79 2c 20 53 51 4c 69 74 65  orically, SQLite
16490 20 68 61 73 20 75 73 65 64 20 62 6f 74 68 20 74   has used both t
164a0 68 65 20 4c 6f 63 6b 46 69 6c 65 20 61 6e 64 20  he LockFile and 
164b0 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74  LockFileEx funct
164c0 69 6f 6e 73 2e 0a 2a 2a 20 57 68 65 6e 20 74 68  ions..** When th
164d0 65 20 4c 6f 63 6b 46 69 6c 65 20 66 75 6e 63 74  e LockFile funct
164e0 69 6f 6e 20 77 61 73 20 75 73 65 64 2c 20 69 74  ion was used, it
164f0 20 77 61 73 20 61 6c 77 61 79 73 20 65 78 70 65   was always expe
16500 63 74 65 64 20 74 6f 20 66 61 69 6c 0a 2a 2a 20  cted to fail.** 
16510 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74  immediately if t
16520 68 65 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f  he lock could no
16530 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 20 20  t be obtained.  
16540 41 6c 73 6f 2c 20 69 74 20 61 6c 77 61 79 73 20  Also, it always 
16550 65 78 70 65 63 74 65 64 20 74 6f 0a 2a 2a 20 6f  expected to.** o
16560 62 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69  btain an exclusi
16570 76 65 20 6c 6f 63 6b 2e 20 20 54 68 65 73 65 20  ve lock.  These 
16580 66 6c 61 67 73 20 61 72 65 20 75 73 65 64 20 77  flags are used w
16590 69 74 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65  ith the LockFile
165a0 45 78 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  Ex function.** a
165b0 6e 64 20 72 65 66 6c 65 63 74 20 74 68 6f 73 65  nd reflect those
165c0 20 65 78 70 65 63 74 61 74 69 6f 6e 73 3b 20 74   expectations; t
165d0 68 65 72 65 66 6f 72 65 2c 20 74 68 65 79 20 73  herefore, they s
165e0 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 68 61  hould not be cha
165f0 6e 67 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  nged..*/.#ifndef
16600 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
16610 5f 46 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20  _FLAGS.# define 
16620 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f  SQLITE_LOCKFILE_
16630 46 4c 41 47 53 20 20 20 28 4c 4f 43 4b 46 49 4c  FLAGS   (LOCKFIL
16640 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
16650 4c 59 20 7c 20 5c 0a 20 20 20 20 20 20 20 20 20  LY | \.         
16660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16670 20 20 20 20 20 20 20 20 20 4c 4f 43 4b 46 49 4c           LOCKFIL
16680 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  E_EXCLUSIVE_LOCK
16690 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
166a0 43 75 72 72 65 6e 74 6c 79 2c 20 53 51 4c 69 74  Currently, SQLit
166b0 65 20 6e 65 76 65 72 20 63 61 6c 6c 73 20 74 68  e never calls th
166c0 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e  e LockFileEx fun
166d0 63 74 69 6f 6e 20 77 69 74 68 6f 75 74 20 77 61  ction without wa
166e0 6e 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63 61 6c  nting the.** cal
166f0 6c 20 74 6f 20 66 61 69 6c 20 69 6d 6d 65 64 69  l to fail immedi
16700 61 74 65 6c 79 20 69 66 20 74 68 65 20 6c 6f 63  ately if the loc
16710 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61  k cannot be obta
16720 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ined..*/.#ifndef
16730 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
16740 45 58 5f 46 4c 41 47 53 0a 23 20 64 65 66 69 6e  EX_FLAGS.# defin
16750 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  e SQLITE_LOCKFIL
16760 45 45 58 5f 46 4c 41 47 53 20 28 4c 4f 43 4b 46  EEX_FLAGS (LOCKF
16770 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
16780 54 45 4c 59 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TELY).#endif../*
16790 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65  .** Acquire a re
167a0 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69  ader lock..** Di
167b0 66 66 65 72 65 6e 74 20 41 50 49 20 72 6f 75 74  fferent API rout
167c0 69 6e 65 73 20 61 72 65 20 63 61 6c 6c 65 64 20  ines are called 
167d0 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
167e0 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 69 73  ther or not this
167f0 0a 2a 2a 20 69 73 20 57 69 6e 39 78 20 6f 72 20  .** is Win9x or 
16800 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74 61 74 69 63  WinNT..*/.static
16810 20 69 6e 74 20 77 69 6e 47 65 74 52 65 61 64 4c   int winGetReadL
16820 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69  ock(winFile *pFi
16830 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  le){.  int res;.
16840 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44    OSTRACE(("READ
16850 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c  -LOCK file=%p, l
16860 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  ock=%d\n", pFile
16870 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
16880 74 79 70 65 29 29 3b 0a 20 20 69 66 28 20 6f 73  type));.  if( os
16890 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51  IsNT() ){.#if SQ
168a0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
168b0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45    /*.    ** NOTE
168c0 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20  : Windows CE is 
168d0 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e  handled differen
168e0 74 6c 79 20 68 65 72 65 20 64 75 65 20 69 74 73  tly here due its
168f0 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e   lack of the Win
16900 33 32 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  32.    **       
16910 41 50 49 20 4c 6f 63 6b 46 69 6c 65 45 78 2e 0a  API LockFileEx..
16920 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d      */.    res =
16930 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26   winceLockFile(&
16940 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
16950 5f 46 49 52 53 54 2c 20 30 2c 20 31 2c 20 30 29  _FIRST, 0, 1, 0)
16960 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 65 73 20  ;.#else.    res 
16970 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
16980 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f  File->h, SQLITE_
16990 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53  LOCKFILEEX_FLAGS
169a0 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
169b0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
169c0 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
169d0 53 49 5a 45 2c 20 30 29 3b 0a 23 65 6e 64 69 66  SIZE, 0);.#endif
169e0 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
169f0 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
16a00 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 69 6e  I.  else{.    in
16a10 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65  t lk;.    sqlite
16a20 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
16a30 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20  eof(lk), &lk);. 
16a40 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
16a50 4c 6f 63 6b 42 79 74 65 20 3d 20 28 73 68 6f 72  LockByte = (shor
16a60 74 29 28 28 6c 6b 20 26 20 30 78 37 66 66 66 66  t)((lk & 0x7ffff
16a70 66 66 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a  fff)%(SHARED_SIZ
16a80 45 20 2d 20 31 29 29 3b 0a 20 20 20 20 72 65 73  E - 1));.    res
16a90 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
16aa0 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
16ab0 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c  _LOCKFILE_FLAGS,
16ac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16ad0 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49         SHARED_FI
16ae0 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65  RST+pFile->share
16af0 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c  dLockByte, 0, 1,
16b00 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
16b10 20 20 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29    if( res == 0 )
16b20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
16b30 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
16b40 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 2f  stError();.    /
16b50 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6c 6f 67  * No need to log
16b60 20 61 20 66 61 69 6c 75 72 65 20 74 6f 20 6c 6f   a failure to lo
16b70 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 4f 53 54 52  ck */.  }.  OSTR
16b80 41 43 45 28 28 22 52 45 41 44 2d 4c 4f 43 4b 20  ACE(("READ-LOCK 
16b90 66 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d  file=%p, result=
16ba0 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
16bb0 20 72 65 73 29 29 3b 0a 20 20 72 65 74 75 72 6e   res));.  return
16bc0 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55   res;.}../*.** U
16bd0 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a  ndo a readlock.*
16be0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
16bf0 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77  UnlockReadLock(w
16c00 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
16c10 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 44 57 4f    int res;.  DWO
16c20 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  RD lastErrno;.  
16c30 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 55  OSTRACE(("READ-U
16c40 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c  NLOCK file=%p, l
16c50 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  ock=%d\n", pFile
16c60 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
16c70 74 79 70 65 29 29 3b 0a 20 20 69 66 28 20 6f 73  type));.  if( os
16c80 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 72 65  IsNT() ){.    re
16c90 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c  s = winUnlockFil
16ca0 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  e(&pFile->h, SHA
16cb0 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48  RED_FIRST, 0, SH
16cc0 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20  ARED_SIZE, 0);. 
16cd0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
16ce0 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
16cf0 20 20 65 6c 73 65 7b 0a 20 20 20 20 72 65 73 20    else{.    res 
16d00 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28  = winUnlockFile(
16d10 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45  &pFile->h, SHARE
16d20 44 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73  D_FIRST+pFile->s
16d30 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30  haredLockByte, 0
16d40 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , 1, 0);.  }.#en
16d50 64 69 66 0a 20 20 69 66 28 20 72 65 73 3d 3d 30  dif.  if( res==0
16d60 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20   && ((lastErrno 
16d70 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
16d80 28 29 29 21 3d 45 52 52 4f 52 5f 4e 4f 54 5f 4c  ())!=ERROR_NOT_L
16d90 4f 43 4b 45 44 29 20 29 7b 0a 20 20 20 20 70 46  OCKED) ){.    pF
16da0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
16db0 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
16dc0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
16dd0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c  TE_IOERR_UNLOCK,
16de0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
16df0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
16e00 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 52 65 61     "winUnlockRea
16e10 64 4c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a  dLock", pFile->z
16e20 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 4f 53 54  Path);.  }.  OST
16e30 52 41 43 45 28 28 22 52 45 41 44 2d 55 4e 4c 4f  RACE(("READ-UNLO
16e40 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65 73 75  CK file=%p, resu
16e50 6c 74 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  lt=%d\n", pFile-
16e60 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20 72 65 74  >h, res));.  ret
16e70 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
16e80 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
16e90 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
16ea0 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
16eb0 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20  eter locktype - 
16ec0 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
16ed0 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
16ee0 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
16ef0 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
16f00 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
16f10 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
16f20 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
16f30 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
16f40 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
16f50 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
16f60 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
16f70 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
16f80 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
16f90 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
16fa0 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
16fb0 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
16fc0 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
16fd0 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
16fe0 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
16ff0 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
17000 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
17010 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
17020 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
17030 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
17040 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
17050 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
17060 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
17070 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
17080 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
17090 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
170a0 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
170b0 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
170c0 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
170d0 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
170e0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
170f0 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
17100 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
17110 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
17120 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
17130 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
17140 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
17150 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 54 68 65  ase a lock.  The
17160 20 77 69 6e 55 6e 6c 6f 63 6b 28 29 20 72 6f 75   winUnlock() rou
17170 74 69 6e 65 0a 2a 2a 20 65 72 61 73 65 73 20 61  tine.** erases a
17180 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 6f 6e 63 65  ll locks at once
17190 20 61 6e 64 20 72 65 74 75 72 6e 73 20 75 73 20   and returns us 
171a0 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6c  immediately to l
171b0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a  ocking level 0..
171c0 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  ** It is not pos
171d0 73 69 62 6c 65 20 74 6f 20 6c 6f 77 65 72 20 74  sible to lower t
171e0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
171f0 20 6f 6e 65 20 73 74 65 70 20 61 74 20 61 20 74   one step at a t
17200 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d 75 73  ime.  You.** mus
17210 74 20 67 6f 20 73 74 72 61 69 67 68 74 20 74 6f  t go straight to
17220 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30   locking level 0
17230 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17240 77 69 6e 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  winLock(sqlite3_
17250 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
17260 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72  cktype){.  int r
17270 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
17280 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
17290 20 66 72 6f 6d 20 73 75 62 72 6f 75 74 69 6e 65   from subroutine
172a0 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d  s */.  int res =
172b0 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   1;           /*
172c0 20 52 65 73 75 6c 74 20 6f 66 20 61 20 57 69 6e   Result of a Win
172d0 64 6f 77 73 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a  dows lock call *
172e0 2f 0a 20 20 69 6e 74 20 6e 65 77 4c 6f 63 6b 74  /.  int newLockt
172f0 79 70 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 65  ype;       /* Se
17300 74 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  t pFile->locktyp
17310 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20  e to this value 
17320 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a  before exiting *
17330 2f 0a 20 20 69 6e 74 20 67 6f 74 50 65 6e 64 69  /.  int gotPendi
17340 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20 54 72  ngLock = 0;/* Tr
17350 75 65 20 69 66 20 77 65 20 61 63 71 75 69 72 65  ue if we acquire
17360 64 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  d a PENDING lock
17370 20 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a 20 20   this time */.  
17380 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
17390 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20   (winFile*)id;. 
173a0 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
173b0 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 0a 20 20   = NO_ERROR;..  
173c0 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
173d0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
173e0 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c 6f  K file=%p, oldLo
173f0 63 6b 3d 25 64 28 25 64 29 2c 20 6e 65 77 4c 6f  ck=%d(%d), newLo
17400 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ck=%d\n",.      
17410 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70       pFile->h, p
17420 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  File->locktype, 
17430 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63  pFile->sharedLoc
17440 6b 42 79 74 65 2c 20 6c 6f 63 6b 74 79 70 65 29  kByte, locktype)
17450 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
17460 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c  e is already a l
17470 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65  ock of this type
17480 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63   or more restric
17490 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  tive on the.  **
174a0 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68   OsFile, do noth
174b0 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74  ing. Don't use t
174c0 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69  he end_lock: exi
174d0 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20  t path, as.  ** 
174e0 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75  sqlite3OsEnterMu
174f0 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65  tex() hasn't bee
17500 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20  n called yet..  
17510 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
17520 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79  locktype>=lockty
17530 70 65 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  pe ){.    OSTRAC
17540 45 28 28 22 4c 4f 43 4b 2d 48 45 4c 44 20 66 69  E(("LOCK-HELD fi
17550 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
17560 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
17570 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
17580 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
17590 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
175a0 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e  e locking sequen
175b0 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20  ce is correct.  
175c0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
175d0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f  le->locktype!=NO
175e0 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70  _LOCK || locktyp
175f0 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
17600 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
17610 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  type!=PENDING_LO
17620 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
17630 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56  locktype!=RESERV
17640 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65  ED_LOCK || pFile
17650 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ->locktype==SHAR
17660 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  ED_LOCK );..  /*
17670 20 4c 6f 63 6b 20 74 68 65 20 50 45 4e 44 49 4e   Lock the PENDIN
17680 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 66 20 77  G_LOCK byte if w
17690 65 20 6e 65 65 64 20 74 6f 20 61 63 71 75 69 72  e need to acquir
176a0 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  e a PENDING lock
176b0 20 6f 72 0a 20 20 2a 2a 20 61 20 53 48 41 52 45   or.  ** a SHARE
176c0 44 20 6c 6f 63 6b 2e 20 20 49 66 20 77 65 20 61  D lock.  If we a
176d0 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53  re acquiring a S
176e0 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
176f0 61 63 71 75 69 73 69 74 69 6f 6e 20 6f 66 0a 20  acquisition of. 
17700 20 2a 2a 20 74 68 65 20 50 45 4e 44 49 4e 47 5f   ** the PENDING_
17710 4c 4f 43 4b 20 62 79 74 65 20 69 73 20 74 65 6d  LOCK byte is tem
17720 70 6f 72 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6e  porary..  */.  n
17730 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 70 46 69  ewLocktype = pFi
17740 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  le->locktype;.  
17750 69 66 28 20 20 20 28 70 46 69 6c 65 2d 3e 6c 6f  if(   (pFile->lo
17760 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 29  cktype==NO_LOCK)
17770 0a 20 20 20 20 20 7c 7c 20 28 20 20 20 28 6c 6f  .     || (   (lo
17780 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
17790 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 20  E_LOCK).        
177a0 20 26 26 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b   && (pFile->lock
177b0 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c  type==RESERVED_L
177c0 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 69  OCK)).  ){.    i
177d0 6e 74 20 63 6e 74 20 3d 20 33 3b 0a 20 20 20 20  nt cnt = 3;.    
177e0 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e 30 20 26  while( cnt-->0 &
177f0 26 20 28 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b  & (res = winLock
17800 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
17810 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f  SQLITE_LOCKFILE_
17820 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20  FLAGS,.         
17830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17850 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c  PENDING_BYTE, 0,
17860 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20   1, 0))==0 ){.  
17870 20 20 20 20 2f 2a 20 54 72 79 20 33 20 74 69 6d      /* Try 3 tim
17880 65 73 20 74 6f 20 67 65 74 20 74 68 65 20 70 65  es to get the pe
17890 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20 20 54 68 69  nding lock.  Thi
178a0 73 20 69 73 20 6e 65 65 64 65 64 20 74 6f 20 77  s is needed to w
178b0 6f 72 6b 0a 20 20 20 20 20 20 2a 2a 20 61 72 6f  ork.      ** aro
178c0 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20 63 61 75  und problems cau
178d0 73 65 64 20 62 79 20 69 6e 64 65 78 69 6e 67 20  sed by indexing 
178e0 61 6e 64 2f 6f 72 20 61 6e 74 69 2d 76 69 72 75  and/or anti-viru
178f0 73 20 73 6f 66 74 77 61 72 65 20 6f 6e 0a 20 20  s software on.  
17900 20 20 20 20 2a 2a 20 57 69 6e 64 6f 77 73 20 73      ** Windows s
17910 79 73 74 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2a  ystems..      **
17920 20 49 66 20 79 6f 75 20 61 72 65 20 75 73 69 6e   If you are usin
17930 67 20 74 68 69 73 20 63 6f 64 65 20 61 73 20 61  g this code as a
17940 20 6d 6f 64 65 6c 20 66 6f 72 20 61 6c 74 65 72   model for alter
17950 6e 61 74 69 76 65 20 56 46 53 65 73 2c 20 64 6f  native VFSes, do
17960 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f   not.      ** co
17970 70 79 20 74 68 69 73 20 72 65 74 72 79 20 6c 6f  py this retry lo
17980 67 69 63 2e 20 20 49 74 20 69 73 20 61 20 68 61  gic.  It is a ha
17990 63 6b 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20  ck intended for 
179a0 57 69 6e 64 6f 77 73 20 6f 6e 6c 79 2e 0a 20 20  Windows only..  
179b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6c 61 73      */.      las
179c0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
179d0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
179e0 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d   OSTRACE(("LOCK-
179f0 50 45 4e 44 49 4e 47 2d 46 41 49 4c 20 66 69 6c  PENDING-FAIL fil
17a00 65 3d 25 70 2c 20 63 6f 75 6e 74 3d 25 64 2c 20  e=%p, count=%d, 
17a10 72 65 73 75 6c 74 3d 25 64 5c 6e 22 2c 0a 20 20  result=%d\n",.  
17a20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69               pFi
17a30 6c 65 2d 3e 68 2c 20 63 6e 74 2c 20 72 65 73 29  le->h, cnt, res)
17a40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 61 73  );.      if( las
17a50 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 49 4e  tErrno==ERROR_IN
17a60 56 41 4c 49 44 5f 48 41 4e 44 4c 45 20 29 7b 0a  VALID_HANDLE ){.
17a70 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
17a80 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
17a90 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 63  rrno;.        rc
17aa0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
17ab0 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 4f 53  LOCK;.        OS
17ac0 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d 46 41 49  TRACE(("LOCK-FAI
17ad0 4c 20 66 69 6c 65 3d 25 70 2c 20 63 6f 75 6e 74  L file=%p, count
17ae0 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%d, rc=%s\n",. 
17af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b00 70 46 69 6c 65 2d 3e 68 2c 20 63 6e 74 2c 20 73  pFile->h, cnt, s
17b10 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
17b20 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  )));.        ret
17b30 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
17b40 20 20 20 20 20 20 69 66 28 20 63 6e 74 20 29 20        if( cnt ) 
17b50 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c  sqlite3_win32_sl
17b60 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20  eep(1);.    }.  
17b70 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b    gotPendingLock
17b80 20 3d 20 72 65 73 3b 0a 20 20 20 20 69 66 28 20   = res;.    if( 
17b90 21 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6c 61  !res ){.      la
17ba0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
17bb0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
17bc0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75  }.  }..  /* Acqu
17bd0 69 72 65 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ire a shared loc
17be0 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  k.  */.  if( loc
17bf0 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
17c00 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  CK && res ){.   
17c10 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
17c20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43  locktype==NO_LOC
17c30 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77  K );.    res = w
17c40 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 46  inGetReadLock(pF
17c50 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72 65  ile);.    if( re
17c60 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f  s ){.      newLo
17c70 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f  cktype = SHARED_
17c80 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LOCK;.    }else{
17c90 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f  .      lastErrno
17ca0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
17cb0 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  r();.    }.  }..
17cc0 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52    /* Acquire a R
17cd0 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20 2a  ESERVED lock.  *
17ce0 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
17cf0 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
17d00 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73  && res ){.    as
17d10 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
17d20 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
17d30 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  CK );.    res = 
17d40 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69  winLockFile(&pFi
17d50 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f  le->h, SQLITE_LO
17d60 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 52 45  CKFILE_FLAGS, RE
17d70 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
17d80 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  1, 0);.    if( r
17d90 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  es ){.      newL
17da0 6f 63 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56  ocktype = RESERV
17db0 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  ED_LOCK;.    }el
17dc0 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72  se{.      lastEr
17dd0 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
17de0 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20  rror();.    }.  
17df0 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20  }..  /* Acquire 
17e00 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20  a PENDING lock. 
17e10 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
17e20 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
17e30 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  CK && res ){.   
17e40 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50   newLocktype = P
17e50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20  ENDING_LOCK;.   
17e60 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
17e70 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  = 0;.  }..  /* A
17e80 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53  cquire an EXCLUS
17e90 49 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20  IVE lock.  */.  
17ea0 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
17eb0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
17ec0 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72  res ){.    asser
17ed0 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
17ee0 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe>=SHARED_LOCK 
17ef0 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  );.    res = win
17f00 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70  UnlockReadLock(p
17f10 46 69 6c 65 29 3b 0a 20 20 20 20 72 65 73 20 3d  File);.    res =
17f20 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
17f30 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
17f40 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 53  OCKFILE_FLAGS, S
17f50 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a  HARED_FIRST, 0,.
17f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f70 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a        SHARED_SIZ
17f80 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  E, 0);.    if( r
17f90 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  es ){.      newL
17fa0 6f 63 6b 74 79 70 65 20 3d 20 45 58 43 4c 55 53  ocktype = EXCLUS
17fb0 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65  IVE_LOCK;.    }e
17fc0 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45  lse{.      lastE
17fd0 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
17fe0 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77  Error();.      w
17ff0 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 46  inGetReadLock(pF
18000 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ile);.    }.  }.
18010 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20  .  /* If we are 
18020 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44 49 4e  holding a PENDIN
18030 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75 67 68  G lock that ough
18040 74 20 74 6f 20 62 65 20 72 65 6c 65 61 73 65 64  t to be released
18050 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 6c 65  , then.  ** rele
18060 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f  ase it now..  */
18070 0a 20 20 69 66 28 20 67 6f 74 50 65 6e 64 69 6e  .  if( gotPendin
18080 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74 79 70  gLock && locktyp
18090 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
180a0 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46  {.    winUnlockF
180b0 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50  ile(&pFile->h, P
180c0 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20  ENDING_BYTE, 0, 
180d0 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  1, 0);.  }..  /*
180e0 20 55 70 64 61 74 65 20 74 68 65 20 73 74 61 74   Update the stat
180f0 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68 61  e of the lock ha
18100 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66 69  s held in the fi
18110 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68  le descriptor th
18120 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 74  en.  ** return t
18130 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 72  he appropriate r
18140 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f  esult code..  */
18150 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20  .  if( res ){.  
18160 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
18170 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
18180 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
18190 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
181a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
181b0 59 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  Y;.    OSTRACE((
181c0 22 4c 4f 43 4b 2d 46 41 49 4c 20 66 69 6c 65 3d  "LOCK-FAIL file=
181d0 25 70 2c 20 77 61 6e 74 65 64 3d 25 64 2c 20 67  %p, wanted=%d, g
181e0 6f 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ot=%d\n",.      
181f0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
18200 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f   locktype, newLo
18210 63 6b 74 79 70 65 29 29 3b 0a 20 20 7d 0a 20 20  cktype));.  }.  
18220 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
18230 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74 79 70  = (u8)newLocktyp
18240 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  e;.  OSTRACE(("L
18250 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63  OCK file=%p, loc
18260 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  k=%d, rc=%s\n",.
18270 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
18280 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
18290 74 79 70 65 2c 20 73 71 6c 69 74 65 33 45 72 72  type, sqlite3Err
182a0 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65  Name(rc)));.  re
182b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
182c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
182d0 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
182e0 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
182f0 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
18300 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
18310 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
18320 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
18330 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
18340 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  held, return.** 
18350 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65 72 77  non-zero, otherw
18360 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  ise zero..*/.sta
18370 74 69 63 20 69 6e 74 20 77 69 6e 43 68 65 63 6b  tic int winCheck
18380 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
18390 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
183a0 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
183b0 69 6e 74 20 72 65 73 3b 0a 20 20 77 69 6e 46 69  int res;.  winFi
183c0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
183d0 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d  File*)id;..  Sim
183e0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
183f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
18400 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
18410 4f 43 4b 3b 20 29 3b 0a 20 20 4f 53 54 52 41 43  OCK; );.  OSTRAC
18420 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b  E(("TEST-WR-LOCK
18430 20 66 69 6c 65 3d 25 70 2c 20 70 52 65 73 4f 75   file=%p, pResOu
18440 74 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  t=%p\n", pFile->
18450 68 2c 20 70 52 65 73 4f 75 74 29 29 3b 0a 0a 20  h, pResOut));.. 
18460 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
18470 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  ;.  if( pFile->l
18480 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56 45  ocktype>=RESERVE
18490 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
184a0 73 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52 41  s = 1;.    OSTRA
184b0 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43  CE(("TEST-WR-LOC
184c0 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c  K file=%p, resul
184d0 74 3d 25 64 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c  t=%d (local)\n",
184e0 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29   pFile->h, res))
184f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
18500 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  es = winLockFile
18510 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49  (&pFile->h, SQLI
18520 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c  TE_LOCKFILEEX_FL
18530 41 47 53 2c 52 45 53 45 52 56 45 44 5f 42 59 54  AGS,RESERVED_BYT
18540 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20  E, 0, 1, 0);.   
18550 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
18560 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28    winUnlockFile(
18570 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52  &pFile->h, RESER
18580 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  VED_BYTE, 0, 1, 
18590 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  0);.    }.    re
185a0 73 20 3d 20 21 72 65 73 3b 0a 20 20 20 20 4f 53  s = !res;.    OS
185b0 54 52 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d  TRACE(("TEST-WR-
185c0 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65  LOCK file=%p, re
185d0 73 75 6c 74 3d 25 64 20 28 72 65 6d 6f 74 65 29  sult=%d (remote)
185e0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
185f0 65 73 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  es));.  }.  *pRe
18600 73 4f 75 74 20 3d 20 72 65 73 3b 0a 20 20 4f 53  sOut = res;.  OS
18610 54 52 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d  TRACE(("TEST-WR-
18620 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 70 52  LOCK file=%p, pR
18630 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65 73 4f  esOut=%p, *pResO
18640 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49 54 45  ut=%d, rc=SQLITE
18650 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  _OK\n",.        
18660 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 52 65     pFile->h, pRe
18670 73 4f 75 74 2c 20 2a 70 52 65 73 4f 75 74 29 29  sOut, *pResOut))
18680 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
18690 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  E_OK;.}../*.** L
186a0 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
186b0 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
186c0 65 73 63 72 69 70 74 6f 72 20 69 64 20 74 6f 20  escriptor id to 
186d0 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74  locktype.  lockt
186e0 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ype.** must be e
186f0 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
18700 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
18710 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
18720 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
18730 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
18740 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
18750 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
18760 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
18770 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
18780 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
18790 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20  **.** It is not 
187a0 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69  possible for thi
187b0 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 61 69  s routine to fai
187c0 6c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  l if the second 
187d0 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e  argument.** is N
187e0 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65 20  O_LOCK.  If the 
187f0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
18800 69 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 74  is SHARED_LOCK t
18810 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
18820 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74 75 72 6e  .** might return
18830 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 2a   SQLITE_IOERR;.*
18840 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
18850 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
18860 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
18870 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 74 79  ktype){.  int ty
18880 70 65 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  pe;.  winFile *p
18890 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
188a0 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  )id;.  int rc = 
188b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
188c0 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b  ert( pFile!=0 );
188d0 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
188e0 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype<=SHARED_LOCK
188f0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
18900 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  UNLOCK file=%p, 
18910 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c 20  oldLock=%d(%d), 
18920 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20  newLock=%d\n",. 
18930 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
18940 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  >h, pFile->lockt
18950 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72  ype, pFile->shar
18960 65 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63 6b  edLockByte, lock
18970 74 79 70 65 29 29 3b 0a 20 20 74 79 70 65 20 3d  type));.  type =
18980 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
18990 3b 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 45 58  ;.  if( type>=EX
189a0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
189b0 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c      winUnlockFil
189c0 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  e(&pFile->h, SHA
189d0 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48  RED_FIRST, 0, SH
189e0 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20  ARED_SIZE, 0);. 
189f0 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d     if( locktype=
18a00 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20  =SHARED_LOCK && 
18a10 21 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28  !winGetReadLock(
18a20 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 20 20  pFile) ){.      
18a30 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  /* This should n
18a40 65 76 65 72 20 68 61 70 70 65 6e 2e 20 20 57 65  ever happen.  We
18a50 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
18a60 65 20 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20  e able to.      
18a70 2a 2a 20 72 65 61 63 71 75 69 72 65 20 74 68 65  ** reacquire the
18a80 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20   read lock */.  
18a90 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
18aa0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
18ab0 52 5f 55 4e 4c 4f 43 4b 2c 20 6f 73 47 65 74 4c  R_UNLOCK, osGetL
18ac0 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
18ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ae0 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c 20     "winUnlock", 
18af0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
18b00 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74     }.  }.  if( t
18b10 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype>=RESERVED_LO
18b20 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c  CK ){.    winUnl
18b30 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
18b40 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  h, RESERVED_BYTE
18b50 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 1, 0);.  }.
18b60 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
18b70 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e  NO_LOCK && type>
18b80 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
18b90 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61      winUnlockRea
18ba0 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  dLock(pFile);.  
18bb0 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 50 45  }.  if( type>=PE
18bc0 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20  NDING_LOCK ){.  
18bd0 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28    winUnlockFile(
18be0 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49  &pFile->h, PENDI
18bf0 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  NG_BYTE, 0, 1, 0
18c00 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e  );.  }.  pFile->
18c10 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29 6c  locktype = (u8)l
18c20 6f 63 6b 74 79 70 65 3b 0a 20 20 4f 53 54 52 41  ocktype;.  OSTRA
18c30 43 45 28 28 22 55 4e 4c 4f 43 4b 20 66 69 6c 65  CE(("UNLOCK file
18c40 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 72 63  =%p, lock=%d, rc
18c50 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
18c60 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69     pFile->h, pFi
18c70 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 73 71  le->locktype, sq
18c80 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
18c90 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
18ca0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41  .}../*.** If *pA
18cb0 72 67 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  rg is initially 
18cc0 6e 65 67 61 74 69 76 65 20 74 68 65 6e 20 74 68  negative then th
18cd0 69 73 20 69 73 20 61 20 71 75 65 72 79 2e 20 20  is is a query.  
18ce0 53 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20  Set *pArg to.** 
18cf0 31 20 6f 72 20 30 20 64 65 70 65 6e 64 69 6e 67  1 or 0 depending
18d00 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
18d10 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f 66 20 70  ot bit mask of p
18d20 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
18d30 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  is set..**.** If
18d40 20 2a 70 41 72 67 20 69 73 20 30 20 6f 72 20 31   *pArg is 0 or 1
18d50 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 6f 72 20  , then clear or 
18d60 73 65 74 20 74 68 65 20 6d 61 73 6b 20 62 69 74  set the mask bit
18d70 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46   of pFile->ctrlF
18d80 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lags..*/.static 
18d90 76 6f 69 64 20 77 69 6e 4d 6f 64 65 42 69 74 28  void winModeBit(
18da0 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  winFile *pFile, 
18db0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d 61  unsigned char ma
18dc0 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a  sk, int *pArg){.
18dd0 20 20 69 66 28 20 2a 70 41 72 67 3c 30 20 29 7b    if( *pArg<0 ){
18de0 0a 20 20 20 20 2a 70 41 72 67 20 3d 20 28 70 46  .    *pArg = (pF
18df0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
18e00 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c   mask)!=0;.  }el
18e10 73 65 20 69 66 28 20 28 2a 70 41 72 67 29 3d 3d  se if( (*pArg)==
18e20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 ){.    pFile->
18e30 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61  ctrlFlags &= ~ma
18e40 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  sk;.  }else{.   
18e50 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
18e60 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d  s |= mask;.  }.}
18e70 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
18e80 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 68  erences to VFS h
18e90 65 6c 70 65 72 20 6d 65 74 68 6f 64 73 20 75 73  elper methods us
18ea0 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79  ed for temporary
18eb0 20 66 69 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63   files */.static
18ec0 20 69 6e 74 20 77 69 6e 47 65 74 54 65 6d 70 6e   int winGetTempn
18ed0 61 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ame(sqlite3_vfs 
18ee0 2a 2c 20 63 68 61 72 20 2a 2a 29 3b 0a 73 74 61  *, char **);.sta
18ef0 74 69 63 20 69 6e 74 20 77 69 6e 49 73 44 69 72  tic int winIsDir
18f00 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 29 3b 0a  (const void *);.
18f10 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49  static BOOL winI
18f20 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43  sDriveLetterAndC
18f30 6f 6c 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  olon(const char 
18f40 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 72  *);../*.** Contr
18f50 6f 6c 20 61 6e 64 20 71 75 65 72 79 20 6f 66 20  ol and query of 
18f60 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 68 61  the open file ha
18f70 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndle..*/.static 
18f80 69 6e 74 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72  int winFileContr
18f90 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ol(sqlite3_file 
18fa0 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69  *id, int op, voi
18fb0 64 20 2a 70 41 72 67 29 7b 0a 20 20 77 69 6e 46  d *pArg){.  winF
18fc0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
18fd0 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 4f 53 54  nFile*)id;.  OST
18fe0 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
18ff0 65 3d 25 70 2c 20 6f 70 3d 25 64 2c 20 70 41 72  e=%p, op=%d, pAr
19000 67 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  g=%p\n", pFile->
19010 68 2c 20 6f 70 2c 20 70 41 72 67 29 29 3b 0a 20  h, op, pArg));. 
19020 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
19030 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
19040 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20  CNTL_LOCKSTATE: 
19050 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70  {.      *(int*)p
19060 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63  Arg = pFile->loc
19070 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 4f 53 54  ktype;.      OST
19080 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
19090 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
190a0 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
190b0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
190c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
190d0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
190e0 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20  _LAST_ERRNO: {. 
190f0 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
19100 20 3d 20 28 69 6e 74 29 70 46 69 6c 65 2d 3e 6c   = (int)pFile->l
19110 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
19120 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
19130 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
19140 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
19150 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  >h));.      retu
19160 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
19170 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
19180 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f  ITE_FCNTL_CHUNK_
19190 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46  SIZE: {.      pF
191a0 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a  ile->szChunk = *
191b0 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20  (int *)pArg;.   
191c0 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e     OSTRACE(("FCN
191d0 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  TL file=%p, rc=S
191e0 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
191f0 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72  le->h));.      r
19200 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19210 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
19220 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a  SQLITE_FCNTL_SIZ
19230 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20  E_HINT: {.      
19240 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  if( pFile->szChu
19250 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  nk>0 ){.        
19260 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 6c  sqlite3_int64 ol
19270 64 53 7a 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  dSz;.        int
19280 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a   rc = winFileSiz
19290 65 28 69 64 2c 20 26 6f 6c 64 53 7a 29 3b 0a 20  e(id, &oldSz);. 
192a0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
192b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
192c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
192d0 74 36 34 20 6e 65 77 53 7a 20 3d 20 2a 28 73 71  t64 newSz = *(sq
192e0 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 70 41 72  lite3_int64*)pAr
192f0 67 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  g;.          if(
19300 20 6e 65 77 53 7a 3e 6f 6c 64 53 7a 20 29 7b 0a   newSz>oldSz ){.
19310 20 20 20 20 20 20 20 20 20 20 20 20 53 69 6d 75              Simu
19320 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
19330 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n(1);.          
19340 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61    rc = winTrunca
19350 74 65 28 69 64 2c 20 6e 65 77 53 7a 29 3b 0a 20  te(id, newSz);. 
19360 20 20 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c             Simul
19370 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
19380 28 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  (0);.          }
19390 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
193a0 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e     OSTRACE(("FCN
193b0 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25  TL file=%p, rc=%
193c0 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  s\n", pFile->h, 
193d0 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
193e0 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65  c)));.        re
193f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
19400 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
19410 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
19420 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
19430 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
19440 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19450 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
19460 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
19470 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a  _PERSIST_WAL: {.
19480 20 20 20 20 20 20 69 6e 74 20 62 50 65 72 73 69        int bPersi
19490 73 74 20 3d 20 2a 28 69 6e 74 2a 29 70 41 72 67  st = *(int*)pArg
194a0 3b 0a 20 20 20 20 20 20 69 66 28 20 62 50 65 72  ;.      if( bPer
194b0 73 69 73 74 3c 30 20 29 7b 0a 20 20 20 20 20 20  sist<0 ){.      
194c0 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20    *(int*)pArg = 
194d0 70 46 69 6c 65 2d 3e 62 50 65 72 73 69 73 74 57  pFile->bPersistW
194e0 61 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  al;.      }else{
194f0 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
19500 62 50 65 72 73 69 73 74 57 61 6c 20 3d 20 62 50  bPersistWal = bP
19510 65 72 73 69 73 74 21 3d 30 3b 0a 20 20 20 20 20  ersist!=0;.     
19520 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
19530 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
19540 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
19550 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57  _FCNTL_PERSIST_W
19560 41 4c 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d  AL: {.      winM
19570 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 57 49  odeBit(pFile, WI
19580 4e 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41  NFILE_PERSIST_WA
19590 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a  L, (int*)pArg);.
195a0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
195b0 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
195c0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
195d0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
195e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
195f0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
19600 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
19610 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
19620 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e  ITE: {.      win
19630 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 57  ModeBit(pFile, W
19640 49 4e 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e  INFILE_PSOW, (in
19650 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20  t*)pArg);.      
19660 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
19670 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
19680 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
19690 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  >h));.      retu
196a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
196b0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
196c0 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d  ITE_FCNTL_VFSNAM
196d0 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63 68 61  E: {.      *(cha
196e0 72 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74  r**)pArg = sqlit
196f0 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
19700 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e   pFile->pVfs->zN
19710 61 6d 65 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  ame);.      OSTR
19720 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65  ACE(("FCNTL file
19730 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
19740 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
19750 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
19760 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
19770 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
19780 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41 56 5f 52  FCNTL_WIN32_AV_R
19790 45 54 52 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e  ETRY: {.      in
197a0 74 20 2a 61 20 3d 20 28 69 6e 74 2a 29 70 41 72  t *a = (int*)pAr
197b0 67 3b 0a 20 20 20 20 20 20 69 66 28 20 61 5b 30  g;.      if( a[0
197c0 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77  ]>0 ){.        w
197d0 69 6e 49 6f 65 72 72 52 65 74 72 79 20 3d 20 61  inIoerrRetry = a
197e0 5b 30 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  [0];.      }else
197f0 7b 0a 20 20 20 20 20 20 20 20 61 5b 30 5d 20 3d  {.        a[0] =
19800 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 3b 0a   winIoerrRetry;.
19810 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
19820 28 20 61 5b 31 5d 3e 30 20 29 7b 0a 20 20 20 20  ( a[1]>0 ){.    
19830 20 20 20 20 77 69 6e 49 6f 65 72 72 52 65 74 72      winIoerrRetr
19840 79 44 65 6c 61 79 20 3d 20 61 5b 31 5d 3b 0a 20  yDelay = a[1];. 
19850 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
19860 20 20 20 20 61 5b 31 5d 20 3d 20 77 69 6e 49 6f      a[1] = winIo
19870 65 72 72 52 65 74 72 79 44 65 6c 61 79 3b 0a 20  errRetryDelay;. 
19880 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54       }.      OST
19890 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
198a0 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
198b0 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
198c0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
198d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
198e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
198f0 45 53 54 0a 20 20 20 20 63 61 73 65 20 53 51 4c  EST.    case SQL
19900 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f  ITE_FCNTL_WIN32_
19910 53 45 54 5f 48 41 4e 44 4c 45 3a 20 7b 0a 20 20  SET_HANDLE: {.  
19920 20 20 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46      LPHANDLE phF
19930 69 6c 65 20 3d 20 28 4c 50 48 41 4e 44 4c 45 29  ile = (LPHANDLE)
19940 70 41 72 67 3b 0a 20 20 20 20 20 20 48 41 4e 44  pArg;.      HAND
19950 4c 45 20 68 4f 6c 64 46 69 6c 65 20 3d 20 70 46  LE hOldFile = pF
19960 69 6c 65 2d 3e 68 3b 0a 20 20 20 20 20 20 70 46  ile->h;.      pF
19970 69 6c 65 2d 3e 68 20 3d 20 2a 70 68 46 69 6c 65  ile->h = *phFile
19980 3b 0a 20 20 20 20 20 20 2a 70 68 46 69 6c 65 20  ;.      *phFile 
19990 3d 20 68 4f 6c 64 46 69 6c 65 3b 0a 20 20 20 20  = hOldFile;.    
199a0 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
199b0 4c 20 6f 6c 64 46 69 6c 65 3d 25 70 2c 20 6e 65  L oldFile=%p, ne
199c0 77 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c  wFile=%p, rc=SQL
199d0 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20  ITE_OK\n",.     
199e0 20 20 20 20 20 20 20 20 20 20 68 4f 6c 64 46 69            hOldFi
199f0 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  le, pFile->h));.
19a00 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
19a10 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65  ITE_OK;.    }.#e
19a20 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 53 51  ndif.    case SQ
19a30 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46  LITE_FCNTL_TEMPF
19a40 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20  ILENAME: {.     
19a50 20 63 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d 20   char *zTFile = 
19a60 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  0;.      int rc 
19a70 3d 20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65  = winGetTempname
19a80 28 70 46 69 6c 65 2d 3e 70 56 66 73 2c 20 26 7a  (pFile->pVfs, &z
19a90 54 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66  TFile);.      if
19aa0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
19ab0 29 7b 0a 20 20 20 20 20 20 20 20 2a 28 63 68 61  ){.        *(cha
19ac0 72 2a 2a 29 70 41 72 67 20 3d 20 7a 54 46 69 6c  r**)pArg = zTFil
19ad0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
19ae0 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
19af0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c   file=%p, rc=%s\
19b00 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71  n", pFile->h, sq
19b10 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
19b20 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
19b30 20 72 63 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53   rc;.    }.#if S
19b40 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
19b50 49 5a 45 3e 30 0a 20 20 20 20 63 61 73 65 20 53  IZE>0.    case S
19b60 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50  QLITE_FCNTL_MMAP
19b70 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69  _SIZE: {.      i
19b80 36 34 20 6e 65 77 4c 69 6d 69 74 20 3d 20 2a 28  64 newLimit = *(
19b90 69 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  i64*)pArg;.     
19ba0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
19bb0 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  _OK;.      if( n
19bc0 65 77 4c 69 6d 69 74 3e 73 71 6c 69 74 65 33 47  ewLimit>sqlite3G
19bd0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d  lobalConfig.mxMm
19be0 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65  ap ){.        ne
19bf0 77 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  wLimit = sqlite3
19c00 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d  GlobalConfig.mxM
19c10 6d 61 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  map;.      }.   
19c20 20 20 20 2a 28 69 36 34 2a 29 70 41 72 67 20 3d     *(i64*)pArg =
19c30 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
19c40 4d 61 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  Max;.      if( n
19c50 65 77 4c 69 6d 69 74 3e 3d 30 20 26 26 20 6e 65  ewLimit>=0 && ne
19c60 77 4c 69 6d 69 74 21 3d 70 46 69 6c 65 2d 3e 6d  wLimit!=pFile->m
19c70 6d 61 70 53 69 7a 65 4d 61 78 20 26 26 20 70 46  mapSizeMax && pF
19c80 69 6c 65 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d  ile->nFetchOut==
19c90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  0 ){.        pFi
19ca0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  le->mmapSizeMax 
19cb0 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 20 20  = newLimit;.    
19cc0 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d      if( pFile->m
19cd0 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20  mapSize>0 ){.   
19ce0 20 20 20 20 20 20 20 77 69 6e 55 6e 6d 61 70 66         winUnmapf
19cf0 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ile(pFile);.    
19d00 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4d 61        rc = winMa
19d10 70 66 69 6c 65 28 70 46 69 6c 65 2c 20 2d 31 29  pfile(pFile, -1)
19d20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
19d30 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43    }.      OSTRAC
19d40 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
19d50 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69  p, rc=%s\n", pFi
19d60 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72  le->h, sqlite3Er
19d70 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20  rName(rc)));.   
19d80 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
19d90 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
19da0 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
19db0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
19dc0 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 5c 6e 22 2c  ITE_NOTFOUND\n",
19dd0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72   pFile->h));.  r
19de0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
19df0 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  FOUND;.}../*.** 
19e00 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f  Return the secto
19e10 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  r size in bytes 
19e20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  of the underlyin
19e30 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66  g block device f
19e40 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66  or.** the specif
19e50 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69  ied file. This i
19e60 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20  s almost always 
19e70 35 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d  512 bytes, but m
19e80 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20  ay be.** larger 
19e90 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73  for some devices
19ea0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63  ..**.** SQLite c
19eb0 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73  ode assumes this
19ec0 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74   function cannot
19ed0 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61   fail. It also a
19ee0 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69  ssumes that.** i
19ef0 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20  f two files are 
19f00 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73  created in the s
19f10 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ame file-system 
19f20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a  directory (i.e..
19f30 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e  ** a database an
19f40 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69  d its journal fi
19f50 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63  le) that the sec
19f60 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  tor size will be
19f70 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72   the.** same for
19f80 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63   both..*/.static
19f90 20 69 6e 74 20 77 69 6e 53 65 63 74 6f 72 53 69   int winSectorSi
19fa0 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
19fb0 2a 69 64 29 7b 0a 20 20 28 76 6f 69 64 29 69 64  *id){.  (void)id
19fc0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
19fd0 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52  E_DEFAULT_SECTOR
19fe0 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _SIZE;.}../*.** 
19ff0 52 65 74 75 72 6e 20 61 20 76 65 63 74 6f 72 20  Return a vector 
1a000 6f 66 20 64 65 76 69 63 65 20 63 68 61 72 61 63  of device charac
1a010 74 65 72 69 73 74 69 63 73 2e 0a 2a 2f 0a 73 74  teristics..*/.st
1a020 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 76 69  atic int winDevi
1a030 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1a040 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
1a050 69 64 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  id){.  winFile *
1a060 70 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  p = (winFile*)id
1a070 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1a080 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41  E_IOCAP_UNDELETA
1a090 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 7c 0a  BLE_WHEN_OPEN |.
1a0a0 20 20 20 20 20 20 20 20 20 28 28 70 2d 3e 63 74           ((p->ct
1a0b0 72 6c 46 6c 61 67 73 20 26 20 57 49 4e 46 49 4c  rlFlags & WINFIL
1a0c0 45 5f 50 53 4f 57 29 3f 53 51 4c 49 54 45 5f 49  E_PSOW)?SQLITE_I
1a0d0 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
1a0e0 56 45 52 57 52 49 54 45 3a 30 29 3b 0a 7d 0a 0a  VERWRITE:0);.}..
1a0f0 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 77 69  /*.** Windows wi
1a100 6c 6c 20 6f 6e 6c 79 20 6c 65 74 20 79 6f 75 20  ll only let you 
1a110 63 72 65 61 74 65 20 66 69 6c 65 20 76 69 65 77  create file view
1a120 20 6d 61 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e 20   mappings.** on 
1a130 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20  allocation size 
1a140 67 72 61 6e 75 6c 61 72 69 74 79 20 62 6f 75 6e  granularity boun
1a150 64 61 72 69 65 73 2e 0a 2a 2a 20 44 75 72 69 6e  daries..** Durin
1a160 67 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69  g sqlite3_os_ini
1a170 74 28 29 20 77 65 20 64 6f 20 61 20 47 65 74 53  t() we do a GetS
1a180 79 73 74 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20 74  ystemInfo().** t
1a190 6f 20 67 65 74 20 74 68 65 20 67 72 61 6e 75 6c  o get the granul
1a1a0 61 72 69 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a 73  arity size..*/.s
1a1b0 74 61 74 69 63 20 53 59 53 54 45 4d 5f 49 4e 46  tatic SYSTEM_INF
1a1c0 4f 20 77 69 6e 53 79 73 49 6e 66 6f 3b 0a 0a 23  O winSysInfo;..#
1a1d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a1e0 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 48 65  IT_WAL../*.** He
1a1f0 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74  lper functions t
1a200 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c  o obtain and rel
1a210 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62  inquish the glob
1a220 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a  al mutex. The.**
1a230 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73   global mutex is
1a240 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74   used to protect
1a250 20 74 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66 6f   the winLockInfo
1a260 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79   objects used by
1a270 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65 2c 20 61  .** this file, a
1a280 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20  ll of which may 
1a290 62 65 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c  be shared by mul
1a2a0 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a  tiple threads..*
1a2b0 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 77 69  *.** Function wi
1a2c0 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  nShmMutexHeld() 
1a2d0 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65 72  is used to asser
1a2e0 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f  t() that the glo
1a2f0 62 61 6c 20 6d 75 74 65 78 0a 2a 2a 20 69 73 20  bal mutex.** is 
1a300 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72  held when requir
1a310 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ed. This functio
1a320 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
1a330 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74  s part of assert
1a340 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  ().** statements
1a350 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 77  . e.g..**.**   w
1a360 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28  inShmEnterMutex(
1a370 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28  ).**     assert(
1a380 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
1a390 28 29 20 29 3b 0a 2a 2a 20 20 20 77 69 6e 53 68  () );.**   winSh
1a3a0 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 0a 2a 2f  mLeaveMutex().*/
1a3b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
1a3c0 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 76 6f  ShmEnterMutex(vo
1a3d0 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  id){.  sqlite3_m
1a3e0 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74  utex_enter(sqlit
1a3f0 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
1a400 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
1a410 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74 61  _MASTER));.}.sta
1a420 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 4c  tic void winShmL
1a430 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b  eaveMutex(void){
1a440 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1a450 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75  _leave(sqlite3Mu
1a460 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
1a470 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
1a480 54 45 52 29 29 3b 0a 7d 0a 23 69 66 6e 64 65 66  TER));.}.#ifndef
1a490 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 69   NDEBUG.static i
1a4a0 6e 74 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  nt winShmMutexHe
1a4b0 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65 74  ld(void) {.  ret
1a4c0 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  urn sqlite3_mute
1a4d0 78 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 4d 75  x_held(sqlite3Mu
1a4e0 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
1a4f0 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
1a500 54 45 52 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TER));.}.#endif.
1a510 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73  ./*.** Object us
1a520 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20  ed to represent 
1a530 61 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 6f 70  a single file op
1a540 65 6e 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64  ened and mmapped
1a550 20 74 6f 20 70 72 6f 76 69 64 65 0a 2a 2a 20 73   to provide.** s
1a560 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 57  hared memory.  W
1a570 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72  hen multiple thr
1a580 65 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e  eads all referen
1a590 63 65 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 6c  ce the same.** l
1a5a0 6f 67 2d 73 75 6d 6d 61 72 79 2c 20 65 61 63 68  og-summary, each
1a5b0 20 74 68 72 65 61 64 20 68 61 73 20 69 74 73 20   thread has its 
1a5c0 6f 77 6e 20 77 69 6e 46 69 6c 65 20 6f 62 6a 65  own winFile obje
1a5d0 63 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c  ct, but they all
1a5e0 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20 73  .** point to a s
1a5f0 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 20 6f  ingle instance o
1a600 66 20 74 68 69 73 20 6f 62 6a 65 63 74 2e 20 20  f this object.  
1a610 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1a620 65 61 63 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d  each.** log-summ
1a630 61 72 79 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  ary is opened on
1a640 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63  ly once per proc
1a650 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e 53 68  ess..**.** winSh
1a660 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73  mMutexHeld() mus
1a670 74 20 62 65 20 74 72 75 65 20 77 68 65 6e 20 63  t be true when c
1a680 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72  reating or destr
1a690 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62  oying.** this ob
1a6a0 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65  ject or while re
1a6b0 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1a6c0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
1a6d0 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ields:.**.**    
1a6e0 20 20 6e 52 65 66 0a 2a 2a 20 20 20 20 20 20 70    nRef.**      p
1a6f0 4e 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  Next.**.** The f
1a700 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20  ollowing fields 
1a710 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66  are read-only af
1a720 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69  ter the object i
1a730 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a  s created:.**.**
1a740 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20        fid.**    
1a750 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a    zFilename.**.*
1a760 2a 20 45 69 74 68 65 72 20 77 69 6e 53 68 6d 4e  * Either winShmN
1a770 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62  ode.mutex must b
1a780 65 20 68 65 6c 64 20 6f 72 20 77 69 6e 53 68 6d  e held or winShm
1a790 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64  Node.nRef==0 and
1a7a0 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  .** winShmMutexH
1a7b0 65 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68  eld() is true wh
1a7c0 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  en reading or wr
1a7d0 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20  iting any other 
1a7e0 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73  field.** in this
1a7f0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
1a800 2f 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e  /.struct winShmN
1a810 6f 64 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ode {.  sqlite3_
1a820 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20  mutex *mutex;   
1a830 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61     /* Mutex to a
1a840 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63  ccess this objec
1a850 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69  t */.  char *zFi
1a860 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
1a870 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1a880 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 46 69   file */.  winFi
1a890 6c 65 20 68 46 69 6c 65 3b 20 20 20 20 20 20 20  le hFile;       
1a8a0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61        /* File ha
1a8b0 6e 64 6c 65 20 66 72 6f 6d 20 77 69 6e 4f 70 65  ndle from winOpe
1a8c0 6e 20 2a 2f 0a 0a 20 20 69 6e 74 20 73 7a 52 65  n */..  int szRe
1a8d0 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  gion;           
1a8e0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68     /* Size of sh
1a8f0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
1a900 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ons */.  int nRe
1a910 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  gion;           
1a920 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
1a930 72 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f  rray apRegion */
1a940 0a 20 20 73 74 72 75 63 74 20 53 68 6d 52 65 67  .  struct ShmReg
1a950 69 6f 6e 20 7b 0a 20 20 20 20 48 41 4e 44 4c 45  ion {.    HANDLE
1a960 20 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20   hMap;          
1a970 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c     /* File handl
1a980 65 20 66 72 6f 6d 20 43 72 65 61 74 65 46 69 6c  e from CreateFil
1a990 65 4d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 20 20  eMapping */.    
1a9a0 76 6f 69 64 20 2a 70 4d 61 70 3b 0a 20 20 7d 20  void *pMap;.  } 
1a9b0 2a 61 52 65 67 69 6f 6e 3b 0a 20 20 44 57 4f 52  *aRegion;.  DWOR
1a9c0 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20  D lastErrno;    
1a9d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69         /* The Wi
1a9e0 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d  ndows errno from
1a9f0 20 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72   the last I/O er
1aa00 72 6f 72 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 52  ror */..  int nR
1aa10 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
1aa20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1aa30 66 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73  f winShm objects
1aa40 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69   pointing to thi
1aa50 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  s */.  winShm *p
1aa60 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
1aa70 20 20 2f 2a 20 41 6c 6c 20 77 69 6e 53 68 6d 20    /* All winShm 
1aa80 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67  objects pointing
1aa90 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69   to this */.  wi
1aaa0 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 78 74 3b  nShmNode *pNext;
1aab0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
1aac0 20 69 6e 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20   in list of all 
1aad0 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  winShmNode objec
1aae0 74 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ts */.#ifdef SQL
1aaf0 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 6e  ITE_DEBUG.  u8 n
1ab00 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20  extShmId;       
1ab10 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61         /* Next a
1ab20 76 61 69 6c 61 62 6c 65 20 77 69 6e 53 68 6d 2e  vailable winShm.
1ab30 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64  id value */.#end
1ab40 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 67  if.};../*.** A g
1ab50 6c 6f 62 61 6c 20 61 72 72 61 79 20 6f 66 20 61  lobal array of a
1ab60 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62  ll winShmNode ob
1ab70 6a 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  jects..**.** The
1ab80 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
1ab90 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20  () must be true 
1aba0 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
1abb0 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 6c 69   writing this li
1abc0 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 77 69  st..*/.static wi
1abd0 6e 53 68 6d 4e 6f 64 65 20 2a 77 69 6e 53 68 6d  nShmNode *winShm
1abe0 4e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f  NodeList = 0;../
1abf0 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75  *.** Structure u
1ac00 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62  sed internally b
1ac10 79 20 74 68 69 73 20 56 46 53 20 74 6f 20 72 65  y this VFS to re
1ac20 63 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f  cord the state o
1ac30 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61  f an.** open sha
1ac40 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65  red memory conne
1ac50 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
1ac60 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
1ac70 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65  s are initialize
1ac80 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65  d when this obje
1ac90 63 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  ct is created an
1aca0 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e  d.** are read-on
1acb0 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a  ly thereafter:.*
1acc0 2a 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 70  *.**    winShm.p
1acd0 53 68 6d 4e 6f 64 65 0a 2a 2a 20 20 20 20 77 69  ShmNode.**    wi
1ace0 6e 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c  nShm.id.**.** Al
1acf0 6c 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61  l other fields a
1ad00 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20  re read/write.  
1ad10 54 68 65 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e  The winShm.pShmN
1ad20 6f 64 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20  ode->mutex must 
1ad30 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65  be held.** while
1ad40 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20 72   accessing any r
1ad50 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64 73  ead/write fields
1ad60 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 53  ..*/.struct winS
1ad70 68 6d 20 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  hm {.  winShmNod
1ad80 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20  e *pShmNode;    
1ad90 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
1ada0 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f  ing winShmNode o
1adb0 62 6a 65 63 74 20 2a 2f 0a 20 20 77 69 6e 53 68  bject */.  winSh
1adc0 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  m *pNext;       
1add0 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 77 69        /* Next wi
1ade0 6e 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61  nShm with the sa
1adf0 6d 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f  me winShmNode */
1ae00 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20  .  u8 hasMutex; 
1ae10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ae20 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67   True if holding
1ae30 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20   the winShmNode 
1ae40 6d 75 74 65 78 20 2a 2f 0a 20 20 75 31 36 20 73  mutex */.  u16 s
1ae50 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20  haredMask;      
1ae60 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
1ae70 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65   shared locks he
1ae80 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c  ld */.  u16 excl
1ae90 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
1aea0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78     /* Mask of ex
1aeb0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65  clusive locks he
1aec0 6c 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ld */.#ifdef SQL
1aed0 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 69  ITE_DEBUG.  u8 i
1aee0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1aef0 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20         /* Id of 
1af00 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
1af10 77 69 74 68 20 69 74 73 20 77 69 6e 53 68 6d 4e  with its winShmN
1af20 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  ode */.#endif.};
1af30 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74  ../*.** Constant
1af40 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  s used for locki
1af50 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49  ng.*/.#define WI
1af60 4e 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32  N_SHM_BASE   ((2
1af70 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  2+SQLITE_SHM_NLO
1af80 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20 2f 2a  CK)*4)        /*
1af90 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65   first lock byte
1afa0 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f   */.#define WIN_
1afb0 53 48 4d 5f 44 4d 53 20 20 20 20 28 57 49 4e 5f  SHM_DMS    (WIN_
1afc0 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f  SHM_BASE+SQLITE_
1afd0 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64  SHM_NLOCK)  /* d
1afe0 65 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f  eadman switch */
1aff0 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 64  ../*.** Apply ad
1b000 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72  visory locks for
1b010 20 61 6c 6c 20 6e 20 62 79 74 65 73 20 62 65 67   all n bytes beg
1b020 69 6e 6e 69 6e 67 20 61 74 20 6f 66 73 74 2e 0a  inning at ofst..
1b030 2a 2f 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f  */.#define _SHM_
1b040 55 4e 4c 43 4b 20 20 31 0a 23 64 65 66 69 6e 65  UNLCK  1.#define
1b050 20 5f 53 48 4d 5f 52 44 4c 43 4b 20 20 32 0a 23   _SHM_RDLCK  2.#
1b060 64 65 66 69 6e 65 20 5f 53 48 4d 5f 57 52 4c 43  define _SHM_WRLC
1b070 4b 20 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20  K  3.static int 
1b080 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
1b090 28 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  (.  winShmNode *
1b0a0 70 46 69 6c 65 2c 20 20 20 20 2f 2a 20 41 70 70  pFile,    /* App
1b0b0 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73  ly locks to this
1b0c0 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d   open shared-mem
1b0d0 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20  ory segment */. 
1b0e0 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20   int lockType,  
1b0f0 20 20 20 20 20 20 20 2f 2a 20 5f 53 48 4d 5f 55         /* _SHM_U
1b100 4e 4c 43 4b 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b  NLCK, _SHM_RDLCK
1b110 2c 20 6f 72 20 5f 53 48 4d 5f 57 52 4c 43 4b 20  , or _SHM_WRLCK 
1b120 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20  */.  int ofst,  
1b130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
1b140 66 73 65 74 20 74 6f 20 66 69 72 73 74 20 62 79  fset to first by
1b150 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2f  te to be locked/
1b160 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e  unlocked */.  in
1b170 74 20 6e 42 79 74 65 20 20 20 20 20 20 20 20 20  t nByte         
1b180 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1b190 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 6f   bytes to lock o
1b1a0 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20  r unlock */.){. 
1b1b0 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20   int rc = 0;    
1b1c0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
1b1d0 20 63 6f 64 65 20 66 6f 72 6d 20 4c 6f 63 6b 2f   code form Lock/
1b1e0 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 29 20 2a  UnlockFileEx() *
1b1f0 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74  /..  /* Access t
1b200 6f 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65  o the winShmNode
1b210 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69 61   object is seria
1b220 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c  lized by the cal
1b230 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ler */.  assert(
1b240 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1b250 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78  eld(pFile->mutex
1b260 29 20 7c 7c 20 70 46 69 6c 65 2d 3e 6e 52 65 66  ) || pFile->nRef
1b270 3d 3d 30 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43  ==0 );..  OSTRAC
1b280 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c  E(("SHM-LOCK fil
1b290 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 6f  e=%p, lock=%d, o
1b2a0 66 66 73 65 74 3d 25 64 2c 20 73 69 7a 65 3d 25  ffset=%d, size=%
1b2b0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
1b2c0 20 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c   pFile->hFile.h,
1b2d0 20 6c 6f 63 6b 54 79 70 65 2c 20 6f 66 73 74 2c   lockType, ofst,
1b2e0 20 6e 42 79 74 65 29 29 3b 0a 0a 20 20 2f 2a 20   nByte));..  /* 
1b2f0 52 65 6c 65 61 73 65 2f 41 63 71 75 69 72 65 20  Release/Acquire 
1b300 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c  the system-level
1b310 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 6c   lock */.  if( l
1b320 6f 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e  ockType==_SHM_UN
1b330 4c 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  LCK ){.    rc = 
1b340 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70  winUnlockFile(&p
1b350 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 6f  File->hFile.h, o
1b360 66 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30  fst, 0, nByte, 0
1b370 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1b380 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
1b390 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65  e locking parame
1b3a0 74 65 72 73 20 2a 2f 0a 20 20 20 20 44 57 4f 52  ters */.    DWOR
1b3b0 44 20 64 77 46 6c 61 67 73 20 3d 20 4c 4f 43 4b  D dwFlags = LOCK
1b3c0 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
1b3d0 41 54 45 4c 59 3b 0a 20 20 20 20 69 66 28 20 6c  ATELY;.    if( l
1b3e0 6f 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d 5f  ockType == _SHM_
1b3f0 57 52 4c 43 4b 20 29 20 64 77 46 6c 61 67 73 20  WRLCK ) dwFlags 
1b400 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c  |= LOCKFILE_EXCL
1b410 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20  USIVE_LOCK;.    
1b420 72 63 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  rc = winLockFile
1b430 28 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68  (&pFile->hFile.h
1b440 2c 20 64 77 46 6c 61 67 73 2c 20 6f 66 73 74 2c  , dwFlags, ofst,
1b450 20 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20   0, nByte, 0);. 
1b460 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 20 30   }..  if( rc!= 0
1b470 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1b480 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
1b490 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
1b4a0 45 72 72 6e 6f 20 3d 20 20 6f 73 47 65 74 4c 61  Errno =  osGetLa
1b4b0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72  stError();.    r
1b4c0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
1b4d0 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28  .  }..  OSTRACE(
1b4e0 28 22 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d  ("SHM-LOCK file=
1b4f0 25 70 2c 20 66 75 6e 63 3d 25 73 2c 20 65 72 72  %p, func=%s, err
1b500 6e 6f 3d 25 6c 75 2c 20 72 63 3d 25 73 5c 6e 22  no=%lu, rc=%s\n"
1b510 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
1b520 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 28 6c 6f  le->hFile.h, (lo
1b530 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 55  ckType == _SHM_U
1b540 4e 4c 43 4b 29 20 3f 20 22 77 69 6e 55 6e 6c 6f  NLCK) ? "winUnlo
1b550 63 6b 46 69 6c 65 22 20 3a 0a 20 20 20 20 20 20  ckFile" :.      
1b560 20 20 20 20 20 22 77 69 6e 4c 6f 63 6b 46 69 6c       "winLockFil
1b570 65 22 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  e", pFile->lastE
1b580 72 72 6e 6f 2c 20 73 71 6c 69 74 65 33 45 72 72  rrno, sqlite3Err
1b590 4e 61 6d 65 28 72 63 29 29 29 3b 0a 0a 20 20 72  Name(rc)));..  r
1b5a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
1b5b0 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
1b5c0 65 73 20 74 6f 20 56 46 53 20 6d 65 74 68 6f 64  es to VFS method
1b5d0 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
1b5e0 77 69 6e 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f  winOpen(sqlite3_
1b5f0 76 66 73 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  vfs*,const char*
1b600 2c 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69  ,sqlite3_file*,i
1b610 6e 74 2c 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63  nt,int*);.static
1b620 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 73   int winDelete(s
1b630 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 63 6f 6e  qlite3_vfs *,con
1b640 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a  st char*,int);..
1b650 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20  /*.** Purge the 
1b660 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c  winShmNodeList l
1b670 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69  ist of all entri
1b680 65 73 20 77 69 74 68 20 77 69 6e 53 68 6d 4e 6f  es with winShmNo
1b690 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a  de.nRef==0..**.*
1b6a0 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
1b6b0 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
1b6c0 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20  y method; it is 
1b6d0 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  a utility functi
1b6e0 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20  on called.** by 
1b6f0 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
1b700 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74  y methods..*/.st
1b710 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d  atic void winShm
1b720 50 75 72 67 65 28 73 71 6c 69 74 65 33 5f 76 66  Purge(sqlite3_vf
1b730 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 64 65 6c  s *pVfs, int del
1b740 65 74 65 46 6c 61 67 29 7b 0a 20 20 77 69 6e 53  eteFlag){.  winS
1b750 68 6d 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20 20 77  hmNode **pp;.  w
1b760 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20  inShmNode *p;.  
1b770 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75  assert( winShmMu
1b780 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 4f  texHeld() );.  O
1b790 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52  STRACE(("SHM-PUR
1b7a0 47 45 20 70 69 64 3d 25 6c 75 2c 20 64 65 6c 65  GE pid=%lu, dele
1b7b0 74 65 46 6c 61 67 3d 25 64 5c 6e 22 2c 0a 20 20  teFlag=%d\n",.  
1b7c0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1b7d0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1b7e0 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 29 3b 0a  , deleteFlag));.
1b7f0 20 20 70 70 20 3d 20 26 77 69 6e 53 68 6d 4e 6f    pp = &winShmNo
1b800 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28  deList;.  while(
1b810 20 28 70 20 3d 20 2a 70 70 29 21 3d 30 20 29 7b   (p = *pp)!=0 ){
1b820 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66  .    if( p->nRef
1b830 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
1b840 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   i;.      if( p-
1b850 3e 6d 75 74 65 78 20 29 7b 20 73 71 6c 69 74 65  >mutex ){ sqlite
1b860 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e  3_mutex_free(p->
1b870 6d 75 74 65 78 29 3b 20 7d 0a 20 20 20 20 20 20  mutex); }.      
1b880 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52  for(i=0; i<p->nR
1b890 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  egion; i++){.   
1b8a0 20 20 20 20 20 42 4f 4f 4c 20 62 52 63 20 3d 20       BOOL bRc = 
1b8b0 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c  osUnmapViewOfFil
1b8c0 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e  e(p->aRegion[i].
1b8d0 70 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f  pMap);.        O
1b8e0 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52  STRACE(("SHM-PUR
1b8f0 47 45 2d 55 4e 4d 41 50 20 70 69 64 3d 25 6c 75  GE-UNMAP pid=%lu
1b900 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d  , region=%d, rc=
1b910 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1b920 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1b930 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1b940 20 69 2c 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a   i, bRc ? "ok" :
1b950 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20   "failed"));.   
1b960 20 20 20 20 20 55 4e 55 53 45 44 5f 56 41 52 49       UNUSED_VARI
1b970 41 42 4c 45 5f 56 41 4c 55 45 28 62 52 63 29 3b  ABLE_VALUE(bRc);
1b980 0a 20 20 20 20 20 20 20 20 62 52 63 20 3d 20 6f  .        bRc = o
1b990 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e  sCloseHandle(p->
1b9a0 61 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29  aRegion[i].hMap)
1b9b0 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43  ;.        OSTRAC
1b9c0 45 28 28 22 53 48 4d 2d 50 55 52 47 45 2d 43 4c  E(("SHM-PURGE-CL
1b9d0 4f 53 45 20 70 69 64 3d 25 6c 75 2c 20 72 65 67  OSE pid=%lu, reg
1b9e0 69 6f 6e 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22  ion=%d, rc=%s\n"
1b9f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ba00 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1ba10 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 20 62  rocessId(), i, b
1ba20 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  Rc ? "ok" : "fai
1ba30 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20  led"));.        
1ba40 55 4e 55 53 45 44 5f 56 41 52 49 41 42 4c 45 5f  UNUSED_VARIABLE_
1ba50 56 41 4c 55 45 28 62 52 63 29 3b 0a 20 20 20 20  VALUE(bRc);.    
1ba60 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d    }.      if( p-
1ba70 3e 68 46 69 6c 65 2e 68 21 3d 4e 55 4c 4c 20 26  >hFile.h!=NULL &
1ba80 26 20 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 49 4e  & p->hFile.h!=IN
1ba90 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
1baa0 55 45 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69  UE ){.        Si
1bab0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1bac0 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20  ign(1);.        
1bad0 77 69 6e 43 6c 6f 73 65 28 28 73 71 6c 69 74 65  winClose((sqlite
1bae0 33 5f 66 69 6c 65 20 2a 29 26 70 2d 3e 68 46 69  3_file *)&p->hFi
1baf0 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d  le);.        Sim
1bb00 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1bb10 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  gn(0);.      }. 
1bb20 20 20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46       if( deleteF
1bb30 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 53  lag ){.        S
1bb40 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1bb50 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20  nign(1);.       
1bb60 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
1bb70 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
1bb80 20 20 20 20 20 77 69 6e 44 65 6c 65 74 65 28 70       winDelete(p
1bb90 56 66 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d  Vfs, p->zFilenam
1bba0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  e, 0);.        s
1bbb0 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
1bbc0 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
1bbd0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1bbe0 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
1bbf0 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70   }.      *pp = p
1bc00 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73  ->pNext;.      s
1bc10 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
1bc20 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73  Region);.      s
1bc30 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
1bc40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bc50 20 70 70 20 3d 20 26 70 2d 3e 70 4e 65 78 74 3b   pp = &p->pNext;
1bc60 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1bc70 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 68 61  .** Open the sha
1bc80 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20  red-memory area 
1bc90 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1bca0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 44  database file pD
1bcb0 62 46 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  bFd..**.** When 
1bcc0 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68  opening a new sh
1bcd0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
1bce0 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e  , if no other in
1bcf0 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a  stances of that.
1bd00 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72 72  ** file are curr
1bd10 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74  ently open, in t
1bd20 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69  his process or i
1bd30 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  n other processe
1bd40 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66  s, then.** the f
1bd50 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e  ile must be trun
1bd60 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65  cated to zero le
1bd70 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69 74 73  ngth or have its
1bd80 20 68 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e   header cleared.
1bd90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1bda0 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f  inOpenSharedMemo
1bdb0 72 79 28 77 69 6e 46 69 6c 65 20 2a 70 44 62 46  ry(winFile *pDbF
1bdc0 64 29 7b 0a 20 20 73 74 72 75 63 74 20 77 69 6e  d){.  struct win
1bdd0 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Shm *p;         
1bde0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1bdf0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65  connection to be
1be00 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72   opened */.  str
1be10 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  uct winShmNode *
1be20 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 20  pShmNode = 0;   
1be30 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
1be40 67 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a  g mmapped file *
1be50 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1be60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be70 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
1be80 20 63 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63   code */.  struc
1be90 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e  t winShmNode *pN
1bea0 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ew;           /*
1beb0 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64   Newly allocated
1bec0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20   winShmNode */. 
1bed0 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20   int nName;     
1bee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bef0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a      /* Size of z
1bf00 4e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  Name in bytes */
1bf10 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46  ..  assert( pDbF
1bf20 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 20 20 20  d->pShm==0 );   
1bf30 20 2f 2a 20 4e 6f 74 20 70 72 65 76 69 6f 75 73   /* Not previous
1bf40 6c 79 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20 20  ly opened */..  
1bf50 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
1bf60 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 71  e for the new sq
1bf70 6c 69 74 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74  lite3_shm object
1bf80 2e 20 20 41 6c 73 6f 20 73 70 65 63 75 6c 61 74  .  Also speculat
1bf90 69 76 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63  ively.  ** alloc
1bfa0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 20  ate space for a 
1bfb0 6e 65 77 20 77 69 6e 53 68 6d 4e 6f 64 65 20 61  new winShmNode a
1bfc0 6e 64 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a  nd filename..  *
1bfd0 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d  /.  p = sqlite3M
1bfe0 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
1bff0 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
1c000 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
1c010 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
1c020 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  nName = sqlit
1c030 65 33 53 74 72 6c 65 6e 33 30 28 70 44 62 46 64  e3Strlen30(pDbFd
1c040 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 70 4e 65 77  ->zPath);.  pNew
1c050 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
1c060 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 53  Zero( sizeof(*pS
1c070 68 6d 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d 65 20  hmNode) + nName 
1c080 2b 20 31 37 20 29 3b 0a 20 20 69 66 28 20 70 4e  + 17 );.  if( pN
1c090 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ew==0 ){.    sql
1c0a0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
1c0b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c0c0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  IOERR_NOMEM;.  }
1c0d0 0a 20 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61  .  pNew->zFilena
1c0e0 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65  me = (char*)&pNe
1c0f0 77 5b 31 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f  w[1];.  sqlite3_
1c100 73 6e 70 72 69 6e 74 66 28 6e 4e 61 6d 65 2b 31  snprintf(nName+1
1c110 35 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61  5, pNew->zFilena
1c120 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20 70 44  me, "%s-shm", pD
1c130 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 73  bFd->zPath);.  s
1c140 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78  qlite3FileSuffix
1c150 33 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20  3(pDbFd->zPath, 
1c160 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  pNew->zFilename)
1c170 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20  ;..  /* Look to 
1c180 73 65 65 20 69 66 20 74 68 65 72 65 20 69 73 20  see if there is 
1c190 61 6e 20 65 78 69 73 74 69 6e 67 20 77 69 6e 53  an existing winS
1c1a0 68 6d 4e 6f 64 65 20 74 68 61 74 20 63 61 6e 20  hmNode that can 
1c1b0 62 65 20 75 73 65 64 2e 0a 20 20 2a 2a 20 49 66  be used..  ** If
1c1c0 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 77 69 6e   no matching win
1c1d0 53 68 6d 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c  ShmNode currentl
1c1e0 79 20 65 78 69 73 74 73 2c 20 63 72 65 61 74 65  y exists, create
1c1f0 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f   a new one..  */
1c200 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75  .  winShmEnterMu
1c210 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 53 68  tex();.  for(pSh
1c220 6d 4e 6f 64 65 20 3d 20 77 69 6e 53 68 6d 4e 6f  mNode = winShmNo
1c230 64 65 4c 69 73 74 3b 20 70 53 68 6d 4e 6f 64 65  deList; pShmNode
1c240 3b 20 70 53 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e  ; pShmNode=pShmN
1c250 6f 64 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ode->pNext){.   
1c260 20 2f 2a 20 54 42 44 20 6e 65 65 64 20 74 6f 20   /* TBD need to 
1c270 63 6f 6d 65 20 75 70 20 77 69 74 68 20 62 65 74  come up with bet
1c280 74 65 72 20 6d 61 74 63 68 20 68 65 72 65 2e 20  ter match here. 
1c290 20 50 65 72 68 61 70 73 0a 20 20 20 20 2a 2a 20   Perhaps.    ** 
1c2a0 75 73 65 20 46 49 4c 45 5f 49 44 5f 42 4f 54 48  use FILE_ID_BOTH
1c2b0 5f 44 49 52 5f 49 4e 46 4f 20 53 74 72 75 63 74  _DIR_INFO Struct
1c2c0 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ure..    */.    
1c2d0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1c2e0 6d 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69  mp(pShmNode->zFi
1c2f0 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46  lename, pNew->zF
1c300 69 6c 65 6e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ilename)==0 ) br
1c310 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  eak;.  }.  if( p
1c320 53 68 6d 4e 6f 64 65 20 29 7b 0a 20 20 20 20 73  ShmNode ){.    s
1c330 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
1c340 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1c350 70 53 68 6d 4e 6f 64 65 20 3d 20 70 4e 65 77 3b  pShmNode = pNew;
1c360 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20  .    pNew = 0;. 
1c370 20 20 20 28 28 77 69 6e 46 69 6c 65 2a 29 28 26     ((winFile*)(&
1c380 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 29  pShmNode->hFile)
1c390 29 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48  )->h = INVALID_H
1c3a0 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20  ANDLE_VALUE;.   
1c3b0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74   pShmNode->pNext
1c3c0 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73   = winShmNodeLis
1c3d0 74 3b 0a 20 20 20 20 77 69 6e 53 68 6d 4e 6f 64  t;.    winShmNod
1c3e0 65 4c 69 73 74 20 3d 20 70 53 68 6d 4e 6f 64 65  eList = pShmNode
1c3f0 3b 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  ;..    pShmNode-
1c400 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
1c410 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
1c420 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b  ITE_MUTEX_FAST);
1c430 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  .    if( pShmNod
1c440 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  e->mutex==0 ){. 
1c450 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c460 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
1c470 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
1c480 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  n_err;.    }..  
1c490 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 28 70    rc = winOpen(p
1c4a0 44 62 46 64 2d 3e 70 56 66 73 2c 0a 20 20 20 20  DbFd->pVfs,.    
1c4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 68               pSh
1c4c0 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
1c4d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1c4e0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
1c4f0 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 20  e (UTF-8) */.   
1c500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
1c510 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 53  qlite3_file*)&pS
1c520 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 20  hmNode->hFile,  
1c530 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 68  /* File handle h
1c540 65 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ere */.         
1c550 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
1c560 50 45 4e 5f 57 41 4c 20 7c 20 53 51 4c 49 54 45  PEN_WAL | SQLITE
1c570 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
1c580 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
1c590 45 41 54 45 2c 0a 20 20 20 20 20 20 20 20 20 20  EATE,.          
1c5a0 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69         0);.    i
1c5b0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
1c5c0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
1c5d0 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
1c5e0 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
1c5f0 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68   to see if anoth
1c600 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  er process is ho
1c610 6c 64 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d  lding the dead-m
1c620 61 6e 20 73 77 69 74 63 68 2e 0a 20 20 20 20 2a  an switch..    *
1c630 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61  * If not, trunca
1c640 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a  te the file to z
1c650 65 72 6f 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20  ero length..    
1c660 2a 2f 0a 20 20 20 20 69 66 28 20 77 69 6e 53 68  */.    if( winSh
1c670 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
1c680 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b  Node, _SHM_WRLCK
1c690 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
1c6a0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
1c6b0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72        rc = winTr
1c6c0 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f  uncate((sqlite3_
1c6d0 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65  file *)&pShmNode
1c6e0 2d 3e 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20  ->hFile, 0);.   
1c6f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1c700 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1c710 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
1c720 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  (SQLITE_IOERR_SH
1c730 4d 4f 50 45 4e 2c 20 6f 73 47 65 74 4c 61 73 74  MOPEN, osGetLast
1c740 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
1c750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c760 20 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22 2c 20    "winOpenShm", 
1c770 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
1c780 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1c790 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c7a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 53  OK ){.      winS
1c7b0 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
1c7c0 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43  mNode, _SHM_UNLC
1c7d0 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20  K, WIN_SHM_DMS, 
1c7e0 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  1);.      rc = w
1c7f0 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
1c800 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52  pShmNode, _SHM_R
1c810 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d  DLCK, WIN_SHM_DM
1c820 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  S, 1);.    }.   
1c830 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
1c840 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d  hm_open_err;.  }
1c850 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20  ..  /* Make the 
1c860 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  new connection a
1c870 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 77 69   child of the wi
1c880 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d  nShmNode */.  p-
1c890 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d  >pShmNode = pShm
1c8a0 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c  Node;.#ifdef SQL
1c8b0 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69  ITE_DEBUG.  p->i
1c8c0 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65  d = pShmNode->ne
1c8d0 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69  xtShmId++;.#endi
1c8e0 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  f.  pShmNode->nR
1c8f0 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70  ef++;.  pDbFd->p
1c900 53 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e 53 68  Shm = p;.  winSh
1c910 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  mLeaveMutex();..
1c920 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e    /* The referen
1c930 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d  ce count on pShm
1c940 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64 79  Node has already
1c950 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65   been incremente
1c960 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65  d under.  ** the
1c970 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20 77 69   cover of the wi
1c980 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29  nShmEnterMutex()
1c990 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70   mutex and the p
1c9a0 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a  ointer from the.
1c9b0 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74    ** new (struct
1c9c0 20 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63 74 20   winShm) object 
1c9d0 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20  to the pShmNode 
1c9e0 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c  has been set. Al
1c9f0 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c  l that is.  ** l
1ca00 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20  eft to do is to 
1ca10 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a  link the new obj
1ca20 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ect into the lin
1ca30 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e  ked list startin
1ca40 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f  g.  ** at pShmNo
1ca50 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73  de->pFirst. This
1ca60 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
1ca70 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
1ca80 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 0a  pShmNode->mutex.
1ca90 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f    ** mutex..  */
1caa0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1cab0 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
1cac0 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e  >mutex);.  p->pN
1cad0 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  ext = pShmNode->
1cae0 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f  pFirst;.  pShmNo
1caf0 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a  de->pFirst = p;.
1cb00 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1cb10 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
1cb20 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
1cb30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
1cb40 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61  * Jump here on a
1cb50 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f  ny error */.shm_
1cb60 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69 6e 53  open_err:.  winS
1cb70 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
1cb80 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43  mNode, _SHM_UNLC
1cb90 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20  K, WIN_SHM_DMS, 
1cba0 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75 72 67  1);.  winShmPurg
1cbb0 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 30  e(pDbFd->pVfs, 0
1cbc0 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  );      /* This 
1cbd0 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e  call frees pShmN
1cbe0 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64 20  ode if required 
1cbf0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  */.  sqlite3_fre
1cc00 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  e(p);.  sqlite3_
1cc10 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 77 69  free(pNew);.  wi
1cc20 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29  nShmLeaveMutex()
1cc30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1cc40 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
1cc50 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68  connection to sh
1cc60 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65  ared-memory.  De
1cc70 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lete the underly
1cc80 69 6e 67 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69  ing.** storage i
1cc90 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20  f deleteFlag is 
1cca0 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  true..*/.static 
1ccb0 69 6e 74 20 77 69 6e 53 68 6d 55 6e 6d 61 70 28  int winShmUnmap(
1ccc0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1ccd0 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  *fd,          /*
1cce0 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e   Database holdin
1ccf0 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  g shared memory 
1cd00 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46  */.  int deleteF
1cd10 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20  lag             
1cd20 2f 2a 20 44 65 6c 65 74 65 20 61 66 74 65 72 20  /* Delete after 
1cd30 63 6c 6f 73 69 6e 67 20 69 66 20 74 72 75 65 20  closing if true 
1cd40 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  */.){.  winFile 
1cd50 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20 2f 2a  *pDbFd;       /*
1cd60 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e   Database holdin
1cd70 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  g shared-memory 
1cd80 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 3b 20  */.  winShm *p; 
1cd90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1cda0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
1cdb0 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 77  be closed */.  w
1cdc0 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
1cdd0 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e 64 65  ode; /* The unde
1cde0 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65  rlying shared-me
1cdf0 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 77  mory file */.  w
1ce00 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20  inShm **pp;     
1ce10 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
1ce20 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67  ing over sibling
1ce30 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a   connections */.
1ce40 0a 20 20 70 44 62 46 64 20 3d 20 28 77 69 6e 46  .  pDbFd = (winF
1ce50 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70  ile*)fd;.  p = p
1ce60 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66  DbFd->pShm;.  if
1ce70 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
1ce80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68  SQLITE_OK;.  pSh
1ce90 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
1cea0 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  ode;..  /* Remov
1ceb0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66  e connection p f
1cec0 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63  rom the set of c
1ced0 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63  onnections assoc
1cee0 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20  iated.  ** with 
1cef0 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71  pShmNode */.  sq
1cf00 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1cf10 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
1cf20 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53  x);.  for(pp=&pS
1cf30 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
1cf40 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26  (*pp)!=p; pp = &
1cf50 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a  (*pp)->pNext){}.
1cf60 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74    *pp = p->pNext
1cf70 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65  ;..  /* Free the
1cf80 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f   connection p */
1cf90 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1cfa0 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68  p);.  pDbFd->pSh
1cfb0 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  m = 0;.  sqlite3
1cfc0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
1cfd0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a  mNode->mutex);..
1cfe0 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65    /* If pShmNode
1cff0 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63 68  ->nRef has reach
1d000 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65  ed 0, then close
1d010 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a   the underlying.
1d020 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f    ** shared-memo
1d030 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a  ry file, too */.
1d040 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74    winShmEnterMut
1d050 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ex();.  assert( 
1d060 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30  pShmNode->nRef>0
1d070 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e   );.  pShmNode->
1d080 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53  nRef--;.  if( pS
1d090 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20  hmNode->nRef==0 
1d0a0 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d 50 75 72  ){.    winShmPur
1d0b0 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20  ge(pDbFd->pVfs, 
1d0c0 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a 20 20 7d  deleteFlag);.  }
1d0d0 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75  .  winShmLeaveMu
1d0e0 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e  tex();..  return
1d0f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1d100 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
1d110 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61  lock state for a
1d120 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73   shared-memory s
1d130 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  egment..*/.stati
1d140 63 20 69 6e 74 20 77 69 6e 53 68 6d 4c 6f 63 6b  c int winShmLock
1d150 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1d160 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f   *fd,          /
1d170 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20  * Database file 
1d180 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72  holding the shar
1d190 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69  ed memory */.  i
1d1a0 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20  nt ofst,        
1d1b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1d1c0 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69  st lock to acqui
1d1d0 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  re or release */
1d1e0 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20  .  int n,       
1d1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d200 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   Number of locks
1d210 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72   to acquire or r
1d220 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
1d230 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
1d240 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74         /* What t
1d250 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f  o do with the lo
1d260 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69  ck */.){.  winFi
1d270 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e  le *pDbFd = (win
1d280 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 20  File*)fd;       
1d290 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68   /* Connection h
1d2a0 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65  olding shared me
1d2b0 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  mory */.  winShm
1d2c0 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68   *p = pDbFd->pSh
1d2d0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1d2e0 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d 65  /* The shared me
1d2f0 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65  mory being locke
1d300 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  d */.  winShm *p
1d310 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
1d320 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d330 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
1d340 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f   all siblings */
1d350 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
1d360 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
1d370 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20  mNode;.  int rc 
1d380 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
1d390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d3a0 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
1d3b0 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20  .  u16 mask;    
1d3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
1d3e0 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b   of locks to tak
1d3f0 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
1d400 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e  .  assert( ofst>
1d410 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51  =0 && ofst+n<=SQ
1d420 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29  LITE_SHM_NLOCK )
1d430 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31  ;.  assert( n>=1
1d440 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c   );.  assert( fl
1d450 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
1d460 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  _LOCK | SQLITE_S
1d470 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20  HM_SHARED).     
1d480 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
1d490 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53  ITE_SHM_LOCK | S
1d4a0 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
1d4b0 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66  IVE).       || f
1d4c0 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
1d4d0 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  M_UNLOCK | SQLIT
1d4e0 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20  E_SHM_SHARED).  
1d4f0 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
1d500 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
1d510 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  K | SQLITE_SHM_E
1d520 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61  XCLUSIVE) );.  a
1d530 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28  ssert( n==1 || (
1d540 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
1d550 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30  HM_EXCLUSIVE)!=0
1d560 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 75   );..  mask = (u
1d570 31 36 29 28 28 31 55 3c 3c 28 6f 66 73 74 2b 6e  16)((1U<<(ofst+n
1d580 29 29 20 2d 20 28 31 55 3c 3c 6f 66 73 74 29 29  )) - (1U<<ofst))
1d590 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20  ;.  assert( n>1 
1d5a0 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73  || mask==(1<<ofs
1d5b0 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t) );.  sqlite3_
1d5c0 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
1d5d0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1d5e0 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
1d5f0 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b  TE_SHM_UNLOCK ){
1d600 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b  .    u16 allMask
1d610 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66   = 0; /* Mask of
1d620 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73   locks held by s
1d630 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20  iblings */..    
1d640 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73 69  /* See if any si
1d650 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73  blings hold this
1d660 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20   same lock */.  
1d670 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
1d680 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
1d690 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
1d6a0 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20      if( pX==p ) 
1d6b0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1d6c0 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63  assert( (pX->exc
1d6d0 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c  lMask & (p->excl
1d6e0 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61  Mask|p->sharedMa
1d6f0 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  sk))==0 );.     
1d700 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e   allMask |= pX->
1d710 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20  sharedMask;.    
1d720 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b  }..    /* Unlock
1d730 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65   the system-leve
1d740 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  l locks */.    i
1d750 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61  f( (mask & allMa
1d760 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
1d770 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65  rc = winShmSyste
1d780 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
1d790 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74  _SHM_UNLCK, ofst
1d7a0 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  +WIN_SHM_BASE, n
1d7b0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1d7c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1d7d0 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OK;.    }..    /
1d7e0 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c  * Undo the local
1d7f0 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
1d800 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d810 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c  ){.      p->excl
1d820 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
1d830 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61       p->sharedMa
1d840 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
1d850 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66   }.  }else if( f
1d860 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
1d870 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20  M_SHARED ){.    
1d880 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20  u16 allShared = 
1d890 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20  0;  /* Union of 
1d8a0 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f  locks held by co
1d8b0 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20  nnections other 
1d8c0 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20  than "p" */..   
1d8d0 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69   /* Find out whi
1d8e0 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  ch shared locks 
1d8f0 61 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64  are already held
1d900 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e   by sibling conn
1d910 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20  ections..    ** 
1d920 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61  If any sibling a
1d930 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20  lready holds an 
1d940 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20  exclusive lock, 
1d950 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65 74  go ahead and ret
1d960 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54  urn.    ** SQLIT
1d970 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20  E_BUSY..    */. 
1d980 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
1d990 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
1d9a0 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
1d9b0 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78       if( (pX->ex
1d9c0 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  clMask & mask)!=
1d9d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
1d9e0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
1d9f0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1da00 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53      }.      allS
1da10 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61  hared |= pX->sha
1da20 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a  redMask;.    }..
1da30 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65      /* Get share
1da40 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73  d locks at the s
1da50 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20  ystem level, if 
1da60 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20  necessary */.   
1da70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1da80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
1da90 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73  (allShared & mas
1daa0 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)==0 ){.       
1dab0 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74   rc = winShmSyst
1dac0 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
1dad0 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 66 73   _SHM_RDLCK, ofs
1dae0 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20  t+WIN_SHM_BASE, 
1daf0 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
1db00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1db10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
1db20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
1db30 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61  et the local sha
1db40 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  red locks */.   
1db50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1db60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  OK ){.      p->s
1db70 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73  haredMask |= mas
1db80 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  k;.    }.  }else
1db90 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  {.    /* Make su
1dba0 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f  re no sibling co
1dbb0 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c  nnections hold l
1dbc0 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62  ocks that will b
1dbd0 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a  lock this.    **
1dbe0 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64   lock.  If any d
1dbf0 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  o, return SQLITE
1dc00 5f 42 55 53 59 20 72 69 67 68 74 20 61 77 61 79  _BUSY right away
1dc10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
1dc20 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  (pX=pShmNode->pF
1dc30 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
1dc40 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
1dc50 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  f( (pX->exclMask
1dc60 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28   & mask)!=0 || (
1dc70 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  pX->sharedMask &
1dc80 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20   mask)!=0 ){.   
1dc90 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1dca0 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62  _BUSY;.        b
1dcb0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1dcc0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
1dcd0 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  the exclusive lo
1dce0 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65  cks at the syste
1dcf0 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69  m level.  Then i
1dd00 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20  f successful.   
1dd10 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68   ** also mark th
1dd20 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69  e local connecti
1dd30 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b  on as being lock
1dd40 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
1dd50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1dd60 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
1dd70 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
1dd80 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57  pShmNode, _SHM_W
1dd90 52 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53  RLCK, ofst+WIN_S
1dda0 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
1ddb0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1ddc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1ddd0 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72  assert( (p->shar
1dde0 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d  edMask & mask)==
1ddf0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 );.        p->
1de00 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  exclMask |= mask
1de10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1de20 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
1de30 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
1de40 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53  de->mutex);.  OS
1de50 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
1de60 20 70 69 64 3d 25 6c 75 2c 20 69 64 3d 25 64 2c   pid=%lu, id=%d,
1de70 20 73 68 61 72 65 64 4d 61 73 6b 3d 25 30 33 78   sharedMask=%03x
1de80 2c 20 65 78 63 6c 4d 61 73 6b 3d 25 30 33 78 2c  , exclMask=%03x,
1de90 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
1dea0 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1deb0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
1dec0 2d 3e 69 64 2c 20 70 2d 3e 73 68 61 72 65 64 4d  ->id, p->sharedM
1ded0 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b  ask, p->exclMask
1dee0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
1def0 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
1df00 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1df10 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
1df20 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72  nt a memory barr
1df30 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65  ier or memory fe
1df40 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65  nce on shared me
1df50 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  mory..**.** All 
1df60 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73  loads and stores
1df70 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68   begun before th
1df80 65 20 62 61 72 72 69 65 72 20 6d 75 73 74 20 63  e barrier must c
1df90 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a  omplete before.*
1dfa0 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74  * any load or st
1dfb0 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65 72 20  ore begun after 
1dfc0 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a  the barrier..*/.
1dfd0 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53  static void winS
1dfe0 68 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c  hmBarrier(.  sql
1dff0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20  ite3_file *fd   
1e000 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1e010 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  se holding the s
1e020 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
1e030 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
1e040 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 2f 2a 20  METER(fd);.  /* 
1e050 4d 65 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b  MemoryBarrier();
1e060 20 2f 2f 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72   // does not wor
1e070 6b 20 2d 2d 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  k -- do not know
1e080 20 77 68 79 20 6e 6f 74 20 2a 2f 0a 20 20 77 69   why not */.  wi
1e090 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29  nShmEnterMutex()
1e0a0 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  ;.  winShmLeaveM
1e0b0 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  utex();.}../*.**
1e0c0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1e0d0 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
1e0e0 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
1e0f0 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f  region iRegion o
1e100 66 20 74 68 65 0a 2a 2a 20 73 68 61 72 65 64 2d  f the.** shared-
1e110 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
1e120 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  d with the datab
1e130 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61  ase file fd. Sha
1e140 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
1e150 6e 73 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72  ns.** are number
1e160 65 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d  ed starting from
1e170 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61 72   zero. Each shar
1e180 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
1e190 20 69 73 20 73 7a 52 65 67 69 6f 6e 0a 2a 2a 20   is szRegion.** 
1e1a0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
1e1b0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
1e1c0 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f   occurs, an erro
1e1d0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1e1e0 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20 73 65  ed and *pp is se
1e1f0 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
1e200 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
1e210 68 65 20 69 73 57 72 69 74 65 20 70 61 72 61 6d  he isWrite param
1e220 65 74 65 72 20 69 73 20 30 20 61 6e 64 20 74 68  eter is 0 and th
1e230 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72  e requested shar
1e240 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67  ed-memory.** reg
1e250 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ion has not been
1e260 20 61 6c 6c 6f 63 61 74 65 64 20 28 62 79 20 61   allocated (by a
1e270 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75  ny client, inclu
1e280 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67  ding one running
1e290 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61 74   in a.** separat
1e2a0 65 20 70 72 6f 63 65 73 73 29 2c 20 74 68 65 6e  e process), then
1e2b0 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e   *pp is set to N
1e2c0 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ULL and SQLITE_O
1e2d0 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a  K returned. If.*
1e2e0 2a 20 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e  * isWrite is non
1e2f0 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 72 65  -zero and the re
1e300 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d  quested shared-m
1e310 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73  emory region has
1e320 20 6e 6f 74 20 79 65 74 0a 2a 2a 20 62 65 65 6e   not yet.** been
1e330 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69   allocated, it i
1e340 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74  s allocated by t
1e350 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
1e360 0a 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72 65  .** If the share
1e370 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d-memory region 
1e380 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1e390 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73   allocated or is
1e3a0 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a   allocated by.**
1e3b0 20 74 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65   this call as de
1e3c0 73 63 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74  scribed above, t
1e3d0 68 65 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64  hen it is mapped
1e3e0 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
1e3f0 73 73 65 73 0a 2a 2a 20 61 64 64 72 65 73 73 20  sses.** address 
1e400 73 70 61 63 65 20 28 69 66 20 69 74 20 69 73 20  space (if it is 
1e410 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70  not already), *p
1e420 70 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  p is set to poin
1e430 74 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 0a  t to the mapped.
1e440 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51  ** memory and SQ
1e450 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
1e460 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e470 77 69 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c  winShmMap(.  sql
1e480 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
1e490 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e4a0 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64  Handle open on d
1e4b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1e4c0 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20    int iRegion,  
1e4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4e0 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72    /* Region to r
1e4f0 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74  etrieve */.  int
1e500 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20   szRegion,      
1e510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e520 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20  Size of regions 
1e530 2a 2f 0a 20 20 69 6e 74 20 69 73 57 72 69 74 65  */.  int isWrite
1e540 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e550 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
1e560 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e  extend file if n
1e570 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f  ecessary */.  vo
1e580 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70  id volatile **pp
1e590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e5a0 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d   OUT: Mapped mem
1e5b0 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46  ory */.){.  winF
1e5c0 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69  ile *pDbFd = (wi
1e5d0 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e  nFile*)fd;.  win
1e5e0 53 68 6d 20 2a 70 53 68 6d 20 3d 20 70 44 62 46  Shm *pShm = pDbF
1e5f0 64 2d 3e 70 53 68 6d 3b 0a 20 20 77 69 6e 53 68  d->pShm;.  winSh
1e600 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
1e610 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1e620 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70  TE_OK;..  if( !p
1e630 53 68 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Shm ){.    rc = 
1e640 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  winOpenSharedMem
1e650 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20  ory(pDbFd);.    
1e660 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e670 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1e680 20 20 20 70 53 68 6d 20 3d 20 70 44 62 46 64 2d     pShm = pDbFd-
1e690 3e 70 53 68 6d 3b 0a 20 20 7d 0a 20 20 70 53 68  >pShm;.  }.  pSh
1e6a0 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 2d 3e 70 53  mNode = pShm->pS
1e6b0 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73 71 6c 69 74  hmNode;..  sqlit
1e6c0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
1e6d0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1e6e0 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52 65 67  .  assert( szReg
1e6f0 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73  ion==pShmNode->s
1e700 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e  zRegion || pShmN
1e710 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20  ode->nRegion==0 
1e720 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  );..  if( pShmNo
1e730 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65  de->nRegion<=iRe
1e740 67 69 6f 6e 20 29 7b 0a 20 20 20 20 73 74 72 75  gion ){.    stru
1e750 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 61 70  ct ShmRegion *ap
1e760 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f  New;           /
1e770 2a 20 4e 65 77 20 61 52 65 67 69 6f 6e 5b 5d 20  * New aRegion[] 
1e780 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74  array */.    int
1e790 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67 69 6f   nByte = (iRegio
1e7a0 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b 20 20  n+1)*szRegion;  
1e7b0 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69  /* Minimum requi
1e7c0 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f  red file size */
1e7d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
1e7e0 36 34 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20  64 sz;          
1e7f0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
1e800 6e 74 20 73 69 7a 65 20 6f 66 20 77 61 6c 2d 69  nt size of wal-i
1e810 6e 64 65 78 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  ndex file */..  
1e820 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65    pShmNode->szRe
1e830 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b  gion = szRegion;
1e840 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  ..    /* The req
1e850 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20 69 73  uested region is
1e860 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e 74 6f   not mapped into
1e870 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
1e880 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 0a 20  address space.. 
1e890 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73     ** Check to s
1e8a0 65 65 20 69 66 20 69 74 20 68 61 73 20 62 65 65  ee if it has bee
1e8b0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65  n allocated (i.e
1e8c0 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64  . if the wal-ind
1e8d0 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a  ex file is.    *
1e8e0 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  * large enough t
1e8f0 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 65  o contain the re
1e900 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 29 2e  quested region).
1e910 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
1e920 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 28 73 71   winFileSize((sq
1e930 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53  lite3_file *)&pS
1e940 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 26  hmNode->hFile, &
1e950 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  sz);.    if( rc!
1e960 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e970 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
1e980 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1e990 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74  R_SHMSIZE, osGet
1e9a0 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
1e9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9c0 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 31 22      "winShmMap1"
1e9d0 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
1e9e0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70  .      goto shmp
1e9f0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a  age_out;.    }..
1ea00 20 20 20 20 69 66 28 20 73 7a 3c 6e 42 79 74 65      if( sz<nByte
1ea10 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
1ea20 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
1ea30 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f  y region does no
1ea40 74 20 65 78 69 73 74 2e 20 49 66 20 69 73 57 72  t exist. If isWr
1ea50 69 74 65 20 69 73 20 73 65 74 20 74 6f 0a 20 20  ite is set to.  
1ea60 20 20 20 20 2a 2a 20 7a 65 72 6f 2c 20 65 78 69      ** zero, exi
1ea70 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c  t early. *pp wil
1ea80 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c  l be set to NULL
1ea90 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
1eaa0 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 2a  eturned..      *
1eab0 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c 74 65 72  *.      ** Alter
1eac0 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 69 73 57  natively, if isW
1ead0 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  rite is non-zero
1eae0 2c 20 75 73 65 20 66 74 72 75 6e 63 61 74 65 28  , use ftruncate(
1eaf0 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20  ) to allocate.  
1eb00 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65      ** the reque
1eb10 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  sted memory regi
1eb20 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
1eb30 20 20 20 69 66 28 20 21 69 73 57 72 69 74 65 20     if( !isWrite 
1eb40 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f  ) goto shmpage_o
1eb50 75 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ut;.      rc = w
1eb60 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71 6c 69  inTruncate((sqli
1eb70 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d  te3_file *)&pShm
1eb80 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 6e 42 79  Node->hFile, nBy
1eb90 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  te);.      if( r
1eba0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1ebb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e          rc = win
1ebc0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1ebd0 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f  IOERR_SHMSIZE, o
1ebe0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
1ebf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ec00 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 68            "winSh
1ec10 6d 4d 61 70 32 22 2c 20 70 44 62 46 64 2d 3e 7a  mMap2", pDbFd->z
1ec20 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 67  Path);.        g
1ec30 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
1ec40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1ec50 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20 72      /* Map the r
1ec60 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20  equested memory 
1ec70 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73  region into this
1ec80 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65   processes addre
1ec90 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20  ss space. */.   
1eca0 20 61 70 4e 65 77 20 3d 20 28 73 74 72 75 63 74   apNew = (struct
1ecb0 20 53 68 6d 52 65 67 69 6f 6e 20 2a 29 73 71 6c   ShmRegion *)sql
1ecc0 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20  ite3_realloc(.  
1ecd0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1ece0 61 52 65 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f  aRegion, (iRegio
1ecf0 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 61 70 4e 65  n+1)*sizeof(apNe
1ed00 77 5b 30 5d 29 0a 20 20 20 20 29 3b 0a 20 20 20  w[0]).    );.   
1ed10 20 69 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20   if( !apNew ){. 
1ed20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1ed30 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
1ed40 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
1ed50 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
1ed60 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f  pShmNode->aRegio
1ed70 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a 20 20 20 20  n = apNew;..    
1ed80 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d  while( pShmNode-
1ed90 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f  >nRegion<=iRegio
1eda0 6e 20 29 7b 0a 20 20 20 20 20 20 48 41 4e 44 4c  n ){.      HANDL
1edb0 45 20 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 20 20  E hMap = NULL;  
1edc0 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 2d 6d         /* file-m
1edd0 61 70 70 69 6e 67 20 68 61 6e 64 6c 65 20 2a 2f  apping handle */
1ede0 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 61  .      void *pMa
1edf0 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  p = 0;          
1ee00 20 20 20 2f 2a 20 4d 61 70 70 65 64 20 6d 65 6d     /* Mapped mem
1ee10 6f 72 79 20 72 65 67 69 6f 6e 20 2a 2f 0a 0a 23  ory region */..#
1ee20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1ee30 52 54 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20  RT.      hMap = 
1ee40 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
1ee50 69 6e 67 46 72 6f 6d 41 70 70 28 70 53 68 6d 4e  ingFromApp(pShmN
1ee60 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20  ode->hFile.h,.  
1ee70 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41          NULL, PA
1ee80 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 6e 42  GE_READWRITE, nB
1ee90 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20  yte, NULL.      
1eea0 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  );.#elif defined
1eeb0 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
1eec0 53 5f 57 49 44 45 29 0a 20 20 20 20 20 20 68 4d  S_WIDE).      hM
1eed0 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ap = osCreateFil
1eee0 65 4d 61 70 70 69 6e 67 57 28 70 53 68 6d 4e 6f  eMappingW(pShmNo
1eef0 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20  de->hFile.h,.   
1ef00 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47         NULL, PAG
1ef10 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20  E_READWRITE, 0, 
1ef20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20  nByte, NULL.    
1ef30 20 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e    );.#elif defin
1ef40 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
1ef50 48 41 53 5f 41 4e 53 49 29 0a 20 20 20 20 20 20  HAS_ANSI).      
1ef60 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46  hMap = osCreateF
1ef70 69 6c 65 4d 61 70 70 69 6e 67 41 28 70 53 68 6d  ileMappingA(pShm
1ef80 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20  Node->hFile.h,. 
1ef90 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50           NULL, P
1efa0 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30  AGE_READWRITE, 0
1efb0 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20  , nByte, NULL.  
1efc0 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20      );.#endif.  
1efd0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48      OSTRACE(("SH
1efe0 4d 2d 4d 41 50 2d 43 52 45 41 54 45 20 70 69 64  M-MAP-CREATE pid
1eff0 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c  =%lu, region=%d,
1f000 20 73 69 7a 65 3d 25 64 2c 20 72 63 3d 25 73 5c   size=%d, rc=%s\
1f010 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1f020 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1f030 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68 6d  rocessId(), pShm
1f040 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 6e  Node->nRegion, n
1f050 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Byte,.          
1f060 20 20 20 20 20 68 4d 61 70 20 3f 20 22 6f 6b 22       hMap ? "ok"
1f070 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
1f080 20 20 20 20 20 69 66 28 20 68 4d 61 70 20 29 7b       if( hMap ){
1f090 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66  .        int iOf
1f0a0 66 73 65 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  fset = pShmNode-
1f0b0 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f  >nRegion*szRegio
1f0c0 6e 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  n;.        int i
1f0d0 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f  OffsetShift = iO
1f0e0 66 66 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e  ffset % winSysIn
1f0f0 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47  fo.dwAllocationG
1f100 72 61 6e 75 6c 61 72 69 74 79 3b 0a 23 69 66 20  ranularity;.#if 
1f110 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
1f120 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d 20 6f          pMap = o
1f130 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72  sMapViewOfFileFr
1f140 6f 6d 41 70 70 28 68 4d 61 70 2c 20 46 49 4c 45  omApp(hMap, FILE
1f150 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20 46 49 4c  _MAP_WRITE | FIL
1f160 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20 20  E_MAP_READ,.    
1f170 20 20 20 20 20 20 20 20 69 4f 66 66 73 65 74 20          iOffset 
1f180 2d 20 69 4f 66 66 73 65 74 53 68 69 66 74 2c 20  - iOffsetShift, 
1f190 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73  szRegion + iOffs
1f1a0 65 74 53 68 69 66 74 0a 20 20 20 20 20 20 20 20  etShift.        
1f1b0 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20  );.#else.       
1f1c0 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69 65   pMap = osMapVie
1f1d0 77 4f 66 46 69 6c 65 28 68 4d 61 70 2c 20 46 49  wOfFile(hMap, FI
1f1e0 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20 46  LE_MAP_WRITE | F
1f1f0 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20  ILE_MAP_READ,.  
1f200 20 20 20 20 20 20 20 20 20 20 30 2c 20 69 4f 66            0, iOf
1f210 66 73 65 74 20 2d 20 69 4f 66 66 73 65 74 53 68  fset - iOffsetSh
1f220 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20  ift, szRegion + 
1f230 69 4f 66 66 73 65 74 53 68 69 66 74 0a 20 20 20  iOffsetShift.   
1f240 20 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20       );.#endif. 
1f250 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
1f260 22 53 48 4d 2d 4d 41 50 2d 4d 41 50 20 70 69 64  "SHM-MAP-MAP pid
1f270 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c  =%lu, region=%d,
1f280 20 6f 66 66 73 65 74 3d 25 64 2c 20 73 69 7a 65   offset=%d, size
1f290 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%d, rc=%s\n",. 
1f2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2b0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1f2c0 65 73 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64  essId(), pShmNod
1f2d0 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 69 4f 66 66  e->nRegion, iOff
1f2e0 73 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  set,.           
1f2f0 20 20 20 20 20 20 73 7a 52 65 67 69 6f 6e 2c 20        szRegion, 
1f300 70 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66  pMap ? "ok" : "f
1f310 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ailed"));.      
1f320 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 4d 61  }.      if( !pMa
1f330 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 68  p ){.        pSh
1f340 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  mNode->lastErrno
1f350 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
1f360 72 28 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  r();.        rc 
1f370 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
1f380 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41  LITE_IOERR_SHMMA
1f390 50 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73  P, pShmNode->las
1f3a0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
1f3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3c0 20 22 77 69 6e 53 68 6d 4d 61 70 33 22 2c 20 70   "winShmMap3", p
1f3d0 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
1f3e0 20 20 20 20 20 20 69 66 28 20 68 4d 61 70 20 29        if( hMap )
1f3f0 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68   osCloseHandle(h
1f400 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  Map);.        go
1f410 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
1f420 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
1f430 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e  ShmNode->aRegion
1f440 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69  [pShmNode->nRegi
1f450 6f 6e 5d 2e 70 4d 61 70 20 3d 20 70 4d 61 70 3b  on].pMap = pMap;
1f460 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
1f470 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64  >aRegion[pShmNod
1f480 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 68 4d 61 70  e->nRegion].hMap
1f490 20 3d 20 68 4d 61 70 3b 0a 20 20 20 20 20 20 70   = hMap;.      p
1f4a0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1f4b0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73  ++;.    }.  }..s
1f4c0 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66  hmpage_out:.  if
1f4d0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
1f4e0 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20  ion>iRegion ){. 
1f4f0 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d     int iOffset =
1f500 20 69 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f   iRegion*szRegio
1f510 6e 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73  n;.    int iOffs
1f520 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65  etShift = iOffse
1f530 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64  t % winSysInfo.d
1f540 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75  wAllocationGranu
1f550 6c 61 72 69 74 79 3b 0a 20 20 20 20 63 68 61 72  larity;.    char
1f560 20 2a 70 20 3d 20 28 63 68 61 72 20 2a 29 70 53   *p = (char *)pS
1f570 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b  hmNode->aRegion[
1f580 69 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 3b 0a 20  iRegion].pMap;. 
1f590 20 20 20 2a 70 70 20 3d 20 28 76 6f 69 64 20 2a     *pp = (void *
1f5a0 29 26 70 5b 69 4f 66 66 73 65 74 53 68 69 66 74  )&p[iOffsetShift
1f5b0 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
1f5c0 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  *pp = 0;.  }.  s
1f5d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1f5e0 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
1f5f0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
1f600 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66  ;.}..#else.# def
1f610 69 6e 65 20 77 69 6e 53 68 6d 4d 61 70 20 20 20  ine winShmMap   
1f620 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e    0.# define win
1f630 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64  ShmLock    0.# d
1f640 65 66 69 6e 65 20 77 69 6e 53 68 6d 42 61 72 72  efine winShmBarr
1f650 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20 77  ier 0.# define w
1f660 69 6e 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23  inShmUnmap   0.#
1f670 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
1f680 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
1f690 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e   */../*.** Clean
1f6a0 73 20 75 70 20 74 68 65 20 6d 61 70 70 65 64 20  s up the mapped 
1f6b0 72 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 73 70  region of the sp
1f6c0 65 63 69 66 69 65 64 20 66 69 6c 65 2c 20 69 66  ecified file, if
1f6d0 20 61 6e 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c   any..*/.#if SQL
1f6e0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
1f6f0 45 3e 30 0a 73 74 61 74 69 63 20 69 6e 74 20 77  E>0.static int w
1f700 69 6e 55 6e 6d 61 70 66 69 6c 65 28 77 69 6e 46  inUnmapfile(winF
1f710 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 61  ile *pFile){.  a
1f720 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20  ssert( pFile!=0 
1f730 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
1f740 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c  NMAP-FILE pid=%l
1f750 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 68 4d 61  u, pFile=%p, hMa
1f760 70 3d 25 70 2c 20 70 4d 61 70 52 65 67 69 6f 6e  p=%p, pMapRegion
1f770 3d 25 70 2c 20 22 0a 20 20 20 20 20 20 20 20 20  =%p, ".         
1f780 20 20 22 6d 6d 61 70 53 69 7a 65 3d 25 6c 6c 64    "mmapSize=%lld
1f790 2c 20 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  , mmapSizeActual
1f7a0 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a 65 4d  =%lld, mmapSizeM
1f7b0 61 78 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20 20 20  ax=%lld\n",.    
1f7c0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1f7d0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1f7e0 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 4d  pFile, pFile->hM
1f7f0 61 70 2c 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52  ap, pFile->pMapR
1f800 65 67 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20  egion,.         
1f810 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
1f820 65 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  e, pFile->mmapSi
1f830 7a 65 41 63 74 75 61 6c 2c 20 70 46 69 6c 65 2d  zeActual, pFile-
1f840 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 29 29 3b 0a  >mmapSizeMax));.
1f850 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 61    if( pFile->pMa
1f860 70 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 69  pRegion ){.    i
1f870 66 28 20 21 6f 73 55 6e 6d 61 70 56 69 65 77 4f  f( !osUnmapViewO
1f880 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 70 4d 61  fFile(pFile->pMa
1f890 70 52 65 67 69 6f 6e 29 20 29 7b 0a 20 20 20 20  pRegion) ){.    
1f8a0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
1f8b0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
1f8c0 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54  ror();.      OST
1f8d0 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c  RACE(("UNMAP-FIL
1f8e0 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
1f8f0 3d 25 70 2c 20 70 4d 61 70 52 65 67 69 6f 6e 3d  =%p, pMapRegion=
1f900 25 70 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  %p, ".          
1f910 20 20 20 20 20 22 72 63 3d 53 51 4c 49 54 45 5f       "rc=SQLITE_
1f920 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c 20 6f  IOERR_MMAP\n", o
1f930 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
1f940 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 0a 20  ssId(), pFile,. 
1f950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46                pF
1f960 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
1f970 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1f980 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
1f990 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70  TE_IOERR_MMAP, p
1f9a0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
1f9b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f9c0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e            "winUn
1f9d0 6d 61 70 66 69 6c 65 31 22 2c 20 70 46 69 6c 65  mapfile1", pFile
1f9e0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
1f9f0 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52      pFile->pMapR
1fa00 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 70  egion = 0;.    p
1fa10 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d  File->mmapSize =
1fa20 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d   0;.    pFile->m
1fa30 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20  mapSizeActual = 
1fa40 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69  0;.  }.  if( pFi
1fa50 6c 65 2d 3e 68 4d 61 70 21 3d 4e 55 4c 4c 20 29  le->hMap!=NULL )
1fa60 7b 0a 20 20 20 20 69 66 28 20 21 6f 73 43 6c 6f  {.    if( !osClo
1fa70 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
1fa80 68 4d 61 70 29 20 29 7b 0a 20 20 20 20 20 20 70  hMap) ){.      p
1fa90 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
1faa0 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
1fab0 28 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  ();.      OSTRAC
1fac0 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70  E(("UNMAP-FILE p
1fad0 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
1fae0 2c 20 68 4d 61 70 3d 25 70 2c 20 72 63 3d 53 51  , hMap=%p, rc=SQ
1faf0 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c  LITE_IOERR_MMAP\
1fb00 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1fb10 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1fb20 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c  rocessId(), pFil
1fb30 65 2c 20 70 46 69 6c 65 2d 3e 68 4d 61 70 29 29  e, pFile->hMap))
1fb40 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  ;.      return w
1fb50 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
1fb60 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46  E_IOERR_MMAP, pF
1fb70 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
1fb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb90 20 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e 6d           "winUnm
1fba0 61 70 66 69 6c 65 32 22 2c 20 70 46 69 6c 65 2d  apfile2", pFile-
1fbb0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20  >zPath);.    }. 
1fbc0 20 20 20 70 46 69 6c 65 2d 3e 68 4d 61 70 20 3d     pFile->hMap =
1fbd0 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 53 54   NULL;.  }.  OST
1fbe0 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c  RACE(("UNMAP-FIL
1fbf0 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
1fc00 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
1fc10 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  K\n",.          
1fc20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1fc30 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 29  cessId(), pFile)
1fc40 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1fc50 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1fc60 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72 20 72 65  Memory map or re
1fc70 6d 61 70 20 74 68 65 20 66 69 6c 65 20 6f 70 65  map the file ope
1fc80 6e 65 64 20 62 79 20 66 69 6c 65 2d 64 65 73 63  ned by file-desc
1fc90 72 69 70 74 6f 72 20 70 46 64 20 28 69 66 20 74  riptor pFd (if t
1fca0 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61 6c  he file.** is al
1fcb0 72 65 61 64 79 20 6d 61 70 70 65 64 2c 20 74 68  ready mapped, th
1fcc0 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69  e existing mappi
1fcd0 6e 67 20 69 73 20 72 65 70 6c 61 63 65 64 20 62  ng is replaced b
1fce0 79 20 74 68 65 20 6e 65 77 29 2e 20 4f 72 2c 20  y the new). Or, 
1fcf0 69 66 0a 2a 2a 20 74 68 65 72 65 20 61 6c 72 65  if.** there alre
1fd00 61 64 79 20 65 78 69 73 74 73 20 61 20 6d 61 70  ady exists a map
1fd10 70 69 6e 67 20 66 6f 72 20 74 68 69 73 20 66 69  ping for this fi
1fd20 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72  le, and there ar
1fd30 65 20 73 74 69 6c 6c 0a 2a 2a 20 6f 75 74 73 74  e still.** outst
1fd40 61 6e 64 69 6e 67 20 78 46 65 74 63 68 28 29 20  anding xFetch() 
1fd50 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 69 74  references to it
1fd60 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1fd70 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
1fd80 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e  * If parameter n
1fd90 42 79 74 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61  Byte is non-nega
1fda0 74 69 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73  tive, then it is
1fdb0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
1fdc0 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6d 61  ize of.** the ma
1fdd0 70 70 69 6e 67 20 74 6f 20 63 72 65 61 74 65 2e  pping to create.
1fde0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e   Otherwise, if n
1fdf0 42 79 74 65 20 69 73 20 6c 65 73 73 20 74 68 61  Byte is less tha
1fe00 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
1fe10 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 73 69  .** requested si
1fe20 7a 65 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f  ze is the size o
1fe30 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  f the file on di
1fe40 73 6b 2e 20 54 68 65 20 61 63 74 75 61 6c 20 73  sk. The actual s
1fe50 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 72  ize of the.** cr
1fe60 65 61 74 65 64 20 6d 61 70 70 69 6e 67 20 69 73  eated mapping is
1fe70 20 65 69 74 68 65 72 20 74 68 65 20 72 65 71 75   either the requ
1fe80 65 73 74 65 64 20 73 69 7a 65 20 6f 72 20 74 68  ested size or th
1fe90 65 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72  e value configur
1fea0 65 64 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c 49  ed.** using SQLI
1feb0 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49  TE_FCNTL_MMAP_SI
1fec0 5a 45 2c 20 77 68 69 63 68 65 76 65 72 20 69 73  ZE, whichever is
1fed0 20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20   smaller..**.** 
1fee0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1fef0 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f  urned if no erro
1ff00 72 20 6f 63 63 75 72 73 20 28 65 76 65 6e 20 69  r occurs (even i
1ff10 66 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73  f the mapping is
1ff20 20 6e 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74 65   not.** recreate
1ff30 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  d as a result of
1ff40 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
1ff50 65 72 65 6e 63 65 73 29 20 6f 72 20 61 6e 20 53  erences) or an S
1ff60 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63  QLite error.** c
1ff70 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
1ff80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1ff90 4d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 20  Mapfile(winFile 
1ffa0 2a 70 46 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e  *pFd, sqlite3_in
1ffb0 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 73 71  t64 nByte){.  sq
1ffc0 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4d 61 70  lite3_int64 nMap
1ffd0 20 3d 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20   = nByte;.  int 
1ffe0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  rc;..  assert( n
1fff0 4d 61 70 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e  Map>=0 || pFd->n
20000 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20  FetchOut==0 );. 
20010 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46   OSTRACE(("MAP-F
20020 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ILE pid=%lu, pFi
20030 6c 65 3d 25 70 2c 20 73 69 7a 65 3d 25 6c 6c 64  le=%p, size=%lld
20040 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
20050 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
20060 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 6e 42  essId(), pFd, nB
20070 79 74 65 29 29 3b 0a 0a 20 20 69 66 28 20 70 46  yte));..  if( pF
20080 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20 29  d->nFetchOut>0 )
20090 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
200a0 4b 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30  K;..  if( nMap<0
200b0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   ){.    rc = win
200c0 46 69 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65  FileSize((sqlite
200d0 33 5f 66 69 6c 65 2a 29 70 46 64 2c 20 26 6e 4d  3_file*)pFd, &nM
200e0 61 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ap);.    if( rc 
200f0 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
20100 28 28 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d  (("MAP-FILE pid=
20110 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72  %lu, pFile=%p, r
20120 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  c=SQLITE_IOERR_F
20130 53 54 41 54 5c 6e 22 2c 0a 20 20 20 20 20 20 20  STAT\n",.       
20140 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
20150 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
20160 20 70 46 64 29 29 3b 0a 20 20 20 20 20 20 72 65   pFd));.      re
20170 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
20180 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20  R_FSTAT;.    }. 
20190 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70 3e 70 46   }.  if( nMap>pF
201a0 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29  d->mmapSizeMax )
201b0 7b 0a 20 20 20 20 6e 4d 61 70 20 3d 20 70 46 64  {.    nMap = pFd
201c0 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20  ->mmapSizeMax;. 
201d0 20 7d 0a 20 20 6e 4d 61 70 20 26 3d 20 7e 28 73   }.  nMap &= ~(s
201e0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 77 69  qlite3_int64)(wi
201f0 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53  nSysInfo.dwPageS
20200 69 7a 65 20 2d 20 31 29 3b 0a 0a 20 20 69 66 28  ize - 1);..  if(
20210 20 6e 4d 61 70 3d 3d 30 20 26 26 20 70 46 64 2d   nMap==0 && pFd-
20220 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20  >mmapSize>0 ){. 
20230 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28     winUnmapfile(
20240 70 46 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  pFd);.  }.  if( 
20250 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53  nMap!=pFd->mmapS
20260 69 7a 65 20 29 7b 0a 20 20 20 20 76 6f 69 64 20  ize ){.    void 
20270 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 44  *pNew = 0;.    D
20280 57 4f 52 44 20 70 72 6f 74 65 63 74 20 3d 20 50  WORD protect = P
20290 41 47 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  AGE_READONLY;.  
202a0 20 20 44 57 4f 52 44 20 66 6c 61 67 73 20 3d 20    DWORD flags = 
202b0 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 3b 0a 0a  FILE_MAP_READ;..
202c0 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65      winUnmapfile
202d0 28 70 46 64 29 3b 0a 20 20 20 20 69 66 28 20 28  (pFd);.    if( (
202e0 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  pFd->ctrlFlags &
202f0 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 29   WINFILE_RDONLY)
20300 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 72 6f  ==0 ){.      pro
20310 74 65 63 74 20 3d 20 50 41 47 45 5f 52 45 41 44  tect = PAGE_READ
20320 57 52 49 54 45 3b 0a 20 20 20 20 20 20 66 6c 61  WRITE;.      fla
20330 67 73 20 7c 3d 20 46 49 4c 45 5f 4d 41 50 5f 57  gs |= FILE_MAP_W
20340 52 49 54 45 3b 0a 20 20 20 20 7d 0a 23 69 66 20  RITE;.    }.#if 
20350 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
20360 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20      pFd->hMap = 
20370 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
20380 69 6e 67 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e  ingFromApp(pFd->
20390 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74  h, NULL, protect
203a0 2c 20 6e 4d 61 70 2c 20 4e 55 4c 4c 29 3b 0a 23  , nMap, NULL);.#
203b0 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  elif defined(SQL
203c0 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
203d0 44 45 29 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61  DE).    pFd->hMa
203e0 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65  p = osCreateFile
203f0 4d 61 70 70 69 6e 67 57 28 70 46 64 2d 3e 68 2c  MappingW(pFd->h,
20400 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a   NULL, protect,.
20410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20430 28 44 57 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33  (DWORD)((nMap>>3
20440 32 29 20 26 20 30 78 66 66 66 66 66 66 66 66 29  2) & 0xffffffff)
20450 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20470 20 20 28 44 57 4f 52 44 29 28 6e 4d 61 70 20 26    (DWORD)(nMap &
20480 20 30 78 66 66 66 66 66 66 66 66 29 2c 20 4e 55   0xffffffff), NU
20490 4c 4c 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  LL);.#elif defin
204a0 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
204b0 48 41 53 5f 41 4e 53 49 29 0a 20 20 20 20 70 46  HAS_ANSI).    pF
204c0 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61  d->hMap = osCrea
204d0 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 70  teFileMappingA(p
204e0 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f  Fd->h, NULL, pro
204f0 74 65 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20  tect,.          
20500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20510 20 20 20 20 20 20 28 44 57 4f 52 44 29 28 28 6e        (DWORD)((n
20520 4d 61 70 3e 3e 33 32 29 20 26 20 30 78 66 66 66  Map>>32) & 0xfff
20530 66 66 66 66 66 29 2c 0a 20 20 20 20 20 20 20 20  fffff),.        
20540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20550 20 20 20 20 20 20 20 20 28 44 57 4f 52 44 29 28          (DWORD)(
20560 6e 4d 61 70 20 26 20 30 78 66 66 66 66 66 66 66  nMap & 0xfffffff
20570 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69  f), NULL);.#endi
20580 66 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 68  f.    if( pFd->h
20590 4d 61 70 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  Map==NULL ){.   
205a0 20 20 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e     pFd->lastErrn
205b0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
205c0 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  or();.      rc =
205d0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
205e0 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20  ITE_IOERR_MMAP, 
205f0 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  pFd->lastErrno,.
20600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20610 20 20 20 20 20 20 20 22 77 69 6e 4d 61 70 66 69         "winMapfi
20620 6c 65 31 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68  le1", pFd->zPath
20630 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20  );.      /* Log 
20640 74 68 65 20 65 72 72 6f 72 2c 20 62 75 74 20 63  the error, but c
20650 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f  ontinue normal o
20660 70 65 72 61 74 69 6f 6e 20 75 73 69 6e 67 20 78  peration using x
20670 52 65 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20  Read/xWrite */. 
20680 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d       OSTRACE(("M
20690 41 50 2d 46 49 4c 45 2d 43 52 45 41 54 45 20 70  AP-FILE-CREATE p
206a0 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
206b0 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
206c0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
206d0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
206e0 28 29 2c 20 70 46 64 2c 20 73 71 6c 69 74 65 33  (), pFd, sqlite3
206f0 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
20700 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
20710 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
20720 20 61 73 73 65 72 74 28 20 28 6e 4d 61 70 20 25   assert( (nMap %
20730 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61   winSysInfo.dwPa
20740 67 65 53 69 7a 65 29 3d 3d 30 20 29 3b 0a 20 20  geSize)==0 );.  
20750 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
20760 28 53 49 5a 45 5f 54 29 3d 3d 73 69 7a 65 6f 66  (SIZE_T)==sizeof
20770 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 20  (sqlite3_int64) 
20780 7c 7c 20 6e 4d 61 70 3c 3d 30 78 66 66 66 66 66  || nMap<=0xfffff
20790 66 66 66 20 29 3b 0a 23 69 66 20 53 51 4c 49 54  fff );.#if SQLIT
207a0 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 70  E_OS_WINRT.    p
207b0 4e 65 77 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f  New = osMapViewO
207c0 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 70 46 64  fFileFromApp(pFd
207d0 2d 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30  ->hMap, flags, 0
207e0 2c 20 28 53 49 5a 45 5f 54 29 6e 4d 61 70 29 3b  , (SIZE_T)nMap);
207f0 0a 23 65 6c 73 65 0a 20 20 20 20 70 4e 65 77 20  .#else.    pNew 
20800 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c  = osMapViewOfFil
20810 65 28 70 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61  e(pFd->hMap, fla
20820 67 73 2c 20 30 2c 20 30 2c 20 28 53 49 5a 45 5f  gs, 0, 0, (SIZE_
20830 54 29 6e 4d 61 70 29 3b 0a 23 65 6e 64 69 66 0a  T)nMap);.#endif.
20840 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55      if( pNew==NU
20850 4c 4c 20 29 7b 0a 20 20 20 20 20 20 6f 73 43 6c  LL ){.      osCl
20860 6f 73 65 48 61 6e 64 6c 65 28 70 46 64 2d 3e 68  oseHandle(pFd->h
20870 4d 61 70 29 3b 0a 20 20 20 20 20 20 70 46 64 2d  Map);.      pFd-
20880 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20  >hMap = NULL;.  
20890 20 20 20 20 70 46 64 2d 3e 6c 61 73 74 45 72 72      pFd->lastErr
208a0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
208b0 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20  ror();.      rc 
208c0 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
208d0 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c  LITE_IOERR_MMAP,
208e0 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c   pFd->lastErrno,
208f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20900 20 20 20 20 20 20 20 20 22 77 69 6e 4d 61 70 66          "winMapf
20910 69 6c 65 32 22 2c 20 70 46 64 2d 3e 7a 50 61 74  ile2", pFd->zPat
20920 68 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67  h);.      /* Log
20930 20 74 68 65 20 65 72 72 6f 72 2c 20 62 75 74 20   the error, but 
20940 63 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20  continue normal 
20950 6f 70 65 72 61 74 69 6f 6e 20 75 73 69 6e 67 20  operation using 
20960 78 52 65 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a  xRead/xWrite */.
20970 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
20980 4d 41 50 2d 46 49 4c 45 2d 4d 41 50 20 70 69 64  MAP-FILE-MAP pid
20990 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
209a0 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
209b0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
209c0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
209d0 2c 20 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72  , pFd, sqlite3Er
209e0 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20  rName(rc)));.   
209f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20a00 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  _OK;.    }.    p
20a10 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d  Fd->pMapRegion =
20a20 20 70 4e 65 77 3b 0a 20 20 20 20 70 46 64 2d 3e   pNew;.    pFd->
20a30 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 4d 61 70 3b  mmapSize = nMap;
20a40 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69  .    pFd->mmapSi
20a50 7a 65 41 63 74 75 61 6c 20 3d 20 6e 4d 61 70 3b  zeActual = nMap;
20a60 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28  .  }..  OSTRACE(
20a70 28 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25  ("MAP-FILE pid=%
20a80 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
20a90 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
20aa0 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
20ab0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
20ac0 29 2c 20 70 46 64 29 29 3b 0a 20 20 72 65 74 75  ), pFd));.  retu
20ad0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
20ae0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
20af0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
20b00 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f   */../*.** If po
20b10 73 73 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61  ssible, return a
20b20 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61   pointer to a ma
20b30 70 70 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64  pping of file fd
20b40 20 73 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66   starting at off
20b50 73 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65  set.** iOff. The
20b60 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65   mapping must be
20b70 20 76 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65   valid for at le
20b80 61 73 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a  ast nAmt bytes..
20b90 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20  **.** If such a 
20ba0 70 6f 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f  pointer can be o
20bb0 62 74 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69  btained, store i
20bc0 74 20 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74  t in *pp and ret
20bd0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
20be0 2a 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e  * Or, if one can
20bf0 6e 6f 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  not but no error
20c00 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70   occurs, set *pp
20c10 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e   to 0 and return
20c20 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46   SQLITE_OK..** F
20c30 69 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72  inally, if an er
20c40 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20  ror does occur, 
20c50 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
20c60 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65   error code. The
20c70 20 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20   final.** value 
20c80 6f 66 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69  of *pp is undefi
20c90 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  ned in this case
20ca0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
20cb0 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65  function does re
20cc0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20  turn a pointer, 
20cd0 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  the caller must 
20ce0 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 72 65  eventually.** re
20cf0 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65  lease the refere
20d00 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 77  nce by calling w
20d10 69 6e 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f 0a  inUnfetch()..*/.
20d20 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 65  static int winFe
20d30 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  tch(sqlite3_file
20d40 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20   *fd, i64 iOff, 
20d50 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64 20 2a  int nAmt, void *
20d60 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  *pp){.#if SQLITE
20d70 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
20d80 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 64 20  .  winFile *pFd 
20d90 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20  = (winFile*)fd; 
20da0 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
20db0 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
20dc0 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2a 70  e */.#endif.  *p
20dd0 70 20 3d 20 30 3b 0a 0a 20 20 4f 53 54 52 41 43  p = 0;..  OSTRAC
20de0 45 28 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c  E(("FETCH pid=%l
20df0 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 6f 66 66  u, pFile=%p, off
20e00 73 65 74 3d 25 6c 6c 64 2c 20 61 6d 6f 75 6e 74  set=%lld, amount
20e10 3d 25 64 2c 20 70 70 3d 25 70 5c 6e 22 2c 0a 20  =%d, pp=%p\n",. 
20e20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
20e30 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
20e40 29 2c 20 66 64 2c 20 69 4f 66 66 2c 20 6e 41 6d  ), fd, iOff, nAm
20e50 74 2c 20 70 70 29 29 3b 0a 0a 23 69 66 20 53 51  t, pp));..#if SQ
20e60 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
20e70 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 64 2d 3e  ZE>0.  if( pFd->
20e80 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 29 7b  mmapSizeMax>0 ){
20e90 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 70 4d  .    if( pFd->pM
20ea0 61 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20  apRegion==0 ){. 
20eb0 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69       int rc = wi
20ec0 6e 4d 61 70 66 69 6c 65 28 70 46 64 2c 20 2d 31  nMapfile(pFd, -1
20ed0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
20ee0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20ef0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
20f00 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70  FETCH pid=%lu, p
20f10 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e  File=%p, rc=%s\n
20f20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
20f30 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
20f40 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64  ProcessId(), pFd
20f50 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
20f60 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20  (rc)));.        
20f70 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
20f80 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
20f90 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e   pFd->mmapSize >
20fa0 3d 20 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20  = iOff+nAmt ){. 
20fb0 20 20 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38       *pp = &((u8
20fc0 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69   *)pFd->pMapRegi
20fd0 6f 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20  on)[iOff];.     
20fe0 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b   pFd->nFetchOut+
20ff0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  +;.    }.  }.#en
21000 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  dif..  OSTRACE((
21010 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20  "FETCH pid=%lu, 
21020 70 46 69 6c 65 3d 25 70 2c 20 70 70 3d 25 70 2c  pFile=%p, pp=%p,
21030 20 2a 70 70 3d 25 70 2c 20 72 63 3d 53 51 4c 49   *pp=%p, rc=SQLI
21040 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
21050 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
21060 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64  tProcessId(), fd
21070 2c 20 70 70 2c 20 2a 70 70 29 29 3b 0a 20 20 72  , pp, *pp));.  r
21080 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21090 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
210a0 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20   third argument 
210b0 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  is non-NULL, the
210c0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
210d0 72 65 6c 65 61 73 65 73 20 61 0a 2a 2a 20 72 65  releases a.** re
210e0 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65 64  ference obtained
210f0 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63   by an earlier c
21100 61 6c 6c 20 74 6f 20 77 69 6e 46 65 74 63 68 28  all to winFetch(
21110 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  ). The second.**
21120 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
21130 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
21140 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  n must be the sa
21150 6d 65 20 61 73 20 74 68 65 20 63 6f 72 72 65 73  me as the corres
21160 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67 75 6d  ponding.** argum
21170 65 6e 74 20 74 68 61 74 20 77 61 73 20 70 61 73  ent that was pas
21180 73 65 64 20 74 6f 20 74 68 65 20 77 69 6e 46 65  sed to the winFe
21190 74 63 68 28 29 20 69 6e 76 6f 63 61 74 69 6f 6e  tch() invocation
211a0 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74  ..**.** Or, if t
211b0 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
211c0 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
211d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
211e0 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 0a 2a 2a   being called.**
211f0 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65 20 56   to inform the V
21200 46 53 20 6c 61 79 65 72 20 74 68 61 74 2c 20 61  FS layer that, a
21210 63 63 6f 72 64 69 6e 67 20 74 6f 20 50 4f 53 49  ccording to POSI
21220 58 2c 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20  X, any existing 
21230 6d 61 70 70 69 6e 67 0a 2a 2a 20 6d 61 79 20 6e  mapping.** may n
21240 6f 77 20 62 65 20 69 6e 76 61 6c 69 64 20 61 6e  ow be invalid an
21250 64 20 73 68 6f 75 6c 64 20 62 65 20 75 6e 6d 61  d should be unma
21260 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pped..*/.static 
21270 69 6e 74 20 77 69 6e 55 6e 66 65 74 63 68 28 73  int winUnfetch(s
21280 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
21290 20 69 36 34 20 69 4f 66 66 2c 20 76 6f 69 64 20   i64 iOff, void 
212a0 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  *p){.#if SQLITE_
212b0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
212c0 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 64 20 3d    winFile *pFd =
212d0 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20   (winFile*)fd;  
212e0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
212f0 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
21300 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 70 3d 3d   */..  /* If p==
21310 30 20 28 75 6e 6d 61 70 20 74 68 65 20 65 6e 74  0 (unmap the ent
21320 69 72 65 20 66 69 6c 65 29 20 74 68 65 6e 20 74  ire file) then t
21330 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20  here must be no 
21340 6f 75 74 73 74 61 6e 64 69 6e 67 0a 20 20 2a 2a  outstanding.  **
21350 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e 63   xFetch referenc
21360 65 73 2e 20 4f 72 2c 20 69 66 20 70 21 3d 30 20  es. Or, if p!=0 
21370 28 6d 65 61 6e 69 6e 67 20 69 74 20 69 73 20 61  (meaning it is a
21380 6e 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e  n xFetch referen
21390 63 65 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74  ce),.  ** then t
213a0 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 74 20  here must be at 
213b0 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61  least one outsta
213c0 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 73 73  nding.  */.  ass
213d0 65 72 74 28 20 28 70 3d 3d 30 29 3d 3d 28 70 46  ert( (p==0)==(pF
213e0 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 29  d->nFetchOut==0)
213f0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 21 3d   );..  /* If p!=
21400 30 2c 20 69 74 20 6d 75 73 74 20 6d 61 74 63 68  0, it must match
21410 20 74 68 65 20 69 4f 66 66 20 76 61 6c 75 65 2e   the iOff value.
21420 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 3d   */.  assert( p=
21430 3d 30 20 7c 7c 20 70 3d 3d 26 28 28 75 38 20 2a  =0 || p==&((u8 *
21440 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  )pFd->pMapRegion
21450 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20 20 4f 53  )[iOff] );..  OS
21460 54 52 41 43 45 28 28 22 55 4e 46 45 54 43 48 20  TRACE(("UNFETCH 
21470 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
21480 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20  p, offset=%lld, 
21490 70 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20  p=%p\n",.       
214a0 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
214b0 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64  ProcessId(), pFd
214c0 2c 20 69 4f 66 66 2c 20 70 29 29 3b 0a 0a 20 20  , iOff, p));..  
214d0 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70 46 64  if( p ){.    pFd
214e0 2d 3e 6e 46 65 74 63 68 4f 75 74 2d 2d 3b 0a 20  ->nFetchOut--;. 
214f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46   }else{.    /* F
21500 49 58 4d 45 3a 20 20 49 66 20 57 69 6e 64 6f 77  IXME:  If Window
21510 73 20 74 72 75 6c 79 20 61 6c 77 61 79 73 20 70  s truly always p
21520 72 65 76 65 6e 74 73 20 74 72 75 6e 63 61 74 69  revents truncati
21530 6e 67 20 6f 72 20 64 65 6c 65 74 69 6e 67 20 61  ng or deleting a
21540 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 77 68 69  .    ** file whi
21550 6c 65 20 61 20 6d 61 70 70 69 6e 67 20 69 73 20  le a mapping is 
21560 68 65 6c 64 2c 20 74 68 65 6e 20 74 68 65 20 66  held, then the f
21570 6f 6c 6c 6f 77 69 6e 67 20 77 69 6e 55 6e 6d 61  ollowing winUnma
21580 70 66 69 6c 65 28 29 20 63 61 6c 6c 0a 20 20 20  pfile() call.   
21590 20 2a 2a 20 69 73 20 75 6e 6e 65 63 65 73 73 61   ** is unnecessa
215a0 72 79 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65  ry can be omitte
215b0 64 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20  d - potentially 
215c0 69 6d 70 72 6f 76 69 6e 67 0a 20 20 20 20 2a 2a  improving.    **
215d0 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 20 20 2a   performance.  *
215e0 2f 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69  /.    winUnmapfi
215f0 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20  le(pFd);.  }..  
21600 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65  assert( pFd->nFe
21610 74 63 68 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6e  tchOut>=0 );.#en
21620 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  dif..  OSTRACE((
21630 22 55 4e 46 45 54 43 48 20 70 69 64 3d 25 6c 75  "UNFETCH pid=%lu
21640 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53  , pFile=%p, rc=S
21650 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
21660 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
21670 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
21680 20 66 64 29 29 3b 0a 20 20 72 65 74 75 72 6e 20   fd));.  return 
21690 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
216a0 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68  .** Here ends th
216b0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
216c0 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f   of all sqlite3_
216d0 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a  file methods..**
216e0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
216f0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69  ******* End sqli
21700 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73  te3_file Methods
21710 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
21720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21730 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
21740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
21780 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63  ../*.** This vec
21790 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20  tor defines all 
217a0 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74  the methods that
217b0 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20   can operate on 
217c0 61 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69  an.** sqlite3_fi
217d0 6c 65 20 66 6f 72 20 77 69 6e 33 32 2e 0a 2a 2f  le for win32..*/
217e0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
217f0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
21800 20 77 69 6e 49 6f 4d 65 74 68 6f 64 20 3d 20 7b   winIoMethod = {
21810 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20  .  3,           
21820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21830 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
21840 2f 0a 20 20 77 69 6e 43 6c 6f 73 65 2c 20 20 20  /.  winClose,   
21850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21860 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f      /* xClose */
21870 0a 20 20 77 69 6e 52 65 61 64 2c 20 20 20 20 20  .  winRead,     
21880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21890 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20     /* xRead */. 
218a0 20 77 69 6e 57 72 69 74 65 2c 20 20 20 20 20 20   winWrite,      
218b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218c0 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20 20   /* xWrite */.  
218d0 77 69 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20  winTruncate,    
218e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218f0 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a  /* xTruncate */.
21900 20 20 77 69 6e 53 79 6e 63 2c 20 20 20 20 20 20    winSync,      
21910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21920 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20    /* xSync */.  
21930 77 69 6e 46 69 6c 65 53 69 7a 65 2c 20 20 20 20  winFileSize,    
21940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21950 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a  /* xFileSize */.
21960 20 20 77 69 6e 4c 6f 63 6b 2c 20 20 20 20 20 20    winLock,      
21970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21980 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20    /* xLock */.  
21990 77 69 6e 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  winUnlock,      
219a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219b0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20  /* xUnlock */.  
219c0 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64  winCheckReserved
219d0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
219e0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
219f0 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 46 69  dLock */.  winFi
21a00 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20  leControl,      
21a10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
21a20 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20  ileControl */.  
21a30 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 2c 20 20  winSectorSize,  
21a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a50 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a  /* xSectorSize *
21a60 2f 0a 20 20 77 69 6e 44 65 76 69 63 65 43 68 61  /.  winDeviceCha
21a70 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 20  racteristics,   
21a80 20 20 20 20 2f 2a 20 78 44 65 76 69 63 65 43 68      /* xDeviceCh
21a90 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f  aracteristics */
21aa0 0a 20 20 77 69 6e 53 68 6d 4d 61 70 2c 20 20 20  .  winShmMap,   
21ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ac0 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f     /* xShmMap */
21ad0 0a 20 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20  .  winShmLock,  
21ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21af0 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a     /* xShmLock *
21b00 2f 0a 20 20 77 69 6e 53 68 6d 42 61 72 72 69 65  /.  winShmBarrie
21b10 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
21b20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69      /* xShmBarri
21b30 65 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 55 6e  er */.  winShmUn
21b40 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  map,            
21b50 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55          /* xShmU
21b60 6e 6d 61 70 20 2a 2f 0a 20 20 77 69 6e 46 65 74  nmap */.  winFet
21b70 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ch,             
21b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65            /* xFe
21b90 74 63 68 20 2a 2f 0a 20 20 77 69 6e 55 6e 66 65  tch */.  winUnfe
21ba0 74 63 68 20 20 20 20 20 20 20 20 20 20 20 20 20  tch             
21bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 66           /* xUnf
21bc0 65 74 63 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a  etch */.};../***
21bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
21c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21c30 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  ****** sqlite3_v
21c40 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  fs methods *****
21c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21c60 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
21c70 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  is division cont
21c80 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ains the impleme
21c90 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f  ntation of metho
21ca0 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c  ds on the.** sql
21cb0 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e  ite3_vfs object.
21cc0 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .*/..#if defined
21cd0 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 2f 2a 0a  (__CYGWIN__)./*.
21ce0 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 66 69 6c  ** Convert a fil
21cf0 65 6e 61 6d 65 20 66 72 6f 6d 20 77 68 61 74 65  ename from whate
21d00 76 65 72 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ver the underlyi
21d10 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ng operating sys
21d20 74 65 6d 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20  tem.** supports 
21d30 66 6f 72 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e  for filenames in
21d40 74 6f 20 55 54 46 2d 38 2e 20 20 53 70 61 63 65  to UTF-8.  Space
21d50 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 73   to hold the res
21d60 75 6c 74 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e  ult is.** obtain
21d70 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61  ed from malloc a
21d80 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
21d90 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
21da0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
21db0 74 69 63 20 63 68 61 72 20 2a 77 69 6e 43 6f 6e  tic char *winCon
21dc0 76 65 72 74 54 6f 55 74 66 38 46 69 6c 65 6e 61  vertToUtf8Filena
21dd0 6d 65 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  me(const void *z
21de0 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61  Filename){.  cha
21df0 72 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  r *zConverted = 
21e00 30 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28  0;.  if( osIsNT(
21e10 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72  ) ){.    zConver
21e20 74 65 64 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65  ted = winUnicode
21e30 54 6f 55 74 66 38 28 7a 46 69 6c 65 6e 61 6d 65  ToUtf8(zFilename
21e40 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  );.  }.#ifdef SQ
21e50 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
21e60 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
21e70 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 73 71 6c  zConverted = sql
21e80 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f  ite3_win32_mbcs_
21e90 74 6f 5f 75 74 66 38 28 7a 46 69 6c 65 6e 61 6d  to_utf8(zFilenam
21ea0 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  e);.  }.#endif. 
21eb0 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20   /* caller will 
21ec0 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65  handle out of me
21ed0 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e  mory */.  return
21ee0 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 23   zConverted;.}.#
21ef0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  endif../*.** Con
21f00 76 65 72 74 20 61 20 55 54 46 2d 38 20 66 69 6c  vert a UTF-8 fil
21f10 65 6e 61 6d 65 20 69 6e 74 6f 20 77 68 61 74 65  ename into whate
21f20 76 65 72 20 66 6f 72 6d 20 74 68 65 20 75 6e 64  ver form the und
21f30 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  erlying.** opera
21f40 74 69 6e 67 20 73 79 73 74 65 6d 20 77 61 6e 74  ting system want
21f50 73 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e 2e 20  s filenames in. 
21f60 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
21f70 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 73 20  he result.** is 
21f80 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
21f90 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65  lloc and must be
21fa0 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
21fb0 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
21fc0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
21fd0 64 20 2a 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f  d *winConvertFro
21fe0 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f  mUtf8Filename(co
21ff0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
22000 61 6d 65 29 7b 0a 20 20 76 6f 69 64 20 2a 7a 43  ame){.  void *zC
22010 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20  onverted = 0;.  
22020 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
22030 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d      zConverted =
22040 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64   winUtf8ToUnicod
22050 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
22060 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
22070 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
22080 20 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f 6e 76   else{.    zConv
22090 65 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 5f  erted = sqlite3_
220a0 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62  win32_utf8_to_mb
220b0 63 73 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  cs(zFilename);. 
220c0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 63   }.#endif.  /* c
220d0 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c  aller will handl
220e0 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20  e out of memory 
220f0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e  */.  return zCon
22100 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  verted;.}../*.**
22110 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
22120 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20  eturns non-zero 
22130 69 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64  if the specified
22140 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 62 75   UTF-8 string bu
22150 66 66 65 72 0a 2a 2a 20 65 6e 64 73 20 77 69 74  ffer.** ends wit
22160 68 20 61 20 64 69 72 65 63 74 6f 72 79 20 73 65  h a directory se
22170 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65  parator characte
22180 72 20 6f 72 20 6f 6e 65 20 77 61 73 20 73 75 63  r or one was suc
22190 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 61 64 64  cessfully.** add
221a0 65 64 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 61  ed to it..*/.sta
221b0 74 69 63 20 69 6e 74 20 77 69 6e 4d 61 6b 65 45  tic int winMakeE
221c0 6e 64 49 6e 44 69 72 53 65 70 28 69 6e 74 20 6e  ndInDirSep(int n
221d0 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
221e0 7b 0a 20 20 69 66 28 20 7a 42 75 66 20 29 7b 0a  {.  if( zBuf ){.
221f0 20 20 20 20 69 6e 74 20 6e 4c 65 6e 20 3d 20 73      int nLen = s
22200 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
22210 42 75 66 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c  Buf);.    if( nL
22220 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66  en>0 ){.      if
22230 28 20 77 69 6e 49 73 44 69 72 53 65 70 28 7a 42  ( winIsDirSep(zB
22240 75 66 5b 6e 4c 65 6e 2d 31 5d 29 20 29 7b 0a 20  uf[nLen-1]) ){. 
22250 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
22260 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
22270 20 6e 4c 65 6e 2b 31 3c 6e 42 75 66 20 29 7b 0a   nLen+1<nBuf ){.
22280 20 20 20 20 20 20 20 20 7a 42 75 66 5b 6e 4c 65          zBuf[nLe
22290 6e 5d 20 3d 20 77 69 6e 47 65 74 44 69 72 53 65  n] = winGetDirSe
222a0 70 28 29 3b 0a 20 20 20 20 20 20 20 20 7a 42 75  p();.        zBu
222b0 66 5b 6e 4c 65 6e 2b 31 5d 20 3d 20 27 5c 30 27  f[nLen+1] = '\0'
222c0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
222d0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
222e0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
222f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
22300 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  e a temporary fi
22310 6c 65 20 6e 61 6d 65 20 61 6e 64 20 73 74 6f 72  le name and stor
22320 65 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20  e the resulting 
22330 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 70 7a 42  pointer into pzB
22340 75 66 2e 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  uf..** The point
22350 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e 20 70  er returned in p
22360 7a 42 75 66 20 6d 75 73 74 20 62 65 20 66 72 65  zBuf must be fre
22370 65 64 20 76 69 61 20 73 71 6c 69 74 65 33 5f 66  ed via sqlite3_f
22380 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ree()..*/.static
22390 20 69 6e 74 20 77 69 6e 47 65 74 54 65 6d 70 6e   int winGetTempn
223a0 61 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ame(sqlite3_vfs 
223b0 2a 70 56 66 73 2c 20 63 68 61 72 20 2a 2a 70 7a  *pVfs, char **pz
223c0 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63  Buf){.  static c
223d0 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20  har zChars[] =. 
223e0 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c     "abcdefghijkl
223f0 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a  mnopqrstuvwxyz".
22400 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b      "ABCDEFGHIJK
22410 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22  LMNOPQRSTUVWXYZ"
22420 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38 39  .    "0123456789
22430 22 3b 0a 20 20 73 69 7a 65 5f 74 20 69 2c 20 6a  ";.  size_t i, j
22440 3b 0a 20 20 69 6e 74 20 6e 50 72 65 20 3d 20 73  ;.  int nPre = s
22450 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 53  qlite3Strlen30(S
22460 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
22470 50 52 45 46 49 58 29 3b 0a 20 20 69 6e 74 20 6e  PREFIX);.  int n
22480 4d 61 78 2c 20 6e 42 75 66 2c 20 6e 44 69 72 2c  Max, nBuf, nDir,
22490 20 6e 4c 65 6e 3b 0a 20 20 63 68 61 72 20 2a 7a   nLen;.  char *z
224a0 42 75 66 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20  Buf;..  /* It's 
224b0 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
224c0 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
224d0 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
224e0 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
224f0 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
22500 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
22510 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
22520 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
22530 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
22540 66 61 69 6c 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  failing..  */.  
22550 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
22560 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
22570 4f 45 52 52 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  OERR );..  /* Al
22580 6c 6f 63 61 74 65 20 61 20 74 65 6d 70 6f 72 61  locate a tempora
22590 72 79 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f  ry buffer to sto
225a0 72 65 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61  re the fully qua
225b0 6c 69 66 69 65 64 20 66 69 6c 65 0a 20 20 2a 2a  lified file.  **
225c0 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 74 65   name for the te
225d0 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 49  mporary file.  I
225e0 66 20 74 68 69 73 20 66 61 69 6c 73 2c 20 77 65  f this fails, we
225f0 20 63 61 6e 6e 6f 74 20 63 6f 6e 74 69 6e 75 65   cannot continue
22600 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 61 78 20 3d 20  ..  */.  nMax = 
22610 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
22620 3b 20 6e 42 75 66 20 3d 20 6e 4d 61 78 20 2b 20  ; nBuf = nMax + 
22630 32 3b 0a 20 20 7a 42 75 66 20 3d 20 73 71 6c 69  2;.  zBuf = sqli
22640 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
22650 42 75 66 20 29 3b 0a 20 20 69 66 28 20 21 7a 42  Buf );.  if( !zB
22660 75 66 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  uf ){.    OSTRAC
22670 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
22680 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
22690 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20  R_NOMEM\n"));.  
226a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
226b0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  IOERR_NOMEM;.  }
226c0 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
226d0 74 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  t the effective 
226e0 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
226f0 6f 72 79 2e 20 20 46 69 72 73 74 2c 20 63 68 65  ory.  First, che
22700 63 6b 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 68  ck if one.  ** h
22710 61 73 20 62 65 65 6e 20 65 78 70 6c 69 63 69 74  as been explicit
22720 6c 79 20 73 65 74 20 62 79 20 74 68 65 20 61 70  ly set by the ap
22730 70 6c 69 63 61 74 69 6f 6e 3b 20 6f 74 68 65 72  plication; other
22740 77 69 73 65 2c 20 75 73 65 20 74 68 65 20 6f 6e  wise, use the on
22750 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65  e.  ** configure
22760 64 20 62 79 20 74 68 65 20 6f 70 65 72 61 74 69  d by the operati
22770 6e 67 20 73 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a  ng system..  */.
22780 20 20 6e 44 69 72 20 3d 20 6e 4d 61 78 20 2d 20    nDir = nMax - 
22790 28 6e 50 72 65 20 2b 20 31 35 29 3b 0a 20 20 61  (nPre + 15);.  a
227a0 73 73 65 72 74 28 20 6e 44 69 72 3e 30 20 29 3b  ssert( nDir>0 );
227b0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74  .  if( sqlite3_t
227c0 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b  emp_directory ){
227d0 0a 20 20 20 20 69 6e 74 20 6e 44 69 72 4c 65 6e  .    int nDirLen
227e0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
227f0 33 30 28 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  30(sqlite3_temp_
22800 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20  directory);.    
22810 69 66 28 20 6e 44 69 72 4c 65 6e 3e 30 20 29 7b  if( nDirLen>0 ){
22820 0a 20 20 20 20 20 20 69 66 28 20 21 77 69 6e 49  .      if( !winI
22830 73 44 69 72 53 65 70 28 73 71 6c 69 74 65 33 5f  sDirSep(sqlite3_
22840 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 5b 6e  temp_directory[n
22850 44 69 72 4c 65 6e 2d 31 5d 29 20 29 7b 0a 20 20  DirLen-1]) ){.  
22860 20 20 20 20 20 20 6e 44 69 72 4c 65 6e 2b 2b 3b        nDirLen++;
22870 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
22880 66 28 20 6e 44 69 72 4c 65 6e 3e 6e 44 69 72 20  f( nDirLen>nDir 
22890 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
228a0 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20  e3_free(zBuf);. 
228b0 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
228c0 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
228d0 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e  c=SQLITE_ERROR\n
228e0 22 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  "));.        ret
228f0 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
22900 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30 2c  SQLITE_ERROR, 0,
22910 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65   "winGetTempname
22920 31 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  1", 0);.      }.
22930 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
22940 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75  printf(nMax, zBu
22950 66 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33  f, "%s", sqlite3
22960 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29  _temp_directory)
22970 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 20  ;.    }.  }.#if 
22980 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
22990 5f 5f 29 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  __).  else{.    
229a0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
229b0 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a  r *azDirs[] = {.
229c0 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74         0, /* get
229d0 65 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d 50 44  env("SQLITE_TMPD
229e0 49 52 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 30  IR") */.       0
229f0 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 54 4d 50  , /* getenv("TMP
22a00 44 49 52 22 29 20 2a 2f 0a 20 20 20 20 20 20 20  DIR") */.       
22a10 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 54 4d  0, /* getenv("TM
22a20 50 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c  P") */.       0,
22a30 20 2f 2a 20 67 65 74 65 6e 76 28 22 54 45 4d 50   /* getenv("TEMP
22a40 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20  ") */.       0, 
22a50 2f 2a 20 67 65 74 65 6e 76 28 22 55 53 45 52 50  /* getenv("USERP
22a60 52 4f 46 49 4c 45 22 29 20 2a 2f 0a 20 20 20 20  ROFILE") */.    
22a70 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20     "/var/tmp",. 
22a80 20 20 20 20 20 20 22 2f 75 73 72 2f 74 6d 70 22        "/usr/tmp"
22a90 2c 0a 20 20 20 20 20 20 20 22 2f 74 6d 70 22 2c  ,.       "/tmp",
22aa0 0a 20 20 20 20 20 20 20 22 2e 22 2c 0a 20 20 20  .       ".",.   
22ab0 20 20 20 20 30 20 20 20 20 20 20 20 20 2f 2a 20      0        /* 
22ac0 4c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72 20  List terminator 
22ad0 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 75 6e  */.    };.    un
22ae0 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20  signed int i;.  
22af0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
22b00 69 72 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  ir = 0;..    if(
22b10 20 21 61 7a 44 69 72 73 5b 30 5d 20 29 20 61 7a   !azDirs[0] ) az
22b20 44 69 72 73 5b 30 5d 20 3d 20 67 65 74 65 6e 76  Dirs[0] = getenv
22b30 28 22 53 51 4c 49 54 45 5f 54 4d 50 44 49 52 22  ("SQLITE_TMPDIR"
22b40 29 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69  );.    if( !azDi
22b50 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b 31  rs[1] ) azDirs[1
22b60 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 44  ] = getenv("TMPD
22b70 49 52 22 29 3b 0a 20 20 20 20 69 66 28 20 21 61  IR");.    if( !a
22b80 7a 44 69 72 73 5b 32 5d 20 29 20 61 7a 44 69 72  zDirs[2] ) azDir
22b90 73 5b 32 5d 20 3d 20 67 65 74 65 6e 76 28 22 54  s[2] = getenv("T
22ba0 4d 50 22 29 3b 0a 20 20 20 20 69 66 28 20 21 61  MP");.    if( !a
22bb0 7a 44 69 72 73 5b 33 5d 20 29 20 61 7a 44 69 72  zDirs[3] ) azDir
22bc0 73 5b 33 5d 20 3d 20 67 65 74 65 6e 76 28 22 54  s[3] = getenv("T
22bd0 45 4d 50 22 29 3b 0a 20 20 20 20 69 66 28 20 21  EMP");.    if( !
22be0 61 7a 44 69 72 73 5b 34 5d 20 29 20 61 7a 44 69  azDirs[4] ) azDi
22bf0 72 73 5b 34 5d 20 3d 20 67 65 74 65 6e 76 28 22  rs[4] = getenv("
22c00 55 53 45 52 50 52 4f 46 49 4c 45 22 29 3b 0a 20  USERPROFILE");. 
22c10 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
22c20 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a  zeof(azDirs)/siz
22c30 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20  eof(azDirs[0]); 
22c40 7a 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d  zDir=azDirs[i++]
22c50 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 7a  ){.      void *z
22c60 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 20 20 20  Converted;.     
22c70 20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29 20 63   if( zDir==0 ) c
22c80 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 2f  ontinue;.      /
22c90 2a 20 49 66 20 74 68 65 20 70 61 74 68 20 73 74  * If the path st
22ca0 61 72 74 73 20 77 69 74 68 20 61 20 64 72 69 76  arts with a driv
22cb0 65 20 6c 65 74 74 65 72 20 66 6f 6c 6c 6f 77 65  e letter followe
22cc0 64 20 62 79 20 74 68 65 20 63 6f 6c 6f 6e 0a 20  d by the colon. 
22cd0 20 20 20 20 20 2a 2a 20 63 68 61 72 61 63 74 65       ** characte
22ce0 72 2c 20 61 73 73 75 6d 65 20 69 74 20 69 73 20  r, assume it is 
22cf0 61 6c 72 65 61 64 79 20 61 20 6e 61 74 69 76 65  already a native
22d00 20 57 69 6e 33 32 20 70 61 74 68 3b 20 6f 74 68   Win32 path; oth
22d10 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a  erwise,.      **
22d20 20 69 74 20 6d 75 73 74 20 62 65 20 63 6f 6e 76   it must be conv
22d30 65 72 74 65 64 20 74 6f 20 61 20 6e 61 74 69 76  erted to a nativ
22d40 65 20 57 69 6e 33 32 20 70 61 74 68 20 76 69 61  e Win32 path via
22d50 20 74 68 65 20 43 79 67 77 69 6e 20 41 50 49 0a   the Cygwin API.
22d60 20 20 20 20 20 20 2a 2a 20 70 72 69 6f 72 20 74        ** prior t
22d70 6f 20 75 73 69 6e 67 20 69 74 2e 0a 20 20 20 20  o using it..    
22d80 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 77    */.      if( w
22d90 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72 41  inIsDriveLetterA
22da0 6e 64 43 6f 6c 6f 6e 28 7a 44 69 72 29 20 29 7b  ndColon(zDir) ){
22db0 0a 20 20 20 20 20 20 20 20 7a 43 6f 6e 76 65 72  .        zConver
22dc0 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74  ted = winConvert
22dd0 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65  FromUtf8Filename
22de0 28 7a 44 69 72 29 3b 0a 20 20 20 20 20 20 20 20  (zDir);.        
22df0 69 66 28 20 21 7a 43 6f 6e 76 65 72 74 65 64 20  if( !zConverted 
22e00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
22e10 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
22e20 0a 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41  .          OSTRA
22e30 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
22e40 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
22e50 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20  RR_NOMEM\n"));. 
22e60 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
22e70 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
22e80 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  EM;.        }.  
22e90 20 20 20 20 20 20 69 66 28 20 77 69 6e 49 73 44        if( winIsD
22ea0 69 72 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29  ir(zConverted) )
22eb0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
22ec0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61  te3_snprintf(nMa
22ed0 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a  x, zBuf, "%s", z
22ee0 44 69 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Dir);.          
22ef0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
22f00 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
22f10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
22f20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
22f30 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
22f40 72 74 65 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c  rted);.      }el
22f50 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6e  se{.        zCon
22f60 76 65 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33  verted = sqlite3
22f70 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61 78  MallocZero( nMax
22f80 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  +1 );.        if
22f90 28 20 21 7a 43 6f 6e 76 65 72 74 65 64 20 29 7b  ( !zConverted ){
22fa0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
22fb0 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20  e3_free(zBuf);. 
22fc0 20 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45           OSTRACE
22fd0 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
22fe0 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
22ff0 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20  _NOMEM\n"));.   
23000 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
23010 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
23020 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23030 20 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63      if( cygwin_c
23040 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20 20 20 20  onv_path(.      
23050 20 20 20 20 20 20 20 20 20 20 6f 73 49 73 4e 54            osIsNT
23060 28 29 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54  () ? CCP_POSIX_T
23070 4f 5f 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f  O_WIN_W : CCP_PO
23080 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 2c 20 7a 44  SIX_TO_WIN_A, zD
23090 69 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ir,.            
230a0 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 2c 20      zConverted, 
230b0 6e 4d 61 78 2b 31 29 3c 30 20 29 7b 0a 20 20 20  nMax+1)<0 ){.   
230c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
230d0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
230e0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
230f0 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20  e3_free(zBuf);. 
23100 20 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45           OSTRACE
23110 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
23120 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
23130 5f 43 4f 4e 56 50 41 54 48 5c 6e 22 29 29 3b 0a  _CONVPATH\n"));.
23140 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
23150 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
23160 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41  ITE_IOERR_CONVPA
23170 54 48 2c 20 28 44 57 4f 52 44 29 65 72 72 6e 6f  TH, (DWORD)errno
23180 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
231a0 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 32 22  winGetTempname2"
231b0 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 20 20 20  , zDir);.       
231c0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 77   }.        if( w
231d0 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65 72 74  inIsDir(zConvert
231e0 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ed) ){.         
231f0 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
23200 74 2c 20 77 65 20 6b 6e 6f 77 20 74 68 65 20 63  t, we know the c
23210 61 6e 64 69 64 61 74 65 20 64 69 72 65 63 74 6f  andidate directo
23220 72 79 20 65 78 69 73 74 73 20 61 6e 64 20 73 68  ry exists and sh
23230 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 20 20 2a  ould.          *
23240 2a 20 62 65 20 75 73 65 64 2e 20 20 48 6f 77 65  * be used.  Howe
23250 76 65 72 2c 20 77 65 20 6d 61 79 20 6e 65 65 64  ver, we may need
23260 20 74 6f 20 63 6f 6e 76 65 72 74 20 74 68 65 20   to convert the 
23270 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
23280 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  g.          ** i
23290 74 73 20 6e 61 6d 65 20 69 6e 74 6f 20 55 54 46  ts name into UTF
232a0 2d 38 20 28 69 2e 65 2e 20 69 66 20 69 74 20 69  -8 (i.e. if it i
232b0 73 20 55 54 46 2d 31 36 20 72 69 67 68 74 20 6e  s UTF-16 right n
232c0 6f 77 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ow)..          *
232d0 2f 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  /.          char
232e0 20 2a 7a 55 74 66 38 20 3d 20 77 69 6e 43 6f 6e   *zUtf8 = winCon
232f0 76 65 72 74 54 6f 55 74 66 38 46 69 6c 65 6e 61  vertToUtf8Filena
23300 6d 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  me(zConverted);.
23310 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 7a            if( !z
23320 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 20 20  Utf8 ){.        
23330 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
23340 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
23350 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23360 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
23370 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41 43            OSTRAC
23380 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
23390 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
233a0 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20  R_NOMEM\n"));.  
233b0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
233c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
233d0 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  MEM;.          }
233e0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
233f0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78  e3_snprintf(nMax
23400 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 55  , zBuf, "%s", zU
23410 74 66 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tf8);.          
23420 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74  sqlite3_free(zUt
23430 66 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  f8);.          s
23440 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
23450 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20  verted);.       
23460 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
23470 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
23480 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
23490 74 65 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ted);.      }.  
234a0 20 20 7d 0a 20 20 7d 0a 23 65 6c 69 66 20 21 53    }.  }.#elif !S
234b0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
234c0 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47  & !defined(__CYG
234d0 57 49 4e 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66  WIN__).  else if
234e0 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20  ( osIsNT() ){.  
234f0 20 20 63 68 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a    char *zMulti;.
23500 20 20 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65      LPWSTR zWide
23510 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 4d 61  Path = sqlite3Ma
23520 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61 78 2a 73  llocZero( nMax*s
23530 69 7a 65 6f 66 28 57 43 48 41 52 29 20 29 3b 0a  izeof(WCHAR) );.
23540 20 20 20 20 69 66 28 20 21 7a 57 69 64 65 50 61      if( !zWidePa
23550 74 68 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  th ){.      sqli
23560 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
23570 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
23580 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
23590 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
235a0 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  MEM\n"));.      
235b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
235c0 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ERR_NOMEM;.    }
235d0 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 54 65  .    if( osGetTe
235e0 6d 70 50 61 74 68 57 28 6e 4d 61 78 2c 20 7a 57  mpPathW(nMax, zW
235f0 69 64 65 50 61 74 68 29 3d 3d 30 20 29 7b 0a 20  idePath)==0 ){. 
23600 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
23610 65 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20  e(zWidePath);.  
23620 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
23630 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53  (zBuf);.      OS
23640 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
23650 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
23660 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54  IOERR_GETTEMPPAT
23670 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65  H\n"));.      re
23680 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
23690 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45  (SQLITE_IOERR_GE
236a0 54 54 45 4d 50 50 41 54 48 2c 20 6f 73 47 65 74  TTEMPPATH, osGet
236b0 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
236c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236d0 20 20 20 20 20 20 22 77 69 6e 47 65 74 54 65 6d        "winGetTem
236e0 70 6e 61 6d 65 32 22 2c 20 30 29 3b 0a 20 20 20  pname2", 0);.   
236f0 20 7d 0a 20 20 20 20 7a 4d 75 6c 74 69 20 3d 20   }.    zMulti = 
23700 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38  winUnicodeToUtf8
23710 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20  (zWidePath);.   
23720 20 69 66 28 20 7a 4d 75 6c 74 69 20 29 7b 0a 20   if( zMulti ){. 
23730 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
23740 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66  rintf(nMax, zBuf
23750 2c 20 22 25 73 22 2c 20 7a 4d 75 6c 74 69 29 3b  , "%s", zMulti);
23760 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
23770 72 65 65 28 7a 4d 75 6c 74 69 29 3b 0a 20 20 20  ree(zMulti);.   
23780 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
23790 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20  zWidePath);.    
237a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
237b0 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 50  ite3_free(zWideP
237c0 61 74 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ath);.      sqli
237d0 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
237e0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
237f0 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
23800 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
23810 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  MEM\n"));.      
23820 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
23830 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ERR_NOMEM;.    }
23840 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
23850 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
23860 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68  I.  else{.    ch
23870 61 72 20 2a 7a 55 74 66 38 3b 0a 20 20 20 20 63  ar *zUtf8;.    c
23880 68 61 72 20 2a 7a 4d 62 63 73 50 61 74 68 20 3d  har *zMbcsPath =
23890 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
238a0 72 6f 28 20 6e 4d 61 78 20 29 3b 0a 20 20 20 20  ro( nMax );.    
238b0 69 66 28 20 21 7a 4d 62 63 73 50 61 74 68 20 29  if( !zMbcsPath )
238c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
238d0 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
238e0 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
238f0 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
23900 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
23910 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  n"));.      retu
23920 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
23930 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
23940 20 69 66 28 20 6f 73 47 65 74 54 65 6d 70 50 61   if( osGetTempPa
23950 74 68 41 28 6e 4d 61 78 2c 20 7a 4d 62 63 73 50  thA(nMax, zMbcsP
23960 61 74 68 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ath)==0 ){.     
23970 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
23980 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  uf);.      OSTRA
23990 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
239a0 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
239b0 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 5c 6e  RR_GETTEMPPATH\n
239c0 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "));.      retur
239d0 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
239e0 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45  LITE_IOERR_GETTE
239f0 4d 50 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73  MPPATH, osGetLas
23a00 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
23a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a20 20 20 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61     "winGetTempna
23a30 6d 65 33 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  me3", 0);.    }.
23a40 20 20 20 20 7a 55 74 66 38 20 3d 20 73 71 6c 69      zUtf8 = sqli
23a50 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74  te3_win32_mbcs_t
23a60 6f 5f 75 74 66 38 28 7a 4d 62 63 73 50 61 74 68  o_utf8(zMbcsPath
23a70 29 3b 0a 20 20 20 20 69 66 28 20 7a 55 74 66 38  );.    if( zUtf8
23a80 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
23a90 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c  3_snprintf(nMax,
23aa0 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 55 74   zBuf, "%s", zUt
23ab0 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  f8);.      sqlit
23ac0 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a  e3_free(zUtf8);.
23ad0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23ae0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
23af0 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  uf);.      OSTRA
23b00 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
23b10 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
23b20 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20  RR_NOMEM\n"));. 
23b30 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
23b40 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
23b50 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
23b60 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   /* SQLITE_WIN32
23b70 5f 48 41 53 5f 41 4e 53 49 20 2a 2f 0a 23 65 6e  _HAS_ANSI */.#en
23b80 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
23b90 53 5f 57 49 4e 52 54 20 2a 2f 0a 0a 20 20 2f 2a  S_WINRT */..  /*
23ba0 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d  .  ** Check to m
23bb0 61 6b 65 20 73 75 72 65 20 74 68 65 20 74 65 6d  ake sure the tem
23bc0 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79  porary directory
23bd0 20 65 6e 64 73 20 77 69 74 68 20 61 6e 20 61 70   ends with an ap
23be0 70 72 6f 70 72 69 61 74 65 0a 20 20 2a 2a 20 73  propriate.  ** s
23bf0 65 70 61 72 61 74 6f 72 2e 20 20 49 66 20 69 74  eparator.  If it
23c00 20 64 6f 65 73 20 6e 6f 74 20 61 6e 64 20 74 68   does not and th
23c10 65 72 65 20 69 73 20 6e 6f 74 20 65 6e 6f 75 67  ere is not enoug
23c20 68 20 73 70 61 63 65 20 6c 65 66 74 20 74 6f 20  h space left to 
23c30 61 64 64 0a 20 20 2a 2a 20 6f 6e 65 2c 20 66 61  add.  ** one, fa
23c40 69 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  il..  */.  if( !
23c50 77 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 69 72 53  winMakeEndInDirS
23c60 65 70 28 6e 44 69 72 2b 31 2c 20 7a 42 75 66 29  ep(nDir+1, zBuf)
23c70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
23c80 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
23c90 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
23ca0 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
23cb0 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20  E_ERROR\n"));.  
23cc0 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
23cd0 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f  rror(SQLITE_ERRO
23ce0 52 2c 20 30 2c 20 22 77 69 6e 47 65 74 54 65 6d  R, 0, "winGetTem
23cf0 70 6e 61 6d 65 34 22 2c 20 30 29 3b 0a 20 20 7d  pname4", 0);.  }
23d00 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 68 65 63  ..  /*.  ** Chec
23d10 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75  k that the outpu
23d20 74 20 62 75 66 66 65 72 20 69 73 20 6c 61 72 67  t buffer is larg
23d30 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65  e enough for the
23d40 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 0a   temporary file.
23d50 20 20 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65    ** name in the
23d60 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 61   following forma
23d70 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 22  t:.  **.  **   "
23d80 3c 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63  <temporary_direc
23d90 74 6f 72 79 3e 2f 65 74 69 6c 71 73 5f 58 58 58  tory>/etilqs_XXX
23da0 58 58 58 58 58 58 58 58 58 58 58 58 5c 30 5c 30  XXXXXXXXXXXX\0\0
23db0 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 6e  ".  **.  ** If n
23dc0 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ot, return SQLIT
23dd0 45 5f 45 52 52 4f 52 2e 20 20 54 68 65 20 6e 75  E_ERROR.  The nu
23de0 6d 62 65 72 20 31 37 20 69 73 20 75 73 65 64 20  mber 17 is used 
23df0 68 65 72 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  here in order to
23e00 0a 20 20 2a 2a 20 61 63 63 6f 75 6e 74 20 66 6f  .  ** account fo
23e10 72 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64  r the space used
23e20 20 62 79 20 74 68 65 20 31 35 20 63 68 61 72 61   by the 15 chara
23e30 63 74 65 72 20 72 61 6e 64 6f 6d 20 73 75 66 66  cter random suff
23e40 69 78 20 61 6e 64 20 74 68 65 0a 20 20 2a 2a 20  ix and the.  ** 
23e50 74 77 6f 20 74 72 61 69 6c 69 6e 67 20 4e 55 4c  two trailing NUL
23e60 20 63 68 61 72 61 63 74 65 72 73 2e 20 20 54 68   characters.  Th
23e70 65 20 66 69 6e 61 6c 20 64 69 72 65 63 74 6f 72  e final director
23e80 79 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72  y separator char
23e90 61 63 74 65 72 0a 20 20 2a 2a 20 68 61 73 20 61  acter.  ** has a
23ea0 6c 72 65 61 64 79 20 61 64 64 65 64 20 69 66 20  lready added if 
23eb0 69 74 20 77 61 73 20 6e 6f 74 20 61 6c 72 65 61  it was not alrea
23ec0 64 79 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2f  dy present..  */
23ed0 0a 20 20 6e 4c 65 6e 20 3d 20 73 71 6c 69 74 65  .  nLen = sqlite
23ee0 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b  3Strlen30(zBuf);
23ef0 0a 20 20 69 66 28 20 28 6e 4c 65 6e 20 2b 20 6e  .  if( (nLen + n
23f00 50 72 65 20 2b 20 31 37 29 20 3e 20 6e 42 75 66  Pre + 17) > nBuf
23f10 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
23f20 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
23f30 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
23f40 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
23f50 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20  E_ERROR\n"));.  
23f60 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
23f70 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f  rror(SQLITE_ERRO
23f80 52 2c 20 30 2c 20 22 77 69 6e 47 65 74 54 65 6d  R, 0, "winGetTem
23f90 70 6e 61 6d 65 35 22 2c 20 30 29 3b 0a 20 20 7d  pname5", 0);.  }
23fa0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
23fb0 69 6e 74 66 28 6e 42 75 66 2d 31 36 2d 6e 4c 65  intf(nBuf-16-nLe
23fc0 6e 2c 20 7a 42 75 66 2b 6e 4c 65 6e 2c 20 53 51  n, zBuf+nLen, SQ
23fd0 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
23fe0 52 45 46 49 58 29 3b 0a 0a 20 20 6a 20 3d 20 73  REFIX);..  j = s
23ff0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
24000 42 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Buf);.  sqlite3_
24010 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26  randomness(15, &
24020 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28  zBuf[j]);.  for(
24030 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20  i=0; i<15; i++, 
24040 6a 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a  j++){.    zBuf[j
24050 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73  ] = (char)zChars
24060 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  [ ((unsigned cha
24070 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65  r)zBuf[j])%(size
24080 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b  of(zChars)-1) ];
24090 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d  .  }.  zBuf[j] =
240a0 20 30 3b 0a 20 20 7a 42 75 66 5b 6a 2b 31 5d 20   0;.  zBuf[j+1] 
240b0 3d 20 30 3b 0a 20 20 2a 70 7a 42 75 66 20 3d 20  = 0;.  *pzBuf = 
240c0 7a 42 75 66 3b 0a 0a 20 20 4f 53 54 52 41 43 45  zBuf;..  OSTRACE
240d0 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
240e0 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c   name=%s, rc=SQL
240f0 49 54 45 5f 4f 4b 5c 6e 22 2c 20 7a 42 75 66 29  ITE_OK\n", zBuf)
24100 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
24110 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
24120 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
24130 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 20 69 73  he named file is
24140 20 72 65 61 6c 6c 79 20 61 20 64 69 72 65 63 74   really a direct
24150 6f 72 79 2e 20 20 52 65 74 75 72 6e 20 66 61 6c  ory.  Return fal
24160 73 65 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 73  se if.** it is s
24170 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74  omething other t
24180 68 61 6e 20 61 20 64 69 72 65 63 74 6f 72 79 2c  han a directory,
24190 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 20   or if there is 
241a0 61 6e 79 20 6b 69 6e 64 20 6f 66 20 6d 65 6d 6f  any kind of memo
241b0 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  ry.** allocation
241c0 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61   failure..*/.sta
241d0 74 69 63 20 69 6e 74 20 77 69 6e 49 73 44 69 72  tic int winIsDir
241e0 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 43 6f  (const void *zCo
241f0 6e 76 65 72 74 65 64 29 7b 0a 20 20 44 57 4f 52  nverted){.  DWOR
24200 44 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63  D attr;.  int rc
24210 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61   = 0;.  DWORD la
24220 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 69 66 28 20  stErrno;..  if( 
24230 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
24240 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20  int cnt = 0;.   
24250 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52   WIN32_FILE_ATTR
24260 49 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72  IBUTE_DATA sAttr
24270 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74  Data;.    memset
24280 28 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20  (&sAttrData, 0, 
24290 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61  sizeof(sAttrData
242a0 29 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21  ));.    while( !
242b0 28 72 63 20 3d 20 6f 73 47 65 74 46 69 6c 65 41  (rc = osGetFileA
242c0 74 74 72 69 62 75 74 65 73 45 78 57 28 28 4c 50  ttributesExW((LP
242d0 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
242e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
242f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 47                 G
24300 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e  etFileExInfoStan
24310 64 61 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20  dard,.          
24320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24330 20 20 20 26 73 41 74 74 72 44 61 74 61 29 29 20     &sAttrData)) 
24340 26 26 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72  && winRetryIoerr
24350 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
24360 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 21  o) ){}.    if( !
24370 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
24380 72 6e 20 30 3b 20 2f 2a 20 49 6e 76 61 6c 69 64  rn 0; /* Invalid
24390 20 6e 61 6d 65 3f 20 2a 2f 0a 20 20 20 20 7d 0a   name? */.    }.
243a0 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72      attr = sAttr
243b0 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69  Data.dwFileAttri
243c0 62 75 74 65 73 3b 0a 23 69 66 20 53 51 4c 49 54  butes;.#if SQLIT
243d0 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20  E_OS_WINCE==0.  
243e0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 74 74 72 20  }else{.    attr 
243f0 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  = osGetFileAttri
24400 62 75 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43  butesA((char*)zC
24410 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69  onverted);.#endi
24420 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  f.  }.  return (
24430 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49  attr!=INVALID_FI
24440 4c 45 5f 41 54 54 52 49 42 55 54 45 53 29 20 26  LE_ATTRIBUTES) &
24450 26 20 28 61 74 74 72 26 46 49 4c 45 5f 41 54 54  & (attr&FILE_ATT
24460 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59  RIBUTE_DIRECTORY
24470 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  );.}../*.** Open
24480 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
24490 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 0a  ic int winOpen(.
244a0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
244b0 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 55  Vfs,        /* U
244c0 73 65 64 20 74 6f 20 67 65 74 20 6d 61 78 69 6d  sed to get maxim
244d0 75 6d 20 70 61 74 68 20 6e 61 6d 65 20 6c 65 6e  um path name len
244e0 67 74 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  gth */.  const c
244f0 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
24500 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
24510 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a  e file (UTF-8) *
24520 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
24530 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a   *id,         /*
24540 20 57 72 69 74 65 20 74 68 65 20 53 51 4c 69 74   Write the SQLit
24550 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 68 65  e file handle he
24560 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  re */.  int flag
24570 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
24580 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f 64 65 20 66    /* Open mode f
24590 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  lags */.  int *p
245a0 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20 20 20  OutFlags        
245b0 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20 72 65      /* Status re
245c0 74 75 72 6e 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  turn flags */.){
245d0 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 44  .  HANDLE h;.  D
245e0 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d  WORD lastErrno =
245f0 20 30 3b 0a 20 20 44 57 4f 52 44 20 64 77 44 65   0;.  DWORD dwDe
24600 73 69 72 65 64 41 63 63 65 73 73 3b 0a 20 20 44  siredAccess;.  D
24610 57 4f 52 44 20 64 77 53 68 61 72 65 4d 6f 64 65  WORD dwShareMode
24620 3b 0a 20 20 44 57 4f 52 44 20 64 77 43 72 65 61  ;.  DWORD dwCrea
24630 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 3b  tionDisposition;
24640 0a 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73  .  DWORD dwFlags
24650 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20  AndAttributes = 
24660 30 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  0;.#if SQLITE_OS
24670 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 69 73 54  _WINCE.  int isT
24680 65 6d 70 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  emp = 0;.#endif.
24690 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
246a0 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
246b0 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
246c0 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ted;            
246d0 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e    /* Filename in
246e0 20 4f 53 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a   OS encoding */.
246f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55    const char *zU
24700 74 66 38 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  tf8Name = zName;
24710 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20   /* Filename in 
24720 55 54 46 2d 38 20 65 6e 63 6f 64 69 6e 67 20 2a  UTF-8 encoding *
24730 2f 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  /.  int cnt = 0;
24740 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65  ..  /* If argume
24750 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55  nt zPath is a NU
24760 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73  LL pointer, this
24770 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71   function is req
24780 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20  uired to open.  
24790 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ** a temporary f
247a0 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62 75  ile. Use this bu
247b0 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68  ffer to store th
247c0 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a  e file name in..
247d0 20 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 6d    */.  char *zTm
247e0 70 6e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 46 6f  pname = 0; /* Fo
247f0 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
24800 6e 61 6d 65 2c 20 69 66 20 6e 65 63 65 73 73 61  name, if necessa
24810 72 79 2e 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 63  ry. */..  int rc
24820 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
24830 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63           /* Func
24840 74 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65  tion Return Code
24850 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
24860 28 4e 44 45 42 55 47 29 20 7c 7c 20 53 51 4c 49  (NDEBUG) || SQLI
24870 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e  TE_OS_WINCE.  in
24880 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26  t eType = flags&
24890 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20  0xFFFFFF00;  /* 
248a0 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Type of file to 
248b0 6f 70 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  open */.#endif..
248c0 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76    int isExclusiv
248d0 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  e  = (flags & SQ
248e0 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
248f0 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65  IVE);.  int isDe
24900 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67  lete     = (flag
24910 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
24920 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a  DELETEONCLOSE);.
24930 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20    int isCreate  
24940 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
24950 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
24960 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f  );.  int isReado
24970 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26  nly   = (flags &
24980 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
24990 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73  DONLY);.  int is
249a0 52 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c  ReadWrite  = (fl
249b0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
249c0 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 0a 23  N_READWRITE);..#
249d0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
249e0 69 6e 74 20 69 73 4f 70 65 6e 4a 6f 75 72 6e 61  int isOpenJourna
249f0 6c 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26  l = (isCreate &&
24a00 20 28 0a 20 20 20 20 20 20 20 20 65 54 79 70 65   (.        eType
24a10 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
24a20 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20  STER_JOURNAL.   
24a30 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
24a40 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
24a50 52 4e 41 4c 0a 20 20 20 20 20 7c 7c 20 65 54 79  RNAL.     || eTy
24a60 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
24a70 57 41 4c 0a 20 20 29 29 3b 0a 23 65 6e 64 69 66  WAL.  ));.#endif
24a80 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50  ..  OSTRACE(("OP
24a90 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 70 46 69 6c  EN name=%s, pFil
24aa0 65 3d 25 70 2c 20 66 6c 61 67 73 3d 25 78 2c 20  e=%p, flags=%x, 
24ab0 70 4f 75 74 46 6c 61 67 73 3d 25 70 5c 6e 22 2c  pOutFlags=%p\n",
24ac0 0a 20 20 20 20 20 20 20 20 20 20 20 7a 55 74 66  .           zUtf
24ad0 38 4e 61 6d 65 2c 20 69 64 2c 20 66 6c 61 67 73  8Name, id, flags
24ae0 2c 20 70 4f 75 74 46 6c 61 67 73 29 29 3b 0a 0a  , pOutFlags));..
24af0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66    /* Check the f
24b00 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65  ollowing stateme
24b10 6e 74 73 20 61 72 65 20 74 72 75 65 3a 0a 20 20  nts are true:.  
24b20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78  **.  **   (a) Ex
24b30 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65  actly one of the
24b40 20 52 45 41 44 57 52 49 54 45 20 61 6e 64 20 52   READWRITE and R
24b50 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75  EADONLY flags mu
24b60 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20  st be set, and. 
24b70 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45   **   (b) if CRE
24b80 41 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  ATE is set, then
24b90 20 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20   READWRITE must 
24ba0 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64  also be set, and
24bb0 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45  .  **   (c) if E
24bc0 58 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c  XCLUSIVE is set,
24bd0 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
24be0 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
24bf0 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c   **   (d) if DEL
24c00 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65  ETEONCLOSE is se
24c10 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d  t, then CREATE m
24c20 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e  ust also be set.
24c30 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28  .  */.  assert((
24c40 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c  isReadonly==0 ||
24c50 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29   isReadWrite==0)
24c60 20 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65   && (isReadWrite
24c70 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29   || isReadonly))
24c80 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65  ;.  assert(isCre
24c90 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64  ate==0 || isRead
24ca0 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74  Write);.  assert
24cb0 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20  (isExclusive==0 
24cc0 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20  || isCreate);.  
24cd0 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d  assert(isDelete=
24ce0 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b  =0 || isCreate);
24cf0 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20  ..  /* The main 
24d00 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  DB, main journal
24d10 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d  , WAL file and m
24d20 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72  aster journal ar
24d30 65 20 6e 65 76 65 72 0a 20 20 2a 2a 20 61 75 74  e never.  ** aut
24d40 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
24d50 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79  ed. Nor are they
24d60 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20   ever temporary 
24d70 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73  files.  */.  ass
24d80 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
24d90 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
24da0 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
24db0 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73  MAIN_DB );.  ass
24dc0 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
24dd0 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
24de0 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
24df0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  MAIN_JOURNAL );.
24e00 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
24e10 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
24e20 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
24e30 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
24e40 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NAL );.  assert(
24e50 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
24e60 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
24e70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
24e80 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
24e90 74 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c  that the upper l
24ea0 61 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65  ayer has set one
24eb0 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79   of the "file-ty
24ec0 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20  pe" flags. */.  
24ed0 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53  assert( eType==S
24ee0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
24ef0 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  DB      || eType
24f00 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  ==SQLITE_OPEN_TE
24f10 4d 50 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c 20  MP_DB.       || 
24f20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
24f30 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
24f40 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
24f50 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
24f60 41 4c 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  AL.       || eTy
24f70 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
24f80 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20  SUBJOURNAL   || 
24f90 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
24fa0 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
24fb0 4c 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70  L.       || eTyp
24fc0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
24fd0 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65  RANSIENT_DB || e
24fe0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
24ff0 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 61 73  N_WAL.  );..  as
25000 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29  sert( pFile!=0 )
25010 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65  ;.  memset(pFile
25020 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 46  , 0, sizeof(winF
25030 69 6c 65 29 29 3b 0a 20 20 70 46 69 6c 65 2d 3e  ile));.  pFile->
25040 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44  h = INVALID_HAND
25050 4c 45 5f 56 41 4c 55 45 3b 0a 0a 23 69 66 20 53  LE_VALUE;..#if S
25060 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
25070 20 69 66 28 20 21 7a 55 74 66 38 4e 61 6d 65 20   if( !zUtf8Name 
25080 26 26 20 21 73 71 6c 69 74 65 33 5f 74 65 6d 70  && !sqlite3_temp
25090 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20  _directory ){.  
250a0 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
250b0 4c 49 54 45 5f 45 52 52 4f 52 2c 0a 20 20 20 20  LITE_ERROR,.    
250c0 20 20 20 20 22 73 71 6c 69 74 65 33 5f 74 65 6d      "sqlite3_tem
250d0 70 5f 64 69 72 65 63 74 6f 72 79 20 76 61 72 69  p_directory vari
250e0 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73  able should be s
250f0 65 74 20 66 6f 72 20 57 69 6e 52 54 22 29 3b 0a  et for WinRT");.
25100 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
25110 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
25120 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
25130 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c  function is NULL
25140 2c 20 67 65 6e 65 72 61 74 65 20 61 0a 20 20 2a  , generate a.  *
25150 2a 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  * temporary file
25160 20 6e 61 6d 65 20 74 6f 20 75 73 65 0a 20 20 2a   name to use.  *
25170 2f 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61  /.  if( !zUtf8Na
25180 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  me ){.    assert
25190 28 20 69 73 44 65 6c 65 74 65 20 26 26 20 21 69  ( isDelete && !i
251a0 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  sOpenJournal );.
251b0 20 20 20 20 72 63 20 3d 20 77 69 6e 47 65 74 54      rc = winGetT
251c0 65 6d 70 6e 61 6d 65 28 70 56 66 73 2c 20 26 7a  empname(pVfs, &z
251d0 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  Tmpname);.    if
251e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
251f0 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
25200 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c  (("OPEN name=%s,
25210 20 72 63 3d 25 73 22 2c 20 7a 55 74 66 38 4e 61   rc=%s", zUtf8Na
25220 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  me, sqlite3ErrNa
25230 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20  me(rc)));.      
25240 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
25250 0a 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 20 3d  .    zUtf8Name =
25260 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a   zTmpname;.  }..
25270 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
25280 6c 65 6e 61 6d 65 73 20 61 72 65 20 64 6f 75 62  lenames are doub
25290 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74  le-zero terminat
252a0 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20 6e  ed if they are n
252b0 6f 74 0a 20 20 2a 2a 20 55 52 49 73 20 77 69 74  ot.  ** URIs wit
252c0 68 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20 48  h parameters.  H
252d0 65 6e 63 65 2c 20 74 68 65 79 20 63 61 6e 20 61  ence, they can a
252e0 6c 77 61 79 73 20 62 65 20 70 61 73 73 65 64 20  lways be passed 
252f0 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65  into.  ** sqlite
25300 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
25310 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
25320 28 20 28 65 54 79 70 65 21 3d 53 51 4c 49 54 45  ( (eType!=SQLITE
25330 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c  _OPEN_MAIN_DB) |
25340 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  | (flags & SQLIT
25350 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 0a 20  E_OPEN_URI) ||. 
25360 20 20 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 5b        zUtf8Name[
25370 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
25380 7a 55 74 66 38 4e 61 6d 65 29 2b 31 5d 3d 3d 30  zUtf8Name)+1]==0
25390 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72   );..  /* Conver
253a0 74 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 74  t the filename t
253b0 6f 20 74 68 65 20 73 79 73 74 65 6d 20 65 6e 63  o the system enc
253c0 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e  oding. */.  zCon
253d0 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76  verted = winConv
253e0 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e  ertFromUtf8Filen
253f0 61 6d 65 28 7a 55 74 66 38 4e 61 6d 65 29 3b 0a  ame(zUtf8Name);.
25400 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
25410 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
25420 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65  e3_free(zTmpname
25430 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
25440 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72  "OPEN name=%s, r
25450 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
25460 4f 4d 45 4d 22 2c 20 7a 55 74 66 38 4e 61 6d 65  OMEM", zUtf8Name
25470 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
25480 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
25490 4d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 77 69  M;.  }..  if( wi
254a0 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65 72 74 65  nIsDir(zConverte
254b0 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  d) ){.    sqlite
254c0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
254d0 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  d);.    sqlite3_
254e0 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a  free(zTmpname);.
254f0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50      OSTRACE(("OP
25500 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53  EN name=%s, rc=S
25510 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49  QLITE_CANTOPEN_I
25520 53 44 49 52 22 2c 20 7a 55 74 66 38 4e 61 6d 65  SDIR", zUtf8Name
25530 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
25540 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49  QLITE_CANTOPEN_I
25550 53 44 49 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  SDIR;.  }..  if(
25560 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a   isReadWrite ){.
25570 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63      dwDesiredAcc
25580 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45  ess = GENERIC_RE
25590 41 44 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49  AD | GENERIC_WRI
255a0 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  TE;.  }else{.   
255b0 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
255c0 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44 3b   = GENERIC_READ;
255d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 51 4c 49 54  .  }..  /* SQLIT
255e0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
255f0 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61 6b 65   is used to make
25600 20 73 75 72 65 20 74 68 61 74 20 61 20 6e 65 77   sure that a new
25610 20 66 69 6c 65 20 69 73 0a 20 20 2a 2a 20 63 72   file is.  ** cr
25620 65 61 74 65 64 2e 20 53 51 4c 69 74 65 20 64 6f  eated. SQLite do
25630 65 73 6e 27 74 20 75 73 65 20 69 74 20 74 6f 20  esn't use it to 
25640 69 6e 64 69 63 61 74 65 20 22 65 78 63 6c 75 73  indicate "exclus
25650 69 76 65 20 61 63 63 65 73 73 22 0a 20 20 2a 2a  ive access".  **
25660 20 61 73 20 69 74 20 69 73 20 75 73 75 61 6c 6c   as it is usuall
25670 79 20 75 6e 64 65 72 73 74 6f 6f 64 2e 0a 20 20  y understood..  
25680 2a 2f 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75  */.  if( isExclu
25690 73 69 76 65 20 29 7b 0a 20 20 20 20 2f 2a 20 43  sive ){.    /* C
256a0 72 65 61 74 65 73 20 61 20 6e 65 77 20 66 69 6c  reates a new fil
256b0 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 64 6f  e, only if it do
256c0 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
256d0 78 69 73 74 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20  xist. */.    /* 
256e0 49 66 20 74 68 65 20 66 69 6c 65 20 65 78 69 73  If the file exis
256f0 74 73 2c 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f  ts, it fails. */
25700 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44  .    dwCreationD
25710 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 43 52 45  isposition = CRE
25720 41 54 45 5f 4e 45 57 3b 0a 20 20 7d 65 6c 73 65  ATE_NEW;.  }else
25730 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29 7b   if( isCreate ){
25740 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 65 78 69  .    /* Open exi
25750 73 74 69 6e 67 20 66 69 6c 65 2c 20 6f 72 20 63  sting file, or c
25760 72 65 61 74 65 20 69 66 20 69 74 20 64 6f 65 73  reate if it does
25770 6e 27 74 20 65 78 69 73 74 20 2a 2f 0a 20 20 20  n't exist */.   
25780 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
25790 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c  sition = OPEN_AL
257a0 57 41 59 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  WAYS;.  }else{. 
257b0 20 20 20 2f 2a 20 4f 70 65 6e 73 20 61 20 66 69     /* Opens a fi
257c0 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 65  le, only if it e
257d0 78 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20 64 77  xists. */.    dw
257e0 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
257f0 69 6f 6e 20 3d 20 4f 50 45 4e 5f 45 58 49 53 54  ion = OPEN_EXIST
25800 49 4e 47 3b 0a 20 20 7d 0a 0a 20 20 64 77 53 68  ING;.  }..  dwSh
25810 61 72 65 4d 6f 64 65 20 3d 20 46 49 4c 45 5f 53  areMode = FILE_S
25820 48 41 52 45 5f 52 45 41 44 20 7c 20 46 49 4c 45  HARE_READ | FILE
25830 5f 53 48 41 52 45 5f 57 52 49 54 45 3b 0a 0a 20  _SHARE_WRITE;.. 
25840 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b   if( isDelete ){
25850 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
25860 49 4e 43 45 0a 20 20 20 20 64 77 46 6c 61 67 73  INCE.    dwFlags
25870 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20  AndAttributes = 
25880 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48  FILE_ATTRIBUTE_H
25890 49 44 44 45 4e 3b 0a 20 20 20 20 69 73 54 65 6d  IDDEN;.    isTem
258a0 70 20 3d 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20  p = 1;.#else.   
258b0 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
258c0 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54  butes = FILE_ATT
258d0 52 49 42 55 54 45 5f 54 45 4d 50 4f 52 41 52 59  RIBUTE_TEMPORARY
258e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
258f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25900 7c 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  | FILE_ATTRIBUTE
25910 5f 48 49 44 44 45 4e 0a 20 20 20 20 20 20 20 20  _HIDDEN.        
25920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25930 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 46 4c         | FILE_FL
25940 41 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f  AG_DELETE_ON_CLO
25950 53 45 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  SE;.#endif.  }el
25960 73 65 7b 0a 20 20 20 20 64 77 46 6c 61 67 73 41  se{.    dwFlagsA
25970 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46  ndAttributes = F
25980 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f  ILE_ATTRIBUTE_NO
25990 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 52  RMAL;.  }.  /* R
259a0 65 70 6f 72 74 73 20 66 72 6f 6d 20 74 68 65 20  eports from the 
259b0 69 6e 74 65 72 6e 65 74 20 61 72 65 20 74 68 61  internet are tha
259c0 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 73  t performance is
259d0 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20 62 65 74   always.  ** bet
259e0 74 65 72 20 69 66 20 46 49 4c 45 5f 46 4c 41 47  ter if FILE_FLAG
259f0 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 20 69  _RANDOM_ACCESS i
25a00 73 20 75 73 65 64 2e 20 20 54 69 63 6b 65 74 20  s used.  Ticket 
25a10 23 32 36 39 39 2e 20 2a 2f 0a 23 69 66 20 53 51  #2699. */.#if SQ
25a20 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
25a30 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
25a40 75 74 65 73 20 7c 3d 20 46 49 4c 45 5f 46 4c 41  utes |= FILE_FLA
25a50 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 3b  G_RANDOM_ACCESS;
25a60 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6f  .#endif..  if( o
25a70 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53  sIsNT() ){.#if S
25a80 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
25a90 20 20 20 43 52 45 41 54 45 46 49 4c 45 32 5f 45     CREATEFILE2_E
25aa0 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45  XTENDED_PARAMETE
25ab0 52 53 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d  RS extendedParam
25ac0 65 74 65 72 73 3b 0a 20 20 20 20 65 78 74 65 6e  eters;.    exten
25ad0 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77  dedParameters.dw
25ae0 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 43 52  Size = sizeof(CR
25af0 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44  EATEFILE2_EXTEND
25b00 45 44 5f 50 41 52 41 4d 45 54 45 52 53 29 3b 0a  ED_PARAMETERS);.
25b10 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61      extendedPara
25b20 6d 65 74 65 72 73 2e 64 77 46 69 6c 65 41 74 74  meters.dwFileAtt
25b30 72 69 62 75 74 65 73 20 3d 0a 20 20 20 20 20 20  ributes =.      
25b40 20 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64        dwFlagsAnd
25b50 41 74 74 72 69 62 75 74 65 73 20 26 20 46 49 4c  Attributes & FIL
25b60 45 5f 41 54 54 52 49 42 55 54 45 5f 4d 41 53 4b  E_ATTRIBUTE_MASK
25b70 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61  ;.    extendedPa
25b80 72 61 6d 65 74 65 72 73 2e 64 77 46 69 6c 65 46  rameters.dwFileF
25b90 6c 61 67 73 20 3d 20 64 77 46 6c 61 67 73 41 6e  lags = dwFlagsAn
25ba0 64 41 74 74 72 69 62 75 74 65 73 20 26 20 46 49  dAttributes & FI
25bb0 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 3b 0a 20 20  LE_FLAG_MASK;.  
25bc0 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65    extendedParame
25bd0 74 65 72 73 2e 64 77 53 65 63 75 72 69 74 79 51  ters.dwSecurityQ
25be0 6f 73 46 6c 61 67 73 20 3d 20 53 45 43 55 52 49  osFlags = SECURI
25bf0 54 59 5f 41 4e 4f 4e 59 4d 4f 55 53 3b 0a 20 20  TY_ANONYMOUS;.  
25c00 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65    extendedParame
25c10 74 65 72 73 2e 6c 70 53 65 63 75 72 69 74 79 41  ters.lpSecurityA
25c20 74 74 72 69 62 75 74 65 73 20 3d 20 4e 55 4c 4c  ttributes = NULL
25c30 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61  ;.    extendedPa
25c40 72 61 6d 65 74 65 72 73 2e 68 54 65 6d 70 6c 61  rameters.hTempla
25c50 74 65 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20  teFile = NULL;. 
25c60 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20 6f     while( (h = o
25c70 73 43 72 65 61 74 65 46 69 6c 65 32 28 28 4c 50  sCreateFile2((LP
25c80 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
25c90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25cb0 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c  dwDesiredAccess,
25cc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
25ce0 77 53 68 61 72 65 4d 6f 64 65 2c 0a 20 20 20 20  wShareMode,.    
25cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d00 20 20 20 20 20 20 20 20 20 20 64 77 43 72 65 61            dwCrea
25d10 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c  tionDisposition,
25d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
25d40 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65  extendedParamete
25d50 72 73 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41  rs))==INVALID_HA
25d60 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20  NDLE_VALUE &&.  
25d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d80 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 52              winR
25d90 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
25da0 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20  &lastErrno) ){. 
25db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25dc0 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 23   Noop */.    }.#
25dd0 65 6c 73 65 0a 20 20 20 20 77 68 69 6c 65 28 20  else.    while( 
25de0 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  (h = osCreateFil
25df0 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  eW((LPCWSTR)zCon
25e00 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  verted,.        
25e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41        dwDesiredA
25e30 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20  ccess,.         
25e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e50 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65       dwShareMode
25e60 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20  , NULL,.        
25e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e80 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e        dwCreation
25e90 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20  Disposition,.   
25ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25eb0 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61             dwFla
25ec0 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c  gsAndAttributes,
25ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
25ef0 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48  ULL))==INVALID_H
25f00 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20  ANDLE_VALUE &&. 
25f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e               win
25f30 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  RetryIoerr(&cnt,
25f40 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a   &lastErrno) ){.
25f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25f60 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a  * Noop */.    }.
25f70 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64 65  #endif.  }.#ifde
25f80 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
25f90 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
25fa0 20 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20      while( (h = 
25fb0 6f 73 43 72 65 61 74 65 46 69 6c 65 41 28 28 4c  osCreateFileA((L
25fc0 50 43 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  PCSTR)zConverted
25fd0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ff0 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c  dwDesiredAccess,
26000 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
26020 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c  wShareMode, NULL
26030 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
26040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26050 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
26060 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20  ition,.         
26070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26080 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41       dwFlagsAndA
26090 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20 20 20  ttributes,.     
260a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260b0 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d           NULL))=
260c0 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
260d0 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20 20  VALUE &&.       
260e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260f0 20 20 20 20 20 20 20 77 69 6e 52 65 74 72 79 49         winRetryI
26100 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74  oerr(&cnt, &last
26110 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20  Errno) ){.      
26120 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70           /* Noop
26130 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   */.    }.  }.#e
26140 6e 64 69 66 0a 20 20 77 69 6e 4c 6f 67 49 6f 65  ndif.  winLogIoe
26150 72 72 28 63 6e 74 2c 20 5f 5f 4c 49 4e 45 5f 5f  rr(cnt, __LINE__
26160 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  );..  OSTRACE(("
26170 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c 20 6e 61  OPEN file=%p, na
26180 6d 65 3d 25 73 2c 20 61 63 63 65 73 73 3d 25 6c  me=%s, access=%l
26190 78 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20  x, rc=%s\n", h, 
261a0 7a 55 74 66 38 4e 61 6d 65 2c 0a 20 20 20 20 20  zUtf8Name,.     
261b0 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41        dwDesiredA
261c0 63 63 65 73 73 2c 20 28 68 3d 3d 49 4e 56 41 4c  ccess, (h==INVAL
261d0 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29  ID_HANDLE_VALUE)
261e0 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f   ? "failed" : "o
261f0 6b 22 29 29 3b 0a 0a 20 20 69 66 28 20 68 3d 3d  k"));..  if( h==
26200 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
26210 41 4c 55 45 20 29 7b 0a 20 20 20 20 70 46 69 6c  ALUE ){.    pFil
26220 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
26230 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69  astErrno;.    wi
26240 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
26250 5f 43 41 4e 54 4f 50 45 4e 2c 20 70 46 69 6c 65  _CANTOPEN, pFile
26260 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69  ->lastErrno, "wi
26270 6e 4f 70 65 6e 22 2c 20 7a 55 74 66 38 4e 61 6d  nOpen", zUtf8Nam
26280 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
26290 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
262a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
262b0 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20  ee(zTmpname);.  
262c0 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
262d0 65 20 26 26 20 21 69 73 45 78 63 6c 75 73 69 76  e && !isExclusiv
262e0 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
262f0 6e 20 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20  n winOpen(pVfs, 
26300 7a 4e 61 6d 65 2c 20 69 64 2c 0a 20 20 20 20 20  zName, id,.     
26310 20 20 20 20 28 28 66 6c 61 67 73 7c 53 51 4c 49      ((flags|SQLI
26320 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
26330 29 20 26 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) &.            
26340 20 20 20 20 20 20 20 20 20 7e 28 53 51 4c 49 54           ~(SQLIT
26350 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53 51  E_OPEN_CREATE|SQ
26360 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
26370 49 54 45 29 29 2c 0a 20 20 20 20 20 20 20 20 20  ITE)),.         
26380 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20 20 20  pOutFlags);.    
26390 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
263a0 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
263b0 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  PEN_BKPT;.    }.
263c0 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f 75 74 46    }..  if( pOutF
263d0 6c 61 67 73 20 29 7b 0a 20 20 20 20 69 66 28 20  lags ){.    if( 
263e0 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20  isReadWrite ){. 
263f0 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20       *pOutFlags 
26400 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
26410 41 44 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c  ADWRITE;.    }el
26420 73 65 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46  se{.      *pOutF
26430 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
26440 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  EN_READONLY;.   
26450 20 7d 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43   }.  }..  OSTRAC
26460 45 28 28 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70  E(("OPEN file=%p
26470 2c 20 6e 61 6d 65 3d 25 73 2c 20 61 63 63 65 73  , name=%s, acces
26480 73 3d 25 6c 78 2c 20 70 4f 75 74 46 6c 61 67 73  s=%lx, pOutFlags
26490 3d 25 70 2c 20 2a 70 4f 75 74 46 6c 61 67 73 3d  =%p, *pOutFlags=
264a0 25 64 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  %d, ".          
264b0 20 22 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a   "rc=%s\n", h, z
264c0 55 74 66 38 4e 61 6d 65 2c 20 64 77 44 65 73 69  Utf8Name, dwDesi
264d0 72 65 64 41 63 63 65 73 73 2c 20 70 4f 75 74 46  redAccess, pOutF
264e0 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67 73 20  lags, pOutFlags 
264f0 3f 0a 20 20 20 20 20 20 20 20 20 20 20 2a 70 4f  ?.           *pO
26500 75 74 46 6c 61 67 73 20 3a 20 30 2c 20 28 68 3d  utFlags : 0, (h=
26510 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
26520 56 41 4c 55 45 29 20 3f 20 22 66 61 69 6c 65 64  VALUE) ? "failed
26530 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 23 69 66  " : "ok"));..#if
26540 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
26550 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69  .  if( isReadWri
26560 74 65 20 26 26 20 65 54 79 70 65 3d 3d 53 51 4c  te && eType==SQL
26570 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
26580 0a 20 20 20 20 20 20 20 26 26 20 28 72 63 20 3d  .       && (rc =
26590 20 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b   winceCreateLock
265a0 28 7a 4e 61 6d 65 2c 20 70 46 69 6c 65 29 29 21  (zName, pFile))!
265b0 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a  =SQLITE_OK.  ){.
265c0 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
265d0 65 28 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(h);.    sqlite
265e0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
265f0 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  d);.    sqlite3_
26600 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a  free(zTmpname);.
26610 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50      OSTRACE(("OP
26620 45 4e 2d 43 45 2d 4c 4f 43 4b 20 6e 61 6d 65 3d  EN-CE-LOCK name=
26630 25 73 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 7a 4e  %s, rc=%s\n", zN
26640 61 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  ame, sqlite3ErrN
26650 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 72  ame(rc)));.    r
26660 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
26670 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20  if( isTemp ){.  
26680 20 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65    pFile->zDelete
26690 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65  OnClose = zConve
266a0 72 74 65 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  rted;.  }else.#e
266b0 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c  ndif.  {.    sql
266c0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
266d0 72 74 65 64 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  rted);.  }..  sq
266e0 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e  lite3_free(zTmpn
266f0 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 70  ame);.  pFile->p
26700 4d 65 74 68 6f 64 20 3d 20 26 77 69 6e 49 6f 4d  Method = &winIoM
26710 65 74 68 6f 64 3b 0a 20 20 70 46 69 6c 65 2d 3e  ethod;.  pFile->
26720 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70  pVfs = pVfs;.  p
26730 46 69 6c 65 2d 3e 68 20 3d 20 68 3b 0a 20 20 69  File->h = h;.  i
26740 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 7b  f( isReadonly ){
26750 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
26760 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45  Flags |= WINFILE
26770 5f 52 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69  _RDONLY;.  }.  i
26780 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62  f( sqlite3_uri_b
26790 6f 6f 6c 65 61 6e 28 7a 4e 61 6d 65 2c 20 22 70  oolean(zName, "p
267a0 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57  sow", SQLITE_POW
267b0 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
267c0 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ) ){.    pFile->
267d0 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e  ctrlFlags |= WIN
267e0 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20  FILE_PSOW;.  }. 
267f0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
26800 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20  o = NO_ERROR;.  
26810 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 7a  pFile->zPath = z
26820 4e 61 6d 65 3b 0a 23 69 66 20 53 51 4c 49 54 45  Name;.#if SQLITE
26830 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
26840 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 61 70 20 3d  .  pFile->hMap =
26850 20 4e 55 4c 4c 3b 0a 20 20 70 46 69 6c 65 2d 3e   NULL;.  pFile->
26860 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a  pMapRegion = 0;.
26870 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
26880 65 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e  e = 0;.  pFile->
26890 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d  mmapSizeActual =
268a0 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61   0;.  pFile->mma
268b0 70 53 69 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74  pSizeMax = sqlit
268c0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
268d0 7a 4d 6d 61 70 3b 0a 23 65 6e 64 69 66 0a 0a 20  zMmap;.#endif.. 
268e0 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29   OpenCounter(+1)
268f0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
26900 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
26910 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 2e 0a 2a  he named file..*
26920 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 57  *.** Note that W
26930 69 6e 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20  indows does not 
26940 61 6c 6c 6f 77 20 61 20 66 69 6c 65 20 74 6f 20  allow a file to 
26950 62 65 20 64 65 6c 65 74 65 64 20 69 66 20 73 6f  be deleted if so
26960 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63  me other.** proc
26970 65 73 73 20 68 61 73 20 69 74 20 6f 70 65 6e 2e  ess has it open.
26980 20 20 53 6f 6d 65 74 69 6d 65 73 20 61 20 76 69    Sometimes a vi
26990 72 75 73 20 73 63 61 6e 6e 65 72 20 6f 72 20 69  rus scanner or i
269a0 6e 64 65 78 69 6e 67 20 70 72 6f 67 72 61 6d 0a  ndexing program.
269b0 2a 2a 20 77 69 6c 6c 20 6f 70 65 6e 20 61 20 6a  ** will open a j
269c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 68 6f 72  ournal file shor
269d0 74 6c 79 20 61 66 74 65 72 20 69 74 20 69 73 20  tly after it is 
269e0 63 72 65 61 74 65 64 20 69 6e 20 6f 72 64 65 72  created in order
269f0 20 74 6f 20 64 6f 0a 2a 2a 20 77 68 61 74 65 76   to do.** whatev
26a00 65 72 20 69 74 20 64 6f 65 73 2e 20 20 57 68 69  er it does.  Whi
26a10 6c 65 20 74 68 69 73 20 6f 74 68 65 72 20 70 72  le this other pr
26a20 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
26a30 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 6f 70 65   the.** file ope
26a40 6e 2c 20 77 65 20 77 69 6c 6c 20 62 65 20 75 6e  n, we will be un
26a50 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 69  able to delete i
26a60 74 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  t.  To work arou
26a70 6e 64 20 74 68 69 73 0a 2a 2a 20 70 72 6f 62 6c  nd this.** probl
26a80 65 6d 2c 20 77 65 20 64 65 6c 61 79 20 31 30 30  em, we delay 100
26a90 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e   milliseconds an
26aa0 64 20 74 72 79 20 74 6f 20 64 65 6c 65 74 65 20  d try to delete 
26ab0 61 67 61 69 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f  again.  Up.** to
26ac0 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54   MX_DELETION_ATT
26ad0 45 4d 50 54 73 20 64 65 6c 65 74 69 6f 6e 20 61  EMPTs deletion a
26ae0 74 74 65 6d 70 74 73 20 61 72 65 20 72 75 6e 20  ttempts are run 
26af0 62 65 66 6f 72 65 20 67 69 76 69 6e 67 0a 2a 2a  before giving.**
26b00 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e   up and returnin
26b10 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73  g an error..*/.s
26b20 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c  tatic int winDel
26b30 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ete(.  sqlite3_v
26b40 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
26b50 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f     /* Not used o
26b60 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e  n win32 */.  con
26b70 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
26b80 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  me,      /* Name
26b90 20 6f 66 20 66 69 6c 65 20 74 6f 20 64 65 6c 65   of file to dele
26ba0 74 65 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63  te */.  int sync
26bb0 44 69 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Dir             
26bc0 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20      /* Not used 
26bd0 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20  on win32 */.){. 
26be0 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
26bf0 69 6e 74 20 72 63 3b 0a 20 20 44 57 4f 52 44 20  int rc;.  DWORD 
26c00 61 74 74 72 3b 0a 20 20 44 57 4f 52 44 20 6c 61  attr;.  DWORD la
26c10 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 76  stErrno = 0;.  v
26c20 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b  oid *zConverted;
26c30 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
26c40 54 45 52 28 70 56 66 73 29 3b 0a 20 20 55 4e 55  TER(pVfs);.  UNU
26c50 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 73 79  SED_PARAMETER(sy
26c60 6e 63 44 69 72 29 3b 0a 0a 20 20 53 69 6d 75 6c  ncDir);..  Simul
26c70 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72  ateIOError(retur
26c80 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  n SQLITE_IOERR_D
26c90 45 4c 45 54 45 29 3b 0a 20 20 4f 53 54 52 41 43  ELETE);.  OSTRAC
26ca0 45 28 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d  E(("DELETE name=
26cb0 25 73 2c 20 73 79 6e 63 44 69 72 3d 25 64 5c 6e  %s, syncDir=%d\n
26cc0 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 79  ", zFilename, sy
26cd0 6e 63 44 69 72 29 29 3b 0a 0a 20 20 7a 43 6f 6e  ncDir));..  zCon
26ce0 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76  verted = winConv
26cf0 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e  ertFromUtf8Filen
26d00 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
26d10 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
26d20 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ==0 ){.    OSTRA
26d30 43 45 28 28 22 44 45 4c 45 54 45 20 6e 61 6d 65  CE(("DELETE name
26d40 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%s, rc=SQLITE_I
26d50 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a  OERR_NOMEM\n", z
26d60 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20  Filename));.    
26d70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
26d80 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ERR_NOMEM;.  }. 
26d90 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
26da0 0a 20 20 20 20 64 6f 20 7b 0a 23 69 66 20 53 51  .    do {.#if SQ
26db0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
26dc0 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41      WIN32_FILE_A
26dd0 54 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41  TTRIBUTE_DATA sA
26de0 74 74 72 44 61 74 61 3b 0a 20 20 20 20 20 20 6d  ttrData;.      m
26df0 65 6d 73 65 74 28 26 73 41 74 74 72 44 61 74 61  emset(&sAttrData
26e00 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74  , 0, sizeof(sAtt
26e10 72 44 61 74 61 29 29 3b 0a 20 20 20 20 20 20 69  rData));.      i
26e20 66 20 28 20 6f 73 47 65 74 46 69 6c 65 41 74 74  f ( osGetFileAtt
26e30 72 69 62 75 74 65 73 45 78 57 28 7a 43 6f 6e 76  ributesExW(zConv
26e40 65 72 74 65 64 2c 20 47 65 74 46 69 6c 65 45 78  erted, GetFileEx
26e50 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20  InfoStandard,.  
26e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e80 26 73 41 74 74 72 44 61 74 61 29 20 29 7b 0a 20  &sAttrData) ){. 
26e90 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 73 41         attr = sA
26ea0 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74  ttrData.dwFileAt
26eb0 74 72 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20  tributes;.      
26ec0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6c  }else{.        l
26ed0 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
26ee0 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
26ef0 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72       if( lastErr
26f00 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e  no==ERROR_FILE_N
26f10 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20  OT_FOUND.       
26f20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d    || lastErrno==
26f30 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46  ERROR_PATH_NOT_F
26f40 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20  OUND ){.        
26f50 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
26f60 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
26f70 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e  ; /* Already gon
26f80 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65  e? */.        }e
26f90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
26fa0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
26fb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
26fc0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
26fd0 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 61   }.#else.      a
26fe0 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41  ttr = osGetFileA
26ff0 74 74 72 69 62 75 74 65 73 57 28 7a 43 6f 6e 76  ttributesW(zConv
27000 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  erted);.#endif. 
27010 20 20 20 20 20 69 66 20 28 20 61 74 74 72 3d 3d       if ( attr==
27020 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
27030 52 49 42 55 54 45 53 20 29 7b 0a 20 20 20 20 20  RIBUTES ){.     
27040 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
27050 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
27060 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 61 73  .        if( las
27070 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49  tErrno==ERROR_FI
27080 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20  LE_NOT_FOUND.   
27090 20 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72        || lastErr
270a0 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e  no==ERROR_PATH_N
270b0 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20  OT_FOUND ){.    
270c0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
270d0 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
270e0 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79  OENT; /* Already
270f0 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20   gone? */.      
27100 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
27110 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
27120 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
27130 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
27140 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20       }.      if 
27150 28 20 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52  ( attr&FILE_ATTR
27160 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 20  IBUTE_DIRECTORY 
27170 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
27180 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a  SQLITE_ERROR; /*
27190 20 46 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a   Files only. */.
271a0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
271b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20       }.      if 
271c0 28 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28  ( osDeleteFileW(
271d0 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20  zConverted) ){. 
271e0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
271f0 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65  TE_OK; /* Delete
27200 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20  d OK. */.       
27210 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
27220 20 20 20 20 20 20 69 66 20 28 20 21 77 69 6e 52        if ( !winR
27230 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
27240 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20  &lastErrno) ){. 
27250 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
27260 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20  TE_ERROR; /* No 
27270 6d 6f 72 65 20 72 65 74 72 69 65 73 2e 20 2a 2f  more retries. */
27280 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
27290 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 77 68        }.    } wh
272a0 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23 69 66 64  ile(1);.  }.#ifd
272b0 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
272c0 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
272d0 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
272e0 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65  attr = osGetFile
272f0 41 74 74 72 69 62 75 74 65 73 41 28 7a 43 6f 6e  AttributesA(zCon
27300 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 69  verted);.      i
27310 66 20 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49  f ( attr==INVALI
27320 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
27330 53 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73  S ){.        las
27340 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
27350 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
27360 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f     if( lastErrno
27370 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54  ==ERROR_FILE_NOT
27380 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20  _FOUND.         
27390 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  || lastErrno==ER
273a0 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55  ROR_PATH_NOT_FOU
273b0 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ND ){.          
273c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
273d0 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20  R_DELETE_NOENT; 
273e0 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f  /* Already gone?
273f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   */.        }els
27400 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e{.          rc 
27410 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
27420 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27430 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
27440 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72  .      if ( attr
27450 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f  &FILE_ATTRIBUTE_
27460 44 49 52 45 43 54 4f 52 59 20 29 7b 0a 20 20 20  DIRECTORY ){.   
27470 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
27480 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73  _ERROR; /* Files
27490 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20   only. */.      
274a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
274b0 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73 44 65  .      if ( osDe
274c0 6c 65 74 65 46 69 6c 65 41 28 7a 43 6f 6e 76 65  leteFileA(zConve
274d0 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20  rted) ){.       
274e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
274f0 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20   /* Deleted OK. 
27500 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
27510 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
27520 69 66 20 28 20 21 77 69 6e 52 65 74 72 79 49 6f  if ( !winRetryIo
27530 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
27540 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  rrno) ){.       
27550 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
27560 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72  OR; /* No more r
27570 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20  etries. */.     
27580 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
27590 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 28 31 29  }.    } while(1)
275a0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
275b0 66 28 20 72 63 20 26 26 20 72 63 21 3d 53 51 4c  f( rc && rc!=SQL
275c0 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
275d0 5f 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 72 63  _NOENT ){.    rc
275e0 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
275f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
27600 54 45 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22  TE, lastErrno, "
27610 77 69 6e 44 65 6c 65 74 65 22 2c 20 7a 46 69 6c  winDelete", zFil
27620 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  ename);.  }else{
27630 0a 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72  .    winLogIoerr
27640 28 63 6e 74 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  (cnt, __LINE__);
27650 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
27660 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
27670 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c  .  OSTRACE(("DEL
27680 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d  ETE name=%s, rc=
27690 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  %s\n", zFilename
276a0 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
276b0 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  (rc)));.  return
276c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
276d0 65 63 6b 20 74 68 65 20 65 78 69 73 74 65 6e 63  eck the existenc
276e0 65 20 61 6e 64 20 73 74 61 74 75 73 20 6f 66 20  e and status of 
276f0 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
27700 63 20 69 6e 74 20 77 69 6e 41 63 63 65 73 73 28  c int winAccess(
27710 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
27720 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 2f 2a  pVfs,         /*
27730 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e   Not used on win
27740 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  32 */.  const ch
27750 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
27760 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69     /* Name of fi
27770 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  le to check */. 
27780 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
27790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
277a0 79 70 65 20 6f 66 20 74 65 73 74 20 74 6f 20 6d  ype of test to m
277b0 61 6b 65 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ake on this file
277c0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f   */.  int *pResO
277d0 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
277e0 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 20   /* OUT: Result 
277f0 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20 61 74  */.){.  DWORD at
27800 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  tr;.  int rc = 0
27810 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
27820 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20  rno = 0;.  void 
27830 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55  *zConverted;.  U
27840 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
27850 70 56 66 73 29 3b 0a 0a 20 20 53 69 6d 75 6c 61  pVfs);..  Simula
27860 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
27870 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  n SQLITE_IOERR_A
27880 43 43 45 53 53 3b 20 29 3b 0a 20 20 4f 53 54 52  CCESS; );.  OSTR
27890 41 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d  ACE(("ACCESS nam
278a0 65 3d 25 73 2c 20 66 6c 61 67 73 3d 25 78 2c 20  e=%s, flags=%x, 
278b0 70 52 65 73 4f 75 74 3d 25 70 5c 6e 22 2c 0a 20  pResOut=%p\n",. 
278c0 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e            zFilen
278d0 61 6d 65 2c 20 66 6c 61 67 73 2c 20 70 52 65 73  ame, flags, pRes
278e0 4f 75 74 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65  Out));..  zConve
278f0 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72  rted = winConver
27900 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d  tFromUtf8Filenam
27910 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
27920 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d  if( zConverted==
27930 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  0 ){.    OSTRACE
27940 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65 3d 25  (("ACCESS name=%
27950 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  s, rc=SQLITE_IOE
27960 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69  RR_NOMEM\n", zFi
27970 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65  lename));.    re
27980 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
27990 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  R_NOMEM;.  }.  i
279a0 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20  f( osIsNT() ){. 
279b0 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a     int cnt = 0;.
279c0 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41      WIN32_FILE_A
279d0 54 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41  TTRIBUTE_DATA sA
279e0 74 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d  ttrData;.    mem
279f0 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c 20  set(&sAttrData, 
27a00 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44  0, sizeof(sAttrD
27a10 61 74 61 29 29 3b 0a 20 20 20 20 77 68 69 6c 65  ata));.    while
27a20 28 20 21 28 72 63 20 3d 20 6f 73 47 65 74 46 69  ( !(rc = osGetFi
27a30 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 28  leAttributesExW(
27a40 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
27a50 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ted,.           
27a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a70 20 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53    GetFileExInfoS
27a80 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20  tandard,.       
27a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27aa0 20 20 20 20 20 20 26 73 41 74 74 72 44 61 74 61        &sAttrData
27ab0 29 29 20 26 26 20 77 69 6e 52 65 74 72 79 49 6f  )) && winRetryIo
27ac0 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
27ad0 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66  rrno) ){}.    if
27ae0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ( rc ){.      /*
27af0 20 46 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f 41   For an SQLITE_A
27b00 43 43 45 53 53 5f 45 58 49 53 54 53 20 71 75 65  CCESS_EXISTS que
27b10 72 79 2c 20 74 72 65 61 74 20 61 20 7a 65 72 6f  ry, treat a zero
27b20 2d 6c 65 6e 67 74 68 20 66 69 6c 65 0a 20 20 20  -length file.   
27b30 20 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20 64     ** as if it d
27b40 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20  oes not exist.. 
27b50 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
27b60 28 20 20 20 20 66 6c 61 67 73 3d 3d 53 51 4c 49  (    flags==SQLI
27b70 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
27b80 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73 41  .          && sA
27b90 74 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a  ttrData.nFileSiz
27ba0 65 48 69 67 68 3d 3d 30 0a 20 20 20 20 20 20 20  eHigh==0.       
27bb0 20 20 20 26 26 20 73 41 74 74 72 44 61 74 61 2e     && sAttrData.
27bc0 6e 46 69 6c 65 53 69 7a 65 4c 6f 77 3d 3d 30 20  nFileSizeLow==0 
27bd0 29 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20  ){.        attr 
27be0 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  = INVALID_FILE_A
27bf0 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20  TTRIBUTES;.     
27c00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
27c10 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74 61  attr = sAttrData
27c20 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65  .dwFileAttribute
27c30 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  s;.      }.    }
27c40 65 6c 73 65 7b 0a 20 20 20 20 20 20 77 69 6e 4c  else{.      winL
27c50 6f 67 49 6f 65 72 72 28 63 6e 74 2c 20 5f 5f 4c  ogIoerr(cnt, __L
27c60 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 69 66  INE__);.      if
27c70 28 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52  ( lastErrno!=ERR
27c80 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e  OR_FILE_NOT_FOUN
27c90 44 20 26 26 20 6c 61 73 74 45 72 72 6e 6f 21 3d  D && lastErrno!=
27ca0 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46  ERROR_PATH_NOT_F
27cb0 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20  OUND ){.        
27cc0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
27cd0 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
27ce0 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
27cf0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
27d00 52 5f 41 43 43 45 53 53 2c 20 6c 61 73 74 45 72  R_ACCESS, lastEr
27d10 72 6e 6f 2c 20 22 77 69 6e 41 63 63 65 73 73 22  rno, "winAccess"
27d20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27d30 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 46 69               zFi
27d40 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  lename);.      }
27d50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74  else{.        at
27d60 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c  tr = INVALID_FIL
27d70 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20  E_ATTRIBUTES;.  
27d80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
27d90 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
27da0 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
27db0 6c 73 65 7b 0a 20 20 20 20 61 74 74 72 20 3d 20  lse{.    attr = 
27dc0 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
27dd0 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  tesA((char*)zCon
27de0 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e  verted);.  }.#en
27df0 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  dif.  sqlite3_fr
27e00 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
27e10 20 20 73 77 69 74 63 68 28 20 66 6c 61 67 73 20    switch( flags 
27e20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
27e30 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a  TE_ACCESS_READ:.
27e40 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
27e50 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20  ACCESS_EXISTS:. 
27e60 20 20 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d       rc = attr!=
27e70 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
27e80 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 62  RIBUTES;.      b
27e90 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
27ea0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
27eb0 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20 72 63  DWRITE:.      rc
27ec0 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44   = attr!=INVALID
27ed0 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
27ee0 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
27ef0 20 28 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54   (attr & FILE_AT
27f00 54 52 49 42 55 54 45 5f 52 45 41 44 4f 4e 4c 59  TRIBUTE_READONLY
27f10 29 3d 3d 30 3b 0a 20 20 20 20 20 20 62 72 65 61  )==0;.      brea
27f20 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
27f30 20 20 20 20 20 20 61 73 73 65 72 74 28 21 22 49        assert(!"I
27f40 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67  nvalid flags arg
27f50 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a  ument");.  }.  *
27f60 70 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20  pResOut = rc;.  
27f70 4f 53 54 52 41 43 45 28 28 22 41 43 43 45 53 53  OSTRACE(("ACCESS
27f80 20 6e 61 6d 65 3d 25 73 2c 20 70 52 65 73 4f 75   name=%s, pResOu
27f90 74 3d 25 70 2c 20 2a 70 52 65 73 4f 75 74 3d 25  t=%p, *pResOut=%
27fa0 64 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  d, rc=SQLITE_OK\
27fb0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a  n",.           z
27fc0 46 69 6c 65 6e 61 6d 65 2c 20 70 52 65 73 4f 75  Filename, pResOu
27fd0 74 2c 20 2a 70 52 65 73 4f 75 74 29 29 3b 0a 20  t, *pResOut));. 
27fe0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27ff0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
28000 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  rns non-zero if 
28010 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
28020 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77  th name starts w
28030 69 74 68 20 61 20 64 72 69 76 65 20 6c 65 74 74  ith a drive lett
28040 65 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62  er.** followed b
28050 79 20 61 20 63 6f 6c 6f 6e 20 63 68 61 72 61 63  y a colon charac
28060 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  ter..*/.static B
28070 4f 4f 4c 20 77 69 6e 49 73 44 72 69 76 65 4c 65  OOL winIsDriveLe
28080 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 0a 20 20  tterAndColon(.  
28090 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
280a0 68 6e 61 6d 65 0a 29 7b 0a 20 20 72 65 74 75 72  hname.){.  retur
280b0 6e 20 28 20 73 71 6c 69 74 65 33 49 73 61 6c 70  n ( sqlite3Isalp
280c0 68 61 28 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 29  ha(zPathname[0])
280d0 20 26 26 20 7a 50 61 74 68 6e 61 6d 65 5b 31 5d   && zPathname[1]
280e0 3d 3d 27 3a 27 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ==':' );.}../*.*
280f0 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  * Returns non-ze
28100 72 6f 20 69 66 20 74 68 65 20 73 70 65 63 69 66  ro if the specif
28110 69 65 64 20 70 61 74 68 20 6e 61 6d 65 20 73 68  ied path name sh
28120 6f 75 6c 64 20 62 65 20 75 73 65 64 20 76 65 72  ould be used ver
28130 62 61 74 69 6d 2e 20 20 49 66 0a 2a 2a 20 6e 6f  batim.  If.** no
28140 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  n-zero is return
28150 65 64 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  ed from this fun
28160 63 74 69 6f 6e 2c 20 74 68 65 20 63 61 6c 6c 69  ction, the calli
28170 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  ng function must
28180 20 73 69 6d 70 6c 79 0a 2a 2a 20 75 73 65 20 74   simply.** use t
28190 68 65 20 70 72 6f 76 69 64 65 64 20 70 61 74 68  he provided path
281a0 20 6e 61 6d 65 20 76 65 72 62 61 74 69 6d 20 2d   name verbatim -
281b0 4f 52 2d 20 72 65 73 6f 6c 76 65 20 69 74 20 69  OR- resolve it i
281c0 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 20  nto a full path 
281d0 6e 61 6d 65 0a 2a 2a 20 75 73 69 6e 67 20 74 68  name.** using th
281e0 65 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  e GetFullPathNam
281f0 65 20 57 69 6e 33 32 20 41 50 49 20 66 75 6e 63  e Win32 API func
28200 74 69 6f 6e 20 28 69 66 20 61 76 61 69 6c 61 62  tion (if availab
28210 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  le)..*/.static B
28220 4f 4f 4c 20 77 69 6e 49 73 56 65 72 62 61 74 69  OOL winIsVerbati
28230 6d 50 61 74 68 6e 61 6d 65 28 0a 20 20 63 6f 6e  mPathname(.  con
28240 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61  st char *zPathna
28250 6d 65 0a 29 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20  me.){.  /*.  ** 
28260 49 66 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65  If the path name
28270 20 73 74 61 72 74 73 20 77 69 74 68 20 61 20 66   starts with a f
28280 6f 72 77 61 72 64 20 73 6c 61 73 68 20 6f 72 20  orward slash or 
28290 61 20 62 61 63 6b 73 6c 61 73 68 2c 20 69 74 20  a backslash, it 
282a0 69 73 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 61  is either.  ** a
282b0 20 6c 65 67 61 6c 20 55 4e 43 20 6e 61 6d 65 2c   legal UNC name,
282c0 20 61 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69   a volume relati
282d0 76 65 20 70 61 74 68 2c 20 6f 72 20 61 6e 20 61  ve path, or an a
282e0 62 73 6f 6c 75 74 65 20 70 61 74 68 20 6e 61 6d  bsolute path nam
282f0 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 55  e in the.  ** "U
28300 6e 69 78 22 20 66 6f 72 6d 61 74 20 6f 6e 20 57  nix" format on W
28310 69 6e 64 6f 77 73 2e 20 20 54 68 65 72 65 20 69  indows.  There i
28320 73 20 6e 6f 20 65 61 73 79 20 77 61 79 20 74 6f  s no easy way to
28330 20 64 69 66 66 65 72 65 6e 74 69 61 74 65 20 62   differentiate b
28340 65 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20  etween.  ** the 
28350 66 69 6e 61 6c 20 74 77 6f 20 63 61 73 65 73 3b  final two cases;
28360 20 74 68 65 72 65 66 6f 72 65 2c 20 77 65 20 72   therefore, we r
28370 65 74 75 72 6e 20 74 68 65 20 73 61 66 65 72 20  eturn the safer 
28380 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
28390 54 52 55 45 0a 20 20 2a 2a 20 73 6f 20 74 68 61  TRUE.  ** so tha
283a0 74 20 63 61 6c 6c 65 72 73 20 6f 66 20 74 68 69  t callers of thi
283b0 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  s function will 
283c0 73 69 6d 70 6c 79 20 75 73 65 20 69 74 20 76 65  simply use it ve
283d0 72 62 61 74 69 6d 2e 0a 20 20 2a 2f 0a 20 20 69  rbatim..  */.  i
283e0 66 20 28 20 77 69 6e 49 73 44 69 72 53 65 70 28  f ( winIsDirSep(
283f0 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 29 20 29 7b  zPathname[0]) ){
28400 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52 55 45  .    return TRUE
28410 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
28420 20 49 66 20 74 68 65 20 70 61 74 68 20 6e 61 6d   If the path nam
28430 65 20 73 74 61 72 74 73 20 77 69 74 68 20 61 20  e starts with a 
28440 6c 65 74 74 65 72 20 61 6e 64 20 61 20 63 6f 6c  letter and a col
28450 6f 6e 20 69 74 20 69 73 20 65 69 74 68 65 72 20  on it is either 
28460 61 20 76 6f 6c 75 6d 65 0a 20 20 2a 2a 20 72 65  a volume.  ** re
28470 6c 61 74 69 76 65 20 70 61 74 68 20 6f 72 20 61  lative path or a
28480 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 2e  n absolute path.
28490 20 20 43 61 6c 6c 65 72 73 20 6f 66 20 74 68 69    Callers of thi
284a0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  s function must 
284b0 6e 6f 74 0a 20 20 2a 2a 20 61 74 74 65 6d 70 74  not.  ** attempt
284c0 20 74 6f 20 74 72 65 61 74 20 69 74 20 61 73 20   to treat it as 
284d0 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  a relative path 
284e0 6e 61 6d 65 20 28 69 2e 65 2e 20 74 68 65 79 20  name (i.e. they 
284f0 73 68 6f 75 6c 64 20 73 69 6d 70 6c 79 20 75 73  should simply us
28500 65 0a 20 20 2a 2a 20 69 74 20 76 65 72 62 61 74  e.  ** it verbat
28510 69 6d 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28  im)..  */.  if (
28520 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65   winIsDriveLette
28530 72 41 6e 64 43 6f 6c 6f 6e 28 7a 50 61 74 68 6e  rAndColon(zPathn
28540 61 6d 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ame) ){.    retu
28550 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20  rn TRUE;.  }..  
28560 2f 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 67 65  /*.  ** If we ge
28570 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  t to this point,
28580 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73   the path name s
28590 68 6f 75 6c 64 20 61 6c 6d 6f 73 74 20 63 65 72  hould almost cer
285a0 74 61 69 6e 6c 79 20 62 65 20 61 20 70 75 72 65  tainly be a pure
285b0 6c 79 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76 65  ly.  ** relative
285c0 20 6f 6e 65 20 28 69 2e 65 2e 20 6e 6f 74 20 61   one (i.e. not a
285d0 20 55 4e 43 20 6e 61 6d 65 2c 20 6e 6f 74 20 61   UNC name, not a
285e0 62 73 6f 6c 75 74 65 2c 20 61 6e 64 20 6e 6f 74  bsolute, and not
285f0 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76 65   volume relative
28600 29 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  )..  */.  return
28610 20 46 41 4c 53 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   FALSE;.}../*.**
28620 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65   Turn a relative
28630 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61   pathname into a
28640 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20   full pathname. 
28650 20 57 72 69 74 65 20 74 68 65 20 66 75 6c 6c 0a   Write the full.
28660 2a 2a 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f  ** pathname into
28670 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d   zOut[].  zOut[]
28680 20 77 69 6c 6c 20 62 65 20 61 74 20 6c 65 61 73   will be at leas
28690 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  t pVfs->mxPathna
286a0 6d 65 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  me.** bytes in s
286b0 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
286c0 6e 74 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61  nt winFullPathna
286d0 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  me(.  sqlite3_vf
286e0 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
286f0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
28700 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a  o vfs object */.
28710 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52    const char *zR
28720 65 6c 61 74 69 76 65 2c 20 20 20 20 20 20 20 20  elative,        
28730 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61  /* Possibly rela
28740 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20  tive input path 
28750 2a 2f 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 2c 20  */.  int nFull, 
28760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28770 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75     /* Size of ou
28780 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62  tput buffer in b
28790 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ytes */.  char *
287a0 7a 46 75 6c 6c 20 20 20 20 20 20 20 20 20 20 20  zFull           
287b0 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
287c0 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a  t buffer */.){..
287d0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59  #if defined(__CY
287e0 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61  GWIN__).  Simula
287f0 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
28800 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  n SQLITE_ERROR )
28810 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
28820 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 61  ETER(nFull);.  a
28830 73 73 65 72 74 28 20 6e 46 75 6c 6c 3e 3d 70 56  ssert( nFull>=pV
28840 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29  fs->mxPathname )
28850 3b 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65 33  ;.  if ( sqlite3
28860 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20  _data_directory 
28870 26 26 20 21 77 69 6e 49 73 56 65 72 62 61 74 69  && !winIsVerbati
28880 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74  mPathname(zRelat
28890 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  ive) ){.    /*. 
288a0 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61     ** NOTE: We a
288b0 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
288c0 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  a relative path 
288d0 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74  name and the dat
288e0 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64  a.    **       d
288f0 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
28900 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72  n set.  Therefor
28910 65 2c 20 75 73 65 20 69 74 20 61 73 20 74 68 65  e, use it as the
28920 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20   basis.    **   
28930 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69      for converti
28940 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76 65 20  ng the relative 
28950 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20  path name to an 
28960 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20  absolute.    ** 
28970 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65        one by pre
28980 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61  pending the data
28990 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61   directory and a
289a0 20 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20   slash..    */. 
289b0 20 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20     char *zOut = 
289c0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
289d0 6f 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  o( pVfs->mxPathn
289e0 61 6d 65 2b 31 20 29 3b 0a 20 20 20 20 69 66 28  ame+1 );.    if(
289f0 20 21 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20 20   !zOut ){.      
28a00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
28a10 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ERR_NOMEM;.    }
28a20 0a 20 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f  .    if( cygwin_
28a30 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20 20 20  conv_path(.     
28a40 20 20 20 20 20 20 20 28 6f 73 49 73 4e 54 28 29         (osIsNT()
28a50 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f   ? CCP_POSIX_TO_
28a60 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49  WIN_W : CCP_POSI
28a70 58 5f 54 4f 5f 57 49 4e 5f 41 29 20 7c 0a 20 20  X_TO_WIN_A) |.  
28a80 20 20 20 20 20 20 20 20 20 20 43 43 50 5f 52 45            CCP_RE
28a90 4c 41 54 49 56 45 2c 20 7a 52 65 6c 61 74 69 76  LATIVE, zRelativ
28aa0 65 2c 20 7a 4f 75 74 2c 20 70 56 66 73 2d 3e 6d  e, zOut, pVfs->m
28ab0 78 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30 20 29  xPathname+1)<0 )
28ac0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
28ad0 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20  free(zOut);.    
28ae0 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
28af0 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
28b00 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c 20 28  OPEN_CONVPATH, (
28b10 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20  DWORD)errno,.   
28b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b30 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61        "winFullPa
28b40 74 68 6e 61 6d 65 31 22 2c 20 7a 52 65 6c 61 74  thname1", zRelat
28b50 69 76 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ive);.    }else{
28b60 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74  .      char *zUt
28b70 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54  f8 = winConvertT
28b80 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 4f  oUtf8Filename(zO
28b90 75 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ut);.      if( !
28ba0 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 20  zUtf8 ){.       
28bb0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
28bc0 75 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ut);.        ret
28bd0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
28be0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
28bf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
28c00 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c  printf(MIN(nFull
28c10 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
28c20 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25  me), zFull, "%s%
28c30 63 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c%s",.          
28c40 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
28c50 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
28c60 6f 72 79 2c 20 77 69 6e 47 65 74 44 69 72 53 65  ory, winGetDirSe
28c70 70 28 29 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20  p(), zUtf8);.   
28c80 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
28c90 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71  zUtf8);.      sq
28ca0 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
28cb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
28cc0 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 75 74 20  .    char *zOut 
28cd0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
28ce0 65 72 6f 28 20 70 56 66 73 2d 3e 6d 78 50 61 74  ero( pVfs->mxPat
28cf0 68 6e 61 6d 65 2b 31 20 29 3b 0a 20 20 20 20 69  hname+1 );.    i
28d00 66 28 20 21 7a 4f 75 74 20 29 7b 0a 20 20 20 20  f( !zOut ){.    
28d10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28d20 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
28d30 20 7d 0a 20 20 20 20 69 66 28 20 63 79 67 77 69   }.    if( cygwi
28d40 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20  n_conv_path(.   
28d50 20 20 20 20 20 20 20 20 20 28 6f 73 49 73 4e 54           (osIsNT
28d60 28 29 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54  () ? CCP_POSIX_T
28d70 4f 5f 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f  O_WIN_W : CCP_PO
28d80 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 29 2c 0a 20  SIX_TO_WIN_A),. 
28d90 20 20 20 20 20 20 20 20 20 20 20 7a 52 65 6c 61             zRela
28da0 74 69 76 65 2c 20 7a 4f 75 74 2c 20 70 56 66 73  tive, zOut, pVfs
28db0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3c  ->mxPathname+1)<
28dc0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
28dd0 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20  e3_free(zOut);. 
28de0 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
28df0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
28e00 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48  ANTOPEN_CONVPATH
28e10 2c 20 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a  , (DWORD)errno,.
28e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e30 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c           "winFul
28e40 6c 50 61 74 68 6e 61 6d 65 32 22 2c 20 7a 52 65  lPathname2", zRe
28e50 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 65 6c  lative);.    }el
28e60 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
28e70 7a 55 74 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65  zUtf8 = winConve
28e80 72 74 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65  rtToUtf8Filename
28e90 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 66  (zOut);.      if
28ea0 28 20 21 7a 55 74 66 38 20 29 7b 0a 20 20 20 20  ( !zUtf8 ){.    
28eb0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
28ec0 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  (zOut);.        
28ed0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
28ee0 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ERR_NOMEM;.     
28ef0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
28f00 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46  _snprintf(MIN(nF
28f10 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74  ull, pVfs->mxPat
28f20 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22  hname), zFull, "
28f30 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20  %s", zUtf8);.   
28f40 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
28f50 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71  zUtf8);.      sq
28f60 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
28f70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
28f80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
28f90 23 65 6e 64 69 66 0a 0a 23 69 66 20 28 53 51 4c  #endif..#if (SQL
28fa0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20  ITE_OS_WINCE || 
28fb0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 29  SQLITE_OS_WINRT)
28fc0 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43   && !defined(__C
28fd0 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c  YGWIN__).  Simul
28fe0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
28ff0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
29000 29 3b 0a 20 20 2f 2a 20 57 69 6e 43 45 20 68 61  );.  /* WinCE ha
29010 73 20 6e 6f 20 63 6f 6e 63 65 70 74 20 6f 66 20  s no concept of 
29020 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e  a relative pathn
29030 61 6d 65 2c 20 6f 72 20 73 6f 20 49 20 61 6d 20  ame, or so I am 
29040 74 6f 6c 64 2e 20 2a 2f 0a 20 20 2f 2a 20 57 69  told. */.  /* Wi
29050 6e 52 54 20 68 61 73 20 6e 6f 20 77 61 79 20 74  nRT has no way t
29060 6f 20 63 6f 6e 76 65 72 74 20 61 20 72 65 6c 61  o convert a rela
29070 74 69 76 65 20 70 61 74 68 20 74 6f 20 61 6e 20  tive path to an 
29080 61 62 73 6f 6c 75 74 65 20 6f 6e 65 2e 20 2a 2f  absolute one. */
29090 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f  .  if ( sqlite3_
290a0 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26  data_directory &
290b0 26 20 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d  & !winIsVerbatim
290c0 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69  Pathname(zRelati
290d0 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  ve) ){.    /*.  
290e0 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72    ** NOTE: We ar
290f0 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
29100 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
29110 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ame and the data
29120 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69  .    **       di
29130 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
29140 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65   set.  Therefore
29150 2c 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  , use it as the 
29160 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20  basis.    **    
29170 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e     for convertin
29180 67 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70  g the relative p
29190 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61  ath name to an a
291a0 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20  bsolute.    **  
291b0 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70       one by prep
291c0 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  ending the data 
291d0 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20  directory and a 
291e0 62 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a  backslash..    *
291f0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  /.    sqlite3_sn
29200 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c  printf(MIN(nFull
29210 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
29220 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25  me), zFull, "%s%
29230 63 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c%s",.          
29240 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
29250 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
29260 79 2c 20 77 69 6e 47 65 74 44 69 72 53 65 70 28  y, winGetDirSep(
29270 29 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  ), zRelative);. 
29280 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
29290 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e  te3_snprintf(MIN
292a0 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78  (nFull, pVfs->mx
292b0 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c  Pathname), zFull
292c0 2c 20 22 25 73 22 2c 20 7a 52 65 6c 61 74 69 76  , "%s", zRelativ
292d0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
292e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
292f0 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  if..#if !SQLITE_
29300 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
29310 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
29320 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49  !defined(__CYGWI
29330 4e 5f 5f 29 0a 20 20 44 57 4f 52 44 20 6e 42 79  N__).  DWORD nBy
29340 74 65 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e  te;.  void *zCon
29350 76 65 72 74 65 64 3b 0a 20 20 63 68 61 72 20 2a  verted;.  char *
29360 7a 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  zOut;..  /* If t
29370 68 69 73 20 70 61 74 68 20 6e 61 6d 65 20 62 65  his path name be
29380 67 69 6e 73 20 77 69 74 68 20 22 2f 58 3a 22 2c  gins with "/X:",
29390 20 77 68 65 72 65 20 22 58 22 20 69 73 20 61 6e   where "X" is an
293a0 79 20 61 6c 70 68 61 62 65 74 69 63 0a 20 20 2a  y alphabetic.  *
293b0 2a 20 63 68 61 72 61 63 74 65 72 2c 20 64 69 73  * character, dis
293c0 63 61 72 64 20 74 68 65 20 69 6e 69 74 69 61 6c  card the initial
293d0 20 22 2f 22 20 66 72 6f 6d 20 74 68 65 20 70 61   "/" from the pa
293e0 74 68 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69  thname..  */.  i
293f0 66 28 20 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d  f( zRelative[0]=
29400 3d 27 2f 27 20 26 26 20 77 69 6e 49 73 44 72 69  ='/' && winIsDri
29410 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e  veLetterAndColon
29420 28 7a 52 65 6c 61 74 69 76 65 2b 31 29 20 29 7b  (zRelative+1) ){
29430 0a 20 20 20 20 7a 52 65 6c 61 74 69 76 65 2b 2b  .    zRelative++
29440 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 27 73  ;.  }..  /* It's
29450 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65   odd to simulate
29460 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72   an io-error her
29470 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68  e, but really th
29480 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20  is is just.  ** 
29490 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72  using the io-err
294a0 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72  or infrastructur
294b0 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  e to test that S
294c0 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68  QLite handles th
294d0 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
294e0 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66   failing. This f
294f0 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61  unction could fa
29500 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70  il if, for examp
29510 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72  le, the.  ** cur
29520 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72  rent working dir
29530 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
29540 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20  unlinked..  */. 
29550 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
29560 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
29570 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 20 28 20  ERROR );.  if ( 
29580 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
29590 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73  ectory && !winIs
295a0 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65  VerbatimPathname
295b0 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20  (zRelative) ){. 
295c0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54     /*.    ** NOT
295d0 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e  E: We are dealin
295e0 67 20 77 69 74 68 20 61 20 72 65 6c 61 74 69 76  g with a relativ
295f0 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20  e path name and 
29600 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20  the data.    ** 
29610 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
29620 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54  has been set.  T
29630 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
29640 20 61 73 20 74 68 65 20 62 61 73 69 73 0a 20 20   as the basis.  
29650 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63    **       for c
29660 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72 65  onverting the re
29670 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65  lative path name
29680 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a   to an absolute.
29690 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65      **       one
296a0 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74   by prepending t
296b0 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72  he data director
296c0 79 20 61 6e 64 20 61 20 62 61 63 6b 73 6c 61 73  y and a backslas
296d0 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  h..    */.    sq
296e0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
296f0 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e  IN(nFull, pVfs->
29700 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75  mxPathname), zFu
29710 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20 20  ll, "%s%c%s",.  
29720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29730 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f     sqlite3_data_
29740 64 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47 65  directory, winGe
29750 74 44 69 72 53 65 70 28 29 2c 20 7a 52 65 6c 61  tDirSep(), zRela
29760 74 69 76 65 29 3b 0a 20 20 20 20 72 65 74 75 72  tive);.    retur
29770 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
29780 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  .  zConverted = 
29790 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74  winConvertFromUt
297a0 66 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61  f8Filename(zRela
297b0 74 69 76 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f  tive);.  if( zCo
297c0 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
297d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
297e0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  IOERR_NOMEM;.  }
297f0 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
29800 29 7b 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54  ){.    LPWSTR zT
29810 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d  emp;.    nByte =
29820 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
29830 6d 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  meW((LPCWSTR)zCo
29840 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30  nverted, 0, 0, 0
29850 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  );.    if( nByte
29860 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
29870 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
29880 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74  rted);.      ret
29890 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
298a0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
298b0 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c  FULLPATH, osGetL
298c0 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
298d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298e0 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74       "winFullPat
298f0 68 6e 61 6d 65 31 22 2c 20 7a 52 65 6c 61 74 69  hname1", zRelati
29900 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  ve);.    }.    n
29910 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a  Byte += 3;.    z
29920 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  Temp = sqlite3Ma
29930 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a  llocZero( nByte*
29940 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29  sizeof(zTemp[0])
29950 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d   );.    if( zTem
29960 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
29970 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
29980 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65  erted);.      re
29990 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
299a0 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  R_NOMEM;.    }. 
299b0 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74     nByte = osGet
299c0 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c  FullPathNameW((L
299d0 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
299e0 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c  d, nByte, zTemp,
299f0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79   0);.    if( nBy
29a00 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  te==0 ){.      s
29a10 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
29a20 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 73  verted);.      s
29a30 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d  qlite3_free(zTem
29a40 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
29a50 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
29a60 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c  ITE_CANTOPEN_FUL
29a70 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74  LPATH, osGetLast
29a80 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
29a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29aa0 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61    "winFullPathna
29ab0 6d 65 32 22 2c 20 7a 52 65 6c 61 74 69 76 65 29  me2", zRelative)
29ac0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
29ad0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
29ae0 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d  ted);.    zOut =
29af0 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66   winUnicodeToUtf
29b00 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71  8(zTemp);.    sq
29b10 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70  lite3_free(zTemp
29b20 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  );.  }.#ifdef SQ
29b30 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
29b40 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
29b50 63 68 61 72 20 2a 7a 54 65 6d 70 3b 0a 20 20 20  char *zTemp;.   
29b60 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75   nByte = osGetFu
29b70 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61  llPathNameA((cha
29b80 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30  r*)zConverted, 0
29b90 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
29ba0 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
29bb0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
29bc0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
29bd0 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
29be0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
29bf0 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20  TOPEN_FULLPATH, 
29c00 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
29c10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
29c20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
29c30 75 6c 6c 50 61 74 68 6e 61 6d 65 33 22 2c 20 7a  ullPathname3", z
29c40 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d  Relative);.    }
29c50 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b  .    nByte += 3;
29c60 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c  .    zTemp = sql
29c70 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
29c80 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65  nByte*sizeof(zTe
29c90 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  mp[0]) );.    if
29ca0 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20  ( zTemp==0 ){.  
29cb0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
29cc0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
29cd0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29ce0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
29cf0 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d     }.    nByte =
29d00 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
29d10 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  meA((char*)zConv
29d20 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54  erted, nByte, zT
29d30 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  emp, 0);.    if(
29d40 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
29d50 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
29d60 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
29d70 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
29d80 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 72 65  zTemp);.      re
29d90 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
29da0 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
29db0 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74  _FULLPATH, osGet
29dc0 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
29dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29de0 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61        "winFullPa
29df0 74 68 6e 61 6d 65 34 22 2c 20 7a 52 65 6c 61 74  thname4", zRelat
29e00 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ive);.    }.    
29e10 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
29e20 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f  nverted);.    zO
29e30 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  ut = sqlite3_win
29e40 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28  32_mbcs_to_utf8(
29e50 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69  zTemp);.    sqli
29e60 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b  te3_free(zTemp);
29e70 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
29e80 28 20 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73 71  ( zOut ){.    sq
29e90 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
29ea0 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e  IN(nFull, pVfs->
29eb0 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75  mxPathname), zFu
29ec0 6c 6c 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b  ll, "%s", zOut);
29ed0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
29ee0 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 72 65 74  e(zOut);.    ret
29ef0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
29f00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
29f10 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
29f20 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69  NOMEM;.  }.#endi
29f30 66 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  f.}..#ifndef SQL
29f40 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
29f50 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e  TENSION./*.** In
29f60 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65  terfaces for ope
29f70 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69  ning a shared li
29f80 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65  brary, finding e
29f90 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77  ntry points.** w
29fa0 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64  ithin the shared
29fb0 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c   library, and cl
29fc0 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  osing the shared
29fd0 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 73 74 61   library..*/.sta
29fe0 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 44 6c 4f  tic void *winDlO
29ff0 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20  pen(sqlite3_vfs 
2a000 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61  *pVfs, const cha
2a010 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
2a020 20 48 41 4e 44 4c 45 20 68 3b 0a 23 69 66 20 64   HANDLE h;.#if d
2a030 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f  efined(__CYGWIN_
2a040 5f 29 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 20 3d  _).  int nFull =
2a050 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
2a060 65 2b 31 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75  e+1;.  char *zFu
2a070 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ll = sqlite3Mall
2a080 6f 63 5a 65 72 6f 28 20 6e 46 75 6c 6c 20 29 3b  ocZero( nFull );
2a090 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
2a0a0 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a  ted = 0;.  if( z
2a0b0 46 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 4f  Full==0 ){.    O
2a0c0 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20  STRACE(("DLOPEN 
2a0d0 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d  name=%s, handle=
2a0e0 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  %p\n", zFilename
2a0f0 2c 20 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20  , (void*)0));.  
2a100 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
2a110 20 20 69 66 28 20 77 69 6e 46 75 6c 6c 50 61 74    if( winFullPat
2a120 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c  hname(pVfs, zFil
2a130 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c 2c 20 7a 46  ename, nFull, zF
2a140 75 6c 6c 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ull)!=SQLITE_OK 
2a150 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
2a160 72 65 65 28 7a 46 75 6c 6c 29 3b 0a 20 20 20 20  ree(zFull);.    
2a170 4f 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e  OSTRACE(("DLOPEN
2a180 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65   name=%s, handle
2a190 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d  =%p\n", zFilenam
2a1a0 65 2c 20 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20  e, (void*)0));. 
2a1b0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
2a1c0 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  .  zConverted = 
2a1d0 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74  winConvertFromUt
2a1e0 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 75 6c 6c  f8Filename(zFull
2a1f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
2a200 65 28 7a 46 75 6c 6c 29 3b 0a 23 65 6c 73 65 0a  e(zFull);.#else.
2a210 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
2a220 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46  ed = winConvertF
2a230 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  romUtf8Filename(
2a240 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 55 4e  zFilename);.  UN
2a250 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
2a260 56 66 73 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69  Vfs);.#endif.  i
2a270 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
2a280 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
2a290 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73  ("DLOPEN name=%s
2a2a0 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20  , handle=%p\n", 
2a2b0 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64  zFilename, (void
2a2c0 2a 29 30 29 29 3b 0a 20 20 20 20 72 65 74 75 72  *)0));.    retur
2a2d0 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  n 0;.  }.  if( o
2a2e0 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53  sIsNT() ){.#if S
2a2f0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
2a300 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 50 61 63     h = osLoadPac
2a310 6b 61 67 65 64 4c 69 62 72 61 72 79 28 28 4c 50  kagedLibrary((LP
2a320 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
2a330 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  , 0);.#else.    
2a340 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72  h = osLoadLibrar
2a350 79 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  yW((LPCWSTR)zCon
2a360 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a  verted);.#endif.
2a370 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
2a380 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
2a390 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d  .  else{.    h =
2a3a0 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 28   osLoadLibraryA(
2a3b0 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
2a3c0 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  d);.  }.#endif. 
2a3d0 20 4f 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45   OSTRACE(("DLOPE
2a3e0 4e 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c  N name=%s, handl
2a3f0 65 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61  e=%p\n", zFilena
2a400 6d 65 2c 20 28 76 6f 69 64 2a 29 68 29 29 3b 0a  me, (void*)h));.
2a410 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2a420 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 72 65  Converted);.  re
2a430 74 75 72 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d  turn (void*)h;.}
2a440 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
2a450 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  DlError(sqlite3_
2a460 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e  vfs *pVfs, int n
2a470 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f  Buf, char *zBufO
2a480 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ut){.  UNUSED_PA
2a490 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
2a4a0 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
2a4b0 4d 73 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72  Msg(osGetLastErr
2a4c0 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66  or(), nBuf, zBuf
2a4d0 4f 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  Out);.}.static v
2a4e0 6f 69 64 20 28 2a 77 69 6e 44 6c 53 79 6d 28 73  oid (*winDlSym(s
2a4f0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2a500 2c 76 6f 69 64 20 2a 70 48 2c 63 6f 6e 73 74 20  ,void *pH,const 
2a510 63 68 61 72 20 2a 7a 53 79 6d 29 29 28 76 6f 69  char *zSym))(voi
2a520 64 29 7b 0a 20 20 46 41 52 50 52 4f 43 20 70 72  d){.  FARPROC pr
2a530 6f 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  oc;.  UNUSED_PAR
2a540 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
2a550 70 72 6f 63 20 3d 20 6f 73 47 65 74 50 72 6f 63  proc = osGetProc
2a560 41 64 64 72 65 73 73 41 28 28 48 41 4e 44 4c 45  AddressA((HANDLE
2a570 29 70 48 2c 20 7a 53 79 6d 29 3b 0a 20 20 4f 53  )pH, zSym);.  OS
2a580 54 52 41 43 45 28 28 22 44 4c 53 59 4d 20 68 61  TRACE(("DLSYM ha
2a590 6e 64 6c 65 3d 25 70 2c 20 73 79 6d 62 6f 6c 3d  ndle=%p, symbol=
2a5a0 25 73 2c 20 61 64 64 72 65 73 73 3d 25 70 5c 6e  %s, address=%p\n
2a5b0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 76  ",.           (v
2a5c0 6f 69 64 2a 29 70 48 2c 20 7a 53 79 6d 2c 20 28  oid*)pH, zSym, (
2a5d0 76 6f 69 64 2a 29 70 72 6f 63 29 29 3b 0a 20 20  void*)proc));.  
2a5e0 72 65 74 75 72 6e 20 28 76 6f 69 64 28 2a 29 28  return (void(*)(
2a5f0 76 6f 69 64 29 29 70 72 6f 63 3b 0a 7d 0a 73 74  void))proc;.}.st
2a600 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 43  atic void winDlC
2a610 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73  lose(sqlite3_vfs
2a620 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48   *pVfs, void *pH
2a630 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44  andle){.  UNUSED
2a640 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
2a650 3b 0a 20 20 6f 73 46 72 65 65 4c 69 62 72 61 72  ;.  osFreeLibrar
2a660 79 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c  y((HANDLE)pHandl
2a670 65 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  e);.  OSTRACE(("
2a680 44 4c 43 4c 4f 53 45 20 68 61 6e 64 6c 65 3d 25  DLCLOSE handle=%
2a690 70 5c 6e 22 2c 20 28 76 6f 69 64 2a 29 70 48 61  p\n", (void*)pHa
2a6a0 6e 64 6c 65 29 29 3b 0a 7d 0a 23 65 6c 73 65 20  ndle));.}.#else 
2a6b0 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  /* if SQLITE_OMI
2a6c0 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
2a6d0 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a   is defined: */.
2a6e0 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f    #define winDlO
2a6f0 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65  pen  0.  #define
2a700 20 77 69 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20   winDlError 0.  
2a710 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d  #define winDlSym
2a720 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77     0.  #define w
2a730 69 6e 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64  inDlClose 0.#end
2a740 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  if.../*.** Write
2a750 20 75 70 20 74 6f 20 6e 42 75 66 20 62 79 74 65   up to nBuf byte
2a760 73 20 6f 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20  s of randomness 
2a770 69 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74  into zBuf..*/.st
2a780 61 74 69 63 20 69 6e 74 20 77 69 6e 52 61 6e 64  atic int winRand
2a790 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76  omness(sqlite3_v
2a7a0 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
2a7b0 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
2a7c0 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  .  int n = 0;.  
2a7d0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2a7e0 28 70 56 66 73 29 3b 0a 23 69 66 20 64 65 66 69  (pVfs);.#if defi
2a7f0 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
2a800 0a 20 20 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 6d  .  n = nBuf;.  m
2a810 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e  emset(zBuf, 0, n
2a820 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66  Buf);.#else.  if
2a830 28 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 54  ( sizeof(SYSTEMT
2a840 49 4d 45 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a  IME)<=nBuf-n ){.
2a850 20 20 20 20 53 59 53 54 45 4d 54 49 4d 45 20 78      SYSTEMTIME x
2a860 3b 0a 20 20 20 20 6f 73 47 65 74 53 79 73 74 65  ;.    osGetSyste
2a870 6d 54 69 6d 65 28 26 78 29 3b 0a 20 20 20 20 6d  mTime(&x);.    m
2a880 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20  emcpy(&zBuf[n], 
2a890 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a  &x, sizeof(x));.
2a8a0 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28      n += sizeof(
2a8b0 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69  x);.  }.  if( si
2a8c0 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75  zeof(DWORD)<=nBu
2a8d0 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44  f-n ){.    DWORD
2a8e0 20 70 69 64 20 3d 20 6f 73 47 65 74 43 75 72 72   pid = osGetCurr
2a8f0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 3b 0a  entProcessId();.
2a900 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
2a910 5b 6e 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f  [n], &pid, sizeo
2a920 66 28 70 69 64 29 29 3b 0a 20 20 20 20 6e 20 2b  f(pid));.    n +
2a930 3d 20 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20  = sizeof(pid);. 
2a940 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53   }.#if SQLITE_OS
2a950 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 73 69 7a  _WINRT.  if( siz
2a960 65 6f 66 28 55 4c 4f 4e 47 4c 4f 4e 47 29 3c 3d  eof(ULONGLONG)<=
2a970 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 55 4c  nBuf-n ){.    UL
2a980 4f 4e 47 4c 4f 4e 47 20 63 6e 74 20 3d 20 6f 73  ONGLONG cnt = os
2a990 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 28 29  GetTickCount64()
2a9a0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42  ;.    memcpy(&zB
2a9b0 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a  uf[n], &cnt, siz
2a9c0 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e  eof(cnt));.    n
2a9d0 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b   += sizeof(cnt);
2a9e0 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28  .  }.#else.  if(
2a9f0 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d   sizeof(DWORD)<=
2aa00 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57  nBuf-n ){.    DW
2aa10 4f 52 44 20 63 6e 74 20 3d 20 6f 73 47 65 74 54  ORD cnt = osGetT
2aa20 69 63 6b 43 6f 75 6e 74 28 29 3b 0a 20 20 20 20  ickCount();.    
2aa30 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c  memcpy(&zBuf[n],
2aa40 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e   &cnt, sizeof(cn
2aa50 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69  t));.    n += si
2aa60 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 23  zeof(cnt);.  }.#
2aa70 65 6e 64 69 66 0a 20 20 69 66 28 20 73 69 7a 65  endif.  if( size
2aa80 6f 66 28 4c 41 52 47 45 5f 49 4e 54 45 47 45 52  of(LARGE_INTEGER
2aa90 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20  )<=nBuf-n ){.   
2aaa0 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20 69   LARGE_INTEGER i
2aab0 3b 0a 20 20 20 20 6f 73 51 75 65 72 79 50 65 72  ;.    osQueryPer
2aac0 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 28  formanceCounter(
2aad0 26 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  &i);.    memcpy(
2aae0 26 7a 42 75 66 5b 6e 5d 2c 20 26 69 2c 20 73 69  &zBuf[n], &i, si
2aaf0 7a 65 6f 66 28 69 29 29 3b 0a 20 20 20 20 6e 20  zeof(i));.    n 
2ab00 2b 3d 20 73 69 7a 65 6f 66 28 69 29 3b 0a 20 20  += sizeof(i);.  
2ab10 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 53 51  }.#endif.#if !SQ
2ab20 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
2ab30 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
2ab40 54 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33  T && SQLITE_WIN3
2ab50 32 5f 55 53 45 5f 55 55 49 44 0a 20 20 69 66 28  2_USE_UUID.  if(
2ab60 20 73 69 7a 65 6f 66 28 55 55 49 44 29 3c 3d 6e   sizeof(UUID)<=n
2ab70 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 55 55 49  Buf-n ){.    UUI
2ab80 44 20 69 64 3b 0a 20 20 20 20 6d 65 6d 73 65 74  D id;.    memset
2ab90 28 26 69 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (&id, 0, sizeof(
2aba0 55 55 49 44 29 29 3b 0a 20 20 20 20 6f 73 55 75  UUID));.    osUu
2abb0 69 64 43 72 65 61 74 65 28 26 69 64 29 3b 0a 20  idCreate(&id);. 
2abc0 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20     memcpy(zBuf, 
2abd0 26 69 64 2c 20 73 69 7a 65 6f 66 28 55 55 49 44  &id, sizeof(UUID
2abe0 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a  ));.    n += siz
2abf0 65 6f 66 28 55 55 49 44 29 3b 0a 20 20 7d 0a 20  eof(UUID);.  }. 
2ac00 20 69 66 28 20 73 69 7a 65 6f 66 28 55 55 49 44   if( sizeof(UUID
2ac10 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20  )<=nBuf-n ){.   
2ac20 20 55 55 49 44 20 69 64 3b 0a 20 20 20 20 6d 65   UUID id;.    me
2ac30 6d 73 65 74 28 26 69 64 2c 20 30 2c 20 73 69 7a  mset(&id, 0, siz
2ac40 65 6f 66 28 55 55 49 44 29 29 3b 0a 20 20 20 20  eof(UUID));.    
2ac50 6f 73 55 75 69 64 43 72 65 61 74 65 53 65 71 75  osUuidCreateSequ
2ac60 65 6e 74 69 61 6c 28 26 69 64 29 3b 0a 20 20 20  ential(&id);.   
2ac70 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 69   memcpy(zBuf, &i
2ac80 64 2c 20 73 69 7a 65 6f 66 28 55 55 49 44 29 29  d, sizeof(UUID))
2ac90 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f  ;.    n += sizeo
2aca0 66 28 55 55 49 44 29 3b 0a 20 20 7d 0a 23 65 6e  f(UUID);.  }.#en
2acb0 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  dif.  return n;.
2acc0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20  }.../*.** Sleep 
2acd0 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69  for a little whi
2ace0 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  le.  Return the 
2acf0 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73  amount of time s
2ad00 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lept..*/.static 
2ad10 69 6e 74 20 77 69 6e 53 6c 65 65 70 28 73 71 6c  int winSleep(sql
2ad20 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
2ad30 69 6e 74 20 6d 69 63 72 6f 73 65 63 29 7b 0a 20  int microsec){. 
2ad40 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
2ad50 6c 65 65 70 28 28 6d 69 63 72 6f 73 65 63 2b 39  leep((microsec+9
2ad60 39 39 29 2f 31 30 30 30 29 3b 0a 20 20 55 4e 55  99)/1000);.  UNU
2ad70 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
2ad80 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28  fs);.  return ((
2ad90 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30  microsec+999)/10
2ada0 30 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a  00)*1000;.}../*.
2adb0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
2adc0 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65   variable, if se
2add0 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  t to a non-zero 
2ade0 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70  value, is interp
2adf0 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20  reted as.** the 
2ae00 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64  number of second
2ae10 73 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64  s since 1970 and
2ae20 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 74 20   is used to set 
2ae30 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a  the result of.**
2ae40 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e   sqlite3OsCurren
2ae50 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74  tTime() during t
2ae60 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65  esting..*/.#ifde
2ae70 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
2ae80 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  t sqlite3_curren
2ae90 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20  t_time = 0;  /* 
2aea0 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65  Fake system time
2aeb0 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63   in seconds sinc
2aec0 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69  e 1970. */.#endi
2aed0 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  f../*.** Find th
2aee0 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28  e current time (
2aef0 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f  in Universal Coo
2af00 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20  rdinated Time). 
2af10 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e   Write into *piN
2af20 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  ow.** the curren
2af30 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
2af40 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
2af50 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f  number times 86_
2af60 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20  400_000.  In.** 
2af70 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69  other words, wri
2af80 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74  te into *piNow t
2af90 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  he number of mil
2afa0 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  liseconds since 
2afb0 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70  the Julian.** ep
2afc0 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47  och of noon in G
2afd0 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65  reenwich on Nove
2afe0 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e  mber 24, 4714 B.
2aff0 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  C according to t
2b000 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20  he.** proleptic 
2b010 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64  Gregorian calend
2b020 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63  ar..**.** On suc
2b030 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53 51 4c  cess, return SQL
2b040 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20  ITE_OK.  Return 
2b050 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20  SQLITE_ERROR if 
2b060 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
2b070 65 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66  e.** cannot be f
2b080 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
2b090 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69  int winCurrentTi
2b0a0 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f  meInt64(sqlite3_
2b0b0 76 66 73 20 2a 70 56 66 73 2c 20 73 71 6c 69 74  vfs *pVfs, sqlit
2b0c0 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29  e3_int64 *piNow)
2b0d0 7b 0a 20 20 2f 2a 20 46 49 4c 45 54 49 4d 45 20  {.  /* FILETIME 
2b0e0 73 74 72 75 63 74 75 72 65 20 69 73 20 61 20 36  structure is a 6
2b0f0 34 2d 62 69 74 20 76 61 6c 75 65 20 72 65 70 72  4-bit value repr
2b100 65 73 65 6e 74 69 6e 67 20 74 68 65 20 6e 75 6d  esenting the num
2b110 62 65 72 20 6f 66 0a 20 20 20 20 20 31 30 30 2d  ber of.     100-
2b120 6e 61 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72  nanosecond inter
2b130 76 61 6c 73 20 73 69 6e 63 65 20 4a 61 6e 75 61  vals since Janua
2b140 72 79 20 31 2c 20 31 36 30 31 20 28 3d 20 4a 44  ry 1, 1601 (= JD
2b150 20 32 33 30 35 38 31 33 2e 35 29 2e 0a 20 20 2a   2305813.5)..  *
2b160 2f 0a 20 20 46 49 4c 45 54 49 4d 45 20 66 74 3b  /.  FILETIME ft;
2b170 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
2b180 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 77 69  sqlite3_int64 wi
2b190 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 3d  nFiletimeEpoch =
2b1a0 20 32 33 30 35 38 31 33 35 2a 28 73 71 6c 69 74   23058135*(sqlit
2b1b0 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30  e3_int64)8640000
2b1c0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
2b1d0 54 45 53 54 0a 20 20 73 74 61 74 69 63 20 63 6f  TEST.  static co
2b1e0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  nst sqlite3_int6
2b1f0 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20 32 34  4 unixEpoch = 24
2b200 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65 33 5f  405875*(sqlite3_
2b210 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23  int64)8640000;.#
2b220 65 6e 64 69 66 0a 20 20 2f 2a 20 32 5e 33 32 20  endif.  /* 2^32 
2b230 2d 20 74 6f 20 61 76 6f 69 64 20 75 73 65 20 6f  - to avoid use o
2b240 66 20 4c 4c 20 61 6e 64 20 77 61 72 6e 69 6e 67  f LL and warning
2b250 73 20 69 6e 20 67 63 63 20 2a 2f 0a 20 20 73 74  s in gcc */.  st
2b260 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
2b270 65 33 5f 69 6e 74 36 34 20 6d 61 78 33 32 42 69  e3_int64 max32Bi
2b280 74 56 61 6c 75 65 20 3d 0a 20 20 20 20 20 20 28  tValue =.      (
2b290 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30  sqlite3_int64)20
2b2a0 30 30 30 30 30 30 30 30 20 2b 20 28 73 71 6c 69  00000000 + (sqli
2b2b0 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30  te3_int64)200000
2b2c0 30 30 30 30 20 2b 0a 20 20 20 20 20 20 28 73 71  0000 +.      (sq
2b2d0 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 39 34 39  lite3_int64)2949
2b2e0 36 37 32 39 36 3b 0a 0a 23 69 66 20 53 51 4c 49  67296;..#if SQLI
2b2f0 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 53 59  TE_OS_WINCE.  SY
2b300 53 54 45 4d 54 49 4d 45 20 74 69 6d 65 3b 0a 20  STEMTIME time;. 
2b310 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65   osGetSystemTime
2b320 28 26 74 69 6d 65 29 3b 0a 20 20 2f 2a 20 69 66  (&time);.  /* if
2b330 20 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c   SystemTimeToFil
2b340 65 54 69 6d 65 28 29 20 66 61 69 6c 73 2c 20 69  eTime() fails, i
2b350 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20  t returns zero. 
2b360 2a 2f 0a 20 20 69 66 20 28 21 6f 73 53 79 73 74  */.  if (!osSyst
2b370 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65  emTimeToFileTime
2b380 28 26 74 69 6d 65 2c 26 66 74 29 29 7b 0a 20 20  (&time,&ft)){.  
2b390 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2b3a0 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6c 73 65  ERROR;.  }.#else
2b3b0 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69  .  osGetSystemTi
2b3c0 6d 65 41 73 46 69 6c 65 54 69 6d 65 28 20 26 66  meAsFileTime( &f
2b3d0 74 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2a  t );.#endif..  *
2b3e0 70 69 4e 6f 77 20 3d 20 77 69 6e 46 69 6c 65 74  piNow = winFilet
2b3f0 69 6d 65 45 70 6f 63 68 20 2b 0a 20 20 20 20 20  imeEpoch +.     
2b400 20 20 20 20 20 20 20 28 28 28 28 73 71 6c 69 74         ((((sqlit
2b410 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 48 69  e3_int64)ft.dwHi
2b420 67 68 44 61 74 65 54 69 6d 65 29 2a 6d 61 78 33  ghDateTime)*max3
2b430 32 42 69 74 56 61 6c 75 65 29 20 2b 0a 20 20 20  2BitValue) +.   
2b440 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c              (sql
2b450 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77  ite3_int64)ft.dw
2b460 4c 6f 77 44 61 74 65 54 69 6d 65 29 2f 28 73 71  LowDateTime)/(sq
2b470 6c 69 74 65 33 5f 69 6e 74 36 34 29 31 30 30 30  lite3_int64)1000
2b480 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  0;..#ifdef SQLIT
2b490 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c  E_TEST.  if( sql
2b4a0 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
2b4b0 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20  e ){.    *piNow 
2b4c0 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f  = 1000*(sqlite3_
2b4d0 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75  int64)sqlite3_cu
2b4e0 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69  rrent_time + uni
2b4f0 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64  xEpoch;.  }.#end
2b500 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  if.  UNUSED_PARA
2b510 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72  METER(pVfs);.  r
2b520 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2b530 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  .}../*.** Find t
2b540 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
2b550 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f  (in Universal Co
2b560 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e  ordinated Time).
2b570 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63    Write the.** c
2b580 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20  urrent time and 
2b590 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e  date as a Julian
2b5a0 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f   Day number into
2b5b0 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72   *prNow and.** r
2b5c0 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e  eturn 0.  Return
2b5d0 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61   1 if the time a
2b5e0 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62  nd date cannot b
2b5f0 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
2b600 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e  ic int winCurren
2b610 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66  tTime(sqlite3_vf
2b620 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65 20  s *pVfs, double 
2b630 2a 70 72 4e 6f 77 29 7b 0a 20 20 69 6e 74 20 72  *prNow){.  int r
2b640 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  c;.  sqlite3_int
2b650 36 34 20 69 3b 0a 20 20 72 63 20 3d 20 77 69 6e  64 i;.  rc = win
2b660 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
2b670 28 70 56 66 73 2c 20 26 69 29 3b 0a 20 20 69 66  (pVfs, &i);.  if
2b680 28 20 21 72 63 20 29 7b 0a 20 20 20 20 2a 70 72  ( !rc ){.    *pr
2b690 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30  Now = i/86400000
2b6a0 2e 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  .0;.  }.  return
2b6b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
2b6c0 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20 74  e idea is that t
2b6d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72  his function wor
2b6e0 6b 73 20 6c 69 6b 65 20 61 20 63 6f 6d 62 69 6e  ks like a combin
2b6f0 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 47 65 74 4c  ation of.** GetL
2b700 61 73 74 45 72 72 6f 72 28 29 20 61 6e 64 20 46  astError() and F
2b710 6f 72 6d 61 74 4d 65 73 73 61 67 65 28 29 20 6f  ormatMessage() o
2b720 6e 20 57 69 6e 64 6f 77 73 20 28 6f 72 20 65 72  n Windows (or er
2b730 72 6e 6f 20 61 6e 64 0a 2a 2a 20 73 74 72 65 72  rno and.** strer
2b740 72 6f 72 5f 72 28 29 20 6f 6e 20 55 6e 69 78 29  ror_r() on Unix)
2b750 2e 20 41 66 74 65 72 20 61 6e 20 65 72 72 6f 72  . After an error
2b760 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20   is returned by 
2b770 61 6e 20 4f 53 0a 2a 2a 20 66 75 6e 63 74 69 6f  an OS.** functio
2b780 6e 2c 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20  n, SQLite calls 
2b790 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
2b7a0 74 68 20 7a 42 75 66 20 70 6f 69 6e 74 69 6e 67  th zBuf pointing
2b7b0 20 74 6f 0a 2a 2a 20 61 20 62 75 66 66 65 72 20   to.** a buffer 
2b7c0 6f 66 20 6e 42 75 66 20 62 79 74 65 73 2e 20 54  of nBuf bytes. T
2b7d0 68 65 20 4f 53 20 6c 61 79 65 72 20 73 68 6f 75  he OS layer shou
2b7e0 6c 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65 0a  ld populate the.
2b7f0 2a 2a 20 62 75 66 66 65 72 20 77 69 74 68 20 61  ** buffer with a
2b800 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
2b810 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 65 72  UTF-8 encoded er
2b820 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 64  ror message.** d
2b830 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 6c 61  escribing the la
2b840 73 74 20 49 4f 20 65 72 72 6f 72 20 74 6f 20 68  st IO error to h
2b850 61 76 65 20 6f 63 63 75 72 72 65 64 20 77 69 74  ave occurred wit
2b860 68 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a  hin the calling.
2b870 2a 2a 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  ** thread..**.**
2b880 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   If the error me
2b890 73 73 61 67 65 20 69 73 20 74 6f 6f 20 6c 61 72  ssage is too lar
2b8a0 67 65 20 66 6f 72 20 74 68 65 20 73 75 70 70 6c  ge for the suppl
2b8b0 69 65 64 20 62 75 66 66 65 72 2c 0a 2a 2a 20 69  ied buffer,.** i
2b8c0 74 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e  t should be trun
2b8d0 63 61 74 65 64 2e 20 54 68 65 20 72 65 74 75 72  cated. The retur
2b8e0 6e 20 76 61 6c 75 65 20 6f 66 20 78 47 65 74 4c  n value of xGetL
2b8f0 61 73 74 45 72 72 6f 72 0a 2a 2a 20 69 73 20 7a  astError.** is z
2b900 65 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72  ero if the error
2b910 20 6d 65 73 73 61 67 65 20 66 69 74 73 20 69 6e   message fits in
2b920 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f 72 20   the buffer, or 
2b930 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65  non-zero.** othe
2b940 72 77 69 73 65 20 28 69 66 20 74 68 65 20 6d 65  rwise (if the me
2b950 73 73 61 67 65 20 77 61 73 20 74 72 75 6e 63 61  ssage was trunca
2b960 74 65 64 29 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72  ted). If non-zer
2b970 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  o is returned,.*
2b980 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74  * then it is not
2b990 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 69 6e   necessary to in
2b9a0 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 2d 74 65  clude the nul-te
2b9b0 72 6d 69 6e 61 74 6f 72 20 63 68 61 72 61 63 74  rminator charact
2b9c0 65 72 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74  er.** in the out
2b9d0 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  put buffer..**.*
2b9e0 2a 20 4e 6f 74 20 73 75 70 70 6c 79 69 6e 67 20  * Not supplying 
2b9f0 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
2ba00 20 77 69 6c 6c 20 68 61 76 65 20 6e 6f 20 61 64   will have no ad
2ba10 76 65 72 73 65 20 65 66 66 65 63 74 0a 2a 2a 20  verse effect.** 
2ba20 6f 6e 20 53 51 4c 69 74 65 2e 20 49 74 20 69 73  on SQLite. It is
2ba30 20 66 69 6e 65 20 74 6f 20 68 61 76 65 20 61 6e   fine to have an
2ba40 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2ba50 74 68 61 74 20 6e 65 76 65 72 0a 2a 2a 20 72 65  that never.** re
2ba60 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 6d  turns an error m
2ba70 65 73 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  essage:.**.**   
2ba80 69 6e 74 20 78 47 65 74 4c 61 73 74 45 72 72 6f  int xGetLastErro
2ba90 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  r(sqlite3_vfs *p
2baa0 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  Vfs, int nBuf, c
2bab0 68 61 72 20 2a 7a 42 75 66 29 7b 0a 2a 2a 20 20  har *zBuf){.**  
2bac0 20 20 20 61 73 73 65 72 74 28 7a 42 75 66 5b 30     assert(zBuf[0
2bad0 5d 3d 3d 27 5c 30 27 29 3b 0a 2a 2a 20 20 20 20  ]=='\0');.**    
2bae0 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 20 20 20   return 0;.**   
2baf0 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 20  }.**.** However 
2bb00 69 66 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  if an error mess
2bb10 61 67 65 20 69 73 20 73 75 70 70 6c 69 65 64 2c  age is supplied,
2bb20 20 69 74 20 77 69 6c 6c 20 62 65 20 69 6e 63 6f   it will be inco
2bb30 72 70 6f 72 61 74 65 64 0a 2a 2a 20 62 79 20 73  rporated.** by s
2bb40 71 6c 69 74 65 20 69 6e 74 6f 20 74 68 65 20 65  qlite into the e
2bb50 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 76 61  rror message ava
2bb60 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73  ilable to the us
2bb70 65 72 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69  er using.** sqli
2bb80 74 65 33 5f 65 72 72 6d 73 67 28 29 2c 20 70 6f  te3_errmsg(), po
2bb90 73 73 69 62 6c 79 20 6d 61 6b 69 6e 67 20 49 4f  ssibly making IO
2bba0 20 65 72 72 6f 72 73 20 65 61 73 69 65 72 20 74   errors easier t
2bbb0 6f 20 64 65 62 75 67 2e 0a 2a 2f 0a 73 74 61 74  o debug..*/.stat
2bbc0 69 63 20 69 6e 74 20 77 69 6e 47 65 74 4c 61 73  ic int winGetLas
2bbd0 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  tError(sqlite3_v
2bbe0 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
2bbf0 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
2bc00 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2bc10 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74  TER(pVfs);.  ret
2bc20 75 72 6e 20 77 69 6e 47 65 74 4c 61 73 74 45 72  urn winGetLastEr
2bc30 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61 73 74  rorMsg(osGetLast
2bc40 45 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a  Error(), nBuf, z
2bc50 42 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  Buf);.}../*.** I
2bc60 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20 64 65  nitialize and de
2bc70 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f  initialize the o
2bc80 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
2bc90 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e  interface..*/.in
2bca0 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69  t sqlite3_os_ini
2bcb0 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  t(void){.  stati
2bcc0 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69  c sqlite3_vfs wi
2bcd0 6e 56 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20  nVfs = {.    3, 
2bce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bcf0 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
2bd00 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46  .    sizeof(winF
2bd10 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f  ile),     /* szO
2bd20 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 53 51 4c  sFile */.    SQL
2bd30 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41  ITE_WIN32_MAX_PA
2bd40 54 48 5f 42 59 54 45 53 2c 20 2f 2a 20 6d 78 50  TH_BYTES, /* mxP
2bd50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30  athname */.    0
2bd60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2bd70 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a      /* pNext */.
2bd80 20 20 20 20 22 77 69 6e 33 32 22 2c 20 20 20 20      "win32",    
2bd90 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d           /* zNam
2bda0 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
2bdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bdc0 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20   pAppData */.   
2bdd0 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20   winOpen,       
2bde0 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a        /* xOpen *
2bdf0 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c  /.    winDelete,
2be00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
2be10 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e  elete */.    win
2be20 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20  Access,         
2be30 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a    /* xAccess */.
2be40 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e      winFullPathn
2be50 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c  ame,     /* xFul
2be60 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20  lPathname */.   
2be70 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20   winDlOpen,     
2be80 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e        /* xDlOpen
2be90 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72   */.    winDlErr
2bea0 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  or,          /* 
2beb0 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20  xDlError */.    
2bec0 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20  winDlSym,       
2bed0 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a       /* xDlSym *
2bee0 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65  /.    winDlClose
2bef0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ,          /* xD
2bf00 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69  lClose */.    wi
2bf10 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20  nRandomness,    
2bf20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73     /* xRandomnes
2bf30 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65  s */.    winSlee
2bf40 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
2bf50 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77   xSleep */.    w
2bf60 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20  inCurrentTime,  
2bf70 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54      /* xCurrentT
2bf80 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65  ime */.    winGe
2bf90 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20  tLastError,     
2bfa0 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  /* xGetLastError
2bfb0 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65   */.    winCurre
2bfc0 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20  ntTimeInt64, /* 
2bfd0 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
2bfe0 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74 53  4 */.    winSetS
2bff0 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a  ystemCall,    /*
2c000 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20   xSetSystemCall 
2c010 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 53 79 73  */.    winGetSys
2c020 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78  temCall,    /* x
2c030 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  GetSystemCall */
2c040 0a 20 20 20 20 77 69 6e 4e 65 78 74 53 79 73 74  .    winNextSyst
2c050 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65  emCall,   /* xNe
2c060 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a  xtSystemCall */.
2c070 20 20 7d 3b 0a 23 69 66 20 64 65 66 69 6e 65 64    };.#if defined
2c080 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
2c090 53 5f 57 49 44 45 29 0a 20 20 73 74 61 74 69 63  S_WIDE).  static
2c0a0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e   sqlite3_vfs win
2c0b0 4c 6f 6e 67 50 61 74 68 56 66 73 20 3d 20 7b 0a  LongPathVfs = {.
2c0c0 20 20 20 20 33 2c 20 20 20 20 20 20 20 20 20 20      3,          
2c0d0 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
2c0e0 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65  sion */.    size
2c0f0 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20  of(winFile),    
2c100 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a   /* szOsFile */.
2c110 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54      SQLITE_WINNT
2c120 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53 2c  _MAX_PATH_BYTES,
2c130 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a   /* mxPathname *
2c140 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
2c150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e             /* pN
2c160 65 78 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33  ext */.    "win3
2c170 32 2d 6c 6f 6e 67 70 61 74 68 22 2c 20 20 20 20  2-longpath",    
2c180 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20  /* zName */.    
2c190 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2c1a0 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61       /* pAppData
2c1b0 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c   */.    winOpen,
2c1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c1d0 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e  xOpen */.    win
2c1e0 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20  Delete,         
2c1f0 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a    /* xDelete */.
2c200 20 20 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20      winAccess,  
2c210 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63           /* xAcc
2c220 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75  ess */.    winFu
2c230 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20  llPathname,     
2c240 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  /* xFullPathname
2c250 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65   */.    winDlOpe
2c260 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n,           /* 
2c270 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77  xDlOpen */.    w
2c280 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20  inDlError,      
2c290 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20      /* xDlError 
2c2a0 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c  */.    winDlSym,
2c2b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2c2c0 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e  DlSym */.    win
2c2d0 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  DlClose,        
2c2e0 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f    /* xDlClose */
2c2f0 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65  .    winRandomne
2c300 73 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61  ss,       /* xRa
2c310 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20  ndomness */.    
2c320 77 69 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20  winSleep,       
2c330 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a       /* xSleep *
2c340 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74  /.    winCurrent
2c350 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43  Time,      /* xC
2c360 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20  urrentTime */.  
2c370 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f    winGetLastErro
2c380 72 2c 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61  r,     /* xGetLa
2c390 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77  stError */.    w
2c3a0 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  inCurrentTimeInt
2c3b0 36 34 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74 54  64, /* xCurrentT
2c3c0 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20  imeInt64 */.    
2c3d0 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  winSetSystemCall
2c3e0 2c 20 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74  ,    /* xSetSyst
2c3f0 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69  emCall */.    wi
2c400 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  nGetSystemCall, 
2c410 20 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d     /* xGetSystem
2c420 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e  Call */.    winN
2c430 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  extSystemCall,  
2c440 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43   /* xNextSystemC
2c450 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 65 6e 64  all */.  };.#end
2c460 69 66 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c 65 2d  if..  /* Double-
2c470 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61  check that the a
2c480 53 79 73 63 61 6c 6c 5b 5d 20 61 72 72 61 79 20  Syscall[] array 
2c490 68 61 73 20 62 65 65 6e 20 63 6f 6e 73 74 72 75  has been constru
2c4a0 63 74 65 64 0a 20 20 2a 2a 20 63 6f 72 72 65 63  cted.  ** correc
2c4b0 74 6c 79 2e 20 20 53 65 65 20 74 69 63 6b 65 74  tly.  See ticket
2c4c0 20 5b 62 62 33 61 38 36 65 38 39 30 63 38 65 39   [bb3a86e890c8e9
2c4d0 36 61 62 5d 20 2a 2f 0a 20 20 61 73 73 65 72 74  6ab] */.  assert
2c4e0 28 20 41 72 72 61 79 53 69 7a 65 28 61 53 79 73  ( ArraySize(aSys
2c4f0 63 61 6c 6c 29 3d 3d 37 39 20 29 3b 0a 0a 20 20  call)==79 );..  
2c500 2f 2a 20 67 65 74 20 6d 65 6d 6f 72 79 20 6d 61  /* get memory ma
2c510 70 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 67 72 61  p allocation gra
2c520 6e 75 6c 61 72 69 74 79 20 2a 2f 0a 20 20 6d 65  nularity */.  me
2c530 6d 73 65 74 28 26 77 69 6e 53 79 73 49 6e 66 6f  mset(&winSysInfo
2c540 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 59 53 54  , 0, sizeof(SYST
2c550 45 4d 5f 49 4e 46 4f 29 29 3b 0a 23 69 66 20 53  EM_INFO));.#if S
2c560 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
2c570 20 6f 73 47 65 74 4e 61 74 69 76 65 53 79 73 74   osGetNativeSyst
2c580 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e  emInfo(&winSysIn
2c590 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 47  fo);.#else.  osG
2c5a0 65 74 53 79 73 74 65 6d 49 6e 66 6f 28 26 77 69  etSystemInfo(&wi
2c5b0 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 65 6e 64 69  nSysInfo);.#endi
2c5c0 66 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e 53  f.  assert( winS
2c5d0 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74  ysInfo.dwAllocat
2c5e0 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3e 30  ionGranularity>0
2c5f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69   );.  assert( wi
2c600 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53  nSysInfo.dwPageS
2c610 69 7a 65 3e 30 20 29 3b 0a 0a 20 20 73 71 6c 69  ize>0 );..  sqli
2c620 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
2c630 28 26 77 69 6e 56 66 73 2c 20 31 29 3b 0a 0a 23  (&winVfs, 1);..#
2c640 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
2c650 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
2c660 29 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ).  sqlite3_vfs_
2c670 72 65 67 69 73 74 65 72 28 26 77 69 6e 4c 6f 6e  register(&winLon
2c680 67 50 61 74 68 56 66 73 2c 20 30 29 3b 0a 23 65  gPathVfs, 0);.#e
2c690 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 53  ndif..  return S
2c6a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74  QLITE_OK;.}..int
2c6b0 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28   sqlite3_os_end(
2c6c0 76 6f 69 64 29 7b 0a 23 69 66 20 53 51 4c 49 54  void){.#if SQLIT
2c6d0 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 28  E_OS_WINRT.  if(
2c6e0 20 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20   sleepObj!=NULL 
2c6f0 29 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61  ){.    osCloseHa
2c700 6e 64 6c 65 28 73 6c 65 65 70 4f 62 6a 29 3b 0a  ndle(sleepObj);.
2c710 20 20 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20 4e      sleepObj = N
2c720 55 4c 4c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ULL;.  }.#endif.
2c730 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c740 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  OK;.}..#endif /*
2c750 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 2a   SQLITE_OS_WIN *
2c760 2f 0a                                            /.