/ Hex Artifact Content
Login

Artifact d5f32f015c52888b76c8919a8b3fa5c532dff497:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 57 69 6e 64 6f 77 73 2e  ific to Windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
0210: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75   */../*.** Inclu
0220: 64 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20  de code that is 
0230: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73  common to all os
0240: 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69  _*.c files.*/.#i
0250: 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f  nclude "os_commo
0260: 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c  n.h"../*.** Incl
0270: 75 64 65 20 74 68 65 20 68 65 61 64 65 72 20 66  ude the header f
0280: 69 6c 65 20 66 6f 72 20 74 68 65 20 57 69 6e 64  ile for the Wind
0290: 6f 77 73 20 56 46 53 2e 0a 2a 2f 0a 23 69 6e 63  ows VFS..*/.#inc
02a0: 6c 75 64 65 20 22 6f 73 5f 77 69 6e 2e 68 22 0a  lude "os_win.h".
02b0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 69 6e 67  ./*.** Compiling
02c0: 20 61 6e 64 20 75 73 69 6e 67 20 57 41 4c 20 6d   and using WAL m
02d0: 6f 64 65 20 72 65 71 75 69 72 65 73 20 73 65 76  ode requires sev
02e0: 65 72 61 6c 20 41 50 49 73 20 74 68 61 74 20 61  eral APIs that a
02f0: 72 65 20 6f 6e 6c 79 0a 2a 2a 20 61 76 61 69 6c  re only.** avail
0300: 61 62 6c 65 20 69 6e 20 57 69 6e 64 6f 77 73 20  able in Windows 
0310: 70 6c 61 74 66 6f 72 6d 73 20 62 61 73 65 64 20  platforms based 
0320: 6f 6e 20 74 68 65 20 4e 54 20 6b 65 72 6e 65 6c  on the NT kernel
0330: 2e 0a 2a 2f 0a 23 69 66 20 21 53 51 4c 49 54 45  ..*/.#if !SQLITE
0340: 5f 4f 53 5f 57 49 4e 4e 54 20 26 26 20 21 64 65  _OS_WINNT && !de
0350: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
0360: 54 5f 57 41 4c 29 0a 23 20 20 65 72 72 6f 72 20  T_WAL).#  error 
0370: 22 57 41 4c 20 6d 6f 64 65 20 72 65 71 75 69 72  "WAL mode requir
0380: 65 73 20 73 75 70 70 6f 72 74 20 66 72 6f 6d 20  es support from 
0390: 74 68 65 20 57 69 6e 64 6f 77 73 20 4e 54 20 6b  the Windows NT k
03a0: 65 72 6e 65 6c 2c 20 63 6f 6d 70 69 6c 65 5c 0a  ernel, compile\.
03b0: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 4d 49   with SQLITE_OMI
03c0: 54 5f 57 41 4c 2e 22 0a 23 65 6e 64 69 66 0a 0a  T_WAL.".#endif..
03d0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
03e0: 49 4e 4e 54 20 26 26 20 53 51 4c 49 54 45 5f 4d  INNT && SQLITE_M
03f0: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23  AX_MMAP_SIZE>0.#
0400: 20 20 65 72 72 6f 72 20 22 4d 65 6d 6f 72 79 20    error "Memory 
0410: 6d 61 70 70 65 64 20 66 69 6c 65 73 20 72 65 71  mapped files req
0420: 75 69 72 65 20 73 75 70 70 6f 72 74 20 66 72 6f  uire support fro
0430: 6d 20 74 68 65 20 57 69 6e 64 6f 77 73 20 4e 54  m the Windows NT
0440: 20 6b 65 72 6e 65 6c 2c 5c 0a 20 63 6f 6d 70 69   kernel,\. compi
0450: 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4d  le with SQLITE_M
0460: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3d 30 2e 22  AX_MMAP_SIZE=0."
0470: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
0480: 72 65 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 57  re most of the W
0490: 69 6e 33 32 20 41 4e 53 49 20 41 50 49 73 20 61  in32 ANSI APIs a
04a0: 76 61 69 6c 61 62 6c 65 20 28 69 2e 65 2e 20 77  vailable (i.e. w
04b0: 69 74 68 20 63 65 72 74 61 69 6e 20 65 78 63 65  ith certain exce
04c0: 70 74 69 6f 6e 73 0a 2a 2a 20 62 61 73 65 64 20  ptions.** based 
04d0: 6f 6e 20 74 68 65 20 73 75 62 2d 70 6c 61 74 66  on the sub-platf
04e0: 6f 72 6d 29 3f 0a 2a 2f 0a 23 69 66 20 21 53 51  orm)?.*/.#if !SQ
04f0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
0500: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
0510: 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  T && !defined(SQ
0520: 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 41 4e  LITE_WIN32_NO_AN
0530: 53 49 29 0a 23 20 20 64 65 66 69 6e 65 20 53 51  SI).#  define SQ
0540: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
0550: 4e 53 49 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  NSI.#endif../*.*
0560: 2a 20 41 72 65 20 6d 6f 73 74 20 6f 66 20 74 68  * Are most of th
0570: 65 20 57 69 6e 33 32 20 55 6e 69 63 6f 64 65 20  e Win32 Unicode 
0580: 41 50 49 73 20 61 76 61 69 6c 61 62 6c 65 20 28  APIs available (
0590: 69 2e 65 2e 20 77 69 74 68 20 63 65 72 74 61 69  i.e. with certai
05a0: 6e 20 65 78 63 65 70 74 69 6f 6e 73 0a 2a 2a 20  n exceptions.** 
05b0: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 75 62  based on the sub
05c0: 2d 70 6c 61 74 66 6f 72 6d 29 3f 0a 2a 2f 0a 23  -platform)?.*/.#
05d0: 69 66 20 28 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if (SQLITE_OS_WI
05e0: 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53  NCE || SQLITE_OS
05f0: 5f 57 49 4e 4e 54 20 7c 7c 20 53 51 4c 49 54 45  _WINNT || SQLITE
0600: 5f 4f 53 5f 57 49 4e 52 54 29 20 26 26 20 5c 0a  _OS_WINRT) && \.
0610: 20 20 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c      !defined(SQL
0620: 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 57 49 44  ITE_WIN32_NO_WID
0630: 45 29 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  E).#  define SQL
0640: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
0650: 44 45 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  DE.#endif../*.**
0660: 20 4d 61 6b 65 20 73 75 72 65 20 61 74 20 6c 65   Make sure at le
0670: 61 73 74 20 6f 6e 65 20 73 65 74 20 6f 66 20 57  ast one set of W
0680: 69 6e 33 32 20 41 50 49 73 20 69 73 20 61 76 61  in32 APIs is ava
0690: 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 20 21  ilable..*/.#if !
06a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
06b0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26  IN32_HAS_ANSI) &
06c0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
06d0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
06e0: 29 0a 23 20 20 65 72 72 6f 72 20 22 41 74 20 6c  ).#  error "At l
06f0: 65 61 73 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49  east one of SQLI
0700: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
0710: 49 20 61 6e 64 20 53 51 4c 49 54 45 5f 57 49 4e  I and SQLITE_WIN
0720: 33 32 5f 48 41 53 5f 57 49 44 45 5c 0a 20 6d 75  32_HAS_WIDE\. mu
0730: 73 74 20 62 65 20 64 65 66 69 6e 65 64 2e 22 0a  st be defined.".
0740: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
0750: 66 69 6e 65 20 74 68 65 20 72 65 71 75 69 72 65  fine the require
0760: 64 20 57 69 6e 64 6f 77 73 20 53 44 4b 20 76 65  d Windows SDK ve
0770: 72 73 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 20  rsion constants 
0780: 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a  if they are not.
0790: 2a 2a 20 61 6c 72 65 61 64 79 20 61 76 61 69 6c  ** already avail
07a0: 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  able..*/.#ifndef
07b0: 20 4e 54 44 44 49 5f 57 49 4e 38 0a 23 20 20 64   NTDDI_WIN8.#  d
07c0: 65 66 69 6e 65 20 4e 54 44 44 49 5f 57 49 4e 38  efine NTDDI_WIN8
07d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07e0: 20 20 20 20 20 20 20 20 30 78 30 36 30 32 30 30          0x060200
07f0: 30 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  00.#endif..#ifnd
0800: 65 66 20 4e 54 44 44 49 5f 57 49 4e 42 4c 55 45  ef NTDDI_WINBLUE
0810: 0a 23 20 20 64 65 66 69 6e 65 20 4e 54 44 44 49  .#  define NTDDI
0820: 5f 57 49 4e 42 4c 55 45 20 20 20 20 20 20 20 20  _WINBLUE        
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30               0x0
0840: 36 30 33 30 30 30 30 0a 23 65 6e 64 69 66 0a 0a  6030000.#endif..
0850: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
0860: 65 65 20 69 66 20 74 68 65 20 47 65 74 56 65 72  ee if the GetVer
0870: 73 69 6f 6e 45 78 5b 41 57 5d 20 66 75 6e 63 74  sionEx[AW] funct
0880: 69 6f 6e 73 20 61 72 65 20 64 65 70 72 65 63 61  ions are depreca
0890: 74 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 74 61  ted on the.** ta
08a0: 72 67 65 74 20 73 79 73 74 65 6d 2e 20 20 47 65  rget system.  Ge
08b0: 74 56 65 72 73 69 6f 6e 45 78 20 77 61 73 20 66  tVersionEx was f
08c0: 69 72 73 74 20 64 65 70 72 65 63 61 74 65 64 20  irst deprecated 
08d0: 69 6e 20 57 69 6e 38 2e 31 2e 0a 2a 2f 0a 23 69  in Win8.1..*/.#i
08e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
08f0: 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a  32_GETVERSIONEX.
0900: 23 20 20 69 66 20 64 65 66 69 6e 65 64 28 4e 54  #  if defined(NT
0910: 44 44 49 5f 56 45 52 53 49 4f 4e 29 20 26 26 20  DDI_VERSION) && 
0920: 4e 54 44 44 49 5f 56 45 52 53 49 4f 4e 20 3e 3d  NTDDI_VERSION >=
0930: 20 4e 54 44 44 49 5f 57 49 4e 42 4c 55 45 0a 23   NTDDI_WINBLUE.#
0940: 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54      define SQLIT
0950: 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49  E_WIN32_GETVERSI
0960: 4f 4e 45 58 20 20 20 30 20 20 20 2f 2a 20 47 65  ONEX   0   /* Ge
0970: 74 56 65 72 73 69 6f 6e 45 78 28 29 20 69 73 20  tVersionEx() is 
0980: 64 65 70 72 65 63 61 74 65 64 20 2a 2f 0a 23 20  deprecated */.# 
0990: 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66 69 6e   else.#    defin
09a0: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47  e SQLITE_WIN32_G
09b0: 45 54 56 45 52 53 49 4f 4e 45 58 20 20 20 31 20  ETVERSIONEX   1 
09c0: 20 20 2f 2a 20 47 65 74 56 65 72 73 69 6f 6e 45    /* GetVersionE
09d0: 78 28 29 20 69 73 20 63 75 72 72 65 6e 74 20 2a  x() is current *
09e0: 2f 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  /.#  endif.#endi
09f0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 63 6f  f../*.** This co
0a00: 6e 73 74 61 6e 74 20 73 68 6f 75 6c 64 20 61 6c  nstant should al
0a10: 72 65 61 64 79 20 62 65 20 64 65 66 69 6e 65 64  ready be defined
0a20: 20 28 69 6e 20 74 68 65 20 22 57 69 6e 44 65 66   (in the "WinDef
0a30: 2e 68 22 20 53 44 4b 20 66 69 6c 65 29 2e 0a 2a  .h" SDK file)..*
0a40: 2f 0a 23 69 66 6e 64 65 66 20 4d 41 58 5f 50 41  /.#ifndef MAX_PA
0a50: 54 48 0a 23 20 20 64 65 66 69 6e 65 20 4d 41 58  TH.#  define MAX
0a60: 5f 50 41 54 48 20 20 20 20 20 20 20 20 20 20 20  _PATH           
0a70: 20 20 20 20 20 20 20 20 20 20 20 28 32 36 30 29             (260)
0a80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
0a90: 61 78 69 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20  aximum pathname 
0aa0: 6c 65 6e 67 74 68 20 28 69 6e 20 63 68 61 72 73  length (in chars
0ab0: 29 20 66 6f 72 20 57 69 6e 33 32 2e 20 20 54 68  ) for Win32.  Th
0ac0: 69 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c  is should normal
0ad0: 6c 79 20 62 65 0a 2a 2a 20 4d 41 58 5f 50 41 54  ly be.** MAX_PAT
0ae0: 48 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  H..*/.#ifndef SQ
0af0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50  LITE_WIN32_MAX_P
0b00: 41 54 48 5f 43 48 41 52 53 0a 23 20 20 64 65 66  ATH_CHARS.#  def
0b10: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
0b20: 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41 52 53 20  _MAX_PATH_CHARS 
0b30: 20 20 28 4d 41 58 5f 50 41 54 48 29 0a 23 65 6e    (MAX_PATH).#en
0b40: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
0b50: 63 6f 6e 73 74 61 6e 74 20 73 68 6f 75 6c 64 20  constant should 
0b60: 61 6c 72 65 61 64 79 20 62 65 20 64 65 66 69 6e  already be defin
0b70: 65 64 20 28 69 6e 20 74 68 65 20 22 57 69 6e 4e  ed (in the "WinN
0b80: 54 2e 68 22 20 53 44 4b 20 66 69 6c 65 29 2e 0a  T.h" SDK file)..
0b90: 2a 2f 0a 23 69 66 6e 64 65 66 20 55 4e 49 43 4f  */.#ifndef UNICO
0ba0: 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48  DE_STRING_MAX_CH
0bb0: 41 52 53 0a 23 20 20 64 65 66 69 6e 65 20 55 4e  ARS.#  define UN
0bc0: 49 43 4f 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58  ICODE_STRING_MAX
0bd0: 5f 43 48 41 52 53 20 20 20 20 20 20 28 33 32 37  _CHARS      (327
0be0: 36 37 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  67).#endif../*.*
0bf0: 2a 20 4d 61 78 69 6d 75 6d 20 70 61 74 68 6e 61  * Maximum pathna
0c00: 6d 65 20 6c 65 6e 67 74 68 20 28 69 6e 20 63 68  me length (in ch
0c10: 61 72 73 29 20 66 6f 72 20 57 69 6e 4e 54 2e 20  ars) for WinNT. 
0c20: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 72   This should nor
0c30: 6d 61 6c 6c 79 20 62 65 0a 2a 2a 20 55 4e 49 43  mally be.** UNIC
0c40: 4f 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58 5f 43  ODE_STRING_MAX_C
0c50: 48 41 52 53 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  HARS..*/.#ifndef
0c60: 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41   SQLITE_WINNT_MA
0c70: 58 5f 50 41 54 48 5f 43 48 41 52 53 0a 23 20 20  X_PATH_CHARS.#  
0c80: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
0c90: 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41  NNT_MAX_PATH_CHA
0ca0: 52 53 20 20 20 28 55 4e 49 43 4f 44 45 5f 53 54  RS   (UNICODE_ST
0cb0: 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52 53 29 0a  RING_MAX_CHARS).
0cc0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
0cd0: 78 69 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c  ximum pathname l
0ce0: 65 6e 67 74 68 20 28 69 6e 20 62 79 74 65 73 29  ength (in bytes)
0cf0: 20 66 6f 72 20 57 69 6e 33 32 2e 20 20 54 68 65   for Win32.  The
0d00: 20 4d 41 58 5f 50 41 54 48 20 6d 61 63 72 6f 20   MAX_PATH macro 
0d10: 69 73 20 69 6e 0a 2a 2a 20 63 68 61 72 61 63 74  is in.** charact
0d20: 65 72 73 2c 20 73 6f 20 77 65 20 61 6c 6c 6f 63  ers, so we alloc
0d30: 61 74 65 20 34 20 62 79 74 65 73 20 70 65 72 20  ate 4 bytes per 
0d40: 63 68 61 72 61 63 74 65 72 20 61 73 73 75 6d 69  character assumi
0d50: 6e 67 20 77 6f 72 73 74 2d 63 61 73 65 20 6f 66  ng worst-case of
0d60: 0a 2a 2a 20 34 2d 62 79 74 65 73 2d 70 65 72 2d  .** 4-bytes-per-
0d70: 63 68 61 72 61 63 74 65 72 20 66 6f 72 20 55 54  character for UT
0d80: 46 38 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  F8..*/.#ifndef S
0d90: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f  QLITE_WIN32_MAX_
0da0: 50 41 54 48 5f 42 59 54 45 53 0a 23 20 20 64 65  PATH_BYTES.#  de
0db0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
0dc0: 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53  2_MAX_PATH_BYTES
0dd0: 20 20 20 28 53 51 4c 49 54 45 5f 57 49 4e 33 32     (SQLITE_WIN32
0de0: 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41 52 53 2a  _MAX_PATH_CHARS*
0df0: 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  4).#endif../*.**
0e00: 20 4d 61 78 69 6d 75 6d 20 70 61 74 68 6e 61 6d   Maximum pathnam
0e10: 65 20 6c 65 6e 67 74 68 20 28 69 6e 20 62 79 74  e length (in byt
0e20: 65 73 29 20 66 6f 72 20 57 69 6e 4e 54 2e 20 20  es) for WinNT.  
0e30: 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d  This should norm
0e40: 61 6c 6c 79 20 62 65 0a 2a 2a 20 55 4e 49 43 4f  ally be.** UNICO
0e50: 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48  DE_STRING_MAX_CH
0e60: 41 52 53 20 2a 20 73 69 7a 65 6f 66 28 57 43 48  ARS * sizeof(WCH
0e70: 41 52 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  AR)..*/.#ifndef 
0e80: 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58  SQLITE_WINNT_MAX
0e90: 5f 50 41 54 48 5f 42 59 54 45 53 0a 23 20 20 64  _PATH_BYTES.#  d
0ea0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
0eb0: 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45  NT_MAX_PATH_BYTE
0ec0: 53 20 20 20 5c 0a 20 20 20 20 20 20 20 20 20 20  S   \.          
0ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ee0: 20 20 28 73 69 7a 65 6f 66 28 57 43 48 41 52 29    (sizeof(WCHAR)
0ef0: 20 2a 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f   * SQLITE_WINNT_
0f00: 4d 41 58 5f 50 41 54 48 5f 43 48 41 52 53 29 0a  MAX_PATH_CHARS).
0f10: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
0f20: 78 69 6d 75 6d 20 65 72 72 6f 72 20 6d 65 73 73  ximum error mess
0f30: 61 67 65 20 6c 65 6e 67 74 68 20 28 69 6e 20 63  age length (in c
0f40: 68 61 72 73 29 20 66 6f 72 20 57 69 6e 52 54 2e  hars) for WinRT.
0f50: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
0f60: 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52  TE_WIN32_MAX_ERR
0f70: 4d 53 47 5f 43 48 41 52 53 0a 23 20 20 64 65 66  MSG_CHARS.#  def
0f80: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
0f90: 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41 52  _MAX_ERRMSG_CHAR
0fa0: 53 20 28 31 30 32 34 29 0a 23 65 6e 64 69 66 0a  S (1024).#endif.
0fb0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e  ./*.** Returns n
0fc0: 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 63  on-zero if the c
0fd0: 68 61 72 61 63 74 65 72 20 73 68 6f 75 6c 64 20  haracter should 
0fe0: 62 65 20 74 72 65 61 74 65 64 20 61 73 20 61 20  be treated as a 
0ff0: 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 73 65 70  directory.** sep
1000: 61 72 61 74 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64  arator..*/.#ifnd
1010: 65 66 20 77 69 6e 49 73 44 69 72 53 65 70 0a 23  ef winIsDirSep.#
1020: 20 20 64 65 66 69 6e 65 20 77 69 6e 49 73 44 69    define winIsDi
1030: 72 53 65 70 28 61 29 20 20 20 20 20 20 20 20 20  rSep(a)         
1040: 20 20 20 20 20 20 20 28 28 28 61 29 20 3d 3d 20         (((a) == 
1050: 27 2f 27 29 20 7c 7c 20 28 28 61 29 20 3d 3d 20  '/') || ((a) == 
1060: 27 5c 5c 27 29 29 0a 23 65 6e 64 69 66 0a 0a 2f  '\\')).#endif../
1070: 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20  *.** This macro 
1080: 69 73 20 75 73 65 64 20 77 68 65 6e 20 61 20 6c  is used when a l
1090: 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73  ocal variable is
10a0: 20 73 65 74 20 74 6f 20 61 20 76 61 6c 75 65 20   set to a value 
10b0: 74 68 61 74 20 69 73 0a 2a 2a 20 5b 73 6f 6d 65  that is.** [some
10c0: 74 69 6d 65 73 5d 20 6e 6f 74 20 75 73 65 64 20  times] not used 
10d0: 62 79 20 74 68 65 20 63 6f 64 65 20 28 65 2e 67  by the code (e.g
10e0: 2e 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 61  . via conditiona
10f0: 6c 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 29 2e 0a  l compilation)..
1100: 2a 2f 0a 23 69 66 6e 64 65 66 20 55 4e 55 53 45  */.#ifndef UNUSE
1110: 44 5f 56 41 52 49 41 42 4c 45 5f 56 41 4c 55 45  D_VARIABLE_VALUE
1120: 0a 23 20 20 64 65 66 69 6e 65 20 55 4e 55 53 45  .#  define UNUSE
1130: 44 5f 56 41 52 49 41 42 4c 45 5f 56 41 4c 55 45  D_VARIABLE_VALUE
1140: 28 78 29 20 20 20 20 20 20 28 76 6f 69 64 29 28  (x)      (void)(
1150: 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
1160: 20 52 65 74 75 72 6e 73 20 74 68 65 20 63 68 61   Returns the cha
1170: 72 61 63 74 65 72 20 74 68 61 74 20 73 68 6f 75  racter that shou
1180: 6c 64 20 62 65 20 75 73 65 64 20 61 73 20 74 68  ld be used as th
1190: 65 20 64 69 72 65 63 74 6f 72 79 20 73 65 70 61  e directory sepa
11a0: 72 61 74 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65  rator..*/.#ifnde
11b0: 66 20 77 69 6e 47 65 74 44 69 72 53 65 70 0a 23  f winGetDirSep.#
11c0: 20 20 64 65 66 69 6e 65 20 77 69 6e 47 65 74 44    define winGetD
11d0: 69 72 53 65 70 28 29 20 20 20 20 20 20 20 20 20  irSep()         
11e0: 20 20 20 20 20 20 20 27 5c 5c 27 0a 23 65 6e 64         '\\'.#end
11f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 77 65 20  if../*.** Do we 
1200: 6e 65 65 64 20 74 6f 20 6d 61 6e 75 61 6c 6c 79  need to manually
1210: 20 64 65 66 69 6e 65 20 74 68 65 20 57 69 6e 33   define the Win3
1220: 32 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 41  2 file mapping A
1230: 50 49 73 20 66 6f 72 20 75 73 65 20 77 69 74 68  PIs for use with
1240: 20 57 41 4c 0a 2a 2a 20 6d 6f 64 65 20 6f 72 20   WAL.** mode or 
1250: 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 66 69  memory mapped fi
1260: 6c 65 73 20 28 65 2e 67 2e 20 74 68 65 73 65 20  les (e.g. these 
1270: 41 50 49 73 20 61 72 65 20 61 76 61 69 6c 61 62  APIs are availab
1280: 6c 65 20 69 6e 20 74 68 65 20 57 69 6e 64 6f 77  le in the Window
1290: 73 0a 2a 2a 20 43 45 20 53 44 4b 3b 20 68 6f 77  s.** CE SDK; how
12a0: 65 76 65 72 2c 20 74 68 65 79 20 61 72 65 20 6e  ever, they are n
12b0: 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  ot present in th
12c0: 65 20 68 65 61 64 65 72 20 66 69 6c 65 29 3f 0a  e header file)?.
12d0: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 57 49  */.#if SQLITE_WI
12e0: 4e 33 32 5f 46 49 4c 45 4d 41 50 50 49 4e 47 5f  N32_FILEMAPPING_
12f0: 41 50 49 20 26 26 20 5c 0a 20 20 20 20 20 20 20  API && \.       
1300: 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54   (!defined(SQLIT
1310: 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53  E_OMIT_WAL) || S
1320: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
1330: 49 5a 45 3e 30 29 0a 2f 2a 0a 2a 2a 20 54 77 6f  IZE>0)./*.** Two
1340: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6d 61 70   of the file map
1350: 70 69 6e 67 20 41 50 49 73 20 61 72 65 20 64 69  ping APIs are di
1360: 66 66 65 72 65 6e 74 20 75 6e 64 65 72 20 57 69  fferent under Wi
1370: 6e 52 54 2e 20 20 46 69 67 75 72 65 20 6f 75 74  nRT.  Figure out
1380: 20 77 68 69 63 68 0a 2a 2a 20 73 65 74 20 77 65   which.** set we
1390: 20 6e 65 65 64 2e 0a 2a 2f 0a 23 69 66 20 53 51   need..*/.#if SQ
13a0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 57 49  LITE_OS_WINRT.WI
13b0: 4e 42 41 53 45 41 50 49 20 48 41 4e 44 4c 45 20  NBASEAPI HANDLE 
13c0: 57 49 4e 41 50 49 20 43 72 65 61 74 65 46 69 6c  WINAPI CreateFil
13d0: 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 28  eMappingFromApp(
13e0: 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20  HANDLE, \.      
13f0: 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54    LPSECURITY_ATT
1400: 52 49 42 55 54 45 53 2c 20 55 4c 4f 4e 47 2c 20  RIBUTES, ULONG, 
1410: 55 4c 4f 4e 47 36 34 2c 20 4c 50 43 57 53 54 52  ULONG64, LPCWSTR
1420: 29 3b 0a 0a 57 49 4e 42 41 53 45 41 50 49 20 4c  );..WINBASEAPI L
1430: 50 56 4f 49 44 20 57 49 4e 41 50 49 20 4d 61 70  PVOID WINAPI Map
1440: 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70  ViewOfFileFromAp
1450: 70 28 48 41 4e 44 4c 45 2c 20 55 4c 4f 4e 47 2c  p(HANDLE, ULONG,
1460: 20 55 4c 4f 4e 47 36 34 2c 20 53 49 5a 45 5f 54   ULONG64, SIZE_T
1470: 29 3b 0a 23 65 6c 73 65 0a 23 69 66 20 64 65 66  );.#else.#if def
1480: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
1490: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 57 49 4e 42  2_HAS_ANSI).WINB
14a0: 41 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49  ASEAPI HANDLE WI
14b0: 4e 41 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d  NAPI CreateFileM
14c0: 61 70 70 69 6e 67 41 28 48 41 4e 44 4c 45 2c 20  appingA(HANDLE, 
14d0: 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49  LPSECURITY_ATTRI
14e0: 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20  BUTES, \.       
14f0: 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44   DWORD, DWORD, D
1500: 57 4f 52 44 2c 20 4c 50 43 53 54 52 29 3b 0a 23  WORD, LPCSTR);.#
1510: 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
1520: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
1530: 53 5f 41 4e 53 49 29 20 2a 2f 0a 0a 23 69 66 20  S_ANSI) */..#if 
1540: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
1550: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 57  IN32_HAS_WIDE).W
1560: 49 4e 42 41 53 45 41 50 49 20 48 41 4e 44 4c 45  INBASEAPI HANDLE
1570: 20 57 49 4e 41 50 49 20 43 72 65 61 74 65 46 69   WINAPI CreateFi
1580: 6c 65 4d 61 70 70 69 6e 67 57 28 48 41 4e 44 4c  leMappingW(HANDL
1590: 45 2c 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54  E, LPSECURITY_AT
15a0: 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20 20 20  TRIBUTES, \.    
15b0: 20 20 20 20 44 57 4f 52 44 2c 20 44 57 4f 52 44      DWORD, DWORD
15c0: 2c 20 44 57 4f 52 44 2c 20 4c 50 43 57 53 54 52  , DWORD, LPCWSTR
15d0: 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  );.#endif /* def
15e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
15f0: 32 5f 48 41 53 5f 57 49 44 45 29 20 2a 2f 0a 0a  2_HAS_WIDE) */..
1600: 57 49 4e 42 41 53 45 41 50 49 20 4c 50 56 4f 49  WINBASEAPI LPVOI
1610: 44 20 57 49 4e 41 50 49 20 4d 61 70 56 69 65 77  D WINAPI MapView
1620: 4f 66 46 69 6c 65 28 48 41 4e 44 4c 45 2c 20 44  OfFile(HANDLE, D
1630: 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f  WORD, DWORD, DWO
1640: 52 44 2c 20 53 49 5a 45 5f 54 29 3b 0a 23 65 6e  RD, SIZE_T);.#en
1650: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53  dif /* SQLITE_OS
1660: 5f 57 49 4e 52 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _WINRT */../*.**
1670: 20 54 68 65 73 65 20 66 69 6c 65 20 6d 61 70 70   These file mapp
1680: 69 6e 67 20 41 50 49 73 20 61 72 65 20 63 6f 6d  ing APIs are com
1690: 6d 6f 6e 20 74 6f 20 62 6f 74 68 20 57 69 6e 33  mon to both Win3
16a0: 32 20 61 6e 64 20 57 69 6e 52 54 2e 0a 2a 2f 0a  2 and WinRT..*/.
16b0: 0a 57 49 4e 42 41 53 45 41 50 49 20 42 4f 4f 4c  .WINBASEAPI BOOL
16c0: 20 57 49 4e 41 50 49 20 46 6c 75 73 68 56 69 65   WINAPI FlushVie
16d0: 77 4f 66 46 69 6c 65 28 4c 50 43 56 4f 49 44 2c  wOfFile(LPCVOID,
16e0: 20 53 49 5a 45 5f 54 29 3b 0a 57 49 4e 42 41 53   SIZE_T);.WINBAS
16f0: 45 41 50 49 20 42 4f 4f 4c 20 57 49 4e 41 50 49  EAPI BOOL WINAPI
1700: 20 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65   UnmapViewOfFile
1710: 28 4c 50 43 56 4f 49 44 29 3b 0a 23 65 6e 64 69  (LPCVOID);.#endi
1720: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33  f /* SQLITE_WIN3
1730: 32 5f 46 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50  2_FILEMAPPING_AP
1740: 49 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  I */../*.** Some
1750: 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69   Microsoft compi
1760: 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64  lers lack this d
1770: 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  efinition..*/.#i
1780: 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 46 49  fndef INVALID_FI
1790: 4c 45 5f 41 54 54 52 49 42 55 54 45 53 0a 23 20  LE_ATTRIBUTES.# 
17a0: 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 46  define INVALID_F
17b0: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 28  ILE_ATTRIBUTES (
17c0: 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69  (DWORD)-1).#endi
17d0: 66 0a 0a 23 69 66 6e 64 65 66 20 46 49 4c 45 5f  f..#ifndef FILE_
17e0: 46 4c 41 47 5f 4d 41 53 4b 0a 23 20 64 65 66 69  FLAG_MASK.# defi
17f0: 6e 65 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53  ne FILE_FLAG_MAS
1800: 4b 20 20 20 20 20 20 20 20 20 20 28 30 78 46 46  K          (0xFF
1810: 33 43 30 30 30 30 29 0a 23 65 6e 64 69 66 0a 0a  3C0000).#endif..
1820: 23 69 66 6e 64 65 66 20 46 49 4c 45 5f 41 54 54  #ifndef FILE_ATT
1830: 52 49 42 55 54 45 5f 4d 41 53 4b 0a 23 20 64 65  RIBUTE_MASK.# de
1840: 66 69 6e 65 20 46 49 4c 45 5f 41 54 54 52 49 42  fine FILE_ATTRIB
1850: 55 54 45 5f 4d 41 53 4b 20 20 20 20 20 28 30 78  UTE_MASK     (0x
1860: 30 30 30 33 46 46 46 37 29 0a 23 65 6e 64 69 66  0003FFF7).#endif
1870: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1880: 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 20 46 6f 72  _OMIT_WAL./* For
1890: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20  ward references 
18a0: 74 6f 20 73 74 72 75 63 74 75 72 65 73 20 75 73  to structures us
18b0: 65 64 20 66 6f 72 20 57 41 4c 20 2a 2f 0a 74 79  ed for WAL */.ty
18c0: 70 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e  pedef struct win
18d0: 53 68 6d 20 77 69 6e 53 68 6d 3b 20 20 20 20 20  Shm winShm;     
18e0: 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6e 6e 65        /* A conne
18f0: 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d  ction to shared-
1900: 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65 64 65  memory */.typede
1910: 66 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e  f struct winShmN
1920: 6f 64 65 20 77 69 6e 53 68 6d 4e 6f 64 65 3b 20  ode winShmNode; 
1930: 20 20 2f 2a 20 41 20 72 65 67 69 6f 6e 20 6f 66    /* A region of
1940: 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a   shared-memory *
1950: 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  /.#endif../*.** 
1960: 57 69 6e 43 45 20 6c 61 63 6b 73 20 6e 61 74 69  WinCE lacks nati
1970: 76 65 20 73 75 70 70 6f 72 74 20 66 6f 72 20 66  ve support for f
1980: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 6f 20 77  ile locking so w
1990: 65 20 68 61 76 65 20 74 6f 20 66 61 6b 65 20 69  e have to fake i
19a0: 74 0a 2a 2a 20 77 69 74 68 20 73 6f 6d 65 20 63  t.** with some c
19b0: 6f 64 65 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a  ode of our own..
19c0: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
19d0: 5f 57 49 4e 43 45 0a 74 79 70 65 64 65 66 20 73  _WINCE.typedef s
19e0: 74 72 75 63 74 20 77 69 6e 63 65 4c 6f 63 6b 20  truct winceLock 
19f0: 7b 0a 20 20 69 6e 74 20 6e 52 65 61 64 65 72 73  {.  int nReaders
1a00: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
1a10: 72 20 6f 66 20 72 65 61 64 65 72 20 6c 6f 63 6b  r of reader lock
1a20: 73 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20  s obtained */.  
1a30: 42 4f 4f 4c 20 62 50 65 6e 64 69 6e 67 3b 20 20  BOOL bPending;  
1a40: 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65 73      /* Indicates
1a50: 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20   a pending lock 
1a60: 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  has been obtaine
1a70: 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52 65 73  d */.  BOOL bRes
1a80: 65 72 76 65 64 3b 20 20 20 20 20 2f 2a 20 49 6e  erved;     /* In
1a90: 64 69 63 61 74 65 73 20 61 20 72 65 73 65 72 76  dicates a reserv
1aa0: 65 64 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  ed lock has been
1ab0: 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42   obtained */.  B
1ac0: 4f 4f 4c 20 62 45 78 63 6c 75 73 69 76 65 3b 20  OOL bExclusive; 
1ad0: 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65 73 20     /* Indicates 
1ae0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
1af0: 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69  k has been obtai
1b00: 6e 65 64 20 2a 2f 0a 7d 20 77 69 6e 63 65 4c 6f  ned */.} winceLo
1b10: 63 6b 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ck;.#endif../*.*
1b20: 2a 20 54 68 65 20 77 69 6e 46 69 6c 65 20 73 74  * The winFile st
1b30: 72 75 63 74 75 72 65 20 69 73 20 61 20 73 75 62  ructure is a sub
1b40: 63 6c 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33  class of sqlite3
1b50: 5f 66 69 6c 65 2a 20 73 70 65 63 69 66 69 63 20  _file* specific 
1b60: 74 6f 20 74 68 65 20 77 69 6e 33 32 0a 2a 2a 20  to the win32.** 
1b70: 70 6f 72 74 61 62 69 6c 69 74 79 20 6c 61 79 65  portability laye
1b80: 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  r..*/.typedef st
1b90: 72 75 63 74 20 77 69 6e 46 69 6c 65 20 77 69 6e  ruct winFile win
1ba0: 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 77 69 6e  File;.struct win
1bb0: 46 69 6c 65 20 7b 0a 20 20 63 6f 6e 73 74 20 73  File {.  const s
1bc0: 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1bd0: 73 20 2a 70 4d 65 74 68 6f 64 3b 20 2f 2a 2a 2a  s *pMethod; /***
1be0: 20 4d 75 73 74 20 62 65 20 66 69 72 73 74 20 2a   Must be first *
1bf0: 2a 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  **/.  sqlite3_vf
1c00: 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 2f 2a  s *pVfs;      /*
1c10: 20 54 68 65 20 56 46 53 20 75 73 65 64 20 74 6f   The VFS used to
1c20: 20 6f 70 65 6e 20 74 68 69 73 20 66 69 6c 65 20   open this file 
1c30: 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 3b 20 20  */.  HANDLE h;  
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c50: 48 61 6e 64 6c 65 20 66 6f 72 20 61 63 63 65 73  Handle for acces
1c60: 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20 2a 2f  sing the file */
1c70: 0a 20 20 75 38 20 6c 6f 63 6b 74 79 70 65 3b 20  .  u8 locktype; 
1c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
1c90: 70 65 20 6f 66 20 6c 6f 63 6b 20 63 75 72 72 65  pe of lock curre
1ca0: 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 20 74 68 69  ntly held on thi
1cb0: 73 20 66 69 6c 65 20 2a 2f 0a 20 20 73 68 6f 72  s file */.  shor
1cc0: 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  t sharedLockByte
1cd0: 3b 20 20 20 2f 2a 20 52 61 6e 64 6f 6d 6c 79 20  ;   /* Randomly 
1ce0: 63 68 6f 73 65 6e 20 62 79 74 65 20 75 73 65 64  chosen byte used
1cf0: 20 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63   as a shared loc
1d00: 6b 20 2a 2f 0a 20 20 75 38 20 63 74 72 6c 46 6c  k */.  u8 ctrlFl
1d10: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ags;           /
1d20: 2a 20 46 6c 61 67 73 2e 20 20 53 65 65 20 57 49  * Flags.  See WI
1d30: 4e 46 49 4c 45 5f 2a 20 62 65 6c 6f 77 20 2a 2f  NFILE_* below */
1d40: 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
1d50: 6e 6f 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  no;        /* Th
1d60: 65 20 57 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20  e Windows errno 
1d70: 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 49 2f  from the last I/
1d80: 4f 20 65 72 72 6f 72 20 2a 2f 0a 23 69 66 6e 64  O error */.#ifnd
1d90: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1da0: 41 4c 0a 20 20 77 69 6e 53 68 6d 20 2a 70 53 68  AL.  winShm *pSh
1db0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
1dc0: 49 6e 73 74 61 6e 63 65 20 6f 66 20 73 68 61 72  Instance of shar
1dd0: 65 64 20 6d 65 6d 6f 72 79 20 6f 6e 20 74 68 69  ed memory on thi
1de0: 73 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66  s file */.#endif
1df0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1e00: 50 61 74 68 3b 20 20 20 20 20 20 2f 2a 20 46 75  Path;      /* Fu
1e10: 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74  ll pathname of t
1e20: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  his file */.  in
1e30: 74 20 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20  t szChunk;      
1e40: 20 20 20 20 20 20 2f 2a 20 43 68 75 6e 6b 20 73        /* Chunk s
1e50: 69 7a 65 20 63 6f 6e 66 69 67 75 72 65 64 20 62  ize configured b
1e60: 79 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49  y FCNTL_CHUNK_SI
1e70: 5a 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  ZE */.#if SQLITE
1e80: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 4c 50 57 53  _OS_WINCE.  LPWS
1e90: 54 52 20 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  TR zDeleteOnClos
1ea0: 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66  e;  /* Name of f
1eb0: 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 77 68  ile to delete wh
1ec0: 65 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20 20  en closing */.  
1ed0: 48 41 4e 44 4c 45 20 68 4d 75 74 65 78 3b 20 20  HANDLE hMutex;  
1ee0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78          /* Mutex
1ef0: 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c   used to control
1f00: 20 61 63 63 65 73 73 20 74 6f 20 73 68 61 72 65   access to share
1f10: 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 48 41 4e 44  d lock */.  HAND
1f20: 4c 45 20 68 53 68 61 72 65 64 3b 20 20 20 20 20  LE hShared;     
1f30: 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65      /* Shared me
1f40: 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 75 73 65  mory segment use
1f50: 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a 2f  d for locking */
1f60: 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f 63  .  winceLock loc
1f70: 61 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  al;        /* Lo
1f80: 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20  cks obtained by 
1f90: 74 68 69 73 20 69 6e 73 74 61 6e 63 65 20 6f 66  this instance of
1fa0: 20 77 69 6e 46 69 6c 65 20 2a 2f 0a 20 20 77 69   winFile */.  wi
1fb0: 6e 63 65 4c 6f 63 6b 20 2a 73 68 61 72 65 64 3b  nceLock *shared;
1fc0: 20 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20        /* Global 
1fd0: 73 68 61 72 65 64 20 6c 6f 63 6b 20 6d 65 6d 6f  shared lock memo
1fe0: 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20  ry for the file 
1ff0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   */.#endif.#if S
2000: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
2010: 49 5a 45 3e 30 0a 20 20 69 6e 74 20 6e 46 65 74  IZE>0.  int nFet
2020: 63 68 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20  chOut;          
2030: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2040: 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78  of outstanding x
2050: 46 65 74 63 68 20 72 65 66 65 72 65 6e 63 65 73  Fetch references
2060: 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 4d 61   */.  HANDLE hMa
2070: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
2080: 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f      /* Handle fo
2090: 72 20 61 63 63 65 73 73 69 6e 67 20 6d 65 6d 6f  r accessing memo
20a0: 72 79 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20  ry mapping */.  
20b0: 76 6f 69 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e  void *pMapRegion
20c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
20d0: 20 41 72 65 61 20 6d 65 6d 6f 72 79 20 6d 61 70   Area memory map
20e0: 70 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ped */.  sqlite3
20f0: 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 3b  _int64 mmapSize;
2100: 20 20 20 20 20 20 20 2f 2a 20 55 73 61 62 6c 65         /* Usable
2110: 20 73 69 7a 65 20 6f 66 20 6d 61 70 70 65 64 20   size of mapped 
2120: 72 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  region */.  sqli
2130: 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69  te3_int64 mmapSi
2140: 7a 65 41 63 74 75 61 6c 3b 20 2f 2a 20 41 63 74  zeActual; /* Act
2150: 75 61 6c 20 73 69 7a 65 20 6f 66 20 6d 61 70 70  ual size of mapp
2160: 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20 73  ed region */.  s
2170: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61  qlite3_int64 mma
2180: 70 53 69 7a 65 4d 61 78 3b 20 20 20 20 2f 2a 20  pSizeMax;    /* 
2190: 43 6f 6e 66 69 67 75 72 65 64 20 46 43 4e 54 4c  Configured FCNTL
21a0: 5f 4d 4d 41 50 5f 53 49 5a 45 20 76 61 6c 75 65  _MMAP_SIZE value
21b0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
21c0: 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c  *.** Allowed val
21d0: 75 65 73 20 66 6f 72 20 77 69 6e 46 69 6c 65 2e  ues for winFile.
21e0: 63 74 72 6c 46 6c 61 67 73 0a 2a 2f 0a 23 64 65  ctrlFlags.*/.#de
21f0: 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f 52 44 4f  fine WINFILE_RDO
2200: 4e 4c 59 20 20 20 20 20 20 20 20 20 20 30 78 30  NLY          0x0
2210: 32 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f  2   /* Connectio
2220: 6e 20 69 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a  n is read only *
2230: 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49 4c  /.#define WINFIL
2240: 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 20 20  E_PERSIST_WAL   
2250: 20 20 30 78 30 34 20 20 20 2f 2a 20 50 65 72 73    0x04   /* Pers
2260: 69 73 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20  istent WAL mode 
2270: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49  */.#define WINFI
2280: 4c 45 5f 50 53 4f 57 20 20 20 20 20 20 20 20 20  LE_PSOW         
2290: 20 20 20 30 78 31 30 20 20 20 2f 2a 20 53 51 4c     0x10   /* SQL
22a0: 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
22b0: 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 2a 2f  AFE_OVERWRITE */
22c0: 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 73 69 7a 65  ../*. * The size
22d0: 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 75   of the buffer u
22e0: 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 77  sed by sqlite3_w
22f0: 69 6e 33 32 5f 77 72 69 74 65 5f 64 65 62 75 67  in32_write_debug
2300: 28 29 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ().. */.#ifndef 
2310: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47  SQLITE_WIN32_DBG
2320: 5f 42 55 46 5f 53 49 5a 45 0a 23 20 20 64 65 66  _BUF_SIZE.#  def
2330: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
2340: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 20 20  _DBG_BUF_SIZE   
2350: 28 28 69 6e 74 29 28 34 30 39 36 2d 73 69 7a 65  ((int)(4096-size
2360: 6f 66 28 44 57 4f 52 44 29 29 29 0a 23 65 6e 64  of(DWORD))).#end
2370: 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 76 61  if../*. * The va
2380: 6c 75 65 20 75 73 65 64 20 77 69 74 68 20 73 71  lue used with sq
2390: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
23a0: 64 69 72 65 63 74 6f 72 79 28 29 20 74 6f 20 73  directory() to s
23b0: 70 65 63 69 66 79 20 74 68 61 74 0a 20 2a 20 74  pecify that. * t
23c0: 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72  he data director
23d0: 79 20 73 68 6f 75 6c 64 20 62 65 20 63 68 61 6e  y should be chan
23e0: 67 65 64 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ged.. */.#ifndef
23f0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41   SQLITE_WIN32_DA
2400: 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50  TA_DIRECTORY_TYP
2410: 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  E.#  define SQLI
2420: 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49  TE_WIN32_DATA_DI
2430: 52 45 43 54 4f 52 59 5f 54 59 50 45 20 28 31 29  RECTORY_TYPE (1)
2440: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54  .#endif../*. * T
2450: 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 77 69  he value used wi
2460: 74 68 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  th sqlite3_win32
2470: 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 29  _set_directory()
2480: 20 74 6f 20 73 70 65 63 69 66 79 20 74 68 61 74   to specify that
2490: 0a 20 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72  . * the temporar
24a0: 79 20 64 69 72 65 63 74 6f 72 79 20 73 68 6f 75  y directory shou
24b0: 6c 64 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20  ld be changed.. 
24c0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
24d0: 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52  E_WIN32_TEMP_DIR
24e0: 45 43 54 4f 52 59 5f 54 59 50 45 0a 23 20 20 64  ECTORY_TYPE.#  d
24f0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
2500: 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52  32_TEMP_DIRECTOR
2510: 59 5f 54 59 50 45 20 28 32 29 0a 23 65 6e 64 69  Y_TYPE (2).#endi
2520: 66 0a 0a 2f 2a 0a 20 2a 20 49 66 20 63 6f 6d 70  f../*. * If comp
2530: 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54 45  iled with SQLITE
2540: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 6f 6e  _WIN32_MALLOC on
2550: 20 57 69 6e 64 6f 77 73 2c 20 77 65 20 77 69 6c   Windows, we wil
2560: 6c 20 75 73 65 20 74 68 65 0a 20 2a 20 76 61 72  l use the. * var
2570: 69 6f 75 73 20 57 69 6e 33 32 20 41 50 49 20 68  ious Win32 API h
2580: 65 61 70 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e  eap functions in
2590: 73 74 65 61 64 20 6f 66 20 6f 75 72 20 6f 77 6e  stead of our own
25a0: 2e 0a 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .. */.#ifdef SQL
25b0: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
25c0: 0a 0a 2f 2a 0a 20 2a 20 49 66 20 74 68 69 73 20  ../*. * If this 
25d0: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 6e 20  is non-zero, an 
25e0: 69 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77 69  isolated heap wi
25f0: 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 62 79  ll be created by
2600: 20 74 68 65 20 6e 61 74 69 76 65 20 57 69 6e 33   the native Win3
2610: 32 0a 20 2a 20 61 6c 6c 6f 63 61 74 6f 72 20 73  2. * allocator s
2620: 75 62 73 79 73 74 65 6d 3b 20 6f 74 68 65 72 77  ubsystem; otherw
2630: 69 73 65 2c 20 74 68 65 20 64 65 66 61 75 6c 74  ise, the default
2640: 20 70 72 6f 63 65 73 73 20 68 65 61 70 20 77 69   process heap wi
2650: 6c 6c 20 62 65 20 75 73 65 64 2e 20 20 54 68 69  ll be used.  Thi
2660: 73 0a 20 2a 20 73 65 74 74 69 6e 67 20 68 61 73  s. * setting has
2670: 20 6e 6f 20 65 66 66 65 63 74 20 77 68 65 6e 20   no effect when 
2680: 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 57 69  compiling for Wi
2690: 6e 52 54 2e 20 20 42 79 20 64 65 66 61 75 6c 74  nRT.  By default
26a0: 2c 20 74 68 69 73 20 69 73 20 65 6e 61 62 6c 65  , this is enable
26b0: 64 0a 20 2a 20 61 6e 64 20 61 6e 20 69 73 6f 6c  d. * and an isol
26c0: 61 74 65 64 20 68 65 61 70 20 77 69 6c 6c 20 62  ated heap will b
26d0: 65 20 63 72 65 61 74 65 64 20 74 6f 20 73 74 6f  e created to sto
26e0: 72 65 20 61 6c 6c 20 61 6c 6c 6f 63 61 74 65 64  re all allocated
26f0: 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 2a 2a 2a 2a   data.. *. *****
2700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 20 57 41 52  *********. * WAR
2750: 4e 49 4e 47 3a 20 49 74 20 69 73 20 69 6d 70 6f  NING: It is impo
2760: 72 74 61 6e 74 20 74 6f 20 6e 6f 74 65 20 74 68  rtant to note th
2770: 61 74 20 77 68 65 6e 20 74 68 69 73 20 73 65 74  at when this set
2780: 74 69 6e 67 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  ting is non-zero
2790: 20 61 6e 64 20 74 68 65 0a 20 2a 20 20 20 20 20   and the. *     
27a0: 20 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64       winMemShutd
27b0: 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  own function is 
27c0: 63 61 6c 6c 65 64 20 28 65 2e 67 2e 20 62 79 20  called (e.g. by 
27d0: 74 68 65 20 73 71 6c 69 74 65 33 5f 73 68 75 74  the sqlite3_shut
27e0: 64 6f 77 6e 0a 20 2a 20 20 20 20 20 20 20 20 20  down. *         
27f0: 20 66 75 6e 63 74 69 6f 6e 29 2c 20 61 6c 6c 20   function), all 
2800: 64 61 74 61 20 74 68 61 74 20 77 61 73 20 61 6c  data that was al
2810: 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 74 68  located using th
2820: 65 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70 20  e isolated heap 
2830: 77 69 6c 6c 0a 20 2a 20 20 20 20 20 20 20 20 20  will. *         
2840: 20 62 65 20 66 72 65 65 64 20 69 6d 6d 65 64 69   be freed immedi
2850: 61 74 65 6c 79 20 61 6e 64 20 61 6e 79 20 61 74  ately and any at
2860: 74 65 6d 70 74 20 74 6f 20 61 63 63 65 73 73 20  tempt to access 
2870: 61 6e 79 20 6f 66 20 74 68 61 74 20 66 72 65 65  any of that free
2880: 64 0a 20 2a 20 20 20 20 20 20 20 20 20 20 64 61  d. *          da
2890: 74 61 20 77 69 6c 6c 20 61 6c 6d 6f 73 74 20 63  ta will almost c
28a0: 65 72 74 61 69 6e 6c 79 20 72 65 73 75 6c 74 20  ertainly result 
28b0: 69 6e 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  in an immediate 
28c0: 61 63 63 65 73 73 20 76 69 6f 6c 61 74 69 6f 6e  access violation
28d0: 2e 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .. *************
28e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2920: 2a 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  *. */.#ifndef SQ
2930: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
2940: 43 52 45 41 54 45 0a 23 20 20 64 65 66 69 6e 65  CREATE.#  define
2950: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
2960: 41 50 5f 43 52 45 41 54 45 20 20 20 20 28 54 52  AP_CREATE    (TR
2970: 55 45 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20  UE).#endif../*. 
2980: 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 73 69  * The initial si
2990: 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32 2d  ze of the Win32-
29a0: 73 70 65 63 69 66 69 63 20 68 65 61 70 2e 20 20  specific heap.  
29b0: 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62  This value may b
29c0: 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e  e zero.. */.#ifn
29d0: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
29e0: 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 0a  _HEAP_INIT_SIZE.
29f0: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
2a00: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54  _WIN32_HEAP_INIT
2a10: 5f 53 49 5a 45 20 28 28 53 51 4c 49 54 45 5f 44  _SIZE ((SQLITE_D
2a20: 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a  EFAULT_CACHE_SIZ
2a30: 45 29 20 2a 20 5c 0a 20 20 20 20 20 20 20 20 20  E) * \.         
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
2a60: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
2a70: 47 45 5f 53 49 5a 45 29 20 2b 20 34 31 39 34 33  GE_SIZE) + 41943
2a80: 30 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20  04).#endif../*. 
2a90: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 69  * The maximum si
2aa0: 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32 2d  ze of the Win32-
2ab0: 73 70 65 63 69 66 69 63 20 68 65 61 70 2e 20 20  specific heap.  
2ac0: 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62  This value may b
2ad0: 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e  e zero.. */.#ifn
2ae0: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
2af0: 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 0a 23  _HEAP_MAX_SIZE.#
2b00: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
2b10: 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53  WIN32_HEAP_MAX_S
2b20: 49 5a 45 20 20 28 30 29 0a 23 65 6e 64 69 66 0a  IZE  (0).#endif.
2b30: 0a 2f 2a 0a 20 2a 20 54 68 65 20 65 78 74 72 61  ./*. * The extra
2b40: 20 66 6c 61 67 73 20 74 6f 20 75 73 65 20 69 6e   flags to use in
2b50: 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 20 57 69   calls to the Wi
2b60: 6e 33 32 20 68 65 61 70 20 41 50 49 73 2e 20 20  n32 heap APIs.  
2b70: 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62  This value may b
2b80: 65 0a 20 2a 20 7a 65 72 6f 20 66 6f 72 20 74 68  e. * zero for th
2b90: 65 20 64 65 66 61 75 6c 74 20 62 65 68 61 76 69  e default behavi
2ba0: 6f 72 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  or.. */.#ifndef 
2bb0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
2bc0: 50 5f 46 4c 41 47 53 0a 23 20 20 64 65 66 69 6e  P_FLAGS.#  defin
2bd0: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  e SQLITE_WIN32_H
2be0: 45 41 50 5f 46 4c 41 47 53 20 20 20 20 20 28 30  EAP_FLAGS     (0
2bf0: 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  ).#endif.../*.**
2c00: 20 54 68 65 20 77 69 6e 4d 65 6d 44 61 74 61 20   The winMemData 
2c10: 73 74 72 75 63 74 75 72 65 20 73 74 6f 72 65 73  structure stores
2c20: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 72 65 71   information req
2c30: 75 69 72 65 64 20 62 79 20 74 68 65 20 57 69 6e  uired by the Win
2c40: 33 32 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 73  32-specific.** s
2c50: 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f  qlite3_mem_metho
2c60: 64 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ds implementatio
2c70: 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  n..*/.typedef st
2c80: 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20  ruct winMemData 
2c90: 77 69 6e 4d 65 6d 44 61 74 61 3b 0a 73 74 72 75  winMemData;.stru
2ca0: 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 7b 0a  ct winMemData {.
2cb0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
2cc0: 20 75 33 32 20 6d 61 67 69 63 31 3b 20 20 20 2f   u32 magic1;   /
2cd0: 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20 74  * Magic number t
2ce0: 6f 20 64 65 74 65 63 74 20 73 74 72 75 63 74 75  o detect structu
2cf0: 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 2a  re corruption. *
2d00: 2f 0a 23 65 6e 64 69 66 0a 20 20 48 41 4e 44 4c  /.#endif.  HANDL
2d10: 45 20 68 48 65 61 70 3b 20 2f 2a 20 54 68 65 20  E hHeap; /* The 
2d20: 68 61 6e 64 6c 65 20 74 6f 20 6f 75 72 20 68 65  handle to our he
2d30: 61 70 2e 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 4f  ap. */.  BOOL bO
2d40: 77 6e 65 64 3b 20 20 2f 2a 20 44 6f 20 77 65 20  wned;  /* Do we 
2d50: 6f 77 6e 20 74 68 65 20 68 65 61 70 20 28 69 2e  own the heap (i.
2d60: 65 2e 20 64 65 73 74 72 6f 79 20 69 74 20 6f 6e  e. destroy it on
2d70: 20 73 68 75 74 64 6f 77 6e 29 3f 20 2a 2f 0a 23   shutdown)? */.#
2d80: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
2d90: 75 33 32 20 6d 61 67 69 63 32 3b 20 20 20 2f 2a  u32 magic2;   /*
2da0: 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20 74 6f   Magic number to
2db0: 20 64 65 74 65 63 74 20 73 74 72 75 63 74 75 72   detect structur
2dc0: 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 2a 2f  e corruption. */
2dd0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 23 69 66 6e  .#endif.};..#ifn
2de0: 64 65 66 20 4e 44 45 42 55 47 0a 23 64 65 66 69  def NDEBUG.#defi
2df0: 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31  ne WINMEM_MAGIC1
2e00: 20 20 20 20 20 30 78 34 32 62 32 38 33 30 62 0a       0x42b2830b.
2e10: 23 64 65 66 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d  #define WINMEM_M
2e20: 41 47 49 43 32 20 20 20 20 20 30 78 62 64 34 64  AGIC2     0xbd4d
2e30: 37 63 66 34 0a 23 65 6e 64 69 66 0a 0a 73 74 61  7cf4.#endif..sta
2e40: 74 69 63 20 73 74 72 75 63 74 20 77 69 6e 4d 65  tic struct winMe
2e50: 6d 44 61 74 61 20 77 69 6e 5f 6d 65 6d 5f 64 61  mData win_mem_da
2e60: 74 61 20 3d 20 7b 0a 23 69 66 6e 64 65 66 20 4e  ta = {.#ifndef N
2e70: 44 45 42 55 47 0a 20 20 57 49 4e 4d 45 4d 5f 4d  DEBUG.  WINMEM_M
2e80: 41 47 49 43 31 2c 0a 23 65 6e 64 69 66 0a 20 20  AGIC1,.#endif.  
2e90: 4e 55 4c 4c 2c 20 46 41 4c 53 45 0a 23 69 66 6e  NULL, FALSE.#ifn
2ea0: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2c 57 49  def NDEBUG.  ,WI
2eb0: 4e 4d 45 4d 5f 4d 41 47 49 43 32 0a 23 65 6e 64  NMEM_MAGIC2.#end
2ec0: 69 66 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 4e  if.};..#ifndef N
2ed0: 44 45 42 55 47 0a 23 64 65 66 69 6e 65 20 77 69  DEBUG.#define wi
2ee0: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 31  nMemAssertMagic1
2ef0: 28 29 20 61 73 73 65 72 74 28 20 77 69 6e 5f 6d  () assert( win_m
2f00: 65 6d 5f 64 61 74 61 2e 6d 61 67 69 63 31 3d 3d  em_data.magic1==
2f10: 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20 29 0a  WINMEM_MAGIC1 ).
2f20: 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73  #define winMemAs
2f30: 73 65 72 74 4d 61 67 69 63 32 28 29 20 61 73 73  sertMagic2() ass
2f40: 65 72 74 28 20 77 69 6e 5f 6d 65 6d 5f 64 61 74  ert( win_mem_dat
2f50: 61 2e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d 45 4d  a.magic2==WINMEM
2f60: 5f 4d 41 47 49 43 32 20 29 0a 23 64 65 66 69 6e  _MAGIC2 ).#defin
2f70: 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61  e winMemAssertMa
2f80: 67 69 63 28 29 20 20 77 69 6e 4d 65 6d 41 73 73  gic()  winMemAss
2f90: 65 72 74 4d 61 67 69 63 31 28 29 3b 20 77 69 6e  ertMagic1(); win
2fa0: 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 32 28  MemAssertMagic2(
2fb0: 29 3b 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  );.#else.#define
2fc0: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
2fd0: 69 63 28 29 0a 23 65 6e 64 69 66 0a 0a 23 64 65  ic().#endif..#de
2fe0: 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74 44 61  fine winMemGetDa
2ff0: 74 61 50 74 72 28 29 20 20 26 77 69 6e 5f 6d 65  taPtr()  &win_me
3000: 6d 5f 64 61 74 61 0a 23 64 65 66 69 6e 65 20 77  m_data.#define w
3010: 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 20 20  inMemGetHeap()  
3020: 20 20 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e     win_mem_data.
3030: 68 48 65 61 70 0a 23 64 65 66 69 6e 65 20 77 69  hHeap.#define wi
3040: 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20 20  nMemGetOwned()  
3050: 20 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 62    win_mem_data.b
3060: 4f 77 6e 65 64 0a 0a 73 74 61 74 69 63 20 76 6f  Owned..static vo
3070: 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63  id *winMemMalloc
3080: 28 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73 74  (int nBytes);.st
3090: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d  atic void winMem
30a0: 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69 6f  Free(void *pPrio
30b0: 72 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  r);.static void 
30c0: 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28 76  *winMemRealloc(v
30d0: 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74  oid *pPrior, int
30e0: 20 6e 42 79 74 65 73 29 3b 0a 73 74 61 74 69 63   nBytes);.static
30f0: 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65 28   int winMemSize(
3100: 76 6f 69 64 20 2a 70 29 3b 0a 73 74 61 74 69 63  void *p);.static
3110: 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e 64   int winMemRound
3120: 75 70 28 69 6e 74 20 6e 29 3b 0a 73 74 61 74 69  up(int n);.stati
3130: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69 74  c int winMemInit
3140: 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29  (void *pAppData)
3150: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  ;.static void wi
3160: 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69  nMemShutdown(voi
3170: 64 20 2a 70 41 70 70 44 61 74 61 29 3b 0a 0a 63  d *pAppData);..c
3180: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d  onst sqlite3_mem
3190: 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74 65  _methods *sqlite
31a0: 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f 69  3MemGetWin32(voi
31b0: 64 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  d);.#endif /* SQ
31c0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
31d0: 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  C */../*.** The 
31e0: 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
31f0: 6c 65 20 69 73 20 28 6e 6f 72 6d 61 6c 6c 79 29  le is (normally)
3200: 20 73 65 74 20 6f 6e 63 65 20 61 6e 64 20 6e 65   set once and ne
3210: 76 65 72 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74  ver changes.** t
3220: 68 65 72 65 61 66 74 65 72 2e 20 20 49 74 20 72  hereafter.  It r
3230: 65 63 6f 72 64 73 20 77 68 65 74 68 65 72 20 74  ecords whether t
3240: 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
3250: 74 65 6d 20 69 73 20 57 69 6e 39 78 0a 2a 2a 20  tem is Win9x.** 
3260: 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20  or WinNT..**.** 
3270: 30 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73  0:   Operating s
3280: 79 73 74 65 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a  ystem unknown..*
3290: 2a 20 31 3a 20 20 20 4f 70 65 72 61 74 69 6e 67  * 1:   Operating
32a0: 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39 78   system is Win9x
32b0: 2e 0a 2a 2a 20 32 3a 20 20 20 4f 70 65 72 61 74  ..** 2:   Operat
32c0: 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57 69  ing system is Wi
32d0: 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72  nNT..**.** In or
32e0: 64 65 72 20 74 6f 20 66 61 63 69 6c 69 74 61 74  der to facilitat
32f0: 65 20 74 65 73 74 69 6e 67 20 6f 6e 20 61 20 57  e testing on a W
3300: 69 6e 4e 54 20 73 79 73 74 65 6d 2c 20 74 68 65  inNT system, the
3310: 20 74 65 73 74 20 66 69 78 74 75 72 65 0a 2a 2a   test fixture.**
3320: 20 63 61 6e 20 6d 61 6e 75 61 6c 6c 79 20 73 65   can manually se
3330: 74 20 74 68 69 73 20 76 61 6c 75 65 20 74 6f 20  t this value to 
3340: 31 20 74 6f 20 65 6d 75 6c 61 74 65 20 57 69 6e  1 to emulate Win
3350: 39 38 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a  98 behavior..*/.
3360: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
3370: 53 54 0a 4c 4f 4e 47 20 53 51 4c 49 54 45 5f 57  ST.LONG SQLITE_W
3380: 49 4e 33 32 5f 56 4f 4c 41 54 49 4c 45 20 73 71  IN32_VOLATILE sq
3390: 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20  lite3_os_type = 
33a0: 30 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20  0;.#else.static 
33b0: 4c 4f 4e 47 20 53 51 4c 49 54 45 5f 57 49 4e 33  LONG SQLITE_WIN3
33c0: 32 5f 56 4f 4c 41 54 49 4c 45 20 73 71 6c 69 74  2_VOLATILE sqlit
33d0: 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a  e3_os_type = 0;.
33e0: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
33f0: 53 59 53 43 41 4c 4c 0a 23 20 20 64 65 66 69 6e  SYSCALL.#  defin
3400: 65 20 53 59 53 43 41 4c 4c 20 73 71 6c 69 74 65  e SYSCALL sqlite
3410: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 0a 23 65  3_syscall_ptr.#e
3420: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
3430: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74   function is not
3440: 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 57 69   available on Wi
3450: 6e 64 6f 77 73 20 43 45 20 6f 72 20 57 69 6e 52  ndows CE or WinR
3460: 54 2e 0a 20 2a 2f 0a 0a 23 69 66 20 53 51 4c 49  T.. */..#if SQLI
3470: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53  TE_OS_WINCE || S
3480: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 23  QLITE_OS_WINRT.#
3490: 20 20 64 65 66 69 6e 65 20 6f 73 41 72 65 46 69    define osAreFi
34a0: 6c 65 41 70 69 73 41 4e 53 49 28 29 20 20 20 20  leApisANSI()    
34b0: 20 20 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a     1.#endif../*.
34c0: 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63  ** Many system c
34d0: 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73 65  alls are accesse
34e0: 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65  d through pointe
34f0: 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73  r-to-functions s
3500: 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d  o that.** they m
3510: 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e  ay be overridden
3520: 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66   at runtime to f
3530: 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20  acilitate fault 
3540: 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67  injection during
3550: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
3560: 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65  sandboxing.  The
3570: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79   following array
3580: 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73   holds the names
3590: 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a   and pointers.**
35a0: 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65   to all override
35b0: 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c  able system call
35c0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  s..*/.static str
35d0: 75 63 74 20 77 69 6e 5f 73 79 73 63 61 6c 6c 20  uct win_syscall 
35e0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
35f0: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
3600: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
3610: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a   system call */.
3620: 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c    sqlite3_syscal
3630: 6c 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b 20  l_ptr pCurrent; 
3640: 2f 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75 65  /* Current value
3650: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63   of the system c
3660: 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  all */.  sqlite3
3670: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44 65  _syscall_ptr pDe
3680: 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c  fault; /* Defaul
3690: 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79  t value */.} aSy
36a0: 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 23 69 66 20  scall[] = {.#if 
36b0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
36c0: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
36d0: 49 4e 52 54 0a 20 20 7b 20 22 41 72 65 46 69 6c  INRT.  { "AreFil
36e0: 65 41 70 69 73 41 4e 53 49 22 2c 20 20 20 20 20  eApisANSI",     
36f0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 41 72 65      (SYSCALL)Are
3700: 46 69 6c 65 41 70 69 73 41 4e 53 49 2c 20 20 20  FileApisANSI,   
3710: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
3720: 0a 20 20 7b 20 22 41 72 65 46 69 6c 65 41 70 69  .  { "AreFileApi
3730: 73 41 4e 53 49 22 2c 20 20 20 20 20 20 20 20 20  sANSI",         
3740: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
3750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3760: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
3770: 69 66 6e 64 65 66 20 6f 73 41 72 65 46 69 6c 65  ifndef osAreFile
3780: 41 70 69 73 41 4e 53 49 0a 23 64 65 66 69 6e 65  ApisANSI.#define
3790: 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e   osAreFileApisAN
37a0: 53 49 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  SI ((BOOL(WINAPI
37b0: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c  *)(VOID))aSyscal
37c0: 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23  l[0].pCurrent).#
37d0: 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
37e0: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65  E_OS_WINCE && de
37f0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
3800: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
3810: 20 22 43 68 61 72 4c 6f 77 65 72 57 22 2c 20 20   "CharLowerW",  
3820: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3830: 43 41 4c 4c 29 43 68 61 72 4c 6f 77 65 72 57 2c  CALL)CharLowerW,
3840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3850: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 68  },.#else.  { "Ch
3860: 61 72 4c 6f 77 65 72 57 22 2c 20 20 20 20 20 20  arLowerW",      
3870: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3880: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
3890: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
38a0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
38b0: 73 43 68 61 72 4c 6f 77 65 72 57 20 28 28 4c 50  sCharLowerW ((LP
38c0: 57 53 54 52 28 57 49 4e 41 50 49 2a 29 28 4c 50  WSTR(WINAPI*)(LP
38d0: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 31  WSTR))aSyscall[1
38e0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
38f0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
3900: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
3910: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
3920: 45 29 0a 20 20 7b 20 22 43 68 61 72 55 70 70 65  E).  { "CharUppe
3930: 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  rW",            
3940: 20 20 28 53 59 53 43 41 4c 4c 29 43 68 61 72 55    (SYSCALL)CharU
3950: 70 70 65 72 57 2c 20 20 20 20 20 20 20 20 20 20  pperW,          
3960: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3970: 20 7b 20 22 43 68 61 72 55 70 70 65 72 57 22 2c   { "CharUpperW",
3980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
3990: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39b0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
39c0: 66 69 6e 65 20 6f 73 43 68 61 72 55 70 70 65 72  fine osCharUpper
39d0: 57 20 28 28 4c 50 57 53 54 52 28 57 49 4e 41 50  W ((LPWSTR(WINAP
39e0: 49 2a 29 28 4c 50 57 53 54 52 29 29 61 53 79 73  I*)(LPWSTR))aSys
39f0: 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74  call[2].pCurrent
3a00: 29 0a 0a 20 20 7b 20 22 43 6c 6f 73 65 48 61 6e  )..  { "CloseHan
3a10: 64 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  dle",           
3a20: 20 20 28 53 59 53 43 41 4c 4c 29 43 6c 6f 73 65    (SYSCALL)Close
3a30: 48 61 6e 64 6c 65 2c 20 20 20 20 20 20 20 20 20  Handle,         
3a40: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
3a50: 65 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 20  e osCloseHandle 
3a60: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
3a70: 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c  HANDLE))aSyscall
3a80: 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [3].pCurrent)..#
3a90: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
3aa0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
3ab0: 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  ).  { "CreateFil
3ac0: 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eA",            
3ad0: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
3ae0: 46 69 6c 65 41 2c 20 20 20 20 20 20 20 20 20 20  FileA,          
3af0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
3b00: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 41 22 2c  { "CreateFileA",
3b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
3b20: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
3b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
3b40: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
3b50: 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65  ine osCreateFile
3b60: 41 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  A ((HANDLE(WINAP
3b70: 49 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52 44  I*)(LPCSTR,DWORD
3b80: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
3b90: 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54    LPSECURITY_ATT
3ba0: 52 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44 57  RIBUTES,DWORD,DW
3bb0: 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79 73  ORD,HANDLE))aSys
3bc0: 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74  call[4].pCurrent
3bd0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
3be0: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
3bf0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
3c00: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43  HAS_WIDE).  { "C
3c10: 72 65 61 74 65 46 69 6c 65 57 22 2c 20 20 20 20  reateFileW",    
3c20: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3c30: 4c 29 43 72 65 61 74 65 46 69 6c 65 57 2c 20 20  L)CreateFileW,  
3c40: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3c50: 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74  #else.  { "Creat
3c60: 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20  eFileW",        
3c70: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c90: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3ca0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72  if..#define osCr
3cb0: 65 61 74 65 46 69 6c 65 57 20 28 28 48 41 4e 44  eateFileW ((HAND
3cc0: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  LE(WINAPI*)(LPCW
3cd0: 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  STR,DWORD,DWORD,
3ce0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43   \.        LPSEC
3cf0: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
3d00: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41 4e  ,DWORD,DWORD,HAN
3d10: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d  DLE))aSyscall[5]
3d20: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3d30: 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  (!SQLITE_OS_WINR
3d40: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
3d50: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
3d60: 53 49 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20  SI) && \.       
3d70: 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54   (!defined(SQLIT
3d80: 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53  E_OMIT_WAL) || S
3d90: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
3da0: 49 5a 45 3e 30 29 29 0a 20 20 7b 20 22 43 72 65  IZE>0)).  { "Cre
3db0: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 22  ateFileMappingA"
3dc0: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
3dd0: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
3de0: 67 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  gA,      0 },.#e
3df0: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46  lse.  { "CreateF
3e00: 69 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20 20 20  ileMappingA",   
3e10: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
3e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e30: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3e40: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
3e50: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 20 28  teFileMappingA (
3e60: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
3e70: 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49  (HANDLE,LPSECURI
3e80: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c  TY_ATTRIBUTES, \
3e90: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44  .        DWORD,D
3ea0: 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43 53 54  WORD,DWORD,LPCST
3eb0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70  R))aSyscall[6].p
3ec0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
3ed0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c  LITE_OS_WINCE ||
3ee0: 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e   (!SQLITE_OS_WIN
3ef0: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
3f00: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
3f10: 49 44 45 29 20 26 26 20 5c 0a 20 20 20 20 20 20  IDE) && \.      
3f20: 20 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c 49    (!defined(SQLI
3f30: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20  TE_OMIT_WAL) || 
3f40: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
3f50: 53 49 5a 45 3e 30 29 29 0a 20 20 7b 20 22 43 72  SIZE>0)).  { "Cr
3f60: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
3f70: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
3f80: 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  )CreateFileMappi
3f90: 6e 67 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23  ngW,      0 },.#
3fa0: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
3fb0: 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20 20  FileMappingW",  
3fc0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
3fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fe0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3ff0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
4000: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 20  ateFileMappingW 
4010: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
4020: 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52  )(HANDLE,LPSECUR
4030: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20  ITY_ATTRIBUTES, 
4040: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c  \.        DWORD,
4050: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43 57  DWORD,DWORD,LPCW
4060: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d  STR))aSyscall[7]
4070: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4080: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
4090: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
40a0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
40b0: 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65 4d 75  E).  { "CreateMu
40c0: 74 65 78 57 22 2c 20 20 20 20 20 20 20 20 20 20  texW",          
40d0: 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74    (SYSCALL)Creat
40e0: 65 4d 75 74 65 78 57 2c 20 20 20 20 20 20 20 20  eMutexW,        
40f0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4100: 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65 78 57   { "CreateMutexW
4110: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
4120: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4140: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4150: 66 69 6e 65 20 6f 73 43 72 65 61 74 65 4d 75 74  fine osCreateMut
4160: 65 78 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  exW ((HANDLE(WIN
4170: 41 50 49 2a 29 28 4c 50 53 45 43 55 52 49 54 59  API*)(LPSECURITY
4180: 5f 41 54 54 52 49 42 55 54 45 53 2c 42 4f 4f 4c  _ATTRIBUTES,BOOL
4190: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 57  , \.        LPCW
41a0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d  STR))aSyscall[8]
41b0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
41c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
41d0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
41e0: 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22   { "DeleteFileA"
41f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
4200: 59 53 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c  YSCALL)DeleteFil
4210: 65 41 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  eA,             
4220: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4230: 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20 20 20  DeleteFileA",   
4240: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4250: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4260: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4270: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4280: 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 41 20 28   osDeleteFileA (
4290: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c  (BOOL(WINAPI*)(L
42a0: 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PCSTR))aSyscall[
42b0: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
42c0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
42d0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
42e0: 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65  .  { "DeleteFile
42f0: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
4300: 28 53 59 53 43 41 4c 4c 29 44 65 6c 65 74 65 46  (SYSCALL)DeleteF
4310: 69 6c 65 57 2c 20 20 20 20 20 20 20 20 20 20 20  ileW,           
4320: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4330: 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22 2c 20   "DeleteFileW", 
4340: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4350: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4370: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4380: 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57  ne osDeleteFileW
4390: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
43a0: 28 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61  (LPCWSTR))aSysca
43b0: 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74 29  ll[10].pCurrent)
43c0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
43d0: 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65 54  WINCE.  { "FileT
43e0: 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69  imeToLocalFileTi
43f0: 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 46 69  me", (SYSCALL)Fi
4400: 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c  leTimeToLocalFil
4410: 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73  eTime, 0 },.#els
4420: 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54  e.  { "FileTimeT
4430: 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c  oLocalFileTime",
4440: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4460: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4470: 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65 54 69  #define osFileTi
4480: 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d  meToLocalFileTim
4490: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
44a0: 29 28 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45  )(CONST FILETIME
44b0: 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46  *, \.        LPF
44c0: 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c  ILETIME))aSyscal
44d0: 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[11].pCurrent).
44e0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
44f0: 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65 54 69  INCE.  { "FileTi
4500: 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c  meToSystemTime",
4510: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 69 6c      (SYSCALL)Fil
4520: 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d  eTimeToSystemTim
4530: 65 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65  e,    0 },.#else
4540: 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f  .  { "FileTimeTo
4550: 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20  SystemTime",    
4560: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
4570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4580: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
4590: 64 65 66 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d  define osFileTim
45a0: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 20 28 28  eToSystemTime ((
45b0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f  BOOL(WINAPI*)(CO
45c0: 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c  NST FILETIME*, \
45d0: 0a 20 20 20 20 20 20 20 20 4c 50 53 59 53 54 45  .        LPSYSTE
45e0: 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b  MTIME))aSyscall[
45f0: 31 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  12].pCurrent).. 
4600: 20 7b 20 22 46 6c 75 73 68 46 69 6c 65 42 75 66   { "FlushFileBuf
4610: 66 65 72 73 22 2c 20 20 20 20 20 20 20 20 28 53  fers",        (S
4620: 59 53 43 41 4c 4c 29 46 6c 75 73 68 46 69 6c 65  YSCALL)FlushFile
4630: 42 75 66 66 65 72 73 2c 20 20 20 20 20 20 20 20  Buffers,        
4640: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
4650: 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73  FlushFileBuffers
4660: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
4670: 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c  (HANDLE))aSyscal
4680: 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[13].pCurrent).
4690: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
46a0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
46b0: 53 49 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d  SI).  { "FormatM
46c0: 65 73 73 61 67 65 41 22 2c 20 20 20 20 20 20 20  essageA",       
46d0: 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d     (SYSCALL)Form
46e0: 61 74 4d 65 73 73 61 67 65 41 2c 20 20 20 20 20  atMessageA,     
46f0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4700: 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61    { "FormatMessa
4710: 67 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 28  geA",          (
4720: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4740: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4750: 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65  efine osFormatMe
4760: 73 73 61 67 65 41 20 28 28 44 57 4f 52 44 28 57  ssageA ((DWORD(W
4770: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50  INAPI*)(DWORD,LP
4780: 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52  CVOID,DWORD,DWOR
4790: 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20  D,LPSTR, \.     
47a0: 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74     DWORD,va_list
47b0: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e  *))aSyscall[14].
47c0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
47d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
47e0: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
47f0: 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  { "FormatMessage
4800: 57 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  W",          (SY
4810: 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65 73 73  SCALL)FormatMess
4820: 61 67 65 57 2c 20 20 20 20 20 20 20 20 20 20 30  ageW,          0
4830: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46   },.#else.  { "F
4840: 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c 20  ormatMessageW", 
4850: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4860: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4870: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4880: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4890: 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57  osFormatMessageW
48a0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
48b0: 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49 44 2c  )(DWORD,LPCVOID,
48c0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 57 53  DWORD,DWORD,LPWS
48d0: 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  TR, \.        DW
48e0: 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61 53  ORD,va_list*))aS
48f0: 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72  yscall[15].pCurr
4900: 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e  ent)..#if !defin
4910: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ed(SQLITE_OMIT_L
4920: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20  OAD_EXTENSION). 
4930: 20 7b 20 22 46 72 65 65 4c 69 62 72 61 72 79 22   { "FreeLibrary"
4940: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
4950: 59 53 43 41 4c 4c 29 46 72 65 65 4c 69 62 72 61  YSCALL)FreeLibra
4960: 72 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ry,             
4970: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4980: 46 72 65 65 4c 69 62 72 61 72 79 22 2c 20 20 20  FreeLibrary",   
4990: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
49a0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
49b0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
49c0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
49d0: 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79 20 28   osFreeLibrary (
49e0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
49f0: 4d 4f 44 55 4c 45 29 29 61 53 79 73 63 61 6c 6c  MODULE))aSyscall
4a00: 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [16].pCurrent)..
4a10: 20 20 7b 20 22 47 65 74 43 75 72 72 65 6e 74 50    { "GetCurrentP
4a20: 72 6f 63 65 73 73 49 64 22 2c 20 20 20 20 20 28  rocessId",     (
4a30: 53 59 53 43 41 4c 4c 29 47 65 74 43 75 72 72 65  SYSCALL)GetCurre
4a40: 6e 74 50 72 6f 63 65 73 73 49 64 2c 20 20 20 20  ntProcessId,    
4a50: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
4a60: 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
4a70: 73 73 49 64 20 28 28 44 57 4f 52 44 28 57 49 4e  ssId ((DWORD(WIN
4a80: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
4a90: 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e  call[17].pCurren
4aa0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
4ab0: 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69  OS_WINCE && defi
4ac0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
4ad0: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
4ae0: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
4af0: 41 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41  A",       (SYSCA
4b00: 4c 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53 70  LL)GetDiskFreeSp
4b10: 61 63 65 41 2c 20 20 20 20 20 20 20 30 20 7d 2c  aceA,       0 },
4b20: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44  .#else.  { "GetD
4b30: 69 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20  iskFreeSpaceA", 
4b40: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4b50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4b60: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4b70: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
4b80: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41  etDiskFreeSpaceA
4b90: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
4ba0: 28 4c 50 43 53 54 52 2c 4c 50 44 57 4f 52 44 2c  (LPCSTR,LPDWORD,
4bb0: 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c  LPDWORD,LPDWORD,
4bc0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f   \.        LPDWO
4bd0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d  RD))aSyscall[18]
4be0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4bf0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
4c00: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
4c10: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
4c20: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
4c30: 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 44  _WIDE).  { "GetD
4c40: 69 73 6b 46 72 65 65 53 70 61 63 65 57 22 2c 20  iskFreeSpaceW", 
4c50: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
4c60: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57  etDiskFreeSpaceW
4c70: 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ,       0 },.#el
4c80: 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46  se.  { "GetDiskF
4c90: 72 65 65 53 70 61 63 65 57 22 2c 20 20 20 20 20  reeSpaceW",     
4ca0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cc0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4cd0: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44 69  .#define osGetDi
4ce0: 73 6b 46 72 65 65 53 70 61 63 65 57 20 28 28 42  skFreeSpaceW ((B
4cf0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
4d00: 57 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44  WSTR,LPDWORD,LPD
4d10: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a  WORD,LPDWORD, \.
4d20: 20 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29          LPDWORD)
4d30: 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43  )aSyscall[19].pC
4d40: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
4d50: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
4d60: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
4d70: 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  "GetFileAttribut
4d80: 65 73 41 22 2c 20 20 20 20 20 20 28 53 59 53 43  esA",      (SYSC
4d90: 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69  ALL)GetFileAttri
4da0: 62 75 74 65 73 41 2c 20 20 20 20 20 20 30 20 7d  butesA,      0 }
4db0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
4dc0: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 22  FileAttributesA"
4dd0: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
4de0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4df0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4e00: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
4e10: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
4e20: 73 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  sA ((DWORD(WINAP
4e30: 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73  I*)(LPCSTR))aSys
4e40: 63 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72 65 6e  call[20].pCurren
4e50: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
4e60: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
4e70: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
4e80: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
4e90: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
4ea0: 73 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  sW",      (SYSCA
4eb0: 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62  LL)GetFileAttrib
4ec0: 75 74 65 73 57 2c 20 20 20 20 20 20 30 20 7d 2c  utesW,      0 },
4ed0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
4ee0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 22 2c  ileAttributesW",
4ef0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4f00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4f10: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4f20: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
4f30: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
4f40: 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  W ((DWORD(WINAPI
4f50: 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73  *)(LPCWSTR))aSys
4f60: 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72 72 65 6e  call[21].pCurren
4f70: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
4f80: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
4f90: 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46  _WIDE).  { "GetF
4fa0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
4fb0: 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47  ",    (SYSCALL)G
4fc0: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
4fd0: 45 78 57 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ExW,    0 },.#el
4fe0: 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41  se.  { "GetFileA
4ff0: 74 74 72 69 62 75 74 65 73 45 78 57 22 2c 20 20  ttributesExW",  
5000: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5020: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5030: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69  .#define osGetFi
5040: 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 20  leAttributesExW 
5050: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
5060: 4c 50 43 57 53 54 52 2c 47 45 54 5f 46 49 4c 45  LPCWSTR,GET_FILE
5070: 45 58 5f 49 4e 46 4f 5f 4c 45 56 45 4c 53 2c 20  EX_INFO_LEVELS, 
5080: 5c 0a 20 20 20 20 20 20 20 20 4c 50 56 4f 49 44  \.        LPVOID
5090: 29 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70  ))aSyscall[22].p
50a0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
50b0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
50c0: 20 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22   { "GetFileSize"
50d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
50e0: 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 53 69  YSCALL)GetFileSi
50f0: 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
5100: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
5110: 47 65 74 46 69 6c 65 53 69 7a 65 22 2c 20 20 20  GetFileSize",   
5120: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5130: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
5140: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5150: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
5160: 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 20 28   osGetFileSize (
5170: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
5180: 48 41 4e 44 4c 45 2c 4c 50 44 57 4f 52 44 29 29  HANDLE,LPDWORD))
5190: 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75  aSyscall[23].pCu
51a0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
51b0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
51c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
51d0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
51e0: 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e   { "GetFullPathN
51f0: 61 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28 53  ameA",        (S
5200: 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61  YSCALL)GetFullPa
5210: 74 68 4e 61 6d 65 41 2c 20 20 20 20 20 20 20 20  thNameA,        
5220: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
5230: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
5240: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
5250: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
5260: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5270: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
5280: 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
5290: 6d 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41  meA ((DWORD(WINA
52a0: 50 49 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52  PI*)(LPCSTR,DWOR
52b0: 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20  D,LPSTR, \.     
52c0: 20 20 20 4c 50 53 54 52 2a 29 29 61 53 79 73 63     LPSTR*))aSysc
52d0: 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72 65 6e 74  all[24].pCurrent
52e0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
52f0: 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
5300: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
5310: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
5320: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
5330: 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  { "GetFullPathNa
5340: 6d 65 57 22 2c 20 20 20 20 20 20 20 20 28 53 59  meW",        (SY
5350: 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74  SCALL)GetFullPat
5360: 68 4e 61 6d 65 57 2c 20 20 20 20 20 20 20 20 30  hNameW,        0
5370: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
5380: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22  etFullPathNameW"
5390: 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ,        (SYSCAL
53a0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
53b0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
53c0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
53d0: 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  osGetFullPathNam
53e0: 65 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  eW ((DWORD(WINAP
53f0: 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52  I*)(LPCWSTR,DWOR
5400: 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20  D,LPWSTR, \.    
5410: 20 20 20 20 4c 50 57 53 54 52 2a 29 29 61 53 79      LPWSTR*))aSy
5420: 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72 72 65  scall[25].pCurre
5430: 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 4c 61 73  nt)..  { "GetLas
5440: 74 45 72 72 6f 72 22 2c 20 20 20 20 20 20 20 20  tError",        
5450: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
5460: 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20  LastError,      
5470: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
5480: 69 6e 65 20 6f 73 47 65 74 4c 61 73 74 45 72 72  ine osGetLastErr
5490: 6f 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  or ((DWORD(WINAP
54a0: 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61  I*)(VOID))aSysca
54b0: 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[26].pCurrent)
54c0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
54d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
54e0: 45 58 54 45 4e 53 49 4f 4e 29 0a 23 69 66 20 53  EXTENSION).#if S
54f0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
5500: 20 2f 2a 20 54 68 65 20 47 65 74 50 72 6f 63 41   /* The GetProcA
5510: 64 64 72 65 73 73 41 28 29 20 72 6f 75 74 69 6e  ddressA() routin
5520: 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  e is only availa
5530: 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43  ble on Windows C
5540: 45 2e 20 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72  E. */.  { "GetPr
5550: 6f 63 41 64 64 72 65 73 73 41 22 2c 20 20 20 20  ocAddressA",    
5560: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
5570: 74 50 72 6f 63 41 64 64 72 65 73 73 41 2c 20 20  tProcAddressA,  
5580: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
5590: 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72  e.  /* All other
55a0: 20 57 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72   Windows platfor
55b0: 6d 73 20 65 78 70 65 63 74 20 47 65 74 50 72 6f  ms expect GetPro
55c0: 63 41 64 64 72 65 73 73 28 29 20 74 6f 20 74 61  cAddress() to ta
55d0: 6b 65 0a 20 20 2a 2a 20 61 6e 20 41 4e 53 49 20  ke.  ** an ANSI 
55e0: 73 74 72 69 6e 67 20 72 65 67 61 72 64 6c 65 73  string regardles
55f0: 73 20 6f 66 20 74 68 65 20 5f 55 4e 49 43 4f 44  s of the _UNICOD
5600: 45 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 7b  E setting */.  {
5610: 20 22 47 65 74 50 72 6f 63 41 64 64 72 65 73 73   "GetProcAddress
5620: 41 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53  A",         (SYS
5630: 43 41 4c 4c 29 47 65 74 50 72 6f 63 41 64 64 72  CALL)GetProcAddr
5640: 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 30 20  ess,          0 
5650: 7d 2c 0a 23 65 6e 64 69 66 0a 23 65 6c 73 65 0a  },.#endif.#else.
5660: 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72    { "GetProcAddr
5670: 65 73 73 41 22 2c 20 20 20 20 20 20 20 20 20 28  essA",         (
5680: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
5690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56a0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
56b0: 65 66 69 6e 65 20 6f 73 47 65 74 50 72 6f 63 41  efine osGetProcA
56c0: 64 64 72 65 73 73 41 20 28 28 46 41 52 50 52 4f  ddressA ((FARPRO
56d0: 43 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55  C(WINAPI*)(HMODU
56e0: 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  LE, \.        LP
56f0: 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32  CSTR))aSyscall[2
5700: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  7].pCurrent)..#i
5710: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
5720: 52 54 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65  RT.  { "GetSyste
5730: 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20  mInfo",         
5740: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79    (SYSCALL)GetSy
5750: 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 20 20  stemInfo,       
5760: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5770: 20 7b 20 22 47 65 74 53 79 73 74 65 6d 49 6e 66   { "GetSystemInf
5780: 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  o",           (S
5790: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
57a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57b0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
57c0: 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d  fine osGetSystem
57d0: 49 6e 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41  Info ((VOID(WINA
57e0: 50 49 2a 29 28 4c 50 53 59 53 54 45 4d 5f 49 4e  PI*)(LPSYSTEM_IN
57f0: 46 4f 29 29 61 53 79 73 63 61 6c 6c 5b 32 38 5d  FO))aSyscall[28]
5800: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
5810: 22 47 65 74 53 79 73 74 65 6d 54 69 6d 65 22 2c  "GetSystemTime",
5820: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
5830: 41 4c 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d  ALL)GetSystemTim
5840: 65 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  e,           0 }
5850: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  ,..#define osGet
5860: 53 79 73 74 65 6d 54 69 6d 65 20 28 28 56 4f 49  SystemTime ((VOI
5870: 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 59 53  D(WINAPI*)(LPSYS
5880: 54 45 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c  TEMTIME))aSyscal
5890: 6c 5b 32 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[29].pCurrent).
58a0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
58b0: 57 49 4e 43 45 0a 20 20 7b 20 22 47 65 74 53 79  WINCE.  { "GetSy
58c0: 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69  stemTimeAsFileTi
58d0: 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 47 65  me", (SYSCALL)Ge
58e0: 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c  tSystemTimeAsFil
58f0: 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73  eTime, 0 },.#els
5900: 65 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d  e.  { "GetSystem
5910: 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 22 2c  TimeAsFileTime",
5920: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5940: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5950: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73  #define osGetSys
5960: 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
5970: 65 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  e ((VOID(WINAPI*
5980: 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46  )( \.        LPF
5990: 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c  ILETIME))aSyscal
59a0: 6c 5b 33 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[30].pCurrent).
59b0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
59c0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
59d0: 53 49 29 0a 20 20 7b 20 22 47 65 74 54 65 6d 70  SI).  { "GetTemp
59e0: 50 61 74 68 41 22 2c 20 20 20 20 20 20 20 20 20  PathA",         
59f0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54     (SYSCALL)GetT
5a00: 65 6d 70 50 61 74 68 41 2c 20 20 20 20 20 20 20  empPathA,       
5a10: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
5a20: 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68    { "GetTempPath
5a30: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  A",            (
5a40: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
5a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a60: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
5a70: 65 66 69 6e 65 20 6f 73 47 65 74 54 65 6d 70 50  efine osGetTempP
5a80: 61 74 68 41 20 28 28 44 57 4f 52 44 28 57 49 4e  athA ((DWORD(WIN
5a90: 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 53 54  API*)(DWORD,LPST
5aa0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 33 31 5d 2e  R))aSyscall[31].
5ab0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
5ac0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
5ad0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
5ae0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
5af0: 29 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61  ).  { "GetTempPa
5b00: 74 68 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  thW",           
5b10: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d   (SYSCALL)GetTem
5b20: 70 50 61 74 68 57 2c 20 20 20 20 20 20 20 20 20  pPathW,         
5b30: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5b40: 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 57 22  { "GetTempPathW"
5b50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
5b60: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5b80: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5b90: 69 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74  ine osGetTempPat
5ba0: 68 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  hW ((DWORD(WINAP
5bb0: 49 2a 29 28 44 57 4f 52 44 2c 4c 50 57 53 54 52  I*)(DWORD,LPWSTR
5bc0: 29 29 61 53 79 73 63 61 6c 6c 5b 33 32 5d 2e 70  ))aSyscall[32].p
5bd0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
5be0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
5bf0: 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74   { "GetTickCount
5c00: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
5c10: 59 53 43 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f  YSCALL)GetTickCo
5c20: 75 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  unt,            
5c30: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
5c40: 47 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20  GetTickCount",  
5c50: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5c60: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
5c70: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5c80: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
5c90: 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 20   osGetTickCount 
5ca0: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
5cb0: 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  (VOID))aSyscall[
5cc0: 33 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  33].pCurrent)..#
5cd0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
5ce0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
5cf0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
5d00: 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52  ITE_WIN32_GETVER
5d10: 53 49 4f 4e 45 58 29 20 26 26 20 5c 0a 20 20 20  SIONEX) && \.   
5d20: 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33       SQLITE_WIN3
5d30: 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a 20  2_GETVERSIONEX. 
5d40: 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78   { "GetVersionEx
5d50: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  A",           (S
5d60: 59 53 43 41 4c 4c 29 47 65 74 56 65 72 73 69 6f  YSCALL)GetVersio
5d70: 6e 45 78 41 2c 20 20 20 20 20 20 20 20 20 20 20  nExA,           
5d80: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
5d90: 47 65 74 56 65 72 73 69 6f 6e 45 78 41 22 2c 20  GetVersionExA", 
5da0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5db0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
5dc0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5dd0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
5de0: 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78 41   osGetVersionExA
5df0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
5e00: 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 53  ( \.        LPOS
5e10: 56 45 52 53 49 4f 4e 49 4e 46 4f 41 29 29 61 53  VERSIONINFOA))aS
5e20: 79 73 63 61 6c 6c 5b 33 34 5d 2e 70 43 75 72 72  yscall[34].pCurr
5e30: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
5e40: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
5e50: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
5e60: 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26 26 20  32_HAS_WIDE) && 
5e70: 5c 0a 20 20 20 20 20 20 20 20 64 65 66 69 6e 65  \.        define
5e80: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47  d(SQLITE_WIN32_G
5e90: 45 54 56 45 52 53 49 4f 4e 45 58 29 20 26 26 20  ETVERSIONEX) && 
5ea0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54  SQLITE_WIN32_GET
5eb0: 56 45 52 53 49 4f 4e 45 58 0a 20 20 7b 20 22 47  VERSIONEX.  { "G
5ec0: 65 74 56 65 72 73 69 6f 6e 45 78 57 22 2c 20 20  etVersionExW",  
5ed0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5ee0: 4c 29 47 65 74 56 65 72 73 69 6f 6e 45 78 57 2c  L)GetVersionExW,
5ef0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5f00: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 56 65  #else.  { "GetVe
5f10: 72 73 69 6f 6e 45 78 57 22 2c 20 20 20 20 20 20  rsionExW",      
5f20: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
5f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f40: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5f50: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
5f60: 74 56 65 72 73 69 6f 6e 45 78 57 20 28 28 42 4f  tVersionExW ((BO
5f70: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20  OL(WINAPI*)( \. 
5f80: 20 20 20 20 20 20 20 4c 50 4f 53 56 45 52 53 49         LPOSVERSI
5f90: 4f 4e 49 4e 46 4f 57 29 29 61 53 79 73 63 61 6c  ONINFOW))aSyscal
5fa0: 6c 5b 33 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[35].pCurrent).
5fb0: 0a 20 20 7b 20 22 48 65 61 70 41 6c 6c 6f 63 22  .  { "HeapAlloc"
5fc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5fd0: 28 53 59 53 43 41 4c 4c 29 48 65 61 70 41 6c 6c  (SYSCALL)HeapAll
5fe0: 6f 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  oc,             
5ff0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
6000: 6f 73 48 65 61 70 41 6c 6c 6f 63 20 28 28 4c 50  osHeapAlloc ((LP
6010: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41  VOID(WINAPI*)(HA
6020: 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  NDLE,DWORD, \.  
6030: 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53        SIZE_T))aS
6040: 79 73 63 61 6c 6c 5b 33 36 5d 2e 70 43 75 72 72  yscall[36].pCurr
6050: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
6060: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
6070: 48 65 61 70 43 72 65 61 74 65 22 2c 20 20 20 20  HeapCreate",    
6080: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6090: 4c 4c 29 48 65 61 70 43 72 65 61 74 65 2c 20 20  LL)HeapCreate,  
60a0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
60b0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70  .#else.  { "Heap
60c0: 43 72 65 61 74 65 22 2c 20 20 20 20 20 20 20 20  Create",        
60d0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
60e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
60f0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6100: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48  dif..#define osH
6110: 65 61 70 43 72 65 61 74 65 20 28 28 48 41 4e 44  eapCreate ((HAND
6120: 4c 45 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52  LE(WINAPI*)(DWOR
6130: 44 2c 53 49 5a 45 5f 54 2c 20 5c 0a 20 20 20 20  D,SIZE_T, \.    
6140: 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73      SIZE_T))aSys
6150: 63 61 6c 6c 5b 33 37 5d 2e 70 43 75 72 72 65 6e  call[37].pCurren
6160: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
6170: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65  OS_WINRT.  { "He
6180: 61 70 44 65 73 74 72 6f 79 22 2c 20 20 20 20 20  apDestroy",     
6190: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
61a0: 29 48 65 61 70 44 65 73 74 72 6f 79 2c 20 20 20  )HeapDestroy,   
61b0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
61c0: 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 44 65  else.  { "HeapDe
61d0: 73 74 72 6f 79 22 2c 20 20 20 20 20 20 20 20 20  stroy",         
61e0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
61f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6200: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
6210: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61  f..#define osHea
6220: 70 44 65 73 74 72 6f 79 20 28 28 42 4f 4f 4c 28  pDestroy ((BOOL(
6230: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29  WINAPI*)(HANDLE)
6240: 29 61 53 79 73 63 61 6c 6c 5b 33 38 5d 2e 70 43  )aSyscall[38].pC
6250: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65  urrent)..  { "He
6260: 61 70 46 72 65 65 22 2c 20 20 20 20 20 20 20 20  apFree",        
6270: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6280: 29 48 65 61 70 46 72 65 65 2c 20 20 20 20 20 20  )HeapFree,      
6290: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
62a0: 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 46 72  #define osHeapFr
62b0: 65 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  ee ((BOOL(WINAPI
62c0: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
62d0: 4c 50 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  LPVOID))aSyscall
62e0: 5b 33 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [39].pCurrent)..
62f0: 20 20 7b 20 22 48 65 61 70 52 65 41 6c 6c 6f 63    { "HeapReAlloc
6300: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
6310: 53 59 53 43 41 4c 4c 29 48 65 61 70 52 65 41 6c  SYSCALL)HeapReAl
6320: 6c 6f 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  loc,            
6330: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
6340: 73 48 65 61 70 52 65 41 6c 6c 6f 63 20 28 28 4c  sHeapReAlloc ((L
6350: 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48  PVOID(WINAPI*)(H
6360: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f  ANDLE,DWORD,LPVO
6370: 49 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49  ID, \.        SI
6380: 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 34  ZE_T))aSyscall[4
6390: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  0].pCurrent)..  
63a0: 7b 20 22 48 65 61 70 53 69 7a 65 22 2c 20 20 20  { "HeapSize",   
63b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
63c0: 53 43 41 4c 4c 29 48 65 61 70 53 69 7a 65 2c 20  SCALL)HeapSize, 
63d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
63e0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48   },..#define osH
63f0: 65 61 70 53 69 7a 65 20 28 28 53 49 5a 45 5f 54  eapSize ((SIZE_T
6400: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
6410: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
6420: 20 20 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63    LPCVOID))aSysc
6430: 61 6c 6c 5b 34 31 5d 2e 70 43 75 72 72 65 6e 74  all[41].pCurrent
6440: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
6450: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61  S_WINRT.  { "Hea
6460: 70 56 61 6c 69 64 61 74 65 22 2c 20 20 20 20 20  pValidate",     
6470: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6480: 48 65 61 70 56 61 6c 69 64 61 74 65 2c 20 20 20  HeapValidate,   
6490: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
64a0: 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 56 61 6c  lse.  { "HeapVal
64b0: 69 64 61 74 65 22 2c 20 20 20 20 20 20 20 20 20  idate",         
64c0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
64d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64e0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
64f0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70  ..#define osHeap
6500: 56 61 6c 69 64 61 74 65 20 28 28 42 4f 4f 4c 28  Validate ((BOOL(
6510: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
6520: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
6530: 20 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63 61   LPCVOID))aSysca
6540: 6c 6c 5b 34 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[42].pCurrent)
6550: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
6560: 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
6570: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
6580: 48 65 61 70 43 6f 6d 70 61 63 74 22 2c 20 20 20  HeapCompact",   
6590: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
65a0: 4c 4c 29 48 65 61 70 43 6f 6d 70 61 63 74 2c 20  LL)HeapCompact, 
65b0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
65c0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70  .#else.  { "Heap
65d0: 43 6f 6d 70 61 63 74 22 2c 20 20 20 20 20 20 20  Compact",       
65e0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
65f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6600: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6610: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48  dif..#define osH
6620: 65 61 70 43 6f 6d 70 61 63 74 20 28 28 55 49 4e  eapCompact ((UIN
6630: 54 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  T(WINAPI*)(HANDL
6640: 45 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  E,DWORD))aSyscal
6650: 6c 5b 34 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[43].pCurrent).
6660: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
6670: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
6680: 53 49 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  SI) && !defined(
6690: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
66a0: 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20  _EXTENSION).  { 
66b0: 22 4c 6f 61 64 4c 69 62 72 61 72 79 41 22 2c 20  "LoadLibraryA", 
66c0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
66d0: 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79 41  ALL)LoadLibraryA
66e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
66f0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61  ,.#else.  { "Loa
6700: 64 4c 69 62 72 61 72 79 41 22 2c 20 20 20 20 20  dLibraryA",     
6710: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6720: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6730: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6740: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6750: 4c 6f 61 64 4c 69 62 72 61 72 79 41 20 28 28 48  LoadLibraryA ((H
6760: 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28  MODULE(WINAPI*)(
6770: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
6780: 5b 34 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [44].pCurrent)..
6790: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
67a0: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
67b0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
67c0: 5f 57 49 44 45 29 20 26 26 20 5c 0a 20 20 20 20  _WIDE) && \.    
67d0: 20 20 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c      !defined(SQL
67e0: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
67f0: 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f  TENSION).  { "Lo
6800: 61 64 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20  adLibraryW",    
6810: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6820: 29 4c 6f 61 64 4c 69 62 72 61 72 79 57 2c 20 20  )LoadLibraryW,  
6830: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6840: 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69  else.  { "LoadLi
6850: 62 72 61 72 79 57 22 2c 20 20 20 20 20 20 20 20  braryW",        
6860: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
6870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6880: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
6890: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61  f..#define osLoa
68a0: 64 4c 69 62 72 61 72 79 57 20 28 28 48 4d 4f 44  dLibraryW ((HMOD
68b0: 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  ULE(WINAPI*)(LPC
68c0: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34  WSTR))aSyscall[4
68d0: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  5].pCurrent)..#i
68e0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
68f0: 52 54 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65  RT.  { "LocalFre
6900: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
6910: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 61 6c    (SYSCALL)Local
6920: 46 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 20  Free,           
6930: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
6940: 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20   { "LocalFree", 
6950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
6960: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
6970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6980: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
6990: 66 69 6e 65 20 6f 73 4c 6f 63 61 6c 46 72 65 65  fine osLocalFree
69a0: 20 28 28 48 4c 4f 43 41 4c 28 57 49 4e 41 50 49   ((HLOCAL(WINAPI
69b0: 2a 29 28 48 4c 4f 43 41 4c 29 29 61 53 79 73 63  *)(HLOCAL))aSysc
69c0: 61 6c 6c 5b 34 36 5d 2e 70 43 75 72 72 65 6e 74  all[46].pCurrent
69d0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
69e0: 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
69f0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
6a00: 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20  "LockFile",     
6a10: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6a20: 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65 2c 20 20 20  ALL)LockFile,   
6a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6a40: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63  ,.#else.  { "Loc
6a50: 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  kFile",         
6a60: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6a70: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6a80: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6a90: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73  ndif..#ifndef os
6aa0: 4c 6f 63 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65  LockFile.#define
6ab0: 20 6f 73 4c 6f 63 6b 46 69 6c 65 20 28 28 42 4f   osLockFile ((BO
6ac0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
6ad0: 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44  LE,DWORD,DWORD,D
6ae0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
6af0: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
6b00: 34 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65  47].pCurrent).#e
6b10: 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54  ndif..#if !SQLIT
6b20: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22  E_OS_WINCE.  { "
6b30: 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20  LockFileEx",    
6b40: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6b50: 4c 4c 29 4c 6f 63 6b 46 69 6c 65 45 78 2c 20 20  LL)LockFileEx,  
6b60: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6b70: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b  .#else.  { "Lock
6b80: 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20  FileEx",        
6b90: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6ba0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6bb0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6bc0: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c  dif..#ifndef osL
6bd0: 6f 63 6b 46 69 6c 65 45 78 0a 23 64 65 66 69 6e  ockFileEx.#defin
6be0: 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 20 28  e osLockFileEx (
6bf0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
6c00: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52  ANDLE,DWORD,DWOR
6c10: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  D,DWORD,DWORD, \
6c20: 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c  .        LPOVERL
6c30: 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b  APPED))aSyscall[
6c40: 34 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65  48].pCurrent).#e
6c50: 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
6c60: 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53  _OS_WINCE || (!S
6c70: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
6c80: 26 20 5c 0a 20 20 20 20 20 20 20 20 28 21 64 65  & \.        (!de
6c90: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
6ca0: 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45  T_WAL) || SQLITE
6cb0: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
6cc0: 29 29 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f  )).  { "MapViewO
6cd0: 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  fFile",         
6ce0: 20 20 28 53 59 53 43 41 4c 4c 29 4d 61 70 56 69    (SYSCALL)MapVi
6cf0: 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20  ewOfFile,       
6d00: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
6d10: 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c   { "MapViewOfFil
6d20: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  e",           (S
6d30: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
6d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d50: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
6d60: 66 69 6e 65 20 6f 73 4d 61 70 56 69 65 77 4f 66  fine osMapViewOf
6d70: 46 69 6c 65 20 28 28 4c 50 56 4f 49 44 28 57 49  File ((LPVOID(WI
6d80: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
6d90: 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  ORD,DWORD,DWORD,
6da0: 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f   \.        SIZE_
6db0: 54 29 29 61 53 79 73 63 61 6c 6c 5b 34 39 5d 2e  T))aSyscall[49].
6dc0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
6dd0: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
6de0: 68 61 72 22 2c 20 20 20 20 20 28 53 59 53 43 41  har",     (SYSCA
6df0: 4c 4c 29 4d 75 6c 74 69 42 79 74 65 54 6f 57 69  LL)MultiByteToWi
6e00: 64 65 43 68 61 72 2c 20 20 20 20 20 30 20 7d 2c  deChar,     0 },
6e10: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 75 6c 74  ..#define osMult
6e20: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 20  iByteToWideChar 
6e30: 28 28 69 6e 74 28 57 49 4e 41 50 49 2a 29 28 55  ((int(WINAPI*)(U
6e40: 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52  INT,DWORD,LPCSTR
6e50: 2c 69 6e 74 2c 4c 50 57 53 54 52 2c 20 5c 0a 20  ,int,LPWSTR, \. 
6e60: 20 20 20 20 20 20 20 69 6e 74 29 29 61 53 79 73         int))aSys
6e70: 63 61 6c 6c 5b 35 30 5d 2e 70 43 75 72 72 65 6e  call[50].pCurren
6e80: 74 29 0a 0a 20 20 7b 20 22 51 75 65 72 79 50 65  t)..  { "QueryPe
6e90: 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72  rformanceCounter
6ea0: 22 2c 20 28 53 59 53 43 41 4c 4c 29 51 75 65 72  ", (SYSCALL)Quer
6eb0: 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e  yPerformanceCoun
6ec0: 74 65 72 2c 20 30 20 7d 2c 0a 0a 23 64 65 66 69  ter, 0 },..#defi
6ed0: 6e 65 20 6f 73 51 75 65 72 79 50 65 72 66 6f 72  ne osQueryPerfor
6ee0: 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20 28 28 42  manceCounter ((B
6ef0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a  OOL(WINAPI*)( \.
6f00: 20 20 20 20 20 20 20 20 4c 41 52 47 45 5f 49 4e          LARGE_IN
6f10: 54 45 47 45 52 2a 29 29 61 53 79 73 63 61 6c 6c  TEGER*))aSyscall
6f20: 5b 35 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [51].pCurrent)..
6f30: 20 20 7b 20 22 52 65 61 64 46 69 6c 65 22 2c 20    { "ReadFile", 
6f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
6f50: 53 59 53 43 41 4c 4c 29 52 65 61 64 46 69 6c 65  SYSCALL)ReadFile
6f60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6f70: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
6f80: 73 52 65 61 64 46 69 6c 65 20 28 28 42 4f 4f 4c  sReadFile ((BOOL
6f90: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
6fa0: 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50  ,LPVOID,DWORD,LP
6fb0: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
6fc0: 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61   LPOVERLAPPED))a
6fd0: 53 79 73 63 61 6c 6c 5b 35 32 5d 2e 70 43 75 72  Syscall[52].pCur
6fe0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 65 74 45  rent)..  { "SetE
6ff0: 6e 64 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ndOfFile",      
7000: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53        (SYSCALL)S
7010: 65 74 45 6e 64 4f 66 46 69 6c 65 2c 20 20 20 20  etEndOfFile,    
7020: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
7030: 65 66 69 6e 65 20 6f 73 53 65 74 45 6e 64 4f 66  efine osSetEndOf
7040: 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  File ((BOOL(WINA
7050: 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79  PI*)(HANDLE))aSy
7060: 73 63 61 6c 6c 5b 35 33 5d 2e 70 43 75 72 72 65  scall[53].pCurre
7070: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
7080: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53  _OS_WINRT.  { "S
7090: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20  etFilePointer", 
70a0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
70b0: 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  L)SetFilePointer
70c0: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
70d0: 23 65 6c 73 65 0a 20 20 7b 20 22 53 65 74 46 69  #else.  { "SetFi
70e0: 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20 20 20 20  lePointer",     
70f0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
7100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7110: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
7120: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65  if..#define osSe
7130: 74 46 69 6c 65 50 6f 69 6e 74 65 72 20 28 28 44  tFilePointer ((D
7140: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41  WORD(WINAPI*)(HA
7150: 4e 44 4c 45 2c 4c 4f 4e 47 2c 50 4c 4f 4e 47 2c  NDLE,LONG,PLONG,
7160: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
7170: 29 29 61 53 79 73 63 61 6c 6c 5b 35 34 5d 2e 70  ))aSyscall[54].p
7180: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
7190: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
71a0: 20 7b 20 22 53 6c 65 65 70 22 2c 20 20 20 20 20   { "Sleep",     
71b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
71c0: 59 53 43 41 4c 4c 29 53 6c 65 65 70 2c 20 20 20  YSCALL)Sleep,   
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71e0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
71f0: 53 6c 65 65 70 22 2c 20 20 20 20 20 20 20 20 20  Sleep",         
7200: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
7210: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
7220: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7230: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
7240: 20 6f 73 53 6c 65 65 70 20 28 28 56 4f 49 44 28   osSleep ((VOID(
7250: 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 29 29  WINAPI*)(DWORD))
7260: 61 53 79 73 63 61 6c 6c 5b 35 35 5d 2e 70 43 75  aSyscall[55].pCu
7270: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 79 73  rrent)..  { "Sys
7280: 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d  temTimeToFileTim
7290: 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29  e",    (SYSCALL)
72a0: 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65  SystemTimeToFile
72b0: 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 0a 23  Time,    0 },..#
72c0: 64 65 66 69 6e 65 20 6f 73 53 79 73 74 65 6d 54  define osSystemT
72d0: 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 20 28 28  imeToFileTime ((
72e0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f  BOOL(WINAPI*)(CO
72f0: 4e 53 54 20 53 59 53 54 45 4d 54 49 4d 45 2a 2c  NST SYSTEMTIME*,
7300: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c   \.        LPFIL
7310: 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b  ETIME))aSyscall[
7320: 35 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  56].pCurrent)..#
7330: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
7340: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
7350: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 55 6e 6c  S_WINRT.  { "Unl
7360: 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20  ockFile",       
7370: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7380: 55 6e 6c 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20  UnlockFile,     
7390: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
73a0: 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46  lse.  { "UnlockF
73b0: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
73c0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
73d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73e0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
73f0: 0a 0a 23 69 66 6e 64 65 66 20 6f 73 55 6e 6c 6f  ..#ifndef osUnlo
7400: 63 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65 20 6f  ckFile.#define o
7410: 73 55 6e 6c 6f 63 6b 46 69 6c 65 20 28 28 42 4f  sUnlockFile ((BO
7420: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
7430: 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44  LE,DWORD,DWORD,D
7440: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
7450: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
7460: 35 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65  57].pCurrent).#e
7470: 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54  ndif..#if !SQLIT
7480: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22  E_OS_WINCE.  { "
7490: 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20  UnlockFileEx",  
74a0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
74b0: 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 2c  LL)UnlockFileEx,
74c0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
74d0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f  .#else.  { "Unlo
74e0: 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20  ckFileEx",      
74f0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
7500: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7510: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
7520: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55  dif..#define osU
7530: 6e 6c 6f 63 6b 46 69 6c 65 45 78 20 28 28 42 4f  nlockFileEx ((BO
7540: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
7550: 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44  LE,DWORD,DWORD,D
7560: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
7570: 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53  LPOVERLAPPED))aS
7580: 79 73 63 61 6c 6c 5b 35 38 5d 2e 70 43 75 72 72  yscall[58].pCurr
7590: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
75a0: 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 21 64 65  _OS_WINCE || !de
75b0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
75c0: 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45  T_WAL) || SQLITE
75d0: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
75e0: 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69 65 77 4f  .  { "UnmapViewO
75f0: 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  fFile",         
7600: 28 53 59 53 43 41 4c 4c 29 55 6e 6d 61 70 56 69  (SYSCALL)UnmapVi
7610: 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20  ewOfFile,       
7620: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7630: 20 22 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c   "UnmapViewOfFil
7640: 65 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53  e",         (SYS
7650: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7670: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
7680: 6e 65 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66  ne osUnmapViewOf
7690: 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  File ((BOOL(WINA
76a0: 50 49 2a 29 28 4c 50 43 56 4f 49 44 29 29 61 53  PI*)(LPCVOID))aS
76b0: 79 73 63 61 6c 6c 5b 35 39 5d 2e 70 43 75 72 72  yscall[59].pCurr
76c0: 65 6e 74 29 0a 0a 20 20 7b 20 22 57 69 64 65 43  ent)..  { "WideC
76d0: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 22 2c  harToMultiByte",
76e0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 69       (SYSCALL)Wi
76f0: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
7700: 65 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65  e,     0 },..#de
7710: 66 69 6e 65 20 6f 73 57 69 64 65 43 68 61 72 54  fine osWideCharT
7720: 6f 4d 75 6c 74 69 42 79 74 65 20 28 28 69 6e 74  oMultiByte ((int
7730: 28 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44  (WINAPI*)(UINT,D
7740: 57 4f 52 44 2c 4c 50 43 57 53 54 52 2c 69 6e 74  WORD,LPCWSTR,int
7750: 2c 4c 50 53 54 52 2c 69 6e 74 2c 20 5c 0a 20 20  ,LPSTR,int, \.  
7760: 20 20 20 20 20 20 4c 50 43 53 54 52 2c 4c 50 42        LPCSTR,LPB
7770: 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b 36 30  OOL))aSyscall[60
7780: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
7790: 20 22 57 72 69 74 65 46 69 6c 65 22 2c 20 20 20   "WriteFile",   
77a0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
77b0: 43 41 4c 4c 29 57 72 69 74 65 46 69 6c 65 2c 20  CALL)WriteFile, 
77c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
77d0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 72  },..#define osWr
77e0: 69 74 65 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57  iteFile ((BOOL(W
77f0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c  INAPI*)(HANDLE,L
7800: 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44  PCVOID,DWORD,LPD
7810: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
7820: 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53  LPOVERLAPPED))aS
7830: 79 73 63 61 6c 6c 5b 36 31 5d 2e 70 43 75 72 72  yscall[61].pCurr
7840: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
7850: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43  _OS_WINRT.  { "C
7860: 72 65 61 74 65 45 76 65 6e 74 45 78 57 22 2c 20  reateEventExW", 
7870: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
7880: 4c 29 43 72 65 61 74 65 45 76 65 6e 74 45 78 57  L)CreateEventExW
7890: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
78a0: 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74  #else.  { "Creat
78b0: 65 45 76 65 6e 74 45 78 57 22 2c 20 20 20 20 20  eEventExW",     
78c0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
78d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78e0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
78f0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72  if..#define osCr
7900: 65 61 74 65 45 76 65 6e 74 45 78 57 20 28 28 48  eateEventExW ((H
7910: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ANDLE(WINAPI*)(L
7920: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
7930: 55 54 45 53 2c 4c 50 43 57 53 54 52 2c 20 5c 0a  UTES,LPCWSTR, \.
7940: 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57          DWORD,DW
7950: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 32  ORD))aSyscall[62
7960: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
7970: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
7980: 54 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69  T.  { "WaitForSi
7990: 6e 67 6c 65 4f 62 6a 65 63 74 22 2c 20 20 20 20  ngleObject",    
79a0: 20 28 53 59 53 43 41 4c 4c 29 57 61 69 74 46 6f   (SYSCALL)WaitFo
79b0: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 2c 20 20  rSingleObject,  
79c0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
79d0: 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65  { "WaitForSingle
79e0: 4f 62 6a 65 63 74 22 2c 20 20 20 20 20 28 53 59  Object",     (SY
79f0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
7a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7a10: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
7a20: 69 6e 65 20 6f 73 57 61 69 74 46 6f 72 53 69 6e  ine osWaitForSin
7a30: 67 6c 65 4f 62 6a 65 63 74 20 28 28 44 57 4f 52  gleObject ((DWOR
7a40: 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  D(WINAPI*)(HANDL
7a50: 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  E, \.        DWO
7a60: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 33 5d  RD))aSyscall[63]
7a70: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
7a80: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
7a90: 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e  .  { "WaitForSin
7aa0: 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c 20 20 20  gleObjectEx",   
7ab0: 28 53 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72  (SYSCALL)WaitFor
7ac0: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 2c 20  SingleObjectEx, 
7ad0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7ae0: 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f   "WaitForSingleO
7af0: 62 6a 65 63 74 45 78 22 2c 20 20 20 28 53 59 53  bjectEx",   (SYS
7b00: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7b20: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
7b30: 6e 65 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67  ne osWaitForSing
7b40: 6c 65 4f 62 6a 65 63 74 45 78 20 28 28 44 57 4f  leObjectEx ((DWO
7b50: 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  RD(WINAPI*)(HAND
7b60: 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  LE,DWORD, \.    
7b70: 20 20 20 20 42 4f 4f 4c 29 29 61 53 79 73 63 61      BOOL))aSysca
7b80: 6c 6c 5b 36 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[64].pCurrent)
7b90: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
7ba0: 57 49 4e 52 54 0a 20 20 7b 20 22 53 65 74 46 69  WINRT.  { "SetFi
7bb0: 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c 20 20 20  lePointerEx",   
7bc0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65       (SYSCALL)Se
7bd0: 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 2c 20  tFilePointerEx, 
7be0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
7bf0: 65 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f  e.  { "SetFilePo
7c00: 69 6e 74 65 72 45 78 22 2c 20 20 20 20 20 20 20  interEx",       
7c10: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
7c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c30: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
7c40: 23 64 65 66 69 6e 65 20 6f 73 53 65 74 46 69 6c  #define osSetFil
7c50: 65 50 6f 69 6e 74 65 72 45 78 20 28 28 42 4f 4f  ePointerEx ((BOO
7c60: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
7c70: 45 2c 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2c  E,LARGE_INTEGER,
7c80: 20 5c 0a 20 20 20 20 20 20 20 20 50 4c 41 52 47   \.        PLARG
7c90: 45 5f 49 4e 54 45 47 45 52 2c 44 57 4f 52 44 29  E_INTEGER,DWORD)
7ca0: 29 61 53 79 73 63 61 6c 6c 5b 36 35 5d 2e 70 43  )aSyscall[65].pC
7cb0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
7cc0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
7cd0: 20 22 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61   "GetFileInforma
7ce0: 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c  tionByHandleEx",
7cf0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c   (SYSCALL)GetFil
7d00: 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61  eInformationByHa
7d10: 6e 64 6c 65 45 78 2c 20 30 20 7d 2c 0a 23 65 6c  ndleEx, 0 },.#el
7d20: 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 49  se.  { "GetFileI
7d30: 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64  nformationByHand
7d40: 6c 65 45 78 22 2c 20 28 53 59 53 43 41 4c 4c 29  leEx", (SYSCALL)
7d50: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
7d60: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
7d70: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69  .#define osGetFi
7d80: 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48  leInformationByH
7d90: 61 6e 64 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57  andleEx ((BOOL(W
7da0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20  INAPI*)(HANDLE, 
7db0: 5c 0a 20 20 20 20 20 20 20 20 46 49 4c 45 5f 49  \.        FILE_I
7dc0: 4e 46 4f 5f 42 59 5f 48 41 4e 44 4c 45 5f 43 4c  NFO_BY_HANDLE_CL
7dd0: 41 53 53 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44  ASS,LPVOID,DWORD
7de0: 29 29 61 53 79 73 63 61 6c 6c 5b 36 36 5d 2e 70  ))aSyscall[66].p
7df0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
7e00: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
7e10: 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54   (!defined(SQLIT
7e20: 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53  E_OMIT_WAL) || S
7e30: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
7e40: 49 5a 45 3e 30 29 0a 20 20 7b 20 22 4d 61 70 56  IZE>0).  { "MapV
7e50: 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70  iewOfFileFromApp
7e60: 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d  ",    (SYSCALL)M
7e70: 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d  apViewOfFileFrom
7e80: 41 70 70 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c  App,    0 },.#el
7e90: 73 65 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f  se.  { "MapViewO
7ea0: 66 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20  fFileFromApp",  
7eb0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
7ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ed0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
7ee0: 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61 70 56 69  .#define osMapVi
7ef0: 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 20  ewOfFileFromApp 
7f00: 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a  ((LPVOID(WINAPI*
7f10: 29 28 48 41 4e 44 4c 45 2c 55 4c 4f 4e 47 2c 55  )(HANDLE,ULONG,U
7f20: 4c 4f 4e 47 36 34 2c 20 5c 0a 20 20 20 20 20 20  LONG64, \.      
7f30: 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61    SIZE_T))aSysca
7f40: 6c 6c 5b 36 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[67].pCurrent)
7f50: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
7f60: 57 49 4e 52 54 0a 20 20 7b 20 22 43 72 65 61 74  WINRT.  { "Creat
7f70: 65 46 69 6c 65 32 22 2c 20 20 20 20 20 20 20 20  eFile2",        
7f80: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
7f90: 65 61 74 65 46 69 6c 65 32 2c 20 20 20 20 20 20  eateFile2,      
7fa0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
7fb0: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  e.  { "CreateFil
7fc0: 65 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  e2",            
7fd0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
7fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ff0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
8000: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
8010: 46 69 6c 65 32 20 28 28 48 41 4e 44 4c 45 28 57  File2 ((HANDLE(W
8020: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c  INAPI*)(LPCWSTR,
8030: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
8040: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43  D, \.        LPC
8050: 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e  REATEFILE2_EXTEN
8060: 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53 29 29  DED_PARAMETERS))
8070: 61 53 79 73 63 61 6c 6c 5b 36 38 5d 2e 70 43 75  aSyscall[68].pCu
8080: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
8090: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21  TE_OS_WINRT && !
80a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
80b0: 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
80c0: 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 50 61 63  ON).  { "LoadPac
80d0: 6b 61 67 65 64 4c 69 62 72 61 72 79 22 2c 20 20  kagedLibrary",  
80e0: 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64     (SYSCALL)Load
80f0: 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 2c  PackagedLibrary,
8100: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
8110: 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67 65    { "LoadPackage
8120: 64 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 28  dLibrary",     (
8130: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
8140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8150: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
8160: 65 66 69 6e 65 20 6f 73 4c 6f 61 64 50 61 63 6b  efine osLoadPack
8170: 61 67 65 64 4c 69 62 72 61 72 79 20 28 28 48 4d  agedLibrary ((HM
8180: 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ODULE(WINAPI*)(L
8190: 50 43 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20  PCWSTR, \.      
81a0: 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c    DWORD))aSyscal
81b0: 6c 5b 36 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[69].pCurrent).
81c0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
81d0: 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 54 69 63  INRT.  { "GetTic
81e0: 6b 43 6f 75 6e 74 36 34 22 2c 20 20 20 20 20 20  kCount64",      
81f0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
8200: 54 69 63 6b 43 6f 75 6e 74 36 34 2c 20 20 20 20  TickCount64,    
8210: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
8220: 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75  .  { "GetTickCou
8230: 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20  nt64",          
8240: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
8250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8260: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
8270: 64 65 66 69 6e 65 20 6f 73 47 65 74 54 69 63 6b  define osGetTick
8280: 43 6f 75 6e 74 36 34 20 28 28 55 4c 4f 4e 47 4c  Count64 ((ULONGL
8290: 4f 4e 47 28 57 49 4e 41 50 49 2a 29 28 56 4f 49  ONG(WINAPI*)(VOI
82a0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 37 30 5d 2e  D))aSyscall[70].
82b0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
82c0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
82d0: 20 7b 20 22 47 65 74 4e 61 74 69 76 65 53 79 73   { "GetNativeSys
82e0: 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 28 53  temInfo",     (S
82f0: 59 53 43 41 4c 4c 29 47 65 74 4e 61 74 69 76 65  YSCALL)GetNative
8300: 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20  SystemInfo,     
8310: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
8320: 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49  GetNativeSystemI
8330: 6e 66 6f 22 2c 20 20 20 20 20 28 53 59 53 43 41  nfo",     (SYSCA
8340: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
8350: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
8360: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
8370: 20 6f 73 47 65 74 4e 61 74 69 76 65 53 79 73 74   osGetNativeSyst
8380: 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28 57 49  emInfo ((VOID(WI
8390: 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20  NAPI*)( \.      
83a0: 20 20 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29    LPSYSTEM_INFO)
83b0: 29 61 53 79 73 63 61 6c 6c 5b 37 31 5d 2e 70 43  )aSyscall[71].pC
83c0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
83d0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
83e0: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
83f0: 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  "OutputDebugStri
8400: 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59 53 43  ngA",      (SYSC
8410: 41 4c 4c 29 4f 75 74 70 75 74 44 65 62 75 67 53  ALL)OutputDebugS
8420: 74 72 69 6e 67 41 2c 20 20 20 20 20 20 30 20 7d  tringA,      0 }
8430: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f 75 74  ,.#else.  { "Out
8440: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 22  putDebugStringA"
8450: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
8460: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
8470: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
8480: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
8490: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
84a0: 67 41 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49  gA ((VOID(WINAPI
84b0: 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63  *)(LPCSTR))aSysc
84c0: 61 6c 6c 5b 37 32 5d 2e 70 43 75 72 72 65 6e 74  all[72].pCurrent
84d0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
84e0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
84f0: 57 49 44 45 29 0a 20 20 7b 20 22 4f 75 74 70 75  WIDE).  { "Outpu
8500: 74 44 65 62 75 67 53 74 72 69 6e 67 57 22 2c 20  tDebugStringW", 
8510: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4f 75       (SYSCALL)Ou
8520: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57  tputDebugStringW
8530: 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  ,      0 },.#els
8540: 65 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62  e.  { "OutputDeb
8550: 75 67 53 74 72 69 6e 67 57 22 2c 20 20 20 20 20  ugStringW",     
8560: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
8570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8580: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
8590: 23 64 65 66 69 6e 65 20 6f 73 4f 75 74 70 75 74  #define osOutput
85a0: 44 65 62 75 67 53 74 72 69 6e 67 57 20 28 28 56  DebugStringW ((V
85b0: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OID(WINAPI*)(LPC
85c0: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37  WSTR))aSyscall[7
85d0: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  3].pCurrent)..  
85e0: 7b 20 22 47 65 74 50 72 6f 63 65 73 73 48 65 61  { "GetProcessHea
85f0: 70 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  p",          (SY
8600: 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 65 73 73  SCALL)GetProcess
8610: 48 65 61 70 2c 20 20 20 20 20 20 20 20 20 20 30  Heap,          0
8620: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47   },..#define osG
8630: 65 74 50 72 6f 63 65 73 73 48 65 61 70 20 28 28  etProcessHeap ((
8640: 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28  HANDLE(WINAPI*)(
8650: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 37  VOID))aSyscall[7
8660: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
8670: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
8680: 54 20 26 26 20 28 21 64 65 66 69 6e 65 64 28 53  T && (!defined(S
8690: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20  QLITE_OMIT_WAL) 
86a0: 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  || SQLITE_MAX_MM
86b0: 41 50 5f 53 49 5a 45 3e 30 29 0a 20 20 7b 20 22  AP_SIZE>0).  { "
86c0: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
86d0: 67 46 72 6f 6d 41 70 70 22 2c 20 28 53 59 53 43  gFromApp", (SYSC
86e0: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61  ALL)CreateFileMa
86f0: 70 70 69 6e 67 46 72 6f 6d 41 70 70 2c 20 30 20  ppingFromApp, 0 
8700: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72  },.#else.  { "Cr
8710: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46  eateFileMappingF
8720: 72 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c  romApp", (SYSCAL
8730: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
8740: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
8750: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
8760: 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
8770: 6e 67 46 72 6f 6d 41 70 70 20 28 28 48 41 4e 44  ngFromApp ((HAND
8780: 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  LE(WINAPI*)(HAND
8790: 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  LE, \.        LP
87a0: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
87b0: 54 45 53 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36  TES,ULONG,ULONG6
87c0: 34 2c 4c 50 43 57 53 54 52 29 29 61 53 79 73 63  4,LPCWSTR))aSysc
87d0: 61 6c 6c 5b 37 35 5d 2e 70 43 75 72 72 65 6e 74  all[75].pCurrent
87e0: 29 0a 0a 2f 2a 0a 2a 2a 20 4e 4f 54 45 3a 20 4f  )../*.** NOTE: O
87f0: 6e 20 73 6f 6d 65 20 73 75 62 2d 70 6c 61 74 66  n some sub-platf
8800: 6f 72 6d 73 2c 20 74 68 65 20 49 6e 74 65 72 6c  orms, the Interl
8810: 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68  ockedCompareExch
8820: 61 6e 67 65 20 22 66 75 6e 63 74 69 6f 6e 22 0a  ange "function".
8830: 2a 2a 20 20 20 20 20 20 20 69 73 20 72 65 61 6c  **       is real
8840: 6c 79 20 6a 75 73 74 20 61 20 6d 61 63 72 6f 20  ly just a macro 
8850: 74 68 61 74 20 75 73 65 73 20 61 20 63 6f 6d 70  that uses a comp
8860: 69 6c 65 72 20 69 6e 74 72 69 6e 73 69 63 20 28  iler intrinsic (
8870: 65 2e 67 2e 20 78 36 34 29 2e 0a 2a 2a 20 20 20  e.g. x64)..**   
8880: 20 20 20 20 53 6f 20 64 6f 20 6e 6f 74 20 74 72      So do not tr
8890: 79 20 74 6f 20 6d 61 6b 65 20 74 68 69 73 20 69  y to make this i
88a0: 73 20 69 6e 74 6f 20 61 20 72 65 64 65 66 69 6e  s into a redefin
88b0: 61 62 6c 65 20 69 6e 74 65 72 66 61 63 65 2e 0a  able interface..
88c0: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 49  */.#if defined(I
88d0: 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72  nterlockedCompar
88e0: 65 45 78 63 68 61 6e 67 65 29 0a 20 20 7b 20 22  eExchange).  { "
88f0: 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61  InterlockedCompa
8900: 72 65 45 78 63 68 61 6e 67 65 22 2c 20 28 53 59  reExchange", (SY
8910: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
8920: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
8930: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 49 6e 74 65  ..#define osInte
8940: 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78  rlockedCompareEx
8950: 63 68 61 6e 67 65 20 49 6e 74 65 72 6c 6f 63 6b  change Interlock
8960: 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67  edCompareExchang
8970: 65 0a 23 65 6c 73 65 0a 20 20 7b 20 22 49 6e 74  e.#else.  { "Int
8980: 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45  erlockedCompareE
8990: 78 63 68 61 6e 67 65 22 2c 20 28 53 59 53 43 41  xchange", (SYSCA
89a0: 4c 4c 29 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f  LL)InterlockedCo
89b0: 6d 70 61 72 65 45 78 63 68 61 6e 67 65 2c 20 30  mpareExchange, 0
89c0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 49   },..#define osI
89d0: 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72  nterlockedCompar
89e0: 65 45 78 63 68 61 6e 67 65 20 28 28 4c 4f 4e 47  eExchange ((LONG
89f0: 28 57 49 4e 41 50 49 2a 29 28 4c 4f 4e 47 20 5c  (WINAPI*)(LONG \
8a00: 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
8a10: 57 49 4e 33 32 5f 56 4f 4c 41 54 49 4c 45 2a 2c  WIN32_VOLATILE*,
8a20: 20 4c 4f 4e 47 2c 4c 4f 4e 47 29 29 61 53 79 73   LONG,LONG))aSys
8a30: 63 61 6c 6c 5b 37 36 5d 2e 70 43 75 72 72 65 6e  call[76].pCurren
8a40: 74 29 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  t).#endif /* def
8a50: 69 6e 65 64 28 49 6e 74 65 72 6c 6f 63 6b 65 64  ined(Interlocked
8a60: 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 29  CompareExchange)
8a70: 20 2a 2f 0a 0a 23 69 66 20 21 53 51 4c 49 54 45   */..#if !SQLITE
8a80: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
8a90: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
8aa0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 55 53   SQLITE_WIN32_US
8ab0: 45 5f 55 55 49 44 0a 20 20 7b 20 22 55 75 69 64  E_UUID.  { "Uuid
8ac0: 43 72 65 61 74 65 22 2c 20 20 20 20 20 20 20 20  Create",        
8ad0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
8ae0: 55 75 69 64 43 72 65 61 74 65 2c 20 20 20 20 20  UuidCreate,     
8af0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
8b00: 73 65 0a 20 20 7b 20 22 55 75 69 64 43 72 65 61  se.  { "UuidCrea
8b10: 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  te",            
8b20: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b40: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
8b50: 0a 23 64 65 66 69 6e 65 20 6f 73 55 75 69 64 43  .#define osUuidC
8b60: 72 65 61 74 65 20 28 28 52 50 43 5f 53 54 41 54  reate ((RPC_STAT
8b70: 55 53 28 52 50 43 5f 45 4e 54 52 59 2a 29 28 55  US(RPC_ENTRY*)(U
8b80: 55 49 44 2a 29 29 61 53 79 73 63 61 6c 6c 5b 37  UID*))aSyscall[7
8b90: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  7].pCurrent)..#i
8ba0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
8bb0: 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53  CE && !SQLITE_OS
8bc0: 5f 57 49 4e 52 54 20 26 26 20 53 51 4c 49 54 45  _WINRT && SQLITE
8bd0: 5f 57 49 4e 33 32 5f 55 53 45 5f 55 55 49 44 0a  _WIN32_USE_UUID.
8be0: 20 20 7b 20 22 55 75 69 64 43 72 65 61 74 65 53    { "UuidCreateS
8bf0: 65 71 75 65 6e 74 69 61 6c 22 2c 20 20 20 20 20  equential",     
8c00: 28 53 59 53 43 41 4c 4c 29 55 75 69 64 43 72 65  (SYSCALL)UuidCre
8c10: 61 74 65 53 65 71 75 65 6e 74 69 61 6c 2c 20 20  ateSequential,  
8c20: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
8c30: 22 55 75 69 64 43 72 65 61 74 65 53 65 71 75 65  "UuidCreateSeque
8c40: 6e 74 69 61 6c 22 2c 20 20 20 20 20 28 53 59 53  ntial",     (SYS
8c50: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
8c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
8c70: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
8c80: 65 20 6f 73 55 75 69 64 43 72 65 61 74 65 53 65  e osUuidCreateSe
8c90: 71 75 65 6e 74 69 61 6c 20 5c 0a 20 20 20 20 20  quential \.     
8ca0: 20 20 20 28 28 52 50 43 5f 53 54 41 54 55 53 28     ((RPC_STATUS(
8cb0: 52 50 43 5f 45 4e 54 52 59 2a 29 28 55 55 49 44  RPC_ENTRY*)(UUID
8cc0: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 37 38 5d 2e  *))aSyscall[78].
8cd0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
8ce0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e  defined(SQLITE_N
8cf0: 4f 5f 53 59 4e 43 29 20 26 26 20 53 51 4c 49 54  O_SYNC) && SQLIT
8d00: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
8d10: 30 0a 20 20 7b 20 22 46 6c 75 73 68 56 69 65 77  0.  { "FlushView
8d20: 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  OfFile",        
8d30: 20 20 28 53 59 53 43 41 4c 4c 29 46 6c 75 73 68    (SYSCALL)Flush
8d40: 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20  ViewOfFile,     
8d50: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
8d60: 7b 20 22 46 6c 75 73 68 56 69 65 77 4f 66 46 69  { "FlushViewOfFi
8d70: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  le",          (S
8d80: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
8d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
8da0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
8db0: 69 6e 65 20 6f 73 46 6c 75 73 68 56 69 65 77 4f  ine osFlushViewO
8dc0: 66 46 69 6c 65 20 5c 0a 20 20 20 20 20 20 20 20  fFile \.        
8dd0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
8de0: 4c 50 43 56 4f 49 44 2c 53 49 5a 45 5f 54 29 29  LPCVOID,SIZE_T))
8df0: 61 53 79 73 63 61 6c 6c 5b 37 39 5d 2e 70 43 75  aSyscall[79].pCu
8e00: 72 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e  rrent)..}; /* En
8e10: 64 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64  d of the overrid
8e20: 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c  eable system cal
8e30: 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ls */../*.** Thi
8e40: 73 20 69 73 20 74 68 65 20 78 53 65 74 53 79 73  s is the xSetSys
8e50: 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64  temCall() method
8e60: 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20   of sqlite3_vfs 
8e70: 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a  for all of the.*
8e80: 2a 20 22 77 69 6e 33 32 22 20 56 46 53 65 73 2e  * "win32" VFSes.
8e90: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
8ea0: 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66  OK opon successf
8eb0: 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68  ully updating th
8ec0: 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c  e.** system call
8ed0: 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c   pointer, or SQL
8ee0: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20  ITE_NOTFOUND if 
8ef0: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66  there is no conf
8f00: 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74  igurable.** syst
8f10: 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e  em call named zN
8f20: 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame..*/.static i
8f30: 6e 74 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43  nt winSetSystemC
8f40: 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  all(.  sqlite3_v
8f50: 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20  fs *pNotUsed,   
8f60: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20       /* The VFS 
8f70: 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73  pointer.  Not us
8f80: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
8f90: 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20  ar *zName,      
8fa0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
8fb0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20   system call to 
8fc0: 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71  override */.  sq
8fd0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
8fe0: 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50  r pNewFunc  /* P
8ff0: 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79  ointer to new sy
9000: 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20  stem call value 
9010: 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
9020: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63   int i;.  int rc
9030: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55   = SQLITE_NOTFOU
9040: 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  ND;..  UNUSED_PA
9050: 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64  RAMETER(pNotUsed
9060: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  );.  if( zName==
9070: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e  0 ){.    /* If n
9080: 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e  o zName is given
9090: 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79  , restore all sy
90a0: 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68  stem calls to th
90b0: 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20  eir default.    
90c0: 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20  ** settings and 
90d0: 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20  return NULL.    
90e0: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
90f0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69  TE_OK;.    for(i
9100: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
9110: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
9120: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
9130: 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53 79 73  {.      if( aSys
9140: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
9150: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73   ){.        aSys
9160: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
9170: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
9180: 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d  Default;.      }
9190: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
91a0: 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20      /* If zName 
91b0: 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70  is specified, op
91c0: 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68  erate on only th
91d0: 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c  e one system cal
91e0: 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69  l.    ** specifi
91f0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ed..    */.    f
9200: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
9210: 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f  (aSyscall)/sizeo
9220: 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20  f(aSyscall[0]); 
9230: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
9240: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53  strcmp(zName, aS
9250: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  yscall[i].zName)
9260: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
9270: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
9280: 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20  Default==0 ){.  
9290: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
92a0: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61  [i].pDefault = a
92b0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
92c0: 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ent;.        }. 
92d0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
92e0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69  TE_OK;.        i
92f0: 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29  f( pNewFunc==0 )
9300: 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73   pNewFunc = aSys
9310: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
9320: 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61  ;.        aSysca
9330: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d  ll[i].pCurrent =
9340: 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20   pNewFunc;.     
9350: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9360: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
9370: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
9380: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
9390: 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63  ue of a system c
93a0: 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  all.  Return NUL
93b0: 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f  L if zName is no
93c0: 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65  t a.** recognize
93d0: 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61  d system call na
93e0: 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73  me.  NULL is als
93f0: 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  o returned if th
9400: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a  e system call.**
9410: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e   is currently un
9420: 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
9430: 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  ic sqlite3_sysca
9440: 6c 6c 5f 70 74 72 20 77 69 6e 47 65 74 53 79 73  ll_ptr winGetSys
9450: 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74  temCall(.  sqlit
9460: 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64  e3_vfs *pNotUsed
9470: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
9480: 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67  zName.){.  unsig
9490: 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e  ned int i;..  UN
94a0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
94b0: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28  NotUsed);.  for(
94c0: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
94d0: 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61  yscall)/sizeof(a
94e0: 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b  Syscall[0]); i++
94f0: 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
9500: 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c  p(zName, aSyscal
9510: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[i].zName)==0 )
9520: 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c   return aSyscall
9530: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20  [i].pCurrent;.  
9540: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
9550: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
9560: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
9570: 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  rst system call 
9580: 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66  after zName.  If
9590: 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20   zName==NULL.** 
95a0: 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20  then return the 
95b0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73  name of the firs
95c0: 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20  t system call.  
95d0: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a  Return NULL if z
95e0: 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c  Name.** is the l
95f0: 61 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  ast system call 
9600: 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e  or if zName is n
9610: 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ot the name of a
9620: 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d   valid.** system
9630: 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   call..*/.static
9640: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 69 6e   const char *win
9650: 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73  NextSystemCall(s
9660: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63  qlite3_vfs *p, c
9670: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
9680: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b  ){.  int i = -1;
9690: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
96a0: 45 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a  ETER(p);.  if( z
96b0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28  Name ){.    for(
96c0: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
96d0: 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b  (aSyscall)-1; i+
96e0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
96f0: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
9700: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
9710: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
9720: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20  .  }.  for(i++; 
9730: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73  i<ArraySize(aSys
9740: 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  call); i++){.   
9750: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
9760: 2e 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72  .pCurrent!=0 ) r
9770: 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69  eturn aSyscall[i
9780: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72  ].zName;.  }.  r
9790: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64  eturn 0;.}..#ifd
97a0: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
97b0: 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 49 66 20  MALLOC./*.** If 
97c0: 61 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68  a Win32 native h
97d0: 65 61 70 20 68 61 73 20 62 65 65 6e 20 63 6f 6e  eap has been con
97e0: 66 69 67 75 72 65 64 2c 20 74 68 69 73 20 66 75  figured, this fu
97f0: 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 61 74 74 65  nction will atte
9800: 6d 70 74 20 74 6f 0a 2a 2a 20 63 6f 6d 70 61 63  mpt to.** compac
9810: 74 20 69 74 2e 20 20 55 70 6f 6e 20 73 75 63 63  t it.  Upon succ
9820: 65 73 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 77  ess, SQLITE_OK w
9830: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e  ill be returned.
9840: 20 20 55 70 6f 6e 20 66 61 69 6c 75 72 65 2c 20    Upon failure, 
9850: 6f 6e 65 0a 2a 2a 20 6f 66 20 53 51 4c 49 54 45  one.** of SQLITE
9860: 5f 4e 4f 4d 45 4d 2c 20 53 51 4c 49 54 45 5f 45  _NOMEM, SQLITE_E
9870: 52 52 4f 52 2c 20 6f 72 20 53 51 4c 49 54 45 5f  RROR, or SQLITE_
9880: 4e 4f 54 46 4f 55 4e 44 20 77 69 6c 6c 20 62 65  NOTFOUND will be
9890: 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68 65 0a   returned.  The.
98a0: 2a 2a 20 22 70 6e 4c 61 72 67 65 73 74 22 20 61  ** "pnLargest" a
98b0: 72 67 75 6d 65 6e 74 2c 20 69 66 20 6e 6f 6e 2d  rgument, if non-
98c0: 7a 65 72 6f 2c 20 77 69 6c 6c 20 62 65 20 75 73  zero, will be us
98d0: 65 64 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65  ed to return the
98e0: 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
98f0: 6c 61 72 67 65 73 74 20 63 6f 6d 6d 69 74 74 65  largest committe
9900: 64 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 6e 20  d free block in 
9910: 74 68 65 20 68 65 61 70 2c 20 69 6e 20 62 79 74  the heap, in byt
9920: 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
9930: 65 33 5f 77 69 6e 33 32 5f 63 6f 6d 70 61 63 74  e3_win32_compact
9940: 5f 68 65 61 70 28 4c 50 55 49 4e 54 20 70 6e 4c  _heap(LPUINT pnL
9950: 61 72 67 65 73 74 29 7b 0a 20 20 69 6e 74 20 72  argest){.  int r
9960: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
9970: 20 55 49 4e 54 20 6e 4c 61 72 67 65 73 74 20 3d   UINT nLargest =
9980: 20 30 3b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65   0;.  HANDLE hHe
9990: 61 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73  ap;..  winMemAss
99a0: 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48  ertMagic();.  hH
99b0: 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48  eap = winMemGetH
99c0: 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28  eap();.  assert(
99d0: 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61   hHeap!=0 );.  a
99e0: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e  ssert( hHeap!=IN
99f0: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
9a00: 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54  UE );.#if !SQLIT
9a10: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
9a20: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
9a30: 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41  32_MALLOC_VALIDA
9a40: 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73  TE).  assert( os
9a50: 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65  HeapValidate(hHe
9a60: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
9a70: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c  _HEAP_FLAGS, NUL
9a80: 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  L) );.#endif.#if
9a90: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
9aa0: 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
9ab0: 57 49 4e 52 54 0a 20 20 69 66 28 20 28 6e 4c 61  WINRT.  if( (nLa
9ac0: 72 67 65 73 74 3d 6f 73 48 65 61 70 43 6f 6d 70  rgest=osHeapComp
9ad0: 61 63 74 28 68 48 65 61 70 2c 20 53 51 4c 49 54  act(hHeap, SQLIT
9ae0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
9af0: 47 53 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 44  GS))==0 ){.    D
9b00: 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d  WORD lastErrno =
9b10: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
9b20: 29 3b 0a 20 20 20 20 69 66 28 20 6c 61 73 74 45  );.    if( lastE
9b30: 72 72 6e 6f 3d 3d 4e 4f 5f 45 52 52 4f 52 20 29  rrno==NO_ERROR )
9b40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
9b50: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  log(SQLITE_NOMEM
9b60: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61  , "failed to Hea
9b70: 70 43 6f 6d 70 61 63 74 20 28 6e 6f 20 73 70 61  pCompact (no spa
9b80: 63 65 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20  ce), heap=%p",. 
9b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ba0: 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a   (void*)hHeap);.
9bb0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
9bc0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
9bd0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
9be0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 45 52 52  3_log(SQLITE_ERR
9bf0: 4f 52 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48  OR, "failed to H
9c00: 65 61 70 43 6f 6d 70 61 63 74 20 28 25 6c 75 29  eapCompact (%lu)
9c10: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20  , heap=%p",.    
9c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
9c30: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
9c40: 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20  (void*)hHeap);. 
9c50: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
9c60: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
9c70: 7d 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65  }.#else.  sqlite
9c80: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54  3_log(SQLITE_NOT
9c90: 46 4f 55 4e 44 2c 20 22 66 61 69 6c 65 64 20 74  FOUND, "failed t
9ca0: 6f 20 48 65 61 70 43 6f 6d 70 61 63 74 2c 20 68  o HeapCompact, h
9cb0: 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20  eap=%p",.       
9cc0: 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68 48         (void*)hH
9cd0: 65 61 70 29 3b 0a 20 20 72 63 20 3d 20 53 51 4c  eap);.  rc = SQL
9ce0: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 23 65  ITE_NOTFOUND;.#e
9cf0: 6e 64 69 66 0a 20 20 69 66 28 20 70 6e 4c 61 72  ndif.  if( pnLar
9d00: 67 65 73 74 20 29 20 2a 70 6e 4c 61 72 67 65 73  gest ) *pnLarges
9d10: 74 20 3d 20 6e 4c 61 72 67 65 73 74 3b 0a 20 20  t = nLargest;.  
9d20: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
9d30: 0a 2a 2a 20 49 66 20 61 20 57 69 6e 33 32 20 6e  .** If a Win32 n
9d40: 61 74 69 76 65 20 68 65 61 70 20 68 61 73 20 62  ative heap has b
9d50: 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20  een configured, 
9d60: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
9d70: 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a  ll attempt to.**
9d80: 20 64 65 73 74 72 6f 79 20 61 6e 64 20 72 65 63   destroy and rec
9d90: 72 65 61 74 65 20 69 74 2e 20 20 49 66 20 74 68  reate it.  If th
9da0: 65 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68  e Win32 native h
9db0: 65 61 70 20 69 73 20 6e 6f 74 20 69 73 6f 6c 61  eap is not isola
9dc0: 74 65 64 20 61 6e 64 2f 6f 72 0a 2a 2a 20 74 68  ted and/or.** th
9dd0: 65 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79  e sqlite3_memory
9de0: 5f 75 73 65 64 28 29 20 66 75 6e 63 74 69 6f 6e  _used() function
9df0: 20 64 6f 65 73 20 6e 6f 74 20 72 65 74 75 72 6e   does not return
9e00: 20 7a 65 72 6f 2c 20 53 51 4c 49 54 45 5f 42 55   zero, SQLITE_BU
9e10: 53 59 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 72 65  SY will.** be re
9e20: 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 63 68  turned and no ch
9e30: 61 6e 67 65 73 20 77 69 6c 6c 20 62 65 20 6d 61  anges will be ma
9e40: 64 65 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20  de to the Win32 
9e50: 6e 61 74 69 76 65 20 68 65 61 70 2e 0a 2a 2f 0a  native heap..*/.
9e60: 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  int sqlite3_win3
9e70: 32 5f 72 65 73 65 74 5f 68 65 61 70 28 29 7b 0a  2_reset_heap(){.
9e80: 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 55 54 45    int rc;.  MUTE
9e90: 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
9ea0: 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b  _mutex *pMaster;
9eb0: 20 29 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 73   ) /* The main s
9ec0: 74 61 74 69 63 20 6d 75 74 65 78 20 2a 2f 0a 20  tatic mutex */. 
9ed0: 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
9ee0: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 65  lite3_mutex *pMe
9ef0: 6d 3b 20 29 20 20 20 20 2f 2a 20 54 68 65 20 6d  m; )    /* The m
9f00: 65 6d 73 79 73 20 73 74 61 74 69 63 20 6d 75 74  emsys static mut
9f10: 65 78 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f  ex */.  MUTEX_LO
9f20: 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73  GIC( pMaster = s
9f30: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
9f40: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
9f50: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20  STATIC_MASTER); 
9f60: 29 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  ).  MUTEX_LOGIC(
9f70: 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 5f   pMem = sqlite3_
9f80: 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
9f90: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
9fa0: 4d 45 4d 29 3b 20 29 0a 20 20 73 71 6c 69 74 65  MEM); ).  sqlite
9fb0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
9fc0: 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  aster);.  sqlite
9fd0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
9fe0: 65 6d 29 3b 0a 20 20 77 69 6e 4d 65 6d 41 73 73  em);.  winMemAss
9ff0: 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 69 66  ertMagic();.  if
a000: 28 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  ( winMemGetHeap(
a010: 29 21 3d 4e 55 4c 4c 20 26 26 20 77 69 6e 4d 65  )!=NULL && winMe
a020: 6d 47 65 74 4f 77 6e 65 64 28 29 20 26 26 20 73  mGetOwned() && s
a030: 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73  qlite3_memory_us
a040: 65 64 28 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  ed()==0 ){.    /
a050: 2a 0a 20 20 20 20 2a 2a 20 41 74 20 74 68 69 73  *.    ** At this
a060: 20 70 6f 69 6e 74 2c 20 74 68 65 72 65 20 73 68   point, there sh
a070: 6f 75 6c 64 20 62 65 20 6e 6f 20 6f 75 74 73 74  ould be no outst
a080: 61 6e 64 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c  anding memory al
a090: 6c 6f 63 61 74 69 6f 6e 73 20 6f 6e 0a 20 20 20  locations on.   
a0a0: 20 2a 2a 20 74 68 65 20 68 65 61 70 2e 20 20 41   ** the heap.  A
a0b0: 6c 73 6f 2c 20 73 69 6e 63 65 20 62 6f 74 68 20  lso, since both 
a0c0: 74 68 65 20 6d 61 73 74 65 72 20 61 6e 64 20 6d  the master and m
a0d0: 65 6d 73 79 73 20 6c 6f 63 6b 73 20 61 72 65 20  emsys locks are 
a0e0: 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20 2a 2a  currently.    **
a0f0: 20 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20 75   being held by u
a100: 73 2c 20 6e 6f 20 6f 74 68 65 72 20 66 75 6e 63  s, no other func
a110: 74 69 6f 6e 20 28 69 2e 65 2e 20 66 72 6f 6d 20  tion (i.e. from 
a120: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 29 20  another thread) 
a130: 73 68 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65  should.    ** be
a140: 20 61 62 6c 65 20 74 6f 20 65 76 65 6e 20 61 63   able to even ac
a150: 63 65 73 73 20 74 68 65 20 68 65 61 70 2e 20 20  cess the heap.  
a160: 41 74 74 65 6d 70 74 20 74 6f 20 64 65 73 74 72  Attempt to destr
a170: 6f 79 20 61 6e 64 20 72 65 63 72 65 61 74 65 20  oy and recreate 
a180: 6f 75 72 0a 20 20 20 20 2a 2a 20 69 73 6f 6c 61  our.    ** isola
a190: 74 65 64 20 57 69 6e 33 32 20 6e 61 74 69 76 65  ted Win32 native
a1a0: 20 68 65 61 70 20 6e 6f 77 2e 0a 20 20 20 20 2a   heap now..    *
a1b0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 69  /.    assert( wi
a1c0: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 21 3d 4e  nMemGetHeap()!=N
a1d0: 55 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ULL );.    asser
a1e0: 74 28 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65  t( winMemGetOwne
a1f0: 64 28 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  d() );.    asser
a200: 74 28 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72  t( sqlite3_memor
a210: 79 5f 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20  y_used()==0 );. 
a220: 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77     winMemShutdow
a230: 6e 28 77 69 6e 4d 65 6d 47 65 74 44 61 74 61 50  n(winMemGetDataP
a240: 74 72 28 29 29 3b 0a 20 20 20 20 61 73 73 65 72  tr());.    asser
a250: 74 28 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70  t( winMemGetHeap
a260: 28 29 3d 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  ()==NULL );.    
a270: 61 73 73 65 72 74 28 20 21 77 69 6e 4d 65 6d 47  assert( !winMemG
a280: 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20 20  etOwned() );.   
a290: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a2a0: 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d  _memory_used()==
a2b0: 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 69  0 );.    rc = wi
a2c0: 6e 4d 65 6d 49 6e 69 74 28 77 69 6e 4d 65 6d 47  nMemInit(winMemG
a2d0: 65 74 44 61 74 61 50 74 72 28 29 29 3b 0a 20 20  etDataPtr());.  
a2e0: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
a2f0: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 77 69 6e 4d 65  LITE_OK || winMe
a300: 6d 47 65 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c  mGetHeap()!=NULL
a310: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
a320: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
a330: 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28   winMemGetOwned(
a340: 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
a350: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
a360: 7c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79  | sqlite3_memory
a370: 5f 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20 20  _used()==0 );.  
a380: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 0a 20 20  }else{.    /*.  
a390: 20 20 2a 2a 20 54 68 65 20 57 69 6e 33 32 20 6e    ** The Win32 n
a3a0: 61 74 69 76 65 20 68 65 61 70 20 63 61 6e 6e 6f  ative heap canno
a3b0: 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20 62 65  t be modified be
a3c0: 63 61 75 73 65 20 69 74 20 6d 61 79 20 62 65 20  cause it may be 
a3d0: 69 6e 20 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  in use..    */. 
a3e0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
a3f0: 55 53 59 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  USY;.  }.  sqlit
a400: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
a410: 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Mem);.  sqlite3_
a420: 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
a430: 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ter);.  return r
a440: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
a450: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
a460: 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OC */../*.** Thi
a470: 73 20 66 75 6e 63 74 69 6f 6e 20 6f 75 74 70 75  s function outpu
a480: 74 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ts the specified
a490: 20 28 41 4e 53 49 29 20 73 74 72 69 6e 67 20 74   (ANSI) string t
a4a0: 6f 20 74 68 65 20 57 69 6e 33 32 20 64 65 62 75  o the Win32 debu
a4b0: 67 67 65 72 0a 2a 2a 20 28 69 66 20 61 76 61 69  gger.** (if avai
a4c0: 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 0a 76 6f 69 64  lable)..*/..void
a4d0: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77   sqlite3_win32_w
a4e0: 72 69 74 65 5f 64 65 62 75 67 28 63 6f 6e 73 74  rite_debug(const
a4f0: 20 63 68 61 72 20 2a 7a 42 75 66 2c 20 69 6e 74   char *zBuf, int
a500: 20 6e 42 75 66 29 7b 0a 20 20 63 68 61 72 20 7a   nBuf){.  char z
a510: 44 62 67 42 75 66 5b 53 51 4c 49 54 45 5f 57 49  DbgBuf[SQLITE_WI
a520: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
a530: 5d 3b 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20  ];.  int nMin = 
a540: 4d 49 4e 28 6e 42 75 66 2c 20 28 53 51 4c 49 54  MIN(nBuf, (SQLIT
a550: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
a560: 53 49 5a 45 20 2d 20 31 29 29 3b 20 2f 2a 20 6d  SIZE - 1)); /* m
a570: 61 79 20 62 65 20 6e 65 67 61 74 69 76 65 2e 20  ay be negative. 
a580: 2a 2f 0a 20 20 69 66 28 20 6e 4d 69 6e 3c 2d 31  */.  if( nMin<-1
a590: 20 29 20 6e 4d 69 6e 20 3d 20 2d 31 3b 20 2f 2a   ) nMin = -1; /*
a5a0: 20 61 6c 6c 20 6e 65 67 61 74 69 76 65 20 76 61   all negative va
a5b0: 6c 75 65 73 20 62 65 63 6f 6d 65 20 2d 31 2e 20  lues become -1. 
a5c0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 69  */.  assert( nMi
a5d0: 6e 3d 3d 2d 31 20 7c 7c 20 6e 4d 69 6e 3d 3d 30  n==-1 || nMin==0
a5e0: 20 7c 7c 20 6e 4d 69 6e 3c 53 51 4c 49 54 45 5f   || nMin<SQLITE_
a5f0: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
a600: 5a 45 20 29 3b 0a 23 69 66 20 64 65 66 69 6e 65  ZE );.#if define
a610: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
a620: 41 53 5f 41 4e 53 49 29 0a 20 20 69 66 28 20 6e  AS_ANSI).  if( n
a630: 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d  Min>0 ){.    mem
a640: 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20  set(zDbgBuf, 0, 
a650: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47  SQLITE_WIN32_DBG
a660: 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20  _BUF_SIZE);.    
a670: 6d 65 6d 63 70 79 28 7a 44 62 67 42 75 66 2c 20  memcpy(zDbgBuf, 
a680: 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20  zBuf, nMin);.   
a690: 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74   osOutputDebugSt
a6a0: 72 69 6e 67 41 28 7a 44 62 67 42 75 66 29 3b 0a  ringA(zDbgBuf);.
a6b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 73 4f    }else{.    osO
a6c0: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
a6d0: 41 28 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6c  A(zBuf);.  }.#el
a6e0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
a6f0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
a700: 29 0a 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42  ).  memset(zDbgB
a710: 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49  uf, 0, SQLITE_WI
a720: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
a730: 29 3b 0a 20 20 69 66 20 28 20 6f 73 4d 75 6c 74  );.  if ( osMult
a740: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
a750: 0a 20 20 20 20 20 20 20 20 20 20 6f 73 41 72 65  .          osAre
a760: 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f  FileApisANSI() ?
a770: 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d   CP_ACP : CP_OEM
a780: 43 50 2c 20 30 2c 20 7a 42 75 66 2c 0a 20 20 20  CP, 0, zBuf,.   
a790: 20 20 20 20 20 20 20 6e 4d 69 6e 2c 20 28 4c 50         nMin, (LP
a7a0: 57 53 54 52 29 7a 44 62 67 42 75 66 2c 20 53 51  WSTR)zDbgBuf, SQ
a7b0: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
a7c0: 55 46 5f 53 49 5a 45 2f 73 69 7a 65 6f 66 28 57  UF_SIZE/sizeof(W
a7d0: 43 48 41 52 29 29 3c 3d 30 20 29 7b 0a 20 20 20  CHAR))<=0 ){.   
a7e0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f   return;.  }.  o
a7f0: 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  sOutputDebugStri
a800: 6e 67 57 28 28 4c 50 43 57 53 54 52 29 7a 44 62  ngW((LPCWSTR)zDb
a810: 67 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69  gBuf);.#else.  i
a820: 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20 20  f( nMin>0 ){.   
a830: 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c   memset(zDbgBuf,
a840: 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   0, SQLITE_WIN32
a850: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a  _DBG_BUF_SIZE);.
a860: 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 67 42      memcpy(zDbgB
a870: 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b  uf, zBuf, nMin);
a880: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
a890: 65 72 72 2c 20 22 25 73 22 2c 20 7a 44 62 67 42  err, "%s", zDbgB
a8a0: 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  uf);.  }else{.  
a8b0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
a8c0: 2c 20 22 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20  , "%s", zBuf);. 
a8d0: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
a8e0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
a8f0: 20 72 6f 75 74 69 6e 65 20 73 75 73 70 65 6e 64   routine suspend
a900: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  s the current th
a910: 72 65 61 64 20 66 6f 72 20 61 74 20 6c 65 61 73  read for at leas
a920: 74 20 6d 73 0a 2a 2a 20 6d 69 6c 6c 69 73 65 63  t ms.** millisec
a930: 6f 6e 64 73 2e 20 20 54 68 69 73 20 69 73 20 65  onds.  This is e
a940: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65  quivalent to the
a950: 20 57 69 6e 33 32 20 53 6c 65 65 70 28 29 20 69   Win32 Sleep() i
a960: 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66  nterface..*/.#if
a970: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
a980: 0a 73 74 61 74 69 63 20 48 41 4e 44 4c 45 20 73  .static HANDLE s
a990: 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a  leepObj = NULL;.
a9a0: 23 65 6e 64 69 66 0a 0a 76 6f 69 64 20 73 71 6c  #endif..void sql
a9b0: 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70  ite3_win32_sleep
a9c0: 28 44 57 4f 52 44 20 6d 69 6c 6c 69 73 65 63 6f  (DWORD milliseco
a9d0: 6e 64 73 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  nds){.#if SQLITE
a9e0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 20 28  _OS_WINRT.  if (
a9f0: 20 73 6c 65 65 70 4f 62 6a 3d 3d 4e 55 4c 4c 20   sleepObj==NULL 
aa00: 29 7b 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a 20  ){.    sleepObj 
aa10: 3d 20 6f 73 43 72 65 61 74 65 45 76 65 6e 74 45  = osCreateEventE
aa20: 78 57 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 43  xW(NULL, NULL, C
aa30: 52 45 41 54 45 5f 45 56 45 4e 54 5f 4d 41 4e 55  REATE_EVENT_MANU
aa40: 41 4c 5f 52 45 53 45 54 2c 0a 20 20 20 20 20 20  AL_RESET,.      
aa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa60: 20 20 20 20 20 20 20 20 20 20 53 59 4e 43 48 52            SYNCHR
aa70: 4f 4e 49 5a 45 29 3b 0a 20 20 7d 0a 20 20 61 73  ONIZE);.  }.  as
aa80: 73 65 72 74 28 20 73 6c 65 65 70 4f 62 6a 21 3d  sert( sleepObj!=
aa90: 4e 55 4c 4c 20 29 3b 0a 20 20 6f 73 57 61 69 74  NULL );.  osWait
aaa0: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45  ForSingleObjectE
aab0: 78 28 73 6c 65 65 70 4f 62 6a 2c 20 6d 69 6c 6c  x(sleepObj, mill
aac0: 69 73 65 63 6f 6e 64 73 2c 20 46 41 4c 53 45 29  iseconds, FALSE)
aad0: 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 53 6c 65 65  ;.#else.  osSlee
aae0: 70 28 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 3b  p(milliseconds);
aaf0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 20 53  .#endif.}..#if S
ab00: 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52  QLITE_MAX_WORKER
ab10: 5f 54 48 52 45 41 44 53 3e 30 20 26 26 20 21 53  _THREADS>0 && !S
ab20: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
ab30: 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
ab40: 52 54 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20  RT && \.        
ab50: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
ab60: 45 3e 30 0a 44 57 4f 52 44 20 73 71 6c 69 74 65  E>0.DWORD sqlite
ab70: 33 57 69 6e 33 32 57 61 69 74 28 48 41 4e 44 4c  3Win32Wait(HANDL
ab80: 45 20 68 4f 62 6a 65 63 74 29 7b 0a 20 20 44 57  E hObject){.  DW
ab90: 4f 52 44 20 72 63 3b 0a 20 20 77 68 69 6c 65 28  ORD rc;.  while(
aba0: 20 28 72 63 20 3d 20 6f 73 57 61 69 74 46 6f 72   (rc = osWaitFor
abb0: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 28 68  SingleObjectEx(h
abc0: 4f 62 6a 65 63 74 2c 20 49 4e 46 49 4e 49 54 45  Object, INFINITE
abd0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
abe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abf0: 20 20 20 20 20 20 20 20 20 54 52 55 45 29 29 3d           TRUE))=
ac00: 3d 57 41 49 54 5f 49 4f 5f 43 4f 4d 50 4c 45 54  =WAIT_IO_COMPLET
ac10: 49 4f 4e 20 29 7b 7d 0a 20 20 72 65 74 75 72 6e  ION ){}.  return
ac20: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
ac30: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
ac40: 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 77   (non-zero) if w
ac50: 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 75 6e  e are running un
ac60: 64 65 72 20 57 69 6e 4e 54 2c 20 57 69 6e 32 4b  der WinNT, Win2K
ac70: 2c 20 57 69 6e 58 50 2c 0a 2a 2a 20 6f 72 20 57  , WinXP,.** or W
ac80: 69 6e 43 45 2e 20 20 52 65 74 75 72 6e 20 66 61  inCE.  Return fa
ac90: 6c 73 65 20 28 7a 65 72 6f 29 20 66 6f 72 20 57  lse (zero) for W
aca0: 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 6f 72 20  in95, Win98, or 
acb0: 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65 72  WinME..**.** Her
acc0: 65 20 69 73 20 61 6e 20 69 6e 74 65 72 65 73 74  e is an interest
acd0: 69 6e 67 20 6f 62 73 65 72 76 61 74 69 6f 6e 3a  ing observation:
ace0: 20 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20    Win95, Win98, 
acf0: 61 6e 64 20 57 69 6e 4d 45 20 6c 61 63 6b 0a 2a  and WinME lack.*
ad00: 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78  * the LockFileEx
ad10: 28 29 20 41 50 49 2e 20 20 42 75 74 20 77 65 20  () API.  But we 
ad20: 63 61 6e 20 73 74 69 6c 6c 20 73 74 61 74 69 63  can still static
ad30: 61 6c 6c 79 20 6c 69 6e 6b 20 61 67 61 69 6e 73  ally link agains
ad40: 74 20 74 68 61 74 0a 2a 2a 20 41 50 49 20 61 73  t that.** API as
ad50: 20 6c 6f 6e 67 20 61 73 20 77 65 20 64 6f 6e 27   long as we don'
ad60: 74 20 63 61 6c 6c 20 69 74 20 77 68 65 6e 20 72  t call it when r
ad70: 75 6e 6e 69 6e 67 20 57 69 6e 39 35 2f 39 38 2f  unning Win95/98/
ad80: 4d 45 2e 20 20 41 20 63 61 6c 6c 20 74 6f 0a 2a  ME.  A call to.*
ad90: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
ada0: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
adb0: 69 6e 65 20 69 66 20 74 68 65 20 68 6f 73 74 20  ine if the host 
adc0: 69 73 20 57 69 6e 39 35 2f 39 38 2f 4d 45 20 6f  is Win95/98/ME o
add0: 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58 50  r.** WinNT/2K/XP
ade0: 20 73 6f 20 74 68 61 74 20 77 65 20 77 69 6c 6c   so that we will
adf0: 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72   know whether or
ae00: 20 6e 6f 74 20 77 65 20 63 61 6e 20 73 61 66 65   not we can safe
ae10: 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c  ly call.** the L
ae20: 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e  ockFileEx() API.
ae30: 0a 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  .*/..#if !define
ae40: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47  d(SQLITE_WIN32_G
ae50: 45 54 56 45 52 53 49 4f 4e 45 58 29 20 7c 7c 20  ETVERSIONEX) || 
ae60: 21 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45  !SQLITE_WIN32_GE
ae70: 54 56 45 52 53 49 4f 4e 45 58 0a 23 20 64 65 66  TVERSIONEX.# def
ae80: 69 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28 31  ine osIsNT()  (1
ae90: 29 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 4f  ).#elif SQLITE_O
aea0: 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54  S_WINCE || SQLIT
aeb0: 45 5f 4f 53 5f 57 49 4e 52 54 20 7c 7c 20 21 64  E_OS_WINRT || !d
aec0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
aed0: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 23 20  N32_HAS_ANSI).# 
aee0: 64 65 66 69 6e 65 20 6f 73 49 73 4e 54 28 29 20  define osIsNT() 
aef0: 20 28 31 29 0a 23 65 6c 69 66 20 21 64 65 66 69   (1).#elif !defi
af00: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
af10: 5f 48 41 53 5f 57 49 44 45 29 0a 23 20 64 65 66  _HAS_WIDE).# def
af20: 69 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28 30  ine osIsNT()  (0
af30: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
af40: 20 6f 73 49 73 4e 54 28 29 20 20 28 28 73 71 6c   osIsNT()  ((sql
af50: 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 32 29  ite3_os_type==2)
af60: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 77 69 6e 33   || sqlite3_win3
af70: 32 5f 69 73 5f 6e 74 28 29 29 0a 23 65 6e 64 69  2_is_nt()).#endi
af80: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
af90: 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65  nction determine
afa0: 73 20 69 66 20 74 68 65 20 6d 61 63 68 69 6e 65  s if the machine
afb0: 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 20 76 65   is running a ve
afc0: 72 73 69 6f 6e 20 6f 66 20 57 69 6e 64 6f 77 73  rsion of Windows
afd0: 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20 74 68 65  .** based on the
afe0: 20 4e 54 20 6b 65 72 6e 65 6c 2e 0a 2a 2f 0a 69   NT kernel..*/.i
aff0: 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  nt sqlite3_win32
b000: 5f 69 73 5f 6e 74 28 76 6f 69 64 29 7b 0a 23 69  _is_nt(void){.#i
b010: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
b020: 54 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45  T.  /*.  ** NOTE
b030: 3a 20 54 68 65 20 57 69 6e 52 54 20 73 75 62 2d  : The WinRT sub-
b040: 70 6c 61 74 66 6f 72 6d 20 69 73 20 61 6c 77 61  platform is alwa
b050: 79 73 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65  ys assumed to be
b060: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 4e 54   based on the NT
b070: 0a 20 20 2a 2a 20 20 20 20 20 20 20 6b 65 72 6e  .  **       kern
b080: 65 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  el..  */.  retur
b090: 6e 20 31 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  n 1;.#elif defin
b0a0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
b0b0: 47 45 54 56 45 52 53 49 4f 4e 45 58 29 20 26 26  GETVERSIONEX) &&
b0c0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45   SQLITE_WIN32_GE
b0d0: 54 56 45 52 53 49 4f 4e 45 58 0a 20 20 69 66 28  TVERSIONEX.  if(
b0e0: 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f   osInterlockedCo
b0f0: 6d 70 61 72 65 45 78 63 68 61 6e 67 65 28 26 73  mpareExchange(&s
b100: 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20  qlite3_os_type, 
b110: 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 23 69 66 20  0, 0)==0 ){.#if 
b120: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
b130: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
b140: 20 20 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f     OSVERSIONINFO
b150: 41 20 73 49 6e 66 6f 3b 0a 20 20 20 20 73 49 6e  A sInfo;.    sIn
b160: 66 6f 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e  fo.dwOSVersionIn
b170: 66 6f 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28  foSize = sizeof(
b180: 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 47 65  sInfo);.    osGe
b190: 74 56 65 72 73 69 6f 6e 45 78 41 28 26 73 49 6e  tVersionExA(&sIn
b1a0: 66 6f 29 3b 0a 20 20 20 20 6f 73 49 6e 74 65 72  fo);.    osInter
b1b0: 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63  lockedCompareExc
b1c0: 68 61 6e 67 65 28 26 73 71 6c 69 74 65 33 5f 6f  hange(&sqlite3_o
b1d0: 73 5f 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20  s_type,.        
b1e0: 28 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72  (sInfo.dwPlatfor
b1f0: 6d 49 64 20 3d 3d 20 56 45 52 5f 50 4c 41 54 46  mId == VER_PLATF
b200: 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54 29 20 3f 20  ORM_WIN32_NT) ? 
b210: 32 20 3a 20 31 2c 20 30 29 3b 0a 23 65 6c 69 66  2 : 1, 0);.#elif
b220: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
b230: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
b240: 20 20 20 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46      OSVERSIONINF
b250: 4f 57 20 73 49 6e 66 6f 3b 0a 20 20 20 20 73 49  OW sInfo;.    sI
b260: 6e 66 6f 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49  nfo.dwOSVersionI
b270: 6e 66 6f 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66  nfoSize = sizeof
b280: 28 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 47  (sInfo);.    osG
b290: 65 74 56 65 72 73 69 6f 6e 45 78 57 28 26 73 49  etVersionExW(&sI
b2a0: 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 49 6e 74 65  nfo);.    osInte
b2b0: 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78  rlockedCompareEx
b2c0: 63 68 61 6e 67 65 28 26 73 71 6c 69 74 65 33 5f  change(&sqlite3_
b2d0: 6f 73 5f 74 79 70 65 2c 0a 20 20 20 20 20 20 20  os_type,.       
b2e0: 20 28 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f   (sInfo.dwPlatfo
b2f0: 72 6d 49 64 20 3d 3d 20 56 45 52 5f 50 4c 41 54  rmId == VER_PLAT
b300: 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54 29 20 3f  FORM_WIN32_NT) ?
b310: 20 32 20 3a 20 31 2c 20 30 29 3b 0a 23 65 6e 64   2 : 1, 0);.#end
b320: 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  if.  }.  return 
b330: 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d  osInterlockedCom
b340: 70 61 72 65 45 78 63 68 61 6e 67 65 28 26 73 71  pareExchange(&sq
b350: 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20 32  lite3_os_type, 2
b360: 2c 20 32 29 3d 3d 32 3b 0a 23 65 6c 69 66 20 53  , 2)==2;.#elif S
b370: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 72 65 74  QLITE_TEST.  ret
b380: 75 72 6e 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65  urn osInterlocke
b390: 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65  dCompareExchange
b3a0: 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  (&sqlite3_os_typ
b3b0: 65 2c 20 32 2c 20 32 29 3d 3d 32 3b 0a 23 65 6c  e, 2, 2)==2;.#el
b3c0: 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54  se.  /*.  ** NOT
b3d0: 45 3a 20 41 6c 6c 20 73 75 62 2d 70 6c 61 74 66  E: All sub-platf
b3e0: 6f 72 6d 73 20 77 68 65 72 65 20 74 68 65 20 47  orms where the G
b3f0: 65 74 56 65 72 73 69 6f 6e 45 78 5b 41 57 5d 20  etVersionEx[AW] 
b400: 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 0a 20 20  functions are.  
b410: 2a 2a 20 20 20 20 20 20 20 64 65 70 72 65 63 61  **       depreca
b420: 74 65 64 20 61 72 65 20 61 6c 77 61 79 73 20 61  ted are always a
b430: 73 73 75 6d 65 64 20 74 6f 20 62 65 20 62 61 73  ssumed to be bas
b440: 65 64 20 6f 6e 20 74 68 65 20 4e 54 20 6b 65 72  ed on the NT ker
b450: 6e 65 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  nel..  */.  retu
b460: 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 1;.#endif.}..
b470: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
b480: 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a  N32_MALLOC./*.**
b490: 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 73   Allocate nBytes
b4a0: 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73   of memory..*/.s
b4b0: 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d  tatic void *winM
b4c0: 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79  emMalloc(int nBy
b4d0: 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68  tes){.  HANDLE h
b4e0: 48 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b  Heap;.  void *p;
b4f0: 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ..  winMemAssert
b500: 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70  Magic();.  hHeap
b510: 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70   = winMemGetHeap
b520: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48  ();.  assert( hH
b530: 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  eap!=0 );.  asse
b540: 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c  rt( hHeap!=INVAL
b550: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
b560: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
b570: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
b580: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
b590: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29  MALLOC_VALIDATE)
b5a0: 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61  .  assert( osHea
b5b0: 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c  pValidate(hHeap,
b5c0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
b5d0: 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20  AP_FLAGS, NULL) 
b5e0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
b5f0: 72 74 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b  rt( nBytes>=0 );
b600: 0a 20 20 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c  .  p = osHeapAll
b610: 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  oc(hHeap, SQLITE
b620: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
b630: 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65  S, (SIZE_T)nByte
b640: 73 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a  s);.  if( !p ){.
b650: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
b660: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66  SQLITE_NOMEM, "f
b670: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 41 6c 6c  ailed to HeapAll
b680: 6f 63 20 25 75 20 62 79 74 65 73 20 28 25 6c 75  oc %u bytes (%lu
b690: 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  ), heap=%p",.   
b6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 42 79               nBy
b6b0: 74 65 73 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  tes, osGetLastEr
b6c0: 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48  ror(), (void*)hH
b6d0: 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  eap);.  }.  retu
b6e0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  rn p;.}../*.** F
b6f0: 72 65 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73  ree memory..*/.s
b700: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65  tatic void winMe
b710: 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69  mFree(void *pPri
b720: 6f 72 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48  or){.  HANDLE hH
b730: 65 61 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73  eap;..  winMemAs
b740: 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68  sertMagic();.  h
b750: 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74  Heap = winMemGet
b760: 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74  Heap();.  assert
b770: 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20  ( hHeap!=0 );.  
b780: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49  assert( hHeap!=I
b790: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
b7a0: 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49  LUE );.#if !SQLI
b7b0: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
b7c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
b7d0: 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44  N32_MALLOC_VALID
b7e0: 41 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f  ATE).  assert( o
b7f0: 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48  sHeapValidate(hH
b800: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
b810: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50  2_HEAP_FLAGS, pP
b820: 72 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a  rior) );.#endif.
b830: 20 20 69 66 28 20 21 70 50 72 69 6f 72 20 29 20    if( !pPrior ) 
b840: 72 65 74 75 72 6e 3b 20 2f 2a 20 50 61 73 73 69  return; /* Passi
b850: 6e 67 20 4e 55 4c 4c 20 74 6f 20 48 65 61 70 46  ng NULL to HeapF
b860: 72 65 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64  ree is undefined
b870: 2e 20 2a 2f 0a 20 20 69 66 28 20 21 6f 73 48 65  . */.  if( !osHe
b880: 61 70 46 72 65 65 28 68 48 65 61 70 2c 20 53 51  apFree(hHeap, SQ
b890: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
b8a0: 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29  FLAGS, pPrior) )
b8b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
b8c0: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  g(SQLITE_NOMEM, 
b8d0: 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 46  "failed to HeapF
b8e0: 72 65 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 6c  ree block %p (%l
b8f0: 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  u), heap=%p",.  
b900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
b910: 72 69 6f 72 2c 20 6f 73 47 65 74 4c 61 73 74 45  rior, osGetLastE
b920: 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68  rror(), (void*)h
b930: 48 65 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Heap);.  }.}../*
b940: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73  .** Change the s
b950: 69 7a 65 20 6f 66 20 61 6e 20 65 78 69 73 74 69  ize of an existi
b960: 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ng memory alloca
b970: 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
b980: 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c  oid *winMemReall
b990: 6f 63 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c  oc(void *pPrior,
b9a0: 20 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20   int nBytes){.  
b9b0: 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20  HANDLE hHeap;.  
b9c0: 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d  void *p;..  winM
b9d0: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b  emAssertMagic();
b9e0: 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65  .  hHeap = winMe
b9f0: 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73  mGetHeap();.  as
ba00: 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29  sert( hHeap!=0 )
ba10: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
ba20: 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  p!=INVALID_HANDL
ba30: 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21  E_VALUE );.#if !
ba40: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
ba50: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
ba60: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
ba70: 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72  ALIDATE).  asser
ba80: 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74  t( osHeapValidat
ba90: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
baa0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
bab0: 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e  , pPrior) );.#en
bac0: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42  dif.  assert( nB
bad0: 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20 69 66 28  ytes>=0 );.  if(
bae0: 20 21 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20   !pPrior ){.    
baf0: 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28  p = osHeapAlloc(
bb00: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
bb10: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
bb20: 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b  (SIZE_T)nBytes);
bb30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
bb40: 3d 20 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63 28  = osHeapReAlloc(
bb50: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
bb60: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
bb70: 70 50 72 69 6f 72 2c 20 28 53 49 5a 45 5f 54 29  pPrior, (SIZE_T)
bb80: 6e 42 79 74 65 73 29 3b 0a 20 20 7d 0a 20 20 69  nBytes);.  }.  i
bb90: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c  f( !p ){.    sql
bba0: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
bbb0: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74  NOMEM, "failed t
bbc0: 6f 20 25 73 20 25 75 20 62 79 74 65 73 20 28 25  o %s %u bytes (%
bbd0: 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20  lu), heap=%p",. 
bbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
bbf0: 50 72 69 6f 72 20 3f 20 22 48 65 61 70 52 65 41  Prior ? "HeapReA
bc00: 6c 6c 6f 63 22 20 3a 20 22 48 65 61 70 41 6c 6c  lloc" : "HeapAll
bc10: 6f 63 22 2c 20 6e 42 79 74 65 73 2c 20 6f 73 47  oc", nBytes, osG
bc20: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
bc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
bc40: 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20  void*)hHeap);.  
bc50: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
bc60: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
bc70: 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 6f 75 74  e size of an out
bc80: 73 74 61 6e 64 69 6e 67 20 61 6c 6c 6f 63 61 74  standing allocat
bc90: 69 6f 6e 2c 20 69 6e 20 62 79 74 65 73 2e 0a 2a  ion, in bytes..*
bca0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
bcb0: 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70 29  MemSize(void *p)
bcc0: 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70  {.  HANDLE hHeap
bcd0: 3b 0a 20 20 53 49 5a 45 5f 54 20 6e 3b 0a 0a 20  ;.  SIZE_T n;.. 
bce0: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
bcf0: 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20  ic();.  hHeap = 
bd00: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b  winMemGetHeap();
bd10: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
bd20: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
bd30: 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f   hHeap!=INVALID_
bd40: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
bd50: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
bd60: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
bd70: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
bd80: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20  LOC_VALIDATE).  
bd90: 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61  assert( osHeapVa
bda0: 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51  lidate(hHeap, SQ
bdb0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
bdc0: 46 4c 41 47 53 2c 20 70 29 20 29 3b 0a 23 65 6e  FLAGS, p) );.#en
bdd0: 64 69 66 0a 20 20 69 66 28 20 21 70 20 29 20 72  dif.  if( !p ) r
bde0: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 6f  eturn 0;.  n = o
bdf0: 73 48 65 61 70 53 69 7a 65 28 68 48 65 61 70 2c  sHeapSize(hHeap,
be00: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
be10: 41 50 5f 46 4c 41 47 53 2c 20 70 29 3b 0a 20 20  AP_FLAGS, p);.  
be20: 69 66 28 20 6e 3d 3d 28 53 49 5a 45 5f 54 29 2d  if( n==(SIZE_T)-
be30: 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
be40: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
be50: 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  M, "failed to He
be60: 61 70 53 69 7a 65 20 62 6c 6f 63 6b 20 25 70 20  apSize block %p 
be70: 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c  (%lu), heap=%p",
be80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
be90: 20 70 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72   p, osGetLastErr
bea0: 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65  or(), (void*)hHe
beb0: 61 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ap);.    return 
bec0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
bed0: 28 69 6e 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (int)n;.}../*.**
bee0: 20 52 6f 75 6e 64 20 75 70 20 61 20 72 65 71 75   Round up a requ
bef0: 65 73 74 20 73 69 7a 65 20 74 6f 20 74 68 65 20  est size to the 
bf00: 6e 65 78 74 20 76 61 6c 69 64 20 61 6c 6c 6f 63  next valid alloc
bf10: 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73  ation size..*/.s
bf20: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d  tatic int winMem
bf30: 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29 7b 0a  Roundup(int n){.
bf40: 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
bf50: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
bf60: 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a  this module..*/.
bf70: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65  static int winMe
bf80: 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70 41 70 70  mInit(void *pApp
bf90: 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44  Data){.  winMemD
bfa0: 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61  ata *pWinMemData
bfb0: 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a   = (winMemData *
bfc0: 29 70 41 70 70 44 61 74 61 3b 0a 0a 20 20 69 66  )pAppData;..  if
bfd0: 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 20 29  ( !pWinMemData )
bfe0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
bff0: 52 52 4f 52 3b 0a 20 20 61 73 73 65 72 74 28 20  RROR;.  assert( 
c000: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67  pWinMemData->mag
c010: 69 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49  ic1==WINMEM_MAGI
c020: 43 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  C1 );.  assert( 
c030: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67  pWinMemData->mag
c040: 69 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49  ic2==WINMEM_MAGI
c050: 43 32 20 29 3b 0a 0a 23 69 66 20 21 53 51 4c 49  C2 );..#if !SQLI
c060: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 53  TE_OS_WINRT && S
c070: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
c080: 5f 43 52 45 41 54 45 0a 20 20 69 66 28 20 21 70  _CREATE.  if( !p
c090: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
c0a0: 70 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 64  p ){.    DWORD d
c0b0: 77 49 6e 69 74 69 61 6c 53 69 7a 65 20 3d 20 53  wInitialSize = S
c0c0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
c0d0: 5f 49 4e 49 54 5f 53 49 5a 45 3b 0a 20 20 20 20  _INIT_SIZE;.    
c0e0: 44 57 4f 52 44 20 64 77 4d 61 78 69 6d 75 6d 53  DWORD dwMaximumS
c0f0: 69 7a 65 20 3d 20 28 44 57 4f 52 44 29 73 71 6c  ize = (DWORD)sql
c100: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
c110: 2e 6e 48 65 61 70 3b 0a 20 20 20 20 69 66 28 20  .nHeap;.    if( 
c120: 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 3d 3d 30  dwMaximumSize==0
c130: 20 29 7b 0a 20 20 20 20 20 20 64 77 4d 61 78 69   ){.      dwMaxi
c140: 6d 75 6d 53 69 7a 65 20 3d 20 53 51 4c 49 54 45  mumSize = SQLITE
c150: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f  _WIN32_HEAP_MAX_
c160: 53 49 5a 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20  SIZE;.    }else 
c170: 69 66 28 20 64 77 49 6e 69 74 69 61 6c 53 69 7a  if( dwInitialSiz
c180: 65 3e 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 20  e>dwMaximumSize 
c190: 29 7b 0a 20 20 20 20 20 20 64 77 49 6e 69 74 69  ){.      dwIniti
c1a0: 61 6c 53 69 7a 65 20 3d 20 64 77 4d 61 78 69 6d  alSize = dwMaxim
c1b0: 75 6d 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20  umSize;.    }.  
c1c0: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68    pWinMemData->h
c1d0: 48 65 61 70 20 3d 20 6f 73 48 65 61 70 43 72 65  Heap = osHeapCre
c1e0: 61 74 65 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ate(SQLITE_WIN32
c1f0: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20  _HEAP_FLAGS,.   
c200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c220: 20 20 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65     dwInitialSize
c230: 2c 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 29  , dwMaximumSize)
c240: 3b 0a 20 20 20 20 69 66 28 20 21 70 57 69 6e 4d  ;.    if( !pWinM
c250: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b  emData->hHeap ){
c260: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  .      sqlite3_l
c270: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
c280: 0a 20 20 20 20 20 20 20 20 20 20 22 66 61 69 6c  .          "fail
c290: 65 64 20 74 6f 20 48 65 61 70 43 72 65 61 74 65  ed to HeapCreate
c2a0: 20 28 25 6c 75 29 2c 20 66 6c 61 67 73 3d 25 75   (%lu), flags=%u
c2b0: 2c 20 69 6e 69 74 53 69 7a 65 3d 25 6c 75 2c 20  , initSize=%lu, 
c2c0: 6d 61 78 53 69 7a 65 3d 25 6c 75 22 2c 0a 20 20  maxSize=%lu",.  
c2d0: 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73          osGetLas
c2e0: 74 45 72 72 6f 72 28 29 2c 20 53 51 4c 49 54 45  tError(), SQLITE
c2f0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
c300: 53 2c 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65  S, dwInitialSize
c310: 2c 0a 20 20 20 20 20 20 20 20 20 20 64 77 4d 61  ,.          dwMa
c320: 78 69 6d 75 6d 53 69 7a 65 29 3b 0a 20 20 20 20  ximumSize);.    
c330: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c340: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
c350: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f   pWinMemData->bO
c360: 77 6e 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20  wned = TRUE;.   
c370: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
c380: 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a  Data->bOwned );.
c390: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 70 57 69 6e    }.#else.  pWin
c3a0: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d  MemData->hHeap =
c3b0: 20 6f 73 47 65 74 50 72 6f 63 65 73 73 48 65 61   osGetProcessHea
c3c0: 70 28 29 3b 0a 20 20 69 66 28 20 21 70 57 69 6e  p();.  if( !pWin
c3d0: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29  MemData->hHeap )
c3e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
c3f0: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a  g(SQLITE_NOMEM,.
c400: 20 20 20 20 20 20 20 20 22 66 61 69 6c 65 64 20          "failed 
c410: 74 6f 20 47 65 74 50 72 6f 63 65 73 73 48 65 61  to GetProcessHea
c420: 70 20 28 25 6c 75 29 22 2c 20 6f 73 47 65 74 4c  p (%lu)", osGetL
c430: 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20  astError());.   
c440: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
c450: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 57 69 6e  OMEM;.  }.  pWin
c460: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
c470: 3d 20 46 41 4c 53 45 3b 0a 20 20 61 73 73 65 72  = FALSE;.  asser
c480: 74 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d  t( !pWinMemData-
c490: 3e 62 4f 77 6e 65 64 20 29 3b 0a 23 65 6e 64 69  >bOwned );.#endi
c4a0: 66 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e  f.  assert( pWin
c4b0: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d  MemData->hHeap!=
c4c0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
c4d0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
c4e0: 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  p!=INVALID_HANDL
c4f0: 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21  E_VALUE );.#if !
c500: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
c510: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
c520: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
c530: 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72  ALIDATE).  asser
c540: 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74  t( osHeapValidat
c550: 65 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  e(pWinMemData->h
c560: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
c570: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e  32_HEAP_FLAGS, N
c580: 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  ULL) );.#endif. 
c590: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c5a0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e  K;.}../*.** Dein
c5b0: 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f  itialize this mo
c5c0: 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dule..*/.static 
c5d0: 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64  void winMemShutd
c5e0: 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61  own(void *pAppDa
c5f0: 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74  ta){.  winMemDat
c600: 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d  a *pWinMemData =
c610: 20 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70   (winMemData *)p
c620: 41 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20  AppData;..  if( 
c630: 21 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72  !pWinMemData ) r
c640: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
c650: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61   pWinMemData->ma
c660: 67 69 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47  gic1==WINMEM_MAG
c670: 49 43 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IC1 );.  assert(
c680: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61   pWinMemData->ma
c690: 67 69 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47  gic2==WINMEM_MAG
c6a0: 49 43 32 20 29 3b 0a 0a 20 20 69 66 28 20 70 57  IC2 );..  if( pW
c6b0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
c6c0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
c6d0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
c6e0: 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ap!=INVALID_HAND
c6f0: 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20  LE_VALUE );.#if 
c700: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
c710: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
c720: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f  TE_WIN32_MALLOC_
c730: 56 41 4c 49 44 41 54 45 29 0a 20 20 20 20 61 73  VALIDATE).    as
c740: 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69  sert( osHeapVali
c750: 64 61 74 65 28 70 57 69 6e 4d 65 6d 44 61 74 61  date(pWinMemData
c760: 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  ->hHeap, SQLITE_
c770: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
c780: 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69  , NULL) );.#endi
c790: 66 0a 20 20 20 20 69 66 28 20 70 57 69 6e 4d 65  f.    if( pWinMe
c7a0: 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 7b  mData->bOwned ){
c7b0: 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73 48 65  .      if( !osHe
c7c0: 61 70 44 65 73 74 72 6f 79 28 70 57 69 6e 4d 65  apDestroy(pWinMe
c7d0: 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 20 29 7b  mData->hHeap) ){
c7e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c7f0: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
c800: 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  M, "failed to He
c810: 61 70 44 65 73 74 72 6f 79 20 28 25 6c 75 29 2c  apDestroy (%lu),
c820: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
c830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
c840: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
c850: 20 28 76 6f 69 64 2a 29 70 57 69 6e 4d 65 6d 44   (void*)pWinMemD
c860: 61 74 61 2d 3e 68 48 65 61 70 29 3b 0a 20 20 20  ata->hHeap);.   
c870: 20 20 20 7d 0a 20 20 20 20 20 20 70 57 69 6e 4d     }.      pWinM
c880: 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d  emData->bOwned =
c890: 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20   FALSE;.    }.  
c8a0: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68    pWinMemData->h
c8b0: 48 65 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  Heap = NULL;.  }
c8c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61  .}../*.** Popula
c8d0: 74 65 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65 6c  te the low-level
c8e0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
c8f0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e  on function poin
c900: 74 65 72 73 20 69 6e 0a 2a 2a 20 73 71 6c 69 74  ters in.** sqlit
c910: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
c920: 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74   with pointers t
c930: 6f 20 74 68 65 20 72 6f 75 74 69 6e 65 73 20 69  o the routines i
c940: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 54 68 65  n this file. The
c950: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 73 70  .** arguments sp
c960: 65 63 69 66 79 20 74 68 65 20 62 6c 6f 63 6b 20  ecify the block 
c970: 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6d 61 6e  of memory to man
c980: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  age..**.** This 
c990: 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
c9a0: 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65  called by sqlite
c9b0: 33 5f 63 6f 6e 66 69 67 28 29 2c 20 61 6e 64 20  3_config(), and 
c9c0: 74 68 65 72 65 66 6f 72 65 0a 2a 2a 20 69 73 20  therefore.** is 
c9d0: 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f 20  not required to 
c9e0: 62 65 20 74 68 72 65 61 64 73 61 66 65 20 28 69  be threadsafe (i
c9f0: 74 20 69 73 20 6e 6f 74 29 2e 0a 2a 2f 0a 63 6f  t is not)..*/.co
ca00: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  nst sqlite3_mem_
ca10: 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74 65 33  methods *sqlite3
ca20: 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f 69 64  MemGetWin32(void
ca30: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
ca40: 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  t sqlite3_mem_me
ca50: 74 68 6f 64 73 20 77 69 6e 4d 65 6d 4d 65 74 68  thods winMemMeth
ca60: 6f 64 73 20 3d 20 7b 0a 20 20 20 20 77 69 6e 4d  ods = {.    winM
ca70: 65 6d 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69  emMalloc,.    wi
ca80: 6e 4d 65 6d 46 72 65 65 2c 0a 20 20 20 20 77 69  nMemFree,.    wi
ca90: 6e 4d 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20 20 20  nMemRealloc,.   
caa0: 20 77 69 6e 4d 65 6d 53 69 7a 65 2c 0a 20 20 20   winMemSize,.   
cab0: 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 2c 0a   winMemRoundup,.
cac0: 20 20 20 20 77 69 6e 4d 65 6d 49 6e 69 74 2c 0a      winMemInit,.
cad0: 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f      winMemShutdo
cae0: 77 6e 2c 0a 20 20 20 20 26 77 69 6e 5f 6d 65 6d  wn,.    &win_mem
caf0: 5f 64 61 74 61 0a 20 20 7d 3b 0a 20 20 72 65 74  _data.  };.  ret
cb00: 75 72 6e 20 26 77 69 6e 4d 65 6d 4d 65 74 68 6f  urn &winMemMetho
cb10: 64 73 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69  ds;.}..void sqli
cb20: 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74  te3MemSetDefault
cb30: 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
cb40: 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
cb50: 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2c 20 73  CONFIG_MALLOC, s
cb60: 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33  qlite3MemGetWin3
cb70: 32 28 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  2());.}.#endif /
cb80: 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  * SQLITE_WIN32_M
cb90: 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ALLOC */../*.** 
cba0: 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20  Convert a UTF-8 
cbb0: 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73  string to Micros
cbc0: 6f 66 74 20 55 6e 69 63 6f 64 65 20 28 55 54 46  oft Unicode (UTF
cbd0: 2d 31 36 3f 29 2e 0a 2a 2a 0a 2a 2a 20 53 70 61  -16?)..**.** Spa
cbe0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
cbf0: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
cc00: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
cc10: 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69  malloc..*/.stati
cc20: 63 20 4c 50 57 53 54 52 20 77 69 6e 55 74 66 38  c LPWSTR winUtf8
cc30: 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20  ToUnicode(const 
cc40: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
cc50: 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20  {.  int nChar;. 
cc60: 20 4c 50 57 53 54 52 20 7a 57 69 64 65 46 69 6c   LPWSTR zWideFil
cc70: 65 6e 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72 20  ename;..  nChar 
cc80: 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  = osMultiByteToW
cc90: 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c  ideChar(CP_UTF8,
cca0: 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d   0, zFilename, -
ccb0: 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 69  1, NULL, 0);.  i
ccc0: 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20  f( nChar==0 ){. 
ccd0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
cce0: 0a 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  .  zWideFilename
ccf0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
cd00: 5a 65 72 6f 28 20 6e 43 68 61 72 2a 73 69 7a 65  Zero( nChar*size
cd10: 6f 66 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  of(zWideFilename
cd20: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 57  [0]) );.  if( zW
cd30: 69 64 65 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29  ideFilename==0 )
cd40: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
cd50: 20 20 7d 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73    }.  nChar = os
cd60: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
cd70: 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20  har(CP_UTF8, 0, 
cd80: 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a  zFilename, -1, z
cd90: 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  WideFilename,.  
cda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 43                nC
cdc0: 68 61 72 29 3b 0a 20 20 69 66 28 20 6e 43 68 61  har);.  if( nCha
cdd0: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
cde0: 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 46 69  te3_free(zWideFi
cdf0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 57 69  lename);.    zWi
ce00: 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a  deFilename = 0;.
ce10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 57 69    }.  return zWi
ce20: 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f  deFilename;.}../
ce30: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4d 69 63  *.** Convert Mic
ce40: 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 74  rosoft Unicode t
ce50: 6f 20 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20  o UTF-8.  Space 
ce60: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
ce70: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 0a 2a  rned string is.*
ce80: 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
ce90: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
cea0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
ceb0: 20 2a 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74   *winUnicodeToUt
cec0: 66 38 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65  f8(LPCWSTR zWide
ced0: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74  Filename){.  int
cee0: 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a   nByte;.  char *
cef0: 7a 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 42  zFilename;..  nB
cf00: 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72  yte = osWideChar
cf10: 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55  ToMultiByte(CP_U
cf20: 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c  TF8, 0, zWideFil
cf30: 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c  ename, -1, 0, 0,
cf40: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42   0, 0);.  if( nB
cf50: 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  yte == 0 ){.    
cf60: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
cf70: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69  zFilename = sqli
cf80: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
cf90: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46  Byte );.  if( zF
cfa0: 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ilename==0 ){.  
cfb0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
cfc0: 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65    nByte = osWide
cfd0: 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28  CharToMultiByte(
cfe0: 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64  CP_UTF8, 0, zWid
cff0: 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a  eFilename, -1, z
d000: 46 69 6c 65 6e 61 6d 65 2c 20 6e 42 79 74 65 2c  Filename, nByte,
d010: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d030: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42   0, 0);.  if( nB
d040: 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  yte == 0 ){.    
d050: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69  sqlite3_free(zFi
d060: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69  lename);.    zFi
d070: 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  lename = 0;.  }.
d080: 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61    return zFilena
d090: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  me;.}../*.** Con
d0a0: 76 65 72 74 20 61 6e 20 41 4e 53 49 20 73 74 72  vert an ANSI str
d0b0: 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66 74  ing to Microsoft
d0c0: 20 55 6e 69 63 6f 64 65 2c 20 62 61 73 65 64 20   Unicode, based 
d0d0: 6f 6e 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  on the.** curren
d0e0: 74 20 63 6f 64 65 70 61 67 65 20 73 65 74 74 69  t codepage setti
d0f0: 6e 67 73 20 66 6f 72 20 66 69 6c 65 20 61 70 69  ngs for file api
d100: 73 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  s..**.** Space t
d110: 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72  o hold the retur
d120: 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62  ned string is ob
d130: 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73  tained.** from s
d140: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e 0a 2a  qlite3_malloc..*
d150: 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52 20  /.static LPWSTR 
d160: 77 69 6e 4d 62 63 73 54 6f 55 6e 69 63 6f 64 65  winMbcsToUnicode
d170: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
d180: 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e  lename){.  int n
d190: 42 79 74 65 3b 0a 20 20 4c 50 57 53 54 52 20 7a  Byte;.  LPWSTR z
d1a0: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  MbcsFilename;.  
d1b0: 69 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20 6f  int codepage = o
d1c0: 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  sAreFileApisANSI
d1d0: 28 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50  () ? CP_ACP : CP
d1e0: 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65  _OEMCP;..  nByte
d1f0: 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f   = osMultiByteTo
d200: 57 69 64 65 43 68 61 72 28 63 6f 64 65 70 61 67  WideChar(codepag
d210: 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  e, 0, zFilename,
d220: 20 2d 31 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20   -1, NULL,.     
d230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d240: 20 20 20 20 20 20 20 20 20 20 20 30 29 2a 73 69             0)*si
d250: 7a 65 6f 66 28 57 43 48 41 52 29 3b 0a 20 20 69  zeof(WCHAR);.  i
d260: 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20  f( nByte==0 ){. 
d270: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
d280: 0a 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  .  zMbcsFilename
d290: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
d2a0: 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65  Zero( nByte*size
d2b0: 6f 66 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  of(zMbcsFilename
d2c0: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 4d  [0]) );.  if( zM
d2d0: 62 63 73 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29  bcsFilename==0 )
d2e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
d2f0: 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73    }.  nByte = os
d300: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
d310: 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c  har(codepage, 0,
d320: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20   zFilename, -1, 
d330: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 2c 0a 20  zMbcsFilename,. 
d340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
d360: 42 79 74 65 29 3b 0a 20 20 69 66 28 20 6e 42 79  Byte);.  if( nBy
d370: 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  te==0 ){.    sql
d380: 69 74 65 33 5f 66 72 65 65 28 7a 4d 62 63 73 46  ite3_free(zMbcsF
d390: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 4d  ilename);.    zM
d3a0: 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b  bcsFilename = 0;
d3b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4d  .  }.  return zM
d3c0: 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a  bcsFilename;.}..
d3d0: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4d 69  /*.** Convert Mi
d3e0: 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20  crosoft Unicode 
d3f0: 74 6f 20 6d 75 6c 74 69 2d 62 79 74 65 20 63 68  to multi-byte ch
d400: 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 2c 20  aracter string, 
d410: 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20  based on the.** 
d420: 75 73 65 72 27 73 20 41 4e 53 49 20 63 6f 64 65  user's ANSI code
d430: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  page..**.** Spac
d440: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
d450: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
d460: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
d470: 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
d480: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ()..*/.static ch
d490: 61 72 20 2a 77 69 6e 55 6e 69 63 6f 64 65 54 6f  ar *winUnicodeTo
d4a0: 4d 62 63 73 28 4c 50 43 57 53 54 52 20 7a 57 69  Mbcs(LPCWSTR zWi
d4b0: 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69  deFilename){.  i
d4c0: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72  nt nByte;.  char
d4d0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69   *zFilename;.  i
d4e0: 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20 6f 73  nt codepage = os
d4f0: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28  AreFileApisANSI(
d500: 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f  ) ? CP_ACP : CP_
d510: 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20  OEMCP;..  nByte 
d520: 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75  = osWideCharToMu
d530: 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61 67 65  ltiByte(codepage
d540: 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61  , 0, zWideFilena
d550: 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c  me, -1, 0, 0, 0,
d560: 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65   0);.  if( nByte
d570: 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74   == 0 ){.    ret
d580: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69  urn 0;.  }.  zFi
d590: 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  lename = sqlite3
d5a0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74  MallocZero( nByt
d5b0: 65 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65  e );.  if( zFile
d5c0: 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  name==0 ){.    r
d5d0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e  eturn 0;.  }.  n
d5e0: 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61  Byte = osWideCha
d5f0: 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64  rToMultiByte(cod
d600: 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46  epage, 0, zWideF
d610: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69  ilename, -1, zFi
d620: 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
d630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d640: 20 20 20 20 20 20 20 20 6e 42 79 74 65 2c 20 30          nByte, 0
d650: 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  , 0);.  if( nByt
d660: 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 71  e == 0 ){.    sq
d670: 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65  lite3_free(zFile
d680: 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65  name);.    zFile
d690: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  name = 0;.  }.  
d6a0: 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65  return zFilename
d6b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
d6c0: 72 74 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61  rt multibyte cha
d6d0: 72 61 63 74 65 72 20 73 74 72 69 6e 67 20 74 6f  racter string to
d6e0: 20 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74   UTF-8.  Space t
d6f0: 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 72 65  o hold the.** re
d700: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
d710: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
d720: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
d730: 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
d740: 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f  3_win32_mbcs_to_
d750: 75 74 66 38 28 63 6f 6e 73 74 20 63 68 61 72 20  utf8(const char 
d760: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63  *zFilename){.  c
d770: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 55 74  har *zFilenameUt
d780: 66 38 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d  f8;.  LPWSTR zTm
d790: 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69  pWide;..  zTmpWi
d7a0: 64 65 20 3d 20 77 69 6e 4d 62 63 73 54 6f 55 6e  de = winMbcsToUn
d7b0: 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29  icode(zFilename)
d7c0: 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65  ;.  if( zTmpWide
d7d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
d7e0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65  n 0;.  }.  zFile
d7f0: 6e 61 6d 65 55 74 66 38 20 3d 20 77 69 6e 55 6e  nameUtf8 = winUn
d800: 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 6d 70  icodeToUtf8(zTmp
d810: 57 69 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Wide);.  sqlite3
d820: 5f 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29 3b  _free(zTmpWide);
d830: 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e  .  return zFilen
d840: 61 6d 65 55 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a  ameUtf8;.}../*.*
d850: 2a 20 43 6f 6e 76 65 72 74 20 55 54 46 2d 38 20  * Convert UTF-8 
d860: 74 6f 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61  to multibyte cha
d870: 72 61 63 74 65 72 20 73 74 72 69 6e 67 2e 20 20  racter string.  
d880: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
d890: 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74  e.** returned st
d8a0: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
d8b0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
d8c0: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20  lloc()..*/.char 
d8d0: 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75  *sqlite3_win32_u
d8e0: 74 66 38 5f 74 6f 5f 6d 62 63 73 28 63 6f 6e 73  tf8_to_mbcs(cons
d8f0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
d900: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c  e){.  char *zFil
d910: 65 6e 61 6d 65 4d 62 63 73 3b 0a 20 20 4c 50 57  enameMbcs;.  LPW
d920: 53 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20  STR zTmpWide;.. 
d930: 20 7a 54 6d 70 57 69 64 65 20 3d 20 77 69 6e 55   zTmpWide = winU
d940: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  tf8ToUnicode(zFi
d950: 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
d960: 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20  TmpWide==0 ){.  
d970: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
d980: 20 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 20    zFilenameMbcs 
d990: 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 4d 62  = winUnicodeToMb
d9a0: 63 73 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20  cs(zTmpWide);.  
d9b0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d  sqlite3_free(zTm
d9c0: 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e  pWide);.  return
d9d0: 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a   zFilenameMbcs;.
d9e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
d9f0: 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20  nction sets the 
da00: 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 6f  data directory o
da10: 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  r the temporary 
da20: 64 69 72 65 63 74 6f 72 79 20 62 61 73 65 64 20  directory based 
da30: 6f 6e 0a 2a 2a 20 74 68 65 20 70 72 6f 76 69 64  on.** the provid
da40: 65 64 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54  ed arguments.  T
da50: 68 65 20 74 79 70 65 20 61 72 67 75 6d 65 6e 74  he type argument
da60: 20 6d 75 73 74 20 62 65 20 31 20 69 6e 20 6f 72   must be 1 in or
da70: 64 65 72 20 74 6f 20 73 65 74 20 74 68 65 0a 2a  der to set the.*
da80: 2a 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79  * data directory
da90: 20 6f 72 20 32 20 69 6e 20 6f 72 64 65 72 20 74   or 2 in order t
daa0: 6f 20 73 65 74 20 74 68 65 20 74 65 6d 70 6f 72  o set the tempor
dab0: 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e 20 20  ary directory.  
dac0: 54 68 65 20 7a 56 61 6c 75 65 0a 2a 2a 20 61 72  The zValue.** ar
dad0: 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61  gument is the na
dae0: 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65 63 74  me of the direct
daf0: 6f 72 79 20 74 6f 20 75 73 65 2e 20 20 54 68 65  ory to use.  The
db00: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 77 69   return value wi
db10: 6c 6c 20 62 65 0a 2a 2a 20 53 51 4c 49 54 45 5f  ll be.** SQLITE_
db20: 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
db30: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
db40: 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
db50: 74 6f 72 79 28 44 57 4f 52 44 20 74 79 70 65 2c  tory(DWORD type,
db60: 20 4c 50 43 57 53 54 52 20 7a 56 61 6c 75 65 29   LPCWSTR zValue)
db70: 7b 0a 20 20 63 68 61 72 20 2a 2a 70 70 44 69 72  {.  char **ppDir
db80: 65 63 74 6f 72 79 20 3d 20 30 3b 0a 23 69 66 6e  ectory = 0;.#ifn
db90: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
dba0: 41 55 54 4f 49 4e 49 54 0a 20 20 69 6e 74 20 72  AUTOINIT.  int r
dbb0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  c = sqlite3_init
dbc0: 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20  ialize();.  if( 
dbd0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
dbe0: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 74 79 70  #endif.  if( typ
dbf0: 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  e==SQLITE_WIN32_
dc00: 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54  DATA_DIRECTORY_T
dc10: 59 50 45 20 29 7b 0a 20 20 20 20 70 70 44 69 72  YPE ){.    ppDir
dc20: 65 63 74 6f 72 79 20 3d 20 26 73 71 6c 69 74 65  ectory = &sqlite
dc30: 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
dc40: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 74 79  ;.  }else if( ty
dc50: 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32  pe==SQLITE_WIN32
dc60: 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f  _TEMP_DIRECTORY_
dc70: 54 59 50 45 20 29 7b 0a 20 20 20 20 70 70 44 69  TYPE ){.    ppDi
dc80: 72 65 63 74 6f 72 79 20 3d 20 26 73 71 6c 69 74  rectory = &sqlit
dc90: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
dca0: 79 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  y;.  }.  assert(
dcb0: 20 21 70 70 44 69 72 65 63 74 6f 72 79 20 7c 7c   !ppDirectory ||
dcc0: 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49   type==SQLITE_WI
dcd0: 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f  N32_DATA_DIRECTO
dce0: 52 59 5f 54 59 50 45 0a 20 20 20 20 20 20 20 20  RY_TYPE.        
dcf0: 20 20 7c 7c 20 74 79 70 65 3d 3d 53 51 4c 49 54    || type==SQLIT
dd00: 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52  E_WIN32_TEMP_DIR
dd10: 45 43 54 4f 52 59 5f 54 59 50 45 0a 20 20 29 3b  ECTORY_TYPE.  );
dd20: 0a 20 20 61 73 73 65 72 74 28 20 21 70 70 44 69  .  assert( !ppDi
dd30: 72 65 63 74 6f 72 79 20 7c 7c 20 73 71 6c 69 74  rectory || sqlit
dd40: 65 33 4d 65 6d 64 65 62 75 67 48 61 73 54 79 70  e3MemdebugHasTyp
dd50: 65 28 2a 70 70 44 69 72 65 63 74 6f 72 79 2c 20  e(*ppDirectory, 
dd60: 4d 45 4d 54 59 50 45 5f 48 45 41 50 29 20 29 3b  MEMTYPE_HEAP) );
dd70: 0a 20 20 69 66 28 20 70 70 44 69 72 65 63 74 6f  .  if( ppDirecto
dd80: 72 79 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  ry ){.    char *
dd90: 7a 56 61 6c 75 65 55 74 66 38 20 3d 20 30 3b 0a  zValueUtf8 = 0;.
dda0: 20 20 20 20 69 66 28 20 7a 56 61 6c 75 65 20 26      if( zValue &
ddb0: 26 20 7a 56 61 6c 75 65 5b 30 5d 20 29 7b 0a 20  & zValue[0] ){. 
ddc0: 20 20 20 20 20 7a 56 61 6c 75 65 55 74 66 38 20       zValueUtf8 
ddd0: 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74  = winUnicodeToUt
dde0: 66 38 28 7a 56 61 6c 75 65 29 3b 0a 20 20 20 20  f8(zValue);.    
ddf0: 20 20 69 66 20 28 20 7a 56 61 6c 75 65 55 74 66    if ( zValueUtf
de00: 38 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  8==0 ){.        
de10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
de20: 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
de30: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
de40: 72 65 65 28 2a 70 70 44 69 72 65 63 74 6f 72 79  ree(*ppDirectory
de50: 29 3b 0a 20 20 20 20 2a 70 70 44 69 72 65 63 74  );.    *ppDirect
de60: 6f 72 79 20 3d 20 7a 56 61 6c 75 65 55 74 66 38  ory = zValueUtf8
de70: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
de80: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  ITE_OK;.  }.  re
de90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
dea0: 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  R;.}../*.** The 
deb0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
dec0: 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d  winGetLastErrorM
ded0: 73 67 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66  sg.** is zero if
dee0: 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
def0: 67 65 20 66 69 74 73 20 69 6e 20 74 68 65 20 62  ge fits in the b
df00: 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65  uffer, or non-ze
df10: 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20  ro.** otherwise 
df20: 28 69 66 20 74 68 65 20 6d 65 73 73 61 67 65 20  (if the message 
df30: 77 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e 0a  was truncated)..
df40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
df50: 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67  nGetLastErrorMsg
df60: 28 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f  (DWORD lastErrno
df70: 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
df80: 20 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a 20 46 6f   *zBuf){.  /* Fo
df90: 72 6d 61 74 4d 65 73 73 61 67 65 20 72 65 74 75  rmatMessage retu
dfa0: 72 6e 73 20 30 20 6f 6e 20 66 61 69 6c 75 72 65  rns 0 on failure
dfb0: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 69 74 0a  .  Otherwise it.
dfc0: 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 74 68 65    ** returns the
dfd0: 20 6e 75 6d 62 65 72 20 6f 66 20 54 43 48 41 52   number of TCHAR
dfe0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
dff0: 20 6f 75 74 70 75 74 0a 20 20 2a 2a 20 62 75 66   output.  ** buf
e000: 66 65 72 2c 20 65 78 63 6c 75 64 69 6e 67 20 74  fer, excluding t
e010: 68 65 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e  he terminating n
e020: 75 6c 6c 20 63 68 61 72 2e 0a 20 20 2a 2f 0a 20  ull char..  */. 
e030: 20 44 57 4f 52 44 20 64 77 4c 65 6e 20 3d 20 30   DWORD dwLen = 0
e040: 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d  ;.  char *zOut =
e050: 20 30 3b 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e   0;..  if( osIsN
e060: 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  T() ){.#if SQLIT
e070: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 57  E_OS_WINRT.    W
e080: 43 48 41 52 20 7a 54 65 6d 70 57 69 64 65 5b 53  CHAR zTempWide[S
e090: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f  QLITE_WIN32_MAX_
e0a0: 45 52 52 4d 53 47 5f 43 48 41 52 53 2b 31 5d 3b  ERRMSG_CHARS+1];
e0b0: 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46  .    dwLen = osF
e0c0: 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 28 46 4f  ormatMessageW(FO
e0d0: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f  RMAT_MESSAGE_FRO
e0e0: 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20  M_SYSTEM |.     
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e100: 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d          FORMAT_M
e110: 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e  ESSAGE_IGNORE_IN
e120: 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20  SERTS,.         
e130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e140: 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20      NULL,.      
e150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e160: 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f         lastErrno
e170: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
e190: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
e1b0: 54 65 6d 70 57 69 64 65 2c 0a 20 20 20 20 20 20  TempWide,.      
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1d0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49         SQLITE_WI
e1e0: 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43  N32_MAX_ERRMSG_C
e1f0: 48 41 52 53 2c 0a 20 20 20 20 20 20 20 20 20 20  HARS,.          
e200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e210: 20 20 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20     0);.#else.   
e220: 20 4c 50 57 53 54 52 20 7a 54 65 6d 70 57 69 64   LPWSTR zTempWid
e230: 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77  e = NULL;.    dw
e240: 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65  Len = osFormatMe
e250: 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45  ssageW(FORMAT_ME
e260: 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42  SSAGE_ALLOCATE_B
e270: 55 46 46 45 52 20 7c 0a 20 20 20 20 20 20 20 20  UFFER |.        
e280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e290: 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53       FORMAT_MESS
e2a0: 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20  AGE_FROM_SYSTEM 
e2b0: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
e2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
e2d0: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47  ORMAT_MESSAGE_IG
e2e0: 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20  NORE_INSERTS,.  
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e300: 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c             NULL,
e310: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61                la
e330: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
e340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e350: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
e360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e370: 20 20 20 20 20 20 28 4c 50 57 53 54 52 29 20 26        (LPWSTR) &
e380: 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20 20 20 20  zTempWide,.     
e390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3a0: 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20          0,.     
e3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3c0: 20 20 20 20 20 20 20 20 30 29 3b 0a 23 65 6e 64          0);.#end
e3d0: 69 66 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e  if.    if( dwLen
e3e0: 20 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a   > 0 ){.      /*
e3f0: 20 61 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66   allocate a buff
e400: 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74  er and convert t
e410: 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20  o UTF8 */.      
e420: 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
e430: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
e440: 20 20 7a 4f 75 74 20 3d 20 77 69 6e 55 6e 69 63    zOut = winUnic
e450: 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 57  odeToUtf8(zTempW
e460: 69 64 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ide);.      sqli
e470: 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
e480: 6f 63 28 29 3b 0a 23 69 66 20 21 53 51 4c 49 54  oc();.#if !SQLIT
e490: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20  E_OS_WINRT.     
e4a0: 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73 79 73   /* free the sys
e4b0: 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  tem buffer alloc
e4c0: 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74 4d 65  ated by FormatMe
e4d0: 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f  ssage */.      o
e4e0: 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70  sLocalFree(zTemp
e4f0: 57 69 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Wide);.#endif.  
e500: 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53    }.  }.#ifdef S
e510: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
e520: 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
e530: 20 63 68 61 72 20 2a 7a 54 65 6d 70 20 3d 20 4e   char *zTemp = N
e540: 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d  ULL;.    dwLen =
e550: 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65   osFormatMessage
e560: 41 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45  A(FORMAT_MESSAGE
e570: 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45 52  _ALLOCATE_BUFFER
e580: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
e590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5a0: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46  FORMAT_MESSAGE_F
e5b0: 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20  ROM_SYSTEM |.   
e5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5d0: 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54            FORMAT
e5e0: 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f  _MESSAGE_IGNORE_
e5f0: 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20  INSERTS,.       
e600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e610: 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20        NULL,.    
e620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e630: 20 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72           lastErr
e640: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
e650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e660: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
e670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e680: 20 28 4c 50 53 54 52 29 20 26 7a 54 65 6d 70 2c   (LPSTR) &zTemp,
e690: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
e6b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29                0)
e6d0: 3b 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20  ;.    if( dwLen 
e6e0: 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  > 0 ){.      /* 
e6f0: 61 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65  allocate a buffe
e700: 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f  r and convert to
e710: 20 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 73   UTF8 */.      s
e720: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
e730: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
e740: 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f   zOut = sqlite3_
e750: 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74  win32_mbcs_to_ut
e760: 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20  f8(zTemp);.     
e770: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
e780: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
e790: 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73 79 73   /* free the sys
e7a0: 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  tem buffer alloc
e7b0: 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74 4d 65  ated by FormatMe
e7c0: 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f  ssage */.      o
e7d0: 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70  sLocalFree(zTemp
e7e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
e7f0: 64 69 66 0a 20 20 69 66 28 20 30 20 3d 3d 20 64  dif.  if( 0 == d
e800: 77 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  wLen ){.    sqli
e810: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
e820: 66 2c 20 7a 42 75 66 2c 20 22 4f 73 45 72 72 6f  f, zBuf, "OsErro
e830: 72 20 30 78 25 6c 78 20 28 25 6c 75 29 22 2c 20  r 0x%lx (%lu)", 
e840: 6c 61 73 74 45 72 72 6e 6f 2c 20 6c 61 73 74 45  lastErrno, lastE
e850: 72 72 6e 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rrno);.  }else{.
e860: 20 20 20 20 2f 2a 20 63 6f 70 79 20 61 20 6d 61      /* copy a ma
e870: 78 69 6d 75 6d 20 6f 66 20 6e 42 75 66 20 63 68  ximum of nBuf ch
e880: 61 72 73 20 74 6f 20 6f 75 74 70 75 74 20 62 75  ars to output bu
e890: 66 66 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ffer */.    sqli
e8a0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
e8b0: 66 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a  f, zBuf, "%s", z
e8c0: 4f 75 74 29 3b 0a 20 20 20 20 2f 2a 20 66 72 65  Out);.    /* fre
e8d0: 65 20 74 68 65 20 55 54 46 38 20 62 75 66 66 65  e the UTF8 buffe
e8e0: 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  r */.    sqlite3
e8f0: 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 7d  _free(zOut);.  }
e900: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
e910: 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /*.**.** This fu
e920: 6e 63 74 69 6f 6e 20 2d 20 77 69 6e 4c 6f 67 45  nction - winLogE
e930: 72 72 6f 72 41 74 4c 69 6e 65 28 29 20 2d 20 69  rrorAtLine() - i
e940: 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c  s only ever call
e950: 65 64 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f  ed via the macro
e960: 0a 2a 2a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  .** winLogError(
e970: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  )..**.** This ro
e980: 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
e990: 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20   after an error 
e9a0: 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20  occurs in an OS 
e9b0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20  function..** It 
e9c0: 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20 75  logs a message u
e9d0: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67  sing sqlite3_log
e9e0: 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  () containing th
e9f0: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
ea00: 6f 66 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  of.** error code
ea10: 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c   and, if possibl
ea20: 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61  e, the human-rea
ea30: 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74  dable equivalent
ea40: 20 66 72 6f 6d 0a 2a 2a 20 46 6f 72 6d 61 74 4d   from.** FormatM
ea50: 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  essage..**.** Th
ea60: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
ea70: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d   passed to the m
ea80: 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74  acro should be t
ea90: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68  he error code th
eaa0: 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65  at.** will be re
eab0: 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65  turned to SQLite
eac0: 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f   (e.g. SQLITE_IO
ead0: 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49  ERR_DELETE, SQLI
eae0: 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 0a 2a 2a  TE_CANTOPEN)..**
eaf0: 20 54 68 65 20 74 77 6f 20 73 75 62 73 65 71 75   The two subsequ
eb00: 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68  ent arguments sh
eb10: 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65  ould be the name
eb20: 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74   of the OS funct
eb30: 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c  ion that.** fail
eb40: 65 64 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63  ed and the assoc
eb50: 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65  iated file-syste
eb60: 6d 20 70 61 74 68 2c 20 69 66 20 61 6e 79 2e 0a  m path, if any..
eb70: 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 4c 6f  */.#define winLo
eb80: 67 45 72 72 6f 72 28 61 2c 62 2c 63 2c 64 29 20  gError(a,b,c,d) 
eb90: 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c    winLogErrorAtL
eba0: 69 6e 65 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c 49  ine(a,b,c,d,__LI
ebb0: 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74  NE__).static int
ebc0: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69   winLogErrorAtLi
ebd0: 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64  ne(.  int errcod
ebe0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
ebf0: 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20        /* SQLite 
ec00: 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  error code */.  
ec10: 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c  DWORD lastErrno,
ec20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec30: 2f 2a 20 57 69 6e 33 32 20 6c 61 73 74 20 65 72  /* Win32 last er
ec40: 72 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ror */.  const c
ec50: 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20  har *zFunc,     
ec60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
ec70: 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20   of OS function 
ec80: 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20  that failed */. 
ec90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
eca0: 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
ecb0: 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73   /* File path as
ecc0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 72  sociated with er
ecd0: 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69  ror */.  int iLi
ece0: 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ne              
ecf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72           /* Sour
ed00: 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77  ce line number w
ed10: 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72  here error occur
ed20: 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  red */.){.  char
ed30: 20 7a 4d 73 67 5b 35 30 30 5d 3b 20 20 20 20 20   zMsg[500];     
ed40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
ed50: 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 65 72  uman readable er
ed60: 72 6f 72 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e  ror text */.  in
ed70: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
ed80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ed90: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
eda0: 0a 0a 20 20 7a 4d 73 67 5b 30 5d 20 3d 20 30 3b  ..  zMsg[0] = 0;
edb0: 0a 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72  .  winGetLastErr
edc0: 6f 72 4d 73 67 28 6c 61 73 74 45 72 72 6e 6f 2c  orMsg(lastErrno,
edd0: 20 73 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a   sizeof(zMsg), z
ede0: 4d 73 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Msg);.  assert( 
edf0: 65 72 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errcode!=SQLITE_
ee00: 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74  OK );.  if( zPat
ee10: 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22  h==0 ) zPath = "
ee20: 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d  ";.  for(i=0; zM
ee30: 73 67 5b 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d  sg[i] && zMsg[i]
ee40: 21 3d 27 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69  !='\r' && zMsg[i
ee50: 5d 21 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a  ]!='\n'; i++){}.
ee60: 20 20 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20    zMsg[i] = 0;. 
ee70: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72   sqlite3_log(err
ee80: 63 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f  code,.      "os_
ee90: 77 69 6e 2e 63 3a 25 64 3a 20 28 25 6c 75 29 20  win.c:%d: (%lu) 
eea0: 25 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20  %s(%s) - %s",.  
eeb0: 20 20 20 20 69 4c 69 6e 65 2c 20 6c 61 73 74 45      iLine, lastE
eec0: 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61  rrno, zFunc, zPa
eed0: 74 68 2c 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20  th, zMsg.  );.. 
eee0: 20 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b   return errcode;
eef0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75  .}../*.** The nu
ef00: 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68  mber of times th
ef10: 61 74 20 61 20 52 65 61 64 46 69 6c 65 28 29 2c  at a ReadFile(),
ef20: 20 57 72 69 74 65 46 69 6c 65 28 29 2c 20 61 6e   WriteFile(), an
ef30: 64 20 44 65 6c 65 74 65 46 69 6c 65 28 29 0a 2a  d DeleteFile().*
ef40: 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65  * will be retrie
ef50: 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f  d following a lo
ef60: 63 6b 69 6e 67 20 65 72 72 6f 72 20 2d 20 70 72  cking error - pr
ef70: 6f 62 61 62 6c 79 20 63 61 75 73 65 64 20 62 79  obably caused by
ef80: 0a 2a 2a 20 61 6e 74 69 76 69 72 75 73 20 73 6f  .** antivirus so
ef90: 66 74 77 61 72 65 2e 20 20 41 6c 73 6f 20 74 68  ftware.  Also th
efa0: 65 20 69 6e 69 74 69 61 6c 20 64 65 6c 61 79 20  e initial delay 
efb0: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
efc0: 20 72 65 74 72 79 2e 0a 2a 2a 20 54 68 65 20 64   retry..** The d
efd0: 65 6c 61 79 20 69 6e 63 72 65 61 73 65 73 20 6c  elay increases l
efe0: 69 6e 65 61 72 6c 79 20 77 69 74 68 20 65 61 63  inearly with eac
eff0: 68 20 72 65 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e  h retry..*/.#ifn
f000: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
f010: 5f 49 4f 45 52 52 5f 52 45 54 52 59 0a 23 20 64  _IOERR_RETRY.# d
f020: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
f030: 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 20 31  32_IOERR_RETRY 1
f040: 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  0.#endif.#ifndef
f050: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
f060: 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 0a  ERR_RETRY_DELAY.
f070: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
f080: 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
f090: 59 5f 44 45 4c 41 59 20 32 35 0a 23 65 6e 64 69  Y_DELAY 25.#endi
f0a0: 66 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  f.static int win
f0b0: 49 6f 65 72 72 52 65 74 72 79 20 3d 20 53 51 4c  IoerrRetry = SQL
f0c0: 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f  ITE_WIN32_IOERR_
f0d0: 52 45 54 52 59 3b 0a 73 74 61 74 69 63 20 69 6e  RETRY;.static in
f0e0: 74 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44  t winIoerrRetryD
f0f0: 65 6c 61 79 20 3d 20 53 51 4c 49 54 45 5f 57 49  elay = SQLITE_WI
f100: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f  N32_IOERR_RETRY_
f110: 44 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  DELAY;../*.** Th
f120: 65 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65  e "winIoerrCanRe
f130: 74 72 79 31 22 20 6d 61 63 72 6f 20 69 73 20 75  try1" macro is u
f140: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
f150: 20 69 66 20 61 20 70 61 72 74 69 63 75 6c 61 72   if a particular
f160: 20 49 2f 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f   I/O.** error co
f170: 64 65 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20  de obtained via 
f180: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 69  GetLastError() i
f190: 73 20 65 6c 69 67 69 62 6c 65 20 74 6f 20 62 65  s eligible to be
f1a0: 20 72 65 74 72 69 65 64 2e 20 20 49 74 0a 2a 2a   retried.  It.**
f1b0: 20 6d 75 73 74 20 61 63 63 65 70 74 20 74 68 65   must accept the
f1c0: 20 65 72 72 6f 72 20 63 6f 64 65 20 44 57 4f 52   error code DWOR
f1d0: 44 20 61 73 20 69 74 73 20 6f 6e 6c 79 20 61 72  D as its only ar
f1e0: 67 75 6d 65 6e 74 20 61 6e 64 20 73 68 6f 75 6c  gument and shoul
f1f0: 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d  d return.** non-
f200: 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f  zero if the erro
f210: 72 20 63 6f 64 65 20 69 73 20 74 72 61 6e 73 69  r code is transi
f220: 65 6e 74 20 69 6e 20 6e 61 74 75 72 65 20 61 6e  ent in nature an
f230: 64 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 0a  d the operation.
f240: 2a 2a 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  ** responsible f
f250: 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68  or generating th
f260: 65 20 6f 72 69 67 69 6e 61 6c 20 65 72 72 6f 72  e original error
f270: 20 6d 69 67 68 74 20 73 75 63 63 65 65 64 20 75   might succeed u
f280: 70 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 65 74  pon being.** ret
f290: 72 69 65 64 2e 20 20 54 68 65 20 61 72 67 75 6d  ried.  The argum
f2a0: 65 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72  ent to this macr
f2b0: 6f 20 73 68 6f 75 6c 64 20 62 65 20 61 20 76 61  o should be a va
f2c0: 72 69 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 64  riable..**.** Ad
f2d0: 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 20 6d 61  ditionally, a ma
f2e0: 63 72 6f 20 6e 61 6d 65 64 20 22 77 69 6e 49 6f  cro named "winIo
f2f0: 65 72 72 43 61 6e 52 65 74 72 79 32 22 20 6d 61  errCanRetry2" ma
f300: 79 20 62 65 20 64 65 66 69 6e 65 64 2e 20 20 49  y be defined.  I
f310: 66 20 69 74 0a 2a 2a 20 69 73 20 64 65 66 69 6e  f it.** is defin
f320: 65 64 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 63  ed, it will be c
f330: 6f 6e 73 75 6c 74 65 64 20 6f 6e 6c 79 20 77 68  onsulted only wh
f340: 65 6e 20 74 68 65 20 6d 61 63 72 6f 20 22 77 69  en the macro "wi
f350: 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 22  nIoerrCanRetry1"
f360: 0a 2a 2a 20 72 65 74 75 72 6e 73 20 7a 65 72 6f  .** returns zero
f370: 2e 20 20 54 68 65 20 22 77 69 6e 49 6f 65 72 72  .  The "winIoerr
f380: 43 61 6e 52 65 74 72 79 32 22 20 6d 61 63 72 6f  CanRetry2" macro
f390: 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f   is completely o
f3a0: 70 74 69 6f 6e 61 6c 20 61 6e 64 0a 2a 2a 20 6d  ptional and.** m
f3b0: 61 79 20 62 65 20 75 73 65 64 20 74 6f 20 69 6e  ay be used to in
f3c0: 63 6c 75 64 65 20 61 64 64 69 74 69 6f 6e 61 6c  clude additional
f3d0: 20 65 72 72 6f 72 20 63 6f 64 65 73 20 69 6e 20   error codes in 
f3e0: 74 68 65 20 73 65 74 20 74 68 61 74 20 73 68 6f  the set that sho
f3f0: 75 6c 64 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  uld.** result in
f400: 20 74 68 65 20 66 61 69 6c 69 6e 67 20 49 2f 4f   the failing I/O
f410: 20 6f 70 65 72 61 74 69 6f 6e 20 62 65 69 6e 67   operation being
f420: 20 72 65 74 72 69 65 64 20 62 79 20 74 68 65 20   retried by the 
f430: 63 61 6c 6c 65 72 2e 20 20 49 66 0a 2a 2a 20 64  caller.  If.** d
f440: 65 66 69 6e 65 64 2c 20 74 68 65 20 22 77 69 6e  efined, the "win
f450: 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32 22 20  IoerrCanRetry2" 
f460: 6d 61 63 72 6f 20 6d 75 73 74 20 65 78 68 69 62  macro must exhib
f470: 69 74 20 65 78 74 65 72 6e 61 6c 20 73 65 6d 61  it external sema
f480: 6e 74 69 63 73 0a 2a 2a 20 69 64 65 6e 74 69 63  ntics.** identic
f490: 61 6c 20 74 6f 20 74 68 6f 73 65 20 6f 66 20 74  al to those of t
f4a0: 68 65 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52  he "winIoerrCanR
f4b0: 65 74 72 79 31 22 20 6d 61 63 72 6f 2e 0a 2a 2f  etry1" macro..*/
f4c0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 77 69  .#if !defined(wi
f4d0: 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 29  nIoerrCanRetry1)
f4e0: 0a 23 64 65 66 69 6e 65 20 77 69 6e 49 6f 65 72  .#define winIoer
f4f0: 72 43 61 6e 52 65 74 72 79 31 28 61 29 20 28 28  rCanRetry1(a) ((
f500: 28 61 29 3d 3d 45 52 52 4f 52 5f 41 43 43 45 53  (a)==ERROR_ACCES
f510: 53 5f 44 45 4e 49 45 44 29 20 20 20 20 20 20 20  S_DENIED)       
f520: 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20   || \.          
f530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f540: 20 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f      ((a)==ERROR_
f550: 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f  SHARING_VIOLATIO
f560: 4e 29 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20  N)    || \.     
f570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f580: 20 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45           ((a)==E
f590: 52 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54  RROR_LOCK_VIOLAT
f5a0: 49 4f 4e 29 20 20 20 20 20 20 20 7c 7c 20 5c 0a  ION)       || \.
f5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
f5d0: 61 29 3d 3d 45 52 52 4f 52 5f 44 45 56 5f 4e 4f  a)==ERROR_DEV_NO
f5e0: 54 5f 45 58 49 53 54 29 20 20 20 20 20 20 20 20  T_EXIST)        
f5f0: 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  || \.           
f600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f610: 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 4e     ((a)==ERROR_N
f620: 45 54 4e 41 4d 45 5f 44 45 4c 45 54 45 44 29 20  ETNAME_DELETED) 
f630: 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20       || \.      
f640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f650: 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52          ((a)==ER
f660: 52 4f 52 5f 53 45 4d 5f 54 49 4d 45 4f 55 54 29  ROR_SEM_TIMEOUT)
f670: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20            || \. 
f680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f690: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 61               ((a
f6a0: 29 3d 3d 45 52 52 4f 52 5f 4e 45 54 57 4f 52 4b  )==ERROR_NETWORK
f6b0: 5f 55 4e 52 45 41 43 48 41 42 4c 45 29 29 0a 23  _UNREACHABLE)).#
f6c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
f6d0: 61 20 52 65 61 64 46 69 6c 65 28 29 20 6f 72 20  a ReadFile() or 
f6e0: 57 72 69 74 65 46 69 6c 65 28 29 20 65 72 72 6f  WriteFile() erro
f6f0: 72 20 6f 63 63 75 72 73 2c 20 69 6e 76 6f 6b 65  r occurs, invoke
f700: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
f710: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 73 68   to see if it sh
f720: 6f 75 6c 64 20 62 65 20 72 65 74 72 69 65 64 2e  ould be retried.
f730: 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 74 6f    Return TRUE to
f740: 20 72 65 74 72 79 2e 20 20 52 65 74 75 72 6e 20   retry.  Return 
f750: 46 41 4c 53 45 0a 2a 2a 20 74 6f 20 67 69 76 65  FALSE.** to give
f760: 20 75 70 20 77 69 74 68 20 61 6e 20 65 72 72 6f   up with an erro
f770: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
f780: 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 69   winRetryIoerr(i
f790: 6e 74 20 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f  nt *pnRetry, DWO
f7a0: 52 44 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44  RD *pError){.  D
f7b0: 57 4f 52 44 20 65 20 3d 20 6f 73 47 65 74 4c 61  WORD e = osGetLa
f7c0: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 28  stError();.  if(
f7d0: 20 2a 70 6e 52 65 74 72 79 3e 3d 77 69 6e 49 6f   *pnRetry>=winIo
f7e0: 65 72 72 52 65 74 72 79 20 29 7b 0a 20 20 20 20  errRetry ){.    
f7f0: 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20  if( pError ){.  
f800: 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b      *pError = e;
f810: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
f820: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77  n 0;.  }.  if( w
f830: 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31  inIoerrCanRetry1
f840: 28 65 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  (e) ){.    sqlit
f850: 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 77  e3_win32_sleep(w
f860: 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  inIoerrRetryDela
f870: 79 2a 28 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b  y*(1+*pnRetry));
f880: 0a 20 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b  .    ++*pnRetry;
f890: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
f8a0: 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 77   }.#if defined(w
f8b0: 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32  inIoerrCanRetry2
f8c0: 29 0a 20 20 65 6c 73 65 20 69 66 28 20 77 69 6e  ).  else if( win
f8d0: 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32 28 65  IoerrCanRetry2(e
f8e0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
f8f0: 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 77 69 6e  _win32_sleep(win
f900: 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a  IoerrRetryDelay*
f910: 28 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a 20  (1+*pnRetry));. 
f920: 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a 20     ++*pnRetry;. 
f930: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
f940: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 45  .#endif.  if( pE
f950: 72 72 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45 72  rror ){.    *pEr
f960: 72 6f 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72  ror = e;.  }.  r
f970: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
f980: 2a 20 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f  * Log a I/O erro
f990: 72 20 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e  r retry episode.
f9a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f9b0: 77 69 6e 4c 6f 67 49 6f 65 72 72 28 69 6e 74 20  winLogIoerr(int 
f9c0: 6e 52 65 74 72 79 2c 20 69 6e 74 20 6c 69 6e 65  nRetry, int line
f9d0: 6e 6f 29 7b 0a 20 20 69 66 28 20 6e 52 65 74 72  no){.  if( nRetr
f9e0: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
f9f0: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54 49  _log(SQLITE_NOTI
fa00: 43 45 2c 0a 20 20 20 20 20 20 22 64 65 6c 61 79  CE,.      "delay
fa10: 65 64 20 25 64 6d 73 20 66 6f 72 20 6c 6f 63 6b  ed %dms for lock
fa20: 2f 73 68 61 72 69 6e 67 20 63 6f 6e 66 6c 69 63  /sharing conflic
fa30: 74 20 61 74 20 6c 69 6e 65 20 25 64 22 2c 0a 20  t at line %d",. 
fa40: 20 20 20 20 20 77 69 6e 49 6f 65 72 72 52 65 74       winIoerrRet
fa50: 72 79 44 65 6c 61 79 2a 6e 52 65 74 72 79 2a 28  ryDelay*nRetry*(
fa60: 6e 52 65 74 72 79 2b 31 29 2f 32 2c 20 6c 69 6e  nRetry+1)/2, lin
fa70: 65 6e 6f 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d  eno.    );.  }.}
fa80: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
fa90: 57 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  WINCE./*********
faa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fae0: 0a 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e  .** This section
faf0: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 66   contains code f
fb00: 6f 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a  or WinCE only..*
fb10: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
fb20: 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c  QLITE_MSVC_LOCAL
fb30: 54 49 4d 45 5f 41 50 49 29 20 7c 7c 20 21 53 51  TIME_API) || !SQ
fb40: 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54  LITE_MSVC_LOCALT
fb50: 49 4d 45 5f 41 50 49 0a 2f 2a 0a 2a 2a 20 54 68  IME_API./*.** Th
fb60: 65 20 4d 53 56 43 20 43 52 54 20 6f 6e 20 57 69  e MSVC CRT on Wi
fb70: 6e 64 6f 77 73 20 43 45 20 6d 61 79 20 6e 6f 74  ndows CE may not
fb80: 20 68 61 76 65 20 61 20 6c 6f 63 61 6c 74 69 6d   have a localtim
fb90: 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53  e() function.  S
fba0: 6f 0a 2a 2a 20 63 72 65 61 74 65 20 61 20 73 75  o.** create a su
fbb0: 62 73 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 69 6e  bstitute..*/.#in
fbc0: 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73  clude <time.h>.s
fbd0: 74 72 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65 63  truct tm *__cdec
fbe0: 6c 20 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e 73  l localtime(cons
fbf0: 74 20 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20  t time_t *t).{. 
fc00: 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 74   static struct t
fc10: 6d 20 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45 20  m y;.  FILETIME 
fc20: 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53 54  uTm, lTm;.  SYST
fc30: 45 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 20 73 71  EMTIME pTm;.  sq
fc40: 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 36 34 3b  lite3_int64 t64;
fc50: 0a 20 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20 74  .  t64 = *t;.  t
fc60: 36 34 20 3d 20 28 74 36 34 20 2b 20 31 31 36 34  64 = (t64 + 1164
fc70: 34 34 37 33 36 30 30 29 2a 31 30 30 30 30 30 30  4473600)*1000000
fc80: 30 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44 61  0;.  uTm.dwLowDa
fc90: 74 65 54 69 6d 65 20 3d 20 28 44 57 4f 52 44 29  teTime = (DWORD)
fca0: 28 74 36 34 20 26 20 30 78 46 46 46 46 46 46 46  (t64 & 0xFFFFFFF
fcb0: 46 29 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67 68  F);.  uTm.dwHigh
fcc0: 44 61 74 65 54 69 6d 65 3d 20 28 44 57 4f 52 44  DateTime= (DWORD
fcd0: 29 28 74 36 34 20 3e 3e 20 33 32 29 3b 0a 20 20  )(t64 >> 32);.  
fce0: 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61  osFileTimeToLoca
fcf0: 6c 46 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c 26  lFileTime(&uTm,&
fd00: 6c 54 6d 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69  lTm);.  osFileTi
fd10: 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28 26  meToSystemTime(&
fd20: 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e 74  lTm,&pTm);.  y.t
fd30: 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59 65  m_year = pTm.wYe
fd40: 61 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e 74  ar - 1900;.  y.t
fd50: 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e  m_mon = pTm.wMon
fd60: 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f 77  th - 1;.  y.tm_w
fd70: 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f 66  day = pTm.wDayOf
fd80: 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61  Week;.  y.tm_mda
fd90: 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20 20  y = pTm.wDay;.  
fda0: 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e  y.tm_hour = pTm.
fdb0: 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69  wHour;.  y.tm_mi
fdc0: 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b  n = pTm.wMinute;
fdd0: 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54  .  y.tm_sec = pT
fde0: 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65 74  m.wSecond;.  ret
fdf0: 75 72 6e 20 26 79 3b 0a 7d 0a 23 65 6e 64 69 66  urn &y;.}.#endif
fe00: 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45  ..#define HANDLE
fe10: 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28  _TO_WINFILE(a) (
fe20: 77 69 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72  winFile*)&((char
fe30: 2a 29 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65  *)a)[-(int)offse
fe40: 74 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a  tof(winFile,h)].
fe50: 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
fe60: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e   lock on the han
fe70: 64 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20  dle h.*/.static 
fe80: 76 6f 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41  void winceMutexA
fe90: 63 71 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29  cquire(HANDLE h)
fea0: 7b 0a 20 20 20 44 57 4f 52 44 20 64 77 45 72 72  {.   DWORD dwErr
feb0: 3b 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64  ;.   do {.     d
fec0: 77 45 72 72 20 3d 20 6f 73 57 61 69 74 46 6f 72  wErr = osWaitFor
fed0: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c 20  SingleObject(h, 
fee0: 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d 20  INFINITE);.   } 
fef0: 77 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d 20  while (dwErr != 
ff00: 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26 26  WAIT_OBJECT_0 &&
ff10: 20 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f 41   dwErr != WAIT_A
ff20: 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a  BANDONED);.}./*.
ff30: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63  ** Release a loc
ff40: 6b 20 61 63 71 75 69 72 65 64 20 62 79 20 77 69  k acquired by wi
ff50: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
ff60: 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e  ).*/.#define win
ff70: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 68  ceMutexRelease(h
ff80: 29 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28 68  ) ReleaseMutex(h
ff90: 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  )../*.** Create 
ffa0: 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73 68  the mutex and sh
ffb0: 61 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65 64  ared memory used
ffc0: 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e 20   for locking in 
ffd0: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  the file.** desc
ffe0: 72 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a  riptor pFile.*/.
fff0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 63 65  static int wince
10000 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74  CreateLock(const
10010 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
10020 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  , winFile *pFile
10030 29 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f 6b  ){.  LPWSTR zTok
10040 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d 65  ;.  LPWSTR zName
10050 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
10060 72 6e 6f 3b 0a 20 20 42 4f 4f 4c 20 62 4c 6f 67  rno;.  BOOL bLog
10070 67 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 42  ged = FALSE;.  B
10080 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52 55 45  OOL bInit = TRUE
10090 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 77 69 6e  ;..  zName = win
100a0 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46  Utf8ToUnicode(zF
100b0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
100c0 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
100d0 2f 2a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  /* out of memory
100e0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
100f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
10100 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  M;.  }..  /* Ini
10110 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 61  tialize the loca
10120 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20 20  l lockdata */.  
10130 6d 65 6d 73 65 74 28 26 70 46 69 6c 65 2d 3e 6c  memset(&pFile->l
10140 6f 63 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ocal, 0, sizeof(
10150 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a  pFile->local));.
10160 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68  .  /* Replace th
10170 65 20 62 61 63 6b 73 6c 61 73 68 65 73 20 66 72  e backslashes fr
10180 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  om the filename 
10190 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 69 74  and lowercase it
101a0 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69 76 65 20  .  ** to derive 
101b0 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a 2f  a mutex name. */
101c0 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73 43 68 61 72  .  zTok = osChar
101d0 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20  LowerW(zName);. 
101e0 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f   for (;*zTok;zTo
101f0 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a 7a  k++){.    if (*z
10200 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54  Tok == '\\') *zT
10210 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20  ok = '_';.  }.. 
10220 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e 20   /* Create/open 
10230 74 68 65 20 6e 61 6d 65 64 20 6d 75 74 65 78 20  the named mutex 
10240 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74  */.  pFile->hMut
10250 65 78 20 3d 20 6f 73 43 72 65 61 74 65 4d 75 74  ex = osCreateMut
10260 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c  exW(NULL, FALSE,
10270 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28 21   zName);.  if (!
10280 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a  pFile->hMutex){.
10290 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
102a0 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
102b0 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 73 71 6c  Error();.    sql
102c0 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29  ite3_free(zName)
102d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
102e0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
102f0 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61  IOERR, pFile->la
10300 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
10310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10320 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b  "winceCreateLock
10330 31 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  1", zFilename);.
10340 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
10350 65 20 74 68 65 20 6d 75 74 65 78 20 62 65 66 6f  e the mutex befo
10360 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 20 2a 2f  re continuing */
10370 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  .  winceMutexAcq
10380 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
10390 65 78 29 3b 0a 0a 20 20 2f 2a 20 53 69 6e 63 65  ex);..  /* Since
103a0 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6e 61   the names of na
103b0 6d 65 64 20 6d 75 74 65 78 65 73 2c 20 73 65 6d  med mutexes, sem
103c0 61 70 68 6f 72 65 73 2c 20 66 69 6c 65 20 6d 61  aphores, file ma
103d0 70 70 69 6e 67 73 20 65 74 63 20 61 72 65 0a 20  ppings etc are. 
103e0 20 2a 2a 20 63 61 73 65 2d 73 65 6e 73 69 74 69   ** case-sensiti
103f0 76 65 2c 20 74 61 6b 65 20 61 64 76 61 6e 74 61  ve, take advanta
10400 67 65 20 6f 66 20 74 68 61 74 20 62 79 20 75 70  ge of that by up
10410 70 65 72 63 61 73 69 6e 67 20 74 68 65 20 6d 75  percasing the mu
10420 74 65 78 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e  tex name.  ** an
10430 64 20 75 73 69 6e 67 20 74 68 61 74 20 61 73 20  d using that as 
10440 74 68 65 20 73 68 61 72 65 64 20 66 69 6c 65 6d  the shared filem
10450 61 70 70 69 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a  apping name..  *
10460 2f 0a 20 20 6f 73 43 68 61 72 55 70 70 65 72 57  /.  osCharUpperW
10470 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65  (zName);.  pFile
10480 2d 3e 68 53 68 61 72 65 64 20 3d 20 6f 73 43 72  ->hShared = osCr
10490 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
104a0 28 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  (INVALID_HANDLE_
104b0 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20  VALUE, NULL,.   
104c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104e0 20 20 20 20 20 50 41 47 45 5f 52 45 41 44 57 52       PAGE_READWR
104f0 49 54 45 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  ITE, 0, sizeof(w
10500 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20  inceLock),.     
10510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10530 20 20 20 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a     zName);..  /*
10540 20 53 65 74 20 61 20 66 6c 61 67 20 74 68 61 74   Set a flag that
10550 20 69 6e 64 69 63 61 74 65 73 20 77 65 27 72 65   indicates we're
10560 20 74 68 65 20 66 69 72 73 74 20 74 6f 20 63 72   the first to cr
10570 65 61 74 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  eate the memory 
10580 73 6f 20 69 74 0a 20 20 2a 2a 20 6d 75 73 74 20  so it.  ** must 
10590 62 65 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c 69  be zero-initiali
105a0 7a 65 64 20 2a 2f 0a 20 20 6c 61 73 74 45 72 72  zed */.  lastErr
105b0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
105c0 72 6f 72 28 29 3b 0a 20 20 69 66 20 28 6c 61 73  ror();.  if (las
105d0 74 45 72 72 6e 6f 20 3d 3d 20 45 52 52 4f 52 5f  tErrno == ERROR_
105e0 41 4c 52 45 41 44 59 5f 45 58 49 53 54 53 29 7b  ALREADY_EXISTS){
105f0 0a 20 20 20 20 62 49 6e 69 74 20 3d 20 46 41 4c  .    bInit = FAL
10600 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  SE;.  }..  sqlit
10610 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  e3_free(zName);.
10620 0a 20 20 2f 2a 20 49 66 20 77 65 20 73 75 63 63  .  /* If we succ
10630 65 65 64 65 64 20 69 6e 20 6d 61 6b 69 6e 67 20  eeded in making 
10640 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
10650 79 20 68 61 6e 64 6c 65 2c 20 6d 61 70 20 69 74  y handle, map it
10660 2e 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  . */.  if( pFile
10670 2d 3e 68 53 68 61 72 65 64 20 29 7b 0a 20 20 20  ->hShared ){.   
10680 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 3d   pFile->shared =
10690 20 28 77 69 6e 63 65 4c 6f 63 6b 2a 29 6f 73 4d   (winceLock*)osM
106a0 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69  apViewOfFile(pFi
106b0 6c 65 2d 3e 68 53 68 61 72 65 64 2c 0a 20 20 20  le->hShared,.   
106c0 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 4d            FILE_M
106d0 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f 4d 41 50  AP_READ|FILE_MAP
106e0 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c 20 73 69  _WRITE, 0, 0, si
106f0 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29  zeof(winceLock))
10700 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d 61 70 70  ;.    /* If mapp
10710 69 6e 67 20 66 61 69 6c 65 64 2c 20 63 6c 6f 73  ing failed, clos
10720 65 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  e the shared mem
10730 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e 64 20 65  ory handle and e
10740 72 61 73 65 20 69 74 20 2a 2f 0a 20 20 20 20 69  rase it */.    i
10750 66 28 20 21 70 46 69 6c 65 2d 3e 73 68 61 72 65  f( !pFile->share
10760 64 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  d ){.      pFile
10770 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
10780 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
10790 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f        winLogErro
107a0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  r(SQLITE_IOERR, 
107b0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
107c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
107d0 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74 65      "winceCreate
107e0 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c 65 6e 61 6d  Lock2", zFilenam
107f0 65 29 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67 65  e);.      bLogge
10800 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  d = TRUE;.      
10810 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
10820 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 20  ile->hShared);. 
10830 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 53 68 61       pFile->hSha
10840 72 65 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  red = NULL;.    
10850 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73  }.  }..  /* If s
10860 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 75  hared memory cou
10870 6c 64 20 6e 6f 74 20 62 65 20 63 72 65 61 74 65  ld not be create
10880 64 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68  d, then close th
10890 65 20 6d 75 74 65 78 20 61 6e 64 20 66 61 69 6c  e mutex and fail
108a0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
108b0 3e 68 53 68 61 72 65 64 3d 3d 4e 55 4c 4c 20 29  >hShared==NULL )
108c0 7b 0a 20 20 20 20 69 66 28 20 21 62 4c 6f 67 67  {.    if( !bLogg
108d0 65 64 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ed ){.      pFil
108e0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
108f0 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
10900 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
10910 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d  TE_IOERR, pFile-
10920 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
10930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
10940 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 33 22  inceCreateLock3"
10950 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
10960 20 20 20 20 62 4c 6f 67 67 65 64 20 3d 20 54 52      bLogged = TR
10970 55 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 69  UE;.    }.    wi
10980 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
10990 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
109a0 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
109b0 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
109c0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75  ;.    pFile->hMu
109d0 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  tex = NULL;.    
109e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
109f0 45 52 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ERR;.  }..  /* I
10a00 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 68  nitialize the sh
10a10 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 66 20 77  ared memory if w
10a20 65 27 72 65 20 73 75 70 70 6f 73 65 64 20 74 6f  e're supposed to
10a30 20 2a 2f 0a 20 20 69 66 28 20 62 49 6e 69 74 20   */.  if( bInit 
10a40 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 46  ){.    memset(pF
10a50 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20 30 2c 20  ile->shared, 0, 
10a60 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b  sizeof(winceLock
10a70 29 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65  ));.  }..  wince
10a80 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
10a90 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72  le->hMutex);.  r
10aa0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10ab0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f  .}../*.** Destro
10ac0 79 20 74 68 65 20 70 61 72 74 20 6f 66 20 77 69  y the part of wi
10ad0 6e 46 69 6c 65 20 74 68 61 74 20 64 65 61 6c 73  nFile that deals
10ae0 20 77 69 74 68 20 77 69 6e 63 65 20 6c 6f 63 6b   with wince lock
10af0 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
10b00 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63   winceDestroyLoc
10b10 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  k(winFile *pFile
10b20 29 7b 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  ){.  if (pFile->
10b30 68 4d 75 74 65 78 29 7b 0a 20 20 20 20 2f 2a 20  hMutex){.    /* 
10b40 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 65  Acquire the mute
10b50 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75  x */.    winceMu
10b60 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65  texAcquire(pFile
10b70 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20  ->hMutex);..    
10b80 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
10b90 20 62 6c 6f 63 6b 73 20 73 68 6f 75 6c 64 20 70   blocks should p
10ba0 72 6f 62 61 62 6c 79 20 61 73 73 65 72 74 20 69  robably assert i
10bb0 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 62 75  n debug mode, bu
10bc0 74 20 74 68 65 79 0a 20 20 20 20 20 20 20 61 72  t they.       ar
10bd0 65 20 74 6f 20 63 6c 65 61 6e 75 70 20 69 6e 20  e to cleanup in 
10be0 63 61 73 65 20 61 6e 79 20 6c 6f 63 6b 73 20 72  case any locks r
10bf0 65 6d 61 69 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a  emained open */.
10c00 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
10c10 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a  ocal.nReaders){.
10c20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
10c30 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d  red->nReaders --
10c40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
10c50 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65  pFile->local.bRe
10c60 73 65 72 76 65 64 29 7b 0a 20 20 20 20 20 20 70  served){.      p
10c70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52  File->shared->bR
10c80 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b  eserved = FALSE;
10c90 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70  .    }.    if (p
10ca0 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e  File->local.bPen
10cb0 64 69 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69  ding){.      pFi
10cc0 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e  le->shared->bPen
10cd0 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20  ding = FALSE;.  
10ce0 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c    }.    if (pFil
10cf0 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73  e->local.bExclus
10d00 69 76 65 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ive){.      pFil
10d10 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c  e->shared->bExcl
10d20 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20  usive = FALSE;. 
10d30 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 2d     }..    /* De-
10d40 72 65 66 65 72 65 6e 63 65 20 61 6e 64 20 63 6c  reference and cl
10d50 6f 73 65 20 6f 75 72 20 63 6f 70 79 20 6f 66 20  ose our copy of 
10d60 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
10d70 79 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20  y handle */.    
10d80 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c  osUnmapViewOfFil
10d90 65 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 29  e(pFile->shared)
10da0 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e  ;.    osCloseHan
10db0 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72  dle(pFile->hShar
10dc0 65 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 6e  ed);..    /* Don
10dd0 65 20 77 69 74 68 20 74 68 65 20 6d 75 74 65 78  e with the mutex
10de0 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74   */.    winceMut
10df0 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d  exRelease(pFile-
10e00 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 6f 73  >hMutex);.    os
10e10 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
10e20 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20  e->hMutex);.    
10e30 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20  pFile->hMutex = 
10e40 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  NULL;.  }.}../*.
10e50 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  ** An implementa
10e60 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b  tion of the Lock
10e70 46 69 6c 65 28 29 20 41 50 49 20 6f 66 20 57 69  File() API of Wi
10e80 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a  ndows for CE.*/.
10e90 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63  static BOOL winc
10ea0 65 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48  eLockFile(.  LPH
10eb0 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20  ANDLE phFile,.  
10ec0 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73  DWORD dwFileOffs
10ed0 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64  etLow,.  DWORD d
10ee0 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c  wFileOffsetHigh,
10ef0 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
10f00 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77  OfBytesToLockLow
10f10 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65  ,.  DWORD nNumbe
10f20 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69  rOfBytesToLockHi
10f30 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  gh.){.  winFile 
10f40 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f  *pFile = HANDLE_
10f50 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c  TO_WINFILE(phFil
10f60 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75  e);.  BOOL bRetu
10f70 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55  rn = FALSE;..  U
10f80 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
10f90 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68  dwFileOffsetHigh
10fa0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
10fb0 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42  METER(nNumberOfB
10fc0 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b  ytesToLockHigh);
10fd0 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e  ..  if (!pFile->
10fe0 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20 54  hMutex) return T
10ff0 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65  RUE;.  winceMute
11000 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e  xAcquire(pFile->
11010 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 57  hMutex);..  /* W
11020 61 6e 74 69 6e 67 20 61 6e 20 65 78 63 6c 75 73  anting an exclus
11030 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69  ive lock? */.  i
11040 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
11050 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41  ow == (DWORD)SHA
11060 52 45 44 5f 46 49 52 53 54 0a 20 20 20 20 20 20  RED_FIRST.      
11070 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74   && nNumberOfByt
11080 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28  esToLockLow == (
11090 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a  DWORD)SHARED_SIZ
110a0 45 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  E){.    if (pFil
110b0 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64  e->shared->nRead
110c0 65 72 73 20 3d 3d 20 30 20 26 26 20 70 46 69 6c  ers == 0 && pFil
110d0 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c  e->shared->bExcl
110e0 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20  usive == 0){.   
110f0 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
11100 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20  d->bExclusive = 
11110 54 52 55 45 3b 0a 20 20 20 20 20 20 20 70 46 69  TRUE;.       pFi
11120 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75  le->local.bExclu
11130 73 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20  sive = TRUE;.   
11140 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
11150 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
11160 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 61 64 2d   /* Want a read-
11170 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  only lock? */.  
11180 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f  else if (dwFileO
11190 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
111a0 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 20  RD)SHARED_FIRST 
111b0 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 6e 4e  &&.           nN
111c0 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
111d0 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20  ckLow == 1){.   
111e0 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72   if (pFile->shar
111f0 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
11200 3d 20 30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  = 0){.      pFil
11210 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
11220 73 20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 28  s ++;.      if (
11230 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
11240 61 64 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20  aders == 1){.   
11250 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
11260 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b  ed->nReaders ++;
11270 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
11280 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
11290 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
112a0 61 6e 74 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f  ant a pending lo
112b0 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ck? */.  else if
112c0 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
112d0 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44  w == (DWORD)PEND
112e0 49 4e 47 5f 42 59 54 45 0a 20 20 20 20 20 20 20  ING_BYTE.       
112f0 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66      && nNumberOf
11300 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d  BytesToLockLow =
11310 3d 20 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  = 1){.    /* If 
11320 6e 6f 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20  no pending lock 
11330 68 61 73 20 62 65 65 6e 20 61 63 71 75 69 72 65  has been acquire
11340 64 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20  d, then acquire 
11350 69 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46  it */.    if (pF
11360 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65  ile->shared->bPe
11370 6e 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20 20  nding == 0) {.  
11380 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
11390 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52  d->bPending = TR
113a0 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  UE;.      pFile-
113b0 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20  >local.bPending 
113c0 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52  = TRUE;.      bR
113d0 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
113e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61    }.  }..  /* Wa
113f0 6e 74 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  nt a reserved lo
11400 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ck? */.  else if
11410 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
11420 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45  w == (DWORD)RESE
11430 52 56 45 44 5f 42 59 54 45 0a 20 20 20 20 20 20  RVED_BYTE.      
11440 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f       && nNumberO
11450 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
11460 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70  == 1){.    if (p
11470 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52  File->shared->bR
11480 65 73 65 72 76 65 64 20 3d 3d 20 30 29 20 7b 0a  eserved == 0) {.
11490 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
114a0 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d  red->bReserved =
114b0 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69   TRUE;.      pFi
114c0 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
114d0 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ved = TRUE;.    
114e0 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
114f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77  ;.    }.  }..  w
11500 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
11510 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
11520 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74 75 72  .  return bRetur
11530 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  n;.}../*.** An i
11540 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
11550 20 74 68 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 20   the UnlockFile 
11560 41 50 49 20 6f 66 20 57 69 6e 64 6f 77 73 20 66  API of Windows f
11570 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20  or CE.*/.static 
11580 42 4f 4f 4c 20 77 69 6e 63 65 55 6e 6c 6f 63 6b  BOOL winceUnlock
11590 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45  File(.  LPHANDLE
115a0 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44   phFile,.  DWORD
115b0 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77   dwFileOffsetLow
115c0 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65  ,.  DWORD dwFile
115d0 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57  OffsetHigh,.  DW
115e0 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ORD nNumberOfByt
115f0 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20  esToUnlockLow,. 
11600 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66   DWORD nNumberOf
11610 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67  BytesToUnlockHig
11620 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  h.){.  winFile *
11630 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54  pFile = HANDLE_T
11640 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65  O_WINFILE(phFile
11650 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72  );.  BOOL bRetur
11660 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e  n = FALSE;..  UN
11670 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
11680 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29  wFileOffsetHigh)
11690 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
116a0 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79  ETER(nNumberOfBy
116b0 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 29  tesToUnlockHigh)
116c0 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d  ;..  if (!pFile-
116d0 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20  >hMutex) return 
116e0 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74  TRUE;.  winceMut
116f0 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d  exAcquire(pFile-
11700 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  >hMutex);..  /* 
11710 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65 61 64  Releasing a read
11720 65 72 20 6c 6f 63 6b 20 6f 72 20 61 6e 20 65 78  er lock or an ex
11730 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a  clusive lock */.
11740 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73    if (dwFileOffs
11750 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
11760 53 48 41 52 45 44 5f 46 49 52 53 54 29 7b 0a 20  SHARED_FIRST){. 
11770 20 20 20 2f 2a 20 44 69 64 20 77 65 20 68 61 76     /* Did we hav
11780 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  e an exclusive l
11790 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 69 66 20 28  ock? */.    if (
117a0 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78  pFile->local.bEx
117b0 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20  clusive){.      
117c0 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66  assert(nNumberOf
117d0 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
117e0 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
117f0 44 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 70  D_SIZE);.      p
11800 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63  File->local.bExc
11810 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a  lusive = FALSE;.
11820 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
11830 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
11840 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62  = FALSE;.      b
11850 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
11860 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 64     }..    /* Did
11870 20 77 65 20 6a 75 73 74 20 68 61 76 65 20 61 20   we just have a 
11880 72 65 61 64 65 72 20 6c 6f 63 6b 3f 20 2a 2f 0a  reader lock? */.
11890 20 20 20 20 65 6c 73 65 20 69 66 20 28 70 46 69      else if (pFi
118a0 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
118b0 72 73 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  rs){.      asser
118c0 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  t(nNumberOfBytes
118d0 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28  ToUnlockLow == (
118e0 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a  DWORD)SHARED_SIZ
118f0 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  E.             |
11900 7c 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  | nNumberOfBytes
11910 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  ToUnlockLow == 1
11920 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
11930 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d  local.nReaders -
11940 2d 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46 69  -;.      if (pFi
11950 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
11960 72 73 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b  rs == 0).      {
11970 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
11980 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73  shared->nReaders
11990 20 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   --;.      }.   
119a0 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
119b0 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
119c0 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 70  /* Releasing a p
119d0 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20  ending lock */. 
119e0 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65   else if (dwFile
119f0 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
11a00 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45  ORD)PENDING_BYTE
11a10 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e  .           && n
11a20 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
11a30 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  nlockLow == 1){.
11a40 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
11a50 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a  ocal.bPending){.
11a60 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
11a70 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41  al.bPending = FA
11a80 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  LSE;.      pFile
11a90 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69  ->shared->bPendi
11aa0 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ng = FALSE;.    
11ab0 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
11ac0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  ;.    }.  }.  /*
11ad0 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65 73   Releasing a res
11ae0 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20  erved lock */.  
11af0 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f  else if (dwFileO
11b00 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
11b10 52 44 29 52 45 53 45 52 56 45 44 5f 42 59 54 45  RD)RESERVED_BYTE
11b20 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e  .           && n
11b30 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
11b40 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  nlockLow == 1){.
11b50 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
11b60 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29 20  ocal.bReserved) 
11b70 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
11b80 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d  ocal.bReserved =
11b90 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46   FALSE;.      pF
11ba0 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65  ile->shared->bRe
11bb0 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a  served = FALSE;.
11bc0 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
11bd0 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
11be0 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c  .  winceMutexRel
11bf0 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
11c00 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52  ex);.  return bR
11c10 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45  eturn;.}./*.** E
11c20 6e 64 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  nd of the specia
11c30 6c 20 63 6f 64 65 20 66 6f 72 20 77 69 6e 63 65  l code for wince
11c40 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
11c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
11c90 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
11ca0 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a  _OS_WINCE */../*
11cb0 0a 2a 2a 20 4c 6f 63 6b 20 61 20 66 69 6c 65 20  .** Lock a file 
11cc0 72 65 67 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  region..*/.stati
11cd0 63 20 42 4f 4f 4c 20 77 69 6e 4c 6f 63 6b 46 69  c BOOL winLockFi
11ce0 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70  le(.  LPHANDLE p
11cf0 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 66  hFile,.  DWORD f
11d00 6c 61 67 73 2c 0a 20 20 44 57 4f 52 44 20 6f 66  lags,.  DWORD of
11d10 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  fsetLow,.  DWORD
11d20 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44   offsetHigh,.  D
11d30 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77  WORD numBytesLow
11d40 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74  ,.  DWORD numByt
11d50 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51  esHigh.){.#if SQ
11d60 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
11d70 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69  /*.  ** NOTE: Wi
11d80 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64  ndows CE is hand
11d90 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  led differently 
11da0 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63  here due its lac
11db0 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20  k of the Win32. 
11dc0 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f   **       API Lo
11dd0 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72  ckFile..  */.  r
11de0 65 74 75 72 6e 20 77 69 6e 63 65 4c 6f 63 6b 46  eturn winceLockF
11df0 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66 66 73  ile(phFile, offs
11e00 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67  etLow, offsetHig
11e10 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h,.             
11e20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74            numByt
11e30 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48  esLow, numBytesH
11e40 69 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66  igh);.#else.  if
11e50 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20  ( osIsNT() ){.  
11e60 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c    OVERLAPPED ovl
11e70 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f  p;.    memset(&o
11e80 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f  vlp, 0, sizeof(O
11e90 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20  VERLAPPED));.   
11ea0 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f   ovlp.Offset = o
11eb0 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76  ffsetLow;.    ov
11ec0 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20  lp.OffsetHigh = 
11ed0 6f 66 66 73 65 74 48 69 67 68 3b 0a 20 20 20 20  offsetHigh;.    
11ee0 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c  return osLockFil
11ef0 65 45 78 28 2a 70 68 46 69 6c 65 2c 20 66 6c 61  eEx(*phFile, fla
11f00 67 73 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c  gs, 0, numBytesL
11f10 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68  ow, numBytesHigh
11f20 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73  , &ovlp);.  }els
11f30 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  e{.    return os
11f40 4c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65  LockFile(*phFile
11f50 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66  , offsetLow, off
11f60 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65  setHigh, numByte
11f70 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  sLow,.          
11f80 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42              numB
11f90 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23  ytesHigh);.  }.#
11fa0 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  endif.}../*.** U
11fb0 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67  nlock a file reg
11fc0 69 6f 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ion.. */.static 
11fd0 42 4f 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  BOOL winUnlockFi
11fe0 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70  le(.  LPHANDLE p
11ff0 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 6f  hFile,.  DWORD o
12000 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52  ffsetLow,.  DWOR
12010 44 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20  D offsetHigh,.  
12020 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f  DWORD numBytesLo
12030 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79  w,.  DWORD numBy
12040 74 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53  tesHigh.){.#if S
12050 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
12060 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57   /*.  ** NOTE: W
12070 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e  indows CE is han
12080 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  dled differently
12090 20 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61   here due its la
120a0 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a  ck of the Win32.
120b0 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 55    **       API U
120c0 6e 6c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a  nlockFile..  */.
120d0 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65 55 6e    return winceUn
120e0 6c 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c  lockFile(phFile,
120f0 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73   offsetLow, offs
12100 65 74 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20  etHigh,.        
12110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12120 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75   numBytesLow, nu
12130 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 23 65 6c  mBytesHigh);.#el
12140 73 65 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28  se.  if( osIsNT(
12150 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50  ) ){.    OVERLAP
12160 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65  PED ovlp;.    me
12170 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73  mset(&ovlp, 0, s
12180 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44  izeof(OVERLAPPED
12190 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66  ));.    ovlp.Off
121a0 73 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b  set = offsetLow;
121b0 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74  .    ovlp.Offset
121c0 48 69 67 68 20 3d 20 6f 66 66 73 65 74 48 69 67  High = offsetHig
121d0 68 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  h;.    return os
121e0 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68  UnlockFileEx(*ph
121f0 46 69 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74 65  File, 0, numByte
12200 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69  sLow, numBytesHi
12210 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65  gh, &ovlp);.  }e
12220 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
12230 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a 70 68  osUnlockFile(*ph
12240 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c  File, offsetLow,
12250 20 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d   offsetHigh, num
12260 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20  BytesLow,.      
12270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12280 20 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b    numBytesHigh);
12290 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
122a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
122b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
122c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
122d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
122e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
122f0 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20   The next group 
12300 6f 66 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c  of routines impl
12310 65 6d 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d 65  ement the I/O me
12320 74 68 6f 64 73 20 73 70 65 63 69 66 69 65 64 0a  thods specified.
12330 2a 2a 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  ** by the sqlite
12340 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
12350 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ect..***********
12360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
123a0 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  ***/../*.** Some
123b0 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69   Microsoft compi
123c0 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64  lers lack this d
123d0 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  efinition..*/.#i
123e0 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45  fndef INVALID_SE
123f0 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23  T_FILE_POINTER.#
12400 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f   define INVALID_
12410 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
12420 20 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e   ((DWORD)-1).#en
12430 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  dif../*.** Move 
12440 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69  the current posi
12450 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65  tion of the file
12460 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61   handle passed a
12470 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61  s the first.** a
12480 72 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73 65  rgument to offse
12490 74 20 69 4f 66 66 73 65 74 20 77 69 74 68 69 6e  t iOffset within
124a0 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 73 75   the file. If su
124b0 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
124c0 20 30 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65   0..** Otherwise
124d0 2c 20 73 65 74 20 70 46 69 6c 65 2d 3e 6c 61 73  , set pFile->las
124e0 74 45 72 72 6e 6f 20 61 6e 64 20 72 65 74 75 72  tErrno and retur
124f0 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73  n non-zero..*/.s
12500 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 65  tatic int winSee
12510 6b 46 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70  kFile(winFile *p
12520 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e  File, sqlite3_in
12530 74 36 34 20 69 4f 66 66 73 65 74 29 7b 0a 23 69  t64 iOffset){.#i
12540 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
12550 52 54 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72 42  RT.  LONG upperB
12560 69 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  its;            
12570 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 73 69 67       /* Most sig
12580 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77  . 32 bits of new
12590 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 4c 4f 4e   offset */.  LON
125a0 47 20 6c 6f 77 65 72 42 69 74 73 3b 20 20 20 20  G lowerBits;    
125b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
125c0 4c 65 61 73 74 20 73 69 67 2e 20 33 32 20 62 69  Least sig. 32 bi
125d0 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65 74  ts of new offset
125e0 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 52 65   */.  DWORD dwRe
125f0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
12600 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
12610 65 74 75 72 6e 65 64 20 62 79 20 53 65 74 46 69  eturned by SetFi
12620 6c 65 50 6f 69 6e 74 65 72 28 29 20 2a 2f 0a 20  lePointer() */. 
12630 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
12640 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12650 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
12660 65 64 20 62 79 20 47 65 74 4c 61 73 74 45 72 72  ed by GetLastErr
12670 6f 72 28 29 20 2a 2f 0a 0a 20 20 4f 53 54 52 41  or() */..  OSTRA
12680 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25  CE(("SEEK file=%
12690 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 5c 6e  p, offset=%lld\n
126a0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 69 4f 66  ", pFile->h, iOf
126b0 66 73 65 74 29 29 3b 0a 0a 20 20 75 70 70 65 72  fset));..  upper
126c0 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28 69  Bits = (LONG)((i
126d0 4f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78  Offset>>32) & 0x
126e0 37 66 66 66 66 66 66 66 29 3b 0a 20 20 6c 6f 77  7fffffff);.  low
126f0 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28  erBits = (LONG)(
12700 69 4f 66 66 73 65 74 20 26 20 30 78 66 66 66 66  iOffset & 0xffff
12710 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20 41 50 49  ffff);..  /* API
12720 20 6f 64 64 69 74 79 3a 20 49 66 20 73 75 63 63   oddity: If succ
12730 65 73 73 66 75 6c 2c 20 53 65 74 46 69 6c 65 50  essful, SetFileP
12740 6f 69 6e 74 65 72 28 29 20 72 65 74 75 72 6e 73  ointer() returns
12750 20 61 20 64 77 6f 72 64 0a 20 20 2a 2a 20 63 6f   a dword.  ** co
12760 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f 77  ntaining the low
12770 65 72 20 33 32 2d 62 69 74 73 20 6f 66 20 74 68  er 32-bits of th
12780 65 20 6e 65 77 20 66 69 6c 65 2d 6f 66 66 73 65  e new file-offse
12790 74 2e 20 4f 72 2c 20 69 66 20 69 74 20 66 61 69  t. Or, if it fai
127a0 6c 73 2c 0a 20 20 2a 2a 20 69 74 20 72 65 74 75  ls,.  ** it retu
127b0 72 6e 73 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f  rns INVALID_SET_
127c0 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2e 20 48 6f  FILE_POINTER. Ho
127d0 77 65 76 65 72 20 61 63 63 6f 72 64 69 6e 67 20  wever according 
127e0 74 6f 20 4d 53 44 4e 2c 0a 20 20 2a 2a 20 49 4e  to MSDN,.  ** IN
127f0 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
12800 4f 49 4e 54 45 52 20 6d 61 79 20 61 6c 73 6f 20  OINTER may also 
12810 62 65 20 61 20 76 61 6c 69 64 20 6e 65 77 20 6f  be a valid new o
12820 66 66 73 65 74 2e 20 53 6f 20 74 6f 20 64 65 74  ffset. So to det
12830 65 72 6d 69 6e 65 0a 20 20 2a 2a 20 77 68 65 74  ermine.  ** whet
12840 68 65 72 20 61 6e 20 65 72 72 6f 72 20 68 61 73  her an error has
12850 20 61 63 74 75 61 6c 6c 79 20 6f 63 63 75 72 72   actually occurr
12860 65 64 2c 20 69 74 20 69 73 20 61 6c 73 6f 20 6e  ed, it is also n
12870 65 63 65 73 73 61 72 79 20 74 6f 20 63 61 6c 6c  ecessary to call
12880 0a 20 20 2a 2a 20 47 65 74 4c 61 73 74 45 72 72  .  ** GetLastErr
12890 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 64 77 52  or()..  */.  dwR
128a0 65 74 20 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f  et = osSetFilePo
128b0 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20  inter(pFile->h, 
128c0 6c 6f 77 65 72 42 69 74 73 2c 20 26 75 70 70 65  lowerBits, &uppe
128d0 72 42 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49  rBits, FILE_BEGI
128e0 4e 29 3b 0a 0a 20 20 69 66 28 20 28 64 77 52 65  N);..  if( (dwRe
128f0 74 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46  t==INVALID_SET_F
12900 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 20 20 20 20  ILE_POINTER.    
12910 20 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f    && ((lastErrno
12920 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
12930 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 29  r())!=NO_ERROR))
12940 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
12950 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
12960 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  rrno;.    winLog
12970 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
12980 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e  RR_SEEK, pFile->
12990 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
129a0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53             "winS
129b0 65 65 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d  eekFile", pFile-
129c0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 4f 53 54  >zPath);.    OST
129d0 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65  RACE(("SEEK file
129e0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%p, rc=SQLITE_I
129f0 4f 45 52 52 5f 53 45 45 4b 5c 6e 22 2c 20 70 46  OERR_SEEK\n", pF
12a00 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65  ile->h));.    re
12a10 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f  turn 1;.  }..  O
12a20 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69  STRACE(("SEEK fi
12a30 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
12a40 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
12a50 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  ));.  return 0;.
12a60 23 65 6c 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20  #else.  /*.  ** 
12a70 53 61 6d 65 20 61 73 20 61 62 6f 76 65 2c 20 65  Same as above, e
12a80 78 63 65 70 74 20 74 68 61 74 20 74 68 69 73 20  xcept that this 
12a90 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77  implementation w
12aa0 6f 72 6b 73 20 66 6f 72 20 57 69 6e 52 54 2e 0a  orks for WinRT..
12ab0 20 20 2a 2f 0a 0a 20 20 4c 41 52 47 45 5f 49 4e    */..  LARGE_IN
12ac0 54 45 47 45 52 20 78 3b 20 20 20 20 20 20 20 20  TEGER x;        
12ad0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
12ae0 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 42  ew offset */.  B
12af0 4f 4f 4c 20 62 52 65 74 3b 20 20 20 20 20 20 20  OOL bRet;       
12b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12b10 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
12b20 20 62 79 20 53 65 74 46 69 6c 65 50 6f 69 6e 74   by SetFilePoint
12b30 65 72 45 78 28 29 20 2a 2f 0a 0a 20 20 78 2e 51  erEx() */..  x.Q
12b40 75 61 64 50 61 72 74 20 3d 20 69 4f 66 66 73 65  uadPart = iOffse
12b50 74 3b 0a 20 20 62 52 65 74 20 3d 20 6f 73 53 65  t;.  bRet = osSe
12b60 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 28 70  tFilePointerEx(p
12b70 46 69 6c 65 2d 3e 68 2c 20 78 2c 20 30 2c 20 46  File->h, x, 0, F
12b80 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69  ILE_BEGIN);..  i
12b90 66 28 21 62 52 65 74 29 7b 0a 20 20 20 20 70 46  f(!bRet){.    pF
12ba0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
12bb0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
12bc0 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  );.    winLogErr
12bd0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
12be0 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  SEEK, pFile->las
12bf0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
12c00 20 20 20 20 20 20 20 20 22 77 69 6e 53 65 65 6b          "winSeek
12c10 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  File", pFile->zP
12c20 61 74 68 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ath);.    OSTRAC
12c30 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70  E(("SEEK file=%p
12c40 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
12c50 52 5f 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c 65  R_SEEK\n", pFile
12c60 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
12c70 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52  n 1;.  }..  OSTR
12c80 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d  ACE(("SEEK file=
12c90 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
12ca0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
12cb0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e  .  return 0;.#en
12cc0 64 69 66 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  dif.}..#if SQLIT
12cd0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
12ce0 30 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  0./* Forward ref
12cf0 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 68  erences to VFS h
12d00 65 6c 70 65 72 20 6d 65 74 68 6f 64 73 20 75 73  elper methods us
12d10 65 64 20 66 6f 72 20 6d 65 6d 6f 72 79 20 6d 61  ed for memory ma
12d20 70 70 65 64 20 66 69 6c 65 73 20 2a 2f 0a 73 74  pped files */.st
12d30 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 61 70 66  atic int winMapf
12d40 69 6c 65 28 77 69 6e 46 69 6c 65 2a 2c 20 73 71  ile(winFile*, sq
12d50 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 73 74  lite3_int64);.st
12d60 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61  atic int winUnma
12d70 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 2a 29 3b  pfile(winFile*);
12d80 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
12d90 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a  lose a file..**.
12da0 2a 2a 20 49 74 20 69 73 20 72 65 70 6f 72 74 65  ** It is reporte
12db0 64 20 74 68 61 74 20 61 6e 20 61 74 74 65 6d 70  d that an attemp
12dc0 74 20 74 6f 20 63 6c 6f 73 65 20 61 20 68 61 6e  t to close a han
12dd0 64 6c 65 20 6d 69 67 68 74 20 73 6f 6d 65 74 69  dle might someti
12de0 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54 68  mes.** fail.  Th
12df0 69 73 20 69 73 20 61 20 76 65 72 79 20 75 6e 72  is is a very unr
12e00 65 61 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c 74  easonable result
12e10 2c 20 62 75 74 20 57 69 6e 64 6f 77 73 20 69 73  , but Windows is
12e20 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f   notorious.** fo
12e30 72 20 62 65 69 6e 67 20 75 6e 72 65 61 73 6f 6e  r being unreason
12e40 61 62 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f 74  able so I do not
12e50 20 64 6f 75 62 74 20 74 68 61 74 20 69 74 20 6d   doubt that it m
12e60 69 67 68 74 20 68 61 70 70 65 6e 2e 20 20 49 66  ight happen.  If
12e70 0a 2a 2a 20 74 68 65 20 63 6c 6f 73 65 20 66 61  .** the close fa
12e80 69 6c 73 2c 20 77 65 20 70 61 75 73 65 20 66 6f  ils, we pause fo
12e90 72 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e  r 100 millisecon
12ea0 64 73 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e  ds and try again
12eb0 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61 73  .  As.** many as
12ec0 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50   MX_CLOSE_ATTEMP
12ed0 54 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63 6c  T attempts to cl
12ee0 6f 73 65 20 74 68 65 20 68 61 6e 64 6c 65 20 61  ose the handle a
12ef0 72 65 20 6d 61 64 65 20 62 65 66 6f 72 65 0a 2a  re made before.*
12f00 2a 20 67 69 76 69 6e 67 20 75 70 20 61 6e 64 20  * giving up and 
12f10 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  returning an err
12f20 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  or..*/.#define M
12f30 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20  X_CLOSE_ATTEMPT 
12f40 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  3.static int win
12f50 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
12f60 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72  le *id){.  int r
12f70 63 2c 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77 69  c, cnt = 0;.  wi
12f80 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
12f90 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  winFile*)id;..  
12fa0 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
12fb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12fc0 4f 4d 49 54 5f 57 41 4c 0a 20 20 61 73 73 65 72  OMIT_WAL.  asser
12fd0 74 28 20 70 46 69 6c 65 2d 3e 70 53 68 6d 3d 3d  t( pFile->pShm==
12fe0 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  0 );.#endif.  as
12ff0 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 68 21 3d  sert( pFile->h!=
13000 4e 55 4c 4c 20 26 26 20 70 46 69 6c 65 2d 3e 68  NULL && pFile->h
13010 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
13020 5f 56 41 4c 55 45 20 29 3b 0a 20 20 4f 53 54 52  _VALUE );.  OSTR
13030 41 43 45 28 28 22 43 4c 4f 53 45 20 70 69 64 3d  ACE(("CLOSE pid=
13040 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66  %lu, pFile=%p, f
13050 69 6c 65 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20  ile=%p\n",.     
13060 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
13070 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
13080 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29  File, pFile->h))
13090 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ;..#if SQLITE_MA
130a0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
130b0 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 69  winUnmapfile(pFi
130c0 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64  le);.#endif..  d
130d0 6f 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 43 6c  o{.    rc = osCl
130e0 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
130f0 3e 68 29 3b 0a 20 20 20 20 2f 2a 20 53 69 6d 75  >h);.    /* Simu
13100 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
13110 30 3b 20 63 6e 74 3d 4d 58 5f 43 4c 4f 53 45 5f  0; cnt=MX_CLOSE_
13120 41 54 54 45 4d 50 54 3b 20 29 3b 20 2a 2f 0a 20  ATTEMPT; ); */. 
13130 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 30 20 26   }while( rc==0 &
13140 26 20 2b 2b 63 6e 74 20 3c 20 4d 58 5f 43 4c 4f  & ++cnt < MX_CLO
13150 53 45 5f 41 54 54 45 4d 50 54 20 26 26 20 28 73  SE_ATTEMPT && (s
13160 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
13170 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 23  ep(100), 1) );.#
13180 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
13190 43 45 0a 23 64 65 66 69 6e 65 20 57 49 4e 43 45  CE.#define WINCE
131a0 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50  _DELETION_ATTEMP
131b0 54 53 20 33 0a 20 20 77 69 6e 63 65 44 65 73 74  TS 3.  winceDest
131c0 72 6f 79 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  royLock(pFile);.
131d0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a 44 65    if( pFile->zDe
131e0 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20  leteOnClose ){. 
131f0 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a     int cnt = 0;.
13200 20 20 20 20 77 68 69 6c 65 28 0a 20 20 20 20 20      while(.     
13210 20 20 20 20 20 20 6f 73 44 65 6c 65 74 65 46 69        osDeleteFi
13220 6c 65 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65  leW(pFile->zDele
13230 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20 20  teOnClose)==0.  
13240 20 20 20 20 20 20 26 26 20 6f 73 47 65 74 46 69        && osGetFi
13250 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 70 46  leAttributesW(pF
13260 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
13270 6f 73 65 29 21 3d 30 78 66 66 66 66 66 66 66 66  ose)!=0xffffffff
13280 0a 20 20 20 20 20 20 20 20 26 26 20 63 6e 74 2b  .        && cnt+
13290 2b 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45 54 49  + < WINCE_DELETI
132a0 4f 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20 20 20  ON_ATTEMPTS.    
132b0 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65  ){.       sqlite
132c0 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 30  3_win32_sleep(10
132d0 30 29 3b 20 20 2f 2a 20 57 61 69 74 20 61 20 6c  0);  /* Wait a l
132e0 69 74 74 6c 65 20 62 65 66 6f 72 65 20 74 72 79  ittle before try
132f0 69 6e 67 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20  ing again */.   
13300 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
13310 72 65 65 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65  ree(pFile->zDele
13320 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a  teOnClose);.  }.
13330 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 20  #endif.  if( rc 
13340 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 20  ){.    pFile->h 
13350 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 70  = NULL;.  }.  Op
13360 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20  enCounter(-1);. 
13370 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45   OSTRACE(("CLOSE
13380 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
13390 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  %p, file=%p, rc=
133a0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
133b0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
133c0 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
133d0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 20 3f  , pFile->h, rc ?
133e0 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
133f0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20  ));.  return rc 
13400 3f 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20  ? SQLITE_OK.    
13410 20 20 20 20 20 20 20 20 3a 20 77 69 6e 4c 6f 67          : winLog
13420 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
13430 52 52 5f 43 4c 4f 53 45 2c 20 6f 73 47 65 74 4c  RR_CLOSE, osGetL
13440 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
13450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13460 20 20 20 20 20 20 22 77 69 6e 43 6c 6f 73 65 22        "winClose"
13470 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
13480 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64  .}../*.** Read d
13490 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20  ata from a file 
134a0 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20  into a buffer.  
134b0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
134c0 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73   if all.** bytes
134d0 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65   were read succe
134e0 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49  ssfully and SQLI
134f0 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74  TE_IOERR if anyt
13500 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
13510 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
13520 74 20 77 69 6e 52 65 61 64 28 0a 20 20 73 71 6c  t winRead(.  sql
13530 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20  ite3_file *id,  
13540 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
13550 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
13560 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
13570 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13580 57 72 69 74 65 20 63 6f 6e 74 65 6e 74 20 69 6e  Write content in
13590 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a  to this buffer *
135a0 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20  /.  int amt,    
135b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
135c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
135d0 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 73  s to read */.  s
135e0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
135f0 73 65 74 20 20 20 20 20 20 20 2f 2a 20 42 65 67  set       /* Beg
13600 69 6e 20 72 65 61 64 69 6e 67 20 61 74 20 74 68  in reading at th
13610 69 73 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a  is offset */.){.
13620 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
13630 49 4e 43 45 20 26 26 20 21 64 65 66 69 6e 65 64  INCE && !defined
13640 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f  (SQLITE_WIN32_NO
13650 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a 20 20 4f  _OVERLAPPED).  O
13660 56 45 52 4c 41 50 50 45 44 20 6f 76 65 72 6c 61  VERLAPPED overla
13670 70 70 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f  pped;          /
13680 2a 20 54 68 65 20 6f 66 66 73 65 74 20 66 6f 72  * The offset for
13690 20 52 65 61 64 46 69 6c 65 2e 20 2a 2f 0a 23 65   ReadFile. */.#e
136a0 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20 2a  ndif.  winFile *
136b0 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
136c0 2a 29 69 64 3b 20 20 2f 2a 20 66 69 6c 65 20 68  *)id;  /* file h
136d0 61 6e 64 6c 65 20 2a 2f 0a 20 20 44 57 4f 52 44  andle */.  DWORD
136e0 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20 20   nRead;         
136f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
13700 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
13710 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d  tually read from
13720 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
13730 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20 20 20  Retry = 0;      
13740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
13750 6d 62 65 72 20 6f 66 20 72 65 74 72 79 73 20 2a  mber of retrys *
13760 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  /..  assert( id!
13770 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
13780 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  amt>0 );.  asser
13790 74 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a  t( offset>=0 );.
137a0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
137b0 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
137c0 49 4f 45 52 52 5f 52 45 41 44 29 3b 0a 20 20 4f  IOERR_READ);.  O
137d0 53 54 52 41 43 45 28 28 22 52 45 41 44 20 70 69  STRACE(("READ pi
137e0 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
137f0 20 66 69 6c 65 3d 25 70 2c 20 62 75 66 66 65 72   file=%p, buffer
13800 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20  =%p, amount=%d, 
13810 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 6f 66  ".           "of
13820 66 73 65 74 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d  fset=%lld, lock=
13830 25 64 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72 72  %d\n", osGetCurr
13840 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
13850 70 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 20  pFile,.         
13860 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66    pFile->h, pBuf
13870 2c 20 61 6d 74 2c 20 6f 66 66 73 65 74 2c 20 70  , amt, offset, p
13880 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29  File->locktype))
13890 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ;..#if SQLITE_MA
138a0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
138b0 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61 73 20  /* Deal with as 
138c0 6d 75 63 68 20 6f 66 20 74 68 69 73 20 72 65 61  much of this rea
138d0 64 20 72 65 71 75 65 73 74 20 61 73 20 70 6f 73  d request as pos
138e0 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65  sible by transfe
138f0 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66  ring.  ** data f
13900 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d  rom the memory m
13910 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d  apping using mem
13920 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28  cpy().  */.  if(
13930 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d   offset<pFile->m
13940 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69  mapSize ){.    i
13950 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d  f( offset+amt <=
13960 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
13970 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
13980 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28  (pBuf, &((u8 *)(
13990 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
139a0 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 61 6d 74  n))[offset], amt
139b0 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
139c0 28 28 22 52 45 41 44 2d 4d 4d 41 50 20 70 69 64  (("READ-MMAP pid
139d0 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
139e0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
139f0 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
13a00 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
13a10 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
13a20 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  , pFile, pFile->
13a30 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
13a40 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
13a50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
13a60 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e 74 29 28  t nCopy = (int)(
13a70 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
13a80 2d 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  - offset);.     
13a90 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28   memcpy(pBuf, &(
13aa0 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d  (u8 *)(pFile->pM
13ab0 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65  apRegion))[offse
13ac0 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20  t], nCopy);.    
13ad0 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a    pBuf = &((u8 *
13ae0 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20  )pBuf)[nCopy];. 
13af0 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70       amt -= nCop
13b00 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20  y;.      offset 
13b10 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a  += nCopy;.    }.
13b20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20    }.#endif..#if 
13b30 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
13b40 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
13b50 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c  E_WIN32_NO_OVERL
13b60 41 50 50 45 44 29 0a 20 20 69 66 28 20 77 69 6e  APPED).  if( win
13b70 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20  SeekFile(pFile, 
13b80 6f 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20 4f  offset) ){.    O
13b90 53 54 52 41 43 45 28 28 22 52 45 41 44 20 70 69  STRACE(("READ pi
13ba0 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
13bb0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
13bc0 49 54 45 5f 46 55 4c 4c 5c 6e 22 2c 0a 20 20 20  ITE_FULL\n",.   
13bd0 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
13be0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
13bf0 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  ), pFile, pFile-
13c00 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >h));.    return
13c10 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
13c20 7d 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 52 65  }.  while( !osRe
13c30 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  adFile(pFile->h,
13c40 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65   pBuf, amt, &nRe
13c50 61 64 2c 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a  ad, 0) ){.#else.
13c60 20 20 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c 61    memset(&overla
13c70 70 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pped, 0, sizeof(
13c80 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20  OVERLAPPED));.  
13c90 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65  overlapped.Offse
13ca0 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65  t = (LONG)(offse
13cb0 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b  t & 0xffffffff);
13cc0 0a 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66  .  overlapped.Of
13cd0 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47  fsetHigh = (LONG
13ce0 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26  )((offset>>32) &
13cf0 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20   0x7fffffff);.  
13d00 77 68 69 6c 65 28 20 21 6f 73 52 65 61 64 46 69  while( !osReadFi
13d10 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75  le(pFile->h, pBu
13d20 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20  f, amt, &nRead, 
13d30 26 6f 76 65 72 6c 61 70 70 65 64 29 20 26 26 0a  &overlapped) &&.
13d40 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61           osGetLa
13d50 73 74 45 72 72 6f 72 28 29 21 3d 45 52 52 4f 52  stError()!=ERROR
13d60 5f 48 41 4e 44 4c 45 5f 45 4f 46 20 29 7b 0a 23  _HANDLE_EOF ){.#
13d70 65 6e 64 69 66 0a 20 20 20 20 44 57 4f 52 44 20  endif.    DWORD 
13d80 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 69  lastErrno;.    i
13d90 66 28 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72  f( winRetryIoerr
13da0 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73 74 45  (&nRetry, &lastE
13db0 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65  rrno) ) continue
13dc0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  ;.    pFile->las
13dd0 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
13de0 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  no;.    OSTRACE(
13df0 28 22 52 45 41 44 20 70 69 64 3d 25 6c 75 2c 20  ("READ pid=%lu, 
13e00 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25  pFile=%p, file=%
13e10 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  p, rc=SQLITE_IOE
13e20 52 52 5f 52 45 41 44 5c 6e 22 2c 0a 20 20 20 20  RR_READ\n",.    
13e30 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
13e40 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
13e50 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  , pFile, pFile->
13e60 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  h));.    return 
13e70 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
13e80 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 2c 20 70  TE_IOERR_READ, p
13e90 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
13ea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13eb0 20 20 20 20 20 20 20 20 22 77 69 6e 52 65 61 64          "winRead
13ec0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
13ed0 3b 0a 20 20 7d 0a 20 20 77 69 6e 4c 6f 67 49 6f  ;.  }.  winLogIo
13ee0 65 72 72 28 6e 52 65 74 72 79 2c 20 5f 5f 4c 49  err(nRetry, __LI
13ef0 4e 45 5f 5f 29 3b 0a 20 20 69 66 28 20 6e 52 65  NE__);.  if( nRe
13f00 61 64 3c 28 44 57 4f 52 44 29 61 6d 74 20 29 7b  ad<(DWORD)amt ){
13f10 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70  .    /* Unread p
13f20 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66 66  arts of the buff
13f30 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d  er must be zero-
13f40 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65  filled */.    me
13f50 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70 42  mset(&((char*)pB
13f60 75 66 29 5b 6e 52 65 61 64 5d 2c 20 30 2c 20 61  uf)[nRead], 0, a
13f70 6d 74 2d 6e 52 65 61 64 29 3b 0a 20 20 20 20 4f  mt-nRead);.    O
13f80 53 54 52 41 43 45 28 28 22 52 45 41 44 20 70 69  STRACE(("READ pi
13f90 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
13fa0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
13fb0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
13fc0 52 45 41 44 5c 6e 22 2c 0a 20 20 20 20 20 20 20  READ\n",.       
13fd0 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
13fe0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
13ff0 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29  File, pFile->h))
14000 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
14010 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
14020 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  READ;.  }..  OST
14030 52 41 43 45 28 28 22 52 45 41 44 20 70 69 64 3d  RACE(("READ pid=
14040 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66  %lu, pFile=%p, f
14050 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
14060 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
14070 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
14080 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
14090 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  le, pFile->h));.
140a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
140b0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  OK;.}../*.** Wri
140c0 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  te data from a b
140d0 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c  uffer into a fil
140e0 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
140f0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a  E_OK on success.
14100 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ** or some other
14110 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66   error code on f
14120 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ailure..*/.stati
14130 63 20 69 6e 74 20 77 69 6e 57 72 69 74 65 28 0a  c int winWrite(.
14140 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
14150 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
14160 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 77 72 69    /* File to wri
14170 74 65 20 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f 6e  te into */.  con
14180 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  st void *pBuf,  
14190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
141a0 54 68 65 20 62 79 74 65 73 20 74 6f 20 62 65 20  The bytes to be 
141b0 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74  written */.  int
141c0 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
141d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
141e0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
141f0 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 73 71  to write */.  sq
14200 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
14210 65 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  et            /*
14220 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65   Offset into the
14230 20 66 69 6c 65 20 74 6f 20 62 65 67 69 6e 20 77   file to begin w
14240 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a 29 7b 0a  riting at */.){.
14250 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20    int rc = 0;   
14260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14270 20 20 2f 2a 20 54 72 75 65 20 69 66 20 65 72 72    /* True if err
14280 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c  or has occurred,
14290 20 65 6c 73 65 20 66 61 6c 73 65 20 2a 2f 0a 20   else false */. 
142a0 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
142b0 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20  = (winFile*)id; 
142c0 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20   /* File handle 
142d0 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72 79 20  */.  int nRetry 
142e0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
142f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
14300 66 20 72 65 74 72 69 65 73 20 2a 2f 0a 0a 20 20  f retries */..  
14310 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b  assert( amt>0 );
14320 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
14330 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   );.  SimulateIO
14340 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
14350 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 29  ITE_IOERR_WRITE)
14360 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b  ;.  SimulateDisk
14370 66 75 6c 6c 45 72 72 6f 72 28 72 65 74 75 72 6e  fullError(return
14380 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a 0a   SQLITE_FULL);..
14390 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54    OSTRACE(("WRIT
143a0 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
143b0 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 62 75  =%p, file=%p, bu
143c0 66 66 65 72 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d  ffer=%p, amount=
143d0 25 64 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  %d, ".          
143e0 20 22 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 6c   "offset=%lld, l
143f0 6f 63 6b 3d 25 64 5c 6e 22 2c 20 6f 73 47 65 74  ock=%d\n", osGet
14400 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
14410 28 29 2c 20 70 46 69 6c 65 2c 0a 20 20 20 20 20  (), pFile,.     
14420 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
14430 70 42 75 66 2c 20 61 6d 74 2c 20 6f 66 66 73 65  pBuf, amt, offse
14440 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t, pFile->lockty
14450 70 65 29 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e  pe));..#if defin
14460 65 64 28 53 51 4c 49 54 45 5f 4d 4d 41 50 5f 52  ed(SQLITE_MMAP_R
14470 45 41 44 57 52 49 54 45 29 20 26 26 20 53 51 4c  EADWRITE) && SQL
14480 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
14490 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69  E>0.  /* Deal wi
144a0 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68  th as much of th
144b0 69 73 20 77 72 69 74 65 20 72 65 71 75 65 73 74  is write request
144c0 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20   as possible by 
144d0 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a  transfering.  **
144e0 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d   data from the m
144f0 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73  emory mapping us
14500 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a  ing memcpy().  *
14510 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70  /.  if( offset<p
14520 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
14530 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74  {.    if( offset
14540 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d  +amt <= pFile->m
14550 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  mapSize ){.     
14560 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29   memcpy(&((u8 *)
14570 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
14580 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42  on))[offset], pB
14590 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20  uf, amt);.      
145a0 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45 2d  OSTRACE(("WRITE-
145b0 4d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 70 46  MMAP pid=%lu, pF
145c0 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c  ile=%p, file=%p,
145d0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
145e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
145f0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
14600 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
14610 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
14620 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14630 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
14640 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20        int nCopy 
14650 3d 20 28 69 6e 74 29 28 70 46 69 6c 65 2d 3e 6d  = (int)(pFile->m
14660 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74  mapSize - offset
14670 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
14680 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
14690 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
146a0 73 65 74 5d 2c 20 70 42 75 66 2c 20 6e 43 6f 70  set], pBuf, nCop
146b0 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d  y);.      pBuf =
146c0 20 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e   &((u8 *)pBuf)[n
146d0 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74  Copy];.      amt
146e0 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20   -= nCopy;.     
146f0 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79   offset += nCopy
14700 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
14710 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  if..#if SQLITE_O
14720 53 5f 57 49 4e 43 45 20 7c 7c 20 64 65 66 69 6e  S_WINCE || defin
14730 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
14740 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a 20  NO_OVERLAPPED). 
14750 20 72 63 20 3d 20 77 69 6e 53 65 65 6b 46 69 6c   rc = winSeekFil
14760 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 29  e(pFile, offset)
14770 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  ;.  if( rc==0 ){
14780 0a 23 65 6c 73 65 0a 20 20 7b 0a 23 65 6e 64 69  .#else.  {.#endi
14790 66 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  f.#if !SQLITE_OS
147a0 5f 57 49 4e 43 45 20 26 26 20 21 64 65 66 69 6e  _WINCE && !defin
147b0 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
147c0 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a 20  NO_OVERLAPPED). 
147d0 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76     OVERLAPPED ov
147e0 65 72 6c 61 70 70 65 64 3b 20 20 20 20 20 20 20  erlapped;       
147f0 20 2f 2a 20 54 68 65 20 6f 66 66 73 65 74 20 66   /* The offset f
14800 6f 72 20 57 72 69 74 65 46 69 6c 65 2e 20 2a 2f  or WriteFile. */
14810 0a 23 65 6e 64 69 66 0a 20 20 20 20 75 38 20 2a  .#endif.    u8 *
14820 61 52 65 6d 20 3d 20 28 75 38 20 2a 29 70 42 75  aRem = (u8 *)pBu
14830 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  f;        /* Dat
14840 61 20 79 65 74 20 74 6f 20 62 65 20 77 72 69 74  a yet to be writ
14850 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ten */.    int n
14860 52 65 6d 20 3d 20 61 6d 74 3b 20 20 20 20 20 20  Rem = amt;      
14870 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
14880 65 72 20 6f 66 20 62 79 74 65 73 20 79 65 74 20  er of bytes yet 
14890 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f  to be written */
148a0 0a 20 20 20 20 44 57 4f 52 44 20 6e 57 72 69 74  .    DWORD nWrit
148b0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
148c0 20 20 20 2f 2a 20 42 79 74 65 73 20 77 72 69 74     /* Bytes writ
148d0 74 65 6e 20 62 79 20 65 61 63 68 20 57 72 69 74  ten by each Writ
148e0 65 46 69 6c 65 28 29 20 63 61 6c 6c 20 2a 2f 0a  eFile() call */.
148f0 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72      DWORD lastEr
14900 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 20  rno = NO_ERROR; 
14910 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
14920 6e 65 64 20 62 79 20 47 65 74 4c 61 73 74 45 72  ned by GetLastEr
14930 72 6f 72 28 29 20 2a 2f 0a 0a 23 69 66 20 21 53  ror() */..#if !S
14940 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
14950 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
14960 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c  E_WIN32_NO_OVERL
14970 41 50 50 45 44 29 0a 20 20 20 20 6d 65 6d 73 65  APPED).    memse
14980 74 28 26 6f 76 65 72 6c 61 70 70 65 64 2c 20 30  t(&overlapped, 0
14990 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50  , sizeof(OVERLAP
149a0 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 65 72 6c  PED));.    overl
149b0 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28  apped.Offset = (
149c0 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30  LONG)(offset & 0
149d0 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20  xffffffff);.    
149e0 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65  overlapped.Offse
149f0 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28  tHigh = (LONG)((
14a00 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78  offset>>32) & 0x
14a10 37 66 66 66 66 66 66 66 29 3b 0a 23 65 6e 64 69  7fffffff);.#endi
14a20 66 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 52  f..    while( nR
14a30 65 6d 3e 30 20 29 7b 0a 23 69 66 20 53 51 4c 49  em>0 ){.#if SQLI
14a40 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 64  TE_OS_WINCE || d
14a50 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
14a60 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45  N32_NO_OVERLAPPE
14a70 44 29 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73  D).      if( !os
14a80 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d  WriteFile(pFile-
14a90 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20  >h, aRem, nRem, 
14aa0 26 6e 57 72 69 74 65 2c 20 30 29 20 29 7b 0a 23  &nWrite, 0) ){.#
14ab0 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 21  else.      if( !
14ac0 6f 73 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c  osWriteFile(pFil
14ad0 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d  e->h, aRem, nRem
14ae0 2c 20 26 6e 57 72 69 74 65 2c 20 26 6f 76 65 72  , &nWrite, &over
14af0 6c 61 70 70 65 64 29 20 29 7b 0a 23 65 6e 64 69  lapped) ){.#endi
14b00 66 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 69  f.        if( wi
14b10 6e 52 65 74 72 79 49 6f 65 72 72 28 26 6e 52 65  nRetryIoerr(&nRe
14b20 74 72 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  try, &lastErrno)
14b30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
14b40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14b50 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
14b60 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 6e  ( nWrite==0 || n
14b70 57 72 69 74 65 3c 3d 28 44 57 4f 52 44 29 6e 52  Write<=(DWORD)nR
14b80 65 6d 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  em );.      if( 
14b90 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 6e 57 72  nWrite==0 || nWr
14ba0 69 74 65 3e 28 44 57 4f 52 44 29 6e 52 65 6d 20  ite>(DWORD)nRem 
14bb0 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45  ){.        lastE
14bc0 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
14bd0 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20  Error();.       
14be0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
14bf0 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
14c00 49 4e 43 45 20 26 26 20 21 64 65 66 69 6e 65 64  INCE && !defined
14c10 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f  (SQLITE_WIN32_NO
14c20 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a 20 20 20  _OVERLAPPED).   
14c30 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 57 72     offset += nWr
14c40 69 74 65 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c  ite;.      overl
14c50 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28  apped.Offset = (
14c60 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30  LONG)(offset & 0
14c70 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20  xffffffff);.    
14c80 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66    overlapped.Off
14c90 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29  setHigh = (LONG)
14ca0 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20  ((offset>>32) & 
14cb0 30 78 37 66 66 66 66 66 66 66 29 3b 0a 23 65 6e  0x7fffffff);.#en
14cc0 64 69 66 0a 20 20 20 20 20 20 61 52 65 6d 20 2b  dif.      aRem +
14cd0 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20  = nWrite;.      
14ce0 6e 52 65 6d 20 2d 3d 20 6e 57 72 69 74 65 3b 0a  nRem -= nWrite;.
14cf0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 52      }.    if( nR
14d00 65 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 46  em>0 ){.      pF
14d10 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
14d20 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
14d30 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
14d40 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 29 7b    }..  if( rc ){
14d50 0a 20 20 20 20 69 66 28 20 20 20 28 20 70 46 69  .    if(   ( pFi
14d60 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  le->lastErrno==E
14d70 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 44 49 53 4b  RROR_HANDLE_DISK
14d80 5f 46 55 4c 4c 20 29 0a 20 20 20 20 20 20 20 7c  _FULL ).       |
14d90 7c 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  | ( pFile->lastE
14da0 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 44 49 53 4b  rrno==ERROR_DISK
14db0 5f 46 55 4c 4c 20 29 29 7b 0a 20 20 20 20 20 20  _FULL )){.      
14dc0 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20  OSTRACE(("WRITE 
14dd0 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
14de0 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  p, file=%p, rc=S
14df0 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22 2c 0a 20  QLITE_FULL\n",. 
14e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
14e10 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
14e20 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
14e30 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
14e40 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
14e50 6f 72 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20  or(SQLITE_FULL, 
14e60 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
14e70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14e80 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 57             "winW
14e90 72 69 74 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a  rite1", pFile->z
14ea0 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Path);.    }.   
14eb0 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45   OSTRACE(("WRITE
14ec0 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
14ed0 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  %p, file=%p, rc=
14ee0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
14ef0 54 45 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  TE\n",.         
14f00 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
14f10 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
14f20 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  le, pFile->h));.
14f30 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
14f40 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
14f50 45 52 52 5f 57 52 49 54 45 2c 20 70 46 69 6c 65  ERR_WRITE, pFile
14f60 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
14f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f80 20 20 20 20 22 77 69 6e 57 72 69 74 65 32 22 2c      "winWrite2",
14f90 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
14fa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 69 6e    }else{.    win
14fb0 4c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72 79 2c  LogIoerr(nRetry,
14fc0 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 0a   __LINE__);.  }.
14fd0 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54    OSTRACE(("WRIT
14fe0 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
14ff0 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63  =%p, file=%p, rc
15000 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
15010 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
15020 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
15030 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  ), pFile, pFile-
15040 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  >h));.  return S
15050 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
15060 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f  ** Truncate an o
15070 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70  pen file to a sp
15080 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a  ecified size.*/.
15090 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 54 72  static int winTr
150a0 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66  uncate(sqlite3_f
150b0 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33  ile *id, sqlite3
150c0 5f 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20  _int64 nByte){. 
150d0 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
150e0 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20  = (winFile*)id; 
150f0 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20   /* File handle 
15100 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
15110 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
15120 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
15130 65 74 75 72 6e 20 63 6f 64 65 20 66 6f 72 20 74  eturn code for t
15140 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
15150 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
15160 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  o;..  assert( pF
15170 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  ile );.  Simulat
15180 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
15190 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
151a0 4e 43 41 54 45 29 3b 0a 20 20 4f 53 54 52 41 43  NCATE);.  OSTRAC
151b0 45 28 28 22 54 52 55 4e 43 41 54 45 20 70 69 64  E(("TRUNCATE pid
151c0 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
151d0 66 69 6c 65 3d 25 70 2c 20 73 69 7a 65 3d 25 6c  file=%p, size=%l
151e0 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a  ld, lock=%d\n",.
151f0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
15200 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
15210 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
15220 2d 3e 68 2c 20 6e 42 79 74 65 2c 20 70 46 69 6c  ->h, nByte, pFil
15230 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a  e->locktype));..
15240 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72    /* If the user
15250 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20   has configured 
15260 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72  a chunk-size for
15270 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75 6e   this file, trun
15280 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66 69  cate the.  ** fi
15290 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f  le so that it co
152a0 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e 74  nsists of an int
152b0 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63  eger number of c
152c0 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a  hunks (i.e. the.
152d0 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c 65    ** actual file
152e0 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 65 20   size after the 
152f0 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62 65  operation may be
15300 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
15310 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a 20   requested.  ** 
15320 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  size)..  */.  if
15330 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
15340 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20  >0 ){.    nByte 
15350 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c  = ((nByte + pFil
15360 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f  e->szChunk - 1)/
15370 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20  pFile->szChunk) 
15380 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  * pFile->szChunk
15390 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 45  ;.  }..  /* SetE
153a0 6e 64 4f 66 46 69 6c 65 28 29 20 72 65 74 75 72  ndOfFile() retur
153b0 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e  ns non-zero when
153c0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
153d0 7a 65 72 6f 20 77 68 65 6e 20 69 74 20 66 61 69  zero when it fai
153e0 6c 73 2e 20 2a 2f 0a 20 20 69 66 28 20 77 69 6e  ls. */.  if( win
153f0 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20  SeekFile(pFile, 
15400 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20 72 63  nByte) ){.    rc
15410 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
15420 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
15430 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  CATE, pFile->las
15440 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
15450 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
15460 6e 54 72 75 6e 63 61 74 65 31 22 2c 20 70 46 69  nTruncate1", pFi
15470 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65  le->zPath);.  }e
15480 6c 73 65 20 69 66 28 20 30 3d 3d 6f 73 53 65 74  lse if( 0==osSet
15490 45 6e 64 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d  EndOfFile(pFile-
154a0 3e 68 29 20 26 26 0a 20 20 20 20 20 20 20 20 20  >h) &&.         
154b0 20 20 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d     ((lastErrno =
154c0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
154d0 29 29 21 3d 45 52 52 4f 52 5f 55 53 45 52 5f 4d  ))!=ERROR_USER_M
154e0 41 50 50 45 44 5f 46 49 4c 45 29 20 29 7b 0a 20  APPED_FILE) ){. 
154f0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
15500 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
15510 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67  .    rc = winLog
15520 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
15530 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 70 46 69  RR_TRUNCATE, pFi
15540 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
15550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15560 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65      "winTruncate
15570 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  2", pFile->zPath
15580 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49  );.  }..#if SQLI
15590 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
155a0 3e 30 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66  >0.  /* If the f
155b0 69 6c 65 20 77 61 73 20 74 72 75 6e 63 61 74 65  ile was truncate
155c0 64 20 74 6f 20 61 20 73 69 7a 65 20 73 6d 61 6c  d to a size smal
155d0 6c 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ler than the cur
155e0 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 6d 61 70 70  rently.  ** mapp
155f0 65 64 20 72 65 67 69 6f 6e 2c 20 72 65 64 75 63  ed region, reduc
15600 65 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  e the effective 
15610 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 61 73 20  mapping size as 
15620 77 65 6c 6c 2e 20 53 51 4c 69 74 65 20 77 69 6c  well. SQLite wil
15630 6c 0a 20 20 2a 2a 20 75 73 65 20 72 65 61 64 28  l.  ** use read(
15640 29 20 61 6e 64 20 77 72 69 74 65 28 29 20 74 6f  ) and write() to
15650 20 61 63 63 65 73 73 20 64 61 74 61 20 62 65 79   access data bey
15660 6f 6e 64 20 74 68 69 73 20 70 6f 69 6e 74 20 66  ond this point f
15670 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 0a 20 20 2a 2f  rom now on..  */
15680 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d  .  if( pFile->pM
15690 61 70 52 65 67 69 6f 6e 20 26 26 20 6e 42 79 74  apRegion && nByt
156a0 65 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  e<pFile->mmapSiz
156b0 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  e ){.    pFile->
156c0 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 42 79 74 65  mmapSize = nByte
156d0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
156e0 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e 43 41  OSTRACE(("TRUNCA
156f0 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  TE pid=%lu, pFil
15700 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72  e=%p, file=%p, r
15710 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
15720 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
15730 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
15740 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71  le, pFile->h, sq
15750 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
15760 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
15770 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
15780 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75  E_TEST./*.** Cou
15790 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
157a0 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e   fullsyncs and n
157b0 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68  ormal syncs.  Th
157c0 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  is is used to te
157d0 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73  st.** that syncs
157e0 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61   and fullsyncs a
157f0 72 65 20 6f 63 63 75 72 69 6e 67 20 61 74 20 74  re occuring at t
15800 68 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a  he right times..
15810 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
15820 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69  ync_count = 0;.i
15830 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73  nt sqlite3_fulls
15840 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  ync_count = 0;.#
15850 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  endif../*.** Mak
15860 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65  e sure all write
15870 73 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61  s to a particula
15880 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69  r file are commi
15890 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f  tted to disk..*/
158a0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
158b0 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ync(sqlite3_file
158c0 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29   *id, int flags)
158d0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
158e0 5f 4e 4f 5f 53 59 4e 43 0a 20 20 2f 2a 0a 20 20  _NO_SYNC.  /*.  
158f0 2a 2a 20 55 73 65 64 20 6f 6e 6c 79 20 77 68 65  ** Used only whe
15900 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  n SQLITE_NO_SYNC
15910 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2e   is not defined.
15920 0a 20 20 20 2a 2f 0a 20 20 42 4f 4f 4c 20 72 63  .   */.  BOOL rc
15930 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
15940 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c  fined(NDEBUG) ||
15950 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
15960 5f 4e 4f 5f 53 59 4e 43 29 20 7c 7c 20 5c 0a 20  _NO_SYNC) || \. 
15970 20 20 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54     defined(SQLIT
15980 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45 29  E_HAVE_OS_TRACE)
15990 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20  .  /*.  ** Used 
159a0 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  when SQLITE_NO_S
159b0 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  YNC is not defin
159c0 65 64 20 61 6e 64 20 62 79 20 74 68 65 20 61 73  ed and by the as
159d0 73 65 72 74 28 29 20 61 6e 64 2f 6f 72 0a 20 20  sert() and/or.  
159e0 2a 2a 20 4f 53 54 52 41 43 45 28 29 20 6d 61 63  ** OSTRACE() mac
159f0 72 6f 73 2e 0a 20 20 20 2a 2f 0a 20 20 77 69 6e  ros..   */.  win
15a00 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
15a10 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 23 65 6c 73  inFile*)id;.#els
15a20 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
15a30 45 54 45 52 28 69 64 29 3b 0a 23 65 6e 64 69 66  ETER(id);.#endif
15a40 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
15a50 65 20 29 3b 0a 20 20 2f 2a 20 43 68 65 63 6b 20  e );.  /* Check 
15a60 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49  that one of SQLI
15a70 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  TE_SYNC_NORMAL o
15a80 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65  r FULL was passe
15a90 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66  d */.  assert((f
15aa0 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
15ab0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20  TE_SYNC_NORMAL. 
15ac0 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30       || (flags&0
15ad0 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
15ae0 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f  C_FULL.  );..  /
15af0 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62  * Unix cannot, b
15b00 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20  ut some systems 
15b10 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
15b20 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65  E_FULL from here
15b30 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65  . This.  ** line
15b40 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 61 74   is to test that
15b50 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e   doing so does n
15b60 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f  ot cause any pro
15b70 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69  blems..  */.  Si
15b80 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72  mulateDiskfullEr
15b90 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
15ba0 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 4f 53  TE_FULL );..  OS
15bb0 54 52 41 43 45 28 28 22 53 59 4e 43 20 70 69 64  TRACE(("SYNC pid
15bc0 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
15bd0 66 69 6c 65 3d 25 70 2c 20 66 6c 61 67 73 3d 25  file=%p, flags=%
15be0 78 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20  x, lock=%d\n",. 
15bf0 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
15c00 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
15c10 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  ), pFile, pFile-
15c20 3e 68 2c 20 66 6c 61 67 73 2c 0a 20 20 20 20 20  >h, flags,.     
15c30 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
15c40 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 6e 64 65  ktype));..#ifnde
15c50 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
15c60 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
15c70 28 66 6c 61 67 73 29 3b 0a 23 65 6c 73 65 0a 20  (flags);.#else. 
15c80 20 69 66 28 20 28 66 6c 61 67 73 26 30 78 30 46   if( (flags&0x0F
15c90 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
15ca0 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ULL ){.    sqlit
15cb0 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
15cc0 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  t++;.  }.  sqlit
15cd0 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b  e3_sync_count++;
15ce0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
15cf0 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   we compiled wit
15d00 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f  h the SQLITE_NO_
15d10 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20  SYNC flag, then 
15d20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a  syncing is a.  *
15d30 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66  * no-op.  */.#if
15d40 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
15d50 4e 43 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  NC.  OSTRACE(("S
15d60 59 4e 43 2d 4e 4f 50 20 70 69 64 3d 25 6c 75 2c  YNC-NOP pid=%lu,
15d70 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d   pFile=%p, file=
15d80 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
15d90 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
15da0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
15db0 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20  essId(), pFile, 
15dc0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65  pFile->h));.  re
15dd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15de0 23 65 6c 73 65 0a 23 69 66 20 53 51 4c 49 54 45  #else.#if SQLITE
15df0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
15e00 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d  .  if( pFile->pM
15e10 61 70 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  apRegion ){.    
15e20 69 66 28 20 6f 73 46 6c 75 73 68 56 69 65 77 4f  if( osFlushViewO
15e30 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 70 4d 61  fFile(pFile->pMa
15e40 70 52 65 67 69 6f 6e 2c 20 30 29 20 29 7b 0a 20  pRegion, 0) ){. 
15e50 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53       OSTRACE(("S
15e60 59 4e 43 2d 4d 4d 41 50 20 70 69 64 3d 25 6c 75  YNC-MMAP pid=%lu
15e70 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 4d 61 70  , pFile=%p, pMap
15e80 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20  Region=%p, ".   
15e90 20 20 20 20 20 20 20 20 20 20 20 20 22 72 63 3d              "rc=
15ea0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 6f 73  SQLITE_OK\n", os
15eb0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
15ec0 73 49 64 28 29 2c 0a 20 20 20 20 20 20 20 20 20  sId(),.         
15ed0 20 20 20 20 20 20 70 46 69 6c 65 2c 20 70 46 69        pFile, pFi
15ee0 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29  le->pMapRegion))
15ef0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15f00 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
15f10 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
15f20 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53  rror();.      OS
15f30 54 52 41 43 45 28 28 22 53 59 4e 43 2d 4d 4d 41  TRACE(("SYNC-MMA
15f40 50 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  P pid=%lu, pFile
15f50 3d 25 70 2c 20 70 4d 61 70 52 65 67 69 6f 6e 3d  =%p, pMapRegion=
15f60 25 70 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  %p, ".          
15f70 20 20 20 20 20 22 72 63 3d 53 51 4c 49 54 45 5f       "rc=SQLITE_
15f80 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c 20 6f  IOERR_MMAP\n", o
15f90 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
15fa0 73 73 49 64 28 29 2c 0a 20 20 20 20 20 20 20 20  ssId(),.        
15fb0 20 20 20 20 20 20 20 70 46 69 6c 65 2c 20 70 46         pFile, pF
15fc0 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
15fd0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
15fe0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
15ff0 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70  TE_IOERR_MMAP, p
16000 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
16010 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16020 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 79            "winSy
16030 6e 63 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  nc1", pFile->zPa
16040 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  th);.    }.  }.#
16050 65 6e 64 69 66 0a 20 20 72 63 20 3d 20 6f 73 46  endif.  rc = osF
16060 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 28  lushFileBuffers(
16070 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 53 69 6d  pFile->h);.  Sim
16080 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63  ulateIOError( rc
16090 3d 46 41 4c 53 45 20 29 3b 0a 20 20 69 66 28 20  =FALSE );.  if( 
160a0 72 63 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  rc ){.    OSTRAC
160b0 45 28 28 22 53 59 4e 43 20 70 69 64 3d 25 6c 75  E(("SYNC pid=%lu
160c0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65  , pFile=%p, file
160d0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
160e0 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  K\n",.          
160f0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
16100 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c  rocessId(), pFil
16110 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  e, pFile->h));. 
16120 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16130 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
16140 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
16150 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
16160 72 6f 72 28 29 3b 0a 20 20 20 20 4f 53 54 52 41  ror();.    OSTRA
16170 43 45 28 28 22 53 59 4e 43 20 70 69 64 3d 25 6c  CE(("SYNC pid=%l
16180 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c  u, pFile=%p, fil
16190 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
161a0 49 4f 45 52 52 5f 46 53 59 4e 43 5c 6e 22 2c 0a  IOERR_FSYNC\n",.
161b0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
161c0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
161d0 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69  Id(), pFile, pFi
161e0 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74  le->h));.    ret
161f0 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
16200 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59  SQLITE_IOERR_FSY
16210 4e 43 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  NC, pFile->lastE
16220 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
16230 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
16240 6e 53 79 6e 63 32 22 2c 20 70 46 69 6c 65 2d 3e  nSync2", pFile->
16250 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23 65 6e 64  zPath);.  }.#end
16260 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65  if.}../*.** Dete
16270 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e  rmine the curren
16280 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65  t size of a file
16290 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61   in bytes.*/.sta
162a0 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 53  tic int winFileS
162b0 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
162c0 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e   *id, sqlite3_in
162d0 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 77  t64 *pSize){.  w
162e0 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
162f0 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
16300 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
16310 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  OK;..  assert( i
16320 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  d!=0 );.  assert
16330 28 20 70 53 69 7a 65 21 3d 30 20 29 3b 0a 20 20  ( pSize!=0 );.  
16340 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
16350 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
16360 45 52 52 5f 46 53 54 41 54 29 3b 0a 20 20 4f 53  ERR_FSTAT);.  OS
16370 54 52 41 43 45 28 28 22 53 49 5a 45 20 66 69 6c  TRACE(("SIZE fil
16380 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25 70 5c 6e  e=%p, pSize=%p\n
16390 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53 69  ", pFile->h, pSi
163a0 7a 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54  ze));..#if SQLIT
163b0 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 0a 20  E_OS_WINRT.  {. 
163c0 20 20 20 46 49 4c 45 5f 53 54 41 4e 44 41 52 44     FILE_STANDARD
163d0 5f 49 4e 46 4f 20 69 6e 66 6f 3b 0a 20 20 20 20  _INFO info;.    
163e0 69 66 28 20 6f 73 47 65 74 46 69 6c 65 49 6e 66  if( osGetFileInf
163f0 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65  ormationByHandle
16400 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 46 69 6c  Ex(pFile->h, Fil
16410 65 53 74 61 6e 64 61 72 64 49 6e 66 6f 2c 0a 20  eStandardInfo,. 
16420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16440 20 20 20 20 26 69 6e 66 6f 2c 20 73 69 7a 65 6f      &info, sizeo
16450 66 28 69 6e 66 6f 29 29 20 29 7b 0a 20 20 20 20  f(info)) ){.    
16460 20 20 2a 70 53 69 7a 65 20 3d 20 69 6e 66 6f 2e    *pSize = info.
16470 45 6e 64 4f 66 46 69 6c 65 2e 51 75 61 64 50 61  EndOfFile.QuadPa
16480 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  rt;.    }else{. 
16490 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
164a0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
164b0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
164c0 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
164d0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  (SQLITE_IOERR_FS
164e0 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  TAT, pFile->last
164f0 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
16500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
16510 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69  inFileSize", pFi
16520 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
16530 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a  }.  }.#else.  {.
16540 20 20 20 20 44 57 4f 52 44 20 75 70 70 65 72 42      DWORD upperB
16550 69 74 73 3b 0a 20 20 20 20 44 57 4f 52 44 20 6c  its;.    DWORD l
16560 6f 77 65 72 42 69 74 73 3b 0a 20 20 20 20 44 57  owerBits;.    DW
16570 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a  ORD lastErrno;..
16580 20 20 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20      lowerBits = 
16590 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 28 70 46  osGetFileSize(pF
165a0 69 6c 65 2d 3e 68 2c 20 26 75 70 70 65 72 42 69  ile->h, &upperBi
165b0 74 73 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20  ts);.    *pSize 
165c0 3d 20 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74  = (((sqlite3_int
165d0 36 34 29 75 70 70 65 72 42 69 74 73 29 3c 3c 33  64)upperBits)<<3
165e0 32 29 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b 0a  2) + lowerBits;.
165f0 20 20 20 20 69 66 28 20 20 20 28 6c 6f 77 65 72      if(   (lower
16600 42 69 74 73 20 3d 3d 20 49 4e 56 41 4c 49 44 5f  Bits == INVALID_
16610 46 49 4c 45 5f 53 49 5a 45 29 0a 20 20 20 20 20  FILE_SIZE).     
16620 20 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f    && ((lastErrno
16630 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
16640 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 20  r())!=NO_ERROR) 
16650 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
16660 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
16670 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  Errno;.      rc 
16680 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
16690 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
166a0 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
166b0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
166c0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
166d0 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d  ileSize", pFile-
166e0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20  >zPath);.    }. 
166f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52   }.#endif.  OSTR
16700 41 43 45 28 28 22 53 49 5a 45 20 66 69 6c 65 3d  ACE(("SIZE file=
16710 25 70 2c 20 70 53 69 7a 65 3d 25 70 2c 20 2a 70  %p, pSize=%p, *p
16720 53 69 7a 65 3d 25 6c 6c 64 2c 20 72 63 3d 25 73  Size=%lld, rc=%s
16730 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
16740 70 46 69 6c 65 2d 3e 68 2c 20 70 53 69 7a 65 2c  pFile->h, pSize,
16750 20 2a 70 53 69 7a 65 2c 20 73 71 6c 69 74 65 33   *pSize, sqlite3
16760 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
16770 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
16780 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46 41  *.** LOCKFILE_FA
16790 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 69  IL_IMMEDIATELY i
167a0 73 20 75 6e 64 65 66 69 6e 65 64 20 6f 6e 20 73  s undefined on s
167b0 6f 6d 65 20 57 69 6e 64 6f 77 73 20 73 79 73 74  ome Windows syst
167c0 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ems..*/.#ifndef 
167d0 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
167e0 4d 45 44 49 41 54 45 4c 59 0a 23 20 64 65 66 69  MEDIATELY.# defi
167f0 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  ne LOCKFILE_FAIL
16800 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 31 0a 23  _IMMEDIATELY 1.#
16810 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4c  endif..#ifndef L
16820 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56  OCKFILE_EXCLUSIV
16830 45 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20  E_LOCK.# define 
16840 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49  LOCKFILE_EXCLUSI
16850 56 45 5f 4c 4f 43 4b 20 32 0a 23 65 6e 64 69 66  VE_LOCK 2.#endif
16860 0a 0a 2f 2a 0a 2a 2a 20 48 69 73 74 6f 72 69 63  ../*.** Historic
16870 61 6c 6c 79 2c 20 53 51 4c 69 74 65 20 68 61 73  ally, SQLite has
16880 20 75 73 65 64 20 62 6f 74 68 20 74 68 65 20 4c   used both the L
16890 6f 63 6b 46 69 6c 65 20 61 6e 64 20 4c 6f 63 6b  ockFile and Lock
168a0 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 73  FileEx functions
168b0 2e 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 4c 6f  ..** When the Lo
168c0 63 6b 46 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20  ckFile function 
168d0 77 61 73 20 75 73 65 64 2c 20 69 74 20 77 61 73  was used, it was
168e0 20 61 6c 77 61 79 73 20 65 78 70 65 63 74 65 64   always expected
168f0 20 74 6f 20 66 61 69 6c 0a 2a 2a 20 69 6d 6d 65   to fail.** imme
16900 64 69 61 74 65 6c 79 20 69 66 20 74 68 65 20 6c  diately if the l
16910 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ock could not be
16920 20 6f 62 74 61 69 6e 65 64 2e 20 20 41 6c 73 6f   obtained.  Also
16930 2c 20 69 74 20 61 6c 77 61 79 73 20 65 78 70 65  , it always expe
16940 63 74 65 64 20 74 6f 0a 2a 2a 20 6f 62 74 61 69  cted to.** obtai
16950 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  n an exclusive l
16960 6f 63 6b 2e 20 20 54 68 65 73 65 20 66 6c 61 67  ock.  These flag
16970 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 20  s are used with 
16980 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66  the LockFileEx f
16990 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72  unction.** and r
169a0 65 66 6c 65 63 74 20 74 68 6f 73 65 20 65 78 70  eflect those exp
169b0 65 63 74 61 74 69 6f 6e 73 3b 20 74 68 65 72 65  ectations; there
169c0 66 6f 72 65 2c 20 74 68 65 79 20 73 68 6f 75 6c  fore, they shoul
169d0 64 20 6e 6f 74 20 62 65 20 63 68 61 6e 67 65 64  d not be changed
169e0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
169f0 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41  ITE_LOCKFILE_FLA
16a00 47 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  GS.# define SQLI
16a10 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47  TE_LOCKFILE_FLAG
16a20 53 20 20 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 41  S   (LOCKFILE_FA
16a30 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 7c  IL_IMMEDIATELY |
16a40 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
16a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a60 20 20 20 20 20 4c 4f 43 4b 46 49 4c 45 5f 45 58       LOCKFILE_EX
16a70 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 23 65  CLUSIVE_LOCK).#e
16a80 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 75 72 72  ndif../*.** Curr
16a90 65 6e 74 6c 79 2c 20 53 51 4c 69 74 65 20 6e 65  ently, SQLite ne
16aa0 76 65 72 20 63 61 6c 6c 73 20 74 68 65 20 4c 6f  ver calls the Lo
16ab0 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f  ckFileEx functio
16ac0 6e 20 77 69 74 68 6f 75 74 20 77 61 6e 74 69 6e  n without wantin
16ad0 67 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f  g the.** call to
16ae0 20 66 61 69 6c 20 69 6d 6d 65 64 69 61 74 65 6c   fail immediatel
16af0 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 63 61  y if the lock ca
16b00 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64  nnot be obtained
16b10 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
16b20 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46  ITE_LOCKFILEEX_F
16b30 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20 53 51  LAGS.# define SQ
16b40 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f  LITE_LOCKFILEEX_
16b50 46 4c 41 47 53 20 28 4c 4f 43 4b 46 49 4c 45 5f  FLAGS (LOCKFILE_
16b60 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
16b70 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
16b80 41 63 71 75 69 72 65 20 61 20 72 65 61 64 65 72  Acquire a reader
16b90 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66 65 72   lock..** Differ
16ba0 65 6e 74 20 41 50 49 20 72 6f 75 74 69 6e 65 73  ent API routines
16bb0 20 61 72 65 20 63 61 6c 6c 65 64 20 64 65 70 65   are called depe
16bc0 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
16bd0 20 6f 72 20 6e 6f 74 20 74 68 69 73 0a 2a 2a 20   or not this.** 
16be0 69 73 20 57 69 6e 39 78 20 6f 72 20 57 69 6e 4e  is Win9x or WinN
16bf0 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  T..*/.static int
16c00 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28   winGetReadLock(
16c10 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
16c20 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 4f 53  .  int res;.  OS
16c30 54 52 41 43 45 28 28 22 52 45 41 44 2d 4c 4f 43  TRACE(("READ-LOC
16c40 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d  K file=%p, lock=
16c50 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
16c60 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
16c70 29 29 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54  ));.  if( osIsNT
16c80 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  () ){.#if SQLITE
16c90 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 2f 2a  _OS_WINCE.    /*
16ca0 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69  .    ** NOTE: Wi
16cb0 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64  ndows CE is hand
16cc0 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  led differently 
16cd0 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63  here due its lac
16ce0 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20  k of the Win32. 
16cf0 20 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20     **       API 
16d00 4c 6f 63 6b 46 69 6c 65 45 78 2e 0a 20 20 20 20  LockFileEx..    
16d10 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  */.    res = win
16d20 63 65 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  ceLockFile(&pFil
16d30 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  e->h, SHARED_FIR
16d40 53 54 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 23 65  ST, 0, 1, 0);.#e
16d50 6c 73 65 0a 20 20 20 20 72 65 73 20 3d 20 77 69  lse.    res = wi
16d60 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nLockFile(&pFile
16d70 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ->h, SQLITE_LOCK
16d80 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c 20 53 48  FILEEX_FLAGS, SH
16d90 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20  ARED_FIRST, 0,. 
16da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16db0 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45       SHARED_SIZE
16dc0 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  , 0);.#endif.  }
16dd0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
16de0 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
16df0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6c 6b  else{.    int lk
16e00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61  ;.    sqlite3_ra
16e10 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
16e20 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20 20 20 70  lk), &lk);.    p
16e30 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  File->sharedLock
16e40 42 79 74 65 20 3d 20 28 73 68 6f 72 74 29 28 28  Byte = (short)((
16e50 6c 6b 20 26 20 30 78 37 66 66 66 66 66 66 66 29  lk & 0x7fffffff)
16e60 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20  %(SHARED_SIZE - 
16e70 31 29 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77  1));.    res = w
16e80 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  inLockFile(&pFil
16e90 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  e->h, SQLITE_LOC
16ea0 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20  KFILE_FLAGS,.   
16eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ec0 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b     SHARED_FIRST+
16ed0 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63  pFile->sharedLoc
16ee0 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b  kByte, 0, 1, 0);
16ef0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
16f00 28 20 72 65 73 20 3d 3d 20 30 20 29 7b 0a 20 20  ( res == 0 ){.  
16f10 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
16f20 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
16f30 72 6f 72 28 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f  ror();.    /* No
16f40 20 6e 65 65 64 20 74 6f 20 6c 6f 67 20 61 20 66   need to log a f
16f50 61 69 6c 75 72 65 20 74 6f 20 6c 6f 63 6b 20 2a  ailure to lock *
16f60 2f 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  /.  }.  OSTRACE(
16f70 28 22 52 45 41 44 2d 4c 4f 43 4b 20 66 69 6c 65  ("READ-LOCK file
16f80 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25 64 5c 6e  =%p, result=%d\n
16f90 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73  ", pFile->h, res
16fa0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73  ));.  return res
16fb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20  ;.}../*.** Undo 
16fc0 61 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73 74  a readlock.*/.st
16fd0 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f  atic int winUnlo
16fe0 63 6b 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69  ckReadLock(winFi
16ff0 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e  le *pFile){.  in
17000 74 20 72 65 73 3b 0a 20 20 44 57 4f 52 44 20 6c  t res;.  DWORD l
17010 61 73 74 45 72 72 6e 6f 3b 0a 20 20 4f 53 54 52  astErrno;.  OSTR
17020 41 43 45 28 28 22 52 45 41 44 2d 55 4e 4c 4f 43  ACE(("READ-UNLOC
17030 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d  K file=%p, lock=
17040 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
17050 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
17060 29 29 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54  ));.  if( osIsNT
17070 28 29 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  () ){.    res = 
17080 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70  winUnlockFile(&p
17090 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
170a0 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44  FIRST, 0, SHARED
170b0 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 7d 0a 23  _SIZE, 0);.  }.#
170c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
170d0 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
170e0 73 65 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69  se{.    res = wi
170f0 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69  nUnlockFile(&pFi
17100 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
17110 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65  RST+pFile->share
17120 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c  dLockByte, 0, 1,
17130 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
17140 20 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20    if( res==0 && 
17150 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ((lastErrno = os
17160 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21  GetLastError())!
17170 3d 45 52 52 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45  =ERROR_NOT_LOCKE
17180 44 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  D) ){.    pFile-
17190 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
171a0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c  tErrno;.    winL
171b0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
171c0 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 70 46 69  OERR_UNLOCK, pFi
171d0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
171e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
171f0 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63  winUnlockReadLoc
17200 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  k", pFile->zPath
17210 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  );.  }.  OSTRACE
17220 28 28 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20 66  (("READ-UNLOCK f
17230 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25  ile=%p, result=%
17240 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
17250 72 65 73 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  res));.  return 
17260 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  res;.}../*.** Lo
17270 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
17280 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
17290 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
172a0 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a   locktype - one.
172b0 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
172c0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
172d0 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
172e0 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
172f0 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
17300 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
17310 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
17320 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
17330 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
17340 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
17350 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
17360 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
17370 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
17380 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
17390 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
173a0 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
173b0 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
173c0 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
173d0 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
173e0 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
173f0 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
17400 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
17410 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
17420 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
17430 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
17440 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
17450 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
17460 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
17470 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
17480 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
17490 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
174a0 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
174b0 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
174c0 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
174d0 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
174e0 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
174f0 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
17500 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
17510 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
17520 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
17530 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
17540 61 20 6c 6f 63 6b 2e 20 20 54 68 65 20 77 69 6e  a lock.  The win
17550 55 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65  Unlock() routine
17560 0a 2a 2a 20 65 72 61 73 65 73 20 61 6c 6c 20 6c  .** erases all l
17570 6f 63 6b 73 20 61 74 20 6f 6e 63 65 20 61 6e 64  ocks at once and
17580 20 72 65 74 75 72 6e 73 20 75 73 20 69 6d 6d 65   returns us imme
17590 64 69 61 74 65 6c 79 20 74 6f 20 6c 6f 63 6b 69  diately to locki
175a0 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2a 20 49  ng level 0..** I
175b0 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
175c0 65 20 74 6f 20 6c 6f 77 65 72 20 74 68 65 20 6c  e to lower the l
175d0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 65  ocking level one
175e0 20 73 74 65 70 20 61 74 20 61 20 74 69 6d 65 2e   step at a time.
175f0 20 20 59 6f 75 0a 2a 2a 20 6d 75 73 74 20 67 6f    You.** must go
17600 20 73 74 72 61 69 67 68 74 20 74 6f 20 6c 6f 63   straight to loc
17610 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f  king level 0..*/
17620 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c  .static int winL
17630 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
17640 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
17650 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pe){.  int rc = 
17660 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a  SQLITE_OK;    /*
17670 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   Return code fro
17680 6d 20 73 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f  m subroutines */
17690 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20  .  int res = 1; 
176a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
176b0 75 6c 74 20 6f 66 20 61 20 57 69 6e 64 6f 77 73  ult of a Windows
176c0 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a 20 20   lock call */.  
176d0 69 6e 74 20 6e 65 77 4c 6f 63 6b 74 79 70 65 3b  int newLocktype;
176e0 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70 46         /* Set pF
176f0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 74 6f  ile->locktype to
17700 20 74 68 69 73 20 76 61 6c 75 65 20 62 65 66 6f   this value befo
17710 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 20 20  re exiting */.  
17720 69 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f  int gotPendingLo
17730 63 6b 20 3d 20 30 3b 2f 2a 20 54 72 75 65 20 69  ck = 0;/* True i
17740 66 20 77 65 20 61 63 71 75 69 72 65 64 20 61 20  f we acquired a 
17750 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 69  PENDING lock thi
17760 73 20 74 69 6d 65 20 2a 2f 0a 20 20 77 69 6e 46  s time */.  winF
17770 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
17780 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f  nFile*)id;.  DWO
17790 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e  RD lastErrno = N
177a0 4f 5f 45 52 52 4f 52 3b 0a 0a 20 20 61 73 73 65  O_ERROR;..  asse
177b0 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 4f  rt( id!=0 );.  O
177c0 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 66 69  STRACE(("LOCK fi
177d0 6c 65 3d 25 70 2c 20 6f 6c 64 4c 6f 63 6b 3d 25  le=%p, oldLock=%
177e0 64 28 25 64 29 2c 20 6e 65 77 4c 6f 63 6b 3d 25  d(%d), newLock=%
177f0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
17800 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65   pFile->h, pFile
17810 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c  ->locktype, pFil
17820 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e->sharedLockByt
17830 65 2c 20 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a  e, locktype));..
17840 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
17850 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
17860 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20  of this type or 
17870 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65  more restrictive
17880 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46   on the.  ** OsF
17890 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e  ile, do nothing.
178a0 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65   Don't use the e
178b0 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61  nd_lock: exit pa
178c0 74 68 2c 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69  th, as.  ** sqli
178d0 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28  te3OsEnterMutex(
178e0 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61  ) hasn't been ca
178f0 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20  lled yet..  */. 
17900 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
17910 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29  type>=locktype )
17920 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
17930 4c 4f 43 4b 2d 48 45 4c 44 20 66 69 6c 65 3d 25  LOCK-HELD file=%
17940 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
17950 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
17960 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17970 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
17980 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79  Do not allow any
17990 20 6b 69 6e 64 20 6f 66 20 77 72 69 74 65 2d 6c   kind of write-l
179a0 6f 63 6b 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e  ock on a read-on
179b0 6c 79 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2f  ly database.  */
179c0 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 63  .  if( (pFile->c
179d0 74 72 6c 46 6c 61 67 73 20 26 20 57 49 4e 46 49  trlFlags & WINFI
179e0 4c 45 5f 52 44 4f 4e 4c 59 29 21 3d 30 20 26 26  LE_RDONLY)!=0 &&
179f0 20 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52   locktype>=RESER
17a00 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  VED_LOCK ){.    
17a10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
17a20 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 20  ERR_LOCK;.  }.. 
17a30 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
17a40 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e  e locking sequen
17a50 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20  ce is correct.  
17a60 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
17a70 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f  le->locktype!=NO
17a80 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70  _LOCK || locktyp
17a90 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
17aa0 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
17ab0 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  type!=PENDING_LO
17ac0 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
17ad0 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56  locktype!=RESERV
17ae0 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65  ED_LOCK || pFile
17af0 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ->locktype==SHAR
17b00 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  ED_LOCK );..  /*
17b10 20 4c 6f 63 6b 20 74 68 65 20 50 45 4e 44 49 4e   Lock the PENDIN
17b20 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 66 20 77  G_LOCK byte if w
17b30 65 20 6e 65 65 64 20 74 6f 20 61 63 71 75 69 72  e need to acquir
17b40 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  e a PENDING lock
17b50 20 6f 72 0a 20 20 2a 2a 20 61 20 53 48 41 52 45   or.  ** a SHARE
17b60 44 20 6c 6f 63 6b 2e 20 20 49 66 20 77 65 20 61  D lock.  If we a
17b70 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53  re acquiring a S
17b80 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
17b90 61 63 71 75 69 73 69 74 69 6f 6e 20 6f 66 0a 20  acquisition of. 
17ba0 20 2a 2a 20 74 68 65 20 50 45 4e 44 49 4e 47 5f   ** the PENDING_
17bb0 4c 4f 43 4b 20 62 79 74 65 20 69 73 20 74 65 6d  LOCK byte is tem
17bc0 70 6f 72 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6e  porary..  */.  n
17bd0 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 70 46 69  ewLocktype = pFi
17be0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  le->locktype;.  
17bf0 69 66 28 20 20 20 28 70 46 69 6c 65 2d 3e 6c 6f  if(   (pFile->lo
17c00 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 29  cktype==NO_LOCK)
17c10 0a 20 20 20 20 20 7c 7c 20 28 20 20 20 28 6c 6f  .     || (   (lo
17c20 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
17c30 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 20  E_LOCK).        
17c40 20 26 26 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b   && (pFile->lock
17c50 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c  type==RESERVED_L
17c60 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 69  OCK)).  ){.    i
17c70 6e 74 20 63 6e 74 20 3d 20 33 3b 0a 20 20 20 20  nt cnt = 3;.    
17c80 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e 30 20 26  while( cnt-->0 &
17c90 26 20 28 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b  & (res = winLock
17ca0 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
17cb0 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f  SQLITE_LOCKFILE_
17cc0 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20  FLAGS,.         
17cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cf0 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c  PENDING_BYTE, 0,
17d00 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20   1, 0))==0 ){.  
17d10 20 20 20 20 2f 2a 20 54 72 79 20 33 20 74 69 6d      /* Try 3 tim
17d20 65 73 20 74 6f 20 67 65 74 20 74 68 65 20 70 65  es to get the pe
17d30 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20 20 54 68 69  nding lock.  Thi
17d40 73 20 69 73 20 6e 65 65 64 65 64 20 74 6f 20 77  s is needed to w
17d50 6f 72 6b 0a 20 20 20 20 20 20 2a 2a 20 61 72 6f  ork.      ** aro
17d60 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20 63 61 75  und problems cau
17d70 73 65 64 20 62 79 20 69 6e 64 65 78 69 6e 67 20  sed by indexing 
17d80 61 6e 64 2f 6f 72 20 61 6e 74 69 2d 76 69 72 75  and/or anti-viru
17d90 73 20 73 6f 66 74 77 61 72 65 20 6f 6e 0a 20 20  s software on.  
17da0 20 20 20 20 2a 2a 20 57 69 6e 64 6f 77 73 20 73      ** Windows s
17db0 79 73 74 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2a  ystems..      **
17dc0 20 49 66 20 79 6f 75 20 61 72 65 20 75 73 69 6e   If you are usin
17dd0 67 20 74 68 69 73 20 63 6f 64 65 20 61 73 20 61  g this code as a
17de0 20 6d 6f 64 65 6c 20 66 6f 72 20 61 6c 74 65 72   model for alter
17df0 6e 61 74 69 76 65 20 56 46 53 65 73 2c 20 64 6f  native VFSes, do
17e00 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f   not.      ** co
17e10 70 79 20 74 68 69 73 20 72 65 74 72 79 20 6c 6f  py this retry lo
17e20 67 69 63 2e 20 20 49 74 20 69 73 20 61 20 68 61  gic.  It is a ha
17e30 63 6b 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20  ck intended for 
17e40 57 69 6e 64 6f 77 73 20 6f 6e 6c 79 2e 0a 20 20  Windows only..  
17e50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6c 61 73      */.      las
17e60 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
17e70 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
17e80 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d   OSTRACE(("LOCK-
17e90 50 45 4e 44 49 4e 47 2d 46 41 49 4c 20 66 69 6c  PENDING-FAIL fil
17ea0 65 3d 25 70 2c 20 63 6f 75 6e 74 3d 25 64 2c 20  e=%p, count=%d, 
17eb0 72 65 73 75 6c 74 3d 25 64 5c 6e 22 2c 0a 20 20  result=%d\n",.  
17ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69               pFi
17ed0 6c 65 2d 3e 68 2c 20 63 6e 74 2c 20 72 65 73 29  le->h, cnt, res)
17ee0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 61 73  );.      if( las
17ef0 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 49 4e  tErrno==ERROR_IN
17f00 56 41 4c 49 44 5f 48 41 4e 44 4c 45 20 29 7b 0a  VALID_HANDLE ){.
17f10 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
17f20 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
17f30 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 63  rrno;.        rc
17f40 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
17f50 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 4f 53  LOCK;.        OS
17f60 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d 46 41 49  TRACE(("LOCK-FAI
17f70 4c 20 66 69 6c 65 3d 25 70 2c 20 63 6f 75 6e 74  L file=%p, count
17f80 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%d, rc=%s\n",. 
17f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fa0 70 46 69 6c 65 2d 3e 68 2c 20 63 6e 74 2c 20 73  pFile->h, cnt, s
17fb0 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
17fc0 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  )));.        ret
17fd0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
17fe0 20 20 20 20 20 20 69 66 28 20 63 6e 74 20 29 20        if( cnt ) 
17ff0 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c  sqlite3_win32_sl
18000 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20  eep(1);.    }.  
18010 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b    gotPendingLock
18020 20 3d 20 72 65 73 3b 0a 20 20 20 20 69 66 28 20   = res;.    if( 
18030 21 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6c 61  !res ){.      la
18040 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
18050 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
18060 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75  }.  }..  /* Acqu
18070 69 72 65 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ire a shared loc
18080 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  k.  */.  if( loc
18090 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
180a0 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  CK && res ){.   
180b0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
180c0 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43  locktype==NO_LOC
180d0 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77  K );.    res = w
180e0 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 46  inGetReadLock(pF
180f0 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72 65  ile);.    if( re
18100 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f  s ){.      newLo
18110 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f  cktype = SHARED_
18120 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LOCK;.    }else{
18130 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f  .      lastErrno
18140 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
18150 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  r();.    }.  }..
18160 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52    /* Acquire a R
18170 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20 2a  ESERVED lock.  *
18180 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
18190 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
181a0 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73  && res ){.    as
181b0 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
181c0 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
181d0 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  CK );.    res = 
181e0 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69  winLockFile(&pFi
181f0 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f  le->h, SQLITE_LO
18200 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 52 45  CKFILE_FLAGS, RE
18210 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
18220 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  1, 0);.    if( r
18230 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  es ){.      newL
18240 6f 63 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56  ocktype = RESERV
18250 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  ED_LOCK;.    }el
18260 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72  se{.      lastEr
18270 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
18280 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20  rror();.    }.  
18290 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20  }..  /* Acquire 
182a0 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20  a PENDING lock. 
182b0 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
182c0 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
182d0 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  CK && res ){.   
182e0 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50   newLocktype = P
182f0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20  ENDING_LOCK;.   
18300 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
18310 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  = 0;.  }..  /* A
18320 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53  cquire an EXCLUS
18330 49 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20  IVE lock.  */.  
18340 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
18350 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
18360 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72  res ){.    asser
18370 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
18380 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe>=SHARED_LOCK 
18390 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  );.    res = win
183a0 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70  UnlockReadLock(p
183b0 46 69 6c 65 29 3b 0a 20 20 20 20 72 65 73 20 3d  File);.    res =
183c0 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
183d0 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
183e0 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 53  OCKFILE_FLAGS, S
183f0 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a  HARED_FIRST, 0,.
18400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18410 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a        SHARED_SIZ
18420 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  E, 0);.    if( r
18430 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  es ){.      newL
18440 6f 63 6b 74 79 70 65 20 3d 20 45 58 43 4c 55 53  ocktype = EXCLUS
18450 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65  IVE_LOCK;.    }e
18460 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45  lse{.      lastE
18470 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
18480 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77  Error();.      w
18490 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 46  inGetReadLock(pF
184a0 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ile);.    }.  }.
184b0 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20  .  /* If we are 
184c0 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44 49 4e  holding a PENDIN
184d0 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75 67 68  G lock that ough
184e0 74 20 74 6f 20 62 65 20 72 65 6c 65 61 73 65 64  t to be released
184f0 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 6c 65  , then.  ** rele
18500 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f  ase it now..  */
18510 0a 20 20 69 66 28 20 67 6f 74 50 65 6e 64 69 6e  .  if( gotPendin
18520 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74 79 70  gLock && locktyp
18530 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
18540 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46  {.    winUnlockF
18550 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50  ile(&pFile->h, P
18560 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20  ENDING_BYTE, 0, 
18570 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  1, 0);.  }..  /*
18580 20 55 70 64 61 74 65 20 74 68 65 20 73 74 61 74   Update the stat
18590 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68 61  e of the lock ha
185a0 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66 69  s held in the fi
185b0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68  le descriptor th
185c0 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 74  en.  ** return t
185d0 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 72  he appropriate r
185e0 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f  esult code..  */
185f0 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20  .  if( res ){.  
18600 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
18610 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
18620 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
18630 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
18640 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
18650 59 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  Y;.    OSTRACE((
18660 22 4c 4f 43 4b 2d 46 41 49 4c 20 66 69 6c 65 3d  "LOCK-FAIL file=
18670 25 70 2c 20 77 61 6e 74 65 64 3d 25 64 2c 20 67  %p, wanted=%d, g
18680 6f 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ot=%d\n",.      
18690 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
186a0 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f   locktype, newLo
186b0 63 6b 74 79 70 65 29 29 3b 0a 20 20 7d 0a 20 20  cktype));.  }.  
186c0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
186d0 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74 79 70  = (u8)newLocktyp
186e0 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  e;.  OSTRACE(("L
186f0 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63  OCK file=%p, loc
18700 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  k=%d, rc=%s\n",.
18710 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
18720 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
18730 74 79 70 65 2c 20 73 71 6c 69 74 65 33 45 72 72  type, sqlite3Err
18740 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65  Name(rc)));.  re
18750 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18760 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
18770 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
18780 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
18790 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
187a0 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
187b0 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
187c0 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
187d0 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
187e0 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  held, return.** 
187f0 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65 72 77  non-zero, otherw
18800 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  ise zero..*/.sta
18810 74 69 63 20 69 6e 74 20 77 69 6e 43 68 65 63 6b  tic int winCheck
18820 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
18830 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
18840 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
18850 69 6e 74 20 72 65 73 3b 0a 20 20 77 69 6e 46 69  int res;.  winFi
18860 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
18870 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d  File*)id;..  Sim
18880 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
18890 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
188a0 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
188b0 4f 43 4b 3b 20 29 3b 0a 20 20 4f 53 54 52 41 43  OCK; );.  OSTRAC
188c0 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b  E(("TEST-WR-LOCK
188d0 20 66 69 6c 65 3d 25 70 2c 20 70 52 65 73 4f 75   file=%p, pResOu
188e0 74 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  t=%p\n", pFile->
188f0 68 2c 20 70 52 65 73 4f 75 74 29 29 3b 0a 0a 20  h, pResOut));.. 
18900 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
18910 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  ;.  if( pFile->l
18920 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56 45  ocktype>=RESERVE
18930 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
18940 73 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52 41  s = 1;.    OSTRA
18950 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43  CE(("TEST-WR-LOC
18960 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c  K file=%p, resul
18970 74 3d 25 64 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c  t=%d (local)\n",
18980 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29   pFile->h, res))
18990 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
189a0 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  es = winLockFile
189b0 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49  (&pFile->h, SQLI
189c0 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c  TE_LOCKFILEEX_FL
189d0 41 47 53 2c 52 45 53 45 52 56 45 44 5f 42 59 54  AGS,RESERVED_BYT
189e0 45 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20 69 66  E,0,1,0);.    if
189f0 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 77  ( res ){.      w
18a00 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46  inUnlockFile(&pF
18a10 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44  ile->h, RESERVED
18a20 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
18a30 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 73 20 3d  .    }.    res =
18a40 20 21 72 65 73 3b 0a 20 20 20 20 4f 53 54 52 41   !res;.    OSTRA
18a50 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43  CE(("TEST-WR-LOC
18a60 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c  K file=%p, resul
18a70 74 3d 25 64 20 28 72 65 6d 6f 74 65 29 5c 6e 22  t=%d (remote)\n"
18a80 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73 29  , pFile->h, res)
18a90 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75  );.  }.  *pResOu
18aa0 74 20 3d 20 72 65 73 3b 0a 20 20 4f 53 54 52 41  t = res;.  OSTRA
18ab0 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43  CE(("TEST-WR-LOC
18ac0 4b 20 66 69 6c 65 3d 25 70 2c 20 70 52 65 73 4f  K file=%p, pResO
18ad0 75 74 3d 25 70 2c 20 2a 70 52 65 73 4f 75 74 3d  ut=%p, *pResOut=
18ae0 25 64 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %d, rc=SQLITE_OK
18af0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
18b00 70 46 69 6c 65 2d 3e 68 2c 20 70 52 65 73 4f 75  pFile->h, pResOu
18b10 74 2c 20 2a 70 52 65 73 4f 75 74 29 29 3b 0a 20  t, *pResOut));. 
18b20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18b30 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  K;.}../*.** Lowe
18b40 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
18b50 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
18b60 72 69 70 74 6f 72 20 69 64 20 74 6f 20 6c 6f 63  riptor id to loc
18b70 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65  ktype.  locktype
18b80 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
18b90 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
18ba0 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
18bb0 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
18bc0 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
18bd0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
18be0 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
18bf0 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
18c00 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
18c10 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
18c20 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
18c30 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  ** It is not pos
18c40 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72  sible for this r
18c50 6f 75 74 69 6e 65 20 74 6f 20 66 61 69 6c 20 69  outine to fail i
18c60 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
18c70 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c  ument.** is NO_L
18c80 4f 43 4b 2e 20 20 49 66 20 74 68 65 20 73 65 63  OCK.  If the sec
18c90 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
18ca0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 74 68 65 6e  SHARED_LOCK then
18cb0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
18cc0 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 53 51   might return SQ
18cd0 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73  LITE_IOERR;.*/.s
18ce0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c  tatic int winUnl
18cf0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
18d00 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
18d10 70 65 29 7b 0a 20 20 69 6e 74 20 74 79 70 65 3b  pe){.  int type;
18d20 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
18d30 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
18d40 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
18d50 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
18d60 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20  ( pFile!=0 );.  
18d70 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
18d80 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
18d90 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
18da0 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 6c 64  OCK file=%p, old
18db0 4c 6f 63 6b 3d 25 64 28 25 64 29 2c 20 6e 65 77  Lock=%d(%d), new
18dc0 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Lock=%d\n",.    
18dd0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
18de0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
18df0 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c  , pFile->sharedL
18e00 6f 63 6b 42 79 74 65 2c 20 6c 6f 63 6b 74 79 70  ockByte, locktyp
18e10 65 29 29 3b 0a 20 20 74 79 70 65 20 3d 20 70 46  e));.  type = pF
18e20 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20  ile->locktype;. 
18e30 20 69 66 28 20 74 79 70 65 3e 3d 45 58 43 4c 55   if( type>=EXCLU
18e40 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
18e50 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26   winUnlockFile(&
18e60 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
18e70 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45  _FIRST, 0, SHARE
18e80 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20  D_SIZE, 0);.    
18e90 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
18ea0 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 21 77 69  ARED_LOCK && !wi
18eb0 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69  nGetReadLock(pFi
18ec0 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  le) ){.      /* 
18ed0 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65  This should neve
18ee0 72 20 68 61 70 70 65 6e 2e 20 20 57 65 20 73 68  r happen.  We sh
18ef0 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 61  ould always be a
18f00 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ble to.      ** 
18f10 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65  reacquire the re
18f20 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  ad lock */.     
18f30 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
18f40 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  r(SQLITE_IOERR_U
18f50 4e 4c 4f 43 4b 2c 20 6f 73 47 65 74 4c 61 73 74  NLOCK, osGetLast
18f60 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
18f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f80 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c 20 70 46 69  "winUnlock", pFi
18f90 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
18fa0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65  }.  }.  if( type
18fb0 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
18fc0 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b  ){.    winUnlock
18fd0 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
18fe0 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30  RESERVED_BYTE, 0
18ff0 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  , 1, 0);.  }.  i
19000 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  f( locktype==NO_
19010 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d 53 48  LOCK && type>=SH
19020 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
19030 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f   winUnlockReadLo
19040 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20  ck(pFile);.  }. 
19050 20 69 66 28 20 74 79 70 65 3e 3d 50 45 4e 44 49   if( type>=PENDI
19060 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77  NG_LOCK ){.    w
19070 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46  inUnlockFile(&pF
19080 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f  ile->h, PENDING_
19090 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
190a0 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63    }.  pFile->loc
190b0 6b 74 79 70 65 20 3d 20 28 75 38 29 6c 6f 63 6b  ktype = (u8)lock
190c0 74 79 70 65 3b 0a 20 20 4f 53 54 52 41 43 45 28  type;.  OSTRACE(
190d0 28 22 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  ("UNLOCK file=%p
190e0 2c 20 6c 6f 63 6b 3d 25 64 2c 20 72 63 3d 25 73  , lock=%d, rc=%s
190f0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
19100 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d  pFile->h, pFile-
19110 3e 6c 6f 63 6b 74 79 70 65 2c 20 73 71 6c 69 74  >locktype, sqlit
19120 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
19130 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19140 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20  ./*.** If *pArg 
19150 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 65 67  is initially neg
19160 61 74 69 76 65 20 74 68 65 6e 20 74 68 69 73 20  ative then this 
19170 69 73 20 61 20 71 75 65 72 79 2e 20 20 53 65 74  is a query.  Set
19180 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f   *pArg to.** 1 o
19190 72 20 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  r 0 depending on
191a0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
191b0 62 69 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c  bit mask of pFil
191c0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20  e->ctrlFlags is 
191d0 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70  set..**.** If *p
191e0 41 72 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74  Arg is 0 or 1, t
191f0 68 65 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74  hen clear or set
19200 20 74 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66   the mask bit of
19210 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
19220 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
19230 64 20 77 69 6e 4d 6f 64 65 42 69 74 28 77 69 6e  d winModeBit(win
19240 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73  File *pFile, uns
19250 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c  igned char mask,
19260 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69   int *pArg){.  i
19270 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20  f( *pArg<0 ){.  
19280 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65    *pArg = (pFile
19290 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61  ->ctrlFlags & ma
192a0 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20  sk)!=0;.  }else 
192b0 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29  if( (*pArg)==0 )
192c0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
192d0 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b  lFlags &= ~mask;
192e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
192f0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  ile->ctrlFlags |
19300 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = mask;.  }.}../
19310 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
19320 6e 63 65 73 20 74 6f 20 56 46 53 20 68 65 6c 70  nces to VFS help
19330 65 72 20 6d 65 74 68 6f 64 73 20 75 73 65 64 20  er methods used 
19340 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  for temporary fi
19350 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  les */.static in
19360 74 20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65  t winGetTempname
19370 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 20  (sqlite3_vfs *, 
19380 63 68 61 72 20 2a 2a 29 3b 0a 73 74 61 74 69 63  char **);.static
19390 20 69 6e 74 20 77 69 6e 49 73 44 69 72 28 63 6f   int winIsDir(co
193a0 6e 73 74 20 76 6f 69 64 20 2a 29 3b 0a 73 74 61  nst void *);.sta
193b0 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 44 72  tic BOOL winIsDr
193c0 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f  iveLetterAndColo
193d0 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b  n(const char *);
193e0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 72 6f 6c 20  ../*.** Control 
193f0 61 6e 64 20 71 75 65 72 79 20 6f 66 20 74 68 65  and query of the
19400 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c   open file handl
19410 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
19420 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 28   winFileControl(
19430 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
19440 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a  , int op, void *
19450 70 41 72 67 29 7b 0a 20 20 77 69 6e 46 69 6c 65  pArg){.  winFile
19460 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
19470 6c 65 2a 29 69 64 3b 0a 20 20 4f 53 54 52 41 43  le*)id;.  OSTRAC
19480 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
19490 70 2c 20 6f 70 3d 25 64 2c 20 70 41 72 67 3d 25  p, op=%d, pArg=%
194a0 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  p\n", pFile->h, 
194b0 6f 70 2c 20 70 41 72 67 29 29 3b 0a 20 20 73 77  op, pArg));.  sw
194c0 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
194d0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
194e0 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20  L_LOCKSTATE: {. 
194f0 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
19500 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79   = pFile->lockty
19510 70 65 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  pe;.      OSTRAC
19520 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
19530 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
19540 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
19550 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
19560 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
19570 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41    case SQLITE_LA
19580 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20  ST_ERRNO: {.    
19590 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20    *(int*)pArg = 
195a0 28 69 6e 74 29 70 46 69 6c 65 2d 3e 6c 61 73 74  (int)pFile->last
195b0 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 4f 53 54  Errno;.      OST
195c0 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
195d0 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
195e0 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
195f0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
19600 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
19610 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
19620 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a  _FCNTL_CHUNK_SIZ
19630 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  E: {.      pFile
19640 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e  ->szChunk = *(in
19650 74 20 2a 29 70 41 72 67 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 53 49 5a 45 5f 48  ITE_FCNTL_SIZE_H
196d0 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  INT: {.      if(
196e0 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e   pFile->szChunk>
196f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
19700 69 74 65 33 5f 69 6e 74 36 34 20 6f 6c 64 53 7a  ite3_int64 oldSz
19710 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63  ;.        int rc
19720 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 69   = winFileSize(i
19730 64 2c 20 26 6f 6c 64 53 7a 29 3b 0a 20 20 20 20  d, &oldSz);.    
19740 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19750 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
19760 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
19770 20 6e 65 77 53 7a 20 3d 20 2a 28 73 71 6c 69 74   newSz = *(sqlit
19780 65 33 5f 69 6e 74 36 34 2a 29 70 41 72 67 3b 0a  e3_int64*)pArg;.
19790 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 65            if( ne
197a0 77 53 7a 3e 6f 6c 64 53 7a 20 29 7b 0a 20 20 20  wSz>oldSz ){.   
197b0 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74           Simulat
197c0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
197d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
197e0 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28  c = winTruncate(
197f0 69 64 2c 20 6e 65 77 53 7a 29 3b 0a 20 20 20 20  id, newSz);.    
19800 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65          Simulate
19810 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
19820 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
19830 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
19840 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
19850 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e  file=%p, rc=%s\n
19860 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c  ", pFile->h, sql
19870 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
19880 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
19890 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
198a0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
198b0 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
198c0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
198d0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
198e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
198f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
19900 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45   SQLITE_FCNTL_PE
19910 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20  RSIST_WAL: {.   
19920 20 20 20 69 6e 74 20 62 50 65 72 73 69 73 74 20     int bPersist 
19930 3d 20 2a 28 69 6e 74 2a 29 70 41 72 67 3b 0a 20  = *(int*)pArg;. 
19940 20 20 20 20 20 69 66 28 20 62 50 65 72 73 69 73       if( bPersis
19950 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  t<0 ){.        *
19960 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69  (int*)pArg = pFi
19970 6c 65 2d 3e 62 50 65 72 73 69 73 74 57 61 6c 3b  le->bPersistWal;
19980 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
19990 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 62 50 65        pFile->bPe
199a0 72 73 69 73 74 57 61 6c 20 3d 20 62 50 65 72 73  rsistWal = bPers
199b0 69 73 74 21 3d 30 3b 0a 20 20 20 20 20 20 7d 0a  ist!=0;.      }.
199c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
199d0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
199e0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
199f0 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a  NTL_PERSIST_WAL:
19a00 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64 65   {.      winMode
19a10 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46 49  Bit(pFile, WINFI
19a20 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20  LE_PERSIST_WAL, 
19a30 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20  (int*)pArg);.   
19a40 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e     OSTRACE(("FCN
19a50 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  TL file=%p, rc=S
19a60 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
19a70 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72  le->h));.      r
19a80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19a90 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
19aa0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57  SQLITE_FCNTL_POW
19ab0 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
19ac0 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64  : {.      winMod
19ad0 65 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46  eBit(pFile, WINF
19ae0 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29  ILE_PSOW, (int*)
19af0 70 41 72 67 29 3b 0a 20 20 20 20 20 20 4f 53 54  pArg);.      OST
19b00 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
19b10 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
19b20 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
19b30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
19b40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
19b50 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
19b60 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20  _FCNTL_VFSNAME: 
19b70 7b 0a 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a  {.      *(char**
19b80 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f  )pArg = sqlite3_
19b90 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 70 46  mprintf("%s", pF
19ba0 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d 65  ile->pVfs->zName
19bb0 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
19bc0 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
19bd0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
19be0 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
19bf0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
19c00 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
19c10 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
19c20 54 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52  TL_WIN32_AV_RETR
19c30 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a  Y: {.      int *
19c40 61 20 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b 0a  a = (int*)pArg;.
19c50 20 20 20 20 20 20 69 66 28 20 61 5b 30 5d 3e 30        if( a[0]>0
19c60 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 49   ){.        winI
19c70 6f 65 72 72 52 65 74 72 79 20 3d 20 61 5b 30 5d  oerrRetry = a[0]
19c80 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
19c90 20 20 20 20 20 20 20 61 5b 30 5d 20 3d 20 77 69         a[0] = wi
19ca0 6e 49 6f 65 72 72 52 65 74 72 79 3b 0a 20 20 20  nIoerrRetry;.   
19cb0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61     }.      if( a
19cc0 5b 31 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  [1]>0 ){.       
19cd0 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65   winIoerrRetryDe
19ce0 6c 61 79 20 3d 20 61 5b 31 5d 3b 0a 20 20 20 20  lay = a[1];.    
19cf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
19d00 20 61 5b 31 5d 20 3d 20 77 69 6e 49 6f 65 72 72   a[1] = winIoerr
19d10 52 65 74 72 79 44 65 6c 61 79 3b 0a 20 20 20 20  RetryDelay;.    
19d20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43    }.      OSTRAC
19d30 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
19d40 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
19d50 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
19d60 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
19d70 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69  ITE_OK;.    }.#i
19d80 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
19d90 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
19da0 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 53 45 54  _FCNTL_WIN32_SET
19db0 5f 48 41 4e 44 4c 45 3a 20 7b 0a 20 20 20 20 20  _HANDLE: {.     
19dc0 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65   LPHANDLE phFile
19dd0 20 3d 20 28 4c 50 48 41 4e 44 4c 45 29 70 41 72   = (LPHANDLE)pAr
19de0 67 3b 0a 20 20 20 20 20 20 48 41 4e 44 4c 45 20  g;.      HANDLE 
19df0 68 4f 6c 64 46 69 6c 65 20 3d 20 70 46 69 6c 65  hOldFile = pFile
19e00 2d 3e 68 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ->h;.      pFile
19e10 2d 3e 68 20 3d 20 2a 70 68 46 69 6c 65 3b 0a 20  ->h = *phFile;. 
19e20 20 20 20 20 20 2a 70 68 46 69 6c 65 20 3d 20 68       *phFile = h
19e30 4f 6c 64 46 69 6c 65 3b 0a 20 20 20 20 20 20 4f  OldFile;.      O
19e40 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 6f  STRACE(("FCNTL o
19e50 6c 64 46 69 6c 65 3d 25 70 2c 20 6e 65 77 46 69  ldFile=%p, newFi
19e60 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
19e70 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  _OK\n",.        
19e80 20 20 20 20 20 20 20 68 4f 6c 64 46 69 6c 65 2c         hOldFile,
19e90 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
19ea0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19eb0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  _OK;.    }.#endi
19ec0 66 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  f.    case SQLIT
19ed0 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45  E_FCNTL_TEMPFILE
19ee0 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 63 68  NAME: {.      ch
19ef0 61 72 20 2a 7a 54 46 69 6c 65 20 3d 20 30 3b 0a  ar *zTFile = 0;.
19f00 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77        int rc = w
19f10 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 46  inGetTempname(pF
19f20 69 6c 65 2d 3e 70 56 66 73 2c 20 26 7a 54 46 69  ile->pVfs, &zTFi
19f30 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  le);.      if( r
19f40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19f50 20 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a          *(char**
19f60 29 70 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b 0a  )pArg = zTFile;.
19f70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53        }.      OS
19f80 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
19f90 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
19fa0 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74   pFile->h, sqlit
19fb0 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
19fc0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
19fd0 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49  ;.    }.#if SQLI
19fe0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
19ff0 3e 30 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  >0.    case SQLI
1a000 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49  TE_FCNTL_MMAP_SI
1a010 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 36 34 20  ZE: {.      i64 
1a020 6e 65 77 4c 69 6d 69 74 20 3d 20 2a 28 69 36 34  newLimit = *(i64
1a030 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69 6e  *)pArg;.      in
1a040 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1a050 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c  ;.      if( newL
1a060 69 6d 69 74 3e 73 71 6c 69 74 65 33 47 6c 6f 62  imit>sqlite3Glob
1a070 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 20  alConfig.mxMmap 
1a080 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 4c 69  ){.        newLi
1a090 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  mit = sqlite3Glo
1a0a0 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70  balConfig.mxMmap
1a0b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a0c0 2a 28 69 36 34 2a 29 70 41 72 67 20 3d 20 70 46  *(i64*)pArg = pF
1a0d0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  ile->mmapSizeMax
1a0e0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c  ;.      if( newL
1a0f0 69 6d 69 74 3e 3d 30 20 26 26 20 6e 65 77 4c 69  imit>=0 && newLi
1a100 6d 69 74 21 3d 70 46 69 6c 65 2d 3e 6d 6d 61 70  mit!=pFile->mmap
1a110 53 69 7a 65 4d 61 78 20 26 26 20 70 46 69 6c 65  SizeMax && pFile
1a120 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29  ->nFetchOut==0 )
1a130 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
1a140 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 6e  >mmapSizeMax = n
1a150 65 77 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20  ewLimit;.       
1a160 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61 70   if( pFile->mmap
1a170 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Size>0 ){.      
1a180 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65      winUnmapfile
1a190 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  (pFile);.       
1a1a0 20 20 20 72 63 20 3d 20 77 69 6e 4d 61 70 66 69     rc = winMapfi
1a1b0 6c 65 28 70 46 69 6c 65 2c 20 2d 31 29 3b 0a 20  le(pFile, -1);. 
1a1c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1a1d0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1a1e0 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
1a1f0 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d  rc=%s\n", pFile-
1a200 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  >h, sqlite3ErrNa
1a210 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20  me(rc)));.      
1a220 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1a230 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 4f 53  .#endif.  }.  OS
1a240 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
1a250 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
1a260 5f 4e 4f 54 46 4f 55 4e 44 5c 6e 22 2c 20 70 46  _NOTFOUND\n", pF
1a270 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75  ile->h));.  retu
1a280 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
1a290 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ND;.}../*.** Ret
1a2a0 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73  urn the sector s
1a2b0 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20  ize in bytes of 
1a2c0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62  the underlying b
1a2d0 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a  lock device for.
1a2e0 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ** the specified
1a2f0 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61   file. This is a
1a300 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32  lmost always 512
1a310 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20   bytes, but may 
1a320 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72  be.** larger for
1a330 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a   some devices..*
1a340 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65  *.** SQLite code
1a350 20 61 73 73 75 6d 65 73 20 74 68 69 73 20 66 75   assumes this fu
1a360 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61  nction cannot fa
1a370 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75  il. It also assu
1a380 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74  mes that.** if t
1a390 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72 65  wo files are cre
1a3a0 61 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ated in the same
1a3b0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72   file-system dir
1a3c0 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20  ectory (i.e..** 
1a3d0 61 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69  a database and i
1a3e0 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  ts journal file)
1a3f0 20 74 68 61 74 20 74 68 65 20 73 65 63 74 6f 72   that the sector
1a400 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68   size will be th
1a410 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f  e.** same for bo
1a420 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  th..*/.static in
1a430 74 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 28  t winSectorSize(
1a440 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1a450 29 7b 0a 20 20 28 76 6f 69 64 29 69 64 3b 0a 20  ){.  (void)id;. 
1a460 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
1a470 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49  EFAULT_SECTOR_SI
1a480 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ZE;.}../*.** Ret
1a490 75 72 6e 20 61 20 76 65 63 74 6f 72 20 6f 66 20  urn a vector of 
1a4a0 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
1a4b0 69 73 74 69 63 73 2e 0a 2a 2f 0a 73 74 61 74 69  istics..*/.stati
1a4c0 63 20 69 6e 74 20 77 69 6e 44 65 76 69 63 65 43  c int winDeviceC
1a4d0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73  haracteristics(s
1a4e0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
1a4f0 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 20 3d  {.  winFile *p =
1a500 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20   (winFile*)id;. 
1a510 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1a520 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45  OCAP_UNDELETABLE
1a530 5f 57 48 45 4e 5f 4f 50 45 4e 20 7c 0a 20 20 20  _WHEN_OPEN |.   
1a540 20 20 20 20 20 20 28 28 70 2d 3e 63 74 72 6c 46        ((p->ctrlF
1a550 6c 61 67 73 20 26 20 57 49 4e 46 49 4c 45 5f 50  lags & WINFILE_P
1a560 53 4f 57 29 3f 53 51 4c 49 54 45 5f 49 4f 43 41  SOW)?SQLITE_IOCA
1a570 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
1a580 57 52 49 54 45 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a  WRITE:0);.}../*.
1a590 2a 2a 20 57 69 6e 64 6f 77 73 20 77 69 6c 6c 20  ** Windows will 
1a5a0 6f 6e 6c 79 20 6c 65 74 20 79 6f 75 20 63 72 65  only let you cre
1a5b0 61 74 65 20 66 69 6c 65 20 76 69 65 77 20 6d 61  ate file view ma
1a5c0 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e 20 61 6c 6c  ppings.** on all
1a5d0 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 67 72 61  ocation size gra
1a5e0 6e 75 6c 61 72 69 74 79 20 62 6f 75 6e 64 61 72  nularity boundar
1a5f0 69 65 73 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 73  ies..** During s
1a600 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29  qlite3_os_init()
1a610 20 77 65 20 64 6f 20 61 20 47 65 74 53 79 73 74   we do a GetSyst
1a620 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20 74 6f 20 67  emInfo().** to g
1a630 65 74 20 74 68 65 20 67 72 61 6e 75 6c 61 72 69  et the granulari
1a640 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  ty size..*/.stat
1a650 69 63 20 53 59 53 54 45 4d 5f 49 4e 46 4f 20 77  ic SYSTEM_INFO w
1a660 69 6e 53 79 73 49 6e 66 6f 3b 0a 0a 23 69 66 6e  inSysInfo;..#ifn
1a670 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1a680 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65  WAL../*.** Helpe
1a690 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f  r functions to o
1a6a0 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71  btain and relinq
1a6b0 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20  uish the global 
1a6c0 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c  mutex. The.** gl
1a6d0 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73  obal mutex is us
1a6e0 65 64 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68  ed to protect th
1a6f0 65 20 77 69 6e 4c 6f 63 6b 49 6e 66 6f 20 6f 62  e winLockInfo ob
1a700 6a 65 63 74 73 20 75 73 65 64 20 62 79 0a 2a 2a  jects used by.**
1a710 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20   this file, all 
1a720 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62 65 20  of which may be 
1a730 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70  shared by multip
1a740 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a  le threads..**.*
1a750 2a 20 46 75 6e 63 74 69 6f 6e 20 77 69 6e 53 68  * Function winSh
1a760 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20  mMutexHeld() is 
1a770 75 73 65 64 20 74 6f 20 61 73 73 65 72 74 28 29  used to assert()
1a780 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c   that the global
1a790 20 6d 75 74 65 78 0a 2a 2a 20 69 73 20 68 65 6c   mutex.** is hel
1a7a0 64 20 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e  d when required.
1a7b0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1a7c0 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70  s only used as p
1a7d0 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 0a  art of assert().
1a7e0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65  ** statements. e
1a7f0 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 77 69 6e 53  .g..**.**   winS
1a800 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a  hmEnterMutex().*
1a810 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 77 69  *     assert( wi
1a820 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  nShmMutexHeld() 
1a830 29 3b 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 4c 65  );.**   winShmLe
1a840 61 76 65 4d 75 74 65 78 28 29 0a 2a 2f 0a 73 74  aveMutex().*/.st
1a850 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d  atic void winShm
1a860 45 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29  EnterMutex(void)
1a870 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
1a880 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d  x_enter(sqlite3M
1a890 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
1a8a0 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 56 46  _MUTEX_STATIC_VF
1a8b0 53 31 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  S1));.}.static v
1a8c0 6f 69 64 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  oid winShmLeaveM
1a8d0 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71  utex(void){.  sq
1a8e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1a8f0 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  e(sqlite3MutexAl
1a900 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
1a910 5f 53 54 41 54 49 43 5f 56 46 53 31 29 29 3b 0a  _STATIC_VFS1));.
1a920 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
1a930 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
1a940 68 6d 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64  hmMutexHeld(void
1a950 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  ) {.  return sql
1a960 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1a970 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
1a980 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
1a990 54 41 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a  TATIC_VFS1));.}.
1a9a0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62  #endif../*.** Ob
1a9b0 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70  ject used to rep
1a9c0 72 65 73 65 6e 74 20 61 20 73 69 6e 67 6c 65 20  resent a single 
1a9d0 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64 20  file opened and 
1a9e0 6d 6d 61 70 70 65 64 20 74 6f 20 70 72 6f 76 69  mmapped to provi
1a9f0 64 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65 6d  de.** shared mem
1aa00 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74 69  ory.  When multi
1aa10 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20  ple threads all 
1aa20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 61  reference the sa
1aa30 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72  me.** log-summar
1aa40 79 2c 20 65 61 63 68 20 74 68 72 65 61 64 20 68  y, each thread h
1aa50 61 73 20 69 74 73 20 6f 77 6e 20 77 69 6e 46 69  as its own winFi
1aa60 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74  le object, but t
1aa70 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e 74  hey all.** point
1aa80 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73   to a single ins
1aa90 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
1aaa0 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20  ject.  In other 
1aab0 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a 20 6c  words, each.** l
1aac0 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f 70  og-summary is op
1aad0 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 70  ened only once p
1aae0 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  er process..**.*
1aaf0 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  * winShmMutexHel
1ab00 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65  d() must be true
1ab10 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f   when creating o
1ab20 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20  r destroying.** 
1ab30 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77  this object or w
1ab40 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20  hile reading or 
1ab50 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c  writing the foll
1ab60 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a  owing fields:.**
1ab70 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a  .**      nRef.**
1ab80 20 20 20 20 20 20 70 4e 65 78 74 0a 2a 2a 0a 2a        pNext.**.*
1ab90 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1aba0 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2d  fields are read-
1abb0 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20 6f  only after the o
1abc0 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
1abd0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 69 64  :.**.**      fid
1abe0 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61  .**      zFilena
1abf0 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20  me.**.** Either 
1ac00 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78  winShmNode.mutex
1ac10 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 72   must be held or
1ac20 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66   winShmNode.nRef
1ac30 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77 69 6e 53 68  ==0 and.** winSh
1ac40 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20  mMutexHeld() is 
1ac50 74 72 75 65 20 77 68 65 6e 20 72 65 61 64 69 6e  true when readin
1ac60 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 79  g or writing any
1ac70 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20   other field.** 
1ac80 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
1ac90 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75 63 74 20  e..**.*/.struct 
1aca0 77 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 73  winShmNode {.  s
1acb0 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
1acc0 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74  tex;      /* Mut
1acd0 65 78 20 74 6f 20 61 63 63 65 73 73 20 74 68 69  ex to access thi
1ace0 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68  s object */.  ch
1acf0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20  ar *zFilename;  
1ad00 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1ad10 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   of the file */.
1ad20 20 20 77 69 6e 46 69 6c 65 20 68 46 69 6c 65 3b    winFile hFile;
1ad30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ad40 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d  File handle from
1ad50 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20 20 69   winOpen */..  i
1ad60 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20  nt szRegion;    
1ad70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1ad80 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f  e of shared-memo
1ad90 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  ry regions */.  
1ada0 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20  int nRegion;    
1adb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1adc0 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70 52 65  ze of array apRe
1add0 67 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74  gion */.  struct
1ade0 20 53 68 6d 52 65 67 69 6f 6e 20 7b 0a 20 20 20   ShmRegion {.   
1adf0 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20   HANDLE hMap;   
1ae00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
1ae10 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 43 72  e handle from Cr
1ae20 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 20  eateFileMapping 
1ae30 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4d 61  */.    void *pMa
1ae40 70 3b 0a 20 20 7d 20 2a 61 52 65 67 69 6f 6e 3b  p;.  } *aRegion;
1ae50 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
1ae60 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no;           /*
1ae70 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72 72   The Windows err
1ae80 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74  no from the last
1ae90 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 0a 20   I/O error */.. 
1aea0 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
1aeb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1aec0 75 6d 62 65 72 20 6f 66 20 77 69 6e 53 68 6d 20  umber of winShm 
1aed0 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67  objects pointing
1aee0 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69   to this */.  wi
1aef0 6e 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20 20  nShm *pFirst;   
1af00 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
1af10 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20 70  winShm objects p
1af20 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20  ointing to this 
1af30 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  */.  winShmNode 
1af40 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
1af50 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 73 74 20  /* Next in list 
1af60 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64  of all winShmNod
1af70 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23 69 66  e objects */.#if
1af80 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1af90 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
1afa0 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53  d(SQLITE_HAVE_OS
1afb0 5f 54 52 41 43 45 29 0a 20 20 75 38 20 6e 65 78  _TRACE).  u8 nex
1afc0 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20 20  tShmId;         
1afd0 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61       /* Next ava
1afe0 69 6c 61 62 6c 65 20 77 69 6e 53 68 6d 2e 69 64  ilable winShm.id
1aff0 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66   value */.#endif
1b000 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f  .};../*.** A glo
1b010 62 61 6c 20 61 72 72 61 79 20 6f 66 20 61 6c 6c  bal array of all
1b020 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65   winShmNode obje
1b030 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77  cts..**.** The w
1b040 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
1b050 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77 68   must be true wh
1b060 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77  ile reading or w
1b070 72 69 74 69 6e 67 20 74 68 69 73 20 6c 69 73 74  riting this list
1b080 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 77 69 6e 53  ..*/.static winS
1b090 68 6d 4e 6f 64 65 20 2a 77 69 6e 53 68 6d 4e 6f  hmNode *winShmNo
1b0a0 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  deList = 0;../*.
1b0b0 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75 73 65  ** Structure use
1b0c0 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20  d internally by 
1b0d0 74 68 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f  this VFS to reco
1b0e0 72 64 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  rd the state of 
1b0f0 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65  an.** open share
1b100 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74  d memory connect
1b110 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
1b120 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20  ollowing fields 
1b130 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  are initialized 
1b140 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63 74  when this object
1b150 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 0a   is created and.
1b160 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79  ** are read-only
1b170 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a   thereafter:.**.
1b180 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 70 53 68  **    winShm.pSh
1b190 6d 4e 6f 64 65 0a 2a 2a 20 20 20 20 77 69 6e 53  mNode.**    winS
1b1a0 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  hm.id.**.** All 
1b1b0 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65  other fields are
1b1c0 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68   read/write.  Th
1b1d0 65 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64  e winShm.pShmNod
1b1e0 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65  e->mutex must be
1b1f0 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61   held.** while a
1b200 63 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61  ccessing any rea
1b210 64 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a  d/write fields..
1b220 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d  */.struct winShm
1b230 20 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20   {.  winShmNode 
1b240 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20  *pShmNode;      
1b250 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
1b260 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a  g winShmNode obj
1b270 65 63 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ect */.  winShm 
1b280 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
1b290 20 20 20 20 2f 2a 20 4e 65 78 74 20 77 69 6e 53      /* Next winS
1b2a0 68 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  hm with the same
1b2b0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20   winShmNode */. 
1b2c0 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20   u8 hasMutex;   
1b2d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b2e0 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74  rue if holding t
1b2f0 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6d 75  he winShmNode mu
1b300 74 65 78 20 2a 2f 0a 20 20 75 31 36 20 73 68 61  tex */.  u16 sha
1b310 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  redMask;        
1b320 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73      /* Mask of s
1b330 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64  hared locks held
1b340 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61   */.  u16 exclMa
1b350 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
1b360 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c   /* Mask of excl
1b370 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64  usive locks held
1b380 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
1b390 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c  SQLITE_DEBUG) ||
1b3a0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1b3b0 48 41 56 45 5f 4f 53 5f 54 52 41 43 45 29 0a 20  HAVE_OS_TRACE). 
1b3c0 20 75 38 20 69 64 3b 20 20 20 20 20 20 20 20 20   u8 id;         
1b3d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1b3e0 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  d of this connec
1b3f0 74 69 6f 6e 20 77 69 74 68 20 69 74 73 20 77 69  tion with its wi
1b400 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64  nShmNode */.#end
1b410 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  if.};../*.** Con
1b420 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20  stants used for 
1b430 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69  locking.*/.#defi
1b440 6e 65 20 57 49 4e 5f 53 48 4d 5f 42 41 53 45 20  ne WIN_SHM_BASE 
1b450 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48    ((22+SQLITE_SH
1b460 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20  M_NLOCK)*4)     
1b470 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b     /* first lock
1b480 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65   byte */.#define
1b490 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 20 20 20 20   WIN_SHM_DMS    
1b4a0 28 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2b 53 51  (WIN_SHM_BASE+SQ
1b4b0 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20  LITE_SHM_NLOCK) 
1b4c0 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74   /* deadman swit
1b4d0 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  ch */../*.** App
1b4e0 6c 79 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ly advisory lock
1b4f0 73 20 66 6f 72 20 61 6c 6c 20 6e 20 62 79 74 65  s for all n byte
1b500 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 6f  s beginning at o
1b510 66 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  fst..*/.#define 
1b520 5f 53 48 4d 5f 55 4e 4c 43 4b 20 20 31 0a 23 64  _SHM_UNLCK  1.#d
1b530 65 66 69 6e 65 20 5f 53 48 4d 5f 52 44 4c 43 4b  efine _SHM_RDLCK
1b540 20 20 32 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d    2.#define _SHM
1b550 5f 57 52 4c 43 4b 20 20 33 0a 73 74 61 74 69 63  _WRLCK  3.static
1b560 20 69 6e 74 20 77 69 6e 53 68 6d 53 79 73 74 65   int winShmSyste
1b570 6d 4c 6f 63 6b 28 0a 20 20 77 69 6e 53 68 6d 4e  mLock(.  winShmN
1b580 6f 64 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 2f  ode *pFile,    /
1b590 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f  * Apply locks to
1b5a0 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65   this open share
1b5b0 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d-memory segment
1b5c0 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79   */.  int lockTy
1b5d0 70 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 5f  pe,         /* _
1b5e0 53 48 4d 5f 55 4e 4c 43 4b 2c 20 5f 53 48 4d 5f  SHM_UNLCK, _SHM_
1b5f0 52 44 4c 43 4b 2c 20 6f 72 20 5f 53 48 4d 5f 57  RDLCK, or _SHM_W
1b600 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  RLCK */.  int of
1b610 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
1b620 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 66 69 72  /* Offset to fir
1b630 73 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f  st byte to be lo
1b640 63 6b 65 64 2f 75 6e 6c 6f 63 6b 65 64 20 2a 2f  cked/unlocked */
1b650 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 20 20 20  .  int nByte    
1b660 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1b670 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c  er of bytes to l
1b680 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f  ock or unlock */
1b690 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  .){.  int rc = 0
1b6a0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
1b6b0 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20  esult code form 
1b6c0 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45  Lock/UnlockFileE
1b6d0 78 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63  x() */..  /* Acc
1b6e0 65 73 73 20 74 6f 20 74 68 65 20 77 69 6e 53 68  ess to the winSh
1b6f0 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20  mNode object is 
1b700 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68  serialized by th
1b710 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73  e caller */.  as
1b720 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1b730 74 65 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e  tex_held(pFile->
1b740 6d 75 74 65 78 29 20 7c 7c 20 70 46 69 6c 65 2d  mutex) || pFile-
1b750 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 4f  >nRef==0 );..  O
1b760 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43  STRACE(("SHM-LOC
1b770 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d  K file=%p, lock=
1b780 25 64 2c 20 6f 66 66 73 65 74 3d 25 64 2c 20 73  %d, offset=%d, s
1b790 69 7a 65 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ize=%d\n",.     
1b7a0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 46 69        pFile->hFi
1b7b0 6c 65 2e 68 2c 20 6c 6f 63 6b 54 79 70 65 2c 20  le.h, lockType, 
1b7c0 6f 66 73 74 2c 20 6e 42 79 74 65 29 29 3b 0a 0a  ofst, nByte));..
1b7d0 20 20 2f 2a 20 52 65 6c 65 61 73 65 2f 41 63 71    /* Release/Acq
1b7e0 75 69 72 65 20 74 68 65 20 73 79 73 74 65 6d 2d  uire the system-
1b7f0 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20  level lock */.  
1b800 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53  if( lockType==_S
1b810 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  HM_UNLCK ){.    
1b820 72 63 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  rc = winUnlockFi
1b830 6c 65 28 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65  le(&pFile->hFile
1b840 2e 68 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79  .h, ofst, 0, nBy
1b850 74 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  te, 0);.  }else{
1b860 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  .    /* Initiali
1b870 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70  ze the locking p
1b880 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20  arameters */.   
1b890 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 20 3d   DWORD dwFlags =
1b8a0 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49   LOCKFILE_FAIL_I
1b8b0 4d 4d 45 44 49 41 54 45 4c 59 3b 0a 20 20 20 20  MMEDIATELY;.    
1b8c0 69 66 28 20 6c 6f 63 6b 54 79 70 65 20 3d 3d 20  if( lockType == 
1b8d0 5f 53 48 4d 5f 57 52 4c 43 4b 20 29 20 64 77 46  _SHM_WRLCK ) dwF
1b8e0 6c 61 67 73 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45  lags |= LOCKFILE
1b8f0 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b  _EXCLUSIVE_LOCK;
1b900 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 63  .    rc = winLoc
1b910 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 46  kFile(&pFile->hF
1b920 69 6c 65 2e 68 2c 20 64 77 46 6c 61 67 73 2c 20  ile.h, dwFlags, 
1b930 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20  ofst, 0, nByte, 
1b940 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  0);.  }..  if( r
1b950 63 21 3d 20 30 20 29 7b 0a 20 20 20 20 72 63 20  c!= 0 ){.    rc 
1b960 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
1b970 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
1b980 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 20 6f 73  >lastErrno =  os
1b990 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
1b9a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1b9b0 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  BUSY;.  }..  OST
1b9c0 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
1b9d0 66 69 6c 65 3d 25 70 2c 20 66 75 6e 63 3d 25 73  file=%p, func=%s
1b9e0 2c 20 65 72 72 6e 6f 3d 25 6c 75 2c 20 72 63 3d  , errno=%lu, rc=
1b9f0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1ba00 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68    pFile->hFile.h
1ba10 2c 20 28 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f  , (lockType == _
1ba20 53 48 4d 5f 55 4e 4c 43 4b 29 20 3f 20 22 77 69  SHM_UNLCK) ? "wi
1ba30 6e 55 6e 6c 6f 63 6b 46 69 6c 65 22 20 3a 0a 20  nUnlockFile" :. 
1ba40 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 4c 6f            "winLo
1ba50 63 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e  ckFile", pFile->
1ba60 6c 61 73 74 45 72 72 6e 6f 2c 20 73 71 6c 69 74  lastErrno, sqlit
1ba70 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
1ba80 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1ba90 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
1baa0 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 6d  erences to VFS m
1bab0 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63  ethods */.static
1bac0 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 73 71 6c   int winOpen(sql
1bad0 69 74 65 33 5f 76 66 73 2a 2c 63 6f 6e 73 74 20  ite3_vfs*,const 
1bae0 63 68 61 72 2a 2c 73 71 6c 69 74 65 33 5f 66 69  char*,sqlite3_fi
1baf0 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2a 29 3b 0a 73  le*,int,int*);.s
1bb00 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c  tatic int winDel
1bb10 65 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ete(sqlite3_vfs 
1bb20 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  *,const char*,in
1bb30 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65  t);../*.** Purge
1bb40 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 4c   the winShmNodeL
1bb50 69 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  ist list of all 
1bb60 65 6e 74 72 69 65 73 20 77 69 74 68 20 77 69 6e  entries with win
1bb70 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e  ShmNode.nRef==0.
1bb80 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
1bb90 6f 74 20 61 20 56 46 53 20 73 68 61 72 65 64 2d  ot a VFS shared-
1bba0 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69  memory method; i
1bbb0 74 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66  t is a utility f
1bbc0 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a  unction called.*
1bbd0 2a 20 62 79 20 56 46 53 20 73 68 61 72 65 64 2d  * by VFS shared-
1bbe0 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a  memory methods..
1bbf0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
1bc00 69 6e 53 68 6d 50 75 72 67 65 28 73 71 6c 69 74  inShmPurge(sqlit
1bc10 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
1bc20 74 20 64 65 6c 65 74 65 46 6c 61 67 29 7b 0a 20  t deleteFlag){. 
1bc30 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2a 70 70   winShmNode **pp
1bc40 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  ;.  winShmNode *
1bc50 70 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e  p;.  assert( win
1bc60 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29  ShmMutexHeld() )
1bc70 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ;.  OSTRACE(("SH
1bc80 4d 2d 50 55 52 47 45 20 70 69 64 3d 25 6c 75 2c  M-PURGE pid=%lu,
1bc90 20 64 65 6c 65 74 65 46 6c 61 67 3d 25 64 5c 6e   deleteFlag=%d\n
1bca0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
1bcb0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1bcc0 73 49 64 28 29 2c 20 64 65 6c 65 74 65 46 6c 61  sId(), deleteFla
1bcd0 67 29 29 3b 0a 20 20 70 70 20 3d 20 26 77 69 6e  g));.  pp = &win
1bce0 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 77  ShmNodeList;.  w
1bcf0 68 69 6c 65 28 20 28 70 20 3d 20 2a 70 70 29 21  hile( (p = *pp)!
1bd00 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  =0 ){.    if( p-
1bd10 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
1bd20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
1bd30 66 28 20 70 2d 3e 6d 75 74 65 78 20 29 7b 20 73  f( p->mutex ){ s
1bd40 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
1bd50 65 28 70 2d 3e 6d 75 74 65 78 29 3b 20 7d 0a 20  e(p->mutex); }. 
1bd60 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1bd70 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29  p->nRegion; i++)
1bd80 7b 0a 20 20 20 20 20 20 20 20 42 4f 4f 4c 20 62  {.        BOOL b
1bd90 52 63 20 3d 20 6f 73 55 6e 6d 61 70 56 69 65 77  Rc = osUnmapView
1bda0 4f 66 46 69 6c 65 28 70 2d 3e 61 52 65 67 69 6f  OfFile(p->aRegio
1bdb0 6e 5b 69 5d 2e 70 4d 61 70 29 3b 0a 20 20 20 20  n[i].pMap);.    
1bdc0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48      OSTRACE(("SH
1bdd0 4d 2d 50 55 52 47 45 2d 55 4e 4d 41 50 20 70 69  M-PURGE-UNMAP pi
1bde0 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64  d=%lu, region=%d
1bdf0 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
1be00 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
1be10 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1be20 49 64 28 29 2c 20 69 2c 20 62 52 63 20 3f 20 22  Id(), i, bRc ? "
1be30 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
1be40 3b 0a 20 20 20 20 20 20 20 20 55 4e 55 53 45 44  ;.        UNUSED
1be50 5f 56 41 52 49 41 42 4c 45 5f 56 41 4c 55 45 28  _VARIABLE_VALUE(
1be60 62 52 63 29 3b 0a 20 20 20 20 20 20 20 20 62 52  bRc);.        bR
1be70 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c  c = osCloseHandl
1be80 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e  e(p->aRegion[i].
1be90 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f  hMap);.        O
1bea0 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52  STRACE(("SHM-PUR
1beb0 47 45 2d 43 4c 4f 53 45 20 70 69 64 3d 25 6c 75  GE-CLOSE pid=%lu
1bec0 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d  , region=%d, rc=
1bed0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1bee0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1bef0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1bf00 20 69 2c 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a   i, bRc ? "ok" :
1bf10 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20   "failed"));.   
1bf20 20 20 20 20 20 55 4e 55 53 45 44 5f 56 41 52 49       UNUSED_VARI
1bf30 41 42 4c 45 5f 56 41 4c 55 45 28 62 52 63 29 3b  ABLE_VALUE(bRc);
1bf40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1bf50 66 28 20 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 4e  f( p->hFile.h!=N
1bf60 55 4c 4c 20 26 26 20 70 2d 3e 68 46 69 6c 65 2e  ULL && p->hFile.
1bf70 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  h!=INVALID_HANDL
1bf80 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 20  E_VALUE ){.     
1bf90 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1bfa0 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
1bfb0 20 20 20 20 20 77 69 6e 43 6c 6f 73 65 28 28 73       winClose((s
1bfc0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70  qlite3_file *)&p
1bfd0 2d 3e 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  ->hFile);.      
1bfe0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1bff0 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
1c000 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64 65    }.      if( de
1c010 6c 65 74 65 46 6c 61 67 20 29 7b 0a 20 20 20 20  leteFlag ){.    
1c020 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
1c030 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
1c040 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
1c050 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
1c060 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 44 65 6c  ;.        winDel
1c070 65 74 65 28 70 56 66 73 2c 20 70 2d 3e 7a 46 69  ete(pVfs, p->zFi
1c080 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  lename, 0);.    
1c090 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
1c0a0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
1c0b0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1c0c0 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
1c0d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
1c0e0 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
1c0f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1c100 28 70 2d 3e 61 52 65 67 69 6f 6e 29 3b 0a 20 20  (p->aRegion);.  
1c110 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1c120 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  (p);.    }else{.
1c130 20 20 20 20 20 20 70 70 20 3d 20 26 70 2d 3e 70        pp = &p->p
1c140 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
1c150 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  }../*.** Open th
1c160 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
1c170 61 72 65 61 20 61 73 73 6f 63 69 61 74 65 64 20  area associated 
1c180 77 69 74 68 20 64 61 74 61 62 61 73 65 20 66 69  with database fi
1c190 6c 65 20 70 44 62 46 64 2e 0a 2a 2a 0a 2a 2a 20  le pDbFd..**.** 
1c1a0 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e  When opening a n
1c1b0 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ew shared-memory
1c1c0 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68   file, if no oth
1c1d0 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  er instances of 
1c1e0 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65  that.** file are
1c1f0 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c   currently open,
1c200 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
1c210 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f   or in other pro
1c220 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20  cesses, then.** 
1c230 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65  the file must be
1c240 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65   truncated to ze
1c250 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76  ro length or hav
1c260 65 20 69 74 73 20 68 65 61 64 65 72 20 63 6c 65  e its header cle
1c270 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ared..*/.static 
1c280 69 6e 74 20 77 69 6e 4f 70 65 6e 53 68 61 72 65  int winOpenShare
1c290 64 4d 65 6d 6f 72 79 28 77 69 6e 46 69 6c 65 20  dMemory(winFile 
1c2a0 2a 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63  *pDbFd){.  struc
1c2b0 74 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20  t winShm *p;    
1c2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c2d0 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
1c2e0 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a  to be opened */.
1c2f0 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e    struct winShmN
1c300 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20  ode *pShmNode = 
1c310 30 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  0;   /* The unde
1c320 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66  rlying mmapped f
1c330 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ile */.  int rc;
1c340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c350 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1c360 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
1c370 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64  struct winShmNod
1c380 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  e *pNew;        
1c390 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f     /* Newly allo
1c3a0 63 61 74 65 64 20 77 69 6e 53 68 6d 4e 6f 64 65  cated winShmNode
1c3b0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
1c3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3d0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1c3e0 20 6f 66 20 7a 4e 61 6d 65 20 69 6e 20 62 79 74   of zName in byt
1c3f0 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  es */..  assert(
1c400 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20   pDbFd->pShm==0 
1c410 29 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 70 72 65  );    /* Not pre
1c420 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 2a  viously opened *
1c430 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
1c440 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e   space for the n
1c450 65 77 20 73 71 6c 69 74 65 33 5f 73 68 6d 20 6f  ew sqlite3_shm o
1c460 62 6a 65 63 74 2e 20 20 41 6c 73 6f 20 73 70 65  bject.  Also spe
1c470 63 75 6c 61 74 69 76 65 6c 79 0a 20 20 2a 2a 20  culatively.  ** 
1c480 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
1c490 6f 72 20 61 20 6e 65 77 20 77 69 6e 53 68 6d 4e  or a new winShmN
1c4a0 6f 64 65 20 61 6e 64 20 66 69 6c 65 6e 61 6d 65  ode and filename
1c4b0 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c  ..  */.  p = sql
1c4c0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
1c4d0 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
1c4e0 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
1c4f0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
1c500 4f 4d 45 4d 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20  OMEM;.  nName = 
1c510 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1c520 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
1c530 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4d   pNew = sqlite3M
1c540 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
1c550 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e  f(*pShmNode) + n
1c560 4e 61 6d 65 20 2b 20 31 37 20 29 3b 0a 20 20 69  Name + 17 );.  i
1c570 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
1c580 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1c590 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
1c5a0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1c5b0 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a 46  ;.  }.  pNew->zF
1c5c0 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ilename = (char*
1c5d0 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 73 71 6c  )&pNew[1];.  sql
1c5e0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4e  ite3_snprintf(nN
1c5f0 61 6d 65 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a 46  ame+15, pNew->zF
1c600 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d  ilename, "%s-shm
1c610 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
1c620 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53  ;.  sqlite3FileS
1c630 75 66 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50  uffix3(pDbFd->zP
1c640 61 74 68 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65  ath, pNew->zFile
1c650 6e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  name);..  /* Loo
1c660 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  k to see if ther
1c670 65 20 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67  e is an existing
1c680 20 77 69 6e 53 68 6d 4e 6f 64 65 20 74 68 61 74   winShmNode that
1c690 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 20 20   can be used..  
1c6a0 2a 2a 20 49 66 20 6e 6f 20 6d 61 74 63 68 69 6e  ** If no matchin
1c6b0 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 63 75 72  g winShmNode cur
1c6c0 72 65 6e 74 6c 79 20 65 78 69 73 74 73 2c 20 63  rently exists, c
1c6d0 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e  reate a new one.
1c6e0 0a 20 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e  .  */.  winShmEn
1c6f0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f  terMutex();.  fo
1c700 72 28 70 53 68 6d 4e 6f 64 65 20 3d 20 77 69 6e  r(pShmNode = win
1c710 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 20 70 53 68  ShmNodeList; pSh
1c720 6d 4e 6f 64 65 3b 20 70 53 68 6d 4e 6f 64 65 3d  mNode; pShmNode=
1c730 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 29  pShmNode->pNext)
1c740 7b 0a 20 20 20 20 2f 2a 20 54 42 44 20 6e 65 65  {.    /* TBD nee
1c750 64 20 74 6f 20 63 6f 6d 65 20 75 70 20 77 69 74  d to come up wit
1c760 68 20 62 65 74 74 65 72 20 6d 61 74 63 68 20 68  h better match h
1c770 65 72 65 2e 20 20 50 65 72 68 61 70 73 0a 20 20  ere.  Perhaps.  
1c780 20 20 2a 2a 20 75 73 65 20 46 49 4c 45 5f 49 44    ** use FILE_ID
1c790 5f 42 4f 54 48 5f 44 49 52 5f 49 4e 46 4f 20 53  _BOTH_DIR_INFO S
1c7a0 74 72 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f  tructure..    */
1c7b0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1c7c0 53 74 72 49 43 6d 70 28 70 53 68 6d 4e 6f 64 65  StrICmp(pShmNode
1c7d0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65  ->zFilename, pNe
1c7e0 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30  w->zFilename)==0
1c7f0 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
1c800 69 66 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a  if( pShmNode ){.
1c810 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1c820 28 70 4e 65 77 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pNew);.  }else{
1c830 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  .    pShmNode = 
1c840 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d  pNew;.    pNew =
1c850 20 30 3b 0a 20 20 20 20 28 28 77 69 6e 46 69 6c   0;.    ((winFil
1c860 65 2a 29 28 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  e*)(&pShmNode->h
1c870 46 69 6c 65 29 29 2d 3e 68 20 3d 20 49 4e 56 41  File))->h = INVA
1c880 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
1c890 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ;.    pShmNode->
1c8a0 70 4e 65 78 74 20 3d 20 77 69 6e 53 68 6d 4e 6f  pNext = winShmNo
1c8b0 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 69 6e 53  deList;.    winS
1c8c0 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 70 53 68  hmNodeList = pSh
1c8d0 6d 4e 6f 64 65 3b 0a 0a 20 20 20 20 70 53 68 6d  mNode;..    pShm
1c8e0 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71  Node->mutex = sq
1c8f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
1c900 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  c(SQLITE_MUTEX_F
1c910 41 53 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53  AST);.    if( pS
1c920 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30  hmNode->mutex==0
1c930 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1c940 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
1c950 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  M;.      goto sh
1c960 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
1c970 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f  }..    rc = winO
1c980 70 65 6e 28 70 44 62 46 64 2d 3e 70 56 66 73 2c  pen(pDbFd->pVfs,
1c990 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c9a0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c    pShmNode->zFil
1c9b0 65 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  ename,          
1c9c0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1c9d0 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a  e file (UTF-8) *
1c9e0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
1c9f0 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65     (sqlite3_file
1ca00 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  *)&pShmNode->hFi
1ca10 6c 65 2c 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e  le,  /* File han
1ca20 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 20 20  dle here */.    
1ca30 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
1ca40 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 20 53  ITE_OPEN_WAL | S
1ca50 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
1ca60 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
1ca70 45 4e 5f 43 52 45 41 54 45 2c 0a 20 20 20 20 20  EN_CREATE,.     
1ca80 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a              0);.
1ca90 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
1caa0 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 67  K!=rc ){.      g
1cab0 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
1cac0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1cad0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1cae0 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
1caf0 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64  is holding the d
1cb00 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a  ead-man switch..
1cb10 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74      ** If not, t
1cb20 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65  runcate the file
1cb30 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e   to zero length.
1cb40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1cb50 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
1cb60 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
1cb70 57 52 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44  WRLCK, WIN_SHM_D
1cb80 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f  MS, 1)==SQLITE_O
1cb90 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1cba0 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71 6c  winTruncate((sql
1cbb0 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68  ite3_file *)&pSh
1cbc0 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 30 29  mNode->hFile, 0)
1cbd0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1cbe0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1cbf0 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
1cc00 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1cc10 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 6f 73 47 65  RR_SHMOPEN, osGe
1cc20 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
1cc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc40 20 20 20 20 20 20 20 22 77 69 6e 4f 70 65 6e 53         "winOpenS
1cc50 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  hm", pDbFd->zPat
1cc60 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  h);.      }.    
1cc70 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
1cc80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1cc90 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
1cca0 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d  k(pShmNode, _SHM
1ccb0 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f  _UNLCK, WIN_SHM_
1ccc0 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 72  DMS, 1);.      r
1ccd0 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  c = winShmSystem
1cce0 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
1ccf0 53 48 4d 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f 53  SHM_RDLCK, WIN_S
1cd00 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20  HM_DMS, 1);.    
1cd10 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  }.    if( rc ) g
1cd20 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
1cd30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
1cd40 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74   the new connect
1cd50 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74  ion a child of t
1cd60 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f  he winShmNode */
1cd70 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d  .  p->pShmNode =
1cd80 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 20 64   pShmNode;.#if d
1cd90 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
1cda0 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
1cdb0 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54  SQLITE_HAVE_OS_T
1cdc0 52 41 43 45 29 0a 20 20 70 2d 3e 69 64 20 3d 20  RACE).  p->id = 
1cdd0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68  pShmNode->nextSh
1cde0 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  mId++;.#endif.  
1cdf0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b  pShmNode->nRef++
1ce00 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20  ;.  pDbFd->pShm 
1ce10 3d 20 70 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61  = p;.  winShmLea
1ce20 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a  veMutex();..  /*
1ce30 20 54 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   The reference c
1ce40 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65  ount on pShmNode
1ce50 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1ce60 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e  n incremented un
1ce70 64 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76  der.  ** the cov
1ce80 65 72 20 6f 66 20 74 68 65 20 77 69 6e 53 68 6d  er of the winShm
1ce90 45 6e 74 65 72 4d 75 74 65 78 28 29 20 6d 75 74  EnterMutex() mut
1cea0 65 78 20 61 6e 64 20 74 68 65 20 70 6f 69 6e 74  ex and the point
1ceb0 65 72 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a  er from the.  **
1cec0 20 6e 65 77 20 28 73 74 72 75 63 74 20 77 69 6e   new (struct win
1ced0 53 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20 74  Shm) object to t
1cee0 68 65 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20  he pShmNode has 
1cef0 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68  been set. All th
1cf00 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20  at is.  ** left 
1cf10 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b  to do is to link
1cf20 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   the new object 
1cf30 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  into the linked 
1cf40 6c 69 73 74 20 73 74 61 72 74 69 6e 67 0a 20 20  list starting.  
1cf50 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e  ** at pShmNode->
1cf60 70 46 69 72 73 74 2e 20 54 68 69 73 20 6d 75 73  pFirst. This mus
1cf70 74 20 62 65 20 64 6f 6e 65 20 77 68 69 6c 65 20  t be done while 
1cf80 68 6f 6c 64 69 6e 67 20 74 68 65 20 70 53 68 6d  holding the pShm
1cf90 4e 6f 64 65 2d 3e 6d 75 74 65 78 0a 20 20 2a 2a  Node->mutex.  **
1cfa0 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73   mutex..  */.  s
1cfb0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1cfc0 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
1cfd0 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  ex);.  p->pNext 
1cfe0 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  = pShmNode->pFir
1cff0 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  st;.  pShmNode->
1d000 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 73 71  pFirst = p;.  sq
1d010 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1d020 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
1d030 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
1d040 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75  ITE_OK;..  /* Ju
1d050 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65  mp here on any e
1d060 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e  rror */.shm_open
1d070 5f 65 72 72 3a 0a 20 20 77 69 6e 53 68 6d 53 79  _err:.  winShmSy
1d080 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
1d090 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57  e, _SHM_UNLCK, W
1d0a0 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a  IN_SHM_DMS, 1);.
1d0b0 20 20 77 69 6e 53 68 6d 50 75 72 67 65 28 70 44    winShmPurge(pD
1d0c0 62 46 64 2d 3e 70 56 66 73 2c 20 30 29 3b 20 20  bFd->pVfs, 0);  
1d0d0 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
1d0e0 20 66 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20   frees pShmNode 
1d0f0 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  if required */. 
1d100 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
1d110 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
1d120 28 70 4e 65 77 29 3b 0a 20 20 77 69 6e 53 68 6d  (pNew);.  winShm
1d130 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
1d140 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1d150 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e  .** Close a conn
1d160 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64  ection to shared
1d170 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65  -memory.  Delete
1d180 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a   the underlying.
1d190 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64 65  ** storage if de
1d1a0 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72 75 65  leteFlag is true
1d1b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d1c0 77 69 6e 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73  winShmUnmap(.  s
1d1d0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
1d1e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
1d1f0 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 73 68  abase holding sh
1d200 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  ared memory */. 
1d210 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20   int deleteFlag 
1d220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1d230 65 6c 65 74 65 20 61 66 74 65 72 20 63 6c 6f 73  elete after clos
1d240 69 6e 67 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  ing if true */.)
1d250 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62  {.  winFile *pDb
1d260 46 64 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74  Fd;       /* Dat
1d270 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 73 68  abase holding sh
1d280 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 20  ared-memory */. 
1d290 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20   winShm *p;     
1d2a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
1d2b0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63  nnection to be c
1d2c0 6c 6f 73 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68  losed */.  winSh
1d2d0 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
1d2e0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
1d2f0 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ng shared-memory
1d300 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 53 68   file */.  winSh
1d310 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20  m **pp;         
1d320 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
1d330 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e  over sibling con
1d340 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 70  nections */..  p
1d350 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a  DbFd = (winFile*
1d360 29 66 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64  )fd;.  p = pDbFd
1d370 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d  ->pShm;.  if( p=
1d380 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
1d390 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64  TE_OK;.  pShmNod
1d3a0 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
1d3b0 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f  ..  /* Remove co
1d3c0 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20  nnection p from 
1d3d0 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65  the set of conne
1d3e0 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65  ctions associate
1d3f0 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d  d.  ** with pShm
1d400 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Node */.  sqlite
1d410 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
1d420 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
1d430 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f    for(pp=&pShmNo
1d440 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70  de->pFirst; (*pp
1d450 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70  )!=p; pp = &(*pp
1d460 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70  )->pNext){}.  *p
1d470 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20  p = p->pNext;.. 
1d480 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e   /* Free the con
1d490 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73  nection p */.  s
1d4a0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
1d4b0 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20    pDbFd->pShm = 
1d4c0 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  0;.  sqlite3_mut
1d4d0 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
1d4e0 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  e->mutex);..  /*
1d4f0 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   If pShmNode->nR
1d500 65 66 20 68 61 73 20 72 65 61 63 68 65 64 20 30  ef has reached 0
1d510 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65  , then close the
1d520 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a   underlying.  **
1d530 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
1d540 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 77 69  ile, too */.  wi
1d550 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29  nShmEnterMutex()
1d560 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
1d570 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  Node->nRef>0 );.
1d580 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66    pShmNode->nRef
1d590 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  --;.  if( pShmNo
1d5a0 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  de->nRef==0 ){. 
1d5b0 20 20 20 77 69 6e 53 68 6d 50 75 72 67 65 28 70     winShmPurge(p
1d5c0 44 62 46 64 2d 3e 70 56 66 73 2c 20 64 65 6c 65  DbFd->pVfs, dele
1d5d0 74 65 46 6c 61 67 29 3b 0a 20 20 7d 0a 20 20 77  teFlag);.  }.  w
1d5e0 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
1d5f0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  );..  return SQL
1d600 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1d610 20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b   Change the lock
1d620 20 73 74 61 74 65 20 66 6f 72 20 61 20 73 68 61   state for a sha
1d630 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red-memory segme
1d640 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
1d650 74 20 77 69 6e 53 68 6d 4c 6f 63 6b 28 0a 20 20  t winShmLock(.  
1d660 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
1d670 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ,          /* Da
1d680 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64  tabase file hold
1d690 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
1d6a0 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f  emory */.  int o
1d6b0 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  fst,            
1d6c0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c        /* First l
1d6d0 6f 63 6b 20 74 6f 20 61 63 71 75 69 72 65 20 6f  ock to acquire o
1d6e0 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69  r release */.  i
1d6f0 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20  nt n,           
1d700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1d710 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20  ber of locks to 
1d720 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61  acquire or relea
1d730 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  se */.  int flag
1d740 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
1d750 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
1d760 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a   with the lock *
1d770 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  /.){.  winFile *
1d780 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65  pDbFd = (winFile
1d790 2a 29 66 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  *)fd;        /* 
1d7a0 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69  Connection holdi
1d7b0 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  ng shared memory
1d7c0 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20   */.  winShm *p 
1d7d0 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20  = pDbFd->pShm;  
1d7e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1d7f0 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
1d800 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f   being locked */
1d810 0a 20 20 77 69 6e 53 68 6d 20 2a 70 58 3b 20 20  .  winShm *pX;  
1d820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d830 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
1d840 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c  looping over all
1d850 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 77   siblings */.  w
1d860 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
1d870 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
1d880 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  e;.  int rc = SQ
1d890 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
1d8a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1d8b0 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75  sult code */.  u
1d8c0 31 36 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20  16 mask;        
1d8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8e0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1d8f0 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72  locks to take or
1d900 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61   release */..  a
1d910 73 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26  ssert( ofst>=0 &
1d920 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45  & ofst+n<=SQLITE
1d930 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20  _SHM_NLOCK );.  
1d940 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a  assert( n>=1 );.
1d950 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
1d960 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43  =(SQLITE_SHM_LOC
1d970 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53  K | SQLITE_SHM_S
1d980 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c  HARED).       ||
1d990 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
1d9a0 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  SHM_LOCK | SQLIT
1d9b0 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
1d9c0 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
1d9d0 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  ==(SQLITE_SHM_UN
1d9e0 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
1d9f0 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  M_SHARED).      
1da00 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
1da10 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20  TE_SHM_UNLOCK | 
1da20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
1da30 53 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72  SIVE) );.  asser
1da40 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67  t( n==1 || (flag
1da50 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  s & SQLITE_SHM_E
1da60 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a  XCLUSIVE)!=0 );.
1da70 0a 20 20 6d 61 73 6b 20 3d 20 28 75 31 36 29 28  .  mask = (u16)(
1da80 28 31 55 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d  (1U<<(ofst+n)) -
1da90 20 28 31 55 3c 3c 6f 66 73 74 29 29 3b 0a 20 20   (1U<<ofst));.  
1daa0 61 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d  assert( n>1 || m
1dab0 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29  ask==(1<<ofst) )
1dac0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
1dad0 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
1dae0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
1daf0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
1db00 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  HM_UNLOCK ){.   
1db10 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30   u16 allMask = 0
1db20 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63  ; /* Mask of loc
1db30 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69  ks held by sibli
1db40 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ngs */..    /* S
1db50 65 65 20 69 66 20 61 6e 79 20 73 69 62 6c 69 6e  ee if any siblin
1db60 67 73 20 68 6f 6c 64 20 74 68 69 73 20 73 61 6d  gs hold this sam
1db70 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f  e lock */.    fo
1db80 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  r(pX=pShmNode->p
1db90 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
1dba0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
1dbb0 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74  if( pX==p ) cont
1dbc0 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65  inue;.      asse
1dbd0 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  rt( (pX->exclMas
1dbe0 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b  k & (p->exclMask
1dbf0 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29  |p->sharedMask))
1dc00 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c  ==0 );.      all
1dc10 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72  Mask |= pX->shar
1dc20 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20  edMask;.    }.. 
1dc30 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65     /* Unlock the
1dc40 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f   system-level lo
1dc50 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  cks */.    if( (
1dc60 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d  mask & allMask)=
1dc70 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
1dc80 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
1dc90 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d  k(pShmNode, _SHM
1dca0 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e  _UNLCK, ofst+WIN
1dcb0 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20  _SHM_BASE, n);. 
1dcc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1dcd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1dce0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e      }..    /* Un
1dcf0 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63  do the local loc
1dd00 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ks */.    if( rc
1dd10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1dd20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b       p->exclMask
1dd30 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
1dd40 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26   p->sharedMask &
1dd50 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20  = ~mask;.    }. 
1dd60 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
1dd70 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48   & SQLITE_SHM_SH
1dd80 41 52 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20  ARED ){.    u16 
1dd90 61 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20  allShared = 0;  
1dda0 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b  /* Union of lock
1ddb0 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63  s held by connec
1ddc0 74 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e  tions other than
1ddd0 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20   "p" */..    /* 
1dde0 46 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73  Find out which s
1ddf0 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20  hared locks are 
1de00 61 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79 20  already held by 
1de10 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69  sibling connecti
1de20 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61  ons..    ** If a
1de30 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61  ny sibling alrea
1de40 64 79 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c  dy holds an excl
1de50 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61  usive lock, go a
1de60 68 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a  head and return.
1de70 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55      ** SQLITE_BU
1de80 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  SY..    */.    f
1de90 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e  or(pX=pShmNode->
1dea0 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
1deb0 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  X->pNext){.     
1dec0 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61   if( (pX->exclMa
1ded0 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b  sk & mask)!=0 ){
1dee0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1def0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
1df00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1df10 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65  }.      allShare
1df20 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d  d |= pX->sharedM
1df30 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ask;.    }..    
1df40 2f 2a 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f  /* Get shared lo
1df50 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65  cks at the syste
1df60 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65  m level, if nece
1df70 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28  ssary */.    if(
1df80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1df90 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c  {.      if( (all
1dfa0 53 68 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d  Shared & mask)==
1dfb0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
1dfc0 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f  = winShmSystemLo
1dfd0 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48  ck(pShmNode, _SH
1dfe0 4d 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 57 49  M_RDLCK, ofst+WI
1dff0 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a  N_SHM_BASE, n);.
1e000 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e010 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1e020 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
1e030 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74   }..    /* Get t
1e040 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20  he local shared 
1e050 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
1e060 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e070 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65  {.      p->share
1e080 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  dMask |= mask;. 
1e090 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1e0a0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e    /* Make sure n
1e0b0 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  o sibling connec
1e0c0 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73  tions hold locks
1e0d0 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b   that will block
1e0e0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63   this.    ** loc
1e0f0 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72  k.  If any do, r
1e100 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
1e110 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  Y right away..  
1e120 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d    */.    for(pX=
1e130 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
1e140 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
1e150 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  xt){.      if( (
1e160 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d  pX->exclMask & m
1e170 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e  ask)!=0 || (pX->
1e180 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73  sharedMask & mas
1e190 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
1e1a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
1e1b0 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  Y;.        break
1e1c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e1d0 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20  .    /* Get the 
1e1e0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
1e1f0 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65  at the system le
1e200 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75  vel.  Then if su
1e210 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20  ccessful.    ** 
1e220 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f  also mark the lo
1e230 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  cal connection a
1e240 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a  s being locked..
1e250 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
1e260 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e270 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68        rc = winSh
1e280 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
1e290 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b  Node, _SHM_WRLCK
1e2a0 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42  , ofst+WIN_SHM_B
1e2b0 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69  ASE, n);.      i
1e2c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1e2d0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1e2e0 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61  rt( (p->sharedMa
1e2f0 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b  sk & mask)==0 );
1e300 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c  .        p->excl
1e310 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
1e320 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1e330 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1e340 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
1e350 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43  mutex);.  OSTRAC
1e360 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 70 69 64  E(("SHM-LOCK pid
1e370 3d 25 6c 75 2c 20 69 64 3d 25 64 2c 20 73 68 61  =%lu, id=%d, sha
1e380 72 65 64 4d 61 73 6b 3d 25 30 33 78 2c 20 65 78  redMask=%03x, ex
1e390 63 6c 4d 61 73 6b 3d 25 30 33 78 2c 20 72 63 3d  clMask=%03x, rc=
1e3a0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1e3b0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1e3c0 6f 63 65 73 73 49 64 28 29 2c 20 70 2d 3e 69 64  ocessId(), p->id
1e3d0 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c  , p->sharedMask,
1e3e0 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 2c 0a 20 20   p->exclMask,.  
1e3f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1e400 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
1e410 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1e420 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61  *.** Implement a
1e430 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20   memory barrier 
1e440 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20  or memory fence 
1e450 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  on shared memory
1e460 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64  ..**.** All load
1e470 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67  s and stores beg
1e480 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62 61  un before the ba
1e490 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c  rrier must compl
1e4a0 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e  ete before.** an
1e4b0 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20  y load or store 
1e4c0 62 65 67 75 6e 20 61 66 74 65 72 20 74 68 65 20  begun after the 
1e4d0 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74  barrier..*/.stat
1e4e0 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 42 61  ic void winShmBa
1e4f0 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33  rrier(.  sqlite3
1e500 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20  _file *fd       
1e510 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
1e520 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65  olding the share
1e530 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20  d memory */.){. 
1e540 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1e550 52 28 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  R(fd);.  sqlite3
1e560 4d 65 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b  MemoryBarrier();
1e570 20 20 20 2f 2a 20 63 6f 6d 70 69 6c 65 72 2d 64     /* compiler-d
1e580 65 66 69 6e 65 64 20 6d 65 6d 6f 72 79 20 62 61  efined memory ba
1e590 72 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e 53 68  rrier */.  winSh
1e5a0 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 20  mEnterMutex();  
1e5b0 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 6d 75 74       /* Also mut
1e5c0 65 78 2c 20 66 6f 72 20 72 65 64 75 6e 64 61 6e  ex, for redundan
1e5d0 63 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 65  cy */.  winShmLe
1e5e0 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f  aveMutex();.}../
1e5f0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1e600 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
1e610 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72  obtain a pointer
1e620 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69   to region iRegi
1e630 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 73 68 61  on of the.** sha
1e640 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red-memory assoc
1e650 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64  iated with the d
1e660 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e  atabase file fd.
1e670 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   Shared-memory r
1e680 65 67 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 6e 75  egions.** are nu
1e690 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67 20  mbered starting 
1e6a0 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20  from zero. Each 
1e6b0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
1e6c0 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e  gion is szRegion
1e6d0 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a  .** bytes in siz
1e6e0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  e..**.** If an e
1e6f0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
1e700 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1e710 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69  turned and *pp i
1e720 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  s set to NULL..*
1e730 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1e740 69 66 20 74 68 65 20 69 73 57 72 69 74 65 20 70  if the isWrite p
1e750 61 72 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e  arameter is 0 an
1e760 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  d the requested 
1e770 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a  shared-memory.**
1e780 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20   region has not 
1e790 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28  been allocated (
1e7a0 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69  by any client, i
1e7b0 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e  ncluding one run
1e7c0 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70  ning in a.** sep
1e7d0 61 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20  arate process), 
1e7e0 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20  then *pp is set 
1e7f0 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49  to NULL and SQLI
1e800 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
1e810 49 66 0a 2a 2a 20 69 73 57 72 69 74 65 20 69 73  If.** isWrite is
1e820 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68   non-zero and th
1e830 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72  e requested shar
1e840 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
1e850 20 68 61 73 20 6e 6f 74 20 79 65 74 0a 2a 2a 20   has not yet.** 
1e860 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
1e870 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  it is allocated 
1e880 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
1e890 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
1e8a0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
1e8b0 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
1e8c0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f  been allocated o
1e8d0 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  r is allocated b
1e8e0 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 61  y.** this call a
1e8f0 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
1e900 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d 61  e, then it is ma
1e910 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70  pped into this p
1e920 72 6f 63 65 73 73 65 73 0a 2a 2a 20 61 64 64 72  rocesses.** addr
1e930 65 73 73 20 73 70 61 63 65 20 28 69 66 20 69 74  ess space (if it
1e940 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 29   is not already)
1e950 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  , *pp is set to 
1e960 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61 70  point to the map
1e970 70 65 64 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e  ped.** memory an
1e980 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
1e990 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1e9a0 69 6e 74 20 77 69 6e 53 68 6d 4d 61 70 28 0a 20  int winShmMap(. 
1e9b0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
1e9c0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
1e9d0 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20   /* Handle open 
1e9e0 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  on database file
1e9f0 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 6f   */.  int iRegio
1ea00 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
1ea10 20 20 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20        /* Region 
1ea20 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20  to retrieve */. 
1ea30 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20   int szRegion,  
1ea40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea50 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 67 69   /* Size of regi
1ea60 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 57  ons */.  int isW
1ea70 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  rite,           
1ea80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1ea90 20 74 6f 20 65 78 74 65 6e 64 20 66 69 6c 65 20   to extend file 
1eaa0 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
1eab0 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20    void volatile 
1eac0 2a 2a 70 70 20 20 20 20 20 20 20 20 20 20 20 20  **pp            
1ead0 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64    /* OUT: Mapped
1eae0 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20   memory */.){.  
1eaf0 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d  winFile *pDbFd =
1eb00 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20   (winFile*)fd;. 
1eb10 20 77 69 6e 53 68 6d 20 2a 70 53 68 6d 20 3d 20   winShm *pShm = 
1eb20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 77  pDbFd->pShm;.  w
1eb30 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
1eb40 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ode;.  int rc = 
1eb50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
1eb60 28 20 21 70 53 68 6d 20 29 7b 0a 20 20 20 20 72  ( !pShm ){.    r
1eb70 63 20 3d 20 77 69 6e 4f 70 65 6e 53 68 61 72 65  c = winOpenShare
1eb80 64 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a  dMemory(pDbFd);.
1eb90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1eba0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
1ebb0 63 3b 0a 20 20 20 20 70 53 68 6d 20 3d 20 70 44  c;.    pShm = pD
1ebc0 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 7d 0a 20  bFd->pShm;.  }. 
1ebd0 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d   pShmNode = pShm
1ebe0 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73  ->pShmNode;..  s
1ebf0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1ec00 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
1ec10 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ex);.  assert( s
1ec20 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64  zRegion==pShmNod
1ec30 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70  e->szRegion || p
1ec40 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1ec50 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  ==0 );..  if( pS
1ec60 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c  hmNode->nRegion<
1ec70 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  =iRegion ){.    
1ec80 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e  struct ShmRegion
1ec90 20 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20   *apNew;        
1eca0 20 20 20 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f     /* New aRegio
1ecb0 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  n[] array */.   
1ecc0 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52   int nByte = (iR
1ecd0 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f  egion+1)*szRegio
1ece0 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72  n;  /* Minimum r
1ecf0 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a  equired file siz
1ed00 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  e */.    sqlite3
1ed10 5f 69 6e 74 36 34 20 73 7a 3b 20 20 20 20 20 20  _int64 sz;      
1ed20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1ed30 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 77  urrent size of w
1ed40 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f  al-index file */
1ed50 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ..    pShmNode->
1ed60 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67  szRegion = szReg
1ed70 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ion;..    /* The
1ed80 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f   requested regio
1ed90 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20  n is not mapped 
1eda0 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
1edb0 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63  ses address spac
1edc0 65 2e 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20  e..    ** Check 
1edd0 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73  to see if it has
1ede0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
1edf0 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c  (i.e. if the wal
1ee00 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20  -index file is. 
1ee10 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75     ** large enou
1ee20 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  gh to contain th
1ee30 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69  e requested regi
1ee40 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  on)..    */.    
1ee50 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65  rc = winFileSize
1ee60 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
1ee70 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  )&pShmNode->hFil
1ee80 65 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 66 28  e, &sz);.    if(
1ee90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1eea0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  {.      rc = win
1eeb0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1eec0 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f  IOERR_SHMSIZE, o
1eed0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
1eee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1eef0 20 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d          "winShmM
1ef00 61 70 31 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  ap1", pDbFd->zPa
1ef10 74 68 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  th);.      goto 
1ef20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
1ef30 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 7a 3c 6e   }..    if( sz<n
1ef40 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Byte ){.      /*
1ef50 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 6d   The requested m
1ef60 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65  emory region doe
1ef70 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20  s not exist. If 
1ef80 69 73 57 72 69 74 65 20 69 73 20 73 65 74 20 74  isWrite is set t
1ef90 6f 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 2c  o.      ** zero,
1efa0 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70   exit early. *pp
1efb0 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20   will be set to 
1efc0 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f  NULL and SQLITE_
1efd0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20  OK returned..   
1efe0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41     **.      ** A
1eff0 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66  lternatively, if
1f000 20 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d   isWrite is non-
1f010 7a 65 72 6f 2c 20 75 73 65 20 66 74 72 75 6e 63  zero, use ftrunc
1f020 61 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74  ate() to allocat
1f030 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72  e.      ** the r
1f040 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20  equested memory 
1f050 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  region..      */
1f060 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 57 72  .      if( !isWr
1f070 69 74 65 20 29 20 67 6f 74 6f 20 73 68 6d 70 61  ite ) goto shmpa
1f080 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 72 63  ge_out;.      rc
1f090 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28   = winTruncate((
1f0a0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26  sqlite3_file *)&
1f0b0 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c  pShmNode->hFile,
1f0c0 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69   nByte);.      i
1f0d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f0e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1f0f0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
1f100 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a  ITE_IOERR_SHMSIZ
1f110 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  E, osGetLastErro
1f120 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
1f130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
1f140 69 6e 53 68 6d 4d 61 70 32 22 2c 20 70 44 62 46  inShmMap2", pDbF
1f150 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
1f160 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
1f170 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
1f180 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74   }..    /* Map t
1f190 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
1f1a0 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20  ory region into 
1f1b0 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61  this processes a
1f1c0 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f  ddress space. */
1f1d0 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 73 74  .    apNew = (st
1f1e0 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a  ruct ShmRegion *
1f1f0 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
1f200 36 34 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d  64(.        pShm
1f210 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 2c 20 28  Node->aRegion, (
1f220 69 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f  iRegion+1)*sizeo
1f230 66 28 61 70 4e 65 77 5b 30 5d 29 0a 20 20 20 20  f(apNew[0]).    
1f240 29 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65  );.    if( !apNe
1f250 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  w ){.      rc = 
1f260 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
1f270 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  EM;.      goto s
1f280 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
1f290 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  }.    pShmNode->
1f2a0 61 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b  aRegion = apNew;
1f2b0 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53 68  ..    while( pSh
1f2c0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d  mNode->nRegion<=
1f2d0 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20  iRegion ){.     
1f2e0 20 48 41 4e 44 4c 45 20 68 4d 61 70 20 3d 20 4e   HANDLE hMap = N
1f2f0 55 4c 4c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ULL;         /* 
1f300 66 69 6c 65 2d 6d 61 70 70 69 6e 67 20 68 61 6e  file-mapping han
1f310 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69  dle */.      voi
1f320 64 20 2a 70 4d 61 70 20 3d 20 30 3b 20 20 20 20  d *pMap = 0;    
1f330 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70           /* Mapp
1f340 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
1f350 20 2a 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f   */..#if SQLITE_
1f360 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 68  OS_WINRT.      h
1f370 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69  Map = osCreateFi
1f380 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70  leMappingFromApp
1f390 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  (pShmNode->hFile
1f3a0 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55  .h,.          NU
1f3b0 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49  LL, PAGE_READWRI
1f3c0 54 45 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a  TE, nByte, NULL.
1f3d0 20 20 20 20 20 20 29 3b 0a 23 65 6c 69 66 20 64        );.#elif d
1f3e0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
1f3f0 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
1f400 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65      hMap = osCre
1f410 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28  ateFileMappingW(
1f420 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e  pShmNode->hFile.
1f430 68 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c  h,.          NUL
1f440 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49 54  L, PAGE_READWRIT
1f450 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c  E, 0, nByte, NUL
1f460 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 69 66  L.      );.#elif
1f470 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1f480 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
1f490 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43        hMap = osC
1f4a0 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
1f4b0 41 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  A(pShmNode->hFil
1f4c0 65 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 4e  e.h,.          N
1f4d0 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52  ULL, PAGE_READWR
1f4e0 49 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e  ITE, 0, nByte, N
1f4f0 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6e  ULL.      );.#en
1f500 64 69 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43  dif.      OSTRAC
1f510 45 28 28 22 53 48 4d 2d 4d 41 50 2d 43 52 45 41  E(("SHM-MAP-CREA
1f520 54 45 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69  TE pid=%lu, regi
1f530 6f 6e 3d 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20  on=%d, size=%d, 
1f540 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
1f550 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1f560 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1f570 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  , pShmNode->nReg
1f580 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20  ion, nByte,.    
1f590 20 20 20 20 20 20 20 20 20 20 20 68 4d 61 70 20             hMap 
1f5a0 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
1f5b0 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68  "));.      if( h
1f5c0 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Map ){.        i
1f5d0 6e 74 20 69 4f 66 66 73 65 74 20 3d 20 70 53 68  nt iOffset = pSh
1f5e0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73  mNode->nRegion*s
1f5f0 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 20 20 20  zRegion;.       
1f600 20 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66   int iOffsetShif
1f610 74 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69  t = iOffset % wi
1f620 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63  nSysInfo.dwAlloc
1f630 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79  ationGranularity
1f640 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
1f650 57 49 4e 52 54 0a 20 20 20 20 20 20 20 20 70 4d  WINRT.        pM
1f660 61 70 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66  ap = osMapViewOf
1f670 46 69 6c 65 46 72 6f 6d 41 70 70 28 68 4d 61 70  FileFromApp(hMap
1f680 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45  , FILE_MAP_WRITE
1f690 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44   | FILE_MAP_READ
1f6a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4f  ,.            iO
1f6b0 66 66 73 65 74 20 2d 20 69 4f 66 66 73 65 74 53  ffset - iOffsetS
1f6c0 68 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b  hift, szRegion +
1f6d0 20 69 4f 66 66 73 65 74 53 68 69 66 74 0a 20 20   iOffsetShift.  
1f6e0 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20        );.#else. 
1f6f0 20 20 20 20 20 20 20 70 4d 61 70 20 3d 20 6f 73         pMap = os
1f700 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 68 4d  MapViewOfFile(hM
1f710 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49  ap, FILE_MAP_WRI
1f720 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45  TE | FILE_MAP_RE
1f730 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  AD,.            
1f740 30 2c 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66  0, iOffset - iOf
1f750 66 73 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67  fsetShift, szReg
1f760 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69  ion + iOffsetShi
1f770 66 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 65  ft.        );.#e
1f780 6e 64 69 66 0a 20 20 20 20 20 20 20 20 4f 53 54  ndif.        OST
1f790 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d 4d  RACE(("SHM-MAP-M
1f7a0 41 50 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69  AP pid=%lu, regi
1f7b0 6f 6e 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25 64  on=%d, offset=%d
1f7c0 2c 20 73 69 7a 65 3d 25 64 2c 20 72 63 3d 25 73  , size=%d, rc=%s
1f7d0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1f7e0 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1f7f0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
1f800 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1f810 2c 20 69 4f 66 66 73 65 74 2c 0a 20 20 20 20 20  , iOffset,.     
1f820 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 52 65              szRe
1f830 67 69 6f 6e 2c 20 70 4d 61 70 20 3f 20 22 6f 6b  gion, pMap ? "ok
1f840 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
1f850 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1f860 28 20 21 70 4d 61 70 20 29 7b 0a 20 20 20 20 20  ( !pMap ){.     
1f870 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73     pShmNode->las
1f880 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
1f890 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
1f8a0 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
1f8b0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1f8c0 5f 53 48 4d 4d 41 50 2c 20 70 53 68 6d 4e 6f 64  _SHMMAP, pShmNod
1f8d0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
1f8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8f0 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61         "winShmMa
1f900 70 33 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  p3", pDbFd->zPat
1f910 68 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  h);.        if( 
1f920 68 4d 61 70 20 29 20 6f 73 43 6c 6f 73 65 48 61  hMap ) osCloseHa
1f930 6e 64 6c 65 28 68 4d 61 70 29 3b 0a 20 20 20 20  ndle(hMap);.    
1f940 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
1f950 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _out;.      }.. 
1f960 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61       pShmNode->a
1f970 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d  Region[pShmNode-
1f980 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 20 3d  >nRegion].pMap =
1f990 20 70 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 68   pMap;.      pSh
1f9a0 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70  mNode->aRegion[p
1f9b0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1f9c0 5d 2e 68 4d 61 70 20 3d 20 68 4d 61 70 3b 0a 20  ].hMap = hMap;. 
1f9d0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e       pShmNode->n
1f9e0 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a  Region++;.    }.
1f9f0 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74    }..shmpage_out
1fa00 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  :.  if( pShmNode
1fa10 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f  ->nRegion>iRegio
1fa20 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66  n ){.    int iOf
1fa30 66 73 65 74 20 3d 20 69 52 65 67 69 6f 6e 2a 73  fset = iRegion*s
1fa40 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 69 6e 74  zRegion;.    int
1fa50 20 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20   iOffsetShift = 
1fa60 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79 73  iOffset % winSys
1fa70 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f  Info.dwAllocatio
1fa80 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 20 20  nGranularity;.  
1fa90 20 20 63 68 61 72 20 2a 70 20 3d 20 28 63 68 61    char *p = (cha
1faa0 72 20 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e 61 52  r *)pShmNode->aR
1fab0 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 2e 70  egion[iRegion].p
1fac0 4d 61 70 3b 0a 20 20 20 20 2a 70 70 20 3d 20 28  Map;.    *pp = (
1fad0 76 6f 69 64 20 2a 29 26 70 5b 69 4f 66 66 73 65  void *)&p[iOffse
1fae0 74 53 68 69 66 74 5d 3b 0a 20 20 7d 65 6c 73 65  tShift];.  }else
1faf0 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20  {.    *pp = 0;. 
1fb00 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1fb10 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
1fb20 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  e->mutex);.  ret
1fb30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65  urn rc;.}..#else
1fb40 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d  .# define winShm
1fb50 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65 66 69  Map     0.# defi
1fb60 6e 65 20 77 69 6e 53 68 6d 4c 6f 63 6b 20 20 20  ne winShmLock   
1fb70 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53   0.# define winS
1fb80 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64 65  hmBarrier 0.# de
1fb90 66 69 6e 65 20 77 69 6e 53 68 6d 55 6e 6d 61 70  fine winShmUnmap
1fba0 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23     0.#endif /* #
1fbb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1fbc0 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  IT_WAL */../*.**
1fbd0 20 43 6c 65 61 6e 73 20 75 70 20 74 68 65 20 6d   Cleans up the m
1fbe0 61 70 70 65 64 20 72 65 67 69 6f 6e 20 6f 66 20  apped region of 
1fbf0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
1fc00 6c 65 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23  le, if any..*/.#
1fc10 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
1fc20 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63  AP_SIZE>0.static
1fc30 20 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66 69 6c   int winUnmapfil
1fc40 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  e(winFile *pFile
1fc50 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ){.  assert( pFi
1fc60 6c 65 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41  le!=0 );.  OSTRA
1fc70 43 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20  CE(("UNMAP-FILE 
1fc80 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
1fc90 70 2c 20 68 4d 61 70 3d 25 70 2c 20 70 4d 61 70  p, hMap=%p, pMap
1fca0 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20  Region=%p, ".   
1fcb0 20 20 20 20 20 20 20 20 22 6d 6d 61 70 53 69 7a          "mmapSiz
1fcc0 65 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a 65  e=%lld, mmapSize
1fcd0 41 63 74 75 61 6c 3d 25 6c 6c 64 2c 20 6d 6d 61  Actual=%lld, mma
1fce0 70 53 69 7a 65 4d 61 78 3d 25 6c 6c 64 5c 6e 22  pSizeMax=%lld\n"
1fcf0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
1fd00 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1fd10 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69  Id(), pFile, pFi
1fd20 6c 65 2d 3e 68 4d 61 70 2c 20 70 46 69 6c 65 2d  le->hMap, pFile-
1fd30 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 0a 20 20 20  >pMapRegion,.   
1fd40 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d          pFile->m
1fd50 6d 61 70 53 69 7a 65 2c 20 70 46 69 6c 65 2d 3e  mapSize, pFile->
1fd60 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 2c 20  mmapSizeActual, 
1fd70 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
1fd80 61 78 29 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  ax));.  if( pFil
1fd90 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b  e->pMapRegion ){
1fda0 0a 20 20 20 20 69 66 28 20 21 6f 73 55 6e 6d 61  .    if( !osUnma
1fdb0 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c  pViewOfFile(pFil
1fdc0 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 20 29  e->pMapRegion) )
1fdd0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
1fde0 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
1fdf0 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
1fe00 20 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d     OSTRACE(("UNM
1fe10 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c  AP-FILE pid=%lu,
1fe20 20 70 46 69 6c 65 3d 25 70 2c 20 70 4d 61 70 52   pFile=%p, pMapR
1fe30 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20  egion=%p, ".    
1fe40 20 20 20 20 20 20 20 20 20 20 20 22 72 63 3d 53             "rc=S
1fe50 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50  QLITE_IOERR_MMAP
1fe60 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72 72 65 6e  \n", osGetCurren
1fe70 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
1fe80 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ile,.           
1fe90 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52      pFile->pMapR
1fea0 65 67 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20 72  egion));.      r
1feb0 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
1fec0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d  r(SQLITE_IOERR_M
1fed0 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  MAP, pFile->last
1fee0 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
1fef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff00 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65 31 22 2c  "winUnmapfile1",
1ff10 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
1ff20 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d      }.    pFile-
1ff30 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b  >pMapRegion = 0;
1ff40 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  .    pFile->mmap
1ff50 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 46  Size = 0;.    pF
1ff60 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  ile->mmapSizeAct
1ff70 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ual = 0;.  }.  i
1ff80 66 28 20 70 46 69 6c 65 2d 3e 68 4d 61 70 21 3d  f( pFile->hMap!=
1ff90 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20  NULL ){.    if( 
1ffa0 21 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70  !osCloseHandle(p
1ffb0 46 69 6c 65 2d 3e 68 4d 61 70 29 20 29 7b 0a 20  File->hMap) ){. 
1ffc0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
1ffd0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
1ffe0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
1fff0 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d  OSTRACE(("UNMAP-
20000 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  FILE pid=%lu, pF
20010 69 6c 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c  ile=%p, hMap=%p,
20020 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
20030 5f 4d 4d 41 50 5c 6e 22 2c 0a 20 20 20 20 20 20  _MMAP\n",.      
20040 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
20050 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
20060 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  , pFile, pFile->
20070 68 4d 61 70 29 29 3b 0a 20 20 20 20 20 20 72 65  hMap));.      re
20080 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
20090 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d  (SQLITE_IOERR_MM
200a0 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  AP, pFile->lastE
200b0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
200c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
200d0 77 69 6e 55 6e 6d 61 70 66 69 6c 65 32 22 2c 20  winUnmapfile2", 
200e0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
200f0 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e     }.    pFile->
20100 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  hMap = NULL;.  }
20110 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d  .  OSTRACE(("UNM
20120 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c  AP-FILE pid=%lu,
20130 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51   pFile=%p, rc=SQ
20140 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20  LITE_OK\n",.    
20150 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
20160 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
20170 70 46 69 6c 65 29 29 3b 0a 20 20 72 65 74 75 72  pFile));.  retur
20180 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
20190 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70  /*.** Memory map
201a0 20 6f 72 20 72 65 6d 61 70 20 74 68 65 20 66 69   or remap the fi
201b0 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 66 69 6c  le opened by fil
201c0 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70 46 64  e-descriptor pFd
201d0 20 28 69 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a   (if the file.**
201e0 20 69 73 20 61 6c 72 65 61 64 79 20 6d 61 70 70   is already mapp
201f0 65 64 2c 20 74 68 65 20 65 78 69 73 74 69 6e 67  ed, the existing
20200 20 6d 61 70 70 69 6e 67 20 69 73 20 72 65 70 6c   mapping is repl
20210 61 63 65 64 20 62 79 20 74 68 65 20 6e 65 77 29  aced by the new)
20220 2e 20 4f 72 2c 20 69 66 0a 2a 2a 20 74 68 65 72  . Or, if.** ther
20230 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
20240 20 61 20 6d 61 70 70 69 6e 67 20 66 6f 72 20 74   a mapping for t
20250 68 69 73 20 66 69 6c 65 2c 20 61 6e 64 20 74 68  his file, and th
20260 65 72 65 20 61 72 65 20 73 74 69 6c 6c 0a 2a 2a  ere are still.**
20270 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65   outstanding xFe
20280 74 63 68 28 29 20 72 65 66 65 72 65 6e 63 65 73  tch() references
20290 20 74 6f 20 69 74 2c 20 74 68 69 73 20 66 75 6e   to it, this fun
202a0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
202b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
202c0 65 74 65 72 20 6e 42 79 74 65 20 69 73 20 6e 6f  eter nByte is no
202d0 6e 2d 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  n-negative, then
202e0 20 69 74 20 69 73 20 74 68 65 20 72 65 71 75 65   it is the reque
202f0 73 74 65 64 20 73 69 7a 65 20 6f 66 0a 2a 2a 20  sted size of.** 
20300 74 68 65 20 6d 61 70 70 69 6e 67 20 74 6f 20 63  the mapping to c
20310 72 65 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  reate. Otherwise
20320 2c 20 69 66 20 6e 42 79 74 65 20 69 73 20 6c 65  , if nByte is le
20330 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
20340 65 6e 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73  en the.** reques
20350 74 65 64 20 73 69 7a 65 20 69 73 20 74 68 65 20  ted size is the 
20360 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
20370 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20 61 63   on disk. The ac
20380 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  tual size of the
20390 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d 61 70 70  .** created mapp
203a0 69 6e 67 20 69 73 20 65 69 74 68 65 72 20 74 68  ing is either th
203b0 65 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65  e requested size
203c0 20 6f 72 20 74 68 65 20 76 61 6c 75 65 20 63 6f   or the value co
203d0 6e 66 69 67 75 72 65 64 0a 2a 2a 20 75 73 69 6e  nfigured.** usin
203e0 67 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d  g SQLITE_FCNTL_M
203f0 4d 41 50 5f 53 49 5a 45 2c 20 77 68 69 63 68 65  MAP_SIZE, whiche
20400 76 65 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e 0a  ver is smaller..
20410 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
20420 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
20430 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28  o error occurs (
20440 65 76 65 6e 20 69 66 20 74 68 65 20 6d 61 70 70  even if the mapp
20450 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72 65  ing is not.** re
20460 63 72 65 61 74 65 64 20 61 73 20 61 20 72 65 73  created as a res
20470 75 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e 64 69  ult of outstandi
20480 6e 67 20 72 65 66 65 72 65 6e 63 65 73 29 20 6f  ng references) o
20490 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
204a0 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77  r.** code otherw
204b0 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
204c0 6e 74 20 77 69 6e 4d 61 70 66 69 6c 65 28 77 69  nt winMapfile(wi
204d0 6e 46 69 6c 65 20 2a 70 46 64 2c 20 73 71 6c 69  nFile *pFd, sqli
204e0 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29  te3_int64 nByte)
204f0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  {.  sqlite3_int6
20500 34 20 6e 4d 61 70 20 3d 20 6e 42 79 74 65 3b 0a  4 nMap = nByte;.
20510 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
20520 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20  ert( nMap>=0 || 
20530 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d  pFd->nFetchOut==
20540 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  0 );.  OSTRACE((
20550 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c  "MAP-FILE pid=%l
20560 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 73 69 7a  u, pFile=%p, siz
20570 65 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20 20 20 20  e=%lld\n",.     
20580 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
20590 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
205a0 46 64 2c 20 6e 42 79 74 65 29 29 3b 0a 0a 20 20  Fd, nByte));..  
205b0 69 66 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f  if( pFd->nFetchO
205c0 75 74 3e 30 20 29 20 72 65 74 75 72 6e 20 53 51  ut>0 ) return SQ
205d0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
205e0 6e 4d 61 70 3c 30 20 29 7b 0a 20 20 20 20 72 63  nMap<0 ){.    rc
205f0 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 28   = winFileSize((
20600 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 46  sqlite3_file*)pF
20610 64 2c 20 26 6e 4d 61 70 29 3b 0a 20 20 20 20 69  d, &nMap);.    i
20620 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 4f  f( rc ){.      O
20630 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c  STRACE(("MAP-FIL
20640 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
20650 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%p, rc=SQLITE_I
20660 4f 45 52 52 5f 46 53 54 41 54 5c 6e 22 2c 0a 20  OERR_FSTAT\n",. 
20670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
20680 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
20690 73 49 64 28 29 2c 20 70 46 64 29 29 3b 0a 20 20  sId(), pFd));.  
206a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
206b0 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20  E_IOERR_FSTAT;. 
206c0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e     }.  }.  if( n
206d0 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  Map>pFd->mmapSiz
206e0 65 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d 61 70  eMax ){.    nMap
206f0 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65   = pFd->mmapSize
20700 4d 61 78 3b 0a 20 20 7d 0a 20 20 6e 4d 61 70 20  Max;.  }.  nMap 
20710 26 3d 20 7e 28 73 71 6c 69 74 65 33 5f 69 6e 74  &= ~(sqlite3_int
20720 36 34 29 28 77 69 6e 53 79 73 49 6e 66 6f 2e 64  64)(winSysInfo.d
20730 77 50 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a  wPageSize - 1);.
20740 0a 20 20 69 66 28 20 6e 4d 61 70 3d 3d 30 20 26  .  if( nMap==0 &
20750 26 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3e  & pFd->mmapSize>
20760 30 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6d 61  0 ){.    winUnma
20770 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a  pfile(pFd);.  }.
20780 20 20 69 66 28 20 6e 4d 61 70 21 3d 70 46 64 2d    if( nMap!=pFd-
20790 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
207a0 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20 30 3b   void *pNew = 0;
207b0 0a 20 20 20 20 44 57 4f 52 44 20 70 72 6f 74 65  .    DWORD prote
207c0 63 74 20 3d 20 50 41 47 45 5f 52 45 41 44 4f 4e  ct = PAGE_READON
207d0 4c 59 3b 0a 20 20 20 20 44 57 4f 52 44 20 66 6c  LY;.    DWORD fl
207e0 61 67 73 20 3d 20 46 49 4c 45 5f 4d 41 50 5f 52  ags = FILE_MAP_R
207f0 45 41 44 3b 0a 0a 20 20 20 20 77 69 6e 55 6e 6d  EAD;..    winUnm
20800 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 23 69 66  apfile(pFd);.#if
20810 64 65 66 20 53 51 4c 49 54 45 5f 4d 4d 41 50 5f  def SQLITE_MMAP_
20820 52 45 41 44 57 52 49 54 45 0a 20 20 20 20 69 66  READWRITE.    if
20830 28 20 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67  ( (pFd->ctrlFlag
20840 73 20 26 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e  s & WINFILE_RDON
20850 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)==0 ){.      
20860 70 72 6f 74 65 63 74 20 3d 20 50 41 47 45 5f 52  protect = PAGE_R
20870 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20 20 20  EADWRITE;.      
20880 66 6c 61 67 73 20 7c 3d 20 46 49 4c 45 5f 4d 41  flags |= FILE_MA
20890 50 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 0a 23  P_WRITE;.    }.#
208a0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
208b0 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 70 46  _OS_WINRT.    pF
208c0 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61  d->hMap = osCrea
208d0 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f  teFileMappingFro
208e0 6d 41 70 70 28 70 46 64 2d 3e 68 2c 20 4e 55 4c  mApp(pFd->h, NUL
208f0 4c 2c 20 70 72 6f 74 65 63 74 2c 20 6e 4d 61 70  L, protect, nMap
20900 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66 20 64  , NULL);.#elif d
20910 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
20920 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
20930 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73    pFd->hMap = os
20940 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
20950 67 57 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c  gW(pFd->h, NULL,
20960 20 70 72 6f 74 65 63 74 2c 0a 20 20 20 20 20 20   protect,.      
20970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20980 20 20 20 20 20 20 20 20 20 20 28 44 57 4f 52 44            (DWORD
20990 29 28 28 6e 4d 61 70 3e 3e 33 32 29 20 26 20 30  )((nMap>>32) & 0
209a0 78 66 66 66 66 66 66 66 66 29 2c 0a 20 20 20 20  xffffffff),.    
209b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209c0 20 20 20 20 20 20 20 20 20 20 20 20 28 44 57 4f              (DWO
209d0 52 44 29 28 6e 4d 61 70 20 26 20 30 78 66 66 66  RD)(nMap & 0xfff
209e0 66 66 66 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23  fffff), NULL);.#
209f0 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  elif defined(SQL
20a00 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
20a10 53 49 29 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61  SI).    pFd->hMa
20a20 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65  p = osCreateFile
20a30 4d 61 70 70 69 6e 67 41 28 70 46 64 2d 3e 68 2c  MappingA(pFd->h,
20a40 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a   NULL, protect,.
20a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a70 28 44 57 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33  (DWORD)((nMap>>3
20a80 32 29 20 26 20 30 78 66 66 66 66 66 66 66 66 29  2) & 0xffffffff)
20a90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ab0 20 20 28 44 57 4f 52 44 29 28 6e 4d 61 70 20 26    (DWORD)(nMap &
20ac0 20 30 78 66 66 66 66 66 66 66 66 29 2c 20 4e 55   0xffffffff), NU
20ad0 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  LL);.#endif.    
20ae0 69 66 28 20 70 46 64 2d 3e 68 4d 61 70 3d 3d 4e  if( pFd->hMap==N
20af0 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 46 64  ULL ){.      pFd
20b00 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
20b10 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
20b20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
20b30 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
20b40 45 52 52 5f 4d 4d 41 50 2c 20 70 46 64 2d 3e 6c  ERR_MMAP, pFd->l
20b50 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
20b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b70 20 22 77 69 6e 4d 61 70 66 69 6c 65 31 22 2c 20   "winMapfile1", 
20b80 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  pFd->zPath);.   
20b90 20 20 20 2f 2a 20 4c 6f 67 20 74 68 65 20 65 72     /* Log the er
20ba0 72 6f 72 2c 20 62 75 74 20 63 6f 6e 74 69 6e 75  ror, but continu
20bb0 65 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69  e normal operati
20bc0 6f 6e 20 75 73 69 6e 67 20 78 52 65 61 64 2f 78  on using xRead/x
20bd0 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 4f  Write */.      O
20be0 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c  STRACE(("MAP-FIL
20bf0 45 2d 43 52 45 41 54 45 20 70 69 64 3d 25 6c 75  E-CREATE pid=%lu
20c00 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25  , pFile=%p, rc=%
20c10 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
20c20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
20c30 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
20c40 64 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  d, sqlite3ErrNam
20c50 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72  e(rc)));.      r
20c60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20c70 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
20c80 74 28 20 28 6e 4d 61 70 20 25 20 77 69 6e 53 79  t( (nMap % winSy
20c90 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65  sInfo.dwPageSize
20ca0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )==0 );.    asse
20cb0 72 74 28 20 73 69 7a 65 6f 66 28 53 49 5a 45 5f  rt( sizeof(SIZE_
20cc0 54 29 3d 3d 73 69 7a 65 6f 66 28 73 71 6c 69 74  T)==sizeof(sqlit
20cd0 65 33 5f 69 6e 74 36 34 29 20 7c 7c 20 6e 4d 61  e3_int64) || nMa
20ce0 70 3c 3d 30 78 66 66 66 66 66 66 66 66 20 29 3b  p<=0xffffffff );
20cf0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
20d00 49 4e 52 54 0a 20 20 20 20 70 4e 65 77 20 3d 20  INRT.    pNew = 
20d10 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46  osMapViewOfFileF
20d20 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68 4d 61 70  romApp(pFd->hMap
20d30 2c 20 66 6c 61 67 73 2c 20 30 2c 20 28 53 49 5a  , flags, 0, (SIZ
20d40 45 5f 54 29 6e 4d 61 70 29 3b 0a 23 65 6c 73 65  E_T)nMap);.#else
20d50 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 61  .    pNew = osMa
20d60 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 64 2d  pViewOfFile(pFd-
20d70 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30 2c  >hMap, flags, 0,
20d80 20 30 2c 20 28 53 49 5a 45 5f 54 29 6e 4d 61 70   0, (SIZE_T)nMap
20d90 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  );.#endif.    if
20da0 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a  ( pNew==NULL ){.
20db0 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e        osCloseHan
20dc0 64 6c 65 28 70 46 64 2d 3e 68 4d 61 70 29 3b 0a  dle(pFd->hMap);.
20dd0 20 20 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20        pFd->hMap 
20de0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 70 46  = NULL;.      pF
20df0 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  d->lastErrno = o
20e00 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
20e10 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  .      rc = winL
20e20 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
20e30 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 64 2d 3e  OERR_MMAP, pFd->
20e40 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
20e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e60 20 20 22 77 69 6e 4d 61 70 66 69 6c 65 32 22 2c    "winMapfile2",
20e70 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20   pFd->zPath);.  
20e80 20 20 20 20 2f 2a 20 4c 6f 67 20 74 68 65 20 65      /* Log the e
20e90 72 72 6f 72 2c 20 62 75 74 20 63 6f 6e 74 69 6e  rror, but contin
20ea0 75 65 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74  ue normal operat
20eb0 69 6f 6e 20 75 73 69 6e 67 20 78 52 65 61 64 2f  ion using xRead/
20ec0 78 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20  xWrite */.      
20ed0 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49  OSTRACE(("MAP-FI
20ee0 4c 45 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20  LE-MAP pid=%lu, 
20ef0 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c  pFile=%p, rc=%s\
20f00 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
20f10 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
20f20 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c  rocessId(), pFd,
20f30 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
20f40 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74  rc)));.      ret
20f50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
20f60 20 20 20 7d 0a 20 20 20 20 70 46 64 2d 3e 70 4d     }.    pFd->pM
20f70 61 70 52 65 67 69 6f 6e 20 3d 20 70 4e 65 77 3b  apRegion = pNew;
20f80 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69  .    pFd->mmapSi
20f90 7a 65 20 3d 20 6e 4d 61 70 3b 0a 20 20 20 20 70  ze = nMap;.    p
20fa0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  Fd->mmapSizeActu
20fb0 61 6c 20 3d 20 6e 4d 61 70 3b 0a 20 20 7d 0a 0a  al = nMap;.  }..
20fc0 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d    OSTRACE(("MAP-
20fd0 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  FILE pid=%lu, pF
20fe0 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
20ff0 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
21000 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
21010 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64  ProcessId(), pFd
21020 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
21030 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
21040 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   /* SQLITE_MAX_M
21050 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f  MAP_SIZE>0 */../
21060 2a 0a 2a 2a 20 49 66 20 70 6f 73 73 69 62 6c 65  *.** If possible
21070 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  , return a point
21080 65 72 20 74 6f 20 61 20 6d 61 70 70 69 6e 67 20  er to a mapping 
21090 6f 66 20 66 69 6c 65 20 66 64 20 73 74 61 72 74  of file fd start
210a0 69 6e 67 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a  ing at offset.**
210b0 20 69 4f 66 66 2e 20 54 68 65 20 6d 61 70 70 69   iOff. The mappi
210c0 6e 67 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64  ng must be valid
210d0 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6e 41   for at least nA
210e0 6d 74 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  mt bytes..**.** 
210f0 49 66 20 73 75 63 68 20 61 20 70 6f 69 6e 74 65  If such a pointe
21100 72 20 63 61 6e 20 62 65 20 6f 62 74 61 69 6e 65  r can be obtaine
21110 64 2c 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a  d, store it in *
21120 70 70 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  pp and return SQ
21130 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20  LITE_OK..** Or, 
21140 69 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 75  if one cannot bu
21150 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  t no error occur
21160 73 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 30 20  s, set *pp to 0 
21170 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
21180 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 6c 6c 79  E_OK..** Finally
21190 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 64 6f  , if an error do
211a0 65 73 20 6f 63 63 75 72 2c 20 72 65 74 75 72 6e  es occur, return
211b0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
211c0 20 63 6f 64 65 2e 20 54 68 65 20 66 69 6e 61 6c   code. The final
211d0 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 2a 70 70  .** value of *pp
211e0 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e   is undefined in
211f0 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
21200 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69  * If this functi
21210 6f 6e 20 64 6f 65 73 20 72 65 74 75 72 6e 20 61  on does return a
21220 20 70 6f 69 6e 74 65 72 2c 20 74 68 65 20 63 61   pointer, the ca
21230 6c 6c 65 72 20 6d 75 73 74 20 65 76 65 6e 74 75  ller must eventu
21240 61 6c 6c 79 0a 2a 2a 20 72 65 6c 65 61 73 65 20  ally.** release 
21250 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 62 79  the reference by
21260 20 63 61 6c 6c 69 6e 67 20 77 69 6e 55 6e 66 65   calling winUnfe
21270 74 63 68 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  tch()..*/.static
21280 20 69 6e 74 20 77 69 6e 46 65 74 63 68 28 73 71   int winFetch(sq
21290 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
212a0 69 36 34 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41  i64 iOff, int nA
212b0 6d 74 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a  mt, void **pp){.
212c0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
212d0 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e  MAP_SIZE>0.  win
212e0 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 77 69 6e  File *pFd = (win
212f0 46 69 6c 65 2a 29 66 64 3b 20 20 20 2f 2a 20 54  File*)fd;   /* T
21300 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
21310 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23  tabase file */.#
21320 65 6e 64 69 66 0a 20 20 2a 70 70 20 3d 20 30 3b  endif.  *pp = 0;
21330 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46 45  ..  OSTRACE(("FE
21340 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  TCH pid=%lu, pFi
21350 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c  le=%p, offset=%l
21360 6c 64 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 70  ld, amount=%d, p
21370 70 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20  p=%p\n",.       
21380 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
21390 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64 2c  ProcessId(), fd,
213a0 20 69 4f 66 66 2c 20 6e 41 6d 74 2c 20 70 70 29   iOff, nAmt, pp)
213b0 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  );..#if SQLITE_M
213c0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
213d0 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69   if( pFd->mmapSi
213e0 7a 65 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20 69  zeMax>0 ){.    i
213f0 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69  f( pFd->pMapRegi
21400 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  on==0 ){.      i
21410 6e 74 20 72 63 20 3d 20 77 69 6e 4d 61 70 66 69  nt rc = winMapfi
21420 6c 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20  le(pFd, -1);.   
21430 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
21440 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
21450 4f 53 54 52 41 43 45 28 28 22 46 45 54 43 48 20  OSTRACE(("FETCH 
21460 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
21470 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  p, rc=%s\n",.   
21480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
21490 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
214a0 73 49 64 28 29 2c 20 70 46 64 2c 20 73 71 6c 69  sId(), pFd, sqli
214b0 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
214c0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
214d0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
214e0 20 7d 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e   }.    if( pFd->
214f0 6d 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66 66  mmapSize >= iOff
21500 2b 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20 20 2a  +nAmt ){.      *
21510 70 70 20 3d 20 26 28 28 75 38 20 2a 29 70 46 64  pp = &((u8 *)pFd
21520 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f  ->pMapRegion)[iO
21530 66 66 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e  ff];.      pFd->
21540 6e 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20  nFetchOut++;.   
21550 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
21560 20 4f 53 54 52 41 43 45 28 28 22 46 45 54 43 48   OSTRACE(("FETCH
21570 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
21580 25 70 2c 20 70 70 3d 25 70 2c 20 2a 70 70 3d 25  %p, pp=%p, *pp=%
21590 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
215a0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
215b0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
215c0 73 73 49 64 28 29 2c 20 66 64 2c 20 70 70 2c 20  ssId(), fd, pp, 
215d0 2a 70 70 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  *pp));.  return 
215e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
215f0 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69 72 64  .** If the third
21600 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
21610 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73  -NULL, then this
21620 20 66 75 6e 63 74 69 6f 6e 20 72 65 6c 65 61 73   function releas
21630 65 73 20 61 0a 2a 2a 20 72 65 66 65 72 65 6e 63  es a.** referenc
21640 65 20 6f 62 74 61 69 6e 65 64 20 62 79 20 61 6e  e obtained by an
21650 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f   earlier call to
21660 20 77 69 6e 46 65 74 63 68 28 29 2e 20 54 68 65   winFetch(). The
21670 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d   second.** argum
21680 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  ent passed to th
21690 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  is function must
216a0 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
216b0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
216c0 67 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 68  g.** argument th
216d0 61 74 20 77 61 73 20 70 61 73 73 65 64 20 74 6f  at was passed to
216e0 20 74 68 65 20 77 69 6e 46 65 74 63 68 28 29 20   the winFetch() 
216f0 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  invocation..**.*
21700 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 74 68 69  * Or, if the thi
21710 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e  rd argument is N
21720 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ULL, then this f
21730 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  unction is being
21740 20 63 61 6c 6c 65 64 0a 2a 2a 20 74 6f 20 69 6e   called.** to in
21750 66 6f 72 6d 20 74 68 65 20 56 46 53 20 6c 61 79  form the VFS lay
21760 65 72 20 74 68 61 74 2c 20 61 63 63 6f 72 64 69  er that, accordi
21770 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e 79  ng to POSIX, any
21780 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
21790 67 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62 65 20  g.** may now be 
217a0 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75  invalid and shou
217b0 6c 64 20 62 65 20 75 6e 6d 61 70 70 65 64 2e 0a  ld be unmapped..
217c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
217d0 6e 55 6e 66 65 74 63 68 28 73 71 6c 69 74 65 33  nUnfetch(sqlite3
217e0 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69  _file *fd, i64 i
217f0 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 23  Off, void *p){.#
21800 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
21810 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e 46  AP_SIZE>0.  winF
21820 69 6c 65 20 2a 70 46 64 20 3d 20 28 77 69 6e 46  ile *pFd = (winF
21830 69 6c 65 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68  ile*)fd;   /* Th
21840 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
21850 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
21860 20 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d   /* If p==0 (unm
21870 61 70 20 74 68 65 20 65 6e 74 69 72 65 20 66 69  ap the entire fi
21880 6c 65 29 20 74 68 65 6e 20 74 68 65 72 65 20 6d  le) then there m
21890 75 73 74 20 62 65 20 6e 6f 20 6f 75 74 73 74 61  ust be no outsta
218a0 6e 64 69 6e 67 0a 20 20 2a 2a 20 78 46 65 74 63  nding.  ** xFetc
218b0 68 20 72 65 66 65 72 65 6e 63 65 73 2e 20 4f 72  h references. Or
218c0 2c 20 69 66 20 70 21 3d 30 20 28 6d 65 61 6e 69  , if p!=0 (meani
218d0 6e 67 20 69 74 20 69 73 20 61 6e 20 78 46 65 74  ng it is an xFet
218e0 63 68 20 72 65 66 65 72 65 6e 63 65 29 2c 0a 20  ch reference),. 
218f0 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 6d   ** then there m
21900 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
21910 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 2e  one outstanding.
21920 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
21930 70 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46 65  p==0)==(pFd->nFe
21940 74 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a 20  tchOut==0) );.. 
21950 20 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69 74 20   /* If p!=0, it 
21960 6d 75 73 74 20 6d 61 74 63 68 20 74 68 65 20 69  must match the i
21970 4f 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20  Off value. */.  
21980 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20  assert( p==0 || 
21990 70 3d 3d 26 28 28 75 38 20 2a 29 70 46 64 2d 3e  p==&((u8 *)pFd->
219a0 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66  pMapRegion)[iOff
219b0 5d 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28  ] );..  OSTRACE(
219c0 28 22 55 4e 46 45 54 43 48 20 70 69 64 3d 25 6c  ("UNFETCH pid=%l
219d0 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 6f 66 66  u, pFile=%p, off
219e0 73 65 74 3d 25 6c 6c 64 2c 20 70 3d 25 70 5c 6e  set=%lld, p=%p\n
219f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
21a00 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
21a10 73 49 64 28 29 2c 20 70 46 64 2c 20 69 4f 66 66  sId(), pFd, iOff
21a20 2c 20 70 29 29 3b 0a 0a 20 20 69 66 28 20 70 20  , p));..  if( p 
21a30 29 7b 0a 20 20 20 20 70 46 64 2d 3e 6e 46 65 74  ){.    pFd->nFet
21a40 63 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65  chOut--;.  }else
21a50 7b 0a 20 20 20 20 2f 2a 20 46 49 58 4d 45 3a 20  {.    /* FIXME: 
21a60 20 49 66 20 57 69 6e 64 6f 77 73 20 74 72 75 6c   If Windows trul
21a70 79 20 61 6c 77 61 79 73 20 70 72 65 76 65 6e 74  y always prevent
21a80 73 20 74 72 75 6e 63 61 74 69 6e 67 20 6f 72 20  s truncating or 
21a90 64 65 6c 65 74 69 6e 67 20 61 0a 20 20 20 20 2a  deleting a.    *
21aa0 2a 20 66 69 6c 65 20 77 68 69 6c 65 20 61 20 6d  * file while a m
21ab0 61 70 70 69 6e 67 20 69 73 20 68 65 6c 64 2c 20  apping is held, 
21ac0 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  then the followi
21ad0 6e 67 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28  ng winUnmapfile(
21ae0 29 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 69 73  ) call.    ** is
21af0 20 75 6e 6e 65 63 65 73 73 61 72 79 20 63 61 6e   unnecessary can
21b00 20 62 65 20 6f 6d 69 74 74 65 64 20 2d 20 70 6f   be omitted - po
21b10 74 65 6e 74 69 61 6c 6c 79 20 69 6d 70 72 6f 76  tentially improv
21b20 69 6e 67 0a 20 20 20 20 2a 2a 20 70 65 72 66 6f  ing.    ** perfo
21b30 72 6d 61 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20  rmance.  */.    
21b40 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64  winUnmapfile(pFd
21b50 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
21b60 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  ( pFd->nFetchOut
21b70 3e 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  >=0 );.#endif.. 
21b80 20 4f 53 54 52 41 43 45 28 28 22 55 4e 46 45 54   OSTRACE(("UNFET
21b90 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  CH pid=%lu, pFil
21ba0 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
21bb0 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  OK\n",.         
21bc0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
21bd0 6f 63 65 73 73 49 64 28 29 2c 20 66 64 29 29 3b  ocessId(), fd));
21be0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
21bf0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65  _OK;.}../*.** He
21c00 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c  re ends the impl
21c10 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c  ementation of al
21c20 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d  l sqlite3_file m
21c30 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  ethods..**.*****
21c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21c50 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69  * End sqlite3_fi
21c60 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  le Methods *****
21c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
21c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
21ce0 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20 64 65  * This vector de
21cf0 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65  fines all the me
21d00 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f  thods that can o
21d10 70 65 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20  perate on an.** 
21d20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f 72  sqlite3_file for
21d30 20 77 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69   win32..*/.stati
21d40 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
21d50 69 6f 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f  io_methods winIo
21d60 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20 33 2c 20  Method = {.  3, 
21d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21d90 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69  iVersion */.  wi
21da0 6e 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  nClose,         
21db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21dc0 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 77 69 6e   xClose */.  win
21dd0 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  Read,           
21de0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21df0 78 52 65 61 64 20 2a 2f 0a 20 20 77 69 6e 57 72  xRead */.  winWr
21e00 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ite,            
21e10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57             /* xW
21e20 72 69 74 65 20 2a 2f 0a 20 20 77 69 6e 54 72 75  rite */.  winTru
21e30 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  ncate,          
21e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72            /* xTr
21e50 75 6e 63 61 74 65 20 2a 2f 0a 20 20 77 69 6e 53  uncate */.  winS
21e60 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  ync,            
21e70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
21e80 53 79 6e 63 20 2a 2f 0a 20 20 77 69 6e 46 69 6c  Sync */.  winFil
21e90 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  eSize,          
21ea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
21eb0 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 4c  leSize */.  winL
21ec0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
21ed0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
21ee0 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e 6c  Lock */.  winUnl
21ef0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
21f00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
21f10 6c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 43 68 65  lock */.  winChe
21f20 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20  ckReservedLock, 
21f30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68            /* xCh
21f40 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
21f50 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74  */.  winFileCont
21f60 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rol,            
21f70 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e       /* xFileCon
21f80 74 72 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53 65 63  trol */.  winSec
21f90 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20  torSize,        
21fa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65            /* xSe
21fb0 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 77 69  ctorSize */.  wi
21fc0 6e 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  nDeviceCharacter
21fd0 69 73 74 69 63 73 2c 20 20 20 20 20 20 20 2f 2a  istics,       /*
21fe0 20 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65   xDeviceCharacte
21ff0 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 77 69 6e  ristics */.  win
22000 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20  ShmMap,         
22010 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22020 78 53 68 6d 4d 61 70 20 2a 2f 0a 20 20 77 69 6e  xShmMap */.  win
22030 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ShmLock,        
22040 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22050 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69  xShmLock */.  wi
22060 6e 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20  nShmBarrier,    
22070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22080 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a   xShmBarrier */.
22090 20 20 77 69 6e 53 68 6d 55 6e 6d 61 70 2c 20 20    winShmUnmap,  
220a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220b0 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a    /* xShmUnmap *
220c0 2f 0a 20 20 77 69 6e 46 65 74 63 68 2c 20 20 20  /.  winFetch,   
220d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220e0 20 20 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f      /* xFetch */
220f0 0a 20 20 77 69 6e 55 6e 66 65 74 63 68 20 20 20  .  winUnfetch   
22100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22110 20 20 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a     /* xUnfetch *
22120 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  /.};../*********
22130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22170 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
22180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22190 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74   sqlite3_vfs met
221a0 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
221b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
221c0 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76  *.**.** This div
221d0 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74  ision contains t
221e0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
221f0 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20  n of methods on 
22200 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  the.** sqlite3_v
22210 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 23  fs object..*/..#
22220 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47  if defined(__CYG
22230 57 49 4e 5f 5f 29 0a 2f 2a 0a 2a 2a 20 43 6f 6e  WIN__)./*.** Con
22240 76 65 72 74 20 61 20 66 69 6c 65 6e 61 6d 65 20  vert a filename 
22250 66 72 6f 6d 20 77 68 61 74 65 76 65 72 20 74 68  from whatever th
22260 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65  e underlying ope
22270 72 61 74 69 6e 67 20 73 79 73 74 65 6d 0a 2a 2a  rating system.**
22280 20 73 75 70 70 6f 72 74 73 20 66 6f 72 20 66 69   supports for fi
22290 6c 65 6e 61 6d 65 73 20 69 6e 74 6f 20 55 54 46  lenames into UTF
222a0 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  -8.  Space to ho
222b0 6c 64 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  ld the result is
222c0 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  .** obtained fro
222d0 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73  m malloc and mus
222e0 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
222f0 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
22300 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  on..*/.static ch
22310 61 72 20 2a 77 69 6e 43 6f 6e 76 65 72 74 54 6f  ar *winConvertTo
22320 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e  Utf8Filename(con
22330 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61  st void *zFilena
22340 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f  me){.  char *zCo
22350 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69  nverted = 0;.  i
22360 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20  f( osIsNT() ){. 
22370 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20     zConverted = 
22380 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38  winUnicodeToUtf8
22390 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d  (zFilename);.  }
223a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
223b0 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
223c0 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65  else{.    zConve
223d0 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 77  rted = sqlite3_w
223e0 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66  in32_mbcs_to_utf
223f0 38 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  8(zFilename);.  
22400 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61  }.#endif.  /* ca
22410 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65  ller will handle
22420 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a   out of memory *
22430 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76  /.  return zConv
22440 65 72 74 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a  erted;.}.#endif.
22450 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
22460 20 55 54 46 2d 38 20 66 69 6c 65 6e 61 6d 65 20   UTF-8 filename 
22470 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f  into whatever fo
22480 72 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  rm the underlyin
22490 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73  g.** operating s
224a0 79 73 74 65 6d 20 77 61 6e 74 73 20 66 69 6c 65  ystem wants file
224b0 6e 61 6d 65 73 20 69 6e 2e 20 20 53 70 61 63 65  names in.  Space
224c0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 73   to hold the res
224d0 75 6c 74 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e  ult.** is obtain
224e0 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61  ed from malloc a
224f0 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
22500 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a   by the calling.
22510 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ** function..*/.
22520 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e  static void *win
22530 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46  ConvertFromUtf8F
22540 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68  ilename(const ch
22550 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
22560 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
22570 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 73  ed = 0;.  if( os
22580 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43  IsNT() ){.    zC
22590 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 55 74  onverted = winUt
225a0 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c  f8ToUnicode(zFil
225b0 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64  ename);.  }.#ifd
225c0 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
225d0 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
225e0 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20  .    zConverted 
225f0 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
22600 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28 7a 46 69  utf8_to_mbcs(zFi
22610 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e  lename);.  }.#en
22620 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20  dif.  /* caller 
22630 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20  will handle out 
22640 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72  of memory */.  r
22650 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64  eturn zConverted
22660 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
22670 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
22680 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
22690 20 73 70 65 63 69 66 69 65 64 20 55 54 46 2d 38   specified UTF-8
226a0 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 0a 2a   string buffer.*
226b0 2a 20 65 6e 64 73 20 77 69 74 68 20 61 20 64 69  * ends with a di
226c0 72 65 63 74 6f 72 79 20 73 65 70 61 72 61 74 6f  rectory separato
226d0 72 20 63 68 61 72 61 63 74 65 72 20 6f 72 20 6f  r character or o
226e0 6e 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  ne was successfu
226f0 6c 6c 79 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20  lly.** added to 
22700 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  it..*/.static in
22710 74 20 77 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 69  t winMakeEndInDi
22720 72 53 65 70 28 69 6e 74 20 6e 42 75 66 2c 20 63  rSep(int nBuf, c
22730 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69 66  har *zBuf){.  if
22740 28 20 7a 42 75 66 20 29 7b 0a 20 20 20 20 69 6e  ( zBuf ){.    in
22750 74 20 6e 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33  t nLen = sqlite3
22760 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a  Strlen30(zBuf);.
22770 20 20 20 20 69 66 28 20 6e 4c 65 6e 3e 30 20 29      if( nLen>0 )
22780 7b 0a 20 20 20 20 20 20 69 66 28 20 77 69 6e 49  {.      if( winI
22790 73 44 69 72 53 65 70 28 7a 42 75 66 5b 6e 4c 65  sDirSep(zBuf[nLe
227a0 6e 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  n-1]) ){.       
227b0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
227c0 20 7d 65 6c 73 65 20 69 66 28 20 6e 4c 65 6e 2b   }else if( nLen+
227d0 31 3c 6e 42 75 66 20 29 7b 0a 20 20 20 20 20 20  1<nBuf ){.      
227e0 20 20 7a 42 75 66 5b 6e 4c 65 6e 5d 20 3d 20 77    zBuf[nLen] = w
227f0 69 6e 47 65 74 44 69 72 53 65 70 28 29 3b 0a 20  inGetDirSep();. 
22800 20 20 20 20 20 20 20 7a 42 75 66 5b 6e 4c 65 6e         zBuf[nLen
22810 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  +1] = '\0';.    
22820 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
22830 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
22840 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
22850 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65  *.** Create a te
22860 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  mporary file nam
22870 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  e and store the 
22880 72 65 73 75 6c 74 69 6e 67 20 70 6f 69 6e 74 65  resulting pointe
22890 72 20 69 6e 74 6f 20 70 7a 42 75 66 2e 0a 2a 2a  r into pzBuf..**
228a0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
228b0 75 72 6e 65 64 20 69 6e 20 70 7a 42 75 66 20 6d  urned in pzBuf m
228c0 75 73 74 20 62 65 20 66 72 65 65 64 20 76 69 61  ust be freed via
228d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
228e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
228f0 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 73 71  inGetTempname(sq
22900 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
22910 20 63 68 61 72 20 2a 2a 70 7a 42 75 66 29 7b 0a   char **pzBuf){.
22920 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 43    static char zC
22930 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62  hars[] =.    "ab
22940 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
22950 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41  stuvwxyz".    "A
22960 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51  BCDEFGHIJKLMNOPQ
22970 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22  RSTUVWXYZ".    "
22980 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 73  0123456789";.  s
22990 69 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20 20 69 6e  ize_t i, j;.  in
229a0 74 20 6e 50 72 65 20 3d 20 73 71 6c 69 74 65 33  t nPre = sqlite3
229b0 53 74 72 6c 65 6e 33 30 28 53 51 4c 49 54 45 5f  Strlen30(SQLITE_
229c0 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
229d0 29 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 2c 20 6e  );.  int nMax, n
229e0 42 75 66 2c 20 6e 44 69 72 2c 20 6e 4c 65 6e 3b  Buf, nDir, nLen;
229f0 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a  .  char *zBuf;..
22a00 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f    /* It's odd to
22a10 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d   simulate an io-
22a20 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20  error here, but 
22a30 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a  really this is j
22a40 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74  ust.  ** using t
22a50 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72  he io-error infr
22a60 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65  astructure to te
22a70 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68  st that SQLite h
22a80 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a  andles this.  **
22a90 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e   function failin
22aa0 67 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  g..  */.  Simula
22ab0 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
22ac0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  n SQLITE_IOERR )
22ad0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
22ae0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66   a temporary buf
22af0 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65  fer to store the
22b00 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
22b10 20 66 69 6c 65 0a 20 20 2a 2a 20 6e 61 6d 65 20   file.  ** name 
22b20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72  for the temporar
22b30 79 20 66 69 6c 65 2e 20 20 49 66 20 74 68 69 73  y file.  If this
22b40 20 66 61 69 6c 73 2c 20 77 65 20 63 61 6e 6e 6f   fails, we canno
22b50 74 20 63 6f 6e 74 69 6e 75 65 2e 0a 20 20 2a 2f  t continue..  */
22b60 0a 20 20 6e 4d 61 78 20 3d 20 70 56 66 73 2d 3e  .  nMax = pVfs->
22b70 6d 78 50 61 74 68 6e 61 6d 65 3b 20 6e 42 75 66  mxPathname; nBuf
22b80 20 3d 20 6e 4d 61 78 20 2b 20 32 3b 0a 20 20 7a   = nMax + 2;.  z
22b90 42 75 66 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  Buf = sqlite3Mal
22ba0 6c 6f 63 5a 65 72 6f 28 20 6e 42 75 66 20 29 3b  locZero( nBuf );
22bb0 0a 20 20 69 66 28 20 21 7a 42 75 66 20 29 7b 0a  .  if( !zBuf ){.
22bc0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
22bd0 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
22be0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
22bf0 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 74 75  M\n"));.    retu
22c00 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
22c10 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
22c20 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
22c30 65 66 66 65 63 74 69 76 65 20 74 65 6d 70 6f 72  effective tempor
22c40 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e 20 20  ary directory.  
22c50 46 69 72 73 74 2c 20 63 68 65 63 6b 20 69 66 20  First, check if 
22c60 6f 6e 65 0a 20 20 2a 2a 20 68 61 73 20 62 65 65  one.  ** has bee
22c70 6e 20 65 78 70 6c 69 63 69 74 6c 79 20 73 65 74  n explicitly set
22c80 20 62 79 20 74 68 65 20 61 70 70 6c 69 63 61 74   by the applicat
22c90 69 6f 6e 3b 20 6f 74 68 65 72 77 69 73 65 2c 20  ion; otherwise, 
22ca0 75 73 65 20 74 68 65 20 6f 6e 65 0a 20 20 2a 2a  use the one.  **
22cb0 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74   configured by t
22cc0 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
22cd0 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 44 69 72  tem..  */.  nDir
22ce0 20 3d 20 6e 4d 61 78 20 2d 20 28 6e 50 72 65 20   = nMax - (nPre 
22cf0 2b 20 31 35 29 3b 0a 20 20 61 73 73 65 72 74 28  + 15);.  assert(
22d00 20 6e 44 69 72 3e 30 20 29 3b 0a 20 20 69 66 28   nDir>0 );.  if(
22d10 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69   sqlite3_temp_di
22d20 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 69  rectory ){.    i
22d30 6e 74 20 6e 44 69 72 4c 65 6e 20 3d 20 73 71 6c  nt nDirLen = sql
22d40 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c  ite3Strlen30(sql
22d50 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
22d60 6f 72 79 29 3b 0a 20 20 20 20 69 66 28 20 6e 44  ory);.    if( nD
22d70 69 72 4c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  irLen>0 ){.     
22d80 20 69 66 28 20 21 77 69 6e 49 73 44 69 72 53 65   if( !winIsDirSe
22d90 70 28 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  p(sqlite3_temp_d
22da0 69 72 65 63 74 6f 72 79 5b 6e 44 69 72 4c 65 6e  irectory[nDirLen
22db0 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  -1]) ){.        
22dc0 6e 44 69 72 4c 65 6e 2b 2b 3b 0a 20 20 20 20 20  nDirLen++;.     
22dd0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 44 69   }.      if( nDi
22de0 72 4c 65 6e 3e 6e 44 69 72 20 29 7b 0a 20 20 20  rLen>nDir ){.   
22df0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
22e00 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20  e(zBuf);.       
22e10 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
22e20 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
22e30 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20  TE_ERROR\n"));. 
22e40 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69         return wi
22e50 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
22e60 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47  _ERROR, 0, "winG
22e70 65 74 54 65 6d 70 6e 61 6d 65 31 22 2c 20 30 29  etTempname1", 0)
22e80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
22e90 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
22ea0 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73  (nMax, zBuf, "%s
22eb0 22 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  ", sqlite3_temp_
22ec0 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20  directory);.    
22ed0 7d 0a 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65  }.  }.#if define
22ee0 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
22ef0 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63  else{.    static
22f00 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44   const char *azD
22f10 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  irs[] = {.      
22f20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 53   0, /* getenv("S
22f30 51 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 20 2a  QLITE_TMPDIR") *
22f40 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67  /.       0, /* g
22f50 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 20  etenv("TMPDIR") 
22f60 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20  */.       0, /* 
22f70 67 65 74 65 6e 76 28 22 54 4d 50 22 29 20 2a 2f  getenv("TMP") */
22f80 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65  .       0, /* ge
22f90 74 65 6e 76 28 22 54 45 4d 50 22 29 20 2a 2f 0a  tenv("TEMP") */.
22fa0 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74         0, /* get
22fb0 65 6e 76 28 22 55 53 45 52 50 52 4f 46 49 4c 45  env("USERPROFILE
22fc0 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 22 2f 76  ") */.       "/v
22fd0 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20 20  ar/tmp",.       
22fe0 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/usr/tmp",.    
22ff0 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20     "/tmp",.     
23000 20 20 22 2e 22 2c 0a 20 20 20 20 20 20 20 30 20    ".",.       0 
23010 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
23020 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 20  erminator */.   
23030 20 7d 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   };.    unsigned
23040 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73   int i;.    cons
23050 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30  t char *zDir = 0
23060 3b 0a 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69  ;..    if( !azDi
23070 72 73 5b 30 5d 20 29 20 61 7a 44 69 72 73 5b 30  rs[0] ) azDirs[0
23080 5d 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49  ] = getenv("SQLI
23090 54 45 5f 54 4d 50 44 49 52 22 29 3b 0a 20 20 20  TE_TMPDIR");.   
230a0 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20   if( !azDirs[1] 
230b0 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65  ) azDirs[1] = ge
230c0 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a  tenv("TMPDIR");.
230d0 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b      if( !azDirs[
230e0 32 5d 20 29 20 61 7a 44 69 72 73 5b 32 5d 20 3d  2] ) azDirs[2] =
230f0 20 67 65 74 65 6e 76 28 22 54 4d 50 22 29 3b 0a   getenv("TMP");.
23100 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b      if( !azDirs[
23110 33 5d 20 29 20 61 7a 44 69 72 73 5b 33 5d 20 3d  3] ) azDirs[3] =
23120 20 67 65 74 65 6e 76 28 22 54 45 4d 50 22 29 3b   getenv("TEMP");
23130 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73  .    if( !azDirs
23140 5b 34 5d 20 29 20 61 7a 44 69 72 73 5b 34 5d 20  [4] ) azDirs[4] 
23150 3d 20 67 65 74 65 6e 76 28 22 55 53 45 52 50 52  = getenv("USERPR
23160 4f 46 49 4c 45 22 29 3b 0a 20 20 20 20 66 6f 72  OFILE");.    for
23170 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
23180 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a  zDirs)/sizeof(az
23190 44 69 72 73 5b 30 5d 29 3b 20 7a 44 69 72 3d 61  Dirs[0]); zDir=a
231a0 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20  zDirs[i++]){.   
231b0 20 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72     void *zConver
231c0 74 65 64 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  ted;.      if( z
231d0 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Dir==0 ) continu
231e0 65 3b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  e;.      /* If t
231f0 68 65 20 70 61 74 68 20 73 74 61 72 74 73 20 77  he path starts w
23200 69 74 68 20 61 20 64 72 69 76 65 20 6c 65 74 74  ith a drive lett
23210 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74  er followed by t
23220 68 65 20 63 6f 6c 6f 6e 0a 20 20 20 20 20 20 2a  he colon.      *
23230 2a 20 63 68 61 72 61 63 74 65 72 2c 20 61 73 73  * character, ass
23240 75 6d 65 20 69 74 20 69 73 20 61 6c 72 65 61 64  ume it is alread
23250 79 20 61 20 6e 61 74 69 76 65 20 57 69 6e 33 32  y a native Win32
23260 20 70 61 74 68 3b 20 6f 74 68 65 72 77 69 73 65   path; otherwise
23270 2c 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 75  ,.      ** it mu
23280 73 74 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  st be converted 
23290 74 6f 20 61 20 6e 61 74 69 76 65 20 57 69 6e 33  to a native Win3
232a0 32 20 70 61 74 68 20 76 69 61 20 74 68 65 20 43  2 path via the C
232b0 79 67 77 69 6e 20 41 50 49 0a 20 20 20 20 20 20  ygwin API.      
232c0 2a 2a 20 70 72 69 6f 72 20 74 6f 20 75 73 69 6e  ** prior to usin
232d0 67 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  g it..      */. 
232e0 20 20 20 20 20 69 66 28 20 77 69 6e 49 73 44 72       if( winIsDr
232f0 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f  iveLetterAndColo
23300 6e 28 7a 44 69 72 29 20 29 7b 0a 20 20 20 20 20  n(zDir) ){.     
23310 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20     zConverted = 
23320 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74  winConvertFromUt
23330 66 38 46 69 6c 65 6e 61 6d 65 28 7a 44 69 72 29  f8Filename(zDir)
23340 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 7a  ;.        if( !z
23350 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20  Converted ){.   
23360 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
23370 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ree(zBuf);.     
23380 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
23390 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
233a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
233b0 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  EM\n"));.       
233c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
233d0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
233e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
233f0 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f  if( winIsDir(zCo
23400 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20  nverted) ){.    
23410 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
23420 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75  printf(nMax, zBu
23430 66 2c 20 22 25 73 22 2c 20 7a 44 69 72 29 3b 0a  f, "%s", zDir);.
23440 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23450 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
23460 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  d);.          br
23470 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
23480 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
23490 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
234a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
234b0 20 20 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64        zConverted
234c0 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
234d0 5a 65 72 6f 28 20 6e 4d 61 78 2b 31 20 29 3b 0a  Zero( nMax+1 );.
234e0 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f          if( !zCo
234f0 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20 20 20  nverted ){.     
23500 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
23510 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20  e(zBuf);.       
23520 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
23530 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
23540 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
23550 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20  \n"));.         
23560 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
23570 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
23580 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
23590 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61  ( cygwin_conv_pa
235a0 74 68 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  th(.            
235b0 20 20 20 20 6f 73 49 73 4e 54 28 29 20 3f 20 43      osIsNT() ? C
235c0 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f  CP_POSIX_TO_WIN_
235d0 57 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f  W : CCP_POSIX_TO
235e0 5f 57 49 4e 5f 41 2c 20 7a 44 69 72 2c 0a 20 20  _WIN_A, zDir,.  
235f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43                zC
23600 6f 6e 76 65 72 74 65 64 2c 20 6e 4d 61 78 2b 31  onverted, nMax+1
23610 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  )<0 ){.         
23620 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
23630 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
23640 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
23650 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20  e(zBuf);.       
23660 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
23670 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
23680 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50  LITE_IOERR_CONVP
23690 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  ATH\n"));.      
236a0 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
236b0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
236c0 45 52 52 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44  ERR_CONVPATH, (D
236d0 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20  WORD)errno,.    
236e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236f0 20 20 20 20 20 20 20 20 20 22 77 69 6e 47 65 74           "winGet
23700 54 65 6d 70 6e 61 6d 65 32 22 2c 20 7a 44 69 72  Tempname2", zDir
23710 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
23720 20 20 20 20 20 69 66 28 20 77 69 6e 49 73 44 69       if( winIsDi
23730 72 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b  r(zConverted) ){
23740 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74  .          /* At
23750 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20   this point, we 
23760 6b 6e 6f 77 20 74 68 65 20 63 61 6e 64 69 64 61  know the candida
23770 74 65 20 64 69 72 65 63 74 6f 72 79 20 65 78 69  te directory exi
23780 73 74 73 20 61 6e 64 20 73 68 6f 75 6c 64 0a 20  sts and should. 
23790 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 75           ** be u
237a0 73 65 64 2e 20 20 48 6f 77 65 76 65 72 2c 20 77  sed.  However, w
237b0 65 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 63 6f  e may need to co
237c0 6e 76 65 72 74 20 74 68 65 20 73 74 72 69 6e 67  nvert the string
237d0 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20   containing.    
237e0 20 20 20 20 20 20 2a 2a 20 69 74 73 20 6e 61 6d        ** its nam
237f0 65 20 69 6e 74 6f 20 55 54 46 2d 38 20 28 69 2e  e into UTF-8 (i.
23800 65 2e 20 69 66 20 69 74 20 69 73 20 55 54 46 2d  e. if it is UTF-
23810 31 36 20 72 69 67 68 74 20 6e 6f 77 29 2e 0a 20  16 right now).. 
23820 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
23830 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66        char *zUtf
23840 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f  8 = winConvertTo
23850 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 43 6f  Utf8Filename(zCo
23860 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
23870 20 20 20 20 69 66 28 20 21 7a 55 74 66 38 20 29      if( !zUtf8 )
23880 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
23890 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
238a0 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20  erted);.        
238b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
238c0 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20  (zBuf);.        
238d0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
238e0 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
238f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
23900 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20  M\n"));.        
23910 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
23920 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
23930 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23940 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
23950 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66  rintf(nMax, zBuf
23960 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a  , "%s", zUtf8);.
23970 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23980 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20  3_free(zUtf8);. 
23990 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
239a0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
239b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
239c0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
239d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
239e0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
239f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
23a00 7d 0a 23 65 6c 69 66 20 21 53 51 4c 49 54 45 5f  }.#elif !SQLITE_
23a10 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66  OS_WINRT && !def
23a20 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29  ined(__CYGWIN__)
23a30 0a 20 20 65 6c 73 65 20 69 66 28 20 6f 73 49 73  .  else if( osIs
23a40 4e 54 28 29 20 29 7b 0a 20 20 20 20 63 68 61 72  NT() ){.    char
23a50 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 4c 50   *zMulti;.    LP
23a60 57 53 54 52 20 7a 57 69 64 65 50 61 74 68 20 3d  WSTR zWidePath =
23a70 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
23a80 72 6f 28 20 6e 4d 61 78 2a 73 69 7a 65 6f 66 28  ro( nMax*sizeof(
23a90 57 43 48 41 52 29 20 29 3b 0a 20 20 20 20 69 66  WCHAR) );.    if
23aa0 28 20 21 7a 57 69 64 65 50 61 74 68 20 29 7b 0a  ( !zWidePath ){.
23ab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
23ac0 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
23ad0 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
23ae0 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
23af0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
23b00 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
23b10 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
23b20 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  MEM;.    }.    i
23b30 66 28 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68  f( osGetTempPath
23b40 57 28 6e 4d 61 78 2c 20 7a 57 69 64 65 50 61 74  W(nMax, zWidePat
23b50 68 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  h)==0 ){.      s
23b60 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64  qlite3_free(zWid
23b70 65 50 61 74 68 29 3b 0a 20 20 20 20 20 20 73 71  ePath);.      sq
23b80 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29  lite3_free(zBuf)
23b90 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
23ba0 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
23bb0 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
23bc0 47 45 54 54 45 4d 50 50 41 54 48 5c 6e 22 29 29  GETTEMPPATH\n"))
23bd0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  ;.      return w
23be0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
23bf0 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50  E_IOERR_GETTEMPP
23c00 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  ATH, osGetLastEr
23c10 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
23c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c30 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 32  "winGetTempname2
23c40 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ", 0);.    }.   
23c50 20 7a 4d 75 6c 74 69 20 3d 20 77 69 6e 55 6e 69   zMulti = winUni
23c60 63 6f 64 65 54 6f 55 74 66 38 28 7a 57 69 64 65  codeToUtf8(zWide
23c70 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a  Path);.    if( z
23c80 4d 75 6c 74 69 20 29 7b 0a 20 20 20 20 20 20 73  Multi ){.      s
23c90 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
23ca0 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22  nMax, zBuf, "%s"
23cb0 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20  , zMulti);.     
23cc0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
23cd0 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c  ulti);.      sql
23ce0 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 50  ite3_free(zWideP
23cf0 61 74 68 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ath);.    }else{
23d00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
23d10 72 65 65 28 7a 57 69 64 65 50 61 74 68 29 3b 0a  ree(zWidePath);.
23d20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
23d30 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
23d40 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
23d50 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
23d60 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
23d70 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
23d80 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
23d90 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  MEM;.    }.  }.#
23da0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
23db0 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
23dc0 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 55  se{.    char *zU
23dd0 74 66 38 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  tf8;.    char *z
23de0 4d 62 63 73 50 61 74 68 20 3d 20 73 71 6c 69 74  MbcsPath = sqlit
23df0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d  e3MallocZero( nM
23e00 61 78 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  ax );.    if( !z
23e10 4d 62 63 73 50 61 74 68 20 29 7b 0a 20 20 20 20  MbcsPath ){.    
23e20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
23e30 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  Buf);.      OSTR
23e40 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
23e50 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  AME rc=SQLITE_IO
23e60 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a  ERR_NOMEM\n"));.
23e70 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
23e80 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
23e90 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
23ea0 73 47 65 74 54 65 6d 70 50 61 74 68 41 28 6e 4d  sGetTempPathA(nM
23eb0 61 78 2c 20 7a 4d 62 63 73 50 61 74 68 29 3d 3d  ax, zMbcsPath)==
23ec0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
23ed0 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20  e3_free(zBuf);. 
23ee0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
23ef0 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
23f00 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54  SQLITE_IOERR_GET
23f10 54 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20  TEMPPATH\n"));. 
23f20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
23f30 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
23f40 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48  OERR_GETTEMPPATH
23f50 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
23f60 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
23f70 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
23f80 6e 47 65 74 54 65 6d 70 6e 61 6d 65 33 22 2c 20  nGetTempname3", 
23f90 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55  0);.    }.    zU
23fa0 74 66 38 20 3d 20 73 71 6c 69 74 65 33 5f 77 69  tf8 = sqlite3_wi
23fb0 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38  n32_mbcs_to_utf8
23fc0 28 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20 20 20  (zMbcsPath);.   
23fd0 20 69 66 28 20 7a 55 74 66 38 20 29 7b 0a 20 20   if( zUtf8 ){.  
23fe0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
23ff0 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c  intf(nMax, zBuf,
24000 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20   "%s", zUtf8);. 
24010 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
24020 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 7d 65  e(zUtf8);.    }e
24030 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
24040 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20  e3_free(zBuf);. 
24050 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
24060 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
24070 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
24080 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72  EM\n"));.      r
24090 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
240a0 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  RR_NOMEM;.    }.
240b0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
240c0 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
240d0 4e 53 49 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  NSI */.#endif /*
240e0 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
240f0 54 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  T */..  /*.  ** 
24100 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  Check to make su
24110 72 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  re the temporary
24120 20 64 69 72 65 63 74 6f 72 79 20 65 6e 64 73 20   directory ends 
24130 77 69 74 68 20 61 6e 20 61 70 70 72 6f 70 72 69  with an appropri
24140 61 74 65 0a 20 20 2a 2a 20 73 65 70 61 72 61 74  ate.  ** separat
24150 6f 72 2e 20 20 49 66 20 69 74 20 64 6f 65 73 20  or.  If it does 
24160 6e 6f 74 20 61 6e 64 20 74 68 65 72 65 20 69 73  not and there is
24170 20 6e 6f 74 20 65 6e 6f 75 67 68 20 73 70 61 63   not enough spac
24180 65 20 6c 65 66 74 20 74 6f 20 61 64 64 0a 20 20  e left to add.  
24190 2a 2a 20 6f 6e 65 2c 20 66 61 69 6c 2e 0a 20 20  ** one, fail..  
241a0 2a 2f 0a 20 20 69 66 28 20 21 77 69 6e 4d 61 6b  */.  if( !winMak
241b0 65 45 6e 64 49 6e 44 69 72 53 65 70 28 6e 44 69  eEndInDirSep(nDi
241c0 72 2b 31 2c 20 7a 42 75 66 29 20 29 7b 0a 20 20  r+1, zBuf) ){.  
241d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
241e0 42 75 66 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  Buf);.    OSTRAC
241f0 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
24200 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f  E rc=SQLITE_ERRO
24210 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 74 75  R\n"));.    retu
24220 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
24230 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20  QLITE_ERROR, 0, 
24240 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 34  "winGetTempname4
24250 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ", 0);.  }..  /*
24260 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74 68 61 74  .  ** Check that
24270 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
24280 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  er is large enou
24290 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f  gh for the tempo
242a0 72 61 72 79 20 66 69 6c 65 0a 20 20 2a 2a 20 6e  rary file.  ** n
242b0 61 6d 65 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ame in the follo
242c0 77 69 6e 67 20 66 6f 72 6d 61 74 3a 0a 20 20 2a  wing format:.  *
242d0 2a 0a 20 20 2a 2a 20 20 20 22 3c 74 65 6d 70 6f  *.  **   "<tempo
242e0 72 61 72 79 5f 64 69 72 65 63 74 6f 72 79 3e 2f  rary_directory>/
242f0 65 74 69 6c 71 73 5f 58 58 58 58 58 58 58 58 58  etilqs_XXXXXXXXX
24300 58 58 58 58 58 58 5c 30 5c 30 22 0a 20 20 2a 2a  XXXXXX\0\0".  **
24310 0a 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 72 65  .  ** If not, re
24320 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
24330 52 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 31  R.  The number 1
24340 37 20 69 73 20 75 73 65 64 20 68 65 72 65 20 69  7 is used here i
24350 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20  n order to.  ** 
24360 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20  account for the 
24370 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68  space used by th
24380 65 20 31 35 20 63 68 61 72 61 63 74 65 72 20 72  e 15 character r
24390 61 6e 64 6f 6d 20 73 75 66 66 69 78 20 61 6e 64  andom suffix and
243a0 20 74 68 65 0a 20 20 2a 2a 20 74 77 6f 20 74 72   the.  ** two tr
243b0 61 69 6c 69 6e 67 20 4e 55 4c 20 63 68 61 72 61  ailing NUL chara
243c0 63 74 65 72 73 2e 20 20 54 68 65 20 66 69 6e 61  cters.  The fina
243d0 6c 20 64 69 72 65 63 74 6f 72 79 20 73 65 70 61  l directory sepa
243e0 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 0a  rator character.
243f0 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79    ** has already
24400 20 61 64 64 65 64 20 69 66 20 69 74 20 77 61 73   added if it was
24410 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 70 72 65   not already pre
24420 73 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 4c 65  sent..  */.  nLe
24430 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
24440 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 69 66 28  n30(zBuf);.  if(
24450 20 28 6e 4c 65 6e 20 2b 20 6e 50 72 65 20 2b 20   (nLen + nPre + 
24460 31 37 29 20 3e 20 6e 42 75 66 20 29 7b 0a 20 20  17) > nBuf ){.  
24470 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
24480 42 75 66 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  Buf);.    OSTRAC
24490 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
244a0 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f  E rc=SQLITE_ERRO
244b0 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 74 75  R\n"));.    retu
244c0 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
244d0 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20  QLITE_ERROR, 0, 
244e0 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 35  "winGetTempname5
244f0 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  ", 0);.  }..  sq
24500 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
24510 42 75 66 2d 31 36 2d 6e 4c 65 6e 2c 20 7a 42 75  Buf-16-nLen, zBu
24520 66 2b 6e 4c 65 6e 2c 20 53 51 4c 49 54 45 5f 54  f+nLen, SQLITE_T
24530 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29  EMP_FILE_PREFIX)
24540 3b 0a 0a 20 20 6a 20 3d 20 73 71 6c 69 74 65 33  ;..  j = sqlite3
24550 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a  Strlen30(zBuf);.
24560 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
24570 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a  ness(15, &zBuf[j
24580 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ]);.  for(i=0; i
24590 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a  <15; i++, j++){.
245a0 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63      zBuf[j] = (c
245b0 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e  har)zChars[ ((un
245c0 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66  signed char)zBuf
245d0 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68  [j])%(sizeof(zCh
245e0 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 7d 0a 20  ars)-1) ];.  }. 
245f0 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20   zBuf[j] = 0;.  
24600 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 20  zBuf[j+1] = 0;. 
24610 20 2a 70 7a 42 75 66 20 3d 20 7a 42 75 66 3b 0a   *pzBuf = zBuf;.
24620 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d  .  OSTRACE(("TEM
24630 50 2d 46 49 4c 45 4e 41 4d 45 20 6e 61 6d 65 3d  P-FILENAME name=
24640 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %s, rc=SQLITE_OK
24650 5c 6e 22 2c 20 7a 42 75 66 29 29 3b 0a 20 20 72  \n", zBuf));.  r
24660 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24670 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
24680 20 54 52 55 45 20 69 66 20 74 68 65 20 6e 61 6d   TRUE if the nam
24690 65 64 20 66 69 6c 65 20 69 73 20 72 65 61 6c 6c  ed file is reall
246a0 79 20 61 20 64 69 72 65 63 74 6f 72 79 2e 20 20  y a directory.  
246b0 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 0a  Return false if.
246c0 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 68 69  ** it is somethi
246d0 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  ng other than a 
246e0 64 69 72 65 63 74 6f 72 79 2c 20 6f 72 20 69 66  directory, or if
246f0 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69   there is any ki
24700 6e 64 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20  nd of memory.** 
24710 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75  allocation failu
24720 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
24730 74 20 77 69 6e 49 73 44 69 72 28 63 6f 6e 73 74  t winIsDir(const
24740 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
24750 64 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74 72  d){.  DWORD attr
24760 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
24770 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
24780 6f 3b 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e 54  o;..  if( osIsNT
24790 28 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e  () ){.    int cn
247a0 74 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33 32  t = 0;.    WIN32
247b0 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f  _FILE_ATTRIBUTE_
247c0 44 41 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a  DATA sAttrData;.
247d0 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74      memset(&sAtt
247e0 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66  rData, 0, sizeof
247f0 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20  (sAttrData));.  
24800 20 20 77 68 69 6c 65 28 20 21 28 72 63 20 3d 20    while( !(rc = 
24810 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
24820 74 65 73 45 78 57 28 28 4c 50 43 57 53 54 52 29  tesExW((LPCWSTR)
24830 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20  zConverted,.    
24840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24850 20 20 20 20 20 20 20 20 20 47 65 74 46 69 6c 65           GetFile
24860 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a  ExInfoStandard,.
24870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24880 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 41               &sA
24890 74 74 72 44 61 74 61 29 29 20 26 26 20 77 69 6e  ttrData)) && win
248a0 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  RetryIoerr(&cnt,
248b0 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d   &lastErrno) ){}
248c0 0a 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a  .    if( !rc ){.
248d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
248e0 2f 2a 20 49 6e 76 61 6c 69 64 20 6e 61 6d 65 3f  /* Invalid name?
248f0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 61 74   */.    }.    at
24900 74 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64  tr = sAttrData.d
24910 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b  wFileAttributes;
24920 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
24930 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b  INCE==0.  }else{
24940 0a 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65  .    attr = osGe
24950 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
24960 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74  ((char*)zConvert
24970 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  ed);.#endif.  }.
24980 20 20 72 65 74 75 72 6e 20 28 61 74 74 72 21 3d    return (attr!=
24990 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
249a0 52 49 42 55 54 45 53 29 20 26 26 20 28 61 74 74  RIBUTES) && (att
249b0 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  r&FILE_ATTRIBUTE
249c0 5f 44 49 52 45 43 54 4f 52 59 29 3b 0a 7d 0a 0a  _DIRECTORY);.}..
249d0 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c  /*.** Open a fil
249e0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
249f0 20 77 69 6e 4f 70 65 6e 28 0a 20 20 73 71 6c 69   winOpen(.  sqli
24a00 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
24a10 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
24a20 20 67 65 74 20 6d 61 78 69 6d 75 6d 20 70 61 74   get maximum pat
24a30 68 20 6e 61 6d 65 20 6c 65 6e 67 74 68 20 2a 2f  h name length */
24a40 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
24a50 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Name,        /* 
24a60 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
24a70 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71   (UTF-8) */.  sq
24a80 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
24a90 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
24aa0 20 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65   the SQLite file
24ab0 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a   handle here */.
24ac0 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
24ad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
24ae0 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67 73 20 2a  pen mode flags *
24af0 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61  /.  int *pOutFla
24b00 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
24b10 20 53 74 61 74 75 73 20 72 65 74 75 72 6e 20 66   Status return f
24b20 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 48 41 4e  lags */.){.  HAN
24b30 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52 44 20 6c  DLE h;.  DWORD l
24b40 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20  astErrno = 0;.  
24b50 44 57 4f 52 44 20 64 77 44 65 73 69 72 65 64 41  DWORD dwDesiredA
24b60 63 63 65 73 73 3b 0a 20 20 44 57 4f 52 44 20 64  ccess;.  DWORD d
24b70 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20 20 44 57  wShareMode;.  DW
24b80 4f 52 44 20 64 77 43 72 65 61 74 69 6f 6e 44 69  ORD dwCreationDi
24b90 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 44 57 4f  sposition;.  DWO
24ba0 52 44 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74  RD dwFlagsAndAtt
24bb0 72 69 62 75 74 65 73 20 3d 20 30 3b 0a 23 69 66  ributes = 0;.#if
24bc0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
24bd0 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20 3d 20  .  int isTemp = 
24be0 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46  0;.#endif.  winF
24bf0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
24c00 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 76 6f 69  nFile*)id;.  voi
24c10 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 20 20  d *zConverted;  
24c20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
24c30 69 6c 65 6e 61 6d 65 20 69 6e 20 4f 53 20 65 6e  ilename in OS en
24c40 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73  coding */.  cons
24c50 74 20 63 68 61 72 20 2a 7a 55 74 66 38 4e 61 6d  t char *zUtf8Nam
24c60 65 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a 20 46 69  e = zName; /* Fi
24c70 6c 65 6e 61 6d 65 20 69 6e 20 55 54 46 2d 38 20  lename in UTF-8 
24c80 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e  encoding */.  in
24c90 74 20 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  t cnt = 0;..  /*
24ca0 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61   If argument zPa
24cb0 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  th is a NULL poi
24cc0 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74  nter, this funct
24cd0 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20  ion is required 
24ce0 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74  to open.  ** a t
24cf0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55  emporary file. U
24d00 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74  se this buffer t
24d10 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65  o store the file
24d20 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20   name in..  */. 
24d30 20 63 68 61 72 20 2a 7a 54 6d 70 6e 61 6d 65 20   char *zTmpname 
24d40 3d 20 30 3b 20 2f 2a 20 46 6f 72 20 74 65 6d 70  = 0; /* For temp
24d50 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 2c 20  orary filename, 
24d60 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 2a 2f  if necessary. */
24d70 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ..  int rc = SQL
24d80 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
24d90 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52     /* Function R
24da0 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 23 69  eturn Code */.#i
24db0 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
24dc0 47 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f  G) || SQLITE_OS_
24dd0 57 49 4e 43 45 0a 20 20 69 6e 74 20 65 54 79 70  WINCE.  int eTyp
24de0 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46  e = flags&0xFFFF
24df0 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f  FF00;  /* Type o
24e00 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  f file to open *
24e10 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e 74 20  /.#endif..  int 
24e20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28  isExclusive  = (
24e30 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
24e40 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a  PEN_EXCLUSIVE);.
24e50 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20    int isDelete  
24e60 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
24e70 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
24e80 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20  ONCLOSE);.  int 
24e90 69 73 43 72 65 61 74 65 20 20 20 20 20 3d 20 28  isCreate     = (
24ea0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
24eb0 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69  PEN_CREATE);.  i
24ec0 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20  nt isReadonly   
24ed0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
24ee0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
24ef0 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57 72  ;.  int isReadWr
24f00 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ite  = (flags & 
24f10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
24f20 57 52 49 54 45 29 3b 0a 0a 23 69 66 6e 64 65 66  WRITE);..#ifndef
24f30 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 69 73   NDEBUG.  int is
24f40 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 69  OpenJournal = (i
24f50 73 43 72 65 61 74 65 20 26 26 20 28 0a 20 20 20  sCreate && (.   
24f60 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c 49       eType==SQLI
24f70 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
24f80 4f 55 52 4e 41 4c 0a 20 20 20 20 20 7c 7c 20 65  OURNAL.     || e
24f90 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
24fa0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 0a 20  N_MAIN_JOURNAL. 
24fb0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
24fc0 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20  LITE_OPEN_WAL.  
24fd0 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53  ));.#endif..  OS
24fe0 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d  TRACE(("OPEN nam
24ff0 65 3d 25 73 2c 20 70 46 69 6c 65 3d 25 70 2c 20  e=%s, pFile=%p, 
25000 66 6c 61 67 73 3d 25 78 2c 20 70 4f 75 74 46 6c  flags=%x, pOutFl
25010 61 67 73 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20  ags=%p\n",.     
25020 20 20 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 2c        zUtf8Name,
25030 20 69 64 2c 20 66 6c 61 67 73 2c 20 70 4f 75 74   id, flags, pOut
25040 46 6c 61 67 73 29 29 3b 0a 0a 20 20 2f 2a 20 43  Flags));..  /* C
25050 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69  heck the followi
25060 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  ng statements ar
25070 65 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a  e true:.  **.  *
25080 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c 79 20  *   (a) Exactly 
25090 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44 57  one of the READW
250a0 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c  RITE and READONL
250b0 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20  Y flags must be 
250c0 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20  set, and.  **   
250d0 28 62 29 20 69 66 20 43 52 45 41 54 45 20 69 73  (b) if CREATE is
250e0 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57   set, then READW
250f0 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  RITE must also b
25100 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20  e set, and.  ** 
25110 20 20 28 63 29 20 69 66 20 45 58 43 4c 55 53 49    (c) if EXCLUSI
25120 56 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  VE is set, then 
25130 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f  CREATE must also
25140 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20   be set..  **   
25150 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43  (d) if DELETEONC
25160 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68 65  LOSE is set, the
25170 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c  n CREATE must al
25180 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a  so be set..  */.
25190 20 20 61 73 73 65 72 74 28 28 69 73 52 65 61 64    assert((isRead
251a0 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61  only==0 || isRea
251b0 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69  dWrite==0) && (i
251c0 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73  sReadWrite || is
251d0 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73  Readonly));.  as
251e0 73 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30  sert(isCreate==0
251f0 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 29   || isReadWrite)
25200 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45 78 63  ;.  assert(isExc
25210 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43  lusive==0 || isC
25220 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74  reate);.  assert
25230 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20  (isDelete==0 || 
25240 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a  isCreate);..  /*
25250 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61   The main DB, ma
25260 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20  in journal, WAL 
25270 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65 72 20  file and master 
25280 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65  journal are neve
25290 72 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63  r.  ** automatic
252a0 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f  ally deleted. No
252b0 72 20 61 72 65 20 74 68 65 79 20 65 76 65 72 20  r are they ever 
252c0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
252d0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
252e0 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
252f0 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
25300 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
25310 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  B );.  assert( (
25320 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
25330 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
25340 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
25350 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65  OURNAL );.  asse
25360 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
25370 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
25380 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
25390 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b  ASTER_JOURNAL );
253a0 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
253b0 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
253c0 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
253d0 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20  _OPEN_WAL );..  
253e0 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
253f0 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 68  he upper layer h
25400 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68  as set one of th
25410 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c  e "file-type" fl
25420 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ags. */.  assert
25430 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
25440 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20  OPEN_MAIN_DB    
25450 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
25460 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 0a  TE_OPEN_TEMP_DB.
25470 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
25480 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
25490 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79  N_JOURNAL || eTy
254a0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
254b0 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20  TEMP_JOURNAL.   
254c0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
254d0 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
254e0 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d  RNAL   || eType=
254f0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
25500 54 45 52 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20  TER_JOURNAL.    
25510 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
25520 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45  ITE_OPEN_TRANSIE
25530 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d  NT_DB || eType==
25540 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a  SQLITE_OPEN_WAL.
25550 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20    );..  assert( 
25560 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 6d 65  pFile!=0 );.  me
25570 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73  mset(pFile, 0, s
25580 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 29 3b  izeof(winFile));
25590 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 49 4e  .  pFile->h = IN
255a0 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
255b0 55 45 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  UE;..#if SQLITE_
255c0 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 21  OS_WINRT.  if( !
255d0 7a 55 74 66 38 4e 61 6d 65 20 26 26 20 21 73 71  zUtf8Name && !sq
255e0 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
255f0 74 6f 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  tory ){.    sqli
25600 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 45  te3_log(SQLITE_E
25610 52 52 4f 52 2c 0a 20 20 20 20 20 20 20 20 22 73  RROR,.        "s
25620 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
25630 63 74 6f 72 79 20 76 61 72 69 61 62 6c 65 20 73  ctory variable s
25640 68 6f 75 6c 64 20 62 65 20 73 65 74 20 66 6f 72  hould be set for
25650 20 57 69 6e 52 54 22 29 3b 0a 20 20 7d 0a 23 65   WinRT");.  }.#e
25660 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
25670 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
25680 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
25690 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 67 65 6e 65  on is NULL, gene
256a0 72 61 74 65 20 61 0a 20 20 2a 2a 20 74 65 6d 70  rate a.  ** temp
256b0 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20  orary file name 
256c0 74 6f 20 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66  to use.  */.  if
256d0 28 20 21 7a 55 74 66 38 4e 61 6d 65 20 29 7b 0a  ( !zUtf8Name ){.
256e0 20 20 20 20 61 73 73 65 72 74 28 20 69 73 44 65      assert( isDe
256f0 6c 65 74 65 20 26 26 20 21 69 73 4f 70 65 6e 4a  lete && !isOpenJ
25700 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 72 63  ournal );.    rc
25710 20 3d 20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d   = winGetTempnam
25720 65 28 70 56 66 73 2c 20 26 7a 54 6d 70 6e 61 6d  e(pVfs, &zTmpnam
25730 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
25740 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25750 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45     OSTRACE(("OPE
25760 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73  N name=%s, rc=%s
25770 22 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 20 73 71  ", zUtf8Name, sq
25780 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
25790 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
257a0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a   rc;.    }.    z
257b0 55 74 66 38 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e  Utf8Name = zTmpn
257c0 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ame;.  }..  /* D
257d0 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  atabase filename
257e0 73 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72  s are double-zer
257f0 6f 20 74 65 72 6d 69 6e 61 74 65 64 20 69 66 20  o terminated if 
25800 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 20 20 2a  they are not.  *
25810 2a 20 55 52 49 73 20 77 69 74 68 20 70 61 72 61  * URIs with para
25820 6d 65 74 65 72 73 2e 20 20 48 65 6e 63 65 2c 20  meters.  Hence, 
25830 74 68 65 79 20 63 61 6e 20 61 6c 77 61 79 73 20  they can always 
25840 62 65 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20  be passed into. 
25850 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69 5f   ** sqlite3_uri_
25860 70 61 72 61 6d 65 74 65 72 28 29 2e 0a 20 20 2a  parameter()..  *
25870 2f 0a 20 20 61 73 73 65 72 74 28 20 28 65 54 79  /.  assert( (eTy
25880 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
25890 4d 41 49 4e 5f 44 42 29 20 7c 7c 20 28 66 6c 61  MAIN_DB) || (fla
258a0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
258b0 5f 55 52 49 29 20 7c 7c 0a 20 20 20 20 20 20 20  _URI) ||.       
258c0 7a 55 74 66 38 4e 61 6d 65 5b 73 71 6c 69 74 65  zUtf8Name[sqlite
258d0 33 53 74 72 6c 65 6e 33 30 28 7a 55 74 66 38 4e  3Strlen30(zUtf8N
258e0 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20  ame)+1]==0 );.. 
258f0 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
25900 66 69 6c 65 6e 61 6d 65 20 74 6f 20 74 68 65 20  filename to the 
25910 73 79 73 74 65 6d 20 65 6e 63 6f 64 69 6e 67 2e  system encoding.
25920 20 2a 2f 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64   */.  zConverted
25930 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f   = winConvertFro
25940 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 55  mUtf8Filename(zU
25950 74 66 38 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  tf8Name);.  if( 
25960 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
25970 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
25980 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20  e(zTmpname);.   
25990 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
259a0 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49  name=%s, rc=SQLI
259b0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22 2c  TE_IOERR_NOMEM",
259c0 20 7a 55 74 66 38 4e 61 6d 65 29 29 3b 0a 20 20   zUtf8Name));.  
259d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
259e0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  IOERR_NOMEM;.  }
259f0 0a 0a 20 20 69 66 28 20 77 69 6e 49 73 44 69 72  ..  if( winIsDir
25a00 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a  (zConverted) ){.
25a10 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
25a20 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
25a30 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
25a40 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53  Tmpname);.    OS
25a50 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d  TRACE(("OPEN nam
25a60 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%s, rc=SQLITE_
25a70 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 22 2c  CANTOPEN_ISDIR",
25a80 20 7a 55 74 66 38 4e 61 6d 65 29 29 3b 0a 20 20   zUtf8Name));.  
25a90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25aa0 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 3b 0a  CANTOPEN_ISDIR;.
25ab0 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52 65 61    }..  if( isRea
25ac0 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20 64 77  dWrite ){.    dw
25ad0 44 65 73 69 72 65 64 41 63 63 65 73 73 20 3d 20  DesiredAccess = 
25ae0 47 45 4e 45 52 49 43 5f 52 45 41 44 20 7c 20 47  GENERIC_READ | G
25af0 45 4e 45 52 49 43 5f 57 52 49 54 45 3b 0a 20 20  ENERIC_WRITE;.  
25b00 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 44 65 73  }else{.    dwDes
25b10 69 72 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e  iredAccess = GEN
25b20 45 52 49 43 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a  ERIC_READ;.  }..
25b30 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e    /* SQLITE_OPEN
25b40 5f 45 58 43 4c 55 53 49 56 45 20 69 73 20 75 73  _EXCLUSIVE is us
25b50 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
25b60 74 68 61 74 20 61 20 6e 65 77 20 66 69 6c 65 20  that a new file 
25b70 69 73 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 2e  is.  ** created.
25b80 20 53 51 4c 69 74 65 20 64 6f 65 73 6e 27 74 20   SQLite doesn't 
25b90 75 73 65 20 69 74 20 74 6f 20 69 6e 64 69 63 61  use it to indica
25ba0 74 65 20 22 65 78 63 6c 75 73 69 76 65 20 61 63  te "exclusive ac
25bb0 63 65 73 73 22 0a 20 20 2a 2a 20 61 73 20 69 74  cess".  ** as it
25bc0 20 69 73 20 75 73 75 61 6c 6c 79 20 75 6e 64 65   is usually unde
25bd0 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20 69  rstood..  */.  i
25be0 66 28 20 69 73 45 78 63 6c 75 73 69 76 65 20 29  f( isExclusive )
25bf0 7b 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 73  {.    /* Creates
25c00 20 61 20 6e 65 77 20 66 69 6c 65 2c 20 6f 6e 6c   a new file, onl
25c10 79 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  y if it does not
25c20 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 20   already exist. 
25c30 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  */.    /* If the
25c40 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 69 74   file exists, it
25c50 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 64   fails. */.    d
25c60 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
25c70 74 69 6f 6e 20 3d 20 43 52 45 41 54 45 5f 4e 45  tion = CREATE_NE
25c80 57 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69  W;.  }else if( i
25c90 73 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20 2f  sCreate ){.    /
25ca0 2a 20 4f 70 65 6e 20 65 78 69 73 74 69 6e 67 20  * Open existing 
25cb0 66 69 6c 65 2c 20 6f 72 20 63 72 65 61 74 65 20  file, or create 
25cc0 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20 65 78  if it doesn't ex
25cd0 69 73 74 20 2a 2f 0a 20 20 20 20 64 77 43 72 65  ist */.    dwCre
25ce0 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
25cf0 20 3d 20 4f 50 45 4e 5f 41 4c 57 41 59 53 3b 0a   = OPEN_ALWAYS;.
25d00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
25d10 4f 70 65 6e 73 20 61 20 66 69 6c 65 2c 20 6f 6e  Opens a file, on
25d20 6c 79 20 69 66 20 69 74 20 65 78 69 73 74 73 2e  ly if it exists.
25d30 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69   */.    dwCreati
25d40 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20  onDisposition = 
25d50 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47 3b 0a 20  OPEN_EXISTING;. 
25d60 20 7d 0a 0a 20 20 64 77 53 68 61 72 65 4d 6f 64   }..  dwShareMod
25d70 65 20 3d 20 46 49 4c 45 5f 53 48 41 52 45 5f 52  e = FILE_SHARE_R
25d80 45 41 44 20 7c 20 46 49 4c 45 5f 53 48 41 52 45  EAD | FILE_SHARE
25d90 5f 57 52 49 54 45 3b 0a 0a 20 20 69 66 28 20 69  _WRITE;..  if( i
25da0 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 53  sDelete ){.#if S
25db0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
25dc0 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
25dd0 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41  ributes = FILE_A
25de0 54 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e 3b  TTRIBUTE_HIDDEN;
25df0 0a 20 20 20 20 69 73 54 65 6d 70 20 3d 20 31 3b  .    isTemp = 1;
25e00 0a 23 65 6c 73 65 0a 20 20 20 20 64 77 46 6c 61  .#else.    dwFla
25e10 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
25e20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  = FILE_ATTRIBUTE
25e30 5f 54 45 4d 50 4f 52 41 52 59 0a 20 20 20 20 20  _TEMPORARY.     
25e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e50 20 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45            | FILE
25e60 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44 44 45  _ATTRIBUTE_HIDDE
25e70 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N.              
25e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e90 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 44 45 4c   | FILE_FLAG_DEL
25ea0 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65  ETE_ON_CLOSE;.#e
25eb0 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
25ec0 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
25ed0 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54  ibutes = FILE_AT
25ee0 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a  TRIBUTE_NORMAL;.
25ef0 20 20 7d 0a 20 20 2f 2a 20 52 65 70 6f 72 74 73    }.  /* Reports
25f00 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e   from the intern
25f10 65 74 20 61 72 65 20 74 68 61 74 20 70 65 72 66  et are that perf
25f20 6f 72 6d 61 6e 63 65 20 69 73 20 61 6c 77 61 79  ormance is alway
25f30 73 0a 20 20 2a 2a 20 62 65 74 74 65 72 20 69 66  s.  ** better if
25f40 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f   FILE_FLAG_RANDO
25f50 4d 5f 41 43 43 45 53 53 20 69 73 20 75 73 65 64  M_ACCESS is used
25f60 2e 20 20 54 69 63 6b 65 74 20 23 32 36 39 39 2e  .  Ticket #2699.
25f70 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   */.#if SQLITE_O
25f80 53 5f 57 49 4e 43 45 0a 20 20 64 77 46 6c 61 67  S_WINCE.  dwFlag
25f90 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 7c  sAndAttributes |
25fa0 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44  = FILE_FLAG_RAND
25fb0 4f 4d 5f 41 43 43 45 53 53 3b 0a 23 65 6e 64 69  OM_ACCESS;.#endi
25fc0 66 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28  f..  if( osIsNT(
25fd0 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ) ){.#if SQLITE_
25fe0 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 43 52 45  OS_WINRT.    CRE
25ff0 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45  ATEFILE2_EXTENDE
26000 44 5f 50 41 52 41 4d 45 54 45 52 53 20 65 78 74  D_PARAMETERS ext
26010 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 3b  endedParameters;
26020 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72  .    extendedPar
26030 61 6d 65 74 65 72 73 2e 64 77 53 69 7a 65 20 3d  ameters.dwSize =
26040 20 73 69 7a 65 6f 66 28 43 52 45 41 54 45 46 49   sizeof(CREATEFI
26050 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41 52  LE2_EXTENDED_PAR
26060 41 4d 45 54 45 52 53 29 3b 0a 20 20 20 20 65 78  AMETERS);.    ex
26070 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73  tendedParameters
26080 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65  .dwFileAttribute
26090 73 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  s =.            
260a0 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
260b0 75 74 65 73 20 26 20 46 49 4c 45 5f 41 54 54 52  utes & FILE_ATTR
260c0 49 42 55 54 45 5f 4d 41 53 4b 3b 0a 20 20 20 20  IBUTE_MASK;.    
260d0 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65  extendedParamete
260e0 72 73 2e 64 77 46 69 6c 65 46 6c 61 67 73 20 3d  rs.dwFileFlags =
260f0 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
26100 62 75 74 65 73 20 26 20 46 49 4c 45 5f 46 4c 41  butes & FILE_FLA
26110 47 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74 65  G_MASK;.    exte
26120 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64  ndedParameters.d
26130 77 53 65 63 75 72 69 74 79 51 6f 73 46 6c 61 67  wSecurityQosFlag
26140 73 20 3d 20 53 45 43 55 52 49 54 59 5f 41 4e 4f  s = SECURITY_ANO
26150 4e 59 4d 4f 55 53 3b 0a 20 20 20 20 65 78 74 65  NYMOUS;.    exte
26160 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 6c  ndedParameters.l
26170 70 53 65 63 75 72 69 74 79 41 74 74 72 69 62 75  pSecurityAttribu
26180 74 65 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  tes = NULL;.    
26190 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65  extendedParamete
261a0 72 73 2e 68 54 65 6d 70 6c 61 74 65 46 69 6c 65  rs.hTemplateFile
261b0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 77 68 69   = NULL;.    whi
261c0 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74  le( (h = osCreat
261d0 65 46 69 6c 65 32 28 28 4c 50 43 57 53 54 52 29  eFile2((LPCWSTR)
261e0 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20  zConverted,.    
261f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26200 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69            dwDesi
26210 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20  redAccess,.     
26220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26230 20 20 20 20 20 20 20 20 20 64 77 53 68 61 72 65           dwShare
26240 4d 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Mode,.          
26250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26260 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69      dwCreationDi
26270 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20  sposition,.     
26280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26290 20 20 20 20 20 20 20 20 20 26 65 78 74 65 6e 64           &extend
262a0 65 64 50 61 72 61 6d 65 74 65 72 73 29 29 3d 3d  edParameters))==
262b0 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
262c0 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20 20 20  ALUE &&.        
262d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262e0 20 20 20 20 20 20 77 69 6e 52 65 74 72 79 49 6f        winRetryIo
262f0 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
26300 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  rrno) ){.       
26310 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20          /* Noop 
26320 2a 2f 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  */.    }.#else. 
26330 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20 6f     while( (h = o
26340 73 43 72 65 61 74 65 46 69 6c 65 57 28 28 4c 50  sCreateFileW((LP
26350 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
26360 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
26370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26380 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c  dwDesiredAccess,
26390 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
263a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
263b0 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c  wShareMode, NULL
263c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
263d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263e0 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
263f0 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20  ition,.         
26400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26410 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41       dwFlagsAndA
26420 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20 20 20  ttributes,.     
26430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26440 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d           NULL))=
26450 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
26460 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20 20  VALUE &&.       
26470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26480 20 20 20 20 20 20 20 77 69 6e 52 65 74 72 79 49         winRetryI
26490 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74  oerr(&cnt, &last
264a0 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20  Errno) ){.      
264b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70           /* Noop
264c0 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   */.    }.#endif
264d0 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
264e0 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
264f0 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 77 68  I.  else{.    wh
26500 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61  ile( (h = osCrea
26510 74 65 46 69 6c 65 41 28 28 4c 50 43 53 54 52 29  teFileA((LPCSTR)
26520 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20  zConverted,.    
26530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26540 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69            dwDesi
26550 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20  redAccess,.     
26560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26570 20 20 20 20 20 20 20 20 20 64 77 53 68 61 72 65           dwShare
26580 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20  Mode, NULL,.    
26590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265a0 20 20 20 20 20 20 20 20 20 20 64 77 43 72 65 61            dwCrea
265b0 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c  tionDisposition,
265c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
265d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
265e0 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
265f0 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tes,.           
26600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26610 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c     NULL))==INVAL
26620 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
26630 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
26640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26650 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26   winRetryIoerr(&
26660 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  cnt, &lastErrno)
26670 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26680 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20     /* Noop */.  
26690 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
266a0 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74   winLogIoerr(cnt
266b0 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 0a 20 20  , __LINE__);..  
266c0 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 66  OSTRACE(("OPEN f
266d0 69 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d 25 73 2c  ile=%p, name=%s,
266e0 20 61 63 63 65 73 73 3d 25 6c 78 2c 20 72 63 3d   access=%lx, rc=
266f0 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66 38 4e  %s\n", h, zUtf8N
26700 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
26710 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c  dwDesiredAccess,
26720 20 28 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e   (h==INVALID_HAN
26730 44 4c 45 5f 56 41 4c 55 45 29 20 3f 20 22 66 61  DLE_VALUE) ? "fa
26740 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a  iled" : "ok"));.
26750 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49  .  if( h==INVALI
26760 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
26770 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
26780 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
26790 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72  no;.    winLogEr
267a0 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
267b0 50 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  PEN, pFile->last
267c0 45 72 72 6e 6f 2c 20 22 77 69 6e 4f 70 65 6e 22  Errno, "winOpen"
267d0 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20  , zUtf8Name);.  
267e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
267f0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
26800 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d  sqlite3_free(zTm
26810 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pname);.    if( 
26820 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20 21  isReadWrite && !
26830 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20  isExclusive ){. 
26840 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4f       return winO
26850 70 65 6e 28 70 56 66 73 2c 20 7a 4e 61 6d 65 2c  pen(pVfs, zName,
26860 20 69 64 2c 0a 20 20 20 20 20 20 20 20 20 28 28   id,.         ((
26870 66 6c 61 67 73 7c 53 51 4c 49 54 45 5f 4f 50 45  flags|SQLITE_OPE
26880 4e 5f 52 45 41 44 4f 4e 4c 59 29 20 26 0a 20 20  N_READONLY) &.  
26890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268a0 20 20 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e     ~(SQLITE_OPEN
268b0 5f 43 52 45 41 54 45 7c 53 51 4c 49 54 45 5f 4f  _CREATE|SQLITE_O
268c0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 29 2c  PEN_READWRITE)),
268d0 0a 20 20 20 20 20 20 20 20 20 70 4f 75 74 46 6c  .         pOutFl
268e0 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ags);.    }else{
268f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
26900 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
26910 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  PT;.    }.  }.. 
26920 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29   if( pOutFlags )
26930 7b 0a 20 20 20 20 69 66 28 20 69 73 52 65 61 64  {.    if( isRead
26940 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 2a  Write ){.      *
26950 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49  pOutFlags = SQLI
26960 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
26970 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  E;.    }else{.  
26980 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d      *pOutFlags =
26990 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
269a0 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d  DONLY;.    }.  }
269b0 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50  ..  OSTRACE(("OP
269c0 45 4e 20 66 69 6c 65 3d 25 70 2c 20 6e 61 6d 65  EN file=%p, name
269d0 3d 25 73 2c 20 61 63 63 65 73 73 3d 25 6c 78 2c  =%s, access=%lx,
269e0 20 70 4f 75 74 46 6c 61 67 73 3d 25 70 2c 20 2a   pOutFlags=%p, *
269f0 70 4f 75 74 46 6c 61 67 73 3d 25 64 2c 20 22 0a  pOutFlags=%d, ".
26a00 20 20 20 20 20 20 20 20 20 20 20 22 72 63 3d 25             "rc=%
26a10 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66 38 4e 61  s\n", h, zUtf8Na
26a20 6d 65 2c 20 64 77 44 65 73 69 72 65 64 41 63 63  me, dwDesiredAcc
26a30 65 73 73 2c 20 70 4f 75 74 46 6c 61 67 73 2c 20  ess, pOutFlags, 
26a40 70 4f 75 74 46 6c 61 67 73 20 3f 0a 20 20 20 20  pOutFlags ?.    
26a50 20 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67         *pOutFlag
26a60 73 20 3a 20 30 2c 20 28 68 3d 3d 49 4e 56 41 4c  s : 0, (h==INVAL
26a70 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29  ID_HANDLE_VALUE)
26a80 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f   ? "failed" : "o
26a90 6b 22 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54  k"));..#if SQLIT
26aa0 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 66 28  E_OS_WINCE.  if(
26ab0 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20   isReadWrite && 
26ac0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
26ad0 45 4e 5f 4d 41 49 4e 5f 44 42 0a 20 20 20 20 20  EN_MAIN_DB.     
26ae0 20 20 26 26 20 28 72 63 20 3d 20 77 69 6e 63 65    && (rc = wince
26af0 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e 61 6d 65  CreateLock(zName
26b00 2c 20 70 46 69 6c 65 29 29 21 3d 53 51 4c 49 54  , pFile))!=SQLIT
26b10 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 6f 73  E_OK.  ){.    os
26b20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 29 3b 0a  CloseHandle(h);.
26b30 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
26b40 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
26b50 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
26b60 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53  Tmpname);.    OS
26b70 54 52 41 43 45 28 28 22 4f 50 45 4e 2d 43 45 2d  TRACE(("OPEN-CE-
26b80 4c 4f 43 4b 20 6e 61 6d 65 3d 25 73 2c 20 72 63  LOCK name=%s, rc
26b90 3d 25 73 5c 6e 22 2c 20 7a 4e 61 6d 65 2c 20 73  =%s\n", zName, s
26ba0 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
26bb0 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )));.    return 
26bc0 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  rc;.  }.  if( is
26bd0 54 65 6d 70 20 29 7b 0a 20 20 20 20 70 46 69 6c  Temp ){.    pFil
26be0 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
26bf0 65 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  e = zConverted;.
26c00 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
26c10 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   {.    sqlite3_f
26c20 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
26c30 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
26c40 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a  free(zTmpname);.
26c50 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64    pFile->pMethod
26c60 20 3d 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64 3b   = &winIoMethod;
26c70 0a 20 20 70 46 69 6c 65 2d 3e 70 56 66 73 20 3d  .  pFile->pVfs =
26c80 20 70 56 66 73 3b 0a 20 20 70 46 69 6c 65 2d 3e   pVfs;.  pFile->
26c90 68 20 3d 20 68 3b 0a 20 20 69 66 28 20 69 73 52  h = h;.  if( isR
26ca0 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 20 20 70  eadonly ){.    p
26cb0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
26cc0 7c 3d 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c  |= WINFILE_RDONL
26cd0 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  Y;.  }.  if( sql
26ce0 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
26cf0 28 7a 4e 61 6d 65 2c 20 22 70 73 6f 77 22 2c 20  (zName, "psow", 
26d00 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46 45  SQLITE_POWERSAFE
26d10 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a 20  _OVERWRITE) ){. 
26d20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
26d30 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 50  ags |= WINFILE_P
26d40 53 4f 57 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65  SOW;.  }.  pFile
26d50 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f  ->lastErrno = NO
26d60 5f 45 52 52 4f 52 3b 0a 20 20 70 46 69 6c 65 2d  _ERROR;.  pFile-
26d70 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a  >zPath = zName;.
26d80 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
26d90 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70 46 69  MAP_SIZE>0.  pFi
26da0 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b  le->hMap = NULL;
26db0 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  .  pFile->pMapRe
26dc0 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 70 46 69 6c  gion = 0;.  pFil
26dd0 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b  e->mmapSize = 0;
26de0 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  .  pFile->mmapSi
26df0 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20  zeActual = 0;.  
26e00 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
26e10 61 78 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  ax = sqlite3Glob
26e20 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b  alConfig.szMmap;
26e30 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 70 65 6e 43  .#endif..  OpenC
26e40 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 72 65  ounter(+1);.  re
26e50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
26e60 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6e 61 6d  * Delete the nam
26e70 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e  ed file..**.** N
26e80 6f 74 65 20 74 68 61 74 20 57 69 6e 64 6f 77 73  ote that Windows
26e90 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20   does not allow 
26ea0 61 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c  a file to be del
26eb0 65 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68  eted if some oth
26ec0 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 68 61  er.** process ha
26ed0 73 20 69 74 20 6f 70 65 6e 2e 20 20 53 6f 6d 65  s it open.  Some
26ee0 74 69 6d 65 73 20 61 20 76 69 72 75 73 20 73 63  times a virus sc
26ef0 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65 78 69 6e  anner or indexin
26f00 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 77 69 6c  g program.** wil
26f10 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c  l open a journal
26f20 20 66 69 6c 65 20 73 68 6f 72 74 6c 79 20 61 66   file shortly af
26f30 74 65 72 20 69 74 20 69 73 20 63 72 65 61 74 65  ter it is create
26f40 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f  d in order to do
26f50 0a 2a 2a 20 77 68 61 74 65 76 65 72 20 69 74 20  .** whatever it 
26f60 64 6f 65 73 2e 20 20 57 68 69 6c 65 20 74 68 69  does.  While thi
26f70 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  s other process 
26f80 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 2a  is holding the.*
26f90 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20 77 65 20  * file open, we 
26fa0 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c 65 20 74  will be unable t
26fb0 6f 20 64 65 6c 65 74 65 20 69 74 2e 20 20 54 6f  o delete it.  To
26fc0 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69   work around thi
26fd0 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20 77 65  s.** problem, we
26fe0 20 64 65 6c 61 79 20 31 30 30 20 6d 69 6c 6c 69   delay 100 milli
26ff0 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20  seconds and try 
27000 74 6f 20 64 65 6c 65 74 65 20 61 67 61 69 6e 2e  to delete again.
27010 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f 44 45    Up.** to MX_DE
27020 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 73 20  LETION_ATTEMPTs 
27030 64 65 6c 65 74 69 6f 6e 20 61 74 74 65 6d 70 74  deletion attempt
27040 73 20 61 72 65 20 72 75 6e 20 62 65 66 6f 72 65  s are run before
27050 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70 20 61 6e   giving.** up an
27060 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  d returning an e
27070 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
27080 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 0a 20  int winDelete(. 
27090 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
270a0 66 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fs,          /* 
270b0 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33  Not used on win3
270c0 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  2 */.  const cha
270d0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
270e0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69     /* Name of fi
270f0 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a  le to delete */.
27100 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20 20 20    int syncDir   
27110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27120 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e   Not used on win
27130 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63  32 */.){.  int c
27140 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  nt = 0;.  int rc
27150 3b 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a  ;.  DWORD attr;.
27160 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
27170 6f 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20 2a 7a  o = 0;.  void *z
27180 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55  Converted;.  UNU
27190 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
271a0 66 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  fs);.  UNUSED_PA
271b0 52 41 4d 45 54 45 52 28 73 79 6e 63 44 69 72 29  RAMETER(syncDir)
271c0 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
271d0 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
271e0 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29  TE_IOERR_DELETE)
271f0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 45  ;.  OSTRACE(("DE
27200 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 73 79  LETE name=%s, sy
27210 6e 63 44 69 72 3d 25 64 5c 6e 22 2c 20 7a 46 69  ncDir=%d\n", zFi
27220 6c 65 6e 61 6d 65 2c 20 73 79 6e 63 44 69 72 29  lename, syncDir)
27230 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64  );..  zConverted
27240 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f   = winConvertFro
27250 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46  mUtf8Filename(zF
27260 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
27270 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
27280 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44  .    OSTRACE(("D
27290 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 72  ELETE name=%s, r
272a0 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
272b0 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61  OMEM\n", zFilena
272c0 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  me));.    return
272d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
272e0 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  MEM;.  }.  if( o
272f0 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 64  sIsNT() ){.    d
27300 6f 20 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  o {.#if SQLITE_O
27310 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 57 49  S_WINRT.      WI
27320 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  N32_FILE_ATTRIBU
27330 54 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74  TE_DATA sAttrDat
27340 61 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  a;.      memset(
27350 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73  &sAttrData, 0, s
27360 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29  izeof(sAttrData)
27370 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73  );.      if ( os
27380 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
27390 73 45 78 57 28 7a 43 6f 6e 76 65 72 74 65 64 2c  sExW(zConverted,
273a0 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74   GetFileExInfoSt
273b0 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20 20  andard,.        
273c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
273d0 20 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72            &sAttr
273e0 44 61 74 61 29 20 29 7b 0a 20 20 20 20 20 20 20  Data) ){.       
273f0 20 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74   attr = sAttrDat
27400 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74  a.dwFileAttribut
27410 65 73 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  es;.      }else{
27420 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72  .        lastErr
27430 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
27440 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69  ror();.        i
27450 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  f( lastErrno==ER
27460 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55  ROR_FILE_NOT_FOU
27470 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c  ND.         || l
27480 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
27490 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29  PATH_NOT_FOUND )
274a0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
274b0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
274c0 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41  LETE_NOENT; /* A
274d0 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a  lready gone? */.
274e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
274f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
27500 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
27510 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
27520 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c  eak;.      }.#el
27530 73 65 0a 20 20 20 20 20 20 61 74 74 72 20 3d 20  se.      attr = 
27540 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
27550 74 65 73 57 28 7a 43 6f 6e 76 65 72 74 65 64 29  tesW(zConverted)
27560 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  ;.#endif.      i
27570 66 20 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49  f ( attr==INVALI
27580 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
27590 53 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73  S ){.        las
275a0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
275b0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
275c0 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f     if( lastErrno
275d0 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54  ==ERROR_FILE_NOT
275e0 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20  _FOUND.         
275f0 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  || lastErrno==ER
27600 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55  ROR_PATH_NOT_FOU
27610 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ND ){.          
27620 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
27630 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20  R_DELETE_NOENT; 
27640 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f  /* Already gone?
27650 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   */.        }els
27660 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e{.          rc 
27670 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
27680 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27690 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
276a0 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72  .      if ( attr
276b0 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f  &FILE_ATTRIBUTE_
276c0 44 49 52 45 43 54 4f 52 59 20 29 7b 0a 20 20 20  DIRECTORY ){.   
276d0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
276e0 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73  _ERROR; /* Files
276f0 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20   only. */.      
27700 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
27710 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73 44 65  .      if ( osDe
27720 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f 6e 76 65  leteFileW(zConve
27730 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20  rted) ){.       
27740 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
27750 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20   /* Deleted OK. 
27760 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
27770 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
27780 69 66 20 28 20 21 77 69 6e 52 65 74 72 79 49 6f  if ( !winRetryIo
27790 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
277a0 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  rrno) ){.       
277b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
277c0 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72  OR; /* No more r
277d0 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20  etries. */.     
277e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
277f0 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 28 31 29  }.    } while(1)
27800 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
27810 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
27820 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 64  SI.  else{.    d
27830 6f 20 7b 0a 20 20 20 20 20 20 61 74 74 72 20 3d  o {.      attr =
27840 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
27850 75 74 65 73 41 28 7a 43 6f 6e 76 65 72 74 65 64  utesA(zConverted
27860 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 61 74  );.      if ( at
27870 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45  tr==INVALID_FILE
27880 5f 41 54 54 52 49 42 55 54 45 53 20 29 7b 0a 20  _ATTRIBUTES ){. 
27890 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f         lastErrno
278a0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
278b0 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  r();.        if(
278c0 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f   lastErrno==ERRO
278d0 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44  R_FILE_NOT_FOUND
278e0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61 73  .         || las
278f0 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41  tErrno==ERROR_PA
27900 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a  TH_NOT_FOUND ){.
27910 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
27920 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
27930 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72  TE_NOENT; /* Alr
27940 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20  eady gone? */.  
27950 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27960 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
27970 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
27980 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
27990 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
279a0 20 69 66 20 28 20 61 74 74 72 26 46 49 4c 45 5f   if ( attr&FILE_
279b0 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54  ATTRIBUTE_DIRECT
279c0 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ORY ){.        r
279d0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
279e0 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 2e  ; /* Files only.
279f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
27a00 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
27a10 20 69 66 20 28 20 6f 73 44 65 6c 65 74 65 46 69   if ( osDeleteFi
27a20 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 20  leA(zConverted) 
27a30 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
27a40 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65  SQLITE_OK; /* De
27a50 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20  leted OK. */.   
27a60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
27a70 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 21    }.      if ( !
27a80 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63  winRetryIoerr(&c
27a90 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  nt, &lastErrno) 
27aa0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
27ab0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a  SQLITE_ERROR; /*
27ac0 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69 65 73   No more retries
27ad0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  . */.        bre
27ae0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
27af0 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a  } while(1);.  }.
27b00 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 20  #endif.  if( rc 
27b10 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  && rc!=SQLITE_IO
27b20 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
27b30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   ){.    rc = win
27b40 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
27b50 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 6c 61  IOERR_DELETE, la
27b60 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 44 65 6c  stErrno, "winDel
27b70 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ete", zFilename)
27b80 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
27b90 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 2c 20  inLogIoerr(cnt, 
27ba0 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 0a 20  __LINE__);.  }. 
27bb0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
27bc0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 4f 53 54  onverted);.  OST
27bd0 52 41 43 45 28 28 22 44 45 4c 45 54 45 20 6e 61  RACE(("DELETE na
27be0 6d 65 3d 25 73 2c 20 72 63 3d 25 73 5c 6e 22 2c  me=%s, rc=%s\n",
27bf0 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c 69   zFilename, sqli
27c00 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
27c10 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
27c20 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  ../*.** Check th
27c30 65 20 65 78 69 73 74 65 6e 63 65 20 61 6e 64 20  e existence and 
27c40 73 74 61 74 75 73 20 6f 66 20 61 20 66 69 6c 65  status of a file
27c50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27c60 77 69 6e 41 63 63 65 73 73 28 0a 20 20 73 71 6c  winAccess(.  sql
27c70 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
27c80 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75          /* Not u
27c90 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a  sed on win32 */.
27ca0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
27cb0 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20  ilename,     /* 
27cc0 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Name of file to 
27cd0 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 66  check */.  int f
27ce0 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
27cf0 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
27d00 20 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 6f 6e   test to make on
27d10 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
27d20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20  int *pResOut    
27d30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
27d40 54 3a 20 52 65 73 75 6c 74 20 2a 2f 0a 29 7b 0a  T: Result */.){.
27d50 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20    DWORD attr;.  
27d60 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 44 57  int rc = 0;.  DW
27d70 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20  ORD lastErrno = 
27d80 30 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  0;.  void *zConv
27d90 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f  erted;.  UNUSED_
27da0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
27db0 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
27dc0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
27dd0 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b  TE_IOERR_ACCESS;
27de0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
27df0 41 43 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20  ACCESS name=%s, 
27e00 66 6c 61 67 73 3d 25 78 2c 20 70 52 65 73 4f 75  flags=%x, pResOu
27e10 74 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20  t=%p\n",.       
27e20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 66      zFilename, f
27e30 6c 61 67 73 2c 20 70 52 65 73 4f 75 74 29 29 3b  lags, pResOut));
27e40 0a 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d  ..  zConverted =
27e50 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55   winConvertFromU
27e60 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c  tf8Filename(zFil
27e70 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43  ename);.  if( zC
27e80 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20  onverted==0 ){. 
27e90 20 20 20 4f 53 54 52 41 43 45 28 28 22 41 43 43     OSTRACE(("ACC
27ea0 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d  ESS name=%s, rc=
27eb0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
27ec0 45 4d 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  EM\n", zFilename
27ed0 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
27ee0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
27ef0 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49  M;.  }.  if( osI
27f00 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 69 6e 74  sNT() ){.    int
27f10 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57 49   cnt = 0;.    WI
27f20 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  N32_FILE_ATTRIBU
27f30 54 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74  TE_DATA sAttrDat
27f40 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  a;.    memset(&s
27f50 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a  AttrData, 0, siz
27f60 65 6f 66 28 73 41 74 74 72 44 61 74 61 29 29 3b  eof(sAttrData));
27f70 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28 72 63  .    while( !(rc
27f80 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   = osGetFileAttr
27f90 69 62 75 74 65 73 45 78 57 28 28 4c 50 43 57 53  ibutesExW((LPCWS
27fa0 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  TR)zConverted,. 
27fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27fc0 20 20 20 20 20 20 20 20 20 20 20 20 47 65 74 46              GetF
27fd0 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72  ileExInfoStandar
27fe0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
27ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28000 26 73 41 74 74 72 44 61 74 61 29 29 20 26 26 20  &sAttrData)) && 
28010 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63  winRetryIoerr(&c
28020 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  nt, &lastErrno) 
28030 29 7b 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29  ){}.    if( rc )
28040 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61  {.      /* For a
28050 6e 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  n SQLITE_ACCESS_
28060 45 58 49 53 54 53 20 71 75 65 72 79 2c 20 74 72  EXISTS query, tr
28070 65 61 74 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74  eat a zero-lengt
28080 68 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  h file.      ** 
28090 61 73 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  as if it does no
280a0 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a  t exist..      *
280b0 2f 0a 20 20 20 20 20 20 69 66 28 20 20 20 20 66  /.      if(    f
280c0 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43  lags==SQLITE_ACC
280d0 45 53 53 5f 45 58 49 53 54 53 0a 20 20 20 20 20  ESS_EXISTS.     
280e0 20 20 20 20 20 26 26 20 73 41 74 74 72 44 61 74       && sAttrDat
280f0 61 2e 6e 46 69 6c 65 53 69 7a 65 48 69 67 68 3d  a.nFileSizeHigh=
28100 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  =0.          && 
28110 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c 65 53  sAttrData.nFileS
28120 69 7a 65 4c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20  izeLow==0 ){.   
28130 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41       attr = INVA
28140 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
28150 54 45 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  TES;.      }else
28160 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d  {.        attr =
28170 20 73 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c   sAttrData.dwFil
28180 65 41 74 74 72 69 62 75 74 65 73 3b 0a 20 20 20  eAttributes;.   
28190 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
281a0 20 20 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72        winLogIoer
281b0 72 28 63 6e 74 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  r(cnt, __LINE__)
281c0 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 61 73 74  ;.      if( last
281d0 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 46 49 4c  Errno!=ERROR_FIL
281e0 45 5f 4e 4f 54 5f 46 4f 55 4e 44 20 26 26 20 6c  E_NOT_FOUND && l
281f0 61 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f  astErrno!=ERROR_
28200 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29  PATH_NOT_FOUND )
28210 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
28220 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
28230 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  d);.        retu
28240 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
28250 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
28260 53 53 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22  SS, lastErrno, "
28270 77 69 6e 41 63 63 65 73 73 22 2c 0a 20 20 20 20  winAccess",.    
28280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28290 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65         zFilename
282a0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
282b0 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 49          attr = I
282c0 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
282d0 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 0a  IBUTES;.      }.
282e0 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66      }.  }.#ifdef
282f0 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
28300 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
28310 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46     attr = osGetF
28320 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 28  ileAttributesA((
28330 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
28340 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
28350 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
28360 6e 76 65 72 74 65 64 29 3b 0a 20 20 73 77 69 74  nverted);.  swit
28370 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20  ch( flags ){.   
28380 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
28390 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 63 61  ESS_READ:.    ca
283a0 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
283b0 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20 72  _EXISTS:.      r
283c0 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49  c = attr!=INVALI
283d0 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
283e0 53 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  S;.      break;.
283f0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
28400 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
28410 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74 74  :.      rc = att
28420 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  r!=INVALID_FILE_
28430 41 54 54 52 49 42 55 54 45 53 20 26 26 0a 20 20  ATTRIBUTES &&.  
28440 20 20 20 20 20 20 20 20 20 20 20 28 61 74 74 72             (attr
28450 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   & FILE_ATTRIBUT
28460 45 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a  E_READONLY)==0;.
28470 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
28480 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
28490 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64  assert(!"Invalid
284a0 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22   flags argument"
284b0 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75  );.  }.  *pResOu
284c0 74 20 3d 20 72 63 3b 0a 20 20 4f 53 54 52 41 43  t = rc;.  OSTRAC
284d0 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65 3d  E(("ACCESS name=
284e0 25 73 2c 20 70 52 65 73 4f 75 74 3d 25 70 2c 20  %s, pResOut=%p, 
284f0 2a 70 52 65 73 4f 75 74 3d 25 64 2c 20 72 63 3d  *pResOut=%d, rc=
28500 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20  SQLITE_OK\n",.  
28510 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61           zFilena
28520 6d 65 2c 20 70 52 65 73 4f 75 74 2c 20 2a 70 52  me, pResOut, *pR
28530 65 73 4f 75 74 29 29 3b 0a 20 20 72 65 74 75 72  esOut));.  retur
28540 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
28550 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f  /*.** Returns no
28560 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70  n-zero if the sp
28570 65 63 69 66 69 65 64 20 70 61 74 68 20 6e 61 6d  ecified path nam
28580 65 20 73 74 61 72 74 73 20 77 69 74 68 20 61 20  e starts with a 
28590 64 72 69 76 65 20 6c 65 74 74 65 72 0a 2a 2a 20  drive letter.** 
285a0 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 63 6f  followed by a co
285b0 6c 6f 6e 20 63 68 61 72 61 63 74 65 72 2e 0a 2a  lon character..*
285c0 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69  /.static BOOL wi
285d0 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e  nIsDriveLetterAn
285e0 64 43 6f 6c 6f 6e 28 0a 20 20 63 6f 6e 73 74 20  dColon(.  const 
285f0 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 0a  char *zPathname.
28600 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 20 73 71  ){.  return ( sq
28610 6c 69 74 65 33 49 73 61 6c 70 68 61 28 7a 50 61  lite3Isalpha(zPa
28620 74 68 6e 61 6d 65 5b 30 5d 29 20 26 26 20 7a 50  thname[0]) && zP
28630 61 74 68 6e 61 6d 65 5b 31 5d 3d 3d 27 3a 27 20  athname[1]==':' 
28640 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
28650 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  rns non-zero if 
28660 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
28670 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20 62  th name should b
28680 65 20 75 73 65 64 20 76 65 72 62 61 74 69 6d 2e  e used verbatim.
28690 20 20 49 66 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f    If.** non-zero
286a0 20 69 73 20 72 65 74 75 72 6e 65 64 20 66 72 6f   is returned fro
286b0 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  m this function,
286c0 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
286d0 63 74 69 6f 6e 20 6d 75 73 74 20 73 69 6d 70 6c  ction must simpl
286e0 79 0a 2a 2a 20 75 73 65 20 74 68 65 20 70 72 6f  y.** use the pro
286f0 76 69 64 65 64 20 70 61 74 68 20 6e 61 6d 65 20  vided path name 
28700 76 65 72 62 61 74 69 6d 20 2d 4f 52 2d 20 72 65  verbatim -OR- re
28710 73 6f 6c 76 65 20 69 74 20 69 6e 74 6f 20 61 20  solve it into a 
28720 66 75 6c 6c 20 70 61 74 68 20 6e 61 6d 65 0a 2a  full path name.*
28730 2a 20 75 73 69 6e 67 20 74 68 65 20 47 65 74 46  * using the GetF
28740 75 6c 6c 50 61 74 68 4e 61 6d 65 20 57 69 6e 33  ullPathName Win3
28750 32 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 28  2 API function (
28760 69 66 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a  if available)..*
28770 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69  /.static BOOL wi
28780 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e  nIsVerbatimPathn
28790 61 6d 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ame(.  const cha
287a0 72 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a  r *zPathname.){.
287b0 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    /*.  ** If the
287c0 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61 72 74   path name start
287d0 73 20 77 69 74 68 20 61 20 66 6f 72 77 61 72 64  s with a forward
287e0 20 73 6c 61 73 68 20 6f 72 20 61 20 62 61 63 6b   slash or a back
287f0 73 6c 61 73 68 2c 20 69 74 20 69 73 20 65 69 74  slash, it is eit
28800 68 65 72 0a 20 20 2a 2a 20 61 20 6c 65 67 61 6c  her.  ** a legal
28810 20 55 4e 43 20 6e 61 6d 65 2c 20 61 20 76 6f 6c   UNC name, a vol
28820 75 6d 65 20 72 65 6c 61 74 69 76 65 20 70 61 74  ume relative pat
28830 68 2c 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74  h, or an absolut
28840 65 20 70 61 74 68 20 6e 61 6d 65 20 69 6e 20 74  e path name in t
28850 68 65 0a 20 20 2a 2a 20 22 55 6e 69 78 22 20 66  he.  ** "Unix" f
28860 6f 72 6d 61 74 20 6f 6e 20 57 69 6e 64 6f 77 73  ormat on Windows
28870 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 65  .  There is no e
28880 61 73 79 20 77 61 79 20 74 6f 20 64 69 66 66 65  asy way to diffe
28890 72 65 6e 74 69 61 74 65 20 62 65 74 77 65 65 6e  rentiate between
288a0 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20  .  ** the final 
288b0 74 77 6f 20 63 61 73 65 73 3b 20 74 68 65 72 65  two cases; there
288c0 66 6f 72 65 2c 20 77 65 20 72 65 74 75 72 6e 20  fore, we return 
288d0 74 68 65 20 73 61 66 65 72 20 72 65 74 75 72 6e  the safer return
288e0 20 76 61 6c 75 65 20 6f 66 20 54 52 55 45 0a 20   value of TRUE. 
288f0 20 2a 2a 20 73 6f 20 74 68 61 74 20 63 61 6c 6c   ** so that call
28900 65 72 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ers of this func
28910 74 69 6f 6e 20 77 69 6c 6c 20 73 69 6d 70 6c 79  tion will simply
28920 20 75 73 65 20 69 74 20 76 65 72 62 61 74 69 6d   use it verbatim
28930 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20 77 69  ..  */.  if ( wi
28940 6e 49 73 44 69 72 53 65 70 28 7a 50 61 74 68 6e  nIsDirSep(zPathn
28950 61 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20 72  ame[0]) ){.    r
28960 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a  eturn TRUE;.  }.
28970 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  /*.  ** If th
28980 65 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61 72  e path name star
28990 74 73 20 77 69 74 68 20 61 20 6c 65 74 74 65 72  ts with a letter
289a0 20 61 6e 64 20 61 20 63 6f 6c 6f 6e 20 69 74 20   and a colon it 
289b0 69 73 20 65 69 74 68 65 72 20 61 20 76 6f 6c 75  is either a volu
289c0 6d 65 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76 65  me.  ** relative
289d0 20 70 61 74 68 20 6f 72 20 61 6e 20 61 62 73 6f   path or an abso
289e0 6c 75 74 65 20 70 61 74 68 2e 20 20 43 61 6c 6c  lute path.  Call
289f0 65 72 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ers of this func
28a00 74 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 0a 20 20  tion must not.  
28a10 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 74 72  ** attempt to tr
28a20 65 61 74 20 69 74 20 61 73 20 61 20 72 65 6c 61  eat it as a rela
28a30 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 28  tive path name (
28a40 69 2e 65 2e 20 74 68 65 79 20 73 68 6f 75 6c 64  i.e. they should
28a50 20 73 69 6d 70 6c 79 20 75 73 65 0a 20 20 2a 2a   simply use.  **
28a60 20 69 74 20 76 65 72 62 61 74 69 6d 29 2e 0a 20   it verbatim).. 
28a70 20 2a 2f 0a 20 20 69 66 20 28 20 77 69 6e 49 73   */.  if ( winIs
28a80 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f  DriveLetterAndCo
28a90 6c 6f 6e 28 7a 50 61 74 68 6e 61 6d 65 29 20 29  lon(zPathname) )
28aa0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52 55  {.    return TRU
28ab0 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  E;.  }..  /*.  *
28ac0 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f 20 74  * If we get to t
28ad0 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 70  his point, the p
28ae0 61 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20  ath name should 
28af0 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 6c 79  almost certainly
28b00 20 62 65 20 61 20 70 75 72 65 6c 79 0a 20 20 2a   be a purely.  *
28b10 2a 20 72 65 6c 61 74 69 76 65 20 6f 6e 65 20 28  * relative one (
28b20 69 2e 65 2e 20 6e 6f 74 20 61 20 55 4e 43 20 6e  i.e. not a UNC n
28b30 61 6d 65 2c 20 6e 6f 74 20 61 62 73 6f 6c 75 74  ame, not absolut
28b40 65 2c 20 61 6e 64 20 6e 6f 74 20 76 6f 6c 75 6d  e, and not volum
28b50 65 20 72 65 6c 61 74 69 76 65 29 2e 0a 20 20 2a  e relative)..  *
28b60 2f 0a 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45  /.  return FALSE
28b70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20  ;.}../*.** Turn 
28b80 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e  a relative pathn
28b90 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20  ame into a full 
28ba0 70 61 74 68 6e 61 6d 65 2e 20 20 57 72 69 74 65  pathname.  Write
28bb0 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20 70 61 74   the full.** pat
28bc0 68 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f 75 74 5b  hname into zOut[
28bd0 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c 20  ].  zOut[] will 
28be0 62 65 20 61 74 20 6c 65 61 73 74 20 70 56 66 73  be at least pVfs
28bf0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 2a 2a 20  ->mxPathname.** 
28c00 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
28c10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
28c20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20  FullPathname(.  
28c30 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
28c40 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s,            /*
28c50 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20   Pointer to vfs 
28c60 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73  object */.  cons
28c70 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69 76  t char *zRelativ
28c80 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73  e,        /* Pos
28c90 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69  sibly relative i
28ca0 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69  nput path */.  i
28cb0 6e 74 20 6e 46 75 6c 6c 2c 20 20 20 20 20 20 20  nt nFull,       
28cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28cd0 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62  Size of output b
28ce0 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a  uffer in bytes *
28cf0 2f 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20  /.  char *zFull 
28d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d10 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66    /* Output buff
28d20 65 72 20 2a 2f 0a 29 7b 0a 0a 23 69 66 20 64 65  er */.){..#if de
28d30 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
28d40 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ).  SimulateIOEr
28d50 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
28d60 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 55 4e  TE_ERROR );.  UN
28d70 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
28d80 46 75 6c 6c 29 3b 0a 20 20 61 73 73 65 72 74 28  Full);.  assert(
28d90 20 6e 46 75 6c 6c 3e 3d 70 56 66 73 2d 3e 6d 78   nFull>=pVfs->mx
28da0 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 69 66  Pathname );.  if
28db0 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f   ( sqlite3_data_
28dc0 64 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69  directory && !wi
28dd0 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e  nIsVerbatimPathn
28de0 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29  ame(zRelative) )
28df0 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
28e00 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61  NOTE: We are dea
28e10 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61  ling with a rela
28e20 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61  tive path name a
28e30 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20  nd the data.    
28e40 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f  **       directo
28e50 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  ry has been set.
28e60 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65    Therefore, use
28e70 20 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73   it as the basis
28e80 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f  .    **       fo
28e90 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65  r converting the
28ea0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
28eb0 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75  ame to an absolu
28ec0 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  te.    **       
28ed0 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e  one by prependin
28ee0 67 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63  g the data direc
28ef0 74 6f 72 79 20 61 6e 64 20 61 20 73 6c 61 73 68  tory and a slash
28f00 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61  ..    */.    cha
28f10 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65  r *zOut = sqlite
28f20 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 56 66  3MallocZero( pVf
28f30 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20  s->mxPathname+1 
28f40 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4f 75 74  );.    if( !zOut
28f50 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
28f60 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
28f70 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  MEM;.    }.    i
28f80 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70  f( cygwin_conv_p
28f90 61 74 68 28 0a 20 20 20 20 20 20 20 20 20 20 20  ath(.           
28fa0 20 28 6f 73 49 73 4e 54 28 29 20 3f 20 43 43 50   (osIsNT() ? CCP
28fb0 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57 20  _POSIX_TO_WIN_W 
28fc0 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57  : CCP_POSIX_TO_W
28fd0 49 4e 5f 41 29 20 7c 0a 20 20 20 20 20 20 20 20  IN_A) |.        
28fe0 20 20 20 20 43 43 50 5f 52 45 4c 41 54 49 56 45      CCP_RELATIVE
28ff0 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a 4f 75  , zRelative, zOu
29000 74 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  t, pVfs->mxPathn
29010 61 6d 65 2b 31 29 3c 30 20 29 7b 0a 20 20 20 20  ame+1)<0 ){.    
29020 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
29030 4f 75 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Out);.      retu
29040 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
29050 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43  QLITE_CANTOPEN_C
29060 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f 52 44 29  ONVPATH, (DWORD)
29070 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  errno,.         
29080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29090 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  "winFullPathname
290a0 31 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a  1", zRelative);.
290b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
290c0 20 63 68 61 72 20 2a 7a 55 74 66 38 20 3d 20 77   char *zUtf8 = w
290d0 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46  inConvertToUtf8F
290e0 69 6c 65 6e 61 6d 65 28 7a 4f 75 74 29 3b 0a 20  ilename(zOut);. 
290f0 20 20 20 20 20 69 66 28 20 21 7a 55 74 66 38 20       if( !zUtf8 
29100 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
29110 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20  e3_free(zOut);. 
29120 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
29130 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
29140 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29150 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
29160 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73  (MIN(nFull, pVfs
29170 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a  ->mxPathname), z
29180 46 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a  Full, "%s%c%s",.
29190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64         sqlite3_d
291b0 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 77  ata_directory, w
291c0 69 6e 47 65 74 44 69 72 53 65 70 28 29 2c 20 7a  inGetDirSep(), z
291d0 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c  Utf8);.      sql
291e0 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29  ite3_free(zUtf8)
291f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
29200 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20  free(zOut);.    
29210 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  }.  }else{.    c
29220 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69  har *zOut = sqli
29230 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70  te3MallocZero( p
29240 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
29250 31 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4f  1 );.    if( !zO
29260 75 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ut ){.      retu
29270 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
29280 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
29290 20 69 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76   if( cygwin_conv
292a0 5f 70 61 74 68 28 0a 20 20 20 20 20 20 20 20 20  _path(.         
292b0 20 20 20 28 6f 73 49 73 4e 54 28 29 20 3f 20 43     (osIsNT() ? C
292c0 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f  CP_POSIX_TO_WIN_
292d0 57 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f  W : CCP_POSIX_TO
292e0 5f 57 49 4e 5f 41 29 2c 0a 20 20 20 20 20 20 20  _WIN_A),.       
292f0 20 20 20 20 20 7a 52 65 6c 61 74 69 76 65 2c 20       zRelative, 
29300 7a 4f 75 74 2c 20 70 56 66 73 2d 3e 6d 78 50 61  zOut, pVfs->mxPa
29310 74 68 6e 61 6d 65 2b 31 29 3c 30 20 29 7b 0a 20  thname+1)<0 ){. 
29320 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
29330 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 72  e(zOut);.      r
29340 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
29350 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
29360 4e 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f  N_CONVPATH, (DWO
29370 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20  RD)errno,.      
29380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29390 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e     "winFullPathn
293a0 61 6d 65 32 22 2c 20 7a 52 65 6c 61 74 69 76 65  ame2", zRelative
293b0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
293c0 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 20      char *zUtf8 
293d0 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74  = winConvertToUt
293e0 66 38 46 69 6c 65 6e 61 6d 65 28 7a 4f 75 74 29  f8Filename(zOut)
293f0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 55 74  ;.      if( !zUt
29400 66 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  f8 ){.        sq
29410 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
29420 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
29430 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
29440 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
29450 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
29460 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70  ntf(MIN(nFull, p
29470 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29  Vfs->mxPathname)
29480 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a  , zFull, "%s", z
29490 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c  Utf8);.      sql
294a0 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29  ite3_free(zUtf8)
294b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
294c0 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20  free(zOut);.    
294d0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
294e0 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
294f0 0a 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 4f 53  ..#if (SQLITE_OS
29500 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45  _WINCE || SQLITE
29510 5f 4f 53 5f 57 49 4e 52 54 29 20 26 26 20 21 64  _OS_WINRT) && !d
29520 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f  efined(__CYGWIN_
29530 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  _).  SimulateIOE
29540 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
29550 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 2f  ITE_ERROR );.  /
29560 2a 20 57 69 6e 43 45 20 68 61 73 20 6e 6f 20 63  * WinCE has no c
29570 6f 6e 63 65 70 74 20 6f 66 20 61 20 72 65 6c 61  oncept of a rela
29580 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2c 20 6f  tive pathname, o
29590 72 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e 20  r so I am told. 
295a0 2a 2f 0a 20 20 2f 2a 20 57 69 6e 52 54 20 68 61  */.  /* WinRT ha
295b0 73 20 6e 6f 20 77 61 79 20 74 6f 20 63 6f 6e 76  s no way to conv
295c0 65 72 74 20 61 20 72 65 6c 61 74 69 76 65 20 70  ert a relative p
295d0 61 74 68 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75  ath to an absolu
295e0 74 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 66 20  te one. */.  if 
295f0 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64  ( sqlite3_data_d
29600 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e  irectory && !win
29610 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61  IsVerbatimPathna
29620 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b  me(zRelative) ){
29630 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e  .    /*.    ** N
29640 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c  OTE: We are deal
29650 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61 74  ing with a relat
29660 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e  ive path name an
29670 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a  d the data.    *
29680 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  *       director
29690 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  y has been set. 
296a0 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   Therefore, use 
296b0 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73 0a  it as the basis.
296c0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72      **       for
296d0 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20   converting the 
296e0 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
296f0 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74  me to an absolut
29700 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f  e.    **       o
29710 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67  ne by prepending
29720 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74   the data direct
29730 6f 72 79 20 61 6e 64 20 61 20 62 61 63 6b 73 6c  ory and a backsl
29740 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ash..    */.    
29750 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
29760 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73  (MIN(nFull, pVfs
29770 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a  ->mxPathname), z
29780 46 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a  Full, "%s%c%s",.
29790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74       sqlite3_dat
297b0 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69 6e  a_directory, win
297c0 47 65 74 44 69 72 53 65 70 28 29 2c 20 7a 52 65  GetDirSep(), zRe
297d0 6c 61 74 69 76 65 29 3b 0a 20 20 7d 65 6c 73 65  lative);.  }else
297e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
297f0 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c  printf(MIN(nFull
29800 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
29810 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22  me), zFull, "%s"
29820 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
29830 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
29840 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  E_OK;.#endif..#i
29850 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
29860 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53  CE && !SQLITE_OS
29870 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e  _WINRT && !defin
29880 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20  ed(__CYGWIN__). 
29890 20 44 57 4f 52 44 20 6e 42 79 74 65 3b 0a 20 20   DWORD nByte;.  
298a0 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
298b0 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a  ;.  char *zOut;.
298c0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61  .  /* If this pa
298d0 74 68 20 6e 61 6d 65 20 62 65 67 69 6e 73 20 77  th name begins w
298e0 69 74 68 20 22 2f 58 3a 22 2c 20 77 68 65 72 65  ith "/X:", where
298f0 20 22 58 22 20 69 73 20 61 6e 79 20 61 6c 70 68   "X" is any alph
29900 61 62 65 74 69 63 0a 20 20 2a 2a 20 63 68 61 72  abetic.  ** char
29910 61 63 74 65 72 2c 20 64 69 73 63 61 72 64 20 74  acter, discard t
29920 68 65 20 69 6e 69 74 69 61 6c 20 22 2f 22 20 66  he initial "/" f
29930 72 6f 6d 20 74 68 65 20 70 61 74 68 6e 61 6d 65  rom the pathname
29940 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 52 65  ..  */.  if( zRe
29950 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20 26  lative[0]=='/' &
29960 26 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74  & winIsDriveLett
29970 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 52 65 6c 61  erAndColon(zRela
29980 74 69 76 65 2b 31 29 20 29 7b 0a 20 20 20 20 7a  tive+1) ){.    z
29990 52 65 6c 61 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a  Relative++;.  }.
299a0 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74  .  /* It's odd t
299b0 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f  o simulate an io
299c0 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74  -error here, but
299d0 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20   really this is 
299e0 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20  just.  ** using 
299f0 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66  the io-error inf
29a00 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74  rastructure to t
29a10 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
29a20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a  handles this.  *
29a30 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69  * function faili
29a40 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ng. This functio
29a50 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c  n could fail if,
29a60 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   for example, th
29a70 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77  e.  ** current w
29a80 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79  orking directory
29a90 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b   has been unlink
29aa0 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ed..  */.  Simul
29ab0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
29ac0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
29ad0 29 3b 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65  );.  if ( sqlite
29ae0 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
29af0 20 26 26 20 21 77 69 6e 49 73 56 65 72 62 61 74   && !winIsVerbat
29b00 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61  imPathname(zRela
29b10 74 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a  tive) ){.    /*.
29b20 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20      ** NOTE: We 
29b30 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
29b40 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
29b50 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61   name and the da
29b60 74 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ta.    **       
29b70 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
29b80 65 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f  en set.  Therefo
29b90 72 65 2c 20 75 73 65 20 69 74 20 61 73 20 74 68  re, use it as th
29ba0 65 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20  e basis.    **  
29bb0 20 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74       for convert
29bc0 69 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76 65  ing the relative
29bd0 20 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e   path name to an
29be0 20 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a   absolute.    **
29bf0 20 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72         one by pr
29c00 65 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74  epending the dat
29c10 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20  a directory and 
29c20 61 20 62 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20  a backslash..   
29c30 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
29c40 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75  snprintf(MIN(nFu
29c50 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ll, pVfs->mxPath
29c60 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25  name), zFull, "%
29c70 73 25 63 25 73 22 2c 0a 20 20 20 20 20 20 20 20  s%c%s",.        
29c80 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
29c90 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
29ca0 6f 72 79 2c 20 77 69 6e 47 65 74 44 69 72 53 65  ory, winGetDirSe
29cb0 70 28 29 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  p(), zRelative);
29cc0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
29cd0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 7a 43 6f  TE_OK;.  }.  zCo
29ce0 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e  nverted = winCon
29cf0 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65  vertFromUtf8File
29d00 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 3b  name(zRelative);
29d10 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65  .  if( zConverte
29d20 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  d==0 ){.    retu
29d30 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
29d40 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
29d50 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
29d60 20 4c 50 57 53 54 52 20 7a 54 65 6d 70 3b 0a 20   LPWSTR zTemp;. 
29d70 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74     nByte = osGet
29d80 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c  FullPathNameW((L
29d90 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
29da0 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  d, 0, 0, 0);.   
29db0 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b   if( nByte==0 ){
29dc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
29dd0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
29de0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
29df0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
29e00 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41  _CANTOPEN_FULLPA
29e10 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  TH, osGetLastErr
29e20 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
29e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
29e40 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 31  winFullPathname1
29e50 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  ", zRelative);. 
29e60 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 2b     }.    nByte +
29e70 3d 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d  = 3;.    zTemp =
29e80 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
29e90 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66  ro( nByte*sizeof
29ea0 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20  (zTemp[0]) );.  
29eb0 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29    if( zTemp==0 )
29ec0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
29ed0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
29ee0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
29ef0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
29f00 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79  M;.    }.    nBy
29f10 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61  te = osGetFullPa
29f20 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54 52  thNameW((LPCWSTR
29f30 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79  )zConverted, nBy
29f40 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20  te, zTemp, 0);. 
29f50 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20     if( nByte==0 
29f60 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
29f70 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
29f80 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
29f90 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20  _free(zTemp);.  
29fa0 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
29fb0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
29fc0 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c  NTOPEN_FULLPATH,
29fd0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
29fe0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
29ff0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
2a000 46 75 6c 6c 50 61 74 68 6e 61 6d 65 32 22 2c 20  FullPathname2", 
2a010 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20  zRelative);.    
2a020 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
2a030 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
2a040 20 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e 55 6e      zOut = winUn
2a050 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d  icodeToUtf8(zTem
2a060 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  p);.    sqlite3_
2a070 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d  free(zTemp);.  }
2a080 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
2a090 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
2a0a0 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
2a0b0 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65  zTemp;.    nByte
2a0c0 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68   = osGetFullPath
2a0d0 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f  NameA((char*)zCo
2a0e0 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30  nverted, 0, 0, 0
2a0f0 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  );.    if( nByte
2a100 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
2a110 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
2a120 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74  rted);.      ret
2a130 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
2a140 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
2a150 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c  FULLPATH, osGetL
2a160 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
2a170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a180 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74       "winFullPat
2a190 68 6e 61 6d 65 33 22 2c 20 7a 52 65 6c 61 74 69  hname3", zRelati
2a1a0 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  ve);.    }.    n
2a1b0 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a  Byte += 3;.    z
2a1c0 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  Temp = sqlite3Ma
2a1d0 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a  llocZero( nByte*
2a1e0 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29  sizeof(zTemp[0])
2a1f0 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d   );.    if( zTem
2a200 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
2a210 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
2a220 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65  erted);.      re
2a230 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
2a240 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  R_NOMEM;.    }. 
2a250 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74     nByte = osGet
2a260 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63  FullPathNameA((c
2a270 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c  har*)zConverted,
2a280 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30   nByte, zTemp, 0
2a290 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  );.    if( nByte
2a2a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
2a2b0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
2a2c0 72 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  rted);.      sql
2a2d0 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29  ite3_free(zTemp)
2a2e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  ;.      return w
2a2f0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
2a300 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50  E_CANTOPEN_FULLP
2a310 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  ATH, osGetLastEr
2a320 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
2a330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a340 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  "winFullPathname
2a350 34 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a  4", zRelative);.
2a360 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2a370 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
2a380 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 73  d);.    zOut = s
2a390 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63  qlite3_win32_mbc
2a3a0 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29  s_to_utf8(zTemp)
2a3b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
2a3c0 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23  ee(zTemp);.  }.#
2a3d0 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 4f 75 74  endif.  if( zOut
2a3e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2a3f0 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75  snprintf(MIN(nFu
2a400 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ll, pVfs->mxPath
2a410 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25  name), zFull, "%
2a420 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 73  s", zOut);.    s
2a430 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74  qlite3_free(zOut
2a440 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
2a450 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
2a460 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2a470 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
2a480 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23  .  }.#endif.}..#
2a490 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2a4a0 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
2a4b0 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  N./*.** Interfac
2a4c0 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61  es for opening a
2a4d0 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
2a4e0 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70   finding entry p
2a4f0 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20  oints.** within 
2a500 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
2a510 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20  ry, and closing 
2a520 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
2a530 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
2a540 69 64 20 2a 77 69 6e 44 6c 4f 70 65 6e 28 73 71  id *winDlOpen(sq
2a550 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2a560 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
2a570 6c 65 6e 61 6d 65 29 7b 0a 20 20 48 41 4e 44 4c  lename){.  HANDL
2a580 45 20 68 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  E h;.#if defined
2a590 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 69  (__CYGWIN__).  i
2a5a0 6e 74 20 6e 46 75 6c 6c 20 3d 20 70 56 66 73 2d  nt nFull = pVfs-
2a5b0 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20  >mxPathname+1;. 
2a5c0 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 3d 20 73   char *zFull = s
2a5d0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
2a5e0 28 20 6e 46 75 6c 6c 20 29 3b 0a 20 20 76 6f 69  ( nFull );.  voi
2a5f0 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  d *zConverted = 
2a600 30 3b 0a 20 20 69 66 28 20 7a 46 75 6c 6c 3d 3d  0;.  if( zFull==
2a610 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  0 ){.    OSTRACE
2a620 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25  (("DLOPEN name=%
2a630 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c  s, handle=%p\n",
2a640 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69   zFilename, (voi
2a650 64 2a 29 30 29 29 3b 0a 20 20 20 20 72 65 74 75  d*)0));.    retu
2a660 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
2a670 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  winFullPathname(
2a680 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  pVfs, zFilename,
2a690 20 6e 46 75 6c 6c 2c 20 7a 46 75 6c 6c 29 21 3d   nFull, zFull)!=
2a6a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a6b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
2a6c0 75 6c 6c 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ull);.    OSTRAC
2a6d0 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d  E(("DLOPEN name=
2a6e0 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22  %s, handle=%p\n"
2a6f0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f  , zFilename, (vo
2a700 69 64 2a 29 30 29 29 3b 0a 20 20 20 20 72 65 74  id*)0));.    ret
2a710 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 43 6f  urn 0;.  }.  zCo
2a720 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e  nverted = winCon
2a730 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65  vertFromUtf8File
2a740 6e 61 6d 65 28 7a 46 75 6c 6c 29 3b 0a 20 20 73  name(zFull);.  s
2a750 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
2a760 6c 29 3b 0a 23 65 6c 73 65 0a 20 20 76 6f 69 64  l);.#else.  void
2a770 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77   *zConverted = w
2a780 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66  inConvertFromUtf
2a790 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e  8Filename(zFilen
2a7a0 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ame);.  UNUSED_P
2a7b0 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
2a7c0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 43 6f  #endif.  if( zCo
2a7d0 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
2a7e0 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c 4f 50    OSTRACE(("DLOP
2a7f0 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64  EN name=%s, hand
2a800 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e  le=%p\n", zFilen
2a810 61 6d 65 2c 20 28 76 6f 69 64 2a 29 30 29 29 3b  ame, (void*)0));
2a820 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2a830 20 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28   }.  if( osIsNT(
2a840 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ) ){.#if SQLITE_
2a850 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 68 20 3d  OS_WINRT.    h =
2a860 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c   osLoadPackagedL
2a870 69 62 72 61 72 79 28 28 4c 50 43 57 53 54 52 29  ibrary((LPCWSTR)
2a880 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 29 3b 0a  zConverted, 0);.
2a890 23 65 6c 73 65 0a 20 20 20 20 68 20 3d 20 6f 73  #else.    h = os
2a8a0 4c 6f 61 64 4c 69 62 72 61 72 79 57 28 28 4c 50  LoadLibraryW((LP
2a8b0 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
2a8c0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69  );.#endif.  }.#i
2a8d0 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
2a8e0 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
2a8f0 65 7b 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61  e{.    h = osLoa
2a900 64 4c 69 62 72 61 72 79 41 28 28 63 68 61 72 2a  dLibraryA((char*
2a910 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  )zConverted);.  
2a920 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41  }.#endif.  OSTRA
2a930 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65  CE(("DLOPEN name
2a940 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e  =%s, handle=%p\n
2a950 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76  ", zFilename, (v
2a960 6f 69 64 2a 29 68 29 29 3b 0a 20 20 73 71 6c 69  oid*)h));.  sqli
2a970 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
2a980 74 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  ted);.  return (
2a990 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74 61 74 69  void*)h;.}.stati
2a9a0 63 20 76 6f 69 64 20 77 69 6e 44 6c 45 72 72 6f  c void winDlErro
2a9b0 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  r(sqlite3_vfs *p
2a9c0 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  Vfs, int nBuf, c
2a9d0 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20  har *zBufOut){. 
2a9e0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2a9f0 52 28 70 56 66 73 29 3b 0a 20 20 77 69 6e 47 65  R(pVfs);.  winGe
2aa00 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f 73  tLastErrorMsg(os
2aa10 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
2aa20 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 29 3b 0a  nBuf, zBufOut);.
2aa30 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a  }.static void (*
2aa40 77 69 6e 44 6c 53 79 6d 28 73 71 6c 69 74 65 33  winDlSym(sqlite3
2aa50 5f 76 66 73 20 2a 70 56 66 73 2c 76 6f 69 64 20  _vfs *pVfs,void 
2aa60 2a 70 48 2c 63 6f 6e 73 74 20 63 68 61 72 20 2a  *pH,const char *
2aa70 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20  zSym))(void){.  
2aa80 46 41 52 50 52 4f 43 20 70 72 6f 63 3b 0a 20 20  FARPROC proc;.  
2aa90 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2aaa0 28 70 56 66 73 29 3b 0a 20 20 70 72 6f 63 20 3d  (pVfs);.  proc =
2aab0 20 6f 73 47 65 74 50 72 6f 63 41 64 64 72 65 73   osGetProcAddres
2aac0 73 41 28 28 48 41 4e 44 4c 45 29 70 48 2c 20 7a  sA((HANDLE)pH, z
2aad0 53 79 6d 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  Sym);.  OSTRACE(
2aae0 28 22 44 4c 53 59 4d 20 68 61 6e 64 6c 65 3d 25  ("DLSYM handle=%
2aaf0 70 2c 20 73 79 6d 62 6f 6c 3d 25 73 2c 20 61 64  p, symbol=%s, ad
2ab00 64 72 65 73 73 3d 25 70 5c 6e 22 2c 0a 20 20 20  dress=%p\n",.   
2ab10 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
2ab20 48 2c 20 7a 53 79 6d 2c 20 28 76 6f 69 64 2a 29  H, zSym, (void*)
2ab30 70 72 6f 63 29 29 3b 0a 20 20 72 65 74 75 72 6e  proc));.  return
2ab40 20 28 76 6f 69 64 28 2a 29 28 76 6f 69 64 29 29   (void(*)(void))
2ab50 70 72 6f 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76  proc;.}.static v
2ab60 6f 69 64 20 77 69 6e 44 6c 43 6c 6f 73 65 28 73  oid winDlClose(s
2ab70 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2ab80 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29  , void *pHandle)
2ab90 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
2aba0 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 6f 73  ETER(pVfs);.  os
2abb0 46 72 65 65 4c 69 62 72 61 72 79 28 28 48 41 4e  FreeLibrary((HAN
2abc0 44 4c 45 29 70 48 61 6e 64 6c 65 29 3b 0a 20 20  DLE)pHandle);.  
2abd0 4f 53 54 52 41 43 45 28 28 22 44 4c 43 4c 4f 53  OSTRACE(("DLCLOS
2abe0 45 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20  E handle=%p\n", 
2abf0 28 76 6f 69 64 2a 29 70 48 61 6e 64 6c 65 29 29  (void*)pHandle))
2ac00 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20  ;.}.#else /* if 
2ac10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
2ac20 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65  _EXTENSION is de
2ac30 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66  fined: */.  #def
2ac40 69 6e 65 20 77 69 6e 44 6c 4f 70 65 6e 20 20 30  ine winDlOpen  0
2ac50 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c  .  #define winDl
2ac60 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e  Error 0.  #defin
2ac70 65 20 77 69 6e 44 6c 53 79 6d 20 20 20 30 0a 20  e winDlSym   0. 
2ac80 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 43 6c   #define winDlCl
2ac90 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f  ose 0.#endif.../
2aca0 2a 0a 2a 2a 20 57 72 69 74 65 20 75 70 20 74 6f  *.** Write up to
2acb0 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 72   nBuf bytes of r
2acc0 61 6e 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20 7a  andomness into z
2acd0 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Buf..*/.static i
2ace0 6e 74 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73  nt winRandomness
2acf0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
2ad00 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  fs, int nBuf, ch
2ad10 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69 6e 74  ar *zBuf){.  int
2ad20 20 6e 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44   n = 0;.  UNUSED
2ad30 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
2ad40 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
2ad50 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65  LITE_TEST) || de
2ad60 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
2ad70 54 5f 52 41 4e 44 4f 4d 4e 45 53 53 29 0a 20 20  T_RANDOMNESS).  
2ad80 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 6d 65 6d 73  n = nBuf;.  mems
2ad90 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66  et(zBuf, 0, nBuf
2ada0 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 73  );.#else.  if( s
2adb0 69 7a 65 6f 66 28 53 59 53 54 45 4d 54 49 4d 45  izeof(SYSTEMTIME
2adc0 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20  )<=nBuf-n ){.   
2add0 20 53 59 53 54 45 4d 54 49 4d 45 20 78 3b 0a 20   SYSTEMTIME x;. 
2ade0 20 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69     osGetSystemTi
2adf0 6d 65 28 26 78 29 3b 0a 20 20 20 20 6d 65 6d 63  me(&x);.    memc
2ae00 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 78 2c  py(&zBuf[n], &x,
2ae10 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20   sizeof(x));.   
2ae20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 78 29 3b   n += sizeof(x);
2ae30 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f  .  }.  if( sizeo
2ae40 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e  f(DWORD)<=nBuf-n
2ae50 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 70 69   ){.    DWORD pi
2ae60 64 20 3d 20 6f 73 47 65 74 43 75 72 72 65 6e 74  d = osGetCurrent
2ae70 50 72 6f 63 65 73 73 49 64 28 29 3b 0a 20 20 20  ProcessId();.   
2ae80 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d   memcpy(&zBuf[n]
2ae90 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70  , &pid, sizeof(p
2aea0 69 64 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73  id));.    n += s
2aeb0 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 7d 0a  izeof(pid);.  }.
2aec0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
2aed0 4e 52 54 0a 20 20 69 66 28 20 73 69 7a 65 6f 66  NRT.  if( sizeof
2aee0 28 55 4c 4f 4e 47 4c 4f 4e 47 29 3c 3d 6e 42 75  (ULONGLONG)<=nBu
2aef0 66 2d 6e 20 29 7b 0a 20 20 20 20 55 4c 4f 4e 47  f-n ){.    ULONG
2af00 4c 4f 4e 47 20 63 6e 74 20 3d 20 6f 73 47 65 74  LONG cnt = osGet
2af10 54 69 63 6b 43 6f 75 6e 74 36 34 28 29 3b 0a 20  TickCount64();. 
2af20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
2af30 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66  n], &cnt, sizeof
2af40 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d  (cnt));.    n +=
2af50 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20   sizeof(cnt);.  
2af60 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 73 69  }.#else.  if( si
2af70 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75  zeof(DWORD)<=nBu
2af80 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44  f-n ){.    DWORD
2af90 20 63 6e 74 20 3d 20 6f 73 47 65 74 54 69 63 6b   cnt = osGetTick
2afa0 43 6f 75 6e 74 28 29 3b 0a 20 20 20 20 6d 65 6d  Count();.    mem
2afb0 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63  cpy(&zBuf[n], &c
2afc0 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29 29  nt, sizeof(cnt))
2afd0 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f  ;.    n += sizeo
2afe0 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64  f(cnt);.  }.#end
2aff0 69 66 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28  if.  if( sizeof(
2b000 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 29 3c 3d  LARGE_INTEGER)<=
2b010 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 4c 41  nBuf-n ){.    LA
2b020 52 47 45 5f 49 4e 54 45 47 45 52 20 69 3b 0a 20  RGE_INTEGER i;. 
2b030 20 20 20 6f 73 51 75 65 72 79 50 65 72 66 6f 72     osQueryPerfor
2b040 6d 61 6e 63 65 43 6f 75 6e 74 65 72 28 26 69 29  manceCounter(&i)
2b050 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42  ;.    memcpy(&zB
2b060 75 66 5b 6e 5d 2c 20 26 69 2c 20 73 69 7a 65 6f  uf[n], &i, sizeo
2b070 66 28 69 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20  f(i));.    n += 
2b080 73 69 7a 65 6f 66 28 69 29 3b 0a 20 20 7d 0a 23  sizeof(i);.  }.#
2b090 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
2b0a0 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
2b0b0 53 5f 57 49 4e 52 54 20 26 26 20 53 51 4c 49 54  S_WINRT && SQLIT
2b0c0 45 5f 57 49 4e 33 32 5f 55 53 45 5f 55 55 49 44  E_WIN32_USE_UUID
2b0d0 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 55 55  .  if( sizeof(UU
2b0e0 49 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20  ID)<=nBuf-n ){. 
2b0f0 20 20 20 55 55 49 44 20 69 64 3b 0a 20 20 20 20     UUID id;.    
2b100 6d 65 6d 73 65 74 28 26 69 64 2c 20 30 2c 20 73  memset(&id, 0, s
2b110 69 7a 65 6f 66 28 55 55 49 44 29 29 3b 0a 20 20  izeof(UUID));.  
2b120 20 20 6f 73 55 75 69 64 43 72 65 61 74 65 28 26    osUuidCreate(&
2b130 69 64 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  id);.    memcpy(
2b140 26 7a 42 75 66 5b 6e 5d 2c 20 26 69 64 2c 20 73  &zBuf[n], &id, s
2b150 69 7a 65 6f 66 28 55 55 49 44 29 29 3b 0a 20 20  izeof(UUID));.  
2b160 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 55 55    n += sizeof(UU
2b170 49 44 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  ID);.  }.  if( s
2b180 69 7a 65 6f 66 28 55 55 49 44 29 3c 3d 6e 42 75  izeof(UUID)<=nBu
2b190 66 2d 6e 20 29 7b 0a 20 20 20 20 55 55 49 44 20  f-n ){.    UUID 
2b1a0 69 64 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  id;.    memset(&
2b1b0 69 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 55 55  id, 0, sizeof(UU
2b1c0 49 44 29 29 3b 0a 20 20 20 20 6f 73 55 75 69 64  ID));.    osUuid
2b1d0 43 72 65 61 74 65 53 65 71 75 65 6e 74 69 61 6c  CreateSequential
2b1e0 28 26 69 64 29 3b 0a 20 20 20 20 6d 65 6d 63 70  (&id);.    memcp
2b1f0 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 69 64 2c  y(&zBuf[n], &id,
2b200 20 73 69 7a 65 6f 66 28 55 55 49 44 29 29 3b 0a   sizeof(UUID));.
2b210 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28      n += sizeof(
2b220 55 55 49 44 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  UUID);.  }.#endi
2b230 66 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  f.#endif /* defi
2b240 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
2b250 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
2b260 54 45 5f 5a 45 52 4f 5f 50 52 4e 47 5f 53 45 45  TE_ZERO_PRNG_SEE
2b270 44 29 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e  D) */.  return n
2b280 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65  ;.}.../*.** Slee
2b290 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77  p for a little w
2b2a0 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68  hile.  Return th
2b2b0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
2b2c0 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69   slept..*/.stati
2b2d0 63 20 69 6e 74 20 77 69 6e 53 6c 65 65 70 28 73  c int winSleep(s
2b2e0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2b2f0 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 29 7b  , int microsec){
2b300 0a 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  .  sqlite3_win32
2b310 5f 73 6c 65 65 70 28 28 6d 69 63 72 6f 73 65 63  _sleep((microsec
2b320 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 20 20 55  +999)/1000);.  U
2b330 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2b340 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  pVfs);.  return 
2b350 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f  ((microsec+999)/
2b360 31 30 30 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f  1000)*1000;.}../
2b370 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
2b380 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20  ng variable, if 
2b390 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  set to a non-zer
2b3a0 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65  o value, is inte
2b3b0 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68  rpreted as.** th
2b3c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f  e number of seco
2b3d0 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61  nds since 1970 a
2b3e0 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65  nd is used to se
2b3f0 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  t the result of.
2b400 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72  ** sqlite3OsCurr
2b410 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67  entTime() during
2b420 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66   testing..*/.#if
2b430 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2b440 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72  int sqlite3_curr
2b450 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f  ent_time = 0;  /
2b460 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69  * Fake system ti
2b470 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69  me in seconds si
2b480 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e  nce 1970. */.#en
2b490 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  dif../*.** Find 
2b4a0 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
2b4b0 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43   (in Universal C
2b4c0 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29  oordinated Time)
2b4d0 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
2b4e0 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72  iNow.** the curr
2b4f0 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
2b500 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
2b510 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38  y number times 8
2b520 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a  6_400_000.  In.*
2b530 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  * other words, w
2b540 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
2b550 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
2b560 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63  illiseconds sinc
2b570 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20  e the Julian.** 
2b580 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e  epoch of noon in
2b590 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f   Greenwich on No
2b5a0 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20  vember 24, 4714 
2b5b0 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  B.C according to
2b5c0 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69   the.** prolepti
2b5d0 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65  c Gregorian cale
2b5e0 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  ndar..**.** On s
2b5f0 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53  uccess, return S
2b600 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72  QLITE_OK.  Retur
2b610 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69  n SQLITE_ERROR i
2b620 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64  f the time and d
2b630 61 74 65 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  ate.** cannot be
2b640 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
2b650 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74  c int winCurrent
2b660 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65  TimeInt64(sqlite
2b670 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 73 71 6c  3_vfs *pVfs, sql
2b680 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f  ite3_int64 *piNo
2b690 77 29 7b 0a 20 20 2f 2a 20 46 49 4c 45 54 49 4d  w){.  /* FILETIM
2b6a0 45 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  E structure is a
2b6b0 20 36 34 2d 62 69 74 20 76 61 6c 75 65 20 72 65   64-bit value re
2b6c0 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 6e  presenting the n
2b6d0 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 31 30  umber of.     10
2b6e0 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69 6e 74  0-nanosecond int
2b6f0 65 72 76 61 6c 73 20 73 69 6e 63 65 20 4a 61 6e  ervals since Jan
2b700 75 61 72 79 20 31 2c 20 31 36 30 31 20 28 3d 20  uary 1, 1601 (= 
2b710 4a 44 20 32 33 30 35 38 31 33 2e 35 29 2e 0a 20  JD 2305813.5).. 
2b720 20 2a 2f 0a 20 20 46 49 4c 45 54 49 4d 45 20 66   */.  FILETIME f
2b730 74 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  t;.  static cons
2b740 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  t sqlite3_int64 
2b750 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68  winFiletimeEpoch
2b760 20 3d 20 32 33 30 35 38 31 33 35 2a 28 73 71 6c   = 23058135*(sql
2b770 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30  ite3_int64)86400
2b780 30 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  00;.#ifdef SQLIT
2b790 45 5f 54 45 53 54 0a 20 20 73 74 61 74 69 63 20  E_TEST.  static 
2b7a0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e  const sqlite3_in
2b7b0 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20  t64 unixEpoch = 
2b7c0 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65  24405875*(sqlite
2b7d0 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b  3_int64)8640000;
2b7e0 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 32 5e 33  .#endif.  /* 2^3
2b7f0 32 20 2d 20 74 6f 20 61 76 6f 69 64 20 75 73 65  2 - to avoid use
2b800 20 6f 66 20 4c 4c 20 61 6e 64 20 77 61 72 6e 69   of LL and warni
2b810 6e 67 73 20 69 6e 20 67 63 63 20 2a 2f 0a 20 20  ngs in gcc */.  
2b820 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
2b830 69 74 65 33 5f 69 6e 74 36 34 20 6d 61 78 33 32  ite3_int64 max32
2b840 42 69 74 56 61 6c 75 65 20 3d 0a 20 20 20 20 20  BitValue =.     
2b850 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
2b860 32 30 30 30 30 30 30 30 30 30 20 2b 20 28 73 71  2000000000 + (sq
2b870 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30  lite3_int64)2000
2b880 30 30 30 30 30 30 20 2b 0a 20 20 20 20 20 20 28  000000 +.      (
2b890 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 39  sqlite3_int64)29
2b8a0 34 39 36 37 32 39 36 3b 0a 0a 23 69 66 20 53 51  4967296;..#if SQ
2b8b0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
2b8c0 53 59 53 54 45 4d 54 49 4d 45 20 74 69 6d 65 3b  SYSTEMTIME time;
2b8d0 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69  .  osGetSystemTi
2b8e0 6d 65 28 26 74 69 6d 65 29 3b 0a 20 20 2f 2a 20  me(&time);.  /* 
2b8f0 69 66 20 53 79 73 74 65 6d 54 69 6d 65 54 6f 46  if SystemTimeToF
2b900 69 6c 65 54 69 6d 65 28 29 20 66 61 69 6c 73 2c  ileTime() fails,
2b910 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f   it returns zero
2b920 2e 20 2a 2f 0a 20 20 69 66 20 28 21 6f 73 53 79  . */.  if (!osSy
2b930 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69  stemTimeToFileTi
2b940 6d 65 28 26 74 69 6d 65 2c 26 66 74 29 29 7b 0a  me(&time,&ft)){.
2b950 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2b960 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6c  E_ERROR;.  }.#el
2b970 73 65 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d  se.  osGetSystem
2b980 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 28 20  TimeAsFileTime( 
2b990 26 66 74 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  &ft );.#endif.. 
2b9a0 20 2a 70 69 4e 6f 77 20 3d 20 77 69 6e 46 69 6c   *piNow = winFil
2b9b0 65 74 69 6d 65 45 70 6f 63 68 20 2b 0a 20 20 20  etimeEpoch +.   
2b9c0 20 20 20 20 20 20 20 20 20 28 28 28 28 73 71 6c           ((((sql
2b9d0 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77  ite3_int64)ft.dw
2b9e0 48 69 67 68 44 61 74 65 54 69 6d 65 29 2a 6d 61  HighDateTime)*ma
2b9f0 78 33 32 42 69 74 56 61 6c 75 65 29 20 2b 0a 20  x32BitValue) +. 
2ba00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
2ba10 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e  qlite3_int64)ft.
2ba20 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 29 2f 28  dwLowDateTime)/(
2ba30 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 31 30  sqlite3_int64)10
2ba40 30 30 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  000;..#ifdef SQL
2ba50 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73  ITE_TEST.  if( s
2ba60 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
2ba70 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f  ime ){.    *piNo
2ba80 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65  w = 1000*(sqlite
2ba90 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f  3_int64)sqlite3_
2baa0 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75  current_time + u
2bab0 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65  nixEpoch;.  }.#e
2bac0 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41  ndif.  UNUSED_PA
2bad0 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
2bae0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2baf0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  K;.}../*.** Find
2bb00 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
2bb10 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20  e (in Universal 
2bb20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65  Coordinated Time
2bb30 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a  ).  Write the.**
2bb40 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e   current time an
2bb50 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69  d date as a Juli
2bb60 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e  an Day number in
2bb70 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a  to *prNow and.**
2bb80 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75   return 0.  Retu
2bb90 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65  rn 1 if the time
2bba0 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74   and date cannot
2bbb0 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74   be found..*/.st
2bbc0 61 74 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72  atic int winCurr
2bbd0 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f  entTime(sqlite3_
2bbe0 76 66 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c  vfs *pVfs, doubl
2bbf0 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 69 6e 74  e *prNow){.  int
2bc00 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69   rc;.  sqlite3_i
2bc10 6e 74 36 34 20 69 3b 0a 20 20 72 63 20 3d 20 77  nt64 i;.  rc = w
2bc20 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  inCurrentTimeInt
2bc30 36 34 28 70 56 66 73 2c 20 26 69 29 3b 0a 20 20  64(pVfs, &i);.  
2bc40 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 2a  if( !rc ){.    *
2bc50 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30 30  prNow = i/864000
2bc60 30 30 2e 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  00.0;.  }.  retu
2bc70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2bc80 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74  The idea is that
2bc90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
2bca0 6f 72 6b 73 20 6c 69 6b 65 20 61 20 63 6f 6d 62  orks like a comb
2bcb0 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 47 65  ination of.** Ge
2bcc0 74 4c 61 73 74 45 72 72 6f 72 28 29 20 61 6e 64  tLastError() and
2bcd0 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 28 29   FormatMessage()
2bce0 20 6f 6e 20 57 69 6e 64 6f 77 73 20 28 6f 72 20   on Windows (or 
2bcf0 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a 20 73 74 72  errno and.** str
2bd00 65 72 72 6f 72 5f 72 28 29 20 6f 6e 20 55 6e 69  error_r() on Uni
2bd10 78 29 2e 20 41 66 74 65 72 20 61 6e 20 65 72 72  x). After an err
2bd20 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 62  or is returned b
2bd30 79 20 61 6e 20 4f 53 0a 2a 2a 20 66 75 6e 63 74  y an OS.** funct
2bd40 69 6f 6e 2c 20 53 51 4c 69 74 65 20 63 61 6c 6c  ion, SQLite call
2bd50 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
2bd60 77 69 74 68 20 7a 42 75 66 20 70 6f 69 6e 74 69  with zBuf pointi
2bd70 6e 67 20 74 6f 0a 2a 2a 20 61 20 62 75 66 66 65  ng to.** a buffe
2bd80 72 20 6f 66 20 6e 42 75 66 20 62 79 74 65 73 2e  r of nBuf bytes.
2bd90 20 54 68 65 20 4f 53 20 6c 61 79 65 72 20 73 68   The OS layer sh
2bda0 6f 75 6c 64 20 70 6f 70 75 6c 61 74 65 20 74 68  ould populate th
2bdb0 65 0a 2a 2a 20 62 75 66 66 65 72 20 77 69 74 68  e.** buffer with
2bdc0 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
2bdd0 64 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  d UTF-8 encoded 
2bde0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
2bdf0 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20   describing the 
2be00 6c 61 73 74 20 49 4f 20 65 72 72 6f 72 20 74 6f  last IO error to
2be10 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 20 77   have occurred w
2be20 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e  ithin the callin
2be30 67 0a 2a 2a 20 74 68 72 65 61 64 2e 0a 2a 2a 0a  g.** thread..**.
2be40 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20  ** If the error 
2be50 6d 65 73 73 61 67 65 20 69 73 20 74 6f 6f 20 6c  message is too l
2be60 61 72 67 65 20 66 6f 72 20 74 68 65 20 73 75 70  arge for the sup
2be70 70 6c 69 65 64 20 62 75 66 66 65 72 2c 0a 2a 2a  plied buffer,.**
2be80 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 74 72   it should be tr
2be90 75 6e 63 61 74 65 64 2e 20 54 68 65 20 72 65 74  uncated. The ret
2bea0 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 78 47 65  urn value of xGe
2beb0 74 4c 61 73 74 45 72 72 6f 72 0a 2a 2a 20 69 73  tLastError.** is
2bec0 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72 72   zero if the err
2bed0 6f 72 20 6d 65 73 73 61 67 65 20 66 69 74 73 20  or message fits 
2bee0 69 6e 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f  in the buffer, o
2bef0 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74  r non-zero.** ot
2bf00 68 65 72 77 69 73 65 20 28 69 66 20 74 68 65 20  herwise (if the 
2bf10 6d 65 73 73 61 67 65 20 77 61 73 20 74 72 75 6e  message was trun
2bf20 63 61 74 65 64 29 2e 20 49 66 20 6e 6f 6e 2d 7a  cated). If non-z
2bf30 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ero is returned,
2bf40 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e  .** then it is n
2bf50 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ot necessary to 
2bf60 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 2d  include the nul-
2bf70 74 65 72 6d 69 6e 61 74 6f 72 20 63 68 61 72 61  terminator chara
2bf80 63 74 65 72 0a 2a 2a 20 69 6e 20 74 68 65 20 6f  cter.** in the o
2bf90 75 74 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2a  utput buffer..**
2bfa0 0a 2a 2a 20 4e 6f 74 20 73 75 70 70 6c 79 69 6e  .** Not supplyin
2bfb0 67 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  g an error messa
2bfc0 67 65 20 77 69 6c 6c 20 68 61 76 65 20 6e 6f 20  ge will have no 
2bfd0 61 64 76 65 72 73 65 20 65 66 66 65 63 74 0a 2a  adverse effect.*
2bfe0 2a 20 6f 6e 20 53 51 4c 69 74 65 2e 20 49 74 20  * on SQLite. It 
2bff0 69 73 20 66 69 6e 65 20 74 6f 20 68 61 76 65 20  is fine to have 
2c000 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  an implementatio
2c010 6e 20 74 68 61 74 20 6e 65 76 65 72 0a 2a 2a 20  n that never.** 
2c020 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
2c030 20 6d 65 73 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20   message:.**.** 
2c040 20 20 69 6e 74 20 78 47 65 74 4c 61 73 74 45 72    int xGetLastEr
2c050 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
2c060 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c  *pVfs, int nBuf,
2c070 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 2a 2a   char *zBuf){.**
2c080 20 20 20 20 20 61 73 73 65 72 74 28 7a 42 75 66       assert(zBuf
2c090 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a 2a 2a 20 20  [0]=='\0');.**  
2c0a0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 20     return 0;.** 
2c0b0 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65    }.**.** Howeve
2c0c0 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6d 65  r if an error me
2c0d0 73 73 61 67 65 20 69 73 20 73 75 70 70 6c 69 65  ssage is supplie
2c0e0 64 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 69 6e  d, it will be in
2c0f0 63 6f 72 70 6f 72 61 74 65 64 0a 2a 2a 20 62 79  corporated.** by
2c100 20 73 71 6c 69 74 65 20 69 6e 74 6f 20 74 68 65   sqlite into the
2c110 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61   error message a
2c120 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20  vailable to the 
2c130 75 73 65 72 20 75 73 69 6e 67 0a 2a 2a 20 73 71  user using.** sq
2c140 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 2c 20  lite3_errmsg(), 
2c150 70 6f 73 73 69 62 6c 79 20 6d 61 6b 69 6e 67 20  possibly making 
2c160 49 4f 20 65 72 72 6f 72 73 20 65 61 73 69 65 72  IO errors easier
2c170 20 74 6f 20 64 65 62 75 67 2e 0a 2a 2f 0a 73 74   to debug..*/.st
2c180 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 4c  atic int winGetL
2c190 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33  astError(sqlite3
2c1a0 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
2c1b0 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
2c1c0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2c1d0 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72  METER(pVfs);.  r
2c1e0 65 74 75 72 6e 20 77 69 6e 47 65 74 4c 61 73 74  eturn winGetLast
2c1f0 45 72 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61  ErrorMsg(osGetLa
2c200 73 74 45 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c  stError(), nBuf,
2c210 20 7a 42 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zBuf);.}../*.**
2c220 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20   Initialize and 
2c230 64 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  deinitialize the
2c240 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
2c250 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  m interface..*/.
2c260 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69  int sqlite3_os_i
2c270 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  nit(void){.  sta
2c280 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20  tic sqlite3_vfs 
2c290 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20 20 20 33  winVfs = {.    3
2c2a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2c2b0 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
2c2c0 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69  */.    sizeof(wi
2c2d0 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73  nFile),     /* s
2c2e0 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 53  zOsFile */.    S
2c2f0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f  QLITE_WIN32_MAX_
2c300 50 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a 20 6d  PATH_BYTES, /* m
2c310 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20  xPathname */.   
2c320 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2c330 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a        /* pNext *
2c340 2f 0a 20 20 20 20 22 77 69 6e 33 32 22 2c 20 20  /.    "win32",  
2c350 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e             /* zN
2c360 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ame */.    0,   
2c370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c380 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20  /* pAppData */. 
2c390 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20     winOpen,     
2c3a0 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e          /* xOpen
2c3b0 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74   */.    winDelet
2c3c0 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
2c3d0 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77  xDelete */.    w
2c3e0 69 6e 41 63 63 65 73 73 2c 20 20 20 20 20 20 20  inAccess,       
2c3f0 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a      /* xAccess *
2c400 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74  /.    winFullPat
2c410 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46  hname,     /* xF
2c420 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20  ullPathname */. 
2c430 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20     winDlOpen,   
2c440 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70          /* xDlOp
2c450 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45  en */.    winDlE
2c460 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f  rror,          /
2c470 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20  * xDlError */.  
2c480 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20    winDlSym,     
2c490 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d         /* xDlSym
2c4a0 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f   */.    winDlClo
2c4b0 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
2c4c0 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20  xDlClose */.    
2c4d0 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20  winRandomness,  
2c4e0 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e       /* xRandomn
2c4f0 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c  ess */.    winSl
2c500 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eep,            
2c510 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20  /* xSleep */.   
2c520 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c   winCurrentTime,
2c530 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e        /* xCurren
2c540 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e  tTime */.    win
2c550 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20  GetLastError,   
2c560 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72    /* xGetLastErr
2c570 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72  or */.    winCur
2c580 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f  rentTimeInt64, /
2c590 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  * xCurrentTimeIn
2c5a0 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65  t64 */.    winSe
2c5b0 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20  tSystemCall,    
2c5c0 2f 2a 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c  /* xSetSystemCal
2c5d0 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 53  l */.    winGetS
2c5e0 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a  ystemCall,    /*
2c5f0 20 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20   xGetSystemCall 
2c600 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74 53 79  */.    winNextSy
2c610 73 74 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20 78  stemCall,   /* x
2c620 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a  NextSystemCall *
2c630 2f 0a 20 20 7d 3b 0a 23 69 66 20 64 65 66 69 6e  /.  };.#if defin
2c640 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
2c650 48 41 53 5f 57 49 44 45 29 0a 20 20 73 74 61 74  HAS_WIDE).  stat
2c660 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 77  ic sqlite3_vfs w
2c670 69 6e 4c 6f 6e 67 50 61 74 68 56 66 73 20 3d 20  inLongPathVfs = 
2c680 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20 20  {.    3,        
2c690 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
2c6a0 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69  ersion */.    si
2c6b0 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20  zeof(winFile),  
2c6c0 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a     /* szOsFile *
2c6d0 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e  /.    SQLITE_WIN
2c6e0 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45  NT_MAX_PATH_BYTE
2c6f0 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65  S, /* mxPathname
2c700 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20   */.    0,      
2c710 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c720 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 77 69  pNext */.    "wi
2c730 6e 33 32 2d 6c 6f 6e 67 70 61 74 68 22 2c 20 20  n32-longpath",  
2c740 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20    /* zName */.  
2c750 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2c760 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61         /* pAppDa
2c770 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65  ta */.    winOpe
2c780 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  n,             /
2c790 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77  * xOpen */.    w
2c7a0 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20  inDelete,       
2c7b0 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a      /* xDelete *
2c7c0 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73 73 2c  /.    winAccess,
2c7d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41             /* xA
2c7e0 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e  ccess */.    win
2c7f0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20  FullPathname,   
2c800 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61    /* xFullPathna
2c810 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f  me */.    winDlO
2c820 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pen,           /
2c830 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20  * xDlOpen */.   
2c840 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20   winDlError,    
2c850 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f        /* xDlErro
2c860 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79  r */.    winDlSy
2c870 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  m,            /*
2c880 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77   xDlSym */.    w
2c890 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20  inDlClose,      
2c8a0 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20      /* xDlClose 
2c8b0 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d  */.    winRandom
2c8c0 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a 20 78  ness,       /* x
2c8d0 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20  Randomness */.  
2c8e0 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20 20    winSleep,     
2c8f0 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70         /* xSleep
2c900 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65   */.    winCurre
2c910 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20  ntTime,      /* 
2c920 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a  xCurrentTime */.
2c930 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72      winGetLastEr
2c940 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47 65 74  ror,     /* xGet
2c950 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20  LastError */.   
2c960 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49   winCurrentTimeI
2c970 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72 65 6e  nt64, /* xCurren
2c980 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20  tTimeInt64 */.  
2c990 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61    winSetSystemCa
2c9a0 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65 74 53 79  ll,    /* xSetSy
2c9b0 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20  stemCall */.    
2c9c0 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c  winGetSystemCall
2c9d0 2c 20 20 20 20 2f 2a 20 78 47 65 74 53 79 73 74  ,    /* xGetSyst
2c9e0 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69  emCall */.    wi
2c9f0 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c  nNextSystemCall,
2ca00 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65     /* xNextSyste
2ca10 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 65  mCall */.  };.#e
2ca20 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c  ndif..  /* Doubl
2ca30 65 2d 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  e-check that the
2ca40 20 61 53 79 73 63 61 6c 6c 5b 5d 20 61 72 72 61   aSyscall[] arra
2ca50 79 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 73 74  y has been const
2ca60 72 75 63 74 65 64 0a 20 20 2a 2a 20 63 6f 72 72  ructed.  ** corr
2ca70 65 63 74 6c 79 2e 20 20 53 65 65 20 74 69 63 6b  ectly.  See tick
2ca80 65 74 20 5b 62 62 33 61 38 36 65 38 39 30 63 38  et [bb3a86e890c8
2ca90 65 39 36 61 62 5d 20 2a 2f 0a 20 20 61 73 73 65  e96ab] */.  asse
2caa0 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 61 53  rt( ArraySize(aS
2cab0 79 73 63 61 6c 6c 29 3d 3d 38 30 20 29 3b 0a 0a  yscall)==80 );..
2cac0 20 20 2f 2a 20 67 65 74 20 6d 65 6d 6f 72 79 20    /* get memory 
2cad0 6d 61 70 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 67  map allocation g
2cae0 72 61 6e 75 6c 61 72 69 74 79 20 2a 2f 0a 20 20  ranularity */.  
2caf0 6d 65 6d 73 65 74 28 26 77 69 6e 53 79 73 49 6e  memset(&winSysIn
2cb00 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 59  fo, 0, sizeof(SY
2cb10 53 54 45 4d 5f 49 4e 46 4f 29 29 3b 0a 23 69 66  STEM_INFO));.#if
2cb20 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
2cb30 0a 20 20 6f 73 47 65 74 4e 61 74 69 76 65 53 79  .  osGetNativeSy
2cb40 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73  stemInfo(&winSys
2cb50 49 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 6f  Info);.#else.  o
2cb60 73 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28 26  sGetSystemInfo(&
2cb70 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 65 6e  winSysInfo);.#en
2cb80 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 77 69  dif.  assert( wi
2cb90 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63  nSysInfo.dwAlloc
2cba0 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79  ationGranularity
2cbb0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
2cbc0 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67  winSysInfo.dwPag
2cbd0 65 53 69 7a 65 3e 30 20 29 3b 0a 0a 20 20 73 71  eSize>0 );..  sq
2cbe0 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
2cbf0 65 72 28 26 77 69 6e 56 66 73 2c 20 31 29 3b 0a  er(&winVfs, 1);.
2cc00 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
2cc10 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
2cc20 44 45 29 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  DE).  sqlite3_vf
2cc30 73 5f 72 65 67 69 73 74 65 72 28 26 77 69 6e 4c  s_register(&winL
2cc40 6f 6e 67 50 61 74 68 56 66 73 2c 20 30 29 3b 0a  ongPathVfs, 0);.
2cc50 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
2cc60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69   SQLITE_OK;.}..i
2cc70 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e  nt sqlite3_os_en
2cc80 64 28 76 6f 69 64 29 7b 0a 23 69 66 20 53 51 4c  d(void){.#if SQL
2cc90 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69  ITE_OS_WINRT.  i
2cca0 66 28 20 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c  f( sleepObj!=NUL
2ccb0 4c 20 29 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65  L ){.    osClose
2ccc0 48 61 6e 64 6c 65 28 73 6c 65 65 70 4f 62 6a 29  Handle(sleepObj)
2ccd0 3b 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a 20 3d  ;.    sleepObj =
2cce0 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 23 65 6e 64 69   NULL;.  }.#endi
2ccf0 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
2cd00 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  E_OK;.}..#endif 
2cd10 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  /* SQLITE_OS_WIN
2cd20 20 2a 2f 0a                                       */.