/ Hex Artifact Content
Login

Artifact 659d2ea531c671e5322d896f61011253786e8e70:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 57 69 6e 64 6f 77 73 2e  ific to Windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
0210: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75   */../*.** Inclu
0220: 64 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20  de code that is 
0230: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73  common to all os
0240: 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69  _*.c files.*/.#i
0250: 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f  nclude "os_commo
0260: 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c  n.h"../*.** Incl
0270: 75 64 65 20 74 68 65 20 68 65 61 64 65 72 20 66  ude the header f
0280: 69 6c 65 20 66 6f 72 20 74 68 65 20 57 69 6e 64  ile for the Wind
0290: 6f 77 73 20 56 46 53 2e 0a 2a 2f 0a 23 69 6e 63  ows VFS..*/.#inc
02a0: 6c 75 64 65 20 22 6f 73 5f 77 69 6e 2e 68 22 0a  lude "os_win.h".
02b0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 69 6e 67  ./*.** Compiling
02c0: 20 61 6e 64 20 75 73 69 6e 67 20 57 41 4c 20 6d   and using WAL m
02d0: 6f 64 65 20 72 65 71 75 69 72 65 73 20 73 65 76  ode requires sev
02e0: 65 72 61 6c 20 41 50 49 73 20 74 68 61 74 20 61  eral APIs that a
02f0: 72 65 20 6f 6e 6c 79 0a 2a 2a 20 61 76 61 69 6c  re only.** avail
0300: 61 62 6c 65 20 69 6e 20 57 69 6e 64 6f 77 73 20  able in Windows 
0310: 70 6c 61 74 66 6f 72 6d 73 20 62 61 73 65 64 20  platforms based 
0320: 6f 6e 20 74 68 65 20 4e 54 20 6b 65 72 6e 65 6c  on the NT kernel
0330: 2e 0a 2a 2f 0a 23 69 66 20 21 53 51 4c 49 54 45  ..*/.#if !SQLITE
0340: 5f 4f 53 5f 57 49 4e 4e 54 20 26 26 20 21 64 65  _OS_WINNT && !de
0350: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
0360: 54 5f 57 41 4c 29 0a 23 20 20 65 72 72 6f 72 20  T_WAL).#  error 
0370: 22 57 41 4c 20 6d 6f 64 65 20 72 65 71 75 69 72  "WAL mode requir
0380: 65 73 20 73 75 70 70 6f 72 74 20 66 72 6f 6d 20  es support from 
0390: 74 68 65 20 57 69 6e 64 6f 77 73 20 4e 54 20 6b  the Windows NT k
03a0: 65 72 6e 65 6c 2c 20 63 6f 6d 70 69 6c 65 5c 0a  ernel, compile\.
03b0: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 4d 49   with SQLITE_OMI
03c0: 54 5f 57 41 4c 2e 22 0a 23 65 6e 64 69 66 0a 0a  T_WAL.".#endif..
03d0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
03e0: 49 4e 4e 54 20 26 26 20 53 51 4c 49 54 45 5f 4d  INNT && SQLITE_M
03f0: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23  AX_MMAP_SIZE>0.#
0400: 20 20 65 72 72 6f 72 20 22 4d 65 6d 6f 72 79 20    error "Memory 
0410: 6d 61 70 70 65 64 20 66 69 6c 65 73 20 72 65 71  mapped files req
0420: 75 69 72 65 20 73 75 70 70 6f 72 74 20 66 72 6f  uire support fro
0430: 6d 20 74 68 65 20 57 69 6e 64 6f 77 73 20 4e 54  m the Windows NT
0440: 20 6b 65 72 6e 65 6c 2c 5c 0a 20 63 6f 6d 70 69   kernel,\. compi
0450: 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4d  le with SQLITE_M
0460: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3d 30 2e 22  AX_MMAP_SIZE=0."
0470: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
0480: 72 65 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 57  re most of the W
0490: 69 6e 33 32 20 41 4e 53 49 20 41 50 49 73 20 61  in32 ANSI APIs a
04a0: 76 61 69 6c 61 62 6c 65 20 28 69 2e 65 2e 20 77  vailable (i.e. w
04b0: 69 74 68 20 63 65 72 74 61 69 6e 20 65 78 63 65  ith certain exce
04c0: 70 74 69 6f 6e 73 0a 2a 2a 20 62 61 73 65 64 20  ptions.** based 
04d0: 6f 6e 20 74 68 65 20 73 75 62 2d 70 6c 61 74 66  on the sub-platf
04e0: 6f 72 6d 29 3f 0a 2a 2f 0a 23 69 66 20 21 53 51  orm)?.*/.#if !SQ
04f0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
0500: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
0510: 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  T && !defined(SQ
0520: 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 41 4e  LITE_WIN32_NO_AN
0530: 53 49 29 0a 23 20 20 64 65 66 69 6e 65 20 53 51  SI).#  define SQ
0540: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
0550: 4e 53 49 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  NSI.#endif../*.*
0560: 2a 20 41 72 65 20 6d 6f 73 74 20 6f 66 20 74 68  * Are most of th
0570: 65 20 57 69 6e 33 32 20 55 6e 69 63 6f 64 65 20  e Win32 Unicode 
0580: 41 50 49 73 20 61 76 61 69 6c 61 62 6c 65 20 28  APIs available (
0590: 69 2e 65 2e 20 77 69 74 68 20 63 65 72 74 61 69  i.e. with certai
05a0: 6e 20 65 78 63 65 70 74 69 6f 6e 73 0a 2a 2a 20  n exceptions.** 
05b0: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 75 62  based on the sub
05c0: 2d 70 6c 61 74 66 6f 72 6d 29 3f 0a 2a 2f 0a 23  -platform)?.*/.#
05d0: 69 66 20 28 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if (SQLITE_OS_WI
05e0: 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53  NCE || SQLITE_OS
05f0: 5f 57 49 4e 4e 54 20 7c 7c 20 53 51 4c 49 54 45  _WINNT || SQLITE
0600: 5f 4f 53 5f 57 49 4e 52 54 29 20 26 26 20 5c 0a  _OS_WINRT) && \.
0610: 20 20 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c      !defined(SQL
0620: 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 57 49 44  ITE_WIN32_NO_WID
0630: 45 29 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  E).#  define SQL
0640: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
0650: 44 45 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  DE.#endif../*.**
0660: 20 4d 61 6b 65 20 73 75 72 65 20 61 74 20 6c 65   Make sure at le
0670: 61 73 74 20 6f 6e 65 20 73 65 74 20 6f 66 20 57  ast one set of W
0680: 69 6e 33 32 20 41 50 49 73 20 69 73 20 61 76 61  in32 APIs is ava
0690: 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 20 21  ilable..*/.#if !
06a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
06b0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26  IN32_HAS_ANSI) &
06c0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
06d0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
06e0: 29 0a 23 20 20 65 72 72 6f 72 20 22 41 74 20 6c  ).#  error "At l
06f0: 65 61 73 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49  east one of SQLI
0700: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
0710: 49 20 61 6e 64 20 53 51 4c 49 54 45 5f 57 49 4e  I and SQLITE_WIN
0720: 33 32 5f 48 41 53 5f 57 49 44 45 5c 0a 20 6d 75  32_HAS_WIDE\. mu
0730: 73 74 20 62 65 20 64 65 66 69 6e 65 64 2e 22 0a  st be defined.".
0740: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
0750: 66 69 6e 65 20 74 68 65 20 72 65 71 75 69 72 65  fine the require
0760: 64 20 57 69 6e 64 6f 77 73 20 53 44 4b 20 76 65  d Windows SDK ve
0770: 72 73 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 20  rsion constants 
0780: 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a  if they are not.
0790: 2a 2a 20 61 6c 72 65 61 64 79 20 61 76 61 69 6c  ** already avail
07a0: 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  able..*/.#ifndef
07b0: 20 4e 54 44 44 49 5f 57 49 4e 38 0a 23 20 20 64   NTDDI_WIN8.#  d
07c0: 65 66 69 6e 65 20 4e 54 44 44 49 5f 57 49 4e 38  efine NTDDI_WIN8
07d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07e0: 20 20 20 20 20 20 20 20 30 78 30 36 30 32 30 30          0x060200
07f0: 30 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  00.#endif..#ifnd
0800: 65 66 20 4e 54 44 44 49 5f 57 49 4e 42 4c 55 45  ef NTDDI_WINBLUE
0810: 0a 23 20 20 64 65 66 69 6e 65 20 4e 54 44 44 49  .#  define NTDDI
0820: 5f 57 49 4e 42 4c 55 45 20 20 20 20 20 20 20 20  _WINBLUE        
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30               0x0
0840: 36 30 33 30 30 30 30 0a 23 65 6e 64 69 66 0a 0a  6030000.#endif..
0850: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
0860: 65 65 20 69 66 20 74 68 65 20 47 65 74 56 65 72  ee if the GetVer
0870: 73 69 6f 6e 45 78 5b 41 57 5d 20 66 75 6e 63 74  sionEx[AW] funct
0880: 69 6f 6e 73 20 61 72 65 20 64 65 70 72 65 63 61  ions are depreca
0890: 74 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 74 61  ted on the.** ta
08a0: 72 67 65 74 20 73 79 73 74 65 6d 2e 20 20 47 65  rget system.  Ge
08b0: 74 56 65 72 73 69 6f 6e 45 78 20 77 61 73 20 66  tVersionEx was f
08c0: 69 72 73 74 20 64 65 70 72 65 63 61 74 65 64 20  irst deprecated 
08d0: 69 6e 20 57 69 6e 38 2e 31 2e 0a 2a 2f 0a 23 69  in Win8.1..*/.#i
08e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
08f0: 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a  32_GETVERSIONEX.
0900: 23 20 20 69 66 20 64 65 66 69 6e 65 64 28 4e 54  #  if defined(NT
0910: 44 44 49 5f 56 45 52 53 49 4f 4e 29 20 26 26 20  DDI_VERSION) && 
0920: 4e 54 44 44 49 5f 56 45 52 53 49 4f 4e 20 3e 3d  NTDDI_VERSION >=
0930: 20 4e 54 44 44 49 5f 57 49 4e 42 4c 55 45 0a 23   NTDDI_WINBLUE.#
0940: 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54      define SQLIT
0950: 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49  E_WIN32_GETVERSI
0960: 4f 4e 45 58 20 20 20 30 20 20 20 2f 2a 20 47 65  ONEX   0   /* Ge
0970: 74 56 65 72 73 69 6f 6e 45 78 28 29 20 69 73 20  tVersionEx() is 
0980: 64 65 70 72 65 63 61 74 65 64 20 2a 2f 0a 23 20  deprecated */.# 
0990: 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66 69 6e   else.#    defin
09a0: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47  e SQLITE_WIN32_G
09b0: 45 54 56 45 52 53 49 4f 4e 45 58 20 20 20 31 20  ETVERSIONEX   1 
09c0: 20 20 2f 2a 20 47 65 74 56 65 72 73 69 6f 6e 45    /* GetVersionE
09d0: 78 28 29 20 69 73 20 63 75 72 72 65 6e 74 20 2a  x() is current *
09e0: 2f 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  /.#  endif.#endi
09f0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 63 6f  f../*.** This co
0a00: 6e 73 74 61 6e 74 20 73 68 6f 75 6c 64 20 61 6c  nstant should al
0a10: 72 65 61 64 79 20 62 65 20 64 65 66 69 6e 65 64  ready be defined
0a20: 20 28 69 6e 20 74 68 65 20 22 57 69 6e 44 65 66   (in the "WinDef
0a30: 2e 68 22 20 53 44 4b 20 66 69 6c 65 29 2e 0a 2a  .h" SDK file)..*
0a40: 2f 0a 23 69 66 6e 64 65 66 20 4d 41 58 5f 50 41  /.#ifndef MAX_PA
0a50: 54 48 0a 23 20 20 64 65 66 69 6e 65 20 4d 41 58  TH.#  define MAX
0a60: 5f 50 41 54 48 20 20 20 20 20 20 20 20 20 20 20  _PATH           
0a70: 20 20 20 20 20 20 20 20 20 20 20 28 32 36 30 29             (260)
0a80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
0a90: 61 78 69 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20  aximum pathname 
0aa0: 6c 65 6e 67 74 68 20 28 69 6e 20 63 68 61 72 73  length (in chars
0ab0: 29 20 66 6f 72 20 57 69 6e 33 32 2e 20 20 54 68  ) for Win32.  Th
0ac0: 69 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c  is should normal
0ad0: 6c 79 20 62 65 0a 2a 2a 20 4d 41 58 5f 50 41 54  ly be.** MAX_PAT
0ae0: 48 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  H..*/.#ifndef SQ
0af0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50  LITE_WIN32_MAX_P
0b00: 41 54 48 5f 43 48 41 52 53 0a 23 20 20 64 65 66  ATH_CHARS.#  def
0b10: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
0b20: 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41 52 53 20  _MAX_PATH_CHARS 
0b30: 20 20 28 4d 41 58 5f 50 41 54 48 29 0a 23 65 6e    (MAX_PATH).#en
0b40: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
0b50: 63 6f 6e 73 74 61 6e 74 20 73 68 6f 75 6c 64 20  constant should 
0b60: 61 6c 72 65 61 64 79 20 62 65 20 64 65 66 69 6e  already be defin
0b70: 65 64 20 28 69 6e 20 74 68 65 20 22 57 69 6e 4e  ed (in the "WinN
0b80: 54 2e 68 22 20 53 44 4b 20 66 69 6c 65 29 2e 0a  T.h" SDK file)..
0b90: 2a 2f 0a 23 69 66 6e 64 65 66 20 55 4e 49 43 4f  */.#ifndef UNICO
0ba0: 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48  DE_STRING_MAX_CH
0bb0: 41 52 53 0a 23 20 20 64 65 66 69 6e 65 20 55 4e  ARS.#  define UN
0bc0: 49 43 4f 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58  ICODE_STRING_MAX
0bd0: 5f 43 48 41 52 53 20 20 20 20 20 20 28 33 32 37  _CHARS      (327
0be0: 36 37 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  67).#endif../*.*
0bf0: 2a 20 4d 61 78 69 6d 75 6d 20 70 61 74 68 6e 61  * Maximum pathna
0c00: 6d 65 20 6c 65 6e 67 74 68 20 28 69 6e 20 63 68  me length (in ch
0c10: 61 72 73 29 20 66 6f 72 20 57 69 6e 4e 54 2e 20  ars) for WinNT. 
0c20: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 72   This should nor
0c30: 6d 61 6c 6c 79 20 62 65 0a 2a 2a 20 55 4e 49 43  mally be.** UNIC
0c40: 4f 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58 5f 43  ODE_STRING_MAX_C
0c50: 48 41 52 53 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  HARS..*/.#ifndef
0c60: 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41   SQLITE_WINNT_MA
0c70: 58 5f 50 41 54 48 5f 43 48 41 52 53 0a 23 20 20  X_PATH_CHARS.#  
0c80: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
0c90: 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41  NNT_MAX_PATH_CHA
0ca0: 52 53 20 20 20 28 55 4e 49 43 4f 44 45 5f 53 54  RS   (UNICODE_ST
0cb0: 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52 53 29 0a  RING_MAX_CHARS).
0cc0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
0cd0: 78 69 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c  ximum pathname l
0ce0: 65 6e 67 74 68 20 28 69 6e 20 62 79 74 65 73 29  ength (in bytes)
0cf0: 20 66 6f 72 20 57 69 6e 33 32 2e 20 20 54 68 65   for Win32.  The
0d00: 20 4d 41 58 5f 50 41 54 48 20 6d 61 63 72 6f 20   MAX_PATH macro 
0d10: 69 73 20 69 6e 0a 2a 2a 20 63 68 61 72 61 63 74  is in.** charact
0d20: 65 72 73 2c 20 73 6f 20 77 65 20 61 6c 6c 6f 63  ers, so we alloc
0d30: 61 74 65 20 34 20 62 79 74 65 73 20 70 65 72 20  ate 4 bytes per 
0d40: 63 68 61 72 61 63 74 65 72 20 61 73 73 75 6d 69  character assumi
0d50: 6e 67 20 77 6f 72 73 74 2d 63 61 73 65 20 6f 66  ng worst-case of
0d60: 0a 2a 2a 20 34 2d 62 79 74 65 73 2d 70 65 72 2d  .** 4-bytes-per-
0d70: 63 68 61 72 61 63 74 65 72 20 66 6f 72 20 55 54  character for UT
0d80: 46 38 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  F8..*/.#ifndef S
0d90: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f  QLITE_WIN32_MAX_
0da0: 50 41 54 48 5f 42 59 54 45 53 0a 23 20 20 64 65  PATH_BYTES.#  de
0db0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
0dc0: 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53  2_MAX_PATH_BYTES
0dd0: 20 20 20 28 53 51 4c 49 54 45 5f 57 49 4e 33 32     (SQLITE_WIN32
0de0: 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41 52 53 2a  _MAX_PATH_CHARS*
0df0: 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  4).#endif../*.**
0e00: 20 4d 61 78 69 6d 75 6d 20 70 61 74 68 6e 61 6d   Maximum pathnam
0e10: 65 20 6c 65 6e 67 74 68 20 28 69 6e 20 62 79 74  e length (in byt
0e20: 65 73 29 20 66 6f 72 20 57 69 6e 4e 54 2e 20 20  es) for WinNT.  
0e30: 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d  This should norm
0e40: 61 6c 6c 79 20 62 65 0a 2a 2a 20 55 4e 49 43 4f  ally be.** UNICO
0e50: 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48  DE_STRING_MAX_CH
0e60: 41 52 53 20 2a 20 73 69 7a 65 6f 66 28 57 43 48  ARS * sizeof(WCH
0e70: 41 52 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  AR)..*/.#ifndef 
0e80: 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58  SQLITE_WINNT_MAX
0e90: 5f 50 41 54 48 5f 42 59 54 45 53 0a 23 20 20 64  _PATH_BYTES.#  d
0ea0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
0eb0: 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45  NT_MAX_PATH_BYTE
0ec0: 53 20 20 20 5c 0a 20 20 20 20 20 20 20 20 20 20  S   \.          
0ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ee0: 20 20 28 73 69 7a 65 6f 66 28 57 43 48 41 52 29    (sizeof(WCHAR)
0ef0: 20 2a 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f   * SQLITE_WINNT_
0f00: 4d 41 58 5f 50 41 54 48 5f 43 48 41 52 53 29 0a  MAX_PATH_CHARS).
0f10: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
0f20: 78 69 6d 75 6d 20 65 72 72 6f 72 20 6d 65 73 73  ximum error mess
0f30: 61 67 65 20 6c 65 6e 67 74 68 20 28 69 6e 20 63  age length (in c
0f40: 68 61 72 73 29 20 66 6f 72 20 57 69 6e 52 54 2e  hars) for WinRT.
0f50: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
0f60: 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52  TE_WIN32_MAX_ERR
0f70: 4d 53 47 5f 43 48 41 52 53 0a 23 20 20 64 65 66  MSG_CHARS.#  def
0f80: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
0f90: 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41 52  _MAX_ERRMSG_CHAR
0fa0: 53 20 28 31 30 32 34 29 0a 23 65 6e 64 69 66 0a  S (1024).#endif.
0fb0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e  ./*.** Returns n
0fc0: 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 63  on-zero if the c
0fd0: 68 61 72 61 63 74 65 72 20 73 68 6f 75 6c 64 20  haracter should 
0fe0: 62 65 20 74 72 65 61 74 65 64 20 61 73 20 61 20  be treated as a 
0ff0: 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 73 65 70  directory.** sep
1000: 61 72 61 74 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64  arator..*/.#ifnd
1010: 65 66 20 77 69 6e 49 73 44 69 72 53 65 70 0a 23  ef winIsDirSep.#
1020: 20 20 64 65 66 69 6e 65 20 77 69 6e 49 73 44 69    define winIsDi
1030: 72 53 65 70 28 61 29 20 20 20 20 20 20 20 20 20  rSep(a)         
1040: 20 20 20 20 20 20 20 28 28 28 61 29 20 3d 3d 20         (((a) == 
1050: 27 2f 27 29 20 7c 7c 20 28 28 61 29 20 3d 3d 20  '/') || ((a) == 
1060: 27 5c 5c 27 29 29 0a 23 65 6e 64 69 66 0a 0a 2f  '\\')).#endif../
1070: 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20  *.** This macro 
1080: 69 73 20 75 73 65 64 20 77 68 65 6e 20 61 20 6c  is used when a l
1090: 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73  ocal variable is
10a0: 20 73 65 74 20 74 6f 20 61 20 76 61 6c 75 65 20   set to a value 
10b0: 74 68 61 74 20 69 73 0a 2a 2a 20 5b 73 6f 6d 65  that is.** [some
10c0: 74 69 6d 65 73 5d 20 6e 6f 74 20 75 73 65 64 20  times] not used 
10d0: 62 79 20 74 68 65 20 63 6f 64 65 20 28 65 2e 67  by the code (e.g
10e0: 2e 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 61  . via conditiona
10f0: 6c 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 29 2e 0a  l compilation)..
1100: 2a 2f 0a 23 69 66 6e 64 65 66 20 55 4e 55 53 45  */.#ifndef UNUSE
1110: 44 5f 56 41 52 49 41 42 4c 45 5f 56 41 4c 55 45  D_VARIABLE_VALUE
1120: 0a 23 20 20 64 65 66 69 6e 65 20 55 4e 55 53 45  .#  define UNUSE
1130: 44 5f 56 41 52 49 41 42 4c 45 5f 56 41 4c 55 45  D_VARIABLE_VALUE
1140: 28 78 29 20 20 20 20 20 20 28 76 6f 69 64 29 28  (x)      (void)(
1150: 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
1160: 20 52 65 74 75 72 6e 73 20 74 68 65 20 63 68 61   Returns the cha
1170: 72 61 63 74 65 72 20 74 68 61 74 20 73 68 6f 75  racter that shou
1180: 6c 64 20 62 65 20 75 73 65 64 20 61 73 20 74 68  ld be used as th
1190: 65 20 64 69 72 65 63 74 6f 72 79 20 73 65 70 61  e directory sepa
11a0: 72 61 74 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65  rator..*/.#ifnde
11b0: 66 20 77 69 6e 47 65 74 44 69 72 53 65 70 0a 23  f winGetDirSep.#
11c0: 20 20 64 65 66 69 6e 65 20 77 69 6e 47 65 74 44    define winGetD
11d0: 69 72 53 65 70 28 29 20 20 20 20 20 20 20 20 20  irSep()         
11e0: 20 20 20 20 20 20 20 27 5c 5c 27 0a 23 65 6e 64         '\\'.#end
11f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 77 65 20  if../*.** Do we 
1200: 6e 65 65 64 20 74 6f 20 6d 61 6e 75 61 6c 6c 79  need to manually
1210: 20 64 65 66 69 6e 65 20 74 68 65 20 57 69 6e 33   define the Win3
1220: 32 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 41  2 file mapping A
1230: 50 49 73 20 66 6f 72 20 75 73 65 20 77 69 74 68  PIs for use with
1240: 20 57 41 4c 0a 2a 2a 20 6d 6f 64 65 20 6f 72 20   WAL.** mode or 
1250: 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 66 69  memory mapped fi
1260: 6c 65 73 20 28 65 2e 67 2e 20 74 68 65 73 65 20  les (e.g. these 
1270: 41 50 49 73 20 61 72 65 20 61 76 61 69 6c 61 62  APIs are availab
1280: 6c 65 20 69 6e 20 74 68 65 20 57 69 6e 64 6f 77  le in the Window
1290: 73 0a 2a 2a 20 43 45 20 53 44 4b 3b 20 68 6f 77  s.** CE SDK; how
12a0: 65 76 65 72 2c 20 74 68 65 79 20 61 72 65 20 6e  ever, they are n
12b0: 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  ot present in th
12c0: 65 20 68 65 61 64 65 72 20 66 69 6c 65 29 3f 0a  e header file)?.
12d0: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 57 49  */.#if SQLITE_WI
12e0: 4e 33 32 5f 46 49 4c 45 4d 41 50 50 49 4e 47 5f  N32_FILEMAPPING_
12f0: 41 50 49 20 26 26 20 5c 0a 20 20 20 20 20 20 20  API && \.       
1300: 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54   (!defined(SQLIT
1310: 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53  E_OMIT_WAL) || S
1320: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
1330: 49 5a 45 3e 30 29 0a 2f 2a 0a 2a 2a 20 54 77 6f  IZE>0)./*.** Two
1340: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6d 61 70   of the file map
1350: 70 69 6e 67 20 41 50 49 73 20 61 72 65 20 64 69  ping APIs are di
1360: 66 66 65 72 65 6e 74 20 75 6e 64 65 72 20 57 69  fferent under Wi
1370: 6e 52 54 2e 20 20 46 69 67 75 72 65 20 6f 75 74  nRT.  Figure out
1380: 20 77 68 69 63 68 0a 2a 2a 20 73 65 74 20 77 65   which.** set we
1390: 20 6e 65 65 64 2e 0a 2a 2f 0a 23 69 66 20 53 51   need..*/.#if SQ
13a0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 57 49  LITE_OS_WINRT.WI
13b0: 4e 42 41 53 45 41 50 49 20 48 41 4e 44 4c 45 20  NBASEAPI HANDLE 
13c0: 57 49 4e 41 50 49 20 43 72 65 61 74 65 46 69 6c  WINAPI CreateFil
13d0: 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 28  eMappingFromApp(
13e0: 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20  HANDLE, \.      
13f0: 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54    LPSECURITY_ATT
1400: 52 49 42 55 54 45 53 2c 20 55 4c 4f 4e 47 2c 20  RIBUTES, ULONG, 
1410: 55 4c 4f 4e 47 36 34 2c 20 4c 50 43 57 53 54 52  ULONG64, LPCWSTR
1420: 29 3b 0a 0a 57 49 4e 42 41 53 45 41 50 49 20 4c  );..WINBASEAPI L
1430: 50 56 4f 49 44 20 57 49 4e 41 50 49 20 4d 61 70  PVOID WINAPI Map
1440: 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70  ViewOfFileFromAp
1450: 70 28 48 41 4e 44 4c 45 2c 20 55 4c 4f 4e 47 2c  p(HANDLE, ULONG,
1460: 20 55 4c 4f 4e 47 36 34 2c 20 53 49 5a 45 5f 54   ULONG64, SIZE_T
1470: 29 3b 0a 23 65 6c 73 65 0a 23 69 66 20 64 65 66  );.#else.#if def
1480: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
1490: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 57 49 4e 42  2_HAS_ANSI).WINB
14a0: 41 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49  ASEAPI HANDLE WI
14b0: 4e 41 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d  NAPI CreateFileM
14c0: 61 70 70 69 6e 67 41 28 48 41 4e 44 4c 45 2c 20  appingA(HANDLE, 
14d0: 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49  LPSECURITY_ATTRI
14e0: 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20  BUTES, \.       
14f0: 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44   DWORD, DWORD, D
1500: 57 4f 52 44 2c 20 4c 50 43 53 54 52 29 3b 0a 23  WORD, LPCSTR);.#
1510: 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
1520: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
1530: 53 5f 41 4e 53 49 29 20 2a 2f 0a 0a 23 69 66 20  S_ANSI) */..#if 
1540: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
1550: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 57  IN32_HAS_WIDE).W
1560: 49 4e 42 41 53 45 41 50 49 20 48 41 4e 44 4c 45  INBASEAPI HANDLE
1570: 20 57 49 4e 41 50 49 20 43 72 65 61 74 65 46 69   WINAPI CreateFi
1580: 6c 65 4d 61 70 70 69 6e 67 57 28 48 41 4e 44 4c  leMappingW(HANDL
1590: 45 2c 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54  E, LPSECURITY_AT
15a0: 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20 20 20  TRIBUTES, \.    
15b0: 20 20 20 20 44 57 4f 52 44 2c 20 44 57 4f 52 44      DWORD, DWORD
15c0: 2c 20 44 57 4f 52 44 2c 20 4c 50 43 57 53 54 52  , DWORD, LPCWSTR
15d0: 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  );.#endif /* def
15e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
15f0: 32 5f 48 41 53 5f 57 49 44 45 29 20 2a 2f 0a 0a  2_HAS_WIDE) */..
1600: 57 49 4e 42 41 53 45 41 50 49 20 4c 50 56 4f 49  WINBASEAPI LPVOI
1610: 44 20 57 49 4e 41 50 49 20 4d 61 70 56 69 65 77  D WINAPI MapView
1620: 4f 66 46 69 6c 65 28 48 41 4e 44 4c 45 2c 20 44  OfFile(HANDLE, D
1630: 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f  WORD, DWORD, DWO
1640: 52 44 2c 20 53 49 5a 45 5f 54 29 3b 0a 23 65 6e  RD, SIZE_T);.#en
1650: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53  dif /* SQLITE_OS
1660: 5f 57 49 4e 52 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _WINRT */../*.**
1670: 20 54 68 69 73 20 66 69 6c 65 20 6d 61 70 70 69   This file mappi
1680: 6e 67 20 41 50 49 20 69 73 20 63 6f 6d 6d 6f 6e  ng API is common
1690: 20 74 6f 20 62 6f 74 68 20 57 69 6e 33 32 20 61   to both Win32 a
16a0: 6e 64 20 57 69 6e 52 54 2e 0a 2a 2f 0a 57 49 4e  nd WinRT..*/.WIN
16b0: 42 41 53 45 41 50 49 20 42 4f 4f 4c 20 57 49 4e  BASEAPI BOOL WIN
16c0: 41 50 49 20 55 6e 6d 61 70 56 69 65 77 4f 66 46  API UnmapViewOfF
16d0: 69 6c 65 28 4c 50 43 56 4f 49 44 29 3b 0a 23 65  ile(LPCVOID);.#e
16e0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57  ndif /* SQLITE_W
16f0: 49 4e 33 32 5f 46 49 4c 45 4d 41 50 50 49 4e 47  IN32_FILEMAPPING
1700: 5f 41 50 49 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  _API */../*.** S
1710: 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f  ome Microsoft co
1720: 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74 68 69  mpilers lack thi
1730: 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f  s definition..*/
1740: 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c 49 44  .#ifndef INVALID
1750: 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
1760: 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49  .# define INVALI
1770: 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
1780: 53 20 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65  S ((DWORD)-1).#e
1790: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 46 49  ndif..#ifndef FI
17a0: 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 0a 23 20 64  LE_FLAG_MASK.# d
17b0: 65 66 69 6e 65 20 46 49 4c 45 5f 46 4c 41 47 5f  efine FILE_FLAG_
17c0: 4d 41 53 4b 20 20 20 20 20 20 20 20 20 20 28 30  MASK          (0
17d0: 78 46 46 33 43 30 30 30 30 29 0a 23 65 6e 64 69  xFF3C0000).#endi
17e0: 66 0a 0a 23 69 66 6e 64 65 66 20 46 49 4c 45 5f  f..#ifndef FILE_
17f0: 41 54 54 52 49 42 55 54 45 5f 4d 41 53 4b 0a 23  ATTRIBUTE_MASK.#
1800: 20 64 65 66 69 6e 65 20 46 49 4c 45 5f 41 54 54   define FILE_ATT
1810: 52 49 42 55 54 45 5f 4d 41 53 4b 20 20 20 20 20  RIBUTE_MASK     
1820: 28 30 78 30 30 30 33 46 46 46 37 29 0a 23 65 6e  (0x0003FFF7).#en
1830: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
1840: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 20  ITE_OMIT_WAL./* 
1850: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
1860: 65 73 20 74 6f 20 73 74 72 75 63 74 75 72 65 73  es to structures
1870: 20 75 73 65 64 20 66 6f 72 20 57 41 4c 20 2a 2f   used for WAL */
1880: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1890: 77 69 6e 53 68 6d 20 77 69 6e 53 68 6d 3b 20 20  winShm winShm;  
18a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f           /* A co
18b0: 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72  nnection to shar
18c0: 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70  ed-memory */.typ
18d0: 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 53  edef struct winS
18e0: 68 6d 4e 6f 64 65 20 77 69 6e 53 68 6d 4e 6f 64  hmNode winShmNod
18f0: 65 3b 20 20 20 2f 2a 20 41 20 72 65 67 69 6f 6e  e;   /* A region
1900: 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   of shared-memor
1910: 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y */.#endif../*.
1920: 2a 2a 20 57 69 6e 43 45 20 6c 61 63 6b 73 20 6e  ** WinCE lacks n
1930: 61 74 69 76 65 20 73 75 70 70 6f 72 74 20 66 6f  ative support fo
1940: 72 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73  r file locking s
1950: 6f 20 77 65 20 68 61 76 65 20 74 6f 20 66 61 6b  o we have to fak
1960: 65 20 69 74 0a 2a 2a 20 77 69 74 68 20 73 6f 6d  e it.** with som
1970: 65 20 63 6f 64 65 20 6f 66 20 6f 75 72 20 6f 77  e code of our ow
1980: 6e 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  n..*/.#if SQLITE
1990: 5f 4f 53 5f 57 49 4e 43 45 0a 74 79 70 65 64 65  _OS_WINCE.typede
19a0: 66 20 73 74 72 75 63 74 20 77 69 6e 63 65 4c 6f  f struct winceLo
19b0: 63 6b 20 7b 0a 20 20 69 6e 74 20 6e 52 65 61 64  ck {.  int nRead
19c0: 65 72 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  ers;       /* Nu
19d0: 6d 62 65 72 20 6f 66 20 72 65 61 64 65 72 20 6c  mber of reader l
19e0: 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 2a 2f  ocks obtained */
19f0: 0a 20 20 42 4f 4f 4c 20 62 50 65 6e 64 69 6e 67  .  BOOL bPending
1a00: 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61  ;      /* Indica
1a10: 74 65 73 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f  tes a pending lo
1a20: 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61  ck has been obta
1a30: 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62  ined */.  BOOL b
1a40: 52 65 73 65 72 76 65 64 3b 20 20 20 20 20 2f 2a  Reserved;     /*
1a50: 20 49 6e 64 69 63 61 74 65 73 20 61 20 72 65 73   Indicates a res
1a60: 65 72 76 65 64 20 6c 6f 63 6b 20 68 61 73 20 62  erved lock has b
1a70: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a  een obtained */.
1a80: 20 20 42 4f 4f 4c 20 62 45 78 63 6c 75 73 69 76    BOOL bExclusiv
1a90: 65 3b 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74  e;    /* Indicat
1aa0: 65 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  es an exclusive 
1ab0: 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62  lock has been ob
1ac0: 74 61 69 6e 65 64 20 2a 2f 0a 7d 20 77 69 6e 63  tained */.} winc
1ad0: 65 4c 6f 63 6b 3b 0a 23 65 6e 64 69 66 0a 0a 2f  eLock;.#endif../
1ae0: 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 46 69 6c 65  *.** The winFile
1af0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 20   structure is a 
1b00: 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71 6c 69  subclass of sqli
1b10: 74 65 33 5f 66 69 6c 65 2a 20 73 70 65 63 69 66  te3_file* specif
1b20: 69 63 20 74 6f 20 74 68 65 20 77 69 6e 33 32 0a  ic to the win32.
1b30: 2a 2a 20 70 6f 72 74 61 62 69 6c 69 74 79 20 6c  ** portability l
1b40: 61 79 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ayer..*/.typedef
1b50: 20 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20   struct winFile 
1b60: 77 69 6e 46 69 6c 65 3b 0a 73 74 72 75 63 74 20  winFile;.struct 
1b70: 77 69 6e 46 69 6c 65 20 7b 0a 20 20 63 6f 6e 73  winFile {.  cons
1b80: 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
1b90: 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 3b 20 2f  hods *pMethod; /
1ba0: 2a 2a 2a 20 4d 75 73 74 20 62 65 20 66 69 72 73  *** Must be firs
1bb0: 74 20 2a 2a 2a 2f 0a 20 20 73 71 6c 69 74 65 33  t ***/.  sqlite3
1bc0: 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20  _vfs *pVfs;     
1bd0: 20 2f 2a 20 54 68 65 20 56 46 53 20 75 73 65 64   /* The VFS used
1be0: 20 74 6f 20 6f 70 65 6e 20 74 68 69 73 20 66 69   to open this fi
1bf0: 6c 65 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68  le */.  HANDLE h
1c00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c10: 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 61 63  /* Handle for ac
1c20: 63 65 73 73 69 6e 67 20 74 68 65 20 66 69 6c 65  cessing the file
1c30: 20 2a 2f 0a 20 20 75 38 20 6c 6f 63 6b 74 79 70   */.  u8 locktyp
1c40: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
1c50: 20 54 79 70 65 20 6f 66 20 6c 6f 63 6b 20 63 75   Type of lock cu
1c60: 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 20  rrently held on 
1c70: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 73  this file */.  s
1c80: 68 6f 72 74 20 73 68 61 72 65 64 4c 6f 63 6b 42  hort sharedLockB
1c90: 79 74 65 3b 20 20 20 2f 2a 20 52 61 6e 64 6f 6d  yte;   /* Random
1ca0: 6c 79 20 63 68 6f 73 65 6e 20 62 79 74 65 20 75  ly chosen byte u
1cb0: 73 65 64 20 61 73 20 61 20 73 68 61 72 65 64 20  sed as a shared 
1cc0: 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 63 74 72  lock */.  u8 ctr
1cd0: 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  lFlags;         
1ce0: 20 20 2f 2a 20 46 6c 61 67 73 2e 20 20 53 65 65    /* Flags.  See
1cf0: 20 57 49 4e 46 49 4c 45 5f 2a 20 62 65 6c 6f 77   WINFILE_* below
1d00: 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74   */.  DWORD last
1d10: 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 2f 2a  Errno;        /*
1d20: 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72 72   The Windows err
1d30: 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74  no from the last
1d40: 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 23 69   I/O error */.#i
1d50: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1d60: 54 5f 57 41 4c 0a 20 20 77 69 6e 53 68 6d 20 2a  T_WAL.  winShm *
1d70: 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pShm;           
1d80: 2f 2a 20 49 6e 73 74 61 6e 63 65 20 6f 66 20 73  /* Instance of s
1d90: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e 20  hared memory on 
1da0: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 23 65 6e  this file */.#en
1db0: 64 69 66 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  dif.  const char
1dc0: 20 2a 7a 50 61 74 68 3b 20 20 20 20 20 20 2f 2a   *zPath;      /*
1dd0: 20 46 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   Full pathname o
1de0: 66 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  f this file */. 
1df0: 20 69 6e 74 20 73 7a 43 68 75 6e 6b 3b 20 20 20   int szChunk;   
1e00: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 75 6e           /* Chun
1e10: 6b 20 73 69 7a 65 20 63 6f 6e 66 69 67 75 72 65  k size configure
1e20: 64 20 62 79 20 46 43 4e 54 4c 5f 43 48 55 4e 4b  d by FCNTL_CHUNK
1e30: 5f 53 49 5a 45 20 2a 2f 0a 23 69 66 20 53 51 4c  _SIZE */.#if SQL
1e40: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 4c  ITE_OS_WINCE.  L
1e50: 50 57 53 54 52 20 7a 44 65 6c 65 74 65 4f 6e 43  PWSTR zDeleteOnC
1e60: 6c 6f 73 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f  lose;  /* Name o
1e70: 66 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65  f file to delete
1e80: 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f   when closing */
1e90: 0a 20 20 48 41 4e 44 4c 45 20 68 4d 75 74 65 78  .  HANDLE hMutex
1ea0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75  ;          /* Mu
1eb0: 74 65 78 20 75 73 65 64 20 74 6f 20 63 6f 6e 74  tex used to cont
1ec0: 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 73 68  rol access to sh
1ed0: 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 48  ared lock */.  H
1ee0: 41 4e 44 4c 45 20 68 53 68 61 72 65 64 3b 20 20  ANDLE hShared;  
1ef0: 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
1f00: 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20   memory segment 
1f10: 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
1f20: 20 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20   */.  winceLock 
1f30: 6c 6f 63 61 6c 3b 20 20 20 20 20 20 20 20 2f 2a  local;        /*
1f40: 20 4c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20   Locks obtained 
1f50: 62 79 20 74 68 69 73 20 69 6e 73 74 61 6e 63 65  by this instance
1f60: 20 6f 66 20 77 69 6e 46 69 6c 65 20 2a 2f 0a 20   of winFile */. 
1f70: 20 77 69 6e 63 65 4c 6f 63 6b 20 2a 73 68 61 72   winceLock *shar
1f80: 65 64 3b 20 20 20 20 20 20 2f 2a 20 47 6c 6f 62  ed;      /* Glob
1f90: 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6d  al shared lock m
1fa0: 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 66 69  emory for the fi
1fb0: 6c 65 20 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  le  */.#endif.#i
1fc0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
1fd0: 50 5f 53 49 5a 45 3e 30 0a 20 20 69 6e 74 20 6e  P_SIZE>0.  int n
1fe0: 46 65 74 63 68 4f 75 74 3b 20 20 20 20 20 20 20  FetchOut;       
1ff0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2000: 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  er of outstandin
2010: 67 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e  g xFetch referen
2020: 63 65 73 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20  ces */.  HANDLE 
2030: 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20  hMap;           
2040: 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
2050: 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20 6d   for accessing m
2060: 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 2a 2f  emory mapping */
2070: 0a 20 20 76 6f 69 64 20 2a 70 4d 61 70 52 65 67  .  void *pMapReg
2080: 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
2090: 20 2f 2a 20 41 72 65 61 20 6d 65 6d 6f 72 79 20   /* Area memory 
20a0: 6d 61 70 70 65 64 20 2a 2f 0a 20 20 73 71 6c 69  mapped */.  sqli
20b0: 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69  te3_int64 mmapSi
20c0: 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20 55 73 61  ze;       /* Usa
20d0: 62 6c 65 20 73 69 7a 65 20 6f 66 20 6d 61 70 70  ble size of mapp
20e0: 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20 73  ed region */.  s
20f0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61  qlite3_int64 mma
2100: 70 53 69 7a 65 41 63 74 75 61 6c 3b 20 2f 2a 20  pSizeActual; /* 
2110: 41 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 6d  Actual size of m
2120: 61 70 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a  apped region */.
2130: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
2140: 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 20 20 20 20  mmapSizeMax;    
2150: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 46 43  /* Configured FC
2160: 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 76 61  NTL_MMAP_SIZE va
2170: 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  lue */.#endif.};
2180: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20  ../*.** Allowed 
2190: 76 61 6c 75 65 73 20 66 6f 72 20 77 69 6e 46 69  values for winFi
21a0: 6c 65 2e 63 74 72 6c 46 6c 61 67 73 0a 2a 2f 0a  le.ctrlFlags.*/.
21b0: 23 64 65 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f  #define WINFILE_
21c0: 52 44 4f 4e 4c 59 20 20 20 20 20 20 20 20 20 20  RDONLY          
21d0: 30 78 30 32 20 20 20 2f 2a 20 43 6f 6e 6e 65 63  0x02   /* Connec
21e0: 74 69 6f 6e 20 69 73 20 72 65 61 64 20 6f 6e 6c  tion is read onl
21f0: 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e  y */.#define WIN
2200: 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c  FILE_PERSIST_WAL
2210: 20 20 20 20 20 30 78 30 34 20 20 20 2f 2a 20 50       0x04   /* P
2220: 65 72 73 69 73 74 65 6e 74 20 57 41 4c 20 6d 6f  ersistent WAL mo
2230: 64 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49  de */.#define WI
2240: 4e 46 49 4c 45 5f 50 53 4f 57 20 20 20 20 20 20  NFILE_PSOW      
2250: 20 20 20 20 20 20 30 78 31 30 20 20 20 2f 2a 20        0x10   /* 
2260: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57  SQLITE_IOCAP_POW
2270: 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
2280: 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 73   */../*. * The s
2290: 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65  ize of the buffe
22a0: 72 20 75 73 65 64 20 62 79 20 73 71 6c 69 74 65  r used by sqlite
22b0: 33 5f 77 69 6e 33 32 5f 77 72 69 74 65 5f 64 65  3_win32_write_de
22c0: 62 75 67 28 29 2e 0a 20 2a 2f 0a 23 69 66 6e 64  bug().. */.#ifnd
22d0: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
22e0: 44 42 47 5f 42 55 46 5f 53 49 5a 45 0a 23 20 20  DBG_BUF_SIZE.#  
22f0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
2300: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
2310: 20 20 20 28 28 69 6e 74 29 28 34 30 39 36 2d 73     ((int)(4096-s
2320: 69 7a 65 6f 66 28 44 57 4f 52 44 29 29 29 0a 23  izeof(DWORD))).#
2330: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65  endif../*. * The
2340: 20 76 61 6c 75 65 20 75 73 65 64 20 77 69 74 68   value used with
2350: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
2360: 65 74 5f 64 69 72 65 63 74 6f 72 79 28 29 20 74  et_directory() t
2370: 6f 20 73 70 65 63 69 66 79 20 74 68 61 74 0a 20  o specify that. 
2380: 2a 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63  * the data direc
2390: 74 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20 63  tory should be c
23a0: 68 61 6e 67 65 64 2e 0a 20 2a 2f 0a 23 69 66 6e  hanged.. */.#ifn
23b0: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
23c0: 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f  _DATA_DIRECTORY_
23d0: 54 59 50 45 0a 23 20 20 64 65 66 69 6e 65 20 53  TYPE.#  define S
23e0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41  QLITE_WIN32_DATA
23f0: 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20  _DIRECTORY_TYPE 
2400: 28 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20  (1).#endif../*. 
2410: 2a 20 54 68 65 20 76 61 6c 75 65 20 75 73 65 64  * The value used
2420: 20 77 69 74 68 20 73 71 6c 69 74 65 33 5f 77 69   with sqlite3_wi
2430: 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
2440: 79 28 29 20 74 6f 20 73 70 65 63 69 66 79 20 74  y() to specify t
2450: 68 61 74 0a 20 2a 20 74 68 65 20 74 65 6d 70 6f  hat. * the tempo
2460: 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 73  rary directory s
2470: 68 6f 75 6c 64 20 62 65 20 63 68 61 6e 67 65 64  hould be changed
2480: 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .. */.#ifndef SQ
2490: 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f  LITE_WIN32_TEMP_
24a0: 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 23  DIRECTORY_TYPE.#
24b0: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
24c0: 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43  WIN32_TEMP_DIREC
24d0: 54 4f 52 59 5f 54 59 50 45 20 28 32 29 0a 23 65  TORY_TYPE (2).#e
24e0: 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 49 66 20 63  ndif../*. * If c
24f0: 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c  ompiled with SQL
2500: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
2510: 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20 77 65 20   on Windows, we 
2520: 77 69 6c 6c 20 75 73 65 20 74 68 65 0a 20 2a 20  will use the. * 
2530: 76 61 72 69 6f 75 73 20 57 69 6e 33 32 20 41 50  various Win32 AP
2540: 49 20 68 65 61 70 20 66 75 6e 63 74 69 6f 6e 73  I heap functions
2550: 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 75 72 20   instead of our 
2560: 6f 77 6e 2e 0a 20 2a 2f 0a 23 69 66 64 65 66 20  own.. */.#ifdef 
2570: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
2580: 4c 4f 43 0a 0a 2f 2a 0a 20 2a 20 49 66 20 74 68  LOC../*. * If th
2590: 69 73 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  is is non-zero, 
25a0: 61 6e 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70  an isolated heap
25b0: 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64   will be created
25c0: 20 62 79 20 74 68 65 20 6e 61 74 69 76 65 20 57   by the native W
25d0: 69 6e 33 32 0a 20 2a 20 61 6c 6c 6f 63 61 74 6f  in32. * allocato
25e0: 72 20 73 75 62 73 79 73 74 65 6d 3b 20 6f 74 68  r subsystem; oth
25f0: 65 72 77 69 73 65 2c 20 74 68 65 20 64 65 66 61  erwise, the defa
2600: 75 6c 74 20 70 72 6f 63 65 73 73 20 68 65 61 70  ult process heap
2610: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 20 20   will be used.  
2620: 54 68 69 73 0a 20 2a 20 73 65 74 74 69 6e 67 20  This. * setting 
2630: 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 77 68  has no effect wh
2640: 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72  en compiling for
2650: 20 57 69 6e 52 54 2e 20 20 42 79 20 64 65 66 61   WinRT.  By defa
2660: 75 6c 74 2c 20 74 68 69 73 20 69 73 20 65 6e 61  ult, this is ena
2670: 62 6c 65 64 0a 20 2a 20 61 6e 64 20 61 6e 20 69  bled. * and an i
2680: 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c  solated heap wil
2690: 6c 20 62 65 20 63 72 65 61 74 65 64 20 74 6f 20  l be created to 
26a0: 73 74 6f 72 65 20 61 6c 6c 20 61 6c 6c 6f 63 61  store all alloca
26b0: 74 65 64 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 2a  ted data.. *. **
26c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 20  ************. * 
2710: 57 41 52 4e 49 4e 47 3a 20 49 74 20 69 73 20 69  WARNING: It is i
2720: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 65  mportant to note
2730: 20 74 68 61 74 20 77 68 65 6e 20 74 68 69 73 20   that when this 
2740: 73 65 74 74 69 6e 67 20 69 73 20 6e 6f 6e 2d 7a  setting is non-z
2750: 65 72 6f 20 61 6e 64 20 74 68 65 0a 20 2a 20 20  ero and the. *  
2760: 20 20 20 20 20 20 20 20 77 69 6e 4d 65 6d 53 68          winMemSh
2770: 75 74 64 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 20  utdown function 
2780: 69 73 20 63 61 6c 6c 65 64 20 28 65 2e 67 2e 20  is called (e.g. 
2790: 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f 73  by the sqlite3_s
27a0: 68 75 74 64 6f 77 6e 0a 20 2a 20 20 20 20 20 20  hutdown. *      
27b0: 20 20 20 20 66 75 6e 63 74 69 6f 6e 29 2c 20 61      function), a
27c0: 6c 6c 20 64 61 74 61 20 74 68 61 74 20 77 61 73  ll data that was
27d0: 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67   allocated using
27e0: 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 68 65   the isolated he
27f0: 61 70 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20 20  ap will. *      
2800: 20 20 20 20 62 65 20 66 72 65 65 64 20 69 6d 6d      be freed imm
2810: 65 64 69 61 74 65 6c 79 20 61 6e 64 20 61 6e 79  ediately and any
2820: 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 63 65   attempt to acce
2830: 73 73 20 61 6e 79 20 6f 66 20 74 68 61 74 20 66  ss any of that f
2840: 72 65 65 64 0a 20 2a 20 20 20 20 20 20 20 20 20  reed. *         
2850: 20 64 61 74 61 20 77 69 6c 6c 20 61 6c 6d 6f 73   data will almos
2860: 74 20 63 65 72 74 61 69 6e 6c 79 20 72 65 73 75  t certainly resu
2870: 6c 74 20 69 6e 20 61 6e 20 69 6d 6d 65 64 69 61  lt in an immedia
2880: 74 65 20 61 63 63 65 73 73 20 76 69 6f 6c 61 74  te access violat
2890: 69 6f 6e 2e 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion.. **********
28a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28e0: 2a 2a 2a 2a 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ****. */.#ifndef
28f0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
2900: 41 50 5f 43 52 45 41 54 45 0a 23 20 20 64 65 66  AP_CREATE.#  def
2910: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
2920: 5f 48 45 41 50 5f 43 52 45 41 54 45 20 20 20 20  _HEAP_CREATE    
2930: 28 54 52 55 45 29 0a 23 65 6e 64 69 66 0a 0a 2f  (TRUE).#endif../
2940: 2a 0a 20 2a 20 54 68 65 20 69 6e 69 74 69 61 6c  *. * The initial
2950: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 57 69 6e   size of the Win
2960: 33 32 2d 73 70 65 63 69 66 69 63 20 68 65 61 70  32-specific heap
2970: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61  .  This value ma
2980: 79 20 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23  y be zero.. */.#
2990: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
29a0: 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49  N32_HEAP_INIT_SI
29b0: 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  ZE.#  define SQL
29c0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49  ITE_WIN32_HEAP_I
29d0: 4e 49 54 5f 53 49 5a 45 20 28 28 53 51 4c 49 54  NIT_SIZE ((SQLIT
29e0: 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f  E_DEFAULT_CACHE_
29f0: 53 49 5a 45 29 20 2a 20 5c 0a 20 20 20 20 20 20  SIZE) * \.      
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a20: 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54   (SQLITE_DEFAULT
2a30: 5f 50 41 47 45 5f 53 49 5a 45 29 20 2b 20 34 31  _PAGE_SIZE) + 41
2a40: 39 34 33 30 34 29 0a 23 65 6e 64 69 66 0a 0a 2f  94304).#endif../
2a50: 2a 0a 20 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *. * The maximum
2a60: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 57 69 6e   size of the Win
2a70: 33 32 2d 73 70 65 63 69 66 69 63 20 68 65 61 70  32-specific heap
2a80: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61  .  This value ma
2a90: 79 20 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23  y be zero.. */.#
2aa0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
2ab0: 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a  N32_HEAP_MAX_SIZ
2ac0: 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  E.#  define SQLI
2ad0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41  TE_WIN32_HEAP_MA
2ae0: 58 5f 53 49 5a 45 20 20 28 30 29 0a 23 65 6e 64  X_SIZE  (0).#end
2af0: 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 65 78  if../*. * The ex
2b00: 74 72 61 20 66 6c 61 67 73 20 74 6f 20 75 73 65  tra flags to use
2b10: 20 69 6e 20 63 61 6c 6c 73 20 74 6f 20 74 68 65   in calls to the
2b20: 20 57 69 6e 33 32 20 68 65 61 70 20 41 50 49 73   Win32 heap APIs
2b30: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61  .  This value ma
2b40: 79 20 62 65 0a 20 2a 20 7a 65 72 6f 20 66 6f 72  y be. * zero for
2b50: 20 74 68 65 20 64 65 66 61 75 6c 74 20 62 65 68   the default beh
2b60: 61 76 69 6f 72 2e 0a 20 2a 2f 0a 23 69 66 6e 64  avior.. */.#ifnd
2b70: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
2b80: 48 45 41 50 5f 46 4c 41 47 53 0a 23 20 20 64 65  HEAP_FLAGS.#  de
2b90: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
2ba0: 32 5f 48 45 41 50 5f 46 4c 41 47 53 20 20 20 20  2_HEAP_FLAGS    
2bb0: 20 28 30 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   (0).#endif.../*
2bc0: 0a 2a 2a 20 54 68 65 20 77 69 6e 4d 65 6d 44 61  .** The winMemDa
2bd0: 74 61 20 73 74 72 75 63 74 75 72 65 20 73 74 6f  ta structure sto
2be0: 72 65 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  res information 
2bf0: 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
2c00: 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63 0a 2a  Win32-specific.*
2c10: 2a 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  * sqlite3_mem_me
2c20: 74 68 6f 64 73 20 69 6d 70 6c 65 6d 65 6e 74 61  thods implementa
2c30: 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  tion..*/.typedef
2c40: 20 73 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61   struct winMemDa
2c50: 74 61 20 77 69 6e 4d 65 6d 44 61 74 61 3b 0a 73  ta winMemData;.s
2c60: 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61  truct winMemData
2c70: 20 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   {.#ifndef NDEBU
2c80: 47 0a 20 20 75 33 32 20 6d 61 67 69 63 31 3b 20  G.  u32 magic1; 
2c90: 20 20 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65    /* Magic numbe
2ca0: 72 20 74 6f 20 64 65 74 65 63 74 20 73 74 72 75  r to detect stru
2cb0: 63 74 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e  cture corruption
2cc0: 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 48 41  . */.#endif.  HA
2cd0: 4e 44 4c 45 20 68 48 65 61 70 3b 20 2f 2a 20 54  NDLE hHeap; /* T
2ce0: 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 6f 75 72  he handle to our
2cf0: 20 68 65 61 70 2e 20 2a 2f 0a 20 20 42 4f 4f 4c   heap. */.  BOOL
2d00: 20 62 4f 77 6e 65 64 3b 20 20 2f 2a 20 44 6f 20   bOwned;  /* Do 
2d10: 77 65 20 6f 77 6e 20 74 68 65 20 68 65 61 70 20  we own the heap 
2d20: 28 69 2e 65 2e 20 64 65 73 74 72 6f 79 20 69 74  (i.e. destroy it
2d30: 20 6f 6e 20 73 68 75 74 64 6f 77 6e 29 3f 20 2a   on shutdown)? *
2d40: 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
2d50: 0a 20 20 75 33 32 20 6d 61 67 69 63 32 3b 20 20  .  u32 magic2;  
2d60: 20 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72   /* Magic number
2d70: 20 74 6f 20 64 65 74 65 63 74 20 73 74 72 75 63   to detect struc
2d80: 74 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  ture corruption.
2d90: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 23   */.#endif.};..#
2da0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 64  ifndef NDEBUG.#d
2db0: 65 66 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41 47  efine WINMEM_MAG
2dc0: 49 43 31 20 20 20 20 20 30 78 34 32 62 32 38 33  IC1     0x42b283
2dd0: 30 62 0a 23 64 65 66 69 6e 65 20 57 49 4e 4d 45  0b.#define WINME
2de0: 4d 5f 4d 41 47 49 43 32 20 20 20 20 20 30 78 62  M_MAGIC2     0xb
2df0: 64 34 64 37 63 66 34 0a 23 65 6e 64 69 66 0a 0a  d4d7cf4.#endif..
2e00: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 77 69  static struct wi
2e10: 6e 4d 65 6d 44 61 74 61 20 77 69 6e 5f 6d 65 6d  nMemData win_mem
2e20: 5f 64 61 74 61 20 3d 20 7b 0a 23 69 66 6e 64 65  _data = {.#ifnde
2e30: 66 20 4e 44 45 42 55 47 0a 20 20 57 49 4e 4d 45  f NDEBUG.  WINME
2e40: 4d 5f 4d 41 47 49 43 31 2c 0a 23 65 6e 64 69 66  M_MAGIC1,.#endif
2e50: 0a 20 20 4e 55 4c 4c 2c 20 46 41 4c 53 45 0a 23  .  NULL, FALSE.#
2e60: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
2e70: 2c 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 0a 23  ,WINMEM_MAGIC2.#
2e80: 65 6e 64 69 66 0a 7d 3b 0a 0a 23 69 66 6e 64 65  endif.};..#ifnde
2e90: 66 20 4e 44 45 42 55 47 0a 23 64 65 66 69 6e 65  f NDEBUG.#define
2ea0: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
2eb0: 69 63 31 28 29 20 61 73 73 65 72 74 28 20 77 69  ic1() assert( wi
2ec0: 6e 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69 63  n_mem_data.magic
2ed0: 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31  1==WINMEM_MAGIC1
2ee0: 20 29 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65   ).#define winMe
2ef0: 6d 41 73 73 65 72 74 4d 61 67 69 63 32 28 29 20  mAssertMagic2() 
2f00: 61 73 73 65 72 74 28 20 77 69 6e 5f 6d 65 6d 5f  assert( win_mem_
2f10: 64 61 74 61 2e 6d 61 67 69 63 32 3d 3d 57 49 4e  data.magic2==WIN
2f20: 4d 45 4d 5f 4d 41 47 49 43 32 20 29 0a 23 64 65  MEM_MAGIC2 ).#de
2f30: 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72  fine winMemAsser
2f40: 74 4d 61 67 69 63 28 29 20 20 77 69 6e 4d 65 6d  tMagic()  winMem
2f50: 41 73 73 65 72 74 4d 61 67 69 63 31 28 29 3b 20  AssertMagic1(); 
2f60: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
2f70: 63 32 28 29 3b 0a 23 65 6c 73 65 0a 23 64 65 66  c2();.#else.#def
2f80: 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ine winMemAssert
2f90: 4d 61 67 69 63 28 29 0a 23 65 6e 64 69 66 0a 0a  Magic().#endif..
2fa0: 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65  #define winMemGe
2fb0: 74 44 61 74 61 50 74 72 28 29 20 20 26 77 69 6e  tDataPtr()  &win
2fc0: 5f 6d 65 6d 5f 64 61 74 61 0a 23 64 65 66 69 6e  _mem_data.#defin
2fd0: 65 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  e winMemGetHeap(
2fe0: 29 20 20 20 20 20 77 69 6e 5f 6d 65 6d 5f 64 61  )     win_mem_da
2ff0: 74 61 2e 68 48 65 61 70 0a 23 64 65 66 69 6e 65  ta.hHeap.#define
3000: 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28   winMemGetOwned(
3010: 29 20 20 20 20 77 69 6e 5f 6d 65 6d 5f 64 61 74  )    win_mem_dat
3020: 61 2e 62 4f 77 6e 65 64 0a 0a 73 74 61 74 69 63  a.bOwned..static
3030: 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c   void *winMemMal
3040: 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 73 29 3b  loc(int nBytes);
3050: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
3060: 4d 65 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50  MemFree(void *pP
3070: 72 69 6f 72 29 3b 0a 73 74 61 74 69 63 20 76 6f  rior);.static vo
3080: 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f  id *winMemReallo
3090: 63 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20  c(void *pPrior, 
30a0: 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73 74 61  int nBytes);.sta
30b0: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69  tic int winMemSi
30c0: 7a 65 28 76 6f 69 64 20 2a 70 29 3b 0a 73 74 61  ze(void *p);.sta
30d0: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f  tic int winMemRo
30e0: 75 6e 64 75 70 28 69 6e 74 20 6e 29 3b 0a 73 74  undup(int n);.st
30f0: 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49  atic int winMemI
3100: 6e 69 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61  nit(void *pAppDa
3110: 74 61 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  ta);.static void
3120: 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28   winMemShutdown(
3130: 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 3b  void *pAppData);
3140: 0a 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  ..const sqlite3_
3150: 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c  mem_methods *sql
3160: 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28  ite3MemGetWin32(
3170: 76 6f 69 64 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  void);.#endif /*
3180: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
3190: 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  LLOC */../*.** T
31a0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
31b0: 69 61 62 6c 65 20 69 73 20 28 6e 6f 72 6d 61 6c  iable is (normal
31c0: 6c 79 29 20 73 65 74 20 6f 6e 63 65 20 61 6e 64  ly) set once and
31d0: 20 6e 65 76 65 72 20 63 68 61 6e 67 65 73 0a 2a   never changes.*
31e0: 2a 20 74 68 65 72 65 61 66 74 65 72 2e 20 20 49  * thereafter.  I
31f0: 74 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65  t records whethe
3200: 72 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  r the operating 
3210: 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39 78 0a  system is Win9x.
3220: 2a 2a 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2a 0a  ** or WinNT..**.
3230: 2a 2a 20 30 3a 20 20 20 4f 70 65 72 61 74 69 6e  ** 0:   Operatin
3240: 67 20 73 79 73 74 65 6d 20 75 6e 6b 6e 6f 77 6e  g system unknown
3250: 2e 0a 2a 2a 20 31 3a 20 20 20 4f 70 65 72 61 74  ..** 1:   Operat
3260: 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57 69  ing system is Wi
3270: 6e 39 78 2e 0a 2a 2a 20 32 3a 20 20 20 4f 70 65  n9x..** 2:   Ope
3280: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73  rating system is
3290: 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e   WinNT..**.** In
32a0: 20 6f 72 64 65 72 20 74 6f 20 66 61 63 69 6c 69   order to facili
32b0: 74 61 74 65 20 74 65 73 74 69 6e 67 20 6f 6e 20  tate testing on 
32c0: 61 20 57 69 6e 4e 54 20 73 79 73 74 65 6d 2c 20  a WinNT system, 
32d0: 74 68 65 20 74 65 73 74 20 66 69 78 74 75 72 65  the test fixture
32e0: 0a 2a 2a 20 63 61 6e 20 6d 61 6e 75 61 6c 6c 79  .** can manually
32f0: 20 73 65 74 20 74 68 69 73 20 76 61 6c 75 65 20   set this value 
3300: 74 6f 20 31 20 74 6f 20 65 6d 75 6c 61 74 65 20  to 1 to emulate 
3310: 57 69 6e 39 38 20 62 65 68 61 76 69 6f 72 2e 0a  Win98 behavior..
3320: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
3330: 5f 54 45 53 54 0a 4c 4f 4e 47 20 53 51 4c 49 54  _TEST.LONG SQLIT
3340: 45 5f 57 49 4e 33 32 5f 56 4f 4c 41 54 49 4c 45  E_WIN32_VOLATILE
3350: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65   sqlite3_os_type
3360: 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61 74   = 0;.#else.stat
3370: 69 63 20 4c 4f 4e 47 20 53 51 4c 49 54 45 5f 57  ic LONG SQLITE_W
3380: 49 4e 33 32 5f 56 4f 4c 41 54 49 4c 45 20 73 71  IN32_VOLATILE sq
3390: 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20  lite3_os_type = 
33a0: 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  0;.#endif..#ifnd
33b0: 65 66 20 53 59 53 43 41 4c 4c 0a 23 20 20 64 65  ef SYSCALL.#  de
33c0: 66 69 6e 65 20 53 59 53 43 41 4c 4c 20 73 71 6c  fine SYSCALL sql
33d0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
33e0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
33f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
3400: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  not available on
3410: 20 57 69 6e 64 6f 77 73 20 43 45 20 6f 72 20 57   Windows CE or W
3420: 69 6e 52 54 2e 0a 20 2a 2f 0a 0a 23 69 66 20 53  inRT.. */..#if S
3430: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
3440: 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  | SQLITE_OS_WINR
3450: 54 0a 23 20 20 64 65 66 69 6e 65 20 6f 73 41 72  T.#  define osAr
3460: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20  eFileApisANSI() 
3470: 20 20 20 20 20 20 31 0a 23 65 6e 64 69 66 0a 0a        1.#endif..
3480: 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65  /*.** Many syste
3490: 6d 20 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65  m calls are acce
34a0: 73 73 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69  ssed through poi
34b0: 6e 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e  nter-to-function
34c0: 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65  s so that.** the
34d0: 79 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64  y may be overrid
34e0: 64 65 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74  den at runtime t
34f0: 6f 20 66 61 63 69 6c 69 74 61 74 65 20 66 61 75  o facilitate fau
3500: 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72  lt injection dur
3510: 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  ing.** testing a
3520: 6e 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20  nd sandboxing.  
3530: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  The following ar
3540: 72 61 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61  ray holds the na
3550: 6d 65 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73  mes and pointers
3560: 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72  .** to all overr
3570: 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63  ideable system c
3580: 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alls..*/.static 
3590: 73 74 72 75 63 74 20 77 69 6e 5f 73 79 73 63 61  struct win_sysca
35a0: 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ll {.  const cha
35b0: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
35c0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
35d0: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  the system call 
35e0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
35f0: 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72 65 6e  call_ptr pCurren
3600: 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 61  t; /* Current va
3610: 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73 74 65  lue of the syste
3620: 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  m call */.  sqli
3630: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
3640: 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66  pDefault; /* Def
3650: 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20  ault value */.} 
3660: 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 23  aSyscall[] = {.#
3670: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
3680: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
3690: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 41 72 65  S_WINRT.  { "Are
36a0: 46 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20 20  FileApisANSI",  
36b0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
36c0: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 2c  AreFileApisANSI,
36d0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
36e0: 6c 73 65 0a 20 20 7b 20 22 41 72 65 46 69 6c 65  lse.  { "AreFile
36f0: 41 70 69 73 41 4e 53 49 22 2c 20 20 20 20 20 20  ApisANSI",      
3700: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
3710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3720: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3730: 0a 0a 23 69 66 6e 64 65 66 20 6f 73 41 72 65 46  ..#ifndef osAreF
3740: 69 6c 65 41 70 69 73 41 4e 53 49 0a 23 64 65 66  ileApisANSI.#def
3750: 69 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70 69  ine osAreFileApi
3760: 73 41 4e 53 49 20 28 28 42 4f 4f 4c 28 57 49 4e  sANSI ((BOOL(WIN
3770: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
3780: 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74  call[0].pCurrent
3790: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  ).#endif..#if SQ
37a0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
37b0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
37c0: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
37d0: 20 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57 22    { "CharLowerW"
37e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
37f0: 53 59 53 43 41 4c 4c 29 43 68 61 72 4c 6f 77 65  SYSCALL)CharLowe
3800: 72 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rW,             
3810: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
3820: 22 43 68 61 72 4c 6f 77 65 72 57 22 2c 20 20 20  "CharLowerW",   
3830: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
3840: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
3850: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3860: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
3870: 65 20 6f 73 43 68 61 72 4c 6f 77 65 72 57 20 28  e osCharLowerW (
3880: 28 4c 50 57 53 54 52 28 57 49 4e 41 50 49 2a 29  (LPWSTR(WINAPI*)
3890: 28 4c 50 57 53 54 52 29 29 61 53 79 73 63 61 6c  (LPWSTR))aSyscal
38a0: 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[1].pCurrent)..
38b0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
38c0: 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28 53  NCE && defined(S
38d0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
38e0: 57 49 44 45 29 0a 20 20 7b 20 22 43 68 61 72 55  WIDE).  { "CharU
38f0: 70 70 65 72 57 22 2c 20 20 20 20 20 20 20 20 20  pperW",         
3900: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 68       (SYSCALL)Ch
3910: 61 72 55 70 70 65 72 57 2c 20 20 20 20 20 20 20  arUpperW,       
3920: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
3930: 65 0a 20 20 7b 20 22 43 68 61 72 55 70 70 65 72  e.  { "CharUpper
3940: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
3950: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
3960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3970: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
3980: 23 64 65 66 69 6e 65 20 6f 73 43 68 61 72 55 70  #define osCharUp
3990: 70 65 72 57 20 28 28 4c 50 57 53 54 52 28 57 49  perW ((LPWSTR(WI
39a0: 4e 41 50 49 2a 29 28 4c 50 57 53 54 52 29 29 61  NAPI*)(LPWSTR))a
39b0: 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72  Syscall[2].pCurr
39c0: 65 6e 74 29 0a 0a 20 20 7b 20 22 43 6c 6f 73 65  ent)..  { "Close
39d0: 48 61 6e 64 6c 65 22 2c 20 20 20 20 20 20 20 20  Handle",        
39e0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 6c       (SYSCALL)Cl
39f0: 6f 73 65 48 61 6e 64 6c 65 2c 20 20 20 20 20 20  oseHandle,      
3a00: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
3a10: 66 69 6e 65 20 6f 73 43 6c 6f 73 65 48 61 6e 64  fine osCloseHand
3a20: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
3a30: 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63  *)(HANDLE))aSysc
3a40: 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29  all[3].pCurrent)
3a50: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
3a60: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
3a70: 4e 53 49 29 0a 20 20 7b 20 22 43 72 65 61 74 65  NSI).  { "Create
3a80: 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20  FileA",         
3a90: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
3aa0: 61 74 65 46 69 6c 65 41 2c 20 20 20 20 20 20 20  ateFileA,       
3ab0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
3ac0: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
3ad0: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  A",             
3ae0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
3af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b00: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
3b10: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46  define osCreateF
3b20: 69 6c 65 41 20 28 28 48 41 4e 44 4c 45 28 57 49  ileA ((HANDLE(WI
3b30: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44 57  NAPI*)(LPCSTR,DW
3b40: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
3b50: 20 20 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f       LPSECURITY_
3b60: 41 54 54 52 49 42 55 54 45 53 2c 44 57 4f 52 44  ATTRIBUTES,DWORD
3b70: 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61  ,DWORD,HANDLE))a
3b80: 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72  Syscall[4].pCurr
3b90: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
3ba0: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
3bb0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
3bc0: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
3bd0: 20 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c 20   "CreateFileW", 
3be0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3bf0: 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 57  CALL)CreateFileW
3c00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
3c10: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72  },.#else.  { "Cr
3c20: 65 61 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20  eateFileW",     
3c30: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3c40: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
3c50: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3c60: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
3c70: 73 43 72 65 61 74 65 46 69 6c 65 57 20 28 28 48  sCreateFileW ((H
3c80: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ANDLE(WINAPI*)(L
3c90: 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f  PCWSTR,DWORD,DWO
3ca0: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
3cb0: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
3cc0: 54 45 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  TES,DWORD,DWORD,
3cd0: 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c  HANDLE))aSyscall
3ce0: 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [5].pCurrent)..#
3cf0: 69 66 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57  if (!SQLITE_OS_W
3d00: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
3d10: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
3d20: 5f 41 4e 53 49 29 20 26 26 20 5c 0a 20 20 20 20  _ANSI) && \.    
3d30: 20 20 20 20 28 21 64 65 66 69 6e 65 64 28 53 51      (!defined(SQ
3d40: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c  LITE_OMIT_WAL) |
3d50: 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  | SQLITE_MAX_MMA
3d60: 50 5f 53 49 5a 45 3e 30 29 29 0a 20 20 7b 20 22  P_SIZE>0)).  { "
3d70: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
3d80: 67 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  gA",      (SYSCA
3d90: 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70  LL)CreateFileMap
3da0: 70 69 6e 67 41 2c 20 20 20 20 20 20 30 20 7d 2c  pingA,      0 },
3db0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
3dc0: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 22 2c  teFileMappingA",
3dd0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
3de0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3df0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3e00: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
3e10: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
3e20: 41 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  A ((HANDLE(WINAP
3e30: 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43  I*)(HANDLE,LPSEC
3e40: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
3e50: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
3e60: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50  D,DWORD,DWORD,LP
3e70: 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 36  CSTR))aSyscall[6
3e80: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3e90: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
3ea0: 20 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f   || (!SQLITE_OS_
3eb0: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
3ec0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
3ed0: 53 5f 57 49 44 45 29 20 26 26 20 5c 0a 20 20 20  S_WIDE) && \.   
3ee0: 20 20 20 20 20 28 21 64 65 66 69 6e 65 64 28 53       (!defined(S
3ef0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20  QLITE_OMIT_WAL) 
3f00: 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  || SQLITE_MAX_MM
3f10: 41 50 5f 53 49 5a 45 3e 30 29 29 0a 20 20 7b 20  AP_SIZE>0)).  { 
3f20: 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  "CreateFileMappi
3f30: 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 43  ngW",      (SYSC
3f40: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61  ALL)CreateFileMa
3f50: 70 70 69 6e 67 57 2c 20 20 20 20 20 20 30 20 7d  ppingW,      0 }
3f60: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
3f70: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 22  ateFileMappingW"
3f80: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
3f90: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3fa0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3fb0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
3fc0: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
3fd0: 67 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  gW ((HANDLE(WINA
3fe0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45  PI*)(HANDLE,LPSE
3ff0: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
4000: 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  S, \.        DWO
4010: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c  RD,DWORD,DWORD,L
4020: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
4030: 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [7].pCurrent)..#
4040: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
4050: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
4060: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4070: 57 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74  WIDE).  { "Creat
4080: 65 4d 75 74 65 78 57 22 2c 20 20 20 20 20 20 20  eMutexW",       
4090: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
40a0: 65 61 74 65 4d 75 74 65 78 57 2c 20 20 20 20 20  eateMutexW,     
40b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
40c0: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74  e.  { "CreateMut
40d0: 65 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  exW",           
40e0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4100: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4110: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
4120: 4d 75 74 65 78 57 20 28 28 48 41 4e 44 4c 45 28  MutexW ((HANDLE(
4130: 57 49 4e 41 50 49 2a 29 28 4c 50 53 45 43 55 52  WINAPI*)(LPSECUR
4140: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 42  ITY_ATTRIBUTES,B
4150: 4f 4f 4c 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  OOL, \.        L
4160: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
4170: 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [8].pCurrent)..#
4180: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
4190: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
41a0: 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c  ).  { "DeleteFil
41b0: 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eA",            
41c0: 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65 74 65   (SYSCALL)Delete
41d0: 46 69 6c 65 41 2c 20 20 20 20 20 20 20 20 20 20  FileA,          
41e0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
41f0: 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c  { "DeleteFileA",
4200: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
4210: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4230: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4240: 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 6c 65  ine osDeleteFile
4250: 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  A ((BOOL(WINAPI*
4260: 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61  )(LPCSTR))aSysca
4270: 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[9].pCurrent).
4280: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
4290: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
42a0: 44 45 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46  DE).  { "DeleteF
42b0: 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20  ileW",          
42c0: 20 20 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65     (SYSCALL)Dele
42d0: 74 65 46 69 6c 65 57 2c 20 20 20 20 20 20 20 20  teFileW,        
42e0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
42f0: 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57    { "DeleteFileW
4300: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
4310: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4330: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4340: 65 66 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69  efine osDeleteFi
4350: 6c 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  leW ((BOOL(WINAP
4360: 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79  I*)(LPCWSTR))aSy
4370: 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65  scall[10].pCurre
4380: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
4390: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69  OS_WINCE.  { "Fi
43a0: 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c  leTimeToLocalFil
43b0: 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c  eTime", (SYSCALL
43c0: 29 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c  )FileTimeToLocal
43d0: 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23  FileTime, 0 },.#
43e0: 65 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69  else.  { "FileTi
43f0: 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d  meToLocalFileTim
4400: 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20  e", (SYSCALL)0, 
4410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4420: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4430: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c  f..#define osFil
4440: 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65  eTimeToLocalFile
4450: 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  Time ((BOOL(WINA
4460: 50 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45 54  PI*)(CONST FILET
4470: 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20  IME*, \.        
4480: 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73  LPFILETIME))aSys
4490: 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e  call[11].pCurren
44a0: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
44b0: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c  S_WINCE.  { "Fil
44c0: 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d  eTimeToSystemTim
44d0: 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29  e",    (SYSCALL)
44e0: 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d  FileTimeToSystem
44f0: 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 23 65  Time,    0 },.#e
4500: 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d  lse.  { "FileTim
4510: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c 20  eToSystemTime", 
4520: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4540: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
4550: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65  ..#define osFile
4560: 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65  TimeToSystemTime
4570: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
4580: 28 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a  (CONST FILETIME*
4590: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 59  , \.        LPSY
45a0: 53 54 45 4d 54 49 4d 45 29 29 61 53 79 73 63 61  STEMTIME))aSysca
45b0: 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[12].pCurrent)
45c0: 0a 0a 20 20 7b 20 22 46 6c 75 73 68 46 69 6c 65  ..  { "FlushFile
45d0: 42 75 66 66 65 72 73 22 2c 20 20 20 20 20 20 20  Buffers",       
45e0: 20 28 53 59 53 43 41 4c 4c 29 46 6c 75 73 68 46   (SYSCALL)FlushF
45f0: 69 6c 65 42 75 66 66 65 72 73 2c 20 20 20 20 20  ileBuffers,     
4600: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
4610: 20 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66   osFlushFileBuff
4620: 65 72 73 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ers ((BOOL(WINAP
4630: 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73  I*)(HANDLE))aSys
4640: 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e  call[13].pCurren
4650: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
4660: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
4670: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 46 6f 72 6d  _ANSI).  { "Form
4680: 61 74 4d 65 73 73 61 67 65 41 22 2c 20 20 20 20  atMessageA",    
4690: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46        (SYSCALL)F
46a0: 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 2c 20 20  ormatMessageA,  
46b0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
46c0: 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65  se.  { "FormatMe
46d0: 73 73 61 67 65 41 22 2c 20 20 20 20 20 20 20 20  ssageA",        
46e0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4700: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4710: 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61  .#define osForma
4720: 74 4d 65 73 73 61 67 65 41 20 28 28 44 57 4f 52  tMessageA ((DWOR
4730: 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44  D(WINAPI*)(DWORD
4740: 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44  ,LPCVOID,DWORD,D
4750: 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20  WORD,LPSTR, \.  
4760: 20 20 20 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c        DWORD,va_l
4770: 69 73 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31  ist*))aSyscall[1
4780: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
4790: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
47a0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
47b0: 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73  .  { "FormatMess
47c0: 61 67 65 57 22 2c 20 20 20 20 20 20 20 20 20 20  ageW",          
47d0: 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d  (SYSCALL)FormatM
47e0: 65 73 73 61 67 65 57 2c 20 20 20 20 20 20 20 20  essageW,        
47f0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4800: 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57   "FormatMessageW
4810: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
4820: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4840: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4850: 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61  ne osFormatMessa
4860: 67 65 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41  geW ((DWORD(WINA
4870: 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f  PI*)(DWORD,LPCVO
4880: 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c  ID,DWORD,DWORD,L
4890: 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20  PWSTR, \.       
48a0: 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29   DWORD,va_list*)
48b0: 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43  )aSyscall[15].pC
48c0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65  urrent)..#if !de
48d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
48e0: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
48f0: 29 0a 20 20 7b 20 22 46 72 65 65 4c 69 62 72 61  ).  { "FreeLibra
4900: 72 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ry",            
4910: 20 28 53 59 53 43 41 4c 4c 29 46 72 65 65 4c 69   (SYSCALL)FreeLi
4920: 62 72 61 72 79 2c 20 20 20 20 20 20 20 20 20 20  brary,          
4930: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
4940: 7b 20 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c  { "FreeLibrary",
4950: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
4960: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4980: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4990: 69 6e 65 20 6f 73 46 72 65 65 4c 69 62 72 61 72  ine osFreeLibrar
49a0: 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  y ((BOOL(WINAPI*
49b0: 29 28 48 4d 4f 44 55 4c 45 29 29 61 53 79 73 63  )(HMODULE))aSysc
49c0: 61 6c 6c 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74  all[16].pCurrent
49d0: 29 0a 0a 20 20 7b 20 22 47 65 74 43 75 72 72 65  )..  { "GetCurre
49e0: 6e 74 50 72 6f 63 65 73 73 49 64 22 2c 20 20 20  ntProcessId",   
49f0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 43 75    (SYSCALL)GetCu
4a00: 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 2c 20  rrentProcessId, 
4a10: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
4a20: 65 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  e osGetCurrentPr
4a30: 6f 63 65 73 73 49 64 20 28 28 44 57 4f 52 44 28  ocessId ((DWORD(
4a40: 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61  WINAPI*)(VOID))a
4a50: 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72  Syscall[17].pCur
4a60: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
4a70: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64  TE_OS_WINCE && d
4a80: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
4a90: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
4aa0: 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53 70  { "GetDiskFreeSp
4ab0: 61 63 65 41 22 2c 20 20 20 20 20 20 20 28 53 59  aceA",       (SY
4ac0: 53 43 41 4c 4c 29 47 65 74 44 69 73 6b 46 72 65  SCALL)GetDiskFre
4ad0: 65 53 70 61 63 65 41 2c 20 20 20 20 20 20 20 30  eSpaceA,       0
4ae0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
4af0: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41  etDiskFreeSpaceA
4b00: 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ",       (SYSCAL
4b10: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4b20: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4b30: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4b40: 6f 73 47 65 74 44 69 73 6b 46 72 65 65 53 70 61  osGetDiskFreeSpa
4b50: 63 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ceA ((BOOL(WINAP
4b60: 49 2a 29 28 4c 50 43 53 54 52 2c 4c 50 44 57 4f  I*)(LPCSTR,LPDWO
4b70: 52 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f  RD,LPDWORD,LPDWO
4b80: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
4b90: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
4ba0: 31 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  18].pCurrent)..#
4bb0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
4bc0: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
4bd0: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
4be0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
4bf0: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
4c00: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57  etDiskFreeSpaceW
4c10: 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ",       (SYSCAL
4c20: 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53 70 61  L)GetDiskFreeSpa
4c30: 63 65 57 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a  ceW,       0 },.
4c40: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44 69  #else.  { "GetDi
4c50: 73 6b 46 72 65 65 53 70 61 63 65 57 22 2c 20 20  skFreeSpaceW",  
4c60: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
4c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c80: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4c90: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
4ca0: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 20  tDiskFreeSpaceW 
4cb0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
4cc0: 4c 50 43 57 53 54 52 2c 4c 50 44 57 4f 52 44 2c  LPCWSTR,LPDWORD,
4cd0: 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c  LPDWORD,LPDWORD,
4ce0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f   \.        LPDWO
4cf0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d  RD))aSyscall[19]
4d00: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4d10: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
4d20: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
4d30: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
4d40: 62 75 74 65 73 41 22 2c 20 20 20 20 20 20 28 53  butesA",      (S
4d50: 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74  YSCALL)GetFileAt
4d60: 74 72 69 62 75 74 65 73 41 2c 20 20 20 20 20 20  tributesA,      
4d70: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4d80: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
4d90: 73 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  sA",      (SYSCA
4da0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4db0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4dc0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4dd0: 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
4de0: 75 74 65 73 41 20 28 28 44 57 4f 52 44 28 57 49  utesA ((DWORD(WI
4df0: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61  NAPI*)(LPCSTR))a
4e00: 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43 75 72  Syscall[20].pCur
4e10: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
4e20: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
4e30: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
4e40: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
4e50: 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62  { "GetFileAttrib
4e60: 75 74 65 73 57 22 2c 20 20 20 20 20 20 28 53 59  utesW",      (SY
4e70: 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74  SCALL)GetFileAtt
4e80: 72 69 62 75 74 65 73 57 2c 20 20 20 20 20 20 30  ributesW,      0
4e90: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
4ea0: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
4eb0: 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  W",      (SYSCAL
4ec0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4ed0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4ee0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4ef0: 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
4f00: 74 65 73 57 20 28 28 44 57 4f 52 44 28 57 49 4e  tesW ((DWORD(WIN
4f10: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61  API*)(LPCWSTR))a
4f20: 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72  Syscall[21].pCur
4f30: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
4f40: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
4f50: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
4f60: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
4f70: 45 78 57 22 2c 20 20 20 20 28 53 59 53 43 41 4c  ExW",    (SYSCAL
4f80: 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  L)GetFileAttribu
4f90: 74 65 73 45 78 57 2c 20 20 20 20 30 20 7d 2c 0a  tesExW,    0 },.
4fa0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69  #else.  { "GetFi
4fb0: 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 22  leAttributesExW"
4fc0: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c  ,    (SYSCALL)0,
4fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fe0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4ff0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
5000: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
5010: 78 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  xW ((BOOL(WINAPI
5020: 2a 29 28 4c 50 43 57 53 54 52 2c 47 45 54 5f 46  *)(LPCWSTR,GET_F
5030: 49 4c 45 45 58 5f 49 4e 46 4f 5f 4c 45 56 45 4c  ILEEX_INFO_LEVEL
5040: 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 56  S, \.        LPV
5050: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 32  OID))aSyscall[22
5060: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5070: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
5080: 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 53 69  T.  { "GetFileSi
5090: 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ze",            
50a0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c   (SYSCALL)GetFil
50b0: 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  eSize,          
50c0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
50d0: 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22 2c  { "GetFileSize",
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
50f0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5110: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5120: 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 53 69 7a  ine osGetFileSiz
5130: 65 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  e ((DWORD(WINAPI
5140: 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 44 57 4f 52  *)(HANDLE,LPDWOR
5150: 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e  D))aSyscall[23].
5160: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
5170: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
5180: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
5190: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
51a0: 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61  ).  { "GetFullPa
51b0: 74 68 4e 61 6d 65 41 22 2c 20 20 20 20 20 20 20  thNameA",       
51c0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c   (SYSCALL)GetFul
51d0: 6c 50 61 74 68 4e 61 6d 65 41 2c 20 20 20 20 20  lPathNameA,     
51e0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
51f0: 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  { "GetFullPathNa
5200: 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28 53 59  meA",        (SY
5210: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5230: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5240: 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74  ine osGetFullPat
5250: 68 4e 61 6d 65 41 20 28 28 44 57 4f 52 44 28 57  hNameA ((DWORD(W
5260: 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44  INAPI*)(LPCSTR,D
5270: 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20  WORD,LPSTR, \.  
5280: 20 20 20 20 20 20 4c 50 53 54 52 2a 29 29 61 53        LPSTR*))aS
5290: 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72  yscall[24].pCurr
52a0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
52b0: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
52c0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
52d0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
52e0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
52f0: 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74  .  { "GetFullPat
5300: 68 4e 61 6d 65 57 22 2c 20 20 20 20 20 20 20 20  hNameW",        
5310: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c  (SYSCALL)GetFull
5320: 50 61 74 68 4e 61 6d 65 57 2c 20 20 20 20 20 20  PathNameW,      
5330: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5340: 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d   "GetFullPathNam
5350: 65 57 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  eW",        (SYS
5360: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5380: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5390: 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68  ne osGetFullPath
53a0: 4e 61 6d 65 57 20 28 28 44 57 4f 52 44 28 57 49  NameW ((DWORD(WI
53b0: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44  NAPI*)(LPCWSTR,D
53c0: 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20  WORD,LPWSTR, \. 
53d0: 20 20 20 20 20 20 20 4c 50 57 53 54 52 2a 29 29         LPWSTR*))
53e0: 61 53 79 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75  aSyscall[25].pCu
53f0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74  rrent)..  { "Get
5400: 4c 61 73 74 45 72 72 6f 72 22 2c 20 20 20 20 20  LastError",     
5410: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5420: 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20  GetLastError,   
5430: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
5440: 64 65 66 69 6e 65 20 6f 73 47 65 74 4c 61 73 74  define osGetLast
5450: 45 72 72 6f 72 20 28 28 44 57 4f 52 44 28 57 49  Error ((DWORD(WI
5460: 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79  NAPI*)(VOID))aSy
5470: 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65  scall[26].pCurre
5480: 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  nt)..#if !define
5490: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  d(SQLITE_OMIT_LO
54a0: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 23 69  AD_EXTENSION).#i
54b0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
54c0: 45 0a 20 20 2f 2a 20 54 68 65 20 47 65 74 50 72  E.  /* The GetPr
54d0: 6f 63 41 64 64 72 65 73 73 41 28 29 20 72 6f 75  ocAddressA() rou
54e0: 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 61 76 61  tine is only ava
54f0: 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77  ilable on Window
5500: 73 20 43 45 2e 20 2a 2f 0a 20 20 7b 20 22 47 65  s CE. */.  { "Ge
5510: 74 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20  tProcAddressA", 
5520: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5530: 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  )GetProcAddressA
5540: 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  ,         0 },.#
5550: 65 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74  else.  /* All ot
5560: 68 65 72 20 57 69 6e 64 6f 77 73 20 70 6c 61 74  her Windows plat
5570: 66 6f 72 6d 73 20 65 78 70 65 63 74 20 47 65 74  forms expect Get
5580: 50 72 6f 63 41 64 64 72 65 73 73 28 29 20 74 6f  ProcAddress() to
5590: 20 74 61 6b 65 0a 20 20 2a 2a 20 61 6e 20 41 4e   take.  ** an AN
55a0: 53 49 20 73 74 72 69 6e 67 20 72 65 67 61 72 64  SI string regard
55b0: 6c 65 73 73 20 6f 66 20 74 68 65 20 5f 55 4e 49  less of the _UNI
55c0: 43 4f 44 45 20 73 65 74 74 69 6e 67 20 2a 2f 0a  CODE setting */.
55d0: 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72    { "GetProcAddr
55e0: 65 73 73 41 22 2c 20 20 20 20 20 20 20 20 20 28  essA",         (
55f0: 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 41  SYSCALL)GetProcA
5600: 64 64 72 65 73 73 2c 20 20 20 20 20 20 20 20 20  ddress,         
5610: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 65 6c   0 },.#endif.#el
5620: 73 65 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41  se.  { "GetProcA
5630: 64 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20  ddressA",       
5640: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5660: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5670: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 50 72  .#define osGetPr
5680: 6f 63 41 64 64 72 65 73 73 41 20 28 28 46 41 52  ocAddressA ((FAR
5690: 50 52 4f 43 28 57 49 4e 41 50 49 2a 29 28 48 4d  PROC(WINAPI*)(HM
56a0: 4f 44 55 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20  ODULE, \.       
56b0: 20 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c   LPCSTR))aSyscal
56c0: 6c 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[27].pCurrent).
56d0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
56e0: 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 53 79  WINRT.  { "GetSy
56f0: 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20  stemInfo",      
5700: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
5710: 74 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20  tSystemInfo,    
5720: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
5730: 65 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d  e.  { "GetSystem
5740: 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20 20  Info",          
5750: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5770: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5780: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73  #define osGetSys
5790: 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28 57  temInfo ((VOID(W
57a0: 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45 4d  INAPI*)(LPSYSTEM
57b0: 5f 49 4e 46 4f 29 29 61 53 79 73 63 61 6c 6c 5b  _INFO))aSyscall[
57c0: 32 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  28].pCurrent).. 
57d0: 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d   { "GetSystemTim
57e0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  e",           (S
57f0: 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d  YSCALL)GetSystem
5800: 54 69 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Time,           
5810: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
5820: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 20 28 28  GetSystemTime ((
5830: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50  VOID(WINAPI*)(LP
5840: 53 59 53 54 45 4d 54 49 4d 45 29 29 61 53 79 73  SYSTEMTIME))aSys
5850: 63 61 6c 6c 5b 32 39 5d 2e 70 43 75 72 72 65 6e  call[29].pCurren
5860: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
5870: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 47 65  OS_WINCE.  { "Ge
5880: 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c  tSystemTimeAsFil
5890: 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c  eTime", (SYSCALL
58a0: 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73  )GetSystemTimeAs
58b0: 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23  FileTime, 0 },.#
58c0: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 53 79 73  else.  { "GetSys
58d0: 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
58e0: 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20  e", (SYSCALL)0, 
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5900: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5910: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
5920: 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65  SystemTimeAsFile
5930: 54 69 6d 65 20 28 28 56 4f 49 44 28 57 49 4e 41  Time ((VOID(WINA
5940: 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20  PI*)( \.        
5950: 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73  LPFILETIME))aSys
5960: 63 61 6c 6c 5b 33 30 5d 2e 70 43 75 72 72 65 6e  call[30].pCurren
5970: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
5980: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
5990: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 54  _ANSI).  { "GetT
59a0: 65 6d 70 50 61 74 68 41 22 2c 20 20 20 20 20 20  empPathA",      
59b0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
59c0: 65 74 54 65 6d 70 50 61 74 68 41 2c 20 20 20 20  etTempPathA,    
59d0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
59e0: 73 65 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50  se.  { "GetTempP
59f0: 61 74 68 41 22 2c 20 20 20 20 20 20 20 20 20 20  athA",          
5a00: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a20: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5a30: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65  .#define osGetTe
5a40: 6d 70 50 61 74 68 41 20 28 28 44 57 4f 52 44 28  mpPathA ((DWORD(
5a50: 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c  WINAPI*)(DWORD,L
5a60: 50 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33  PSTR))aSyscall[3
5a70: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
5a80: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
5a90: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
5aa0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
5ab0: 49 44 45 29 0a 20 20 7b 20 22 47 65 74 54 65 6d  IDE).  { "GetTem
5ac0: 70 50 61 74 68 57 22 2c 20 20 20 20 20 20 20 20  pPathW",        
5ad0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
5ae0: 54 65 6d 70 50 61 74 68 57 2c 20 20 20 20 20 20  TempPathW,      
5af0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
5b00: 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74  .  { "GetTempPat
5b10: 68 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  hW",            
5b20: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
5b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b40: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
5b50: 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65 6d 70  define osGetTemp
5b60: 50 61 74 68 57 20 28 28 44 57 4f 52 44 28 57 49  PathW ((DWORD(WI
5b70: 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 57  NAPI*)(DWORD,LPW
5b80: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33 32  STR))aSyscall[32
5b90: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5ba0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
5bb0: 54 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f  T.  { "GetTickCo
5bc0: 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  unt",           
5bd0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69 63   (SYSCALL)GetTic
5be0: 6b 43 6f 75 6e 74 2c 20 20 20 20 20 20 20 20 20  kCount,         
5bf0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5c00: 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 22  { "GetTickCount"
5c10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
5c20: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5c40: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5c50: 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43 6f 75  ine osGetTickCou
5c60: 6e 74 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  nt ((DWORD(WINAP
5c70: 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61  I*)(VOID))aSysca
5c80: 6c 6c 5b 33 33 5d 2e 70 43 75 72 72 65 6e 74 29  ll[33].pCurrent)
5c90: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
5ca0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
5cb0: 4e 53 49 29 20 26 26 20 64 65 66 69 6e 65 64 28  NSI) && defined(
5cc0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54  SQLITE_WIN32_GET
5cd0: 56 45 52 53 49 4f 4e 45 58 29 20 26 26 20 5c 0a  VERSIONEX) && \.
5ce0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57          SQLITE_W
5cf0: 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45  IN32_GETVERSIONE
5d00: 58 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f  X.  { "GetVersio
5d10: 6e 45 78 41 22 2c 20 20 20 20 20 20 20 20 20 20  nExA",          
5d20: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 56 65 72   (SYSCALL)GetVer
5d30: 73 69 6f 6e 45 78 41 2c 20 20 20 20 20 20 20 20  sionExA,        
5d40: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5d50: 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41  { "GetVersionExA
5d60: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
5d70: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5d90: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5da0: 69 6e 65 20 6f 73 47 65 74 56 65 72 73 69 6f 6e  ine osGetVersion
5db0: 45 78 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ExA ((BOOL(WINAP
5dc0: 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c  I*)( \.        L
5dd0: 50 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 29  POSVERSIONINFOA)
5de0: 29 61 53 79 73 63 61 6c 6c 5b 33 34 5d 2e 70 43  )aSyscall[34].pC
5df0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
5e00: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
5e10: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
5e20: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20  WIN32_HAS_WIDE) 
5e30: 26 26 20 5c 0a 20 20 20 20 20 20 20 20 64 65 66  && \.        def
5e40: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
5e50: 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 29 20  2_GETVERSIONEX) 
5e60: 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  && SQLITE_WIN32_
5e70: 47 45 54 56 45 52 53 49 4f 4e 45 58 0a 20 20 7b  GETVERSIONEX.  {
5e80: 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 57 22   "GetVersionExW"
5e90: 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ,           (SYS
5ea0: 43 41 4c 4c 29 47 65 74 56 65 72 73 69 6f 6e 45  CALL)GetVersionE
5eb0: 78 57 2c 20 20 20 20 20 20 20 20 20 20 20 30 20  xW,           0 
5ec0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
5ed0: 74 56 65 72 73 69 6f 6e 45 78 57 22 2c 20 20 20  tVersionExW",   
5ee0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5ef0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
5f00: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5f10: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
5f20: 73 47 65 74 56 65 72 73 69 6f 6e 45 78 57 20 28  sGetVersionExW (
5f30: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20  (BOOL(WINAPI*)( 
5f40: 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 53 56 45  \.        LPOSVE
5f50: 52 53 49 4f 4e 49 4e 46 4f 57 29 29 61 53 79 73  RSIONINFOW))aSys
5f60: 63 61 6c 6c 5b 33 35 5d 2e 70 43 75 72 72 65 6e  call[35].pCurren
5f70: 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 41 6c 6c  t)..  { "HeapAll
5f80: 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  oc",            
5f90: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70     (SYSCALL)Heap
5fa0: 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20 20 20  Alloc,          
5fb0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
5fc0: 6e 65 20 6f 73 48 65 61 70 41 6c 6c 6f 63 20 28  ne osHeapAlloc (
5fd0: 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29  (LPVOID(WINAPI*)
5fe0: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c  (HANDLE,DWORD, \
5ff0: 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29  .        SIZE_T)
6000: 29 61 53 79 73 63 61 6c 6c 5b 33 36 5d 2e 70 43  )aSyscall[36].pC
6010: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
6020: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
6030: 7b 20 22 48 65 61 70 43 72 65 61 74 65 22 2c 20  { "HeapCreate", 
6040: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6050: 53 43 41 4c 4c 29 48 65 61 70 43 72 65 61 74 65  SCALL)HeapCreate
6060: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ,              0
6070: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48   },.#else.  { "H
6080: 65 61 70 43 72 65 61 74 65 22 2c 20 20 20 20 20  eapCreate",     
6090: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
60a0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
60b0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
60c0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
60d0: 6f 73 48 65 61 70 43 72 65 61 74 65 20 28 28 48  osHeapCreate ((H
60e0: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 44  ANDLE(WINAPI*)(D
60f0: 57 4f 52 44 2c 53 49 5a 45 5f 54 2c 20 5c 0a 20  WORD,SIZE_T, \. 
6100: 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61         SIZE_T))a
6110: 53 79 73 63 61 6c 6c 5b 33 37 5d 2e 70 43 75 72  Syscall[37].pCur
6120: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
6130: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
6140: 22 48 65 61 70 44 65 73 74 72 6f 79 22 2c 20 20  "HeapDestroy",  
6150: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6160: 41 4c 4c 29 48 65 61 70 44 65 73 74 72 6f 79 2c  ALL)HeapDestroy,
6170: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6180: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61  ,.#else.  { "Hea
6190: 70 44 65 73 74 72 6f 79 22 2c 20 20 20 20 20 20  pDestroy",      
61a0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
61b0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
61c0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
61d0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
61e0: 48 65 61 70 44 65 73 74 72 6f 79 20 28 28 42 4f  HeapDestroy ((BO
61f0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
6200: 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 38 5d  LE))aSyscall[38]
6210: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
6220: 22 48 65 61 70 46 72 65 65 22 2c 20 20 20 20 20  "HeapFree",     
6230: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6240: 41 4c 4c 29 48 65 61 70 46 72 65 65 2c 20 20 20  ALL)HeapFree,   
6250: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6260: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61  ,..#define osHea
6270: 70 46 72 65 65 20 28 28 42 4f 4f 4c 28 57 49 4e  pFree ((BOOL(WIN
6280: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
6290: 52 44 2c 4c 50 56 4f 49 44 29 29 61 53 79 73 63  RD,LPVOID))aSysc
62a0: 61 6c 6c 5b 33 39 5d 2e 70 43 75 72 72 65 6e 74  all[39].pCurrent
62b0: 29 0a 0a 20 20 7b 20 22 48 65 61 70 52 65 41 6c  )..  { "HeapReAl
62c0: 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20 20  loc",           
62d0: 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 52    (SYSCALL)HeapR
62e0: 65 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20 20  eAlloc,         
62f0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
6300: 65 20 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63 20  e osHeapReAlloc 
6310: 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a  ((LPVOID(WINAPI*
6320: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c  )(HANDLE,DWORD,L
6330: 50 56 4f 49 44 2c 20 5c 0a 20 20 20 20 20 20 20  PVOID, \.       
6340: 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c   SIZE_T))aSyscal
6350: 6c 5b 34 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[40].pCurrent).
6360: 0a 20 20 7b 20 22 48 65 61 70 53 69 7a 65 22 2c  .  { "HeapSize",
6370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6380: 28 53 59 53 43 41 4c 4c 29 48 65 61 70 53 69 7a  (SYSCALL)HeapSiz
6390: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
63a0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
63b0: 6f 73 48 65 61 70 53 69 7a 65 20 28 28 53 49 5a  osHeapSize ((SIZ
63c0: 45 5f 54 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  E_T(WINAPI*)(HAN
63d0: 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  DLE,DWORD, \.   
63e0: 20 20 20 20 20 4c 50 43 56 4f 49 44 29 29 61 53       LPCVOID))aS
63f0: 79 73 63 61 6c 6c 5b 34 31 5d 2e 70 43 75 72 72  yscall[41].pCurr
6400: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
6410: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
6420: 48 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20 20  HeapValidate",  
6430: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6440: 4c 4c 29 48 65 61 70 56 61 6c 69 64 61 74 65 2c  LL)HeapValidate,
6450: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6460: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70  .#else.  { "Heap
6470: 56 61 6c 69 64 61 74 65 22 2c 20 20 20 20 20 20  Validate",      
6480: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6490: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
64a0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
64b0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48  dif..#define osH
64c0: 65 61 70 56 61 6c 69 64 61 74 65 20 28 28 42 4f  eapValidate ((BO
64d0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
64e0: 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  LE,DWORD, \.    
64f0: 20 20 20 20 4c 50 43 56 4f 49 44 29 29 61 53 79      LPCVOID))aSy
6500: 73 63 61 6c 6c 5b 34 32 5d 2e 70 43 75 72 72 65  scall[42].pCurre
6510: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
6520: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
6530: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
6540: 7b 20 22 48 65 61 70 43 6f 6d 70 61 63 74 22 2c  { "HeapCompact",
6550: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6560: 53 43 41 4c 4c 29 48 65 61 70 43 6f 6d 70 61 63  SCALL)HeapCompac
6570: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  t,             0
6580: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48   },.#else.  { "H
6590: 65 61 70 43 6f 6d 70 61 63 74 22 2c 20 20 20 20  eapCompact",    
65a0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
65b0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
65c0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
65d0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
65e0: 6f 73 48 65 61 70 43 6f 6d 70 61 63 74 20 28 28  osHeapCompact ((
65f0: 55 49 4e 54 28 57 49 4e 41 50 49 2a 29 28 48 41  UINT(WINAPI*)(HA
6600: 4e 44 4c 45 2c 44 57 4f 52 44 29 29 61 53 79 73  NDLE,DWORD))aSys
6610: 63 61 6c 6c 5b 34 33 5d 2e 70 43 75 72 72 65 6e  call[43].pCurren
6620: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
6630: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
6640: 5f 41 4e 53 49 29 20 26 26 20 21 64 65 66 69 6e  _ANSI) && !defin
6650: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ed(SQLITE_OMIT_L
6660: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20  OAD_EXTENSION). 
6670: 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 41   { "LoadLibraryA
6680: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
6690: 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61  YSCALL)LoadLibra
66a0: 72 79 41 2c 20 20 20 20 20 20 20 20 20 20 20 20  ryA,            
66b0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
66c0: 4c 6f 61 64 4c 69 62 72 61 72 79 41 22 2c 20 20  LoadLibraryA",  
66d0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
66e0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
66f0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6700: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6710: 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 20   osLoadLibraryA 
6720: 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49  ((HMODULE(WINAPI
6730: 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63  *)(LPCSTR))aSysc
6740: 61 6c 6c 5b 34 34 5d 2e 70 43 75 72 72 65 6e 74  all[44].pCurrent
6750: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
6760: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
6770: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
6780: 48 41 53 5f 57 49 44 45 29 20 26 26 20 5c 0a 20  HAS_WIDE) && \. 
6790: 20 20 20 20 20 20 20 21 64 65 66 69 6e 65 64 28         !defined(
67a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
67b0: 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20  _EXTENSION).  { 
67c0: 22 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c 20  "LoadLibraryW", 
67d0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
67e0: 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79 57  ALL)LoadLibraryW
67f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
6800: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61  ,.#else.  { "Loa
6810: 64 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20 20  dLibraryW",     
6820: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6830: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6840: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6850: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6860: 4c 6f 61 64 4c 69 62 72 61 72 79 57 20 28 28 48  LoadLibraryW ((H
6870: 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28  MODULE(WINAPI*)(
6880: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
6890: 6c 5b 34 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[45].pCurrent).
68a0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
68b0: 57 49 4e 52 54 0a 20 20 7b 20 22 4c 6f 63 61 6c  WINRT.  { "Local
68c0: 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20 20  Free",          
68d0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f       (SYSCALL)Lo
68e0: 63 61 6c 46 72 65 65 2c 20 20 20 20 20 20 20 20  calFree,        
68f0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
6900: 65 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65  e.  { "LocalFree
6910: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
6920: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
6930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6940: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
6950: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 61 6c 46  #define osLocalF
6960: 72 65 65 20 28 28 48 4c 4f 43 41 4c 28 57 49 4e  ree ((HLOCAL(WIN
6970: 41 50 49 2a 29 28 48 4c 4f 43 41 4c 29 29 61 53  API*)(HLOCAL))aS
6980: 79 73 63 61 6c 6c 5b 34 36 5d 2e 70 43 75 72 72  yscall[46].pCurr
6990: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
69a0: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
69b0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
69c0: 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20   { "LockFile",  
69d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
69e0: 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65 2c  YSCALL)LockFile,
69f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a00: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6a10: 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20  LockFile",      
6a20: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6a30: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6a40: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6a50: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
6a60: 20 6f 73 4c 6f 63 6b 46 69 6c 65 0a 23 64 65 66   osLockFile.#def
6a70: 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 20 28  ine osLockFile (
6a80: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
6a90: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52  ANDLE,DWORD,DWOR
6aa0: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
6ab0: 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61     DWORD))aSysca
6ac0: 6c 6c 5b 34 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[47].pCurrent)
6ad0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51  .#endif..#if !SQ
6ae0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
6af0: 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 20  { "LockFileEx", 
6b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6b10: 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65 45 78  SCALL)LockFileEx
6b20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ,              0
6b30: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c   },.#else.  { "L
6b40: 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20  ockFileEx",     
6b50: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6b60: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
6b70: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6b80: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
6b90: 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 0a 23 64 65  osLockFileEx.#de
6ba0: 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 45  fine osLockFileE
6bb0: 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  x ((BOOL(WINAPI*
6bc0: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44  )(HANDLE,DWORD,D
6bd0: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
6be0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56  , \.        LPOV
6bf0: 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63 61  ERLAPPED))aSysca
6c00: 6c 6c 5b 34 38 5d 2e 70 43 75 72 72 65 6e 74 29  ll[48].pCurrent)
6c10: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
6c20: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20  ITE_OS_WINCE || 
6c30: 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  (!SQLITE_OS_WINR
6c40: 54 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 28  T && \.        (
6c50: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6c60: 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c  OMIT_WAL) || SQL
6c70: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
6c80: 45 3e 30 29 29 0a 20 20 7b 20 22 4d 61 70 56 69  E>0)).  { "MapVi
6c90: 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ewOfFile",      
6ca0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 61       (SYSCALL)Ma
6cb0: 70 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20  pViewOfFile,    
6cc0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
6cd0: 65 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66  e.  { "MapViewOf
6ce0: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
6cf0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
6d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d10: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
6d20: 23 64 65 66 69 6e 65 20 6f 73 4d 61 70 56 69 65  #define osMapVie
6d30: 77 4f 66 46 69 6c 65 20 28 28 4c 50 56 4f 49 44  wOfFile ((LPVOID
6d40: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
6d50: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f  ,DWORD,DWORD,DWO
6d60: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49  RD, \.        SI
6d70: 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 34  ZE_T))aSyscall[4
6d80: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  9].pCurrent)..  
6d90: 7b 20 22 4d 75 6c 74 69 42 79 74 65 54 6f 57 69  { "MultiByteToWi
6da0: 64 65 43 68 61 72 22 2c 20 20 20 20 20 28 53 59  deChar",     (SY
6db0: 53 43 41 4c 4c 29 4d 75 6c 74 69 42 79 74 65 54  SCALL)MultiByteT
6dc0: 6f 57 69 64 65 43 68 61 72 2c 20 20 20 20 20 30  oWideChar,     0
6dd0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d   },..#define osM
6de0: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
6df0: 61 72 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a  ar ((int(WINAPI*
6e00: 29 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43  )(UINT,DWORD,LPC
6e10: 53 54 52 2c 69 6e 74 2c 4c 50 57 53 54 52 2c 20  STR,int,LPWSTR, 
6e20: 5c 0a 20 20 20 20 20 20 20 20 69 6e 74 29 29 61  \.        int))a
6e30: 53 79 73 63 61 6c 6c 5b 35 30 5d 2e 70 43 75 72  Syscall[50].pCur
6e40: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 51 75 65 72  rent)..  { "Quer
6e50: 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e  yPerformanceCoun
6e60: 74 65 72 22 2c 20 28 53 59 53 43 41 4c 4c 29 51  ter", (SYSCALL)Q
6e70: 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43  ueryPerformanceC
6e80: 6f 75 6e 74 65 72 2c 20 30 20 7d 2c 0a 0a 23 64  ounter, 0 },..#d
6e90: 65 66 69 6e 65 20 6f 73 51 75 65 72 79 50 65 72  efine osQueryPer
6ea0: 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20  formanceCounter 
6eb0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
6ec0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 41 52 47 45   \.        LARGE
6ed0: 5f 49 4e 54 45 47 45 52 2a 29 29 61 53 79 73 63  _INTEGER*))aSysc
6ee0: 61 6c 6c 5b 35 31 5d 2e 70 43 75 72 72 65 6e 74  all[51].pCurrent
6ef0: 29 0a 0a 20 20 7b 20 22 52 65 61 64 46 69 6c 65  )..  { "ReadFile
6f00: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
6f10: 20 20 28 53 59 53 43 41 4c 4c 29 52 65 61 64 46    (SYSCALL)ReadF
6f20: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
6f30: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
6f40: 65 20 6f 73 52 65 61 64 46 69 6c 65 20 28 28 42  e osReadFile ((B
6f50: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
6f60: 44 4c 45 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44  DLE,LPVOID,DWORD
6f70: 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  ,LPDWORD, \.    
6f80: 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44      LPOVERLAPPED
6f90: 29 29 61 53 79 73 63 61 6c 6c 5b 35 32 5d 2e 70  ))aSyscall[52].p
6fa0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53  Current)..  { "S
6fb0: 65 74 45 6e 64 4f 66 46 69 6c 65 22 2c 20 20 20  etEndOfFile",   
6fc0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6fd0: 4c 29 53 65 74 45 6e 64 4f 66 46 69 6c 65 2c 20  L)SetEndOfFile, 
6fe0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6ff0: 0a 23 64 65 66 69 6e 65 20 6f 73 53 65 74 45 6e  .#define osSetEn
7000: 64 4f 66 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57  dOfFile ((BOOL(W
7010: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29  INAPI*)(HANDLE))
7020: 61 53 79 73 63 61 6c 6c 5b 35 33 5d 2e 70 43 75  aSyscall[53].pCu
7030: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
7040: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
7050: 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72   "SetFilePointer
7060: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
7070: 43 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e  CALL)SetFilePoin
7080: 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 30 20  ter,          0 
7090: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 65  },.#else.  { "Se
70a0: 74 46 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20  tFilePointer",  
70b0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
70c0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
70d0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
70e0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
70f0: 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 20  sSetFilePointer 
7100: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
7110: 28 48 41 4e 44 4c 45 2c 4c 4f 4e 47 2c 50 4c 4f  (HANDLE,LONG,PLO
7120: 4e 47 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  NG, \.        DW
7130: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 34  ORD))aSyscall[54
7140: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
7150: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
7160: 54 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c 20 20  T.  { "Sleep",  
7170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7180: 20 28 53 59 53 43 41 4c 4c 29 53 6c 65 65 70 2c   (SYSCALL)Sleep,
7190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71a0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
71b0: 7b 20 22 53 6c 65 65 70 22 2c 20 20 20 20 20 20  { "Sleep",      
71c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
71d0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
71e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
71f0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
7200: 69 6e 65 20 6f 73 53 6c 65 65 70 20 28 28 56 4f  ine osSleep ((VO
7210: 49 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52  ID(WINAPI*)(DWOR
7220: 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 35 5d 2e  D))aSyscall[55].
7230: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
7240: 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65  SystemTimeToFile
7250: 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41  Time",    (SYSCA
7260: 4c 4c 29 53 79 73 74 65 6d 54 69 6d 65 54 6f 46  LL)SystemTimeToF
7270: 69 6c 65 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c  ileTime,    0 },
7280: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 79 73 74  ..#define osSyst
7290: 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65  emTimeToFileTime
72a0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
72b0: 28 43 4f 4e 53 54 20 53 59 53 54 45 4d 54 49 4d  (CONST SYSTEMTIM
72c0: 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  E*, \.        LP
72d0: 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61  FILETIME))aSysca
72e0: 6c 6c 5b 35 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[56].pCurrent)
72f0: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
7300: 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
7310: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
7320: 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20  UnlockFile",    
7330: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
7340: 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 2c 20 20  LL)UnlockFile,  
7350: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7360: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f  .#else.  { "Unlo
7370: 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  ckFile",        
7380: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
7390: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
73a0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
73b0: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 55  dif..#ifndef osU
73c0: 6e 6c 6f 63 6b 46 69 6c 65 0a 23 64 65 66 69 6e  nlockFile.#defin
73d0: 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 20 28  e osUnlockFile (
73e0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
73f0: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52  ANDLE,DWORD,DWOR
7400: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
7410: 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61     DWORD))aSysca
7420: 6c 6c 5b 35 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[57].pCurrent)
7430: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51  .#endif..#if !SQ
7440: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
7450: 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22  { "UnlockFileEx"
7460: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
7470: 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65  SCALL)UnlockFile
7480: 45 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  Ex,            0
7490: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55   },.#else.  { "U
74a0: 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20  nlockFileEx",   
74b0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
74c0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
74d0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
74e0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
74f0: 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 20 28  osUnlockFileEx (
7500: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
7510: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52  ANDLE,DWORD,DWOR
7520: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
7530: 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29     LPOVERLAPPED)
7540: 29 61 53 79 73 63 61 6c 6c 5b 35 38 5d 2e 70 43  )aSyscall[58].pC
7550: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
7560: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20  ITE_OS_WINCE || 
7570: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
7580: 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c  OMIT_WAL) || SQL
7590: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
75a0: 45 3e 30 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69  E>0.  { "UnmapVi
75b0: 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ewOfFile",      
75c0: 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6d 61     (SYSCALL)Unma
75d0: 70 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20  pViewOfFile,    
75e0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
75f0: 20 20 7b 20 22 55 6e 6d 61 70 56 69 65 77 4f 66    { "UnmapViewOf
7600: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 28  File",         (
7610: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
7620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7630: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
7640: 65 66 69 6e 65 20 6f 73 55 6e 6d 61 70 56 69 65  efine osUnmapVie
7650: 77 4f 66 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57  wOfFile ((BOOL(W
7660: 49 4e 41 50 49 2a 29 28 4c 50 43 56 4f 49 44 29  INAPI*)(LPCVOID)
7670: 29 61 53 79 73 63 61 6c 6c 5b 35 39 5d 2e 70 43  )aSyscall[59].pC
7680: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 57 69  urrent)..  { "Wi
7690: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
76a0: 65 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c  e",     (SYSCALL
76b0: 29 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69  )WideCharToMulti
76c0: 42 79 74 65 2c 20 20 20 20 20 30 20 7d 2c 0a 0a  Byte,     0 },..
76d0: 23 64 65 66 69 6e 65 20 6f 73 57 69 64 65 43 68  #define osWideCh
76e0: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 20 28 28  arToMultiByte ((
76f0: 69 6e 74 28 57 49 4e 41 50 49 2a 29 28 55 49 4e  int(WINAPI*)(UIN
7700: 54 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54 52 2c  T,DWORD,LPCWSTR,
7710: 69 6e 74 2c 4c 50 53 54 52 2c 69 6e 74 2c 20 5c  int,LPSTR,int, \
7720: 0a 20 20 20 20 20 20 20 20 4c 50 43 53 54 52 2c  .        LPCSTR,
7730: 4c 50 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c  LPBOOL))aSyscall
7740: 5b 36 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [60].pCurrent)..
7750: 20 20 7b 20 22 57 72 69 74 65 46 69 6c 65 22 2c    { "WriteFile",
7760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
7770: 53 59 53 43 41 4c 4c 29 57 72 69 74 65 46 69 6c  SYSCALL)WriteFil
7780: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
7790: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
77a0: 73 57 72 69 74 65 46 69 6c 65 20 28 28 42 4f 4f  sWriteFile ((BOO
77b0: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
77c0: 45 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c  E,LPCVOID,DWORD,
77d0: 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  LPDWORD, \.     
77e0: 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29     LPOVERLAPPED)
77f0: 29 61 53 79 73 63 61 6c 6c 5b 36 31 5d 2e 70 43  )aSyscall[61].pC
7800: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
7810: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
7820: 20 22 43 72 65 61 74 65 45 76 65 6e 74 45 78 57   "CreateEventExW
7830: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
7840: 43 41 4c 4c 29 43 72 65 61 74 65 45 76 65 6e 74  CALL)CreateEvent
7850: 45 78 57 2c 20 20 20 20 20 20 20 20 20 20 30 20  ExW,          0 
7860: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72  },.#else.  { "Cr
7870: 65 61 74 65 45 76 65 6e 74 45 78 57 22 2c 20 20  eateEventExW",  
7880: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7890: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
78a0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
78b0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
78c0: 73 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 20  sCreateEventExW 
78d0: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
78e0: 29 28 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54  )(LPSECURITY_ATT
78f0: 52 49 42 55 54 45 53 2c 4c 50 43 57 53 54 52 2c  RIBUTES,LPCWSTR,
7900: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
7910: 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  ,DWORD))aSyscall
7920: 5b 36 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [62].pCurrent)..
7930: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
7940: 49 4e 52 54 0a 20 20 7b 20 22 57 61 69 74 46 6f  INRT.  { "WaitFo
7950: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 22 2c 20  rSingleObject", 
7960: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 61 69      (SYSCALL)Wai
7970: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
7980: 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65  ,     0 },.#else
7990: 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e  .  { "WaitForSin
79a0: 67 6c 65 4f 62 6a 65 63 74 22 2c 20 20 20 20 20  gleObject",     
79b0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
79c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79d0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
79e0: 64 65 66 69 6e 65 20 6f 73 57 61 69 74 46 6f 72  define osWaitFor
79f0: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 20 28 28 44  SingleObject ((D
7a00: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41  WORD(WINAPI*)(HA
7a10: 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20  NDLE, \.        
7a20: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
7a30: 36 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  63].pCurrent)..#
7a40: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
7a50: 4e 43 45 0a 20 20 7b 20 22 57 61 69 74 46 6f 72  NCE.  { "WaitFor
7a60: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c  SingleObjectEx",
7a70: 20 20 20 28 53 59 53 43 41 4c 4c 29 57 61 69 74     (SYSCALL)Wait
7a80: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45  ForSingleObjectE
7a90: 78 2c 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  x,   0 },.#else.
7aa0: 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67    { "WaitForSing
7ab0: 6c 65 4f 62 6a 65 63 74 45 78 22 2c 20 20 20 28  leObjectEx",   (
7ac0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ae0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
7af0: 65 66 69 6e 65 20 6f 73 57 61 69 74 46 6f 72 53  efine osWaitForS
7b00: 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 20 28 28  ingleObjectEx ((
7b10: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48  DWORD(WINAPI*)(H
7b20: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20  ANDLE,DWORD, \. 
7b30: 20 20 20 20 20 20 20 42 4f 4f 4c 29 29 61 53 79         BOOL))aSy
7b40: 73 63 61 6c 6c 5b 36 34 5d 2e 70 43 75 72 72 65  scall[64].pCurre
7b50: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
7b60: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 65  OS_WINRT.  { "Se
7b70: 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c  tFilePointerEx",
7b80: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7b90: 29 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45  )SetFilePointerE
7ba0: 78 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  x,        0 },.#
7bb0: 65 6c 73 65 0a 20 20 7b 20 22 53 65 74 46 69 6c  else.  { "SetFil
7bc0: 65 50 6f 69 6e 74 65 72 45 78 22 2c 20 20 20 20  ePointerEx",    
7bd0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bf0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7c00: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65 74  f..#define osSet
7c10: 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 20 28 28  FilePointerEx ((
7c20: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
7c30: 4e 44 4c 45 2c 4c 41 52 47 45 5f 49 4e 54 45 47  NDLE,LARGE_INTEG
7c40: 45 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 50 4c  ER, \.        PL
7c50: 41 52 47 45 5f 49 4e 54 45 47 45 52 2c 44 57 4f  ARGE_INTEGER,DWO
7c60: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 35 5d  RD))aSyscall[65]
7c70: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
7c80: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
7c90: 20 20 7b 20 22 47 65 74 46 69 6c 65 49 6e 66 6f    { "GetFileInfo
7ca0: 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45  rmationByHandleE
7cb0: 78 22 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74  x", (SYSCALL)Get
7cc0: 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42  FileInformationB
7cd0: 79 48 61 6e 64 6c 65 45 78 2c 20 30 20 7d 2c 0a  yHandleEx, 0 },.
7ce0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69  #else.  { "GetFi
7cf0: 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48  leInformationByH
7d00: 61 6e 64 6c 65 45 78 22 2c 20 28 53 59 53 43 41  andleEx", (SYSCA
7d10: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
7d20: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
7d30: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
7d40: 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e  tFileInformation
7d50: 42 79 48 61 6e 64 6c 65 45 78 20 28 28 42 4f 4f  ByHandleEx ((BOO
7d60: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
7d70: 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 46 49 4c  E, \.        FIL
7d80: 45 5f 49 4e 46 4f 5f 42 59 5f 48 41 4e 44 4c 45  E_INFO_BY_HANDLE
7d90: 5f 43 4c 41 53 53 2c 4c 50 56 4f 49 44 2c 44 57  _CLASS,LPVOID,DW
7da0: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 36  ORD))aSyscall[66
7db0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
7dc0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
7dd0: 20 26 26 20 28 21 64 65 66 69 6e 65 64 28 53 51   && (!defined(SQ
7de0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c  LITE_OMIT_WAL) |
7df0: 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  | SQLITE_MAX_MMA
7e00: 50 5f 53 49 5a 45 3e 30 29 0a 20 20 7b 20 22 4d  P_SIZE>0).  { "M
7e10: 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d  apViewOfFileFrom
7e20: 41 70 70 22 2c 20 20 20 20 28 53 59 53 43 41 4c  App",    (SYSCAL
7e30: 4c 29 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46  L)MapViewOfFileF
7e40: 72 6f 6d 41 70 70 2c 20 20 20 20 30 20 7d 2c 0a  romApp,    0 },.
7e50: 23 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70 56 69  #else.  { "MapVi
7e60: 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 22  ewOfFileFromApp"
7e70: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c  ,    (SYSCALL)0,
7e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e90: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
7ea0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61  if..#define osMa
7eb0: 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41  pViewOfFileFromA
7ec0: 70 70 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41  pp ((LPVOID(WINA
7ed0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 55 4c 4f 4e  PI*)(HANDLE,ULON
7ee0: 47 2c 55 4c 4f 4e 47 36 34 2c 20 5c 0a 20 20 20  G,ULONG64, \.   
7ef0: 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79       SIZE_T))aSy
7f00: 73 63 61 6c 6c 5b 36 37 5d 2e 70 43 75 72 72 65  scall[67].pCurre
7f10: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
7f20: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43 72  OS_WINRT.  { "Cr
7f30: 65 61 74 65 46 69 6c 65 32 22 2c 20 20 20 20 20  eateFile2",     
7f40: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7f50: 29 43 72 65 61 74 65 46 69 6c 65 32 2c 20 20 20  )CreateFile2,   
7f60: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7f70: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
7f80: 46 69 6c 65 32 22 2c 20 20 20 20 20 20 20 20 20  File2",         
7f90: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fb0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7fc0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
7fd0: 61 74 65 46 69 6c 65 32 20 28 28 48 41 4e 44 4c  ateFile2 ((HANDL
7fe0: 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53  E(WINAPI*)(LPCWS
7ff0: 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44  TR,DWORD,DWORD,D
8000: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
8010: 4c 50 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58  LPCREATEFILE2_EX
8020: 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52  TENDED_PARAMETER
8030: 53 29 29 61 53 79 73 63 61 6c 6c 5b 36 38 5d 2e  S))aSyscall[68].
8040: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
8050: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
8060: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
8070: 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
8080: 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64  NSION).  { "Load
8090: 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 22  PackagedLibrary"
80a0: 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c  ,     (SYSCALL)L
80b0: 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61  oadPackagedLibra
80c0: 72 79 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ry,     0 },.#el
80d0: 73 65 0a 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b  se.  { "LoadPack
80e0: 61 67 65 64 4c 69 62 72 61 72 79 22 2c 20 20 20  agedLibrary",   
80f0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
8100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8110: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
8120: 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 50  .#define osLoadP
8130: 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 20 28  ackagedLibrary (
8140: 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a  (HMODULE(WINAPI*
8150: 29 28 4c 50 43 57 53 54 52 2c 20 5c 0a 20 20 20  )(LPCWSTR, \.   
8160: 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73       DWORD))aSys
8170: 63 61 6c 6c 5b 36 39 5d 2e 70 43 75 72 72 65 6e  call[69].pCurren
8180: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
8190: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74  S_WINRT.  { "Get
81a0: 54 69 63 6b 43 6f 75 6e 74 36 34 22 2c 20 20 20  TickCount64",   
81b0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
81c0: 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 2c 20  GetTickCount64, 
81d0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
81e0: 6c 73 65 0a 20 20 7b 20 22 47 65 74 54 69 63 6b  lse.  { "GetTick
81f0: 43 6f 75 6e 74 36 34 22 2c 20 20 20 20 20 20 20  Count64",       
8200: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
8210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8220: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
8230: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54  ..#define osGetT
8240: 69 63 6b 43 6f 75 6e 74 36 34 20 28 28 55 4c 4f  ickCount64 ((ULO
8250: 4e 47 4c 4f 4e 47 28 57 49 4e 41 50 49 2a 29 28  NGLONG(WINAPI*)(
8260: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 37  VOID))aSyscall[7
8270: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
8280: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
8290: 54 0a 20 20 7b 20 22 47 65 74 4e 61 74 69 76 65  T.  { "GetNative
82a0: 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20  SystemInfo",    
82b0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 4e 61 74   (SYSCALL)GetNat
82c0: 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20  iveSystemInfo,  
82d0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
82e0: 7b 20 22 47 65 74 4e 61 74 69 76 65 53 79 73 74  { "GetNativeSyst
82f0: 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 28 53 59  emInfo",     (SY
8300: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
8320: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
8330: 69 6e 65 20 6f 73 47 65 74 4e 61 74 69 76 65 53  ine osGetNativeS
8340: 79 73 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44  ystemInfo ((VOID
8350: 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20  (WINAPI*)( \.   
8360: 20 20 20 20 20 4c 50 53 59 53 54 45 4d 5f 49 4e       LPSYSTEM_IN
8370: 46 4f 29 29 61 53 79 73 63 61 6c 6c 5b 37 31 5d  FO))aSyscall[71]
8380: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
8390: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
83a0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
83b0: 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67 53   { "OutputDebugS
83c0: 74 72 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53  tringA",      (S
83d0: 59 53 43 41 4c 4c 29 4f 75 74 70 75 74 44 65 62  YSCALL)OutputDeb
83e0: 75 67 53 74 72 69 6e 67 41 2c 20 20 20 20 20 20  ugStringA,      
83f0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
8400: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
8410: 67 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  gA",      (SYSCA
8420: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
8430: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
8440: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
8450: 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74   osOutputDebugSt
8460: 72 69 6e 67 41 20 28 28 56 4f 49 44 28 57 49 4e  ringA ((VOID(WIN
8470: 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53  API*)(LPCSTR))aS
8480: 79 73 63 61 6c 6c 5b 37 32 5d 2e 70 43 75 72 72  yscall[72].pCurr
8490: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
84a0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
84b0: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 4f 75  AS_WIDE).  { "Ou
84c0: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57  tputDebugStringW
84d0: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
84e0: 29 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  )OutputDebugStri
84f0: 6e 67 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23  ngW,      0 },.#
8500: 65 6c 73 65 0a 20 20 7b 20 22 4f 75 74 70 75 74  else.  { "Output
8510: 44 65 62 75 67 53 74 72 69 6e 67 57 22 2c 20 20  DebugStringW",  
8520: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
8530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8540: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
8550: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4f 75 74  f..#define osOut
8560: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 20  putDebugStringW 
8570: 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  ((VOID(WINAPI*)(
8580: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
8590: 6c 5b 37 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[73].pCurrent).
85a0: 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 65 73 73  .  { "GetProcess
85b0: 48 65 61 70 22 2c 20 20 20 20 20 20 20 20 20 20  Heap",          
85c0: 28 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63  (SYSCALL)GetProc
85d0: 65 73 73 48 65 61 70 2c 20 20 20 20 20 20 20 20  essHeap,        
85e0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
85f0: 6f 73 47 65 74 50 72 6f 63 65 73 73 48 65 61 70  osGetProcessHeap
8600: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
8610: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c  *)(VOID))aSyscal
8620: 6c 5b 37 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[74].pCurrent).
8630: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
8640: 49 4e 52 54 20 26 26 20 28 21 64 65 66 69 6e 65  INRT && (!define
8650: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
8660: 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  L) || SQLITE_MAX
8670: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 29 0a 20 20  _MMAP_SIZE>0).  
8680: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70  { "CreateFileMap
8690: 70 69 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28 53  pingFromApp", (S
86a0: 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c  YSCALL)CreateFil
86b0: 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 2c  eMappingFromApp,
86c0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
86d0: 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  "CreateFileMappi
86e0: 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28 53 59 53  ngFromApp", (SYS
86f0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
8700: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
8710: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
8720: 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  e osCreateFileMa
8730: 70 70 69 6e 67 46 72 6f 6d 41 70 70 20 28 28 48  ppingFromApp ((H
8740: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48  ANDLE(WINAPI*)(H
8750: 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20  ANDLE, \.       
8760: 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52   LPSECURITY_ATTR
8770: 49 42 55 54 45 53 2c 55 4c 4f 4e 47 2c 55 4c 4f  IBUTES,ULONG,ULO
8780: 4e 47 36 34 2c 4c 50 43 57 53 54 52 29 29 61 53  NG64,LPCWSTR))aS
8790: 79 73 63 61 6c 6c 5b 37 35 5d 2e 70 43 75 72 72  yscall[75].pCurr
87a0: 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 4e 4f 54 45  ent)../*.** NOTE
87b0: 3a 20 4f 6e 20 73 6f 6d 65 20 73 75 62 2d 70 6c  : On some sub-pl
87c0: 61 74 66 6f 72 6d 73 2c 20 74 68 65 20 49 6e 74  atforms, the Int
87d0: 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45  erlockedCompareE
87e0: 78 63 68 61 6e 67 65 20 22 66 75 6e 63 74 69 6f  xchange "functio
87f0: 6e 22 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 72  n".**       is r
8800: 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6d 61 63  eally just a mac
8810: 72 6f 20 74 68 61 74 20 75 73 65 73 20 61 20 63  ro that uses a c
8820: 6f 6d 70 69 6c 65 72 20 69 6e 74 72 69 6e 73 69  ompiler intrinsi
8830: 63 20 28 65 2e 67 2e 20 78 36 34 29 2e 0a 2a 2a  c (e.g. x64)..**
8840: 20 20 20 20 20 20 20 53 6f 20 64 6f 20 6e 6f 74         So do not
8850: 20 74 72 79 20 74 6f 20 6d 61 6b 65 20 74 68 69   try to make thi
8860: 73 20 69 73 20 69 6e 74 6f 20 61 20 72 65 64 65  s is into a rede
8870: 66 69 6e 61 62 6c 65 20 69 6e 74 65 72 66 61 63  finable interfac
8880: 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  e..*/.#if define
8890: 64 28 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d  d(InterlockedCom
88a0: 70 61 72 65 45 78 63 68 61 6e 67 65 29 0a 20 20  pareExchange).  
88b0: 7b 20 22 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f  { "InterlockedCo
88c0: 6d 70 61 72 65 45 78 63 68 61 6e 67 65 22 2c 20  mpareExchange", 
88d0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
88e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
88f0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 49   },..#define osI
8900: 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72  nterlockedCompar
8910: 65 45 78 63 68 61 6e 67 65 20 49 6e 74 65 72 6c  eExchange Interl
8920: 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68  ockedCompareExch
8930: 61 6e 67 65 0a 23 65 6c 73 65 0a 20 20 7b 20 22  ange.#else.  { "
8940: 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61  InterlockedCompa
8950: 72 65 45 78 63 68 61 6e 67 65 22 2c 20 28 53 59  reExchange", (SY
8960: 53 43 41 4c 4c 29 49 6e 74 65 72 6c 6f 63 6b 65  SCALL)Interlocke
8970: 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65  dCompareExchange
8980: 2c 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20  , 0 },..#define 
8990: 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d  osInterlockedCom
89a0: 70 61 72 65 45 78 63 68 61 6e 67 65 20 28 28 4c  pareExchange ((L
89b0: 4f 4e 47 28 57 49 4e 41 50 49 2a 29 28 4c 4f 4e  ONG(WINAPI*)(LON
89c0: 47 20 5c 0a 20 20 20 20 20 20 20 20 53 51 4c 49  G \.        SQLI
89d0: 54 45 5f 57 49 4e 33 32 5f 56 4f 4c 41 54 49 4c  TE_WIN32_VOLATIL
89e0: 45 2a 2c 20 4c 4f 4e 47 2c 4c 4f 4e 47 29 29 61  E*, LONG,LONG))a
89f0: 53 79 73 63 61 6c 6c 5b 37 36 5d 2e 70 43 75 72  Syscall[76].pCur
8a00: 72 65 6e 74 29 0a 23 65 6e 64 69 66 20 2f 2a 20  rent).#endif /* 
8a10: 64 65 66 69 6e 65 64 28 49 6e 74 65 72 6c 6f 63  defined(Interloc
8a20: 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e  kedCompareExchan
8a30: 67 65 29 20 2a 2f 0a 0a 7d 3b 20 2f 2a 20 45 6e  ge) */..}; /* En
8a40: 64 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64  d of the overrid
8a50: 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c  eable system cal
8a60: 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ls */../*.** Thi
8a70: 73 20 69 73 20 74 68 65 20 78 53 65 74 53 79 73  s is the xSetSys
8a80: 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64  temCall() method
8a90: 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20   of sqlite3_vfs 
8aa0: 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a  for all of the.*
8ab0: 2a 20 22 77 69 6e 33 32 22 20 56 46 53 65 73 2e  * "win32" VFSes.
8ac0: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
8ad0: 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66  OK opon successf
8ae0: 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68  ully updating th
8af0: 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c  e.** system call
8b00: 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c   pointer, or SQL
8b10: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20  ITE_NOTFOUND if 
8b20: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66  there is no conf
8b30: 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74  igurable.** syst
8b40: 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e  em call named zN
8b50: 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame..*/.static i
8b60: 6e 74 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43  nt winSetSystemC
8b70: 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  all(.  sqlite3_v
8b80: 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20  fs *pNotUsed,   
8b90: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20       /* The VFS 
8ba0: 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73  pointer.  Not us
8bb0: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
8bc0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20  ar *zName,      
8bd0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
8be0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20   system call to 
8bf0: 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71  override */.  sq
8c00: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
8c10: 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50  r pNewFunc  /* P
8c20: 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79  ointer to new sy
8c30: 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20  stem call value 
8c40: 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
8c50: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63   int i;.  int rc
8c60: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55   = SQLITE_NOTFOU
8c70: 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  ND;..  UNUSED_PA
8c80: 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64  RAMETER(pNotUsed
8c90: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  );.  if( zName==
8ca0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e  0 ){.    /* If n
8cb0: 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e  o zName is given
8cc0: 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79  , restore all sy
8cd0: 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68  stem calls to th
8ce0: 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20  eir default.    
8cf0: 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20  ** settings and 
8d00: 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20  return NULL.    
8d10: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
8d20: 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69  TE_OK;.    for(i
8d30: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
8d40: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
8d50: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
8d60: 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53 79 73  {.      if( aSys
8d70: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
8d80: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73   ){.        aSys
8d90: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
8da0: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
8db0: 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d  Default;.      }
8dc0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
8dd0: 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20      /* If zName 
8de0: 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70  is specified, op
8df0: 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68  erate on only th
8e00: 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c  e one system cal
8e10: 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69  l.    ** specifi
8e20: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ed..    */.    f
8e30: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
8e40: 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f  (aSyscall)/sizeo
8e50: 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20  f(aSyscall[0]); 
8e60: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
8e70: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53  strcmp(zName, aS
8e80: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  yscall[i].zName)
8e90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
8ea0: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
8eb0: 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20  Default==0 ){.  
8ec0: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
8ed0: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61  [i].pDefault = a
8ee0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
8ef0: 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ent;.        }. 
8f00: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
8f10: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69  TE_OK;.        i
8f20: 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29  f( pNewFunc==0 )
8f30: 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73   pNewFunc = aSys
8f40: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
8f50: 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61  ;.        aSysca
8f60: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d  ll[i].pCurrent =
8f70: 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20   pNewFunc;.     
8f80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8f90: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
8fa0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
8fb0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
8fc0: 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63  ue of a system c
8fd0: 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  all.  Return NUL
8fe0: 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f  L if zName is no
8ff0: 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65  t a.** recognize
9000: 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61  d system call na
9010: 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73  me.  NULL is als
9020: 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  o returned if th
9030: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a  e system call.**
9040: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e   is currently un
9050: 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
9060: 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  ic sqlite3_sysca
9070: 6c 6c 5f 70 74 72 20 77 69 6e 47 65 74 53 79 73  ll_ptr winGetSys
9080: 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74  temCall(.  sqlit
9090: 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64  e3_vfs *pNotUsed
90a0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
90b0: 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67  zName.){.  unsig
90c0: 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e  ned int i;..  UN
90d0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
90e0: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28  NotUsed);.  for(
90f0: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
9100: 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61  yscall)/sizeof(a
9110: 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b  Syscall[0]); i++
9120: 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
9130: 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c  p(zName, aSyscal
9140: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[i].zName)==0 )
9150: 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c   return aSyscall
9160: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20  [i].pCurrent;.  
9170: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
9180: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
9190: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
91a0: 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  rst system call 
91b0: 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66  after zName.  If
91c0: 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20   zName==NULL.** 
91d0: 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20  then return the 
91e0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73  name of the firs
91f0: 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20  t system call.  
9200: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a  Return NULL if z
9210: 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c  Name.** is the l
9220: 61 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  ast system call 
9230: 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e  or if zName is n
9240: 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ot the name of a
9250: 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d   valid.** system
9260: 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   call..*/.static
9270: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 69 6e   const char *win
9280: 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73  NextSystemCall(s
9290: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63  qlite3_vfs *p, c
92a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
92b0: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b  ){.  int i = -1;
92c0: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
92d0: 45 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a  ETER(p);.  if( z
92e0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28  Name ){.    for(
92f0: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
9300: 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b  (aSyscall)-1; i+
9310: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
9320: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
9330: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
9340: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
9350: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20  .  }.  for(i++; 
9360: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73  i<ArraySize(aSys
9370: 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  call); i++){.   
9380: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
9390: 2e 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72  .pCurrent!=0 ) r
93a0: 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69  eturn aSyscall[i
93b0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72  ].zName;.  }.  r
93c0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64  eturn 0;.}..#ifd
93d0: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
93e0: 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 49 66 20  MALLOC./*.** If 
93f0: 61 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68  a Win32 native h
9400: 65 61 70 20 68 61 73 20 62 65 65 6e 20 63 6f 6e  eap has been con
9410: 66 69 67 75 72 65 64 2c 20 74 68 69 73 20 66 75  figured, this fu
9420: 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 61 74 74 65  nction will atte
9430: 6d 70 74 20 74 6f 0a 2a 2a 20 63 6f 6d 70 61 63  mpt to.** compac
9440: 74 20 69 74 2e 20 20 55 70 6f 6e 20 73 75 63 63  t it.  Upon succ
9450: 65 73 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 77  ess, SQLITE_OK w
9460: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e  ill be returned.
9470: 20 20 55 70 6f 6e 20 66 61 69 6c 75 72 65 2c 20    Upon failure, 
9480: 6f 6e 65 0a 2a 2a 20 6f 66 20 53 51 4c 49 54 45  one.** of SQLITE
9490: 5f 4e 4f 4d 45 4d 2c 20 53 51 4c 49 54 45 5f 45  _NOMEM, SQLITE_E
94a0: 52 52 4f 52 2c 20 6f 72 20 53 51 4c 49 54 45 5f  RROR, or SQLITE_
94b0: 4e 4f 54 46 4f 55 4e 44 20 77 69 6c 6c 20 62 65  NOTFOUND will be
94c0: 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68 65 0a   returned.  The.
94d0: 2a 2a 20 22 70 6e 4c 61 72 67 65 73 74 22 20 61  ** "pnLargest" a
94e0: 72 67 75 6d 65 6e 74 2c 20 69 66 20 6e 6f 6e 2d  rgument, if non-
94f0: 7a 65 72 6f 2c 20 77 69 6c 6c 20 62 65 20 75 73  zero, will be us
9500: 65 64 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65  ed to return the
9510: 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
9520: 6c 61 72 67 65 73 74 20 63 6f 6d 6d 69 74 74 65  largest committe
9530: 64 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 6e 20  d free block in 
9540: 74 68 65 20 68 65 61 70 2c 20 69 6e 20 62 79 74  the heap, in byt
9550: 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
9560: 65 33 5f 77 69 6e 33 32 5f 63 6f 6d 70 61 63 74  e3_win32_compact
9570: 5f 68 65 61 70 28 4c 50 55 49 4e 54 20 70 6e 4c  _heap(LPUINT pnL
9580: 61 72 67 65 73 74 29 7b 0a 20 20 69 6e 74 20 72  argest){.  int r
9590: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
95a0: 20 55 49 4e 54 20 6e 4c 61 72 67 65 73 74 20 3d   UINT nLargest =
95b0: 20 30 3b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65   0;.  HANDLE hHe
95c0: 61 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73  ap;..  winMemAss
95d0: 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48  ertMagic();.  hH
95e0: 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48  eap = winMemGetH
95f0: 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28  eap();.  assert(
9600: 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61   hHeap!=0 );.  a
9610: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e  ssert( hHeap!=IN
9620: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
9630: 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54  UE );.#if !SQLIT
9640: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
9650: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
9660: 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41  32_MALLOC_VALIDA
9670: 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73  TE).  assert( os
9680: 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65  HeapValidate(hHe
9690: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
96a0: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c  _HEAP_FLAGS, NUL
96b0: 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  L) );.#endif.#if
96c0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
96d0: 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
96e0: 57 49 4e 52 54 0a 20 20 69 66 28 20 28 6e 4c 61  WINRT.  if( (nLa
96f0: 72 67 65 73 74 3d 6f 73 48 65 61 70 43 6f 6d 70  rgest=osHeapComp
9700: 61 63 74 28 68 48 65 61 70 2c 20 53 51 4c 49 54  act(hHeap, SQLIT
9710: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
9720: 47 53 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 44  GS))==0 ){.    D
9730: 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d  WORD lastErrno =
9740: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
9750: 29 3b 0a 20 20 20 20 69 66 28 20 6c 61 73 74 45  );.    if( lastE
9760: 72 72 6e 6f 3d 3d 4e 4f 5f 45 52 52 4f 52 20 29  rrno==NO_ERROR )
9770: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
9780: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  log(SQLITE_NOMEM
9790: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61  , "failed to Hea
97a0: 70 43 6f 6d 70 61 63 74 20 28 6e 6f 20 73 70 61  pCompact (no spa
97b0: 63 65 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20  ce), heap=%p",. 
97c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97d0: 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a   (void*)hHeap);.
97e0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
97f0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
9800: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
9810: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 45 52 52  3_log(SQLITE_ERR
9820: 4f 52 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48  OR, "failed to H
9830: 65 61 70 43 6f 6d 70 61 63 74 20 28 25 6c 75 29  eapCompact (%lu)
9840: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20  , heap=%p",.    
9850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
9860: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
9870: 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20  (void*)hHeap);. 
9880: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
9890: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
98a0: 7d 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65  }.#else.  sqlite
98b0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54  3_log(SQLITE_NOT
98c0: 46 4f 55 4e 44 2c 20 22 66 61 69 6c 65 64 20 74  FOUND, "failed t
98d0: 6f 20 48 65 61 70 43 6f 6d 70 61 63 74 2c 20 68  o HeapCompact, h
98e0: 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20  eap=%p",.       
98f0: 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68 48         (void*)hH
9900: 65 61 70 29 3b 0a 20 20 72 63 20 3d 20 53 51 4c  eap);.  rc = SQL
9910: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 23 65  ITE_NOTFOUND;.#e
9920: 6e 64 69 66 0a 20 20 69 66 28 20 70 6e 4c 61 72  ndif.  if( pnLar
9930: 67 65 73 74 20 29 20 2a 70 6e 4c 61 72 67 65 73  gest ) *pnLarges
9940: 74 20 3d 20 6e 4c 61 72 67 65 73 74 3b 0a 20 20  t = nLargest;.  
9950: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
9960: 0a 2a 2a 20 49 66 20 61 20 57 69 6e 33 32 20 6e  .** If a Win32 n
9970: 61 74 69 76 65 20 68 65 61 70 20 68 61 73 20 62  ative heap has b
9980: 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20  een configured, 
9990: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
99a0: 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a  ll attempt to.**
99b0: 20 64 65 73 74 72 6f 79 20 61 6e 64 20 72 65 63   destroy and rec
99c0: 72 65 61 74 65 20 69 74 2e 20 20 49 66 20 74 68  reate it.  If th
99d0: 65 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68  e Win32 native h
99e0: 65 61 70 20 69 73 20 6e 6f 74 20 69 73 6f 6c 61  eap is not isola
99f0: 74 65 64 20 61 6e 64 2f 6f 72 0a 2a 2a 20 74 68  ted and/or.** th
9a00: 65 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79  e sqlite3_memory
9a10: 5f 75 73 65 64 28 29 20 66 75 6e 63 74 69 6f 6e  _used() function
9a20: 20 64 6f 65 73 20 6e 6f 74 20 72 65 74 75 72 6e   does not return
9a30: 20 7a 65 72 6f 2c 20 53 51 4c 49 54 45 5f 42 55   zero, SQLITE_BU
9a40: 53 59 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 72 65  SY will.** be re
9a50: 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 63 68  turned and no ch
9a60: 61 6e 67 65 73 20 77 69 6c 6c 20 62 65 20 6d 61  anges will be ma
9a70: 64 65 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20  de to the Win32 
9a80: 6e 61 74 69 76 65 20 68 65 61 70 2e 0a 2a 2f 0a  native heap..*/.
9a90: 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  int sqlite3_win3
9aa0: 32 5f 72 65 73 65 74 5f 68 65 61 70 28 29 7b 0a  2_reset_heap(){.
9ab0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 55 54 45    int rc;.  MUTE
9ac0: 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
9ad0: 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b  _mutex *pMaster;
9ae0: 20 29 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 73   ) /* The main s
9af0: 74 61 74 69 63 20 6d 75 74 65 78 20 2a 2f 0a 20  tatic mutex */. 
9b00: 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
9b10: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 65  lite3_mutex *pMe
9b20: 6d 3b 20 29 20 20 20 20 2f 2a 20 54 68 65 20 6d  m; )    /* The m
9b30: 65 6d 73 79 73 20 73 74 61 74 69 63 20 6d 75 74  emsys static mut
9b40: 65 78 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f  ex */.  MUTEX_LO
9b50: 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73  GIC( pMaster = s
9b60: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
9b70: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
9b80: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20  STATIC_MASTER); 
9b90: 29 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  ).  MUTEX_LOGIC(
9ba0: 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 5f   pMem = sqlite3_
9bb0: 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
9bc0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
9bd0: 4d 45 4d 29 3b 20 29 0a 20 20 73 71 6c 69 74 65  MEM); ).  sqlite
9be0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
9bf0: 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  aster);.  sqlite
9c00: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
9c10: 65 6d 29 3b 0a 20 20 77 69 6e 4d 65 6d 41 73 73  em);.  winMemAss
9c20: 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 69 66  ertMagic();.  if
9c30: 28 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  ( winMemGetHeap(
9c40: 29 21 3d 4e 55 4c 4c 20 26 26 20 77 69 6e 4d 65  )!=NULL && winMe
9c50: 6d 47 65 74 4f 77 6e 65 64 28 29 20 26 26 20 73  mGetOwned() && s
9c60: 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73  qlite3_memory_us
9c70: 65 64 28 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  ed()==0 ){.    /
9c80: 2a 0a 20 20 20 20 2a 2a 20 41 74 20 74 68 69 73  *.    ** At this
9c90: 20 70 6f 69 6e 74 2c 20 74 68 65 72 65 20 73 68   point, there sh
9ca0: 6f 75 6c 64 20 62 65 20 6e 6f 20 6f 75 74 73 74  ould be no outst
9cb0: 61 6e 64 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c  anding memory al
9cc0: 6c 6f 63 61 74 69 6f 6e 73 20 6f 6e 0a 20 20 20  locations on.   
9cd0: 20 2a 2a 20 74 68 65 20 68 65 61 70 2e 20 20 41   ** the heap.  A
9ce0: 6c 73 6f 2c 20 73 69 6e 63 65 20 62 6f 74 68 20  lso, since both 
9cf0: 74 68 65 20 6d 61 73 74 65 72 20 61 6e 64 20 6d  the master and m
9d00: 65 6d 73 79 73 20 6c 6f 63 6b 73 20 61 72 65 20  emsys locks are 
9d10: 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20 2a 2a  currently.    **
9d20: 20 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20 75   being held by u
9d30: 73 2c 20 6e 6f 20 6f 74 68 65 72 20 66 75 6e 63  s, no other func
9d40: 74 69 6f 6e 20 28 69 2e 65 2e 20 66 72 6f 6d 20  tion (i.e. from 
9d50: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 29 20  another thread) 
9d60: 73 68 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65  should.    ** be
9d70: 20 61 62 6c 65 20 74 6f 20 65 76 65 6e 20 61 63   able to even ac
9d80: 63 65 73 73 20 74 68 65 20 68 65 61 70 2e 20 20  cess the heap.  
9d90: 41 74 74 65 6d 70 74 20 74 6f 20 64 65 73 74 72  Attempt to destr
9da0: 6f 79 20 61 6e 64 20 72 65 63 72 65 61 74 65 20  oy and recreate 
9db0: 6f 75 72 0a 20 20 20 20 2a 2a 20 69 73 6f 6c 61  our.    ** isola
9dc0: 74 65 64 20 57 69 6e 33 32 20 6e 61 74 69 76 65  ted Win32 native
9dd0: 20 68 65 61 70 20 6e 6f 77 2e 0a 20 20 20 20 2a   heap now..    *
9de0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 69  /.    assert( wi
9df0: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 21 3d 4e  nMemGetHeap()!=N
9e00: 55 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ULL );.    asser
9e10: 74 28 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65  t( winMemGetOwne
9e20: 64 28 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  d() );.    asser
9e30: 74 28 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72  t( sqlite3_memor
9e40: 79 5f 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20  y_used()==0 );. 
9e50: 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77     winMemShutdow
9e60: 6e 28 77 69 6e 4d 65 6d 47 65 74 44 61 74 61 50  n(winMemGetDataP
9e70: 74 72 28 29 29 3b 0a 20 20 20 20 61 73 73 65 72  tr());.    asser
9e80: 74 28 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70  t( winMemGetHeap
9e90: 28 29 3d 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  ()==NULL );.    
9ea0: 61 73 73 65 72 74 28 20 21 77 69 6e 4d 65 6d 47  assert( !winMemG
9eb0: 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20 20  etOwned() );.   
9ec0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9ed0: 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d  _memory_used()==
9ee0: 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 69  0 );.    rc = wi
9ef0: 6e 4d 65 6d 49 6e 69 74 28 77 69 6e 4d 65 6d 47  nMemInit(winMemG
9f00: 65 74 44 61 74 61 50 74 72 28 29 29 3b 0a 20 20  etDataPtr());.  
9f10: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
9f20: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 77 69 6e 4d 65  LITE_OK || winMe
9f30: 6d 47 65 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c  mGetHeap()!=NULL
9f40: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9f50: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
9f60: 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28   winMemGetOwned(
9f70: 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
9f80: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
9f90: 7c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79  | sqlite3_memory
9fa0: 5f 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20 20  _used()==0 );.  
9fb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 0a 20 20  }else{.    /*.  
9fc0: 20 20 2a 2a 20 54 68 65 20 57 69 6e 33 32 20 6e    ** The Win32 n
9fd0: 61 74 69 76 65 20 68 65 61 70 20 63 61 6e 6e 6f  ative heap canno
9fe0: 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20 62 65  t be modified be
9ff0: 63 61 75 73 65 20 69 74 20 6d 61 79 20 62 65 20  cause it may be 
a000: 69 6e 20 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  in use..    */. 
a010: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
a020: 55 53 59 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  USY;.  }.  sqlit
a030: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
a040: 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Mem);.  sqlite3_
a050: 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
a060: 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ter);.  return r
a070: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
a080: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
a090: 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OC */../*.** Thi
a0a0: 73 20 66 75 6e 63 74 69 6f 6e 20 6f 75 74 70 75  s function outpu
a0b0: 74 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ts the specified
a0c0: 20 28 41 4e 53 49 29 20 73 74 72 69 6e 67 20 74   (ANSI) string t
a0d0: 6f 20 74 68 65 20 57 69 6e 33 32 20 64 65 62 75  o the Win32 debu
a0e0: 67 67 65 72 0a 2a 2a 20 28 69 66 20 61 76 61 69  gger.** (if avai
a0f0: 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 0a 76 6f 69 64  lable)..*/..void
a100: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77   sqlite3_win32_w
a110: 72 69 74 65 5f 64 65 62 75 67 28 63 6f 6e 73 74  rite_debug(const
a120: 20 63 68 61 72 20 2a 7a 42 75 66 2c 20 69 6e 74   char *zBuf, int
a130: 20 6e 42 75 66 29 7b 0a 20 20 63 68 61 72 20 7a   nBuf){.  char z
a140: 44 62 67 42 75 66 5b 53 51 4c 49 54 45 5f 57 49  DbgBuf[SQLITE_WI
a150: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
a160: 5d 3b 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20  ];.  int nMin = 
a170: 4d 49 4e 28 6e 42 75 66 2c 20 28 53 51 4c 49 54  MIN(nBuf, (SQLIT
a180: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
a190: 53 49 5a 45 20 2d 20 31 29 29 3b 20 2f 2a 20 6d  SIZE - 1)); /* m
a1a0: 61 79 20 62 65 20 6e 65 67 61 74 69 76 65 2e 20  ay be negative. 
a1b0: 2a 2f 0a 20 20 69 66 28 20 6e 4d 69 6e 3c 2d 31  */.  if( nMin<-1
a1c0: 20 29 20 6e 4d 69 6e 20 3d 20 2d 31 3b 20 2f 2a   ) nMin = -1; /*
a1d0: 20 61 6c 6c 20 6e 65 67 61 74 69 76 65 20 76 61   all negative va
a1e0: 6c 75 65 73 20 62 65 63 6f 6d 65 20 2d 31 2e 20  lues become -1. 
a1f0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 69  */.  assert( nMi
a200: 6e 3d 3d 2d 31 20 7c 7c 20 6e 4d 69 6e 3d 3d 30  n==-1 || nMin==0
a210: 20 7c 7c 20 6e 4d 69 6e 3c 53 51 4c 49 54 45 5f   || nMin<SQLITE_
a220: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
a230: 5a 45 20 29 3b 0a 23 69 66 20 64 65 66 69 6e 65  ZE );.#if define
a240: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
a250: 41 53 5f 41 4e 53 49 29 0a 20 20 69 66 28 20 6e  AS_ANSI).  if( n
a260: 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d  Min>0 ){.    mem
a270: 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20  set(zDbgBuf, 0, 
a280: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47  SQLITE_WIN32_DBG
a290: 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20  _BUF_SIZE);.    
a2a0: 6d 65 6d 63 70 79 28 7a 44 62 67 42 75 66 2c 20  memcpy(zDbgBuf, 
a2b0: 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20  zBuf, nMin);.   
a2c0: 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74   osOutputDebugSt
a2d0: 72 69 6e 67 41 28 7a 44 62 67 42 75 66 29 3b 0a  ringA(zDbgBuf);.
a2e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 73 4f    }else{.    osO
a2f0: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
a300: 41 28 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6c  A(zBuf);.  }.#el
a310: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
a320: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
a330: 29 0a 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42  ).  memset(zDbgB
a340: 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49  uf, 0, SQLITE_WI
a350: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
a360: 29 3b 0a 20 20 69 66 20 28 20 6f 73 4d 75 6c 74  );.  if ( osMult
a370: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
a380: 0a 20 20 20 20 20 20 20 20 20 20 6f 73 41 72 65  .          osAre
a390: 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f  FileApisANSI() ?
a3a0: 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d   CP_ACP : CP_OEM
a3b0: 43 50 2c 20 30 2c 20 7a 42 75 66 2c 0a 20 20 20  CP, 0, zBuf,.   
a3c0: 20 20 20 20 20 20 20 6e 4d 69 6e 2c 20 28 4c 50         nMin, (LP
a3d0: 57 53 54 52 29 7a 44 62 67 42 75 66 2c 20 53 51  WSTR)zDbgBuf, SQ
a3e0: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
a3f0: 55 46 5f 53 49 5a 45 2f 73 69 7a 65 6f 66 28 57  UF_SIZE/sizeof(W
a400: 43 48 41 52 29 29 3c 3d 30 20 29 7b 0a 20 20 20  CHAR))<=0 ){.   
a410: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f   return;.  }.  o
a420: 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  sOutputDebugStri
a430: 6e 67 57 28 28 4c 50 43 57 53 54 52 29 7a 44 62  ngW((LPCWSTR)zDb
a440: 67 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69  gBuf);.#else.  i
a450: 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20 20  f( nMin>0 ){.   
a460: 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c   memset(zDbgBuf,
a470: 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   0, SQLITE_WIN32
a480: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a  _DBG_BUF_SIZE);.
a490: 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 67 42      memcpy(zDbgB
a4a0: 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b  uf, zBuf, nMin);
a4b0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
a4c0: 65 72 72 2c 20 22 25 73 22 2c 20 7a 44 62 67 42  err, "%s", zDbgB
a4d0: 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  uf);.  }else{.  
a4e0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
a4f0: 2c 20 22 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20  , "%s", zBuf);. 
a500: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
a510: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
a520: 20 72 6f 75 74 69 6e 65 20 73 75 73 70 65 6e 64   routine suspend
a530: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  s the current th
a540: 72 65 61 64 20 66 6f 72 20 61 74 20 6c 65 61 73  read for at leas
a550: 74 20 6d 73 0a 2a 2a 20 6d 69 6c 6c 69 73 65 63  t ms.** millisec
a560: 6f 6e 64 73 2e 20 20 54 68 69 73 20 69 73 20 65  onds.  This is e
a570: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65  quivalent to the
a580: 20 57 69 6e 33 32 20 53 6c 65 65 70 28 29 20 69   Win32 Sleep() i
a590: 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66  nterface..*/.#if
a5a0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
a5b0: 0a 73 74 61 74 69 63 20 48 41 4e 44 4c 45 20 73  .static HANDLE s
a5c0: 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a  leepObj = NULL;.
a5d0: 23 65 6e 64 69 66 0a 0a 76 6f 69 64 20 73 71 6c  #endif..void sql
a5e0: 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70  ite3_win32_sleep
a5f0: 28 44 57 4f 52 44 20 6d 69 6c 6c 69 73 65 63 6f  (DWORD milliseco
a600: 6e 64 73 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  nds){.#if SQLITE
a610: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 20 28  _OS_WINRT.  if (
a620: 20 73 6c 65 65 70 4f 62 6a 3d 3d 4e 55 4c 4c 20   sleepObj==NULL 
a630: 29 7b 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a 20  ){.    sleepObj 
a640: 3d 20 6f 73 43 72 65 61 74 65 45 76 65 6e 74 45  = osCreateEventE
a650: 78 57 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 43  xW(NULL, NULL, C
a660: 52 45 41 54 45 5f 45 56 45 4e 54 5f 4d 41 4e 55  REATE_EVENT_MANU
a670: 41 4c 5f 52 45 53 45 54 2c 0a 20 20 20 20 20 20  AL_RESET,.      
a680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a690: 20 20 20 20 20 20 20 20 20 20 53 59 4e 43 48 52            SYNCHR
a6a0: 4f 4e 49 5a 45 29 3b 0a 20 20 7d 0a 20 20 61 73  ONIZE);.  }.  as
a6b0: 73 65 72 74 28 20 73 6c 65 65 70 4f 62 6a 21 3d  sert( sleepObj!=
a6c0: 4e 55 4c 4c 20 29 3b 0a 20 20 6f 73 57 61 69 74  NULL );.  osWait
a6d0: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45  ForSingleObjectE
a6e0: 78 28 73 6c 65 65 70 4f 62 6a 2c 20 6d 69 6c 6c  x(sleepObj, mill
a6f0: 69 73 65 63 6f 6e 64 73 2c 20 46 41 4c 53 45 29  iseconds, FALSE)
a700: 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 53 6c 65 65  ;.#else.  osSlee
a710: 70 28 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 3b  p(milliseconds);
a720: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 20 53  .#endif.}..#if S
a730: 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52  QLITE_MAX_WORKER
a740: 5f 54 48 52 45 41 44 53 3e 30 20 26 26 20 21 53  _THREADS>0 && !S
a750: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
a760: 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
a770: 52 54 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20  RT && \.        
a780: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
a790: 45 3e 30 0a 44 57 4f 52 44 20 73 71 6c 69 74 65  E>0.DWORD sqlite
a7a0: 33 57 69 6e 33 32 57 61 69 74 28 48 41 4e 44 4c  3Win32Wait(HANDL
a7b0: 45 20 68 4f 62 6a 65 63 74 29 7b 0a 20 20 44 57  E hObject){.  DW
a7c0: 4f 52 44 20 72 63 3b 0a 20 20 77 68 69 6c 65 28  ORD rc;.  while(
a7d0: 20 28 72 63 20 3d 20 6f 73 57 61 69 74 46 6f 72   (rc = osWaitFor
a7e0: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 28 68  SingleObjectEx(h
a7f0: 4f 62 6a 65 63 74 2c 20 49 4e 46 49 4e 49 54 45  Object, INFINITE
a800: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a820: 20 20 20 20 20 20 20 20 20 54 52 55 45 29 29 3d           TRUE))=
a830: 3d 57 41 49 54 5f 49 4f 5f 43 4f 4d 50 4c 45 54  =WAIT_IO_COMPLET
a840: 49 4f 4e 20 29 7b 7d 0a 20 20 72 65 74 75 72 6e  ION ){}.  return
a850: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
a860: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
a870: 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 77   (non-zero) if w
a880: 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 75 6e  e are running un
a890: 64 65 72 20 57 69 6e 4e 54 2c 20 57 69 6e 32 4b  der WinNT, Win2K
a8a0: 2c 20 57 69 6e 58 50 2c 0a 2a 2a 20 6f 72 20 57  , WinXP,.** or W
a8b0: 69 6e 43 45 2e 20 20 52 65 74 75 72 6e 20 66 61  inCE.  Return fa
a8c0: 6c 73 65 20 28 7a 65 72 6f 29 20 66 6f 72 20 57  lse (zero) for W
a8d0: 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 6f 72 20  in95, Win98, or 
a8e0: 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65 72  WinME..**.** Her
a8f0: 65 20 69 73 20 61 6e 20 69 6e 74 65 72 65 73 74  e is an interest
a900: 69 6e 67 20 6f 62 73 65 72 76 61 74 69 6f 6e 3a  ing observation:
a910: 20 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20    Win95, Win98, 
a920: 61 6e 64 20 57 69 6e 4d 45 20 6c 61 63 6b 0a 2a  and WinME lack.*
a930: 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78  * the LockFileEx
a940: 28 29 20 41 50 49 2e 20 20 42 75 74 20 77 65 20  () API.  But we 
a950: 63 61 6e 20 73 74 69 6c 6c 20 73 74 61 74 69 63  can still static
a960: 61 6c 6c 79 20 6c 69 6e 6b 20 61 67 61 69 6e 73  ally link agains
a970: 74 20 74 68 61 74 0a 2a 2a 20 41 50 49 20 61 73  t that.** API as
a980: 20 6c 6f 6e 67 20 61 73 20 77 65 20 64 6f 6e 27   long as we don'
a990: 74 20 63 61 6c 6c 20 69 74 20 77 68 65 6e 20 72  t call it when r
a9a0: 75 6e 6e 69 6e 67 20 57 69 6e 39 35 2f 39 38 2f  unning Win95/98/
a9b0: 4d 45 2e 20 20 41 20 63 61 6c 6c 20 74 6f 0a 2a  ME.  A call to.*
a9c0: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
a9d0: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
a9e0: 69 6e 65 20 69 66 20 74 68 65 20 68 6f 73 74 20  ine if the host 
a9f0: 69 73 20 57 69 6e 39 35 2f 39 38 2f 4d 45 20 6f  is Win95/98/ME o
aa00: 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58 50  r.** WinNT/2K/XP
aa10: 20 73 6f 20 74 68 61 74 20 77 65 20 77 69 6c 6c   so that we will
aa20: 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72   know whether or
aa30: 20 6e 6f 74 20 77 65 20 63 61 6e 20 73 61 66 65   not we can safe
aa40: 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c  ly call.** the L
aa50: 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e  ockFileEx() API.
aa60: 0a 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  .*/..#if !define
aa70: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47  d(SQLITE_WIN32_G
aa80: 45 54 56 45 52 53 49 4f 4e 45 58 29 20 7c 7c 20  ETVERSIONEX) || 
aa90: 21 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45  !SQLITE_WIN32_GE
aaa0: 54 56 45 52 53 49 4f 4e 45 58 0a 23 20 64 65 66  TVERSIONEX.# def
aab0: 69 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28 31  ine osIsNT()  (1
aac0: 29 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 4f  ).#elif SQLITE_O
aad0: 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54  S_WINCE || SQLIT
aae0: 45 5f 4f 53 5f 57 49 4e 52 54 20 7c 7c 20 21 64  E_OS_WINRT || !d
aaf0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
ab00: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 23 20  N32_HAS_ANSI).# 
ab10: 64 65 66 69 6e 65 20 6f 73 49 73 4e 54 28 29 20  define osIsNT() 
ab20: 20 28 31 29 0a 23 65 6c 69 66 20 21 64 65 66 69   (1).#elif !defi
ab30: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
ab40: 5f 48 41 53 5f 57 49 44 45 29 0a 23 20 64 65 66  _HAS_WIDE).# def
ab50: 69 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28 30  ine osIsNT()  (0
ab60: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
ab70: 20 6f 73 49 73 4e 54 28 29 20 20 28 28 73 71 6c   osIsNT()  ((sql
ab80: 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 32 29  ite3_os_type==2)
ab90: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 77 69 6e 33   || sqlite3_win3
aba0: 32 5f 69 73 5f 6e 74 28 29 29 0a 23 65 6e 64 69  2_is_nt()).#endi
abb0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
abc0: 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65  nction determine
abd0: 73 20 69 66 20 74 68 65 20 6d 61 63 68 69 6e 65  s if the machine
abe0: 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 20 76 65   is running a ve
abf0: 72 73 69 6f 6e 20 6f 66 20 57 69 6e 64 6f 77 73  rsion of Windows
ac00: 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20 74 68 65  .** based on the
ac10: 20 4e 54 20 6b 65 72 6e 65 6c 2e 0a 2a 2f 0a 69   NT kernel..*/.i
ac20: 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  nt sqlite3_win32
ac30: 5f 69 73 5f 6e 74 28 76 6f 69 64 29 7b 0a 23 69  _is_nt(void){.#i
ac40: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
ac50: 54 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45  T.  /*.  ** NOTE
ac60: 3a 20 54 68 65 20 57 69 6e 52 54 20 73 75 62 2d  : The WinRT sub-
ac70: 70 6c 61 74 66 6f 72 6d 20 69 73 20 61 6c 77 61  platform is alwa
ac80: 79 73 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65  ys assumed to be
ac90: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 4e 54   based on the NT
aca0: 0a 20 20 2a 2a 20 20 20 20 20 20 20 6b 65 72 6e  .  **       kern
acb0: 65 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  el..  */.  retur
acc0: 6e 20 31 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  n 1;.#elif defin
acd0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
ace0: 47 45 54 56 45 52 53 49 4f 4e 45 58 29 20 26 26  GETVERSIONEX) &&
acf0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45   SQLITE_WIN32_GE
ad00: 54 56 45 52 53 49 4f 4e 45 58 0a 20 20 69 66 28  TVERSIONEX.  if(
ad10: 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f   osInterlockedCo
ad20: 6d 70 61 72 65 45 78 63 68 61 6e 67 65 28 26 73  mpareExchange(&s
ad30: 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20  qlite3_os_type, 
ad40: 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 23 69 66 20  0, 0)==0 ){.#if 
ad50: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
ad60: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
ad70: 20 20 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f     OSVERSIONINFO
ad80: 41 20 73 49 6e 66 6f 3b 0a 20 20 20 20 73 49 6e  A sInfo;.    sIn
ad90: 66 6f 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e  fo.dwOSVersionIn
ada0: 66 6f 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28  foSize = sizeof(
adb0: 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 47 65  sInfo);.    osGe
adc0: 74 56 65 72 73 69 6f 6e 45 78 41 28 26 73 49 6e  tVersionExA(&sIn
add0: 66 6f 29 3b 0a 20 20 20 20 6f 73 49 6e 74 65 72  fo);.    osInter
ade0: 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63  lockedCompareExc
adf0: 68 61 6e 67 65 28 26 73 71 6c 69 74 65 33 5f 6f  hange(&sqlite3_o
ae00: 73 5f 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20  s_type,.        
ae10: 28 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72  (sInfo.dwPlatfor
ae20: 6d 49 64 20 3d 3d 20 56 45 52 5f 50 4c 41 54 46  mId == VER_PLATF
ae30: 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54 29 20 3f 20  ORM_WIN32_NT) ? 
ae40: 32 20 3a 20 31 2c 20 30 29 3b 0a 23 65 6c 69 66  2 : 1, 0);.#elif
ae50: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
ae60: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
ae70: 20 20 20 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46      OSVERSIONINF
ae80: 4f 57 20 73 49 6e 66 6f 3b 0a 20 20 20 20 73 49  OW sInfo;.    sI
ae90: 6e 66 6f 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49  nfo.dwOSVersionI
aea0: 6e 66 6f 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66  nfoSize = sizeof
aeb0: 28 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 47  (sInfo);.    osG
aec0: 65 74 56 65 72 73 69 6f 6e 45 78 57 28 26 73 49  etVersionExW(&sI
aed0: 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 49 6e 74 65  nfo);.    osInte
aee0: 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78  rlockedCompareEx
aef0: 63 68 61 6e 67 65 28 26 73 71 6c 69 74 65 33 5f  change(&sqlite3_
af00: 6f 73 5f 74 79 70 65 2c 0a 20 20 20 20 20 20 20  os_type,.       
af10: 20 28 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f   (sInfo.dwPlatfo
af20: 72 6d 49 64 20 3d 3d 20 56 45 52 5f 50 4c 41 54  rmId == VER_PLAT
af30: 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54 29 20 3f  FORM_WIN32_NT) ?
af40: 20 32 20 3a 20 31 2c 20 30 29 3b 0a 23 65 6e 64   2 : 1, 0);.#end
af50: 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  if.  }.  return 
af60: 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d  osInterlockedCom
af70: 70 61 72 65 45 78 63 68 61 6e 67 65 28 26 73 71  pareExchange(&sq
af80: 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20 32  lite3_os_type, 2
af90: 2c 20 32 29 3d 3d 32 3b 0a 23 65 6c 69 66 20 53  , 2)==2;.#elif S
afa0: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 72 65 74  QLITE_TEST.  ret
afb0: 75 72 6e 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65  urn osInterlocke
afc0: 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65  dCompareExchange
afd0: 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  (&sqlite3_os_typ
afe0: 65 2c 20 32 2c 20 32 29 3d 3d 32 3b 0a 23 65 6c  e, 2, 2)==2;.#el
aff0: 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54  se.  /*.  ** NOT
b000: 45 3a 20 41 6c 6c 20 73 75 62 2d 70 6c 61 74 66  E: All sub-platf
b010: 6f 72 6d 73 20 77 68 65 72 65 20 74 68 65 20 47  orms where the G
b020: 65 74 56 65 72 73 69 6f 6e 45 78 5b 41 57 5d 20  etVersionEx[AW] 
b030: 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 0a 20 20  functions are.  
b040: 2a 2a 20 20 20 20 20 20 20 64 65 70 72 65 63 61  **       depreca
b050: 74 65 64 20 61 72 65 20 61 6c 77 61 79 73 20 61  ted are always a
b060: 73 73 75 6d 65 64 20 74 6f 20 62 65 20 62 61 73  ssumed to be bas
b070: 65 64 20 6f 6e 20 74 68 65 20 4e 54 20 6b 65 72  ed on the NT ker
b080: 6e 65 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  nel..  */.  retu
b090: 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 1;.#endif.}..
b0a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
b0b0: 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a  N32_MALLOC./*.**
b0c0: 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 73   Allocate nBytes
b0d0: 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73   of memory..*/.s
b0e0: 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d  tatic void *winM
b0f0: 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79  emMalloc(int nBy
b100: 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68  tes){.  HANDLE h
b110: 48 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b  Heap;.  void *p;
b120: 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ..  winMemAssert
b130: 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70  Magic();.  hHeap
b140: 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70   = winMemGetHeap
b150: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48  ();.  assert( hH
b160: 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  eap!=0 );.  asse
b170: 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c  rt( hHeap!=INVAL
b180: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
b190: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
b1a0: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
b1b0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
b1c0: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29  MALLOC_VALIDATE)
b1d0: 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61  .  assert( osHea
b1e0: 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c  pValidate(hHeap,
b1f0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
b200: 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20  AP_FLAGS, NULL) 
b210: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
b220: 72 74 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b  rt( nBytes>=0 );
b230: 0a 20 20 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c  .  p = osHeapAll
b240: 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  oc(hHeap, SQLITE
b250: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
b260: 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65  S, (SIZE_T)nByte
b270: 73 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a  s);.  if( !p ){.
b280: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
b290: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66  SQLITE_NOMEM, "f
b2a0: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 41 6c 6c  ailed to HeapAll
b2b0: 6f 63 20 25 75 20 62 79 74 65 73 20 28 25 6c 75  oc %u bytes (%lu
b2c0: 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  ), heap=%p",.   
b2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 42 79               nBy
b2e0: 74 65 73 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  tes, osGetLastEr
b2f0: 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48  ror(), (void*)hH
b300: 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  eap);.  }.  retu
b310: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  rn p;.}../*.** F
b320: 72 65 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73  ree memory..*/.s
b330: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65  tatic void winMe
b340: 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69  mFree(void *pPri
b350: 6f 72 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48  or){.  HANDLE hH
b360: 65 61 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73  eap;..  winMemAs
b370: 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68  sertMagic();.  h
b380: 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74  Heap = winMemGet
b390: 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74  Heap();.  assert
b3a0: 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20  ( hHeap!=0 );.  
b3b0: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49  assert( hHeap!=I
b3c0: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
b3d0: 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49  LUE );.#if !SQLI
b3e0: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
b3f0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
b400: 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44  N32_MALLOC_VALID
b410: 41 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f  ATE).  assert( o
b420: 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48  sHeapValidate(hH
b430: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
b440: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50  2_HEAP_FLAGS, pP
b450: 72 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a  rior) );.#endif.
b460: 20 20 69 66 28 20 21 70 50 72 69 6f 72 20 29 20    if( !pPrior ) 
b470: 72 65 74 75 72 6e 3b 20 2f 2a 20 50 61 73 73 69  return; /* Passi
b480: 6e 67 20 4e 55 4c 4c 20 74 6f 20 48 65 61 70 46  ng NULL to HeapF
b490: 72 65 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64  ree is undefined
b4a0: 2e 20 2a 2f 0a 20 20 69 66 28 20 21 6f 73 48 65  . */.  if( !osHe
b4b0: 61 70 46 72 65 65 28 68 48 65 61 70 2c 20 53 51  apFree(hHeap, SQ
b4c0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
b4d0: 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29  FLAGS, pPrior) )
b4e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
b4f0: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  g(SQLITE_NOMEM, 
b500: 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 46  "failed to HeapF
b510: 72 65 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 6c  ree block %p (%l
b520: 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  u), heap=%p",.  
b530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
b540: 72 69 6f 72 2c 20 6f 73 47 65 74 4c 61 73 74 45  rior, osGetLastE
b550: 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68  rror(), (void*)h
b560: 48 65 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Heap);.  }.}../*
b570: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73  .** Change the s
b580: 69 7a 65 20 6f 66 20 61 6e 20 65 78 69 73 74 69  ize of an existi
b590: 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ng memory alloca
b5a0: 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
b5b0: 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c  oid *winMemReall
b5c0: 6f 63 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c  oc(void *pPrior,
b5d0: 20 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20   int nBytes){.  
b5e0: 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20  HANDLE hHeap;.  
b5f0: 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d  void *p;..  winM
b600: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b  emAssertMagic();
b610: 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65  .  hHeap = winMe
b620: 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73  mGetHeap();.  as
b630: 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29  sert( hHeap!=0 )
b640: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
b650: 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  p!=INVALID_HANDL
b660: 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21  E_VALUE );.#if !
b670: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
b680: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
b690: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
b6a0: 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72  ALIDATE).  asser
b6b0: 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74  t( osHeapValidat
b6c0: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
b6d0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
b6e0: 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e  , pPrior) );.#en
b6f0: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42  dif.  assert( nB
b700: 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20 69 66 28  ytes>=0 );.  if(
b710: 20 21 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20   !pPrior ){.    
b720: 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28  p = osHeapAlloc(
b730: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
b740: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
b750: 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b  (SIZE_T)nBytes);
b760: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
b770: 3d 20 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63 28  = osHeapReAlloc(
b780: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
b790: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
b7a0: 70 50 72 69 6f 72 2c 20 28 53 49 5a 45 5f 54 29  pPrior, (SIZE_T)
b7b0: 6e 42 79 74 65 73 29 3b 0a 20 20 7d 0a 20 20 69  nBytes);.  }.  i
b7c0: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c  f( !p ){.    sql
b7d0: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
b7e0: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74  NOMEM, "failed t
b7f0: 6f 20 25 73 20 25 75 20 62 79 74 65 73 20 28 25  o %s %u bytes (%
b800: 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20  lu), heap=%p",. 
b810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
b820: 50 72 69 6f 72 20 3f 20 22 48 65 61 70 52 65 41  Prior ? "HeapReA
b830: 6c 6c 6f 63 22 20 3a 20 22 48 65 61 70 41 6c 6c  lloc" : "HeapAll
b840: 6f 63 22 2c 20 6e 42 79 74 65 73 2c 20 6f 73 47  oc", nBytes, osG
b850: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
b860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
b870: 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20  void*)hHeap);.  
b880: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
b890: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
b8a0: 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 6f 75 74  e size of an out
b8b0: 73 74 61 6e 64 69 6e 67 20 61 6c 6c 6f 63 61 74  standing allocat
b8c0: 69 6f 6e 2c 20 69 6e 20 62 79 74 65 73 2e 0a 2a  ion, in bytes..*
b8d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
b8e0: 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70 29  MemSize(void *p)
b8f0: 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70  {.  HANDLE hHeap
b900: 3b 0a 20 20 53 49 5a 45 5f 54 20 6e 3b 0a 0a 20  ;.  SIZE_T n;.. 
b910: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
b920: 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20  ic();.  hHeap = 
b930: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b  winMemGetHeap();
b940: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
b950: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
b960: 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f   hHeap!=INVALID_
b970: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
b980: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
b990: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
b9a0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
b9b0: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20  LOC_VALIDATE).  
b9c0: 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61  assert( osHeapVa
b9d0: 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51  lidate(hHeap, SQ
b9e0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
b9f0: 46 4c 41 47 53 2c 20 70 29 20 29 3b 0a 23 65 6e  FLAGS, p) );.#en
ba00: 64 69 66 0a 20 20 69 66 28 20 21 70 20 29 20 72  dif.  if( !p ) r
ba10: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 6f  eturn 0;.  n = o
ba20: 73 48 65 61 70 53 69 7a 65 28 68 48 65 61 70 2c  sHeapSize(hHeap,
ba30: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
ba40: 41 50 5f 46 4c 41 47 53 2c 20 70 29 3b 0a 20 20  AP_FLAGS, p);.  
ba50: 69 66 28 20 6e 3d 3d 28 53 49 5a 45 5f 54 29 2d  if( n==(SIZE_T)-
ba60: 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
ba70: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
ba80: 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  M, "failed to He
ba90: 61 70 53 69 7a 65 20 62 6c 6f 63 6b 20 25 70 20  apSize block %p 
baa0: 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c  (%lu), heap=%p",
bab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bac0: 20 70 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72   p, osGetLastErr
bad0: 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65  or(), (void*)hHe
bae0: 61 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ap);.    return 
baf0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
bb00: 28 69 6e 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (int)n;.}../*.**
bb10: 20 52 6f 75 6e 64 20 75 70 20 61 20 72 65 71 75   Round up a requ
bb20: 65 73 74 20 73 69 7a 65 20 74 6f 20 74 68 65 20  est size to the 
bb30: 6e 65 78 74 20 76 61 6c 69 64 20 61 6c 6c 6f 63  next valid alloc
bb40: 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73  ation size..*/.s
bb50: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d  tatic int winMem
bb60: 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29 7b 0a  Roundup(int n){.
bb70: 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
bb80: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
bb90: 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a  this module..*/.
bba0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65  static int winMe
bbb0: 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70 41 70 70  mInit(void *pApp
bbc0: 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44  Data){.  winMemD
bbd0: 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61  ata *pWinMemData
bbe0: 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a   = (winMemData *
bbf0: 29 70 41 70 70 44 61 74 61 3b 0a 0a 20 20 69 66  )pAppData;..  if
bc00: 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 20 29  ( !pWinMemData )
bc10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
bc20: 52 52 4f 52 3b 0a 20 20 61 73 73 65 72 74 28 20  RROR;.  assert( 
bc30: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67  pWinMemData->mag
bc40: 69 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49  ic1==WINMEM_MAGI
bc50: 43 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  C1 );.  assert( 
bc60: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67  pWinMemData->mag
bc70: 69 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49  ic2==WINMEM_MAGI
bc80: 43 32 20 29 3b 0a 0a 23 69 66 20 21 53 51 4c 49  C2 );..#if !SQLI
bc90: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 53  TE_OS_WINRT && S
bca0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
bcb0: 5f 43 52 45 41 54 45 0a 20 20 69 66 28 20 21 70  _CREATE.  if( !p
bcc0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
bcd0: 70 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 64  p ){.    DWORD d
bce0: 77 49 6e 69 74 69 61 6c 53 69 7a 65 20 3d 20 53  wInitialSize = S
bcf0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
bd00: 5f 49 4e 49 54 5f 53 49 5a 45 3b 0a 20 20 20 20  _INIT_SIZE;.    
bd10: 44 57 4f 52 44 20 64 77 4d 61 78 69 6d 75 6d 53  DWORD dwMaximumS
bd20: 69 7a 65 20 3d 20 28 44 57 4f 52 44 29 73 71 6c  ize = (DWORD)sql
bd30: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
bd40: 2e 6e 48 65 61 70 3b 0a 20 20 20 20 69 66 28 20  .nHeap;.    if( 
bd50: 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 3d 3d 30  dwMaximumSize==0
bd60: 20 29 7b 0a 20 20 20 20 20 20 64 77 4d 61 78 69   ){.      dwMaxi
bd70: 6d 75 6d 53 69 7a 65 20 3d 20 53 51 4c 49 54 45  mumSize = SQLITE
bd80: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f  _WIN32_HEAP_MAX_
bd90: 53 49 5a 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20  SIZE;.    }else 
bda0: 69 66 28 20 64 77 49 6e 69 74 69 61 6c 53 69 7a  if( dwInitialSiz
bdb0: 65 3e 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 20  e>dwMaximumSize 
bdc0: 29 7b 0a 20 20 20 20 20 20 64 77 49 6e 69 74 69  ){.      dwIniti
bdd0: 61 6c 53 69 7a 65 20 3d 20 64 77 4d 61 78 69 6d  alSize = dwMaxim
bde0: 75 6d 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20  umSize;.    }.  
bdf0: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68    pWinMemData->h
be00: 48 65 61 70 20 3d 20 6f 73 48 65 61 70 43 72 65  Heap = osHeapCre
be10: 61 74 65 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ate(SQLITE_WIN32
be20: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20  _HEAP_FLAGS,.   
be30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be50: 20 20 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65     dwInitialSize
be60: 2c 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 29  , dwMaximumSize)
be70: 3b 0a 20 20 20 20 69 66 28 20 21 70 57 69 6e 4d  ;.    if( !pWinM
be80: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b  emData->hHeap ){
be90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  .      sqlite3_l
bea0: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
beb0: 0a 20 20 20 20 20 20 20 20 20 20 22 66 61 69 6c  .          "fail
bec0: 65 64 20 74 6f 20 48 65 61 70 43 72 65 61 74 65  ed to HeapCreate
bed0: 20 28 25 6c 75 29 2c 20 66 6c 61 67 73 3d 25 75   (%lu), flags=%u
bee0: 2c 20 69 6e 69 74 53 69 7a 65 3d 25 6c 75 2c 20  , initSize=%lu, 
bef0: 6d 61 78 53 69 7a 65 3d 25 6c 75 22 2c 0a 20 20  maxSize=%lu",.  
bf00: 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73          osGetLas
bf10: 74 45 72 72 6f 72 28 29 2c 20 53 51 4c 49 54 45  tError(), SQLITE
bf20: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
bf30: 53 2c 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65  S, dwInitialSize
bf40: 2c 0a 20 20 20 20 20 20 20 20 20 20 64 77 4d 61  ,.          dwMa
bf50: 78 69 6d 75 6d 53 69 7a 65 29 3b 0a 20 20 20 20  ximumSize);.    
bf60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
bf70: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
bf80: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f   pWinMemData->bO
bf90: 77 6e 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20  wned = TRUE;.   
bfa0: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
bfb0: 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a  Data->bOwned );.
bfc0: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 70 57 69 6e    }.#else.  pWin
bfd0: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d  MemData->hHeap =
bfe0: 20 6f 73 47 65 74 50 72 6f 63 65 73 73 48 65 61   osGetProcessHea
bff0: 70 28 29 3b 0a 20 20 69 66 28 20 21 70 57 69 6e  p();.  if( !pWin
c000: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29  MemData->hHeap )
c010: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
c020: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a  g(SQLITE_NOMEM,.
c030: 20 20 20 20 20 20 20 20 22 66 61 69 6c 65 64 20          "failed 
c040: 74 6f 20 47 65 74 50 72 6f 63 65 73 73 48 65 61  to GetProcessHea
c050: 70 20 28 25 6c 75 29 22 2c 20 6f 73 47 65 74 4c  p (%lu)", osGetL
c060: 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20  astError());.   
c070: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
c080: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 57 69 6e  OMEM;.  }.  pWin
c090: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
c0a0: 3d 20 46 41 4c 53 45 3b 0a 20 20 61 73 73 65 72  = FALSE;.  asser
c0b0: 74 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d  t( !pWinMemData-
c0c0: 3e 62 4f 77 6e 65 64 20 29 3b 0a 23 65 6e 64 69  >bOwned );.#endi
c0d0: 66 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e  f.  assert( pWin
c0e0: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d  MemData->hHeap!=
c0f0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
c100: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
c110: 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  p!=INVALID_HANDL
c120: 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21  E_VALUE );.#if !
c130: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
c140: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
c150: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
c160: 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72  ALIDATE).  asser
c170: 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74  t( osHeapValidat
c180: 65 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  e(pWinMemData->h
c190: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
c1a0: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e  32_HEAP_FLAGS, N
c1b0: 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  ULL) );.#endif. 
c1c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c1d0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e  K;.}../*.** Dein
c1e0: 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f  itialize this mo
c1f0: 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dule..*/.static 
c200: 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64  void winMemShutd
c210: 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61  own(void *pAppDa
c220: 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74  ta){.  winMemDat
c230: 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d  a *pWinMemData =
c240: 20 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70   (winMemData *)p
c250: 41 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20  AppData;..  if( 
c260: 21 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72  !pWinMemData ) r
c270: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
c280: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61   pWinMemData->ma
c290: 67 69 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47  gic1==WINMEM_MAG
c2a0: 49 43 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IC1 );.  assert(
c2b0: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61   pWinMemData->ma
c2c0: 67 69 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47  gic2==WINMEM_MAG
c2d0: 49 43 32 20 29 3b 0a 0a 20 20 69 66 28 20 70 57  IC2 );..  if( pW
c2e0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
c2f0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
c300: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
c310: 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ap!=INVALID_HAND
c320: 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20  LE_VALUE );.#if 
c330: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
c340: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
c350: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f  TE_WIN32_MALLOC_
c360: 56 41 4c 49 44 41 54 45 29 0a 20 20 20 20 61 73  VALIDATE).    as
c370: 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69  sert( osHeapVali
c380: 64 61 74 65 28 70 57 69 6e 4d 65 6d 44 61 74 61  date(pWinMemData
c390: 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  ->hHeap, SQLITE_
c3a0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
c3b0: 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69  , NULL) );.#endi
c3c0: 66 0a 20 20 20 20 69 66 28 20 70 57 69 6e 4d 65  f.    if( pWinMe
c3d0: 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 7b  mData->bOwned ){
c3e0: 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73 48 65  .      if( !osHe
c3f0: 61 70 44 65 73 74 72 6f 79 28 70 57 69 6e 4d 65  apDestroy(pWinMe
c400: 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 20 29 7b  mData->hHeap) ){
c410: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c420: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
c430: 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  M, "failed to He
c440: 61 70 44 65 73 74 72 6f 79 20 28 25 6c 75 29 2c  apDestroy (%lu),
c450: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
c460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
c470: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
c480: 20 28 76 6f 69 64 2a 29 70 57 69 6e 4d 65 6d 44   (void*)pWinMemD
c490: 61 74 61 2d 3e 68 48 65 61 70 29 3b 0a 20 20 20  ata->hHeap);.   
c4a0: 20 20 20 7d 0a 20 20 20 20 20 20 70 57 69 6e 4d     }.      pWinM
c4b0: 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d  emData->bOwned =
c4c0: 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20   FALSE;.    }.  
c4d0: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68    pWinMemData->h
c4e0: 48 65 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  Heap = NULL;.  }
c4f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61  .}../*.** Popula
c500: 74 65 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65 6c  te the low-level
c510: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
c520: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e  on function poin
c530: 74 65 72 73 20 69 6e 0a 2a 2a 20 73 71 6c 69 74  ters in.** sqlit
c540: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
c550: 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74   with pointers t
c560: 6f 20 74 68 65 20 72 6f 75 74 69 6e 65 73 20 69  o the routines i
c570: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 54 68 65  n this file. The
c580: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 73 70  .** arguments sp
c590: 65 63 69 66 79 20 74 68 65 20 62 6c 6f 63 6b 20  ecify the block 
c5a0: 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6d 61 6e  of memory to man
c5b0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  age..**.** This 
c5c0: 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
c5d0: 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65  called by sqlite
c5e0: 33 5f 63 6f 6e 66 69 67 28 29 2c 20 61 6e 64 20  3_config(), and 
c5f0: 74 68 65 72 65 66 6f 72 65 0a 2a 2a 20 69 73 20  therefore.** is 
c600: 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f 20  not required to 
c610: 62 65 20 74 68 72 65 61 64 73 61 66 65 20 28 69  be threadsafe (i
c620: 74 20 69 73 20 6e 6f 74 29 2e 0a 2a 2f 0a 63 6f  t is not)..*/.co
c630: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  nst sqlite3_mem_
c640: 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74 65 33  methods *sqlite3
c650: 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f 69 64  MemGetWin32(void
c660: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
c670: 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  t sqlite3_mem_me
c680: 74 68 6f 64 73 20 77 69 6e 4d 65 6d 4d 65 74 68  thods winMemMeth
c690: 6f 64 73 20 3d 20 7b 0a 20 20 20 20 77 69 6e 4d  ods = {.    winM
c6a0: 65 6d 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69  emMalloc,.    wi
c6b0: 6e 4d 65 6d 46 72 65 65 2c 0a 20 20 20 20 77 69  nMemFree,.    wi
c6c0: 6e 4d 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20 20 20  nMemRealloc,.   
c6d0: 20 77 69 6e 4d 65 6d 53 69 7a 65 2c 0a 20 20 20   winMemSize,.   
c6e0: 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 2c 0a   winMemRoundup,.
c6f0: 20 20 20 20 77 69 6e 4d 65 6d 49 6e 69 74 2c 0a      winMemInit,.
c700: 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f      winMemShutdo
c710: 77 6e 2c 0a 20 20 20 20 26 77 69 6e 5f 6d 65 6d  wn,.    &win_mem
c720: 5f 64 61 74 61 0a 20 20 7d 3b 0a 20 20 72 65 74  _data.  };.  ret
c730: 75 72 6e 20 26 77 69 6e 4d 65 6d 4d 65 74 68 6f  urn &winMemMetho
c740: 64 73 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69  ds;.}..void sqli
c750: 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74  te3MemSetDefault
c760: 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
c770: 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
c780: 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2c 20 73  CONFIG_MALLOC, s
c790: 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33  qlite3MemGetWin3
c7a0: 32 28 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  2());.}.#endif /
c7b0: 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  * SQLITE_WIN32_M
c7c0: 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ALLOC */../*.** 
c7d0: 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20  Convert a UTF-8 
c7e0: 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73  string to Micros
c7f0: 6f 66 74 20 55 6e 69 63 6f 64 65 20 28 55 54 46  oft Unicode (UTF
c800: 2d 31 36 3f 29 2e 0a 2a 2a 0a 2a 2a 20 53 70 61  -16?)..**.** Spa
c810: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
c820: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
c830: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
c840: 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69  malloc..*/.stati
c850: 63 20 4c 50 57 53 54 52 20 77 69 6e 55 74 66 38  c LPWSTR winUtf8
c860: 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20  ToUnicode(const 
c870: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
c880: 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20  {.  int nChar;. 
c890: 20 4c 50 57 53 54 52 20 7a 57 69 64 65 46 69 6c   LPWSTR zWideFil
c8a0: 65 6e 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72 20  ename;..  nChar 
c8b0: 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  = osMultiByteToW
c8c0: 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c  ideChar(CP_UTF8,
c8d0: 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d   0, zFilename, -
c8e0: 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 69  1, NULL, 0);.  i
c8f0: 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20  f( nChar==0 ){. 
c900: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
c910: 0a 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  .  zWideFilename
c920: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
c930: 5a 65 72 6f 28 20 6e 43 68 61 72 2a 73 69 7a 65  Zero( nChar*size
c940: 6f 66 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  of(zWideFilename
c950: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 57  [0]) );.  if( zW
c960: 69 64 65 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29  ideFilename==0 )
c970: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
c980: 20 20 7d 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73    }.  nChar = os
c990: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
c9a0: 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20  har(CP_UTF8, 0, 
c9b0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a  zFilename, -1, z
c9c0: 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  WideFilename,.  
c9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 43                nC
c9f0: 68 61 72 29 3b 0a 20 20 69 66 28 20 6e 43 68 61  har);.  if( nCha
ca00: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
ca10: 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 46 69  te3_free(zWideFi
ca20: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 57 69  lename);.    zWi
ca30: 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a  deFilename = 0;.
ca40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 57 69    }.  return zWi
ca50: 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f  deFilename;.}../
ca60: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4d 69 63  *.** Convert Mic
ca70: 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 74  rosoft Unicode t
ca80: 6f 20 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20  o UTF-8.  Space 
ca90: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
caa0: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 0a 2a  rned string is.*
cab0: 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
cac0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
cad0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
cae0: 20 2a 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74   *winUnicodeToUt
caf0: 66 38 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65  f8(LPCWSTR zWide
cb00: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74  Filename){.  int
cb10: 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a   nByte;.  char *
cb20: 7a 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 42  zFilename;..  nB
cb30: 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72  yte = osWideChar
cb40: 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55  ToMultiByte(CP_U
cb50: 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c  TF8, 0, zWideFil
cb60: 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c  ename, -1, 0, 0,
cb70: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42   0, 0);.  if( nB
cb80: 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  yte == 0 ){.    
cb90: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
cba0: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69  zFilename = sqli
cbb0: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
cbc0: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46  Byte );.  if( zF
cbd0: 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ilename==0 ){.  
cbe0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
cbf0: 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65    nByte = osWide
cc00: 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28  CharToMultiByte(
cc10: 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64  CP_UTF8, 0, zWid
cc20: 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a  eFilename, -1, z
cc30: 46 69 6c 65 6e 61 6d 65 2c 20 6e 42 79 74 65 2c  Filename, nByte,
cc40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc60: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42   0, 0);.  if( nB
cc70: 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  yte == 0 ){.    
cc80: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69  sqlite3_free(zFi
cc90: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69  lename);.    zFi
cca0: 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  lename = 0;.  }.
ccb0: 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61    return zFilena
ccc0: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  me;.}../*.** Con
ccd0: 76 65 72 74 20 61 6e 20 41 4e 53 49 20 73 74 72  vert an ANSI str
cce0: 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66 74  ing to Microsoft
ccf0: 20 55 6e 69 63 6f 64 65 2c 20 62 61 73 65 64 20   Unicode, based 
cd00: 6f 6e 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  on the.** curren
cd10: 74 20 63 6f 64 65 70 61 67 65 20 73 65 74 74 69  t codepage setti
cd20: 6e 67 73 20 66 6f 72 20 66 69 6c 65 20 61 70 69  ngs for file api
cd30: 73 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  s..**.** Space t
cd40: 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72  o hold the retur
cd50: 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62  ned string is ob
cd60: 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73  tained.** from s
cd70: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e 0a 2a  qlite3_malloc..*
cd80: 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52 20  /.static LPWSTR 
cd90: 77 69 6e 4d 62 63 73 54 6f 55 6e 69 63 6f 64 65  winMbcsToUnicode
cda0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
cdb0: 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e  lename){.  int n
cdc0: 42 79 74 65 3b 0a 20 20 4c 50 57 53 54 52 20 7a  Byte;.  LPWSTR z
cdd0: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  MbcsFilename;.  
cde0: 69 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20 6f  int codepage = o
cdf0: 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  sAreFileApisANSI
ce00: 28 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50  () ? CP_ACP : CP
ce10: 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65  _OEMCP;..  nByte
ce20: 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f   = osMultiByteTo
ce30: 57 69 64 65 43 68 61 72 28 63 6f 64 65 70 61 67  WideChar(codepag
ce40: 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  e, 0, zFilename,
ce50: 20 2d 31 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20   -1, NULL,.     
ce60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce70: 20 20 20 20 20 20 20 20 20 20 20 30 29 2a 73 69             0)*si
ce80: 7a 65 6f 66 28 57 43 48 41 52 29 3b 0a 20 20 69  zeof(WCHAR);.  i
ce90: 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20  f( nByte==0 ){. 
cea0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
ceb0: 0a 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  .  zMbcsFilename
cec0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
ced0: 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65  Zero( nByte*size
cee0: 6f 66 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  of(zMbcsFilename
cef0: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 4d  [0]) );.  if( zM
cf00: 62 63 73 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29  bcsFilename==0 )
cf10: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
cf20: 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73    }.  nByte = os
cf30: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
cf40: 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c  har(codepage, 0,
cf50: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20   zFilename, -1, 
cf60: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 2c 0a 20  zMbcsFilename,. 
cf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
cf90: 42 79 74 65 29 3b 0a 20 20 69 66 28 20 6e 42 79  Byte);.  if( nBy
cfa0: 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  te==0 ){.    sql
cfb0: 69 74 65 33 5f 66 72 65 65 28 7a 4d 62 63 73 46  ite3_free(zMbcsF
cfc0: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 4d  ilename);.    zM
cfd0: 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b  bcsFilename = 0;
cfe0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4d  .  }.  return zM
cff0: 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a  bcsFilename;.}..
d000: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4d 69  /*.** Convert Mi
d010: 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20  crosoft Unicode 
d020: 74 6f 20 6d 75 6c 74 69 2d 62 79 74 65 20 63 68  to multi-byte ch
d030: 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 2c 20  aracter string, 
d040: 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20  based on the.** 
d050: 75 73 65 72 27 73 20 41 4e 53 49 20 63 6f 64 65  user's ANSI code
d060: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  page..**.** Spac
d070: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
d080: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
d090: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
d0a0: 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
d0b0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ()..*/.static ch
d0c0: 61 72 20 2a 77 69 6e 55 6e 69 63 6f 64 65 54 6f  ar *winUnicodeTo
d0d0: 4d 62 63 73 28 4c 50 43 57 53 54 52 20 7a 57 69  Mbcs(LPCWSTR zWi
d0e0: 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69  deFilename){.  i
d0f0: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72  nt nByte;.  char
d100: 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69   *zFilename;.  i
d110: 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20 6f 73  nt codepage = os
d120: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28  AreFileApisANSI(
d130: 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f  ) ? CP_ACP : CP_
d140: 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20  OEMCP;..  nByte 
d150: 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75  = osWideCharToMu
d160: 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61 67 65  ltiByte(codepage
d170: 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61  , 0, zWideFilena
d180: 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c  me, -1, 0, 0, 0,
d190: 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65   0);.  if( nByte
d1a0: 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74   == 0 ){.    ret
d1b0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69  urn 0;.  }.  zFi
d1c0: 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  lename = sqlite3
d1d0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74  MallocZero( nByt
d1e0: 65 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65  e );.  if( zFile
d1f0: 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  name==0 ){.    r
d200: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e  eturn 0;.  }.  n
d210: 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61  Byte = osWideCha
d220: 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64  rToMultiByte(cod
d230: 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46  epage, 0, zWideF
d240: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69  ilename, -1, zFi
d250: 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
d260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d270: 20 20 20 20 20 20 20 20 6e 42 79 74 65 2c 20 30          nByte, 0
d280: 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  , 0);.  if( nByt
d290: 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 71  e == 0 ){.    sq
d2a0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65  lite3_free(zFile
d2b0: 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65  name);.    zFile
d2c0: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  name = 0;.  }.  
d2d0: 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65  return zFilename
d2e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
d2f0: 72 74 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61  rt multibyte cha
d300: 72 61 63 74 65 72 20 73 74 72 69 6e 67 20 74 6f  racter string to
d310: 20 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74   UTF-8.  Space t
d320: 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 72 65  o hold the.** re
d330: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
d340: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
d350: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
d360: 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
d370: 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f  3_win32_mbcs_to_
d380: 75 74 66 38 28 63 6f 6e 73 74 20 63 68 61 72 20  utf8(const char 
d390: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63  *zFilename){.  c
d3a0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 55 74  har *zFilenameUt
d3b0: 66 38 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d  f8;.  LPWSTR zTm
d3c0: 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69  pWide;..  zTmpWi
d3d0: 64 65 20 3d 20 77 69 6e 4d 62 63 73 54 6f 55 6e  de = winMbcsToUn
d3e0: 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29  icode(zFilename)
d3f0: 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65  ;.  if( zTmpWide
d400: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
d410: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65  n 0;.  }.  zFile
d420: 6e 61 6d 65 55 74 66 38 20 3d 20 77 69 6e 55 6e  nameUtf8 = winUn
d430: 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 6d 70  icodeToUtf8(zTmp
d440: 57 69 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Wide);.  sqlite3
d450: 5f 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29 3b  _free(zTmpWide);
d460: 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e  .  return zFilen
d470: 61 6d 65 55 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a  ameUtf8;.}../*.*
d480: 2a 20 43 6f 6e 76 65 72 74 20 55 54 46 2d 38 20  * Convert UTF-8 
d490: 74 6f 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61  to multibyte cha
d4a0: 72 61 63 74 65 72 20 73 74 72 69 6e 67 2e 20 20  racter string.  
d4b0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
d4c0: 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74  e.** returned st
d4d0: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
d4e0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
d4f0: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20  lloc()..*/.char 
d500: 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75  *sqlite3_win32_u
d510: 74 66 38 5f 74 6f 5f 6d 62 63 73 28 63 6f 6e 73  tf8_to_mbcs(cons
d520: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
d530: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c  e){.  char *zFil
d540: 65 6e 61 6d 65 4d 62 63 73 3b 0a 20 20 4c 50 57  enameMbcs;.  LPW
d550: 53 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20  STR zTmpWide;.. 
d560: 20 7a 54 6d 70 57 69 64 65 20 3d 20 77 69 6e 55   zTmpWide = winU
d570: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  tf8ToUnicode(zFi
d580: 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
d590: 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20  TmpWide==0 ){.  
d5a0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
d5b0: 20 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 20    zFilenameMbcs 
d5c0: 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 4d 62  = winUnicodeToMb
d5d0: 63 73 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20  cs(zTmpWide);.  
d5e0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d  sqlite3_free(zTm
d5f0: 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e  pWide);.  return
d600: 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a   zFilenameMbcs;.
d610: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
d620: 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20  nction sets the 
d630: 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 6f  data directory o
d640: 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  r the temporary 
d650: 64 69 72 65 63 74 6f 72 79 20 62 61 73 65 64 20  directory based 
d660: 6f 6e 0a 2a 2a 20 74 68 65 20 70 72 6f 76 69 64  on.** the provid
d670: 65 64 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54  ed arguments.  T
d680: 68 65 20 74 79 70 65 20 61 72 67 75 6d 65 6e 74  he type argument
d690: 20 6d 75 73 74 20 62 65 20 31 20 69 6e 20 6f 72   must be 1 in or
d6a0: 64 65 72 20 74 6f 20 73 65 74 20 74 68 65 0a 2a  der to set the.*
d6b0: 2a 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79  * data directory
d6c0: 20 6f 72 20 32 20 69 6e 20 6f 72 64 65 72 20 74   or 2 in order t
d6d0: 6f 20 73 65 74 20 74 68 65 20 74 65 6d 70 6f 72  o set the tempor
d6e0: 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e 20 20  ary directory.  
d6f0: 54 68 65 20 7a 56 61 6c 75 65 0a 2a 2a 20 61 72  The zValue.** ar
d700: 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61  gument is the na
d710: 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65 63 74  me of the direct
d720: 6f 72 79 20 74 6f 20 75 73 65 2e 20 20 54 68 65  ory to use.  The
d730: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 77 69   return value wi
d740: 6c 6c 20 62 65 0a 2a 2a 20 53 51 4c 49 54 45 5f  ll be.** SQLITE_
d750: 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
d760: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
d770: 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
d780: 74 6f 72 79 28 44 57 4f 52 44 20 74 79 70 65 2c  tory(DWORD type,
d790: 20 4c 50 43 57 53 54 52 20 7a 56 61 6c 75 65 29   LPCWSTR zValue)
d7a0: 7b 0a 20 20 63 68 61 72 20 2a 2a 70 70 44 69 72  {.  char **ppDir
d7b0: 65 63 74 6f 72 79 20 3d 20 30 3b 0a 23 69 66 6e  ectory = 0;.#ifn
d7c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d7d0: 41 55 54 4f 49 4e 49 54 0a 20 20 69 6e 74 20 72  AUTOINIT.  int r
d7e0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  c = sqlite3_init
d7f0: 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20  ialize();.  if( 
d800: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
d810: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 74 79 70  #endif.  if( typ
d820: 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  e==SQLITE_WIN32_
d830: 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54  DATA_DIRECTORY_T
d840: 59 50 45 20 29 7b 0a 20 20 20 20 70 70 44 69 72  YPE ){.    ppDir
d850: 65 63 74 6f 72 79 20 3d 20 26 73 71 6c 69 74 65  ectory = &sqlite
d860: 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
d870: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 74 79  ;.  }else if( ty
d880: 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32  pe==SQLITE_WIN32
d890: 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f  _TEMP_DIRECTORY_
d8a0: 54 59 50 45 20 29 7b 0a 20 20 20 20 70 70 44 69  TYPE ){.    ppDi
d8b0: 72 65 63 74 6f 72 79 20 3d 20 26 73 71 6c 69 74  rectory = &sqlit
d8c0: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
d8d0: 79 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  y;.  }.  assert(
d8e0: 20 21 70 70 44 69 72 65 63 74 6f 72 79 20 7c 7c   !ppDirectory ||
d8f0: 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49   type==SQLITE_WI
d900: 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f  N32_DATA_DIRECTO
d910: 52 59 5f 54 59 50 45 0a 20 20 20 20 20 20 20 20  RY_TYPE.        
d920: 20 20 7c 7c 20 74 79 70 65 3d 3d 53 51 4c 49 54    || type==SQLIT
d930: 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52  E_WIN32_TEMP_DIR
d940: 45 43 54 4f 52 59 5f 54 59 50 45 0a 20 20 29 3b  ECTORY_TYPE.  );
d950: 0a 20 20 61 73 73 65 72 74 28 20 21 70 70 44 69  .  assert( !ppDi
d960: 72 65 63 74 6f 72 79 20 7c 7c 20 73 71 6c 69 74  rectory || sqlit
d970: 65 33 4d 65 6d 64 65 62 75 67 48 61 73 54 79 70  e3MemdebugHasTyp
d980: 65 28 2a 70 70 44 69 72 65 63 74 6f 72 79 2c 20  e(*ppDirectory, 
d990: 4d 45 4d 54 59 50 45 5f 48 45 41 50 29 20 29 3b  MEMTYPE_HEAP) );
d9a0: 0a 20 20 69 66 28 20 70 70 44 69 72 65 63 74 6f  .  if( ppDirecto
d9b0: 72 79 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  ry ){.    char *
d9c0: 7a 56 61 6c 75 65 55 74 66 38 20 3d 20 30 3b 0a  zValueUtf8 = 0;.
d9d0: 20 20 20 20 69 66 28 20 7a 56 61 6c 75 65 20 26      if( zValue &
d9e0: 26 20 7a 56 61 6c 75 65 5b 30 5d 20 29 7b 0a 20  & zValue[0] ){. 
d9f0: 20 20 20 20 20 7a 56 61 6c 75 65 55 74 66 38 20       zValueUtf8 
da00: 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74  = winUnicodeToUt
da10: 66 38 28 7a 56 61 6c 75 65 29 3b 0a 20 20 20 20  f8(zValue);.    
da20: 20 20 69 66 20 28 20 7a 56 61 6c 75 65 55 74 66    if ( zValueUtf
da30: 38 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  8==0 ){.        
da40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
da50: 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
da60: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
da70: 72 65 65 28 2a 70 70 44 69 72 65 63 74 6f 72 79  ree(*ppDirectory
da80: 29 3b 0a 20 20 20 20 2a 70 70 44 69 72 65 63 74  );.    *ppDirect
da90: 6f 72 79 20 3d 20 7a 56 61 6c 75 65 55 74 66 38  ory = zValueUtf8
daa0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
dab0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  ITE_OK;.  }.  re
dac0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
dad0: 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  R;.}../*.** The 
dae0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
daf0: 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d  winGetLastErrorM
db00: 73 67 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66  sg.** is zero if
db10: 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
db20: 67 65 20 66 69 74 73 20 69 6e 20 74 68 65 20 62  ge fits in the b
db30: 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65  uffer, or non-ze
db40: 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20  ro.** otherwise 
db50: 28 69 66 20 74 68 65 20 6d 65 73 73 61 67 65 20  (if the message 
db60: 77 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e 0a  was truncated)..
db70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
db80: 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67  nGetLastErrorMsg
db90: 28 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f  (DWORD lastErrno
dba0: 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
dbb0: 20 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a 20 46 6f   *zBuf){.  /* Fo
dbc0: 72 6d 61 74 4d 65 73 73 61 67 65 20 72 65 74 75  rmatMessage retu
dbd0: 72 6e 73 20 30 20 6f 6e 20 66 61 69 6c 75 72 65  rns 0 on failure
dbe0: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 69 74 0a  .  Otherwise it.
dbf0: 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 74 68 65    ** returns the
dc00: 20 6e 75 6d 62 65 72 20 6f 66 20 54 43 48 41 52   number of TCHAR
dc10: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
dc20: 20 6f 75 74 70 75 74 0a 20 20 2a 2a 20 62 75 66   output.  ** buf
dc30: 66 65 72 2c 20 65 78 63 6c 75 64 69 6e 67 20 74  fer, excluding t
dc40: 68 65 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e  he terminating n
dc50: 75 6c 6c 20 63 68 61 72 2e 0a 20 20 2a 2f 0a 20  ull char..  */. 
dc60: 20 44 57 4f 52 44 20 64 77 4c 65 6e 20 3d 20 30   DWORD dwLen = 0
dc70: 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d  ;.  char *zOut =
dc80: 20 30 3b 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e   0;..  if( osIsN
dc90: 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  T() ){.#if SQLIT
dca0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 57  E_OS_WINRT.    W
dcb0: 43 48 41 52 20 7a 54 65 6d 70 57 69 64 65 5b 53  CHAR zTempWide[S
dcc0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f  QLITE_WIN32_MAX_
dcd0: 45 52 52 4d 53 47 5f 43 48 41 52 53 2b 31 5d 3b  ERRMSG_CHARS+1];
dce0: 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46  .    dwLen = osF
dcf0: 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 28 46 4f  ormatMessageW(FO
dd00: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f  RMAT_MESSAGE_FRO
dd10: 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20  M_SYSTEM |.     
dd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd30: 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d          FORMAT_M
dd40: 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e  ESSAGE_IGNORE_IN
dd50: 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20  SERTS,.         
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd70: 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20      NULL,.      
dd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd90: 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f         lastErrno
dda0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ddb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
ddc0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
dde0: 54 65 6d 70 57 69 64 65 2c 0a 20 20 20 20 20 20  TempWide,.      
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de00: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49         SQLITE_WI
de10: 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43  N32_MAX_ERRMSG_C
de20: 48 41 52 53 2c 0a 20 20 20 20 20 20 20 20 20 20  HARS,.          
de30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de40: 20 20 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20     0);.#else.   
de50: 20 4c 50 57 53 54 52 20 7a 54 65 6d 70 57 69 64   LPWSTR zTempWid
de60: 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77  e = NULL;.    dw
de70: 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65  Len = osFormatMe
de80: 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45  ssageW(FORMAT_ME
de90: 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42  SSAGE_ALLOCATE_B
dea0: 55 46 46 45 52 20 7c 0a 20 20 20 20 20 20 20 20  UFFER |.        
deb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dec0: 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53       FORMAT_MESS
ded0: 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20  AGE_FROM_SYSTEM 
dee0: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
def0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
df00: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47  ORMAT_MESSAGE_IG
df10: 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20  NORE_INSERTS,.  
df20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df30: 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c             NULL,
df40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
df50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61                la
df60: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
df70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df80: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
df90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfa0: 20 20 20 20 20 20 28 4c 50 57 53 54 52 29 20 26        (LPWSTR) &
dfb0: 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20 20 20 20  zTempWide,.     
dfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfd0: 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20          0,.     
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dff0: 20 20 20 20 20 20 20 20 30 29 3b 0a 23 65 6e 64          0);.#end
e000: 69 66 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e  if.    if( dwLen
e010: 20 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a   > 0 ){.      /*
e020: 20 61 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66   allocate a buff
e030: 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74  er and convert t
e040: 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20  o UTF8 */.      
e050: 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
e060: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
e070: 20 20 7a 4f 75 74 20 3d 20 77 69 6e 55 6e 69 63    zOut = winUnic
e080: 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 57  odeToUtf8(zTempW
e090: 69 64 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ide);.      sqli
e0a0: 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
e0b0: 6f 63 28 29 3b 0a 23 69 66 20 21 53 51 4c 49 54  oc();.#if !SQLIT
e0c0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20  E_OS_WINRT.     
e0d0: 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73 79 73   /* free the sys
e0e0: 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  tem buffer alloc
e0f0: 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74 4d 65  ated by FormatMe
e100: 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f  ssage */.      o
e110: 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70  sLocalFree(zTemp
e120: 57 69 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Wide);.#endif.  
e130: 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53    }.  }.#ifdef S
e140: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
e150: 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
e160: 20 63 68 61 72 20 2a 7a 54 65 6d 70 20 3d 20 4e   char *zTemp = N
e170: 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d  ULL;.    dwLen =
e180: 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65   osFormatMessage
e190: 41 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45  A(FORMAT_MESSAGE
e1a0: 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45 52  _ALLOCATE_BUFFER
e1b0: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1d0: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46  FORMAT_MESSAGE_F
e1e0: 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20  ROM_SYSTEM |.   
e1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e200: 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54            FORMAT
e210: 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f  _MESSAGE_IGNORE_
e220: 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20  INSERTS,.       
e230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e240: 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20        NULL,.    
e250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e260: 20 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72           lastErr
e270: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
e280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e290: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
e2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2b0: 20 28 4c 50 53 54 52 29 20 26 7a 54 65 6d 70 2c   (LPSTR) &zTemp,
e2c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
e2e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29                0)
e300: 3b 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20  ;.    if( dwLen 
e310: 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  > 0 ){.      /* 
e320: 61 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65  allocate a buffe
e330: 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f  r and convert to
e340: 20 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 73   UTF8 */.      s
e350: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
e360: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
e370: 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f   zOut = sqlite3_
e380: 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74  win32_mbcs_to_ut
e390: 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20  f8(zTemp);.     
e3a0: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
e3b0: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
e3c0: 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73 79 73   /* free the sys
e3d0: 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  tem buffer alloc
e3e0: 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74 4d 65  ated by FormatMe
e3f0: 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f  ssage */.      o
e400: 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70  sLocalFree(zTemp
e410: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
e420: 64 69 66 0a 20 20 69 66 28 20 30 20 3d 3d 20 64  dif.  if( 0 == d
e430: 77 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  wLen ){.    sqli
e440: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
e450: 66 2c 20 7a 42 75 66 2c 20 22 4f 73 45 72 72 6f  f, zBuf, "OsErro
e460: 72 20 30 78 25 6c 78 20 28 25 6c 75 29 22 2c 20  r 0x%lx (%lu)", 
e470: 6c 61 73 74 45 72 72 6e 6f 2c 20 6c 61 73 74 45  lastErrno, lastE
e480: 72 72 6e 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rrno);.  }else{.
e490: 20 20 20 20 2f 2a 20 63 6f 70 79 20 61 20 6d 61      /* copy a ma
e4a0: 78 69 6d 75 6d 20 6f 66 20 6e 42 75 66 20 63 68  ximum of nBuf ch
e4b0: 61 72 73 20 74 6f 20 6f 75 74 70 75 74 20 62 75  ars to output bu
e4c0: 66 66 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ffer */.    sqli
e4d0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
e4e0: 66 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a  f, zBuf, "%s", z
e4f0: 4f 75 74 29 3b 0a 20 20 20 20 2f 2a 20 66 72 65  Out);.    /* fre
e500: 65 20 74 68 65 20 55 54 46 38 20 62 75 66 66 65  e the UTF8 buffe
e510: 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  r */.    sqlite3
e520: 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 7d  _free(zOut);.  }
e530: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
e540: 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /*.**.** This fu
e550: 6e 63 74 69 6f 6e 20 2d 20 77 69 6e 4c 6f 67 45  nction - winLogE
e560: 72 72 6f 72 41 74 4c 69 6e 65 28 29 20 2d 20 69  rrorAtLine() - i
e570: 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c  s only ever call
e580: 65 64 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f  ed via the macro
e590: 0a 2a 2a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  .** winLogError(
e5a0: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  )..**.** This ro
e5b0: 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
e5c0: 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20   after an error 
e5d0: 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20  occurs in an OS 
e5e0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20  function..** It 
e5f0: 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20 75  logs a message u
e600: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67  sing sqlite3_log
e610: 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  () containing th
e620: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
e630: 6f 66 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  of.** error code
e640: 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c   and, if possibl
e650: 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61  e, the human-rea
e660: 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74  dable equivalent
e670: 20 66 72 6f 6d 0a 2a 2a 20 46 6f 72 6d 61 74 4d   from.** FormatM
e680: 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  essage..**.** Th
e690: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
e6a0: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d   passed to the m
e6b0: 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74  acro should be t
e6c0: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68  he error code th
e6d0: 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65  at.** will be re
e6e0: 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65  turned to SQLite
e6f0: 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f   (e.g. SQLITE_IO
e700: 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49  ERR_DELETE, SQLI
e710: 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 0a 2a 2a  TE_CANTOPEN)..**
e720: 20 54 68 65 20 74 77 6f 20 73 75 62 73 65 71 75   The two subsequ
e730: 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68  ent arguments sh
e740: 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65  ould be the name
e750: 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74   of the OS funct
e760: 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c  ion that.** fail
e770: 65 64 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63  ed and the assoc
e780: 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65  iated file-syste
e790: 6d 20 70 61 74 68 2c 20 69 66 20 61 6e 79 2e 0a  m path, if any..
e7a0: 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 4c 6f  */.#define winLo
e7b0: 67 45 72 72 6f 72 28 61 2c 62 2c 63 2c 64 29 20  gError(a,b,c,d) 
e7c0: 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c    winLogErrorAtL
e7d0: 69 6e 65 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c 49  ine(a,b,c,d,__LI
e7e0: 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74  NE__).static int
e7f0: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69   winLogErrorAtLi
e800: 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64  ne(.  int errcod
e810: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
e820: 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20        /* SQLite 
e830: 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  error code */.  
e840: 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c  DWORD lastErrno,
e850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e860: 2f 2a 20 57 69 6e 33 32 20 6c 61 73 74 20 65 72  /* Win32 last er
e870: 72 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ror */.  const c
e880: 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20  har *zFunc,     
e890: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
e8a0: 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20   of OS function 
e8b0: 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20  that failed */. 
e8c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
e8d0: 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
e8e0: 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73   /* File path as
e8f0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 72  sociated with er
e900: 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69  ror */.  int iLi
e910: 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ne              
e920: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72           /* Sour
e930: 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77  ce line number w
e940: 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72  here error occur
e950: 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  red */.){.  char
e960: 20 7a 4d 73 67 5b 35 30 30 5d 3b 20 20 20 20 20   zMsg[500];     
e970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
e980: 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 65 72  uman readable er
e990: 72 6f 72 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e  ror text */.  in
e9a0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
e9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e9c0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
e9d0: 0a 0a 20 20 7a 4d 73 67 5b 30 5d 20 3d 20 30 3b  ..  zMsg[0] = 0;
e9e0: 0a 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72  .  winGetLastErr
e9f0: 6f 72 4d 73 67 28 6c 61 73 74 45 72 72 6e 6f 2c  orMsg(lastErrno,
ea00: 20 73 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a   sizeof(zMsg), z
ea10: 4d 73 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Msg);.  assert( 
ea20: 65 72 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errcode!=SQLITE_
ea30: 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74  OK );.  if( zPat
ea40: 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22  h==0 ) zPath = "
ea50: 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d  ";.  for(i=0; zM
ea60: 73 67 5b 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d  sg[i] && zMsg[i]
ea70: 21 3d 27 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69  !='\r' && zMsg[i
ea80: 5d 21 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a  ]!='\n'; i++){}.
ea90: 20 20 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20    zMsg[i] = 0;. 
eaa0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72   sqlite3_log(err
eab0: 63 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f  code,.      "os_
eac0: 77 69 6e 2e 63 3a 25 64 3a 20 28 25 6c 75 29 20  win.c:%d: (%lu) 
ead0: 25 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20  %s(%s) - %s",.  
eae0: 20 20 20 20 69 4c 69 6e 65 2c 20 6c 61 73 74 45      iLine, lastE
eaf0: 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61  rrno, zFunc, zPa
eb00: 74 68 2c 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20  th, zMsg.  );.. 
eb10: 20 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b   return errcode;
eb20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75  .}../*.** The nu
eb30: 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68  mber of times th
eb40: 61 74 20 61 20 52 65 61 64 46 69 6c 65 28 29 2c  at a ReadFile(),
eb50: 20 57 72 69 74 65 46 69 6c 65 28 29 2c 20 61 6e   WriteFile(), an
eb60: 64 20 44 65 6c 65 74 65 46 69 6c 65 28 29 0a 2a  d DeleteFile().*
eb70: 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65  * will be retrie
eb80: 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f  d following a lo
eb90: 63 6b 69 6e 67 20 65 72 72 6f 72 20 2d 20 70 72  cking error - pr
eba0: 6f 62 61 62 6c 79 20 63 61 75 73 65 64 20 62 79  obably caused by
ebb0: 0a 2a 2a 20 61 6e 74 69 76 69 72 75 73 20 73 6f  .** antivirus so
ebc0: 66 74 77 61 72 65 2e 20 20 41 6c 73 6f 20 74 68  ftware.  Also th
ebd0: 65 20 69 6e 69 74 69 61 6c 20 64 65 6c 61 79 20  e initial delay 
ebe0: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
ebf0: 20 72 65 74 72 79 2e 0a 2a 2a 20 54 68 65 20 64   retry..** The d
ec00: 65 6c 61 79 20 69 6e 63 72 65 61 73 65 73 20 6c  elay increases l
ec10: 69 6e 65 61 72 6c 79 20 77 69 74 68 20 65 61 63  inearly with eac
ec20: 68 20 72 65 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e  h retry..*/.#ifn
ec30: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
ec40: 5f 49 4f 45 52 52 5f 52 45 54 52 59 0a 23 20 64  _IOERR_RETRY.# d
ec50: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
ec60: 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 20 31  32_IOERR_RETRY 1
ec70: 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  0.#endif.#ifndef
ec80: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
ec90: 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 0a  ERR_RETRY_DELAY.
eca0: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
ecb0: 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
ecc0: 59 5f 44 45 4c 41 59 20 32 35 0a 23 65 6e 64 69  Y_DELAY 25.#endi
ecd0: 66 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  f.static int win
ece0: 49 6f 65 72 72 52 65 74 72 79 20 3d 20 53 51 4c  IoerrRetry = SQL
ecf0: 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f  ITE_WIN32_IOERR_
ed00: 52 45 54 52 59 3b 0a 73 74 61 74 69 63 20 69 6e  RETRY;.static in
ed10: 74 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44  t winIoerrRetryD
ed20: 65 6c 61 79 20 3d 20 53 51 4c 49 54 45 5f 57 49  elay = SQLITE_WI
ed30: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f  N32_IOERR_RETRY_
ed40: 44 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  DELAY;../*.** Th
ed50: 65 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65  e "winIoerrCanRe
ed60: 74 72 79 31 22 20 6d 61 63 72 6f 20 69 73 20 75  try1" macro is u
ed70: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
ed80: 20 69 66 20 61 20 70 61 72 74 69 63 75 6c 61 72   if a particular
ed90: 20 49 2f 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f   I/O.** error co
eda0: 64 65 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20  de obtained via 
edb0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 69  GetLastError() i
edc0: 73 20 65 6c 69 67 69 62 6c 65 20 74 6f 20 62 65  s eligible to be
edd0: 20 72 65 74 72 69 65 64 2e 20 20 49 74 0a 2a 2a   retried.  It.**
ede0: 20 6d 75 73 74 20 61 63 63 65 70 74 20 74 68 65   must accept the
edf0: 20 65 72 72 6f 72 20 63 6f 64 65 20 44 57 4f 52   error code DWOR
ee00: 44 20 61 73 20 69 74 73 20 6f 6e 6c 79 20 61 72  D as its only ar
ee10: 67 75 6d 65 6e 74 20 61 6e 64 20 73 68 6f 75 6c  gument and shoul
ee20: 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d  d return.** non-
ee30: 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f  zero if the erro
ee40: 72 20 63 6f 64 65 20 69 73 20 74 72 61 6e 73 69  r code is transi
ee50: 65 6e 74 20 69 6e 20 6e 61 74 75 72 65 20 61 6e  ent in nature an
ee60: 64 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 0a  d the operation.
ee70: 2a 2a 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  ** responsible f
ee80: 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68  or generating th
ee90: 65 20 6f 72 69 67 69 6e 61 6c 20 65 72 72 6f 72  e original error
eea0: 20 6d 69 67 68 74 20 73 75 63 63 65 65 64 20 75   might succeed u
eeb0: 70 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 65 74  pon being.** ret
eec0: 72 69 65 64 2e 20 20 54 68 65 20 61 72 67 75 6d  ried.  The argum
eed0: 65 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72  ent to this macr
eee0: 6f 20 73 68 6f 75 6c 64 20 62 65 20 61 20 76 61  o should be a va
eef0: 72 69 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 64  riable..**.** Ad
ef00: 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 20 6d 61  ditionally, a ma
ef10: 63 72 6f 20 6e 61 6d 65 64 20 22 77 69 6e 49 6f  cro named "winIo
ef20: 65 72 72 43 61 6e 52 65 74 72 79 32 22 20 6d 61  errCanRetry2" ma
ef30: 79 20 62 65 20 64 65 66 69 6e 65 64 2e 20 20 49  y be defined.  I
ef40: 66 20 69 74 0a 2a 2a 20 69 73 20 64 65 66 69 6e  f it.** is defin
ef50: 65 64 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 63  ed, it will be c
ef60: 6f 6e 73 75 6c 74 65 64 20 6f 6e 6c 79 20 77 68  onsulted only wh
ef70: 65 6e 20 74 68 65 20 6d 61 63 72 6f 20 22 77 69  en the macro "wi
ef80: 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 22  nIoerrCanRetry1"
ef90: 0a 2a 2a 20 72 65 74 75 72 6e 73 20 7a 65 72 6f  .** returns zero
efa0: 2e 20 20 54 68 65 20 22 77 69 6e 49 6f 65 72 72  .  The "winIoerr
efb0: 43 61 6e 52 65 74 72 79 32 22 20 6d 61 63 72 6f  CanRetry2" macro
efc0: 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f   is completely o
efd0: 70 74 69 6f 6e 61 6c 20 61 6e 64 0a 2a 2a 20 6d  ptional and.** m
efe0: 61 79 20 62 65 20 75 73 65 64 20 74 6f 20 69 6e  ay be used to in
eff0: 63 6c 75 64 65 20 61 64 64 69 74 69 6f 6e 61 6c  clude additional
f000: 20 65 72 72 6f 72 20 63 6f 64 65 73 20 69 6e 20   error codes in 
f010: 74 68 65 20 73 65 74 20 74 68 61 74 20 73 68 6f  the set that sho
f020: 75 6c 64 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  uld.** result in
f030: 20 74 68 65 20 66 61 69 6c 69 6e 67 20 49 2f 4f   the failing I/O
f040: 20 6f 70 65 72 61 74 69 6f 6e 20 62 65 69 6e 67   operation being
f050: 20 72 65 74 72 69 65 64 20 62 79 20 74 68 65 20   retried by the 
f060: 63 61 6c 6c 65 72 2e 20 20 49 66 0a 2a 2a 20 64  caller.  If.** d
f070: 65 66 69 6e 65 64 2c 20 74 68 65 20 22 77 69 6e  efined, the "win
f080: 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32 22 20  IoerrCanRetry2" 
f090: 6d 61 63 72 6f 20 6d 75 73 74 20 65 78 68 69 62  macro must exhib
f0a0: 69 74 20 65 78 74 65 72 6e 61 6c 20 73 65 6d 61  it external sema
f0b0: 6e 74 69 63 73 0a 2a 2a 20 69 64 65 6e 74 69 63  ntics.** identic
f0c0: 61 6c 20 74 6f 20 74 68 6f 73 65 20 6f 66 20 74  al to those of t
f0d0: 68 65 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52  he "winIoerrCanR
f0e0: 65 74 72 79 31 22 20 6d 61 63 72 6f 2e 0a 2a 2f  etry1" macro..*/
f0f0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 77 69  .#if !defined(wi
f100: 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 29  nIoerrCanRetry1)
f110: 0a 23 64 65 66 69 6e 65 20 77 69 6e 49 6f 65 72  .#define winIoer
f120: 72 43 61 6e 52 65 74 72 79 31 28 61 29 20 28 28  rCanRetry1(a) ((
f130: 28 61 29 3d 3d 45 52 52 4f 52 5f 41 43 43 45 53  (a)==ERROR_ACCES
f140: 53 5f 44 45 4e 49 45 44 29 20 20 20 20 20 20 20  S_DENIED)       
f150: 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20   || \.          
f160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f170: 20 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f      ((a)==ERROR_
f180: 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f  SHARING_VIOLATIO
f190: 4e 29 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20  N)    || \.     
f1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1b0: 20 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45           ((a)==E
f1c0: 52 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54  RROR_LOCK_VIOLAT
f1d0: 49 4f 4e 29 20 20 20 20 20 20 20 7c 7c 20 5c 0a  ION)       || \.
f1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
f200: 61 29 3d 3d 45 52 52 4f 52 5f 44 45 56 5f 4e 4f  a)==ERROR_DEV_NO
f210: 54 5f 45 58 49 53 54 29 20 20 20 20 20 20 20 20  T_EXIST)        
f220: 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  || \.           
f230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f240: 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 4e     ((a)==ERROR_N
f250: 45 54 4e 41 4d 45 5f 44 45 4c 45 54 45 44 29 20  ETNAME_DELETED) 
f260: 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20       || \.      
f270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f280: 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52          ((a)==ER
f290: 52 4f 52 5f 53 45 4d 5f 54 49 4d 45 4f 55 54 29  ROR_SEM_TIMEOUT)
f2a0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20            || \. 
f2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 61               ((a
f2d0: 29 3d 3d 45 52 52 4f 52 5f 4e 45 54 57 4f 52 4b  )==ERROR_NETWORK
f2e0: 5f 55 4e 52 45 41 43 48 41 42 4c 45 29 29 0a 23  _UNREACHABLE)).#
f2f0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
f300: 61 20 52 65 61 64 46 69 6c 65 28 29 20 6f 72 20  a ReadFile() or 
f310: 57 72 69 74 65 46 69 6c 65 28 29 20 65 72 72 6f  WriteFile() erro
f320: 72 20 6f 63 63 75 72 73 2c 20 69 6e 76 6f 6b 65  r occurs, invoke
f330: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
f340: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 73 68   to see if it sh
f350: 6f 75 6c 64 20 62 65 20 72 65 74 72 69 65 64 2e  ould be retried.
f360: 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 74 6f    Return TRUE to
f370: 20 72 65 74 72 79 2e 20 20 52 65 74 75 72 6e 20   retry.  Return 
f380: 46 41 4c 53 45 0a 2a 2a 20 74 6f 20 67 69 76 65  FALSE.** to give
f390: 20 75 70 20 77 69 74 68 20 61 6e 20 65 72 72 6f   up with an erro
f3a0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
f3b0: 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 69   winRetryIoerr(i
f3c0: 6e 74 20 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f  nt *pnRetry, DWO
f3d0: 52 44 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44  RD *pError){.  D
f3e0: 57 4f 52 44 20 65 20 3d 20 6f 73 47 65 74 4c 61  WORD e = osGetLa
f3f0: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 28  stError();.  if(
f400: 20 2a 70 6e 52 65 74 72 79 3e 3d 77 69 6e 49 6f   *pnRetry>=winIo
f410: 65 72 72 52 65 74 72 79 20 29 7b 0a 20 20 20 20  errRetry ){.    
f420: 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20  if( pError ){.  
f430: 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b      *pError = e;
f440: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
f450: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77  n 0;.  }.  if( w
f460: 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31  inIoerrCanRetry1
f470: 28 65 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  (e) ){.    sqlit
f480: 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 77  e3_win32_sleep(w
f490: 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  inIoerrRetryDela
f4a0: 79 2a 28 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b  y*(1+*pnRetry));
f4b0: 0a 20 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b  .    ++*pnRetry;
f4c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
f4d0: 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 77   }.#if defined(w
f4e0: 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32  inIoerrCanRetry2
f4f0: 29 0a 20 20 65 6c 73 65 20 69 66 28 20 77 69 6e  ).  else if( win
f500: 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32 28 65  IoerrCanRetry2(e
f510: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
f520: 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 77 69 6e  _win32_sleep(win
f530: 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a  IoerrRetryDelay*
f540: 28 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a 20  (1+*pnRetry));. 
f550: 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a 20     ++*pnRetry;. 
f560: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
f570: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 45  .#endif.  if( pE
f580: 72 72 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45 72  rror ){.    *pEr
f590: 72 6f 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72  ror = e;.  }.  r
f5a0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
f5b0: 2a 20 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f  * Log a I/O erro
f5c0: 72 20 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e  r retry episode.
f5d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f5e0: 77 69 6e 4c 6f 67 49 6f 65 72 72 28 69 6e 74 20  winLogIoerr(int 
f5f0: 6e 52 65 74 72 79 29 7b 0a 20 20 69 66 28 20 6e  nRetry){.  if( n
f600: 52 65 74 72 79 20 29 7b 0a 20 20 20 20 73 71 6c  Retry ){.    sql
f610: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
f620: 49 4f 45 52 52 2c 0a 20 20 20 20 20 20 22 64 65  IOERR,.      "de
f630: 6c 61 79 65 64 20 25 64 6d 73 20 66 6f 72 20 6c  layed %dms for l
f640: 6f 63 6b 2f 73 68 61 72 69 6e 67 20 63 6f 6e 66  ock/sharing conf
f650: 6c 69 63 74 22 2c 0a 20 20 20 20 20 20 77 69 6e  lict",.      win
f660: 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a  IoerrRetryDelay*
f670: 6e 52 65 74 72 79 2a 28 6e 52 65 74 72 79 2b 31  nRetry*(nRetry+1
f680: 29 2f 32 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d  )/2.    );.  }.}
f690: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
f6a0: 57 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  WINCE./*********
f6b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f6c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f6d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f6e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f6f0: 0a 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e  .** This section
f700: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 66   contains code f
f710: 6f 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a  or WinCE only..*
f720: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
f730: 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c  QLITE_MSVC_LOCAL
f740: 54 49 4d 45 5f 41 50 49 29 20 7c 7c 20 21 53 51  TIME_API) || !SQ
f750: 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54  LITE_MSVC_LOCALT
f760: 49 4d 45 5f 41 50 49 0a 2f 2a 0a 2a 2a 20 54 68  IME_API./*.** Th
f770: 65 20 4d 53 56 43 20 43 52 54 20 6f 6e 20 57 69  e MSVC CRT on Wi
f780: 6e 64 6f 77 73 20 43 45 20 6d 61 79 20 6e 6f 74  ndows CE may not
f790: 20 68 61 76 65 20 61 20 6c 6f 63 61 6c 74 69 6d   have a localtim
f7a0: 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53  e() function.  S
f7b0: 6f 0a 2a 2a 20 63 72 65 61 74 65 20 61 20 73 75  o.** create a su
f7c0: 62 73 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 69 6e  bstitute..*/.#in
f7d0: 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73  clude <time.h>.s
f7e0: 74 72 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65 63  truct tm *__cdec
f7f0: 6c 20 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e 73  l localtime(cons
f800: 74 20 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20  t time_t *t).{. 
f810: 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 74   static struct t
f820: 6d 20 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45 20  m y;.  FILETIME 
f830: 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53 54  uTm, lTm;.  SYST
f840: 45 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 20 73 71  EMTIME pTm;.  sq
f850: 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 36 34 3b  lite3_int64 t64;
f860: 0a 20 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20 74  .  t64 = *t;.  t
f870: 36 34 20 3d 20 28 74 36 34 20 2b 20 31 31 36 34  64 = (t64 + 1164
f880: 34 34 37 33 36 30 30 29 2a 31 30 30 30 30 30 30  4473600)*1000000
f890: 30 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44 61  0;.  uTm.dwLowDa
f8a0: 74 65 54 69 6d 65 20 3d 20 28 44 57 4f 52 44 29  teTime = (DWORD)
f8b0: 28 74 36 34 20 26 20 30 78 46 46 46 46 46 46 46  (t64 & 0xFFFFFFF
f8c0: 46 29 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67 68  F);.  uTm.dwHigh
f8d0: 44 61 74 65 54 69 6d 65 3d 20 28 44 57 4f 52 44  DateTime= (DWORD
f8e0: 29 28 74 36 34 20 3e 3e 20 33 32 29 3b 0a 20 20  )(t64 >> 32);.  
f8f0: 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61  osFileTimeToLoca
f900: 6c 46 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c 26  lFileTime(&uTm,&
f910: 6c 54 6d 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69  lTm);.  osFileTi
f920: 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28 26  meToSystemTime(&
f930: 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e 74  lTm,&pTm);.  y.t
f940: 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59 65  m_year = pTm.wYe
f950: 61 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e 74  ar - 1900;.  y.t
f960: 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e  m_mon = pTm.wMon
f970: 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f 77  th - 1;.  y.tm_w
f980: 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f 66  day = pTm.wDayOf
f990: 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61  Week;.  y.tm_mda
f9a0: 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20 20  y = pTm.wDay;.  
f9b0: 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e  y.tm_hour = pTm.
f9c0: 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69  wHour;.  y.tm_mi
f9d0: 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b  n = pTm.wMinute;
f9e0: 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54  .  y.tm_sec = pT
f9f0: 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65 74  m.wSecond;.  ret
fa00: 75 72 6e 20 26 79 3b 0a 7d 0a 23 65 6e 64 69 66  urn &y;.}.#endif
fa10: 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45  ..#define HANDLE
fa20: 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28  _TO_WINFILE(a) (
fa30: 77 69 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72  winFile*)&((char
fa40: 2a 29 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65  *)a)[-(int)offse
fa50: 74 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a  tof(winFile,h)].
fa60: 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
fa70: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e   lock on the han
fa80: 64 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20  dle h.*/.static 
fa90: 76 6f 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41  void winceMutexA
faa0: 63 71 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29  cquire(HANDLE h)
fab0: 7b 0a 20 20 20 44 57 4f 52 44 20 64 77 45 72 72  {.   DWORD dwErr
fac0: 3b 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64  ;.   do {.     d
fad0: 77 45 72 72 20 3d 20 6f 73 57 61 69 74 46 6f 72  wErr = osWaitFor
fae0: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c 20  SingleObject(h, 
faf0: 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d 20  INFINITE);.   } 
fb00: 77 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d 20  while (dwErr != 
fb10: 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26 26  WAIT_OBJECT_0 &&
fb20: 20 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f 41   dwErr != WAIT_A
fb30: 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a  BANDONED);.}./*.
fb40: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63  ** Release a loc
fb50: 6b 20 61 63 71 75 69 72 65 64 20 62 79 20 77 69  k acquired by wi
fb60: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
fb70: 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e  ).*/.#define win
fb80: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 68  ceMutexRelease(h
fb90: 29 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28 68  ) ReleaseMutex(h
fba0: 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  )../*.** Create 
fbb0: 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73 68  the mutex and sh
fbc0: 61 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65 64  ared memory used
fbd0: 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e 20   for locking in 
fbe0: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  the file.** desc
fbf0: 72 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a  riptor pFile.*/.
fc00: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 63 65  static int wince
fc10: 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74  CreateLock(const
fc20: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
fc30: 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  , winFile *pFile
fc40: 29 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f 6b  ){.  LPWSTR zTok
fc50: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d 65  ;.  LPWSTR zName
fc60: 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
fc70: 72 6e 6f 3b 0a 20 20 42 4f 4f 4c 20 62 4c 6f 67  rno;.  BOOL bLog
fc80: 67 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 42  ged = FALSE;.  B
fc90: 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52 55 45  OOL bInit = TRUE
fca0: 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 77 69 6e  ;..  zName = win
fcb0: 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46  Utf8ToUnicode(zF
fcc0: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
fcd0: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
fce0: 2f 2a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  /* out of memory
fcf0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
fd00: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
fd10: 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  M;.  }..  /* Ini
fd20: 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 61  tialize the loca
fd30: 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20 20  l lockdata */.  
fd40: 6d 65 6d 73 65 74 28 26 70 46 69 6c 65 2d 3e 6c  memset(&pFile->l
fd50: 6f 63 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ocal, 0, sizeof(
fd60: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a  pFile->local));.
fd70: 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68  .  /* Replace th
fd80: 65 20 62 61 63 6b 73 6c 61 73 68 65 73 20 66 72  e backslashes fr
fd90: 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  om the filename 
fda0: 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 69 74  and lowercase it
fdb0: 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69 76 65 20  .  ** to derive 
fdc0: 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a 2f  a mutex name. */
fdd0: 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73 43 68 61 72  .  zTok = osChar
fde0: 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20  LowerW(zName);. 
fdf0: 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f   for (;*zTok;zTo
fe00: 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a 7a  k++){.    if (*z
fe10: 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54  Tok == '\\') *zT
fe20: 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20  ok = '_';.  }.. 
fe30: 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e 20   /* Create/open 
fe40: 74 68 65 20 6e 61 6d 65 64 20 6d 75 74 65 78 20  the named mutex 
fe50: 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74  */.  pFile->hMut
fe60: 65 78 20 3d 20 6f 73 43 72 65 61 74 65 4d 75 74  ex = osCreateMut
fe70: 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c  exW(NULL, FALSE,
fe80: 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28 21   zName);.  if (!
fe90: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a  pFile->hMutex){.
fea0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
feb0: 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
fec0: 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 73 71 6c  Error();.    sql
fed0: 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29  ite3_free(zName)
fee0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
fef0: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
ff00: 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61  IOERR, pFile->la
ff10: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
ff20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff30: 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b  "winceCreateLock
ff40: 31 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  1", zFilename);.
ff50: 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
ff60: 65 20 74 68 65 20 6d 75 74 65 78 20 62 65 66 6f  e the mutex befo
ff70: 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 20 2a 2f  re continuing */
ff80: 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  .  winceMutexAcq
ff90: 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
ffa0: 65 78 29 3b 0a 0a 20 20 2f 2a 20 53 69 6e 63 65  ex);..  /* Since
ffb0: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6e 61   the names of na
ffc0: 6d 65 64 20 6d 75 74 65 78 65 73 2c 20 73 65 6d  med mutexes, sem
ffd0: 61 70 68 6f 72 65 73 2c 20 66 69 6c 65 20 6d 61  aphores, file ma
ffe0: 70 70 69 6e 67 73 20 65 74 63 20 61 72 65 0a 20  ppings etc are. 
fff0: 20 2a 2a 20 63 61 73 65 2d 73 65 6e 73 69 74 69   ** case-sensiti
10000 76 65 2c 20 74 61 6b 65 20 61 64 76 61 6e 74 61  ve, take advanta
10010 67 65 20 6f 66 20 74 68 61 74 20 62 79 20 75 70  ge of that by up
10020 70 65 72 63 61 73 69 6e 67 20 74 68 65 20 6d 75  percasing the mu
10030 74 65 78 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e  tex name.  ** an
10040 64 20 75 73 69 6e 67 20 74 68 61 74 20 61 73 20  d using that as 
10050 74 68 65 20 73 68 61 72 65 64 20 66 69 6c 65 6d  the shared filem
10060 61 70 70 69 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a  apping name..  *
10070 2f 0a 20 20 6f 73 43 68 61 72 55 70 70 65 72 57  /.  osCharUpperW
10080 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65  (zName);.  pFile
10090 2d 3e 68 53 68 61 72 65 64 20 3d 20 6f 73 43 72  ->hShared = osCr
100a0 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
100b0 28 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  (INVALID_HANDLE_
100c0 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20  VALUE, NULL,.   
100d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100f0 20 20 20 20 20 50 41 47 45 5f 52 45 41 44 57 52       PAGE_READWR
10100 49 54 45 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  ITE, 0, sizeof(w
10110 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20  inceLock),.     
10120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10140 20 20 20 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a     zName);..  /*
10150 20 53 65 74 20 61 20 66 6c 61 67 20 74 68 61 74   Set a flag that
10160 20 69 6e 64 69 63 61 74 65 73 20 77 65 27 72 65   indicates we're
10170 20 74 68 65 20 66 69 72 73 74 20 74 6f 20 63 72   the first to cr
10180 65 61 74 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  eate the memory 
10190 73 6f 20 69 74 0a 20 20 2a 2a 20 6d 75 73 74 20  so it.  ** must 
101a0 62 65 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c 69  be zero-initiali
101b0 7a 65 64 20 2a 2f 0a 20 20 6c 61 73 74 45 72 72  zed */.  lastErr
101c0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
101d0 72 6f 72 28 29 3b 0a 20 20 69 66 20 28 6c 61 73  ror();.  if (las
101e0 74 45 72 72 6e 6f 20 3d 3d 20 45 52 52 4f 52 5f  tErrno == ERROR_
101f0 41 4c 52 45 41 44 59 5f 45 58 49 53 54 53 29 7b  ALREADY_EXISTS){
10200 0a 20 20 20 20 62 49 6e 69 74 20 3d 20 46 41 4c  .    bInit = FAL
10210 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  SE;.  }..  sqlit
10220 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  e3_free(zName);.
10230 0a 20 20 2f 2a 20 49 66 20 77 65 20 73 75 63 63  .  /* If we succ
10240 65 65 64 65 64 20 69 6e 20 6d 61 6b 69 6e 67 20  eeded in making 
10250 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
10260 79 20 68 61 6e 64 6c 65 2c 20 6d 61 70 20 69 74  y handle, map it
10270 2e 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  . */.  if( pFile
10280 2d 3e 68 53 68 61 72 65 64 20 29 7b 0a 20 20 20  ->hShared ){.   
10290 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 3d   pFile->shared =
102a0 20 28 77 69 6e 63 65 4c 6f 63 6b 2a 29 6f 73 4d   (winceLock*)osM
102b0 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69  apViewOfFile(pFi
102c0 6c 65 2d 3e 68 53 68 61 72 65 64 2c 0a 20 20 20  le->hShared,.   
102d0 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 4d            FILE_M
102e0 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f 4d 41 50  AP_READ|FILE_MAP
102f0 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c 20 73 69  _WRITE, 0, 0, si
10300 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29  zeof(winceLock))
10310 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d 61 70 70  ;.    /* If mapp
10320 69 6e 67 20 66 61 69 6c 65 64 2c 20 63 6c 6f 73  ing failed, clos
10330 65 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  e the shared mem
10340 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e 64 20 65  ory handle and e
10350 72 61 73 65 20 69 74 20 2a 2f 0a 20 20 20 20 69  rase it */.    i
10360 66 28 20 21 70 46 69 6c 65 2d 3e 73 68 61 72 65  f( !pFile->share
10370 64 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  d ){.      pFile
10380 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
10390 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
103a0 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f        winLogErro
103b0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  r(SQLITE_IOERR, 
103c0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
103d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
103e0 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74 65      "winceCreate
103f0 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c 65 6e 61 6d  Lock2", zFilenam
10400 65 29 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67 65  e);.      bLogge
10410 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  d = TRUE;.      
10420 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
10430 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 20  ile->hShared);. 
10440 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 53 68 61       pFile->hSha
10450 72 65 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  red = NULL;.    
10460 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73  }.  }..  /* If s
10470 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 75  hared memory cou
10480 6c 64 20 6e 6f 74 20 62 65 20 63 72 65 61 74 65  ld not be create
10490 64 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68  d, then close th
104a0 65 20 6d 75 74 65 78 20 61 6e 64 20 66 61 69 6c  e mutex and fail
104b0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
104c0 3e 68 53 68 61 72 65 64 3d 3d 4e 55 4c 4c 20 29  >hShared==NULL )
104d0 7b 0a 20 20 20 20 69 66 28 20 21 62 4c 6f 67 67  {.    if( !bLogg
104e0 65 64 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ed ){.      pFil
104f0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
10500 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
10510 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
10520 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d  TE_IOERR, pFile-
10530 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
10540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
10550 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 33 22  inceCreateLock3"
10560 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
10570 20 20 20 20 62 4c 6f 67 67 65 64 20 3d 20 54 52      bLogged = TR
10580 55 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 69  UE;.    }.    wi
10590 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
105a0 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
105b0 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
105c0 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
105d0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75  ;.    pFile->hMu
105e0 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  tex = NULL;.    
105f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
10600 45 52 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ERR;.  }..  /* I
10610 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 68  nitialize the sh
10620 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 66 20 77  ared memory if w
10630 65 27 72 65 20 73 75 70 70 6f 73 65 64 20 74 6f  e're supposed to
10640 20 2a 2f 0a 20 20 69 66 28 20 62 49 6e 69 74 20   */.  if( bInit 
10650 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 46  ){.    memset(pF
10660 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20 30 2c 20  ile->shared, 0, 
10670 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b  sizeof(winceLock
10680 29 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65  ));.  }..  wince
10690 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
106a0 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72  le->hMutex);.  r
106b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
106c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f  .}../*.** Destro
106d0 79 20 74 68 65 20 70 61 72 74 20 6f 66 20 77 69  y the part of wi
106e0 6e 46 69 6c 65 20 74 68 61 74 20 64 65 61 6c 73  nFile that deals
106f0 20 77 69 74 68 20 77 69 6e 63 65 20 6c 6f 63 6b   with wince lock
10700 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
10710 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63   winceDestroyLoc
10720 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  k(winFile *pFile
10730 29 7b 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  ){.  if (pFile->
10740 68 4d 75 74 65 78 29 7b 0a 20 20 20 20 2f 2a 20  hMutex){.    /* 
10750 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 65  Acquire the mute
10760 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75  x */.    winceMu
10770 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65  texAcquire(pFile
10780 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20  ->hMutex);..    
10790 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
107a0 20 62 6c 6f 63 6b 73 20 73 68 6f 75 6c 64 20 70   blocks should p
107b0 72 6f 62 61 62 6c 79 20 61 73 73 65 72 74 20 69  robably assert i
107c0 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 62 75  n debug mode, bu
107d0 74 20 74 68 65 79 0a 20 20 20 20 20 20 20 61 72  t they.       ar
107e0 65 20 74 6f 20 63 6c 65 61 6e 75 70 20 69 6e 20  e to cleanup in 
107f0 63 61 73 65 20 61 6e 79 20 6c 6f 63 6b 73 20 72  case any locks r
10800 65 6d 61 69 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a  emained open */.
10810 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
10820 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a  ocal.nReaders){.
10830 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
10840 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d  red->nReaders --
10850 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
10860 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65  pFile->local.bRe
10870 73 65 72 76 65 64 29 7b 0a 20 20 20 20 20 20 70  served){.      p
10880 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52  File->shared->bR
10890 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b  eserved = FALSE;
108a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70  .    }.    if (p
108b0 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e  File->local.bPen
108c0 64 69 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69  ding){.      pFi
108d0 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e  le->shared->bPen
108e0 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20  ding = FALSE;.  
108f0 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c    }.    if (pFil
10900 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73  e->local.bExclus
10910 69 76 65 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ive){.      pFil
10920 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c  e->shared->bExcl
10930 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20  usive = FALSE;. 
10940 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 2d     }..    /* De-
10950 72 65 66 65 72 65 6e 63 65 20 61 6e 64 20 63 6c  reference and cl
10960 6f 73 65 20 6f 75 72 20 63 6f 70 79 20 6f 66 20  ose our copy of 
10970 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
10980 79 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20  y handle */.    
10990 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c  osUnmapViewOfFil
109a0 65 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 29  e(pFile->shared)
109b0 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e  ;.    osCloseHan
109c0 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72  dle(pFile->hShar
109d0 65 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 6e  ed);..    /* Don
109e0 65 20 77 69 74 68 20 74 68 65 20 6d 75 74 65 78  e with the mutex
109f0 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74   */.    winceMut
10a00 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d  exRelease(pFile-
10a10 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 6f 73  >hMutex);.    os
10a20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
10a30 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20  e->hMutex);.    
10a40 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20  pFile->hMutex = 
10a50 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  NULL;.  }.}../*.
10a60 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  ** An implementa
10a70 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b  tion of the Lock
10a80 46 69 6c 65 28 29 20 41 50 49 20 6f 66 20 57 69  File() API of Wi
10a90 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a  ndows for CE.*/.
10aa0 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63  static BOOL winc
10ab0 65 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48  eLockFile(.  LPH
10ac0 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20  ANDLE phFile,.  
10ad0 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73  DWORD dwFileOffs
10ae0 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64  etLow,.  DWORD d
10af0 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c  wFileOffsetHigh,
10b00 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
10b10 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77  OfBytesToLockLow
10b20 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65  ,.  DWORD nNumbe
10b30 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69  rOfBytesToLockHi
10b40 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  gh.){.  winFile 
10b50 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f  *pFile = HANDLE_
10b60 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c  TO_WINFILE(phFil
10b70 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75  e);.  BOOL bRetu
10b80 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55  rn = FALSE;..  U
10b90 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
10ba0 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68  dwFileOffsetHigh
10bb0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
10bc0 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42  METER(nNumberOfB
10bd0 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b  ytesToLockHigh);
10be0 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e  ..  if (!pFile->
10bf0 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20 54  hMutex) return T
10c00 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65  RUE;.  winceMute
10c10 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e  xAcquire(pFile->
10c20 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 57  hMutex);..  /* W
10c30 61 6e 74 69 6e 67 20 61 6e 20 65 78 63 6c 75 73  anting an exclus
10c40 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69  ive lock? */.  i
10c50 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
10c60 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41  ow == (DWORD)SHA
10c70 52 45 44 5f 46 49 52 53 54 0a 20 20 20 20 20 20  RED_FIRST.      
10c80 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74   && nNumberOfByt
10c90 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28  esToLockLow == (
10ca0 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a  DWORD)SHARED_SIZ
10cb0 45 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  E){.    if (pFil
10cc0 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64  e->shared->nRead
10cd0 65 72 73 20 3d 3d 20 30 20 26 26 20 70 46 69 6c  ers == 0 && pFil
10ce0 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c  e->shared->bExcl
10cf0 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20  usive == 0){.   
10d00 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
10d10 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20  d->bExclusive = 
10d20 54 52 55 45 3b 0a 20 20 20 20 20 20 20 70 46 69  TRUE;.       pFi
10d30 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75  le->local.bExclu
10d40 73 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20  sive = TRUE;.   
10d50 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
10d60 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
10d70 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 61 64 2d   /* Want a read-
10d80 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  only lock? */.  
10d90 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f  else if (dwFileO
10da0 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
10db0 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 20  RD)SHARED_FIRST 
10dc0 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 6e 4e  &&.           nN
10dd0 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
10de0 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20  ckLow == 1){.   
10df0 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72   if (pFile->shar
10e00 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
10e10 3d 20 30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  = 0){.      pFil
10e20 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
10e30 73 20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 28  s ++;.      if (
10e40 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
10e50 61 64 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20  aders == 1){.   
10e60 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
10e70 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b  ed->nReaders ++;
10e80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
10e90 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
10ea0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
10eb0 61 6e 74 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f  ant a pending lo
10ec0 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ck? */.  else if
10ed0 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
10ee0 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44  w == (DWORD)PEND
10ef0 49 4e 47 5f 42 59 54 45 0a 20 20 20 20 20 20 20  ING_BYTE.       
10f00 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66      && nNumberOf
10f10 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d  BytesToLockLow =
10f20 3d 20 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  = 1){.    /* If 
10f30 6e 6f 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20  no pending lock 
10f40 68 61 73 20 62 65 65 6e 20 61 63 71 75 69 72 65  has been acquire
10f50 64 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20  d, then acquire 
10f60 69 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46  it */.    if (pF
10f70 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65  ile->shared->bPe
10f80 6e 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20 20  nding == 0) {.  
10f90 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
10fa0 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52  d->bPending = TR
10fb0 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  UE;.      pFile-
10fc0 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20  >local.bPending 
10fd0 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52  = TRUE;.      bR
10fe0 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
10ff0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61    }.  }..  /* Wa
11000 6e 74 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  nt a reserved lo
11010 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ck? */.  else if
11020 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
11030 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45  w == (DWORD)RESE
11040 52 56 45 44 5f 42 59 54 45 0a 20 20 20 20 20 20  RVED_BYTE.      
11050 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f       && nNumberO
11060 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
11070 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70  == 1){.    if (p
11080 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52  File->shared->bR
11090 65 73 65 72 76 65 64 20 3d 3d 20 30 29 20 7b 0a  eserved == 0) {.
110a0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
110b0 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d  red->bReserved =
110c0 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69   TRUE;.      pFi
110d0 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
110e0 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ved = TRUE;.    
110f0 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
11100 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77  ;.    }.  }..  w
11110 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
11120 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
11130 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74 75 72  .  return bRetur
11140 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  n;.}../*.** An i
11150 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
11160 20 74 68 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 20   the UnlockFile 
11170 41 50 49 20 6f 66 20 57 69 6e 64 6f 77 73 20 66  API of Windows f
11180 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20  or CE.*/.static 
11190 42 4f 4f 4c 20 77 69 6e 63 65 55 6e 6c 6f 63 6b  BOOL winceUnlock
111a0 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45  File(.  LPHANDLE
111b0 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44   phFile,.  DWORD
111c0 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77   dwFileOffsetLow
111d0 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65  ,.  DWORD dwFile
111e0 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57  OffsetHigh,.  DW
111f0 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ORD nNumberOfByt
11200 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20  esToUnlockLow,. 
11210 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66   DWORD nNumberOf
11220 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67  BytesToUnlockHig
11230 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  h.){.  winFile *
11240 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54  pFile = HANDLE_T
11250 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65  O_WINFILE(phFile
11260 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72  );.  BOOL bRetur
11270 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e  n = FALSE;..  UN
11280 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
11290 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29  wFileOffsetHigh)
112a0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
112b0 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79  ETER(nNumberOfBy
112c0 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 29  tesToUnlockHigh)
112d0 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d  ;..  if (!pFile-
112e0 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20  >hMutex) return 
112f0 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74  TRUE;.  winceMut
11300 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d  exAcquire(pFile-
11310 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  >hMutex);..  /* 
11320 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65 61 64  Releasing a read
11330 65 72 20 6c 6f 63 6b 20 6f 72 20 61 6e 20 65 78  er lock or an ex
11340 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a  clusive lock */.
11350 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73    if (dwFileOffs
11360 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
11370 53 48 41 52 45 44 5f 46 49 52 53 54 29 7b 0a 20  SHARED_FIRST){. 
11380 20 20 20 2f 2a 20 44 69 64 20 77 65 20 68 61 76     /* Did we hav
11390 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  e an exclusive l
113a0 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 69 66 20 28  ock? */.    if (
113b0 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78  pFile->local.bEx
113c0 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20  clusive){.      
113d0 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66  assert(nNumberOf
113e0 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
113f0 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
11400 44 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 70  D_SIZE);.      p
11410 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63  File->local.bExc
11420 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a  lusive = FALSE;.
11430 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
11440 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
11450 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62  = FALSE;.      b
11460 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
11470 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 64     }..    /* Did
11480 20 77 65 20 6a 75 73 74 20 68 61 76 65 20 61 20   we just have a 
11490 72 65 61 64 65 72 20 6c 6f 63 6b 3f 20 2a 2f 0a  reader lock? */.
114a0 20 20 20 20 65 6c 73 65 20 69 66 20 28 70 46 69      else if (pFi
114b0 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
114c0 72 73 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  rs){.      asser
114d0 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  t(nNumberOfBytes
114e0 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28  ToUnlockLow == (
114f0 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a  DWORD)SHARED_SIZ
11500 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  E.             |
11510 7c 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  | nNumberOfBytes
11520 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  ToUnlockLow == 1
11530 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
11540 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d  local.nReaders -
11550 2d 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46 69  -;.      if (pFi
11560 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
11570 72 73 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b  rs == 0).      {
11580 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
11590 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73  shared->nReaders
115a0 20 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   --;.      }.   
115b0 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
115c0 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
115d0 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 70  /* Releasing a p
115e0 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20  ending lock */. 
115f0 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65   else if (dwFile
11600 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
11610 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45  ORD)PENDING_BYTE
11620 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e  .           && n
11630 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
11640 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  nlockLow == 1){.
11650 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
11660 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a  ocal.bPending){.
11670 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
11680 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41  al.bPending = FA
11690 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  LSE;.      pFile
116a0 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69  ->shared->bPendi
116b0 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ng = FALSE;.    
116c0 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
116d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  ;.    }.  }.  /*
116e0 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65 73   Releasing a res
116f0 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20  erved lock */.  
11700 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f  else if (dwFileO
11710 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
11720 52 44 29 52 45 53 45 52 56 45 44 5f 42 59 54 45  RD)RESERVED_BYTE
11730 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e  .           && n
11740 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
11750 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  nlockLow == 1){.
11760 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
11770 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29 20  ocal.bReserved) 
11780 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
11790 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d  ocal.bReserved =
117a0 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46   FALSE;.      pF
117b0 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65  ile->shared->bRe
117c0 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a  served = FALSE;.
117d0 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
117e0 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
117f0 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c  .  winceMutexRel
11800 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
11810 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52  ex);.  return bR
11820 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45  eturn;.}./*.** E
11830 6e 64 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  nd of the specia
11840 6c 20 63 6f 64 65 20 66 6f 72 20 77 69 6e 63 65  l code for wince
11850 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
11860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
118a0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
118b0 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a  _OS_WINCE */../*
118c0 0a 2a 2a 20 4c 6f 63 6b 20 61 20 66 69 6c 65 20  .** Lock a file 
118d0 72 65 67 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  region..*/.stati
118e0 63 20 42 4f 4f 4c 20 77 69 6e 4c 6f 63 6b 46 69  c BOOL winLockFi
118f0 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70  le(.  LPHANDLE p
11900 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 66  hFile,.  DWORD f
11910 6c 61 67 73 2c 0a 20 20 44 57 4f 52 44 20 6f 66  lags,.  DWORD of
11920 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  fsetLow,.  DWORD
11930 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44   offsetHigh,.  D
11940 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77  WORD numBytesLow
11950 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74  ,.  DWORD numByt
11960 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51  esHigh.){.#if SQ
11970 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
11980 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69  /*.  ** NOTE: Wi
11990 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64  ndows CE is hand
119a0 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  led differently 
119b0 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63  here due its lac
119c0 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20  k of the Win32. 
119d0 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f   **       API Lo
119e0 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72  ckFile..  */.  r
119f0 65 74 75 72 6e 20 77 69 6e 63 65 4c 6f 63 6b 46  eturn winceLockF
11a00 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66 66 73  ile(phFile, offs
11a10 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67  etLow, offsetHig
11a20 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h,.             
11a30 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74            numByt
11a40 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48  esLow, numBytesH
11a50 69 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66  igh);.#else.  if
11a60 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20  ( osIsNT() ){.  
11a70 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c    OVERLAPPED ovl
11a80 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f  p;.    memset(&o
11a90 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f  vlp, 0, sizeof(O
11aa0 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20  VERLAPPED));.   
11ab0 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f   ovlp.Offset = o
11ac0 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76  ffsetLow;.    ov
11ad0 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20  lp.OffsetHigh = 
11ae0 6f 66 66 73 65 74 48 69 67 68 3b 0a 20 20 20 20  offsetHigh;.    
11af0 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c  return osLockFil
11b00 65 45 78 28 2a 70 68 46 69 6c 65 2c 20 66 6c 61  eEx(*phFile, fla
11b10 67 73 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c  gs, 0, numBytesL
11b20 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68  ow, numBytesHigh
11b30 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73  , &ovlp);.  }els
11b40 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  e{.    return os
11b50 4c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65  LockFile(*phFile
11b60 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66  , offsetLow, off
11b70 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65  setHigh, numByte
11b80 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  sLow,.          
11b90 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42              numB
11ba0 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23  ytesHigh);.  }.#
11bb0 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  endif.}../*.** U
11bc0 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67  nlock a file reg
11bd0 69 6f 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ion.. */.static 
11be0 42 4f 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  BOOL winUnlockFi
11bf0 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70  le(.  LPHANDLE p
11c00 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 6f  hFile,.  DWORD o
11c10 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52  ffsetLow,.  DWOR
11c20 44 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20  D offsetHigh,.  
11c30 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f  DWORD numBytesLo
11c40 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79  w,.  DWORD numBy
11c50 74 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53  tesHigh.){.#if S
11c60 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
11c70 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57   /*.  ** NOTE: W
11c80 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e  indows CE is han
11c90 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  dled differently
11ca0 20 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61   here due its la
11cb0 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a  ck of the Win32.
11cc0 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 55    **       API U
11cd0 6e 6c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a  nlockFile..  */.
11ce0 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65 55 6e    return winceUn
11cf0 6c 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c  lockFile(phFile,
11d00 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73   offsetLow, offs
11d10 65 74 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20  etHigh,.        
11d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d30 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75   numBytesLow, nu
11d40 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 23 65 6c  mBytesHigh);.#el
11d50 73 65 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28  se.  if( osIsNT(
11d60 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50  ) ){.    OVERLAP
11d70 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65  PED ovlp;.    me
11d80 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73  mset(&ovlp, 0, s
11d90 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44  izeof(OVERLAPPED
11da0 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66  ));.    ovlp.Off
11db0 73 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b  set = offsetLow;
11dc0 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74  .    ovlp.Offset
11dd0 48 69 67 68 20 3d 20 6f 66 66 73 65 74 48 69 67  High = offsetHig
11de0 68 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  h;.    return os
11df0 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68  UnlockFileEx(*ph
11e00 46 69 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74 65  File, 0, numByte
11e10 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69  sLow, numBytesHi
11e20 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65  gh, &ovlp);.  }e
11e30 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
11e40 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a 70 68  osUnlockFile(*ph
11e50 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c  File, offsetLow,
11e60 20 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d   offsetHigh, num
11e70 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20  BytesLow,.      
11e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e90 20 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b    numBytesHigh);
11ea0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
11eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
11f00 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20   The next group 
11f10 6f 66 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c  of routines impl
11f20 65 6d 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d 65  ement the I/O me
11f30 74 68 6f 64 73 20 73 70 65 63 69 66 69 65 64 0a  thods specified.
11f40 2a 2a 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  ** by the sqlite
11f50 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
11f60 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ect..***********
11f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11fb0 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  ***/../*.** Some
11fc0 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69   Microsoft compi
11fd0 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64  lers lack this d
11fe0 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  efinition..*/.#i
11ff0 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45  fndef INVALID_SE
12000 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23  T_FILE_POINTER.#
12010 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f   define INVALID_
12020 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
12030 20 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e   ((DWORD)-1).#en
12040 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  dif../*.** Move 
12050 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69  the current posi
12060 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65  tion of the file
12070 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61   handle passed a
12080 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61  s the first.** a
12090 72 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73 65  rgument to offse
120a0 74 20 69 4f 66 66 73 65 74 20 77 69 74 68 69 6e  t iOffset within
120b0 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 73 75   the file. If su
120c0 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
120d0 20 30 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65   0..** Otherwise
120e0 2c 20 73 65 74 20 70 46 69 6c 65 2d 3e 6c 61 73  , set pFile->las
120f0 74 45 72 72 6e 6f 20 61 6e 64 20 72 65 74 75 72  tErrno and retur
12100 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73  n non-zero..*/.s
12110 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 65  tatic int winSee
12120 6b 46 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70  kFile(winFile *p
12130 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e  File, sqlite3_in
12140 74 36 34 20 69 4f 66 66 73 65 74 29 7b 0a 23 69  t64 iOffset){.#i
12150 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
12160 52 54 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72 42  RT.  LONG upperB
12170 69 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  its;            
12180 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 73 69 67       /* Most sig
12190 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77  . 32 bits of new
121a0 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 4c 4f 4e   offset */.  LON
121b0 47 20 6c 6f 77 65 72 42 69 74 73 3b 20 20 20 20  G lowerBits;    
121c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
121d0 4c 65 61 73 74 20 73 69 67 2e 20 33 32 20 62 69  Least sig. 32 bi
121e0 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65 74  ts of new offset
121f0 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 52 65   */.  DWORD dwRe
12200 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
12210 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
12220 65 74 75 72 6e 65 64 20 62 79 20 53 65 74 46 69  eturned by SetFi
12230 6c 65 50 6f 69 6e 74 65 72 28 29 20 2a 2f 0a 20  lePointer() */. 
12240 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
12250 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12260 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
12270 65 64 20 62 79 20 47 65 74 4c 61 73 74 45 72 72  ed by GetLastErr
12280 6f 72 28 29 20 2a 2f 0a 0a 20 20 4f 53 54 52 41  or() */..  OSTRA
12290 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25  CE(("SEEK file=%
122a0 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 5c 6e  p, offset=%lld\n
122b0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 69 4f 66  ", pFile->h, iOf
122c0 66 73 65 74 29 29 3b 0a 0a 20 20 75 70 70 65 72  fset));..  upper
122d0 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28 69  Bits = (LONG)((i
122e0 4f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78  Offset>>32) & 0x
122f0 37 66 66 66 66 66 66 66 29 3b 0a 20 20 6c 6f 77  7fffffff);.  low
12300 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28  erBits = (LONG)(
12310 69 4f 66 66 73 65 74 20 26 20 30 78 66 66 66 66  iOffset & 0xffff
12320 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20 41 50 49  ffff);..  /* API
12330 20 6f 64 64 69 74 79 3a 20 49 66 20 73 75 63 63   oddity: If succ
12340 65 73 73 66 75 6c 2c 20 53 65 74 46 69 6c 65 50  essful, SetFileP
12350 6f 69 6e 74 65 72 28 29 20 72 65 74 75 72 6e 73  ointer() returns
12360 20 61 20 64 77 6f 72 64 0a 20 20 2a 2a 20 63 6f   a dword.  ** co
12370 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f 77  ntaining the low
12380 65 72 20 33 32 2d 62 69 74 73 20 6f 66 20 74 68  er 32-bits of th
12390 65 20 6e 65 77 20 66 69 6c 65 2d 6f 66 66 73 65  e new file-offse
123a0 74 2e 20 4f 72 2c 20 69 66 20 69 74 20 66 61 69  t. Or, if it fai
123b0 6c 73 2c 0a 20 20 2a 2a 20 69 74 20 72 65 74 75  ls,.  ** it retu
123c0 72 6e 73 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f  rns INVALID_SET_
123d0 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2e 20 48 6f  FILE_POINTER. Ho
123e0 77 65 76 65 72 20 61 63 63 6f 72 64 69 6e 67 20  wever according 
123f0 74 6f 20 4d 53 44 4e 2c 0a 20 20 2a 2a 20 49 4e  to MSDN,.  ** IN
12400 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
12410 4f 49 4e 54 45 52 20 6d 61 79 20 61 6c 73 6f 20  OINTER may also 
12420 62 65 20 61 20 76 61 6c 69 64 20 6e 65 77 20 6f  be a valid new o
12430 66 66 73 65 74 2e 20 53 6f 20 74 6f 20 64 65 74  ffset. So to det
12440 65 72 6d 69 6e 65 0a 20 20 2a 2a 20 77 68 65 74  ermine.  ** whet
12450 68 65 72 20 61 6e 20 65 72 72 6f 72 20 68 61 73  her an error has
12460 20 61 63 74 75 61 6c 6c 79 20 6f 63 63 75 72 72   actually occurr
12470 65 64 2c 20 69 74 20 69 73 20 61 6c 73 6f 20 6e  ed, it is also n
12480 65 63 65 73 73 61 72 79 20 74 6f 20 63 61 6c 6c  ecessary to call
12490 0a 20 20 2a 2a 20 47 65 74 4c 61 73 74 45 72 72  .  ** GetLastErr
124a0 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 64 77 52  or()..  */.  dwR
124b0 65 74 20 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f  et = osSetFilePo
124c0 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20  inter(pFile->h, 
124d0 6c 6f 77 65 72 42 69 74 73 2c 20 26 75 70 70 65  lowerBits, &uppe
124e0 72 42 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49  rBits, FILE_BEGI
124f0 4e 29 3b 0a 0a 20 20 69 66 28 20 28 64 77 52 65  N);..  if( (dwRe
12500 74 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46  t==INVALID_SET_F
12510 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 20 20 20 20  ILE_POINTER.    
12520 20 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f    && ((lastErrno
12530 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
12540 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 29  r())!=NO_ERROR))
12550 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
12560 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
12570 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  rrno;.    winLog
12580 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
12590 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e  RR_SEEK, pFile->
125a0 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
125b0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53             "winS
125c0 65 65 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d  eekFile", pFile-
125d0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 4f 53 54  >zPath);.    OST
125e0 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65  RACE(("SEEK file
125f0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%p, rc=SQLITE_I
12600 4f 45 52 52 5f 53 45 45 4b 5c 6e 22 2c 20 70 46  OERR_SEEK\n", pF
12610 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65  ile->h));.    re
12620 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f  turn 1;.  }..  O
12630 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69  STRACE(("SEEK fi
12640 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
12650 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
12660 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  ));.  return 0;.
12670 23 65 6c 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20  #else.  /*.  ** 
12680 53 61 6d 65 20 61 73 20 61 62 6f 76 65 2c 20 65  Same as above, e
12690 78 63 65 70 74 20 74 68 61 74 20 74 68 69 73 20  xcept that this 
126a0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77  implementation w
126b0 6f 72 6b 73 20 66 6f 72 20 57 69 6e 52 54 2e 0a  orks for WinRT..
126c0 20 20 2a 2f 0a 0a 20 20 4c 41 52 47 45 5f 49 4e    */..  LARGE_IN
126d0 54 45 47 45 52 20 78 3b 20 20 20 20 20 20 20 20  TEGER x;        
126e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
126f0 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 42  ew offset */.  B
12700 4f 4f 4c 20 62 52 65 74 3b 20 20 20 20 20 20 20  OOL bRet;       
12710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12720 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
12730 20 62 79 20 53 65 74 46 69 6c 65 50 6f 69 6e 74   by SetFilePoint
12740 65 72 45 78 28 29 20 2a 2f 0a 0a 20 20 78 2e 51  erEx() */..  x.Q
12750 75 61 64 50 61 72 74 20 3d 20 69 4f 66 66 73 65  uadPart = iOffse
12760 74 3b 0a 20 20 62 52 65 74 20 3d 20 6f 73 53 65  t;.  bRet = osSe
12770 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 28 70  tFilePointerEx(p
12780 46 69 6c 65 2d 3e 68 2c 20 78 2c 20 30 2c 20 46  File->h, x, 0, F
12790 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69  ILE_BEGIN);..  i
127a0 66 28 21 62 52 65 74 29 7b 0a 20 20 20 20 70 46  f(!bRet){.    pF
127b0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
127c0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
127d0 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  );.    winLogErr
127e0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
127f0 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  SEEK, pFile->las
12800 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
12810 20 20 20 20 20 20 20 20 22 77 69 6e 53 65 65 6b          "winSeek
12820 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  File", pFile->zP
12830 61 74 68 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ath);.    OSTRAC
12840 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70  E(("SEEK file=%p
12850 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
12860 52 5f 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c 65  R_SEEK\n", pFile
12870 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
12880 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52  n 1;.  }..  OSTR
12890 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d  ACE(("SEEK file=
128a0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
128b0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
128c0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e  .  return 0;.#en
128d0 64 69 66 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  dif.}..#if SQLIT
128e0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
128f0 30 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  0./* Forward ref
12900 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 68  erences to VFS h
12910 65 6c 70 65 72 20 6d 65 74 68 6f 64 73 20 75 73  elper methods us
12920 65 64 20 66 6f 72 20 6d 65 6d 6f 72 79 20 6d 61  ed for memory ma
12930 70 70 65 64 20 66 69 6c 65 73 20 2a 2f 0a 73 74  pped files */.st
12940 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 61 70 66  atic int winMapf
12950 69 6c 65 28 77 69 6e 46 69 6c 65 2a 2c 20 73 71  ile(winFile*, sq
12960 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 73 74  lite3_int64);.st
12970 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61  atic int winUnma
12980 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 2a 29 3b  pfile(winFile*);
12990 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
129a0 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a  lose a file..**.
129b0 2a 2a 20 49 74 20 69 73 20 72 65 70 6f 72 74 65  ** It is reporte
129c0 64 20 74 68 61 74 20 61 6e 20 61 74 74 65 6d 70  d that an attemp
129d0 74 20 74 6f 20 63 6c 6f 73 65 20 61 20 68 61 6e  t to close a han
129e0 64 6c 65 20 6d 69 67 68 74 20 73 6f 6d 65 74 69  dle might someti
129f0 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54 68  mes.** fail.  Th
12a00 69 73 20 69 73 20 61 20 76 65 72 79 20 75 6e 72  is is a very unr
12a10 65 61 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c 74  easonable result
12a20 2c 20 62 75 74 20 57 69 6e 64 6f 77 73 20 69 73  , but Windows is
12a30 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f   notorious.** fo
12a40 72 20 62 65 69 6e 67 20 75 6e 72 65 61 73 6f 6e  r being unreason
12a50 61 62 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f 74  able so I do not
12a60 20 64 6f 75 62 74 20 74 68 61 74 20 69 74 20 6d   doubt that it m
12a70 69 67 68 74 20 68 61 70 70 65 6e 2e 20 20 49 66  ight happen.  If
12a80 0a 2a 2a 20 74 68 65 20 63 6c 6f 73 65 20 66 61  .** the close fa
12a90 69 6c 73 2c 20 77 65 20 70 61 75 73 65 20 66 6f  ils, we pause fo
12aa0 72 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e  r 100 millisecon
12ab0 64 73 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e  ds and try again
12ac0 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61 73  .  As.** many as
12ad0 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50   MX_CLOSE_ATTEMP
12ae0 54 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63 6c  T attempts to cl
12af0 6f 73 65 20 74 68 65 20 68 61 6e 64 6c 65 20 61  ose the handle a
12b00 72 65 20 6d 61 64 65 20 62 65 66 6f 72 65 0a 2a  re made before.*
12b10 2a 20 67 69 76 69 6e 67 20 75 70 20 61 6e 64 20  * giving up and 
12b20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  returning an err
12b30 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  or..*/.#define M
12b40 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20  X_CLOSE_ATTEMPT 
12b50 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  3.static int win
12b60 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
12b70 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72  le *id){.  int r
12b80 63 2c 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77 69  c, cnt = 0;.  wi
12b90 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
12ba0 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  winFile*)id;..  
12bb0 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
12bc0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12bd0 4f 4d 49 54 5f 57 41 4c 0a 20 20 61 73 73 65 72  OMIT_WAL.  asser
12be0 74 28 20 70 46 69 6c 65 2d 3e 70 53 68 6d 3d 3d  t( pFile->pShm==
12bf0 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  0 );.#endif.  as
12c00 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 68 21 3d  sert( pFile->h!=
12c10 4e 55 4c 4c 20 26 26 20 70 46 69 6c 65 2d 3e 68  NULL && pFile->h
12c20 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
12c30 5f 56 41 4c 55 45 20 29 3b 0a 20 20 4f 53 54 52  _VALUE );.  OSTR
12c40 41 43 45 28 28 22 43 4c 4f 53 45 20 66 69 6c 65  ACE(("CLOSE file
12c50 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%p\n", pFile->h
12c60 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ));..#if SQLITE_
12c70 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
12c80 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70    winUnmapfile(p
12c90 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  File);.#endif.. 
12ca0 20 64 6f 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73   do{.    rc = os
12cb0 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
12cc0 65 2d 3e 68 29 3b 0a 20 20 20 20 2f 2a 20 53 69  e->h);.    /* Si
12cd0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
12ce0 63 3d 30 3b 20 63 6e 74 3d 4d 58 5f 43 4c 4f 53  c=0; cnt=MX_CLOS
12cf0 45 5f 41 54 54 45 4d 50 54 3b 20 29 3b 20 2a 2f  E_ATTEMPT; ); */
12d00 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 30  .  }while( rc==0
12d10 20 26 26 20 2b 2b 63 6e 74 20 3c 20 4d 58 5f 43   && ++cnt < MX_C
12d20 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 26 26 20  LOSE_ATTEMPT && 
12d30 28 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73  (sqlite3_win32_s
12d40 6c 65 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b  leep(100), 1) );
12d50 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
12d60 49 4e 43 45 0a 23 64 65 66 69 6e 65 20 57 49 4e  INCE.#define WIN
12d70 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45  CE_DELETION_ATTE
12d80 4d 50 54 53 20 33 0a 20 20 77 69 6e 63 65 44 65  MPTS 3.  winceDe
12d90 73 74 72 6f 79 4c 6f 63 6b 28 70 46 69 6c 65 29  stroyLock(pFile)
12da0 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a  ;.  if( pFile->z
12db0 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 29 7b  DeleteOnClose ){
12dc0 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  .    int cnt = 0
12dd0 3b 0a 20 20 20 20 77 68 69 6c 65 28 0a 20 20 20  ;.    while(.   
12de0 20 20 20 20 20 20 20 20 6f 73 44 65 6c 65 74 65          osDelete
12df0 46 69 6c 65 57 28 70 46 69 6c 65 2d 3e 7a 44 65  FileW(pFile->zDe
12e00 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a  leteOnClose)==0.
12e10 20 20 20 20 20 20 20 20 26 26 20 6f 73 47 65 74          && osGet
12e20 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 28  FileAttributesW(
12e30 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e  pFile->zDeleteOn
12e40 43 6c 6f 73 65 29 21 3d 30 78 66 66 66 66 66 66  Close)!=0xffffff
12e50 66 66 0a 20 20 20 20 20 20 20 20 26 26 20 63 6e  ff.        && cn
12e60 74 2b 2b 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45  t++ < WINCE_DELE
12e70 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20  TION_ATTEMPTS.  
12e80 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69    ){.       sqli
12e90 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28  te3_win32_sleep(
12ea0 31 30 30 29 3b 20 20 2f 2a 20 57 61 69 74 20 61  100);  /* Wait a
12eb0 20 6c 69 74 74 6c 65 20 62 65 66 6f 72 65 20 74   little before t
12ec0 72 79 69 6e 67 20 61 67 61 69 6e 20 2a 2f 0a 20  rying again */. 
12ed0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
12ee0 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 7a 44 65  _free(pFile->zDe
12ef0 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20  leteOnClose);.  
12f00 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72  }.#endif.  if( r
12f10 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  c ){.    pFile->
12f20 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20  h = NULL;.  }.  
12f30 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b  OpenCounter(-1);
12f40 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f  .  OSTRACE(("CLO
12f50 53 45 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25  SE file=%p, rc=%
12f60 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  s\n", pFile->h, 
12f70 72 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  rc ? "ok" : "fai
12f80 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e  led"));.  return
12f90 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 0a   rc ? SQLITE_OK.
12fa0 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 77 69              : wi
12fb0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
12fc0 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 6f 73  _IOERR_CLOSE, os
12fd0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
12fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ff0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 43 6c            "winCl
13000 6f 73 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ose", pFile->zPa
13010 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  th);.}../*.** Re
13020 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66  ad data from a f
13030 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65  ile into a buffe
13040 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
13050 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62  E_OK if all.** b
13060 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20 73  ytes were read s
13070 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20  uccessfully and 
13080 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20  SQLITE_IOERR if 
13090 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
130a0 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
130b0 63 20 69 6e 74 20 77 69 6e 52 65 61 64 28 0a 20  c int winRead(. 
130c0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
130d0 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  d,          /* F
130e0 69 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  ile to read from
130f0 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66   */.  void *pBuf
13100 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13110 20 2f 2a 20 57 72 69 74 65 20 63 6f 6e 74 65 6e   /* Write conten
13120 74 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66  t into this buff
13130 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c  er */.  int amt,
13140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13150 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
13160 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f  bytes to read */
13170 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
13180 20 6f 66 66 73 65 74 20 20 20 20 20 20 20 2f 2a   offset       /*
13190 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 61   Begin reading a
131a0 74 20 74 68 69 73 20 6f 66 66 73 65 74 20 2a 2f  t this offset */
131b0 0a 29 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  .){.#if !SQLITE_
131c0 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 64 65 66  OS_WINCE && !def
131d0 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
131e0 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29  2_NO_OVERLAPPED)
131f0 0a 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76  .  OVERLAPPED ov
13200 65 72 6c 61 70 70 65 64 3b 20 20 20 20 20 20 20  erlapped;       
13210 20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73 65 74     /* The offset
13220 20 66 6f 72 20 52 65 61 64 46 69 6c 65 2e 20 2a   for ReadFile. *
13230 2f 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46 69  /.#endif.  winFi
13240 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
13250 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 66 69  File*)id;  /* fi
13260 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 44  le handle */.  D
13270 57 4f 52 44 20 6e 52 65 61 64 3b 20 20 20 20 20  WORD nRead;     
13280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13290 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
132a0 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20  s actually read 
132b0 66 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a 20 20 69  from file */.  i
132c0 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20 20  nt nRetry = 0;  
132d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
132e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74 72  * Number of retr
132f0 79 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ys */..  assert(
13300 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   id!=0 );.  asse
13310 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61  rt( amt>0 );.  a
13320 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 30  ssert( offset>=0
13330 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   );.  SimulateIO
13340 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
13350 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 29 3b  ITE_IOERR_READ);
13360 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
13370 44 20 66 69 6c 65 3d 25 70 2c 20 62 75 66 66 65  D file=%p, buffe
13380 72 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c  r=%p, amount=%d,
13390 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 6c 6f   offset=%lld, lo
133a0 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ck=%d\n",.      
133b0 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70       pFile->h, p
133c0 42 75 66 2c 20 61 6d 74 2c 20 6f 66 66 73 65 74  Buf, amt, offset
133d0 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
133e0 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  e));..#if SQLITE
133f0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
13400 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20  .  /* Deal with 
13410 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20  as much of this 
13420 72 65 61 64 20 72 65 71 75 65 73 74 20 61 73 20  read request as 
13430 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e  possible by tran
13440 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74  sfering.  ** dat
13450 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72  a from the memor
13460 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20  y mapping using 
13470 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20  memcpy().  */.  
13480 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65  if( offset<pFile
13490 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
134a0 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74    if( offset+amt
134b0 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53   <= pFile->mmapS
134c0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ize ){.      mem
134d0 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38 20  cpy(pBuf, &((u8 
134e0 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  *)(pFile->pMapRe
134f0 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20  gion))[offset], 
13500 61 6d 74 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  amt);.      OSTR
13510 41 43 45 28 28 22 52 45 41 44 2d 4d 4d 41 50 20  ACE(("READ-MMAP 
13520 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
13530 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
13540 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  >h));.      retu
13550 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13560 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
13570 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e 74 29  nt nCopy = (int)
13580 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  (pFile->mmapSize
13590 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20   - offset);.    
135a0 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26    memcpy(pBuf, &
135b0 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70  ((u8 *)(pFile->p
135c0 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73  MapRegion))[offs
135d0 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20  et], nCopy);.   
135e0 20 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20     pBuf = &((u8 
135f0 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a  *)pBuf)[nCopy];.
13600 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f        amt -= nCo
13610 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  py;.      offset
13620 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d   += nCopy;.    }
13630 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
13640 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
13650 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
13660 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52  TE_WIN32_NO_OVER
13670 4c 41 50 50 45 44 29 0a 20 20 69 66 28 20 77 69  LAPPED).  if( wi
13680 6e 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c  nSeekFile(pFile,
13690 20 6f 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20   offset) ){.    
136a0 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20 66  OSTRACE(("READ f
136b0 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
136c0 45 5f 46 55 4c 4c 5c 6e 22 2c 20 70 46 69 6c 65  E_FULL\n", pFile
136d0 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
136e0 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  n SQLITE_FULL;. 
136f0 20 7d 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 52   }.  while( !osR
13700 65 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  eadFile(pFile->h
13710 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52  , pBuf, amt, &nR
13720 65 61 64 2c 20 30 29 20 29 7b 0a 23 65 6c 73 65  ead, 0) ){.#else
13730 0a 20 20 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c  .  memset(&overl
13740 61 70 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66  apped, 0, sizeof
13750 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20  (OVERLAPPED));. 
13760 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73   overlapped.Offs
13770 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73  et = (LONG)(offs
13780 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29  et & 0xffffffff)
13790 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f  ;.  overlapped.O
137a0 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e  ffsetHigh = (LON
137b0 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20  G)((offset>>32) 
137c0 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20  & 0x7fffffff);. 
137d0 20 77 68 69 6c 65 28 20 21 6f 73 52 65 61 64 46   while( !osReadF
137e0 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42  ile(pFile->h, pB
137f0 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c  uf, amt, &nRead,
13800 20 26 6f 76 65 72 6c 61 70 70 65 64 29 20 26 26   &overlapped) &&
13810 0a 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c  .         osGetL
13820 61 73 74 45 72 72 6f 72 28 29 21 3d 45 52 52 4f  astError()!=ERRO
13830 52 5f 48 41 4e 44 4c 45 5f 45 4f 46 20 29 7b 0a  R_HANDLE_EOF ){.
13840 23 65 6e 64 69 66 0a 20 20 20 20 44 57 4f 52 44  #endif.    DWORD
13850 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
13860 69 66 28 20 77 69 6e 52 65 74 72 79 49 6f 65 72  if( winRetryIoer
13870 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73 74  r(&nRetry, &last
13880 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75  Errno) ) continu
13890 65 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  e;.    pFile->la
138a0 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
138b0 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  rno;.    OSTRACE
138c0 28 28 22 52 45 41 44 20 66 69 6c 65 3d 25 70 2c  (("READ file=%p,
138d0 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
138e0 5f 52 45 41 44 5c 6e 22 2c 20 70 46 69 6c 65 2d  _READ\n", pFile-
138f0 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >h));.    return
13900 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
13910 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 2c 20  ITE_IOERR_READ, 
13920 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
13930 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13940 20 20 20 20 20 20 20 20 20 22 77 69 6e 52 65 61           "winRea
13950 64 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  d", pFile->zPath
13960 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 4c 6f 67 49  );.  }.  winLogI
13970 6f 65 72 72 28 6e 52 65 74 72 79 29 3b 0a 20 20  oerr(nRetry);.  
13980 69 66 28 20 6e 52 65 61 64 3c 28 44 57 4f 52 44  if( nRead<(DWORD
13990 29 61 6d 74 20 29 7b 0a 20 20 20 20 2f 2a 20 55  )amt ){.    /* U
139a0 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66 20 74  nread parts of t
139b0 68 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62  he buffer must b
139c0 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f  e zero-filled */
139d0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63  .    memset(&((c
139e0 68 61 72 2a 29 70 42 75 66 29 5b 6e 52 65 61 64  har*)pBuf)[nRead
139f0 5d 2c 20 30 2c 20 61 6d 74 2d 6e 52 65 61 64 29  ], 0, amt-nRead)
13a00 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
13a10 52 45 41 44 20 66 69 6c 65 3d 25 70 2c 20 72 63  READ file=%p, rc
13a20 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
13a30 4f 52 54 5f 52 45 41 44 5c 6e 22 2c 20 70 46 69  ORT_READ\n", pFi
13a40 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74  le->h));.    ret
13a50 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
13a60 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d  _SHORT_READ;.  }
13a70 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  ..  OSTRACE(("RE
13a80 41 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  AD file=%p, rc=S
13a90 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
13aa0 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72  le->h));.  retur
13ab0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
13ac0 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61  /*.** Write data
13ad0 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69   from a buffer i
13ae0 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74  nto a file.  Ret
13af0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
13b00 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73   success.** or s
13b10 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
13b20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e  code on failure.
13b30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
13b40 69 6e 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74  inWrite(.  sqlit
13b50 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20  e3_file *id,    
13b60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
13b70 6c 65 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f  le to write into
13b80 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
13b90 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
13ba0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74        /* The byt
13bb0 65 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  es to be written
13bc0 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20   */.  int amt,  
13bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13be0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
13bf0 6f 66 20 62 79 74 65 73 20 74 6f 20 77 72 69 74  of bytes to writ
13c00 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
13c10 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20 20 20  nt64 offset     
13c20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
13c30 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 74   into the file t
13c40 6f 20 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20  o begin writing 
13c50 61 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  at */.){.  int r
13c60 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
13c70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
13c80 75 65 20 69 66 20 65 72 72 6f 72 20 68 61 73 20  ue if error has 
13c90 6f 63 63 75 72 72 65 64 2c 20 65 6c 73 65 20 66  occurred, else f
13ca0 61 6c 73 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c  alse */.  winFil
13cb0 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
13cc0 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c  ile*)id;  /* Fil
13cd0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  e handle */.  in
13ce0 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20  t nRetry = 0;   
13cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13d00 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74 72 69   Number of retri
13d10 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  es */..  assert(
13d20 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73 65   amt>0 );.  asse
13d30 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53  rt( pFile );.  S
13d40 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
13d50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
13d60 52 52 5f 57 52 49 54 45 29 3b 0a 20 20 53 69 6d  RR_WRITE);.  Sim
13d70 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
13d80 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
13d90 5f 46 55 4c 4c 29 3b 0a 0a 20 20 4f 53 54 52 41  _FULL);..  OSTRA
13da0 43 45 28 28 22 57 52 49 54 45 20 66 69 6c 65 3d  CE(("WRITE file=
13db0 25 70 2c 20 62 75 66 66 65 72 3d 25 70 2c 20 61  %p, buffer=%p, a
13dc0 6d 6f 75 6e 74 3d 25 64 2c 20 6f 66 66 73 65 74  mount=%d, offset
13dd0 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e  =%lld, lock=%d\n
13de0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
13df0 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d  ile->h, pBuf, am
13e00 74 2c 20 6f 66 66 73 65 74 2c 20 70 46 69 6c 65  t, offset, pFile
13e10 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23  ->locktype));..#
13e20 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
13e30 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44  AP_SIZE>0.  /* D
13e40 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68  eal with as much
13e50 20 6f 66 20 74 68 69 73 20 77 72 69 74 65 20 72   of this write r
13e60 65 71 75 65 73 74 20 61 73 20 70 6f 73 73 69 62  equest as possib
13e70 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e  le by transferin
13e80 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d  g.  ** data from
13e90 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70   the memory mapp
13ea0 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79  ing using memcpy
13eb0 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66  ().  */.  if( of
13ec0 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70  fset<pFile->mmap
13ed0 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Size ){.    if( 
13ee0 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46  offset+amt <= pF
13ef0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
13f00 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28  .      memcpy(&(
13f10 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d  (u8 *)(pFile->pM
13f20 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65  apRegion))[offse
13f30 74 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a  t], pBuf, amt);.
13f40 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
13f50 57 52 49 54 45 2d 4d 4d 41 50 20 66 69 6c 65 3d  WRITE-MMAP file=
13f60 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
13f70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
13f80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
13f90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
13fa0 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43  se{.      int nC
13fb0 6f 70 79 20 3d 20 28 69 6e 74 29 28 70 46 69 6c  opy = (int)(pFil
13fc0 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66  e->mmapSize - of
13fd0 66 73 65 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d  fset);.      mem
13fe0 63 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69  cpy(&((u8 *)(pFi
13ff0 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29  le->pMapRegion))
14000 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20  [offset], pBuf, 
14010 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42  nCopy);.      pB
14020 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75  uf = &((u8 *)pBu
14030 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20  f)[nCopy];.     
14040 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20   amt -= nCopy;. 
14050 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e       offset += n
14060 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Copy;.    }.  }.
14070 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
14080 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 64  TE_OS_WINCE || d
14090 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
140a0 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45  N32_NO_OVERLAPPE
140b0 44 29 0a 20 20 72 63 20 3d 20 77 69 6e 53 65 65  D).  rc = winSee
140c0 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66  kFile(pFile, off
140d0 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  set);.  if( rc==
140e0 30 20 29 7b 0a 23 65 6c 73 65 0a 20 20 7b 0a 23  0 ){.#else.  {.#
140f0 65 6e 64 69 66 0a 23 69 66 20 21 53 51 4c 49 54  endif.#if !SQLIT
14100 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 64  E_OS_WINCE && !d
14110 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
14120 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45  N32_NO_OVERLAPPE
14130 44 29 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45  D).    OVERLAPPE
14140 44 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20  D overlapped;   
14150 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73       /* The offs
14160 65 74 20 66 6f 72 20 57 72 69 74 65 46 69 6c 65  et for WriteFile
14170 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20  . */.#endif.    
14180 75 38 20 2a 61 52 65 6d 20 3d 20 28 75 38 20 2a  u8 *aRem = (u8 *
14190 29 70 42 75 66 3b 20 20 20 20 20 20 20 20 2f 2a  )pBuf;        /*
141a0 20 44 61 74 61 20 79 65 74 20 74 6f 20 62 65 20   Data yet to be 
141b0 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69  written */.    i
141c0 6e 74 20 6e 52 65 6d 20 3d 20 61 6d 74 3b 20 20  nt nRem = amt;  
141d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
141e0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
141f0 79 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65  yet to be writte
14200 6e 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6e  n */.    DWORD n
14210 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
14220 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
14230 77 72 69 74 74 65 6e 20 62 79 20 65 61 63 68 20  written by each 
14240 57 72 69 74 65 46 69 6c 65 28 29 20 63 61 6c 6c  WriteFile() call
14250 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6c 61   */.    DWORD la
14260 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52  stErrno = NO_ERR
14270 4f 52 3b 20 20 20 2f 2a 20 56 61 6c 75 65 20 72  OR;   /* Value r
14280 65 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61  eturned by GetLa
14290 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 23 69  stError() */..#i
142a0 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
142b0 43 45 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  CE && !defined(S
142c0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f  QLITE_WIN32_NO_O
142d0 56 45 52 4c 41 50 50 45 44 29 0a 20 20 20 20 6d  VERLAPPED).    m
142e0 65 6d 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65  emset(&overlappe
142f0 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45  d, 0, sizeof(OVE
14300 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f  RLAPPED));.    o
14310 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74  verlapped.Offset
14320 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74   = (LONG)(offset
14330 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a   & 0xffffffff);.
14340 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f      overlapped.O
14350 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e  ffsetHigh = (LON
14360 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20  G)((offset>>32) 
14370 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 23  & 0x7fffffff);.#
14380 65 6e 64 69 66 0a 0a 20 20 20 20 77 68 69 6c 65  endif..    while
14390 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 23 69 66 20  ( nRem>0 ){.#if 
143a0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
143b0 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
143c0 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c  E_WIN32_NO_OVERL
143d0 41 50 50 45 44 29 0a 20 20 20 20 20 20 69 66 28  APPED).      if(
143e0 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28 70 46   !osWriteFile(pF
143f0 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52  ile->h, aRem, nR
14400 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 30 29 20  em, &nWrite, 0) 
14410 29 7b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69  ){.#else.      i
14420 66 28 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28  f( !osWriteFile(
14430 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20  pFile->h, aRem, 
14440 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 26  nRem, &nWrite, &
14450 6f 76 65 72 6c 61 70 70 65 64 29 20 29 7b 0a 23  overlapped) ){.#
14460 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66  endif.        if
14470 28 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28  ( winRetryIoerr(
14480 26 6e 52 65 74 72 79 2c 20 26 6c 61 73 74 45 72  &nRetry, &lastEr
14490 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  rno) ) continue;
144a0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
144b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
144c0 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 30 20  sert( nWrite==0 
144d0 7c 7c 20 6e 57 72 69 74 65 3c 3d 28 44 57 4f 52  || nWrite<=(DWOR
144e0 44 29 6e 52 65 6d 20 29 3b 0a 20 20 20 20 20 20  D)nRem );.      
144f0 69 66 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c  if( nWrite==0 ||
14500 20 6e 57 72 69 74 65 3e 28 44 57 4f 52 44 29 6e   nWrite>(DWORD)n
14510 52 65 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  Rem ){.        l
14520 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
14530 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
14540 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14550 20 20 7d 0a 23 69 66 20 21 53 51 4c 49 54 45 5f    }.#if !SQLITE_
14560 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 64 65 66  OS_WINCE && !def
14570 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
14580 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29  2_NO_OVERLAPPED)
14590 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  .      offset +=
145a0 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6f   nWrite;.      o
145b0 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74  verlapped.Offset
145c0 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74   = (LONG)(offset
145d0 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a   & 0xffffffff);.
145e0 20 20 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64        overlapped
145f0 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c  .OffsetHigh = (L
14600 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32  ONG)((offset>>32
14610 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b  ) & 0x7fffffff);
14620 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 61 52  .#endif.      aR
14630 65 6d 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20  em += nWrite;.  
14640 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 57 72 69      nRem -= nWri
14650 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  te;.    }.    if
14660 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20  ( nRem>0 ){.    
14670 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
14680 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
14690 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
146a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
146b0 63 20 29 7b 0a 20 20 20 20 69 66 28 20 20 20 28  c ){.    if(   (
146c0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
146d0 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f  o==ERROR_HANDLE_
146e0 44 49 53 4b 5f 46 55 4c 4c 20 29 0a 20 20 20 20  DISK_FULL ).    
146f0 20 20 20 7c 7c 20 28 20 70 46 69 6c 65 2d 3e 6c     || ( pFile->l
14700 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
14710 44 49 53 4b 5f 46 55 4c 4c 20 29 29 7b 0a 20 20  DISK_FULL )){.  
14720 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 57 52      OSTRACE(("WR
14730 49 54 45 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  ITE file=%p, rc=
14740 53 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22 2c 20  SQLITE_FULL\n", 
14750 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
14760 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
14770 72 72 6f 72 28 53 51 4c 49 54 45 5f 46 55 4c 4c  rror(SQLITE_FULL
14780 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
14790 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
147a0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
147b0 6e 57 72 69 74 65 31 22 2c 20 70 46 69 6c 65 2d  nWrite1", pFile-
147c0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20  >zPath);.    }. 
147d0 20 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49     OSTRACE(("WRI
147e0 54 45 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  TE file=%p, rc=S
147f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
14800 45 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  E\n", pFile->h))
14810 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
14820 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
14830 49 4f 45 52 52 5f 57 52 49 54 45 2c 20 70 46 69  IOERR_WRITE, pFi
14840 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
14850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14860 20 20 20 20 20 20 22 77 69 6e 57 72 69 74 65 32        "winWrite2
14870 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
14880 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
14890 69 6e 4c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72  inLogIoerr(nRetr
148a0 79 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  y);.  }.  OSTRAC
148b0 45 28 28 22 57 52 49 54 45 20 66 69 6c 65 3d 25  E(("WRITE file=%
148c0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
148d0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
148e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
148f0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  OK;.}../*.** Tru
14900 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69  ncate an open fi
14910 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65  le to a specifie
14920 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63  d size.*/.static
14930 20 69 6e 74 20 77 69 6e 54 72 75 6e 63 61 74 65   int winTruncate
14940 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
14950 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
14960 20 6e 42 79 74 65 29 7b 0a 20 20 77 69 6e 46 69   nByte){.  winFi
14970 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
14980 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69  File*)id;  /* Fi
14990 6c 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74  le handle object
149a0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
149b0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
149c0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
149d0 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 66 75  code for this fu
149e0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 57 4f 52  nction */.  DWOR
149f0 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20  D lastErrno;..  
14a00 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
14a10 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
14a20 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
14a30 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 29  _IOERR_TRUNCATE)
14a40 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 52  ;.  OSTRACE(("TR
14a50 55 4e 43 41 54 45 20 66 69 6c 65 3d 25 70 2c 20  UNCATE file=%p, 
14a60 73 69 7a 65 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d  size=%lld, lock=
14a70 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
14a80 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74    pFile->h, nByt
14a90 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  e, pFile->lockty
14aa0 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  pe));..  /* If t
14ab0 68 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66  he user has conf
14ac0 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73  igured a chunk-s
14ad0 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c  ize for this fil
14ae0 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  e, truncate the.
14af0 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61    ** file so tha
14b00 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  t it consists of
14b10 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62   an integer numb
14b20 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e  er of chunks (i.
14b30 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75  e. the.  ** actu
14b40 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74  al file size aft
14b50 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  er the operation
14b60 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20 74   may be larger t
14b70 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
14b80 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20  d.  ** size)..  
14b90 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
14ba0 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20  szChunk>0 ){.   
14bb0 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65   nByte = ((nByte
14bc0 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   + pFile->szChun
14bd0 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a  k - 1)/pFile->sz
14be0 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e  Chunk) * pFile->
14bf0 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20  szChunk;.  }..  
14c00 2f 2a 20 53 65 74 45 6e 64 4f 66 46 69 6c 65 28  /* SetEndOfFile(
14c10 29 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  ) returns non-ze
14c20 72 6f 20 77 68 65 6e 20 73 75 63 63 65 73 73 66  ro when successf
14c30 75 6c 2c 20 6f 72 20 7a 65 72 6f 20 77 68 65 6e  ul, or zero when
14c40 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20   it fails. */.  
14c50 69 66 28 20 77 69 6e 53 65 65 6b 46 69 6c 65 28  if( winSeekFile(
14c60 70 46 69 6c 65 2c 20 6e 42 79 74 65 29 20 29 7b  pFile, nByte) ){
14c70 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67  .    rc = winLog
14c80 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
14c90 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 70 46 69  RR_TRUNCATE, pFi
14ca0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
14cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cc0 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65      "winTruncate
14cd0 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  1", pFile->zPath
14ce0 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 30  );.  }else if( 0
14cf0 3d 3d 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65  ==osSetEndOfFile
14d00 28 70 46 69 6c 65 2d 3e 68 29 20 26 26 0a 20 20  (pFile->h) &&.  
14d10 20 20 20 20 20 20 20 20 20 20 28 28 6c 61 73 74            ((last
14d20 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
14d30 74 45 72 72 6f 72 28 29 29 21 3d 45 52 52 4f 52  tError())!=ERROR
14d40 5f 55 53 45 52 5f 4d 41 50 50 45 44 5f 46 49 4c  _USER_MAPPED_FIL
14d50 45 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  E) ){.    pFile-
14d60 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
14d70 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d  tErrno;.    rc =
14d80 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
14d90 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
14da0 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  TE, pFile->lastE
14db0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
14dc0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 54             "winT
14dd0 72 75 6e 63 61 74 65 32 22 2c 20 70 46 69 6c 65  runcate2", pFile
14de0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 23  ->zPath);.  }..#
14df0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
14e00 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 49  AP_SIZE>0.  /* I
14e10 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 74  f the file was t
14e20 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20 73 69  runcated to a si
14e30 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ze smaller than 
14e40 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  the currently.  
14e50 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e  ** mapped region
14e60 2c 20 72 65 64 75 63 65 20 74 68 65 20 65 66 66  , reduce the eff
14e70 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67 20 73  ective mapping s
14e80 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53 51 4c  ize as well. SQL
14e90 69 74 65 20 77 69 6c 6c 0a 20 20 2a 2a 20 75 73  ite will.  ** us
14ea0 65 20 72 65 61 64 28 29 20 61 6e 64 20 77 72 69  e read() and wri
14eb0 74 65 28 29 20 74 6f 20 61 63 63 65 73 73 20 64  te() to access d
14ec0 61 74 61 20 62 65 79 6f 6e 64 20 74 68 69 73 20  ata beyond this 
14ed0 70 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f 77 20 6f  point from now o
14ee0 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  n..  */.  if( pF
14ef0 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  ile->pMapRegion 
14f00 26 26 20 6e 42 79 74 65 3c 70 46 69 6c 65 2d 3e  && nByte<pFile->
14f10 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
14f20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
14f30 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 23 65 6e  = nByte;.  }.#en
14f40 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  dif..  OSTRACE((
14f50 22 54 52 55 4e 43 41 54 45 20 66 69 6c 65 3d 25  "TRUNCATE file=%
14f60 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69  p, rc=%s\n", pFi
14f70 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72  le->h, sqlite3Er
14f80 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72  rName(rc)));.  r
14f90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
14fa0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
14fb0 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
14fc0 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79  number of fullsy
14fd0 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73  ncs and normal s
14fe0 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75  yncs.  This is u
14ff0 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74  sed to test.** t
15000 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75  hat syncs and fu
15010 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75  llsyncs are occu
15020 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68  ring at the righ
15030 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20  t times..*/.int 
15040 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
15050 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69  nt = 0;.int sqli
15060 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
15070 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
15080 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
15090 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20  all writes to a 
150a0 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20  particular file 
150b0 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f  are committed to
150c0 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   disk..*/.static
150d0 20 69 6e 74 20 77 69 6e 53 79 6e 63 28 73 71 6c   int winSync(sql
150e0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
150f0 6e 74 20 66 6c 61 67 73 29 7b 0a 23 69 66 6e 64  nt flags){.#ifnd
15100 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
15110 43 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64  C.  /*.  ** Used
15120 20 6f 6e 6c 79 20 77 68 65 6e 20 53 51 4c 49 54   only when SQLIT
15130 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74  E_NO_SYNC is not
15140 20 64 65 66 69 6e 65 64 2e 0a 20 20 20 2a 2f 0a   defined..   */.
15150 20 20 42 4f 4f 4c 20 72 63 3b 0a 23 65 6e 64 69    BOOL rc;.#endi
15160 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
15170 44 45 42 55 47 29 20 7c 7c 20 21 64 65 66 69 6e  DEBUG) || !defin
15180 65 64 28 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ed(SQLITE_NO_SYN
15190 43 29 20 7c 7c 20 5c 0a 20 20 20 20 28 64 65 66  C) || \.    (def
151a0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
151b0 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
151c0 49 54 45 5f 44 45 42 55 47 29 29 0a 20 20 2f 2a  ITE_DEBUG)).  /*
151d0 0a 20 20 2a 2a 20 55 73 65 64 20 77 68 65 6e 20  .  ** Used when 
151e0 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69  SQLITE_NO_SYNC i
151f0 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 61 6e  s not defined an
15200 64 20 62 79 20 74 68 65 20 61 73 73 65 72 74 28  d by the assert(
15210 29 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 4f 53  ) and/or.  ** OS
15220 54 52 41 43 45 28 29 20 6d 61 63 72 6f 73 2e 0a  TRACE() macros..
15230 20 20 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20     */.  winFile 
15240 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
15250 65 2a 29 69 64 3b 0a 23 65 6c 73 65 0a 20 20 55  e*)id;.#else.  U
15260 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
15270 69 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  id);.#endif..  a
15280 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
15290 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
152a0 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59  one of SQLITE_SY
152b0 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c  NC_NORMAL or FUL
152c0 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a  L was passed */.
152d0 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73 26    assert((flags&
152e0 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
152f0 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20  NC_NORMAL.      
15300 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d  || (flags&0x0F)=
15310 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
15320 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69  L.  );..  /* Uni
15330 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f  x cannot, but so
15340 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72  me systems may r
15350 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
15360 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69  L from here. Thi
15370 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74  s.  ** line is t
15380 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e  o test that doin
15390 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61  g so does not ca
153a0 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73  use any problems
153b0 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
153c0 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20  eDiskfullError( 
153d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
153e0 4c 4c 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45  LL );..  OSTRACE
153f0 28 28 22 53 59 4e 43 20 66 69 6c 65 3d 25 70 2c  (("SYNC file=%p,
15400 20 66 6c 61 67 73 3d 25 78 2c 20 6c 6f 63 6b 3d   flags=%x, lock=
15410 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
15420 20 20 70 46 69 6c 65 2d 3e 68 2c 20 66 6c 61 67    pFile->h, flag
15430 73 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  s, pFile->lockty
15440 70 65 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  pe));..#ifndef S
15450 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 55 4e 55  QLITE_TEST.  UNU
15460 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 6c  SED_PARAMETER(fl
15470 61 67 73 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66  ags);.#else.  if
15480 28 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  ( (flags&0x0F)==
15490 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
154a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
154b0 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  fullsync_count++
154c0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
154d0 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  sync_count++;.#e
154e0 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65  ndif..  /* If we
154f0 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74   compiled with t
15500 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  he SQLITE_NO_SYN
15510 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e  C flag, then syn
15520 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e  cing is a.  ** n
15530 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66  o-op.  */.#ifdef
15540 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
15550 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43    OSTRACE(("SYNC
15560 2d 4e 4f 50 20 66 69 6c 65 3d 25 70 2c 20 72 63  -NOP file=%p, rc
15570 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
15580 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74  File->h));.  ret
15590 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
155a0 65 6c 73 65 0a 20 20 72 63 20 3d 20 6f 73 46 6c  else.  rc = osFl
155b0 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 28 70  ushFileBuffers(p
155c0 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 53 69 6d 75  File->h);.  Simu
155d0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
155e0 46 41 4c 53 45 20 29 3b 0a 20 20 69 66 28 20 72  FALSE );.  if( r
155f0 63 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  c ){.    OSTRACE
15600 28 28 22 53 59 4e 43 20 66 69 6c 65 3d 25 70 2c  (("SYNC file=%p,
15610 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
15620 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
15630 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15640 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
15650 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
15660 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
15670 6f 72 28 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  or();.    OSTRAC
15680 45 28 28 22 53 59 4e 43 20 66 69 6c 65 3d 25 70  E(("SYNC file=%p
15690 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
156a0 52 5f 46 53 59 4e 43 5c 6e 22 2c 20 70 46 69 6c  R_FSYNC\n", pFil
156b0 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
156c0 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
156d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e  QLITE_IOERR_FSYN
156e0 43 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  C, pFile->lastEr
156f0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
15700 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
15710 53 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  Sync", pFile->zP
15720 61 74 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ath);.  }.#endif
15730 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
15740 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ine the current 
15750 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69  size of a file i
15760 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69  n bytes.*/.stati
15770 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 53 69 7a  c int winFileSiz
15780 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
15790 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  id, sqlite3_int6
157a0 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 77 69 6e  4 *pSize){.  win
157b0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
157c0 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  inFile*)id;.  in
157d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
157e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  ;..  assert( id!
157f0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
15800 70 53 69 7a 65 21 3d 30 20 29 3b 0a 20 20 53 69  pSize!=0 );.  Si
15810 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
15820 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
15830 52 5f 46 53 54 41 54 29 3b 0a 20 20 4f 53 54 52  R_FSTAT);.  OSTR
15840 41 43 45 28 28 22 53 49 5a 45 20 66 69 6c 65 3d  ACE(("SIZE file=
15850 25 70 2c 20 70 53 69 7a 65 3d 25 70 5c 6e 22 2c  %p, pSize=%p\n",
15860 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53 69 7a 65   pFile->h, pSize
15870 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ));..#if SQLITE_
15880 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 0a 20 20 20  OS_WINRT.  {.   
15890 20 46 49 4c 45 5f 53 54 41 4e 44 41 52 44 5f 49   FILE_STANDARD_I
158a0 4e 46 4f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 66  NFO info;.    if
158b0 28 20 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f 72  ( osGetFileInfor
158c0 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78  mationByHandleEx
158d0 28 70 46 69 6c 65 2d 3e 68 2c 20 46 69 6c 65 53  (pFile->h, FileS
158e0 74 61 6e 64 61 72 64 49 6e 66 6f 2c 0a 20 20 20  tandardInfo,.   
158f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15910 20 20 26 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28    &info, sizeof(
15920 69 6e 66 6f 29 29 20 29 7b 0a 20 20 20 20 20 20  info)) ){.      
15930 2a 70 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 45 6e  *pSize = info.En
15940 64 4f 66 46 69 6c 65 2e 51 75 61 64 50 61 72 74  dOfFile.QuadPart
15950 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15960 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
15970 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
15980 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63  rror();.      rc
15990 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
159a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
159b0 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  T, pFile->lastEr
159c0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
159d0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
159e0 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c 65  FileSize", pFile
159f0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
15a00 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a 20 20    }.#else.  {.  
15a10 20 20 44 57 4f 52 44 20 75 70 70 65 72 42 69 74    DWORD upperBit
15a20 73 3b 0a 20 20 20 20 44 57 4f 52 44 20 6c 6f 77  s;.    DWORD low
15a30 65 72 42 69 74 73 3b 0a 20 20 20 20 44 57 4f 52  erBits;.    DWOR
15a40 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20  D lastErrno;..  
15a50 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 6f 73    lowerBits = os
15a60 47 65 74 46 69 6c 65 53 69 7a 65 28 70 46 69 6c  GetFileSize(pFil
15a70 65 2d 3e 68 2c 20 26 75 70 70 65 72 42 69 74 73  e->h, &upperBits
15a80 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  );.    *pSize = 
15a90 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  (((sqlite3_int64
15aa0 29 75 70 70 65 72 42 69 74 73 29 3c 3c 33 32 29  )upperBits)<<32)
15ab0 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20   + lowerBits;.  
15ac0 20 20 69 66 28 20 20 20 28 6c 6f 77 65 72 42 69    if(   (lowerBi
15ad0 74 73 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49  ts == INVALID_FI
15ae0 4c 45 5f 53 49 5a 45 29 0a 20 20 20 20 20 20 20  LE_SIZE).       
15af0 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d  && ((lastErrno =
15b00 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
15b10 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 20 29 7b  ))!=NO_ERROR) ){
15b20 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
15b30 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
15b40 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
15b50 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
15b60 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 2c 20  TE_IOERR_FSTAT, 
15b70 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
15b80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15b90 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 69 6c           "winFil
15ba0 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  eSize", pFile->z
15bb0 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Path);.    }.  }
15bc0 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43  .#endif.  OSTRAC
15bd0 45 28 28 22 53 49 5a 45 20 66 69 6c 65 3d 25 70  E(("SIZE file=%p
15be0 2c 20 70 53 69 7a 65 3d 25 70 2c 20 2a 70 53 69  , pSize=%p, *pSi
15bf0 7a 65 3d 25 6c 6c 64 2c 20 72 63 3d 25 73 5c 6e  ze=%lld, rc=%s\n
15c00 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
15c10 69 6c 65 2d 3e 68 2c 20 70 53 69 7a 65 2c 20 2a  ile->h, pSize, *
15c20 70 53 69 7a 65 2c 20 73 71 6c 69 74 65 33 45 72  pSize, sqlite3Er
15c30 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72  rName(rc)));.  r
15c40 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15c50 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  ** LOCKFILE_FAIL
15c60 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 69 73 20  _IMMEDIATELY is 
15c70 75 6e 64 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d  undefined on som
15c80 65 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d  e Windows system
15c90 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f  s..*/.#ifndef LO
15ca0 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
15cb0 44 49 41 54 45 4c 59 0a 23 20 64 65 66 69 6e 65  DIATELY.# define
15cc0 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49   LOCKFILE_FAIL_I
15cd0 4d 4d 45 44 49 41 54 45 4c 59 20 31 0a 23 65 6e  MMEDIATELY 1.#en
15ce0 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4c 4f 43  dif..#ifndef LOC
15cf0 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f  KFILE_EXCLUSIVE_
15d00 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20 4c 4f  LOCK.# define LO
15d10 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45  CKFILE_EXCLUSIVE
15d20 5f 4c 4f 43 4b 20 32 0a 23 65 6e 64 69 66 0a 0a  _LOCK 2.#endif..
15d30 2f 2a 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61 6c  /*.** Historical
15d40 6c 79 2c 20 53 51 4c 69 74 65 20 68 61 73 20 75  ly, SQLite has u
15d50 73 65 64 20 62 6f 74 68 20 74 68 65 20 4c 6f 63  sed both the Loc
15d60 6b 46 69 6c 65 20 61 6e 64 20 4c 6f 63 6b 46 69  kFile and LockFi
15d70 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  leEx functions..
15d80 2a 2a 20 57 68 65 6e 20 74 68 65 20 4c 6f 63 6b  ** When the Lock
15d90 46 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 77 61  File function wa
15da0 73 20 75 73 65 64 2c 20 69 74 20 77 61 73 20 61  s used, it was a
15db0 6c 77 61 79 73 20 65 78 70 65 63 74 65 64 20 74  lways expected t
15dc0 6f 20 66 61 69 6c 0a 2a 2a 20 69 6d 6d 65 64 69  o fail.** immedi
15dd0 61 74 65 6c 79 20 69 66 20 74 68 65 20 6c 6f 63  ately if the loc
15de0 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 6f  k could not be o
15df0 62 74 61 69 6e 65 64 2e 20 20 41 6c 73 6f 2c 20  btained.  Also, 
15e00 69 74 20 61 6c 77 61 79 73 20 65 78 70 65 63 74  it always expect
15e10 65 64 20 74 6f 0a 2a 2a 20 6f 62 74 61 69 6e 20  ed to.** obtain 
15e20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
15e30 6b 2e 20 20 54 68 65 73 65 20 66 6c 61 67 73 20  k.  These flags 
15e40 61 72 65 20 75 73 65 64 20 77 69 74 68 20 74 68  are used with th
15e50 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e  e LockFileEx fun
15e60 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72 65 66  ction.** and ref
15e70 6c 65 63 74 20 74 68 6f 73 65 20 65 78 70 65 63  lect those expec
15e80 74 61 74 69 6f 6e 73 3b 20 74 68 65 72 65 66 6f  tations; therefo
15e90 72 65 2c 20 74 68 65 79 20 73 68 6f 75 6c 64 20  re, they should 
15ea0 6e 6f 74 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  not be changed..
15eb0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
15ec0 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53  E_LOCKFILE_FLAGS
15ed0 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
15ee0 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 20  _LOCKFILE_FLAGS 
15ef0 20 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c    (LOCKFILE_FAIL
15f00 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 7c 20 5c  _IMMEDIATELY | \
15f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f30 20 20 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c     LOCKFILE_EXCL
15f40 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 23 65 6e 64  USIVE_LOCK).#end
15f50 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 75 72 72 65 6e  if../*.** Curren
15f60 74 6c 79 2c 20 53 51 4c 69 74 65 20 6e 65 76 65  tly, SQLite neve
15f70 72 20 63 61 6c 6c 73 20 74 68 65 20 4c 6f 63 6b  r calls the Lock
15f80 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 20  FileEx function 
15f90 77 69 74 68 6f 75 74 20 77 61 6e 74 69 6e 67 20  without wanting 
15fa0 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 66  the.** call to f
15fb0 61 69 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ail immediately 
15fc0 69 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e  if the lock cann
15fd0 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a  ot be obtained..
15fe0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
15ff0 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41  E_LOCKFILEEX_FLA
16000 47 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  GS.# define SQLI
16010 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c  TE_LOCKFILEEX_FL
16020 41 47 53 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 41  AGS (LOCKFILE_FA
16030 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 29 0a  IL_IMMEDIATELY).
16040 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 63  #endif../*.** Ac
16050 71 75 69 72 65 20 61 20 72 65 61 64 65 72 20 6c  quire a reader l
16060 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66 65 72 65 6e  ock..** Differen
16070 74 20 41 50 49 20 72 6f 75 74 69 6e 65 73 20 61  t API routines a
16080 72 65 20 63 61 6c 6c 65 64 20 64 65 70 65 6e 64  re called depend
16090 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
160a0 72 20 6e 6f 74 20 74 68 69 73 0a 2a 2a 20 69 73  r not this.** is
160b0 20 57 69 6e 39 78 20 6f 72 20 57 69 6e 4e 54 2e   Win9x or WinNT.
160c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
160d0 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 77 69  inGetReadLock(wi
160e0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  nFile *pFile){. 
160f0 20 69 6e 74 20 72 65 73 3b 0a 20 20 4f 53 54 52   int res;.  OSTR
16100 41 43 45 28 28 22 52 45 41 44 2d 4c 4f 43 4b 20  ACE(("READ-LOCK 
16110 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64  file=%p, lock=%d
16120 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70  \n", pFile->h, p
16130 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29  File->locktype))
16140 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  ;.  if( osIsNT()
16150 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   ){.#if SQLITE_O
16160 53 5f 57 49 4e 43 45 0a 20 20 20 20 2f 2a 0a 20  S_WINCE.    /*. 
16170 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64     ** NOTE: Wind
16180 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65  ows CE is handle
16190 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65  d differently he
161a0 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20  re due its lack 
161b0 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20 20  of the Win32.   
161c0 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f   **       API Lo
161d0 63 6b 46 69 6c 65 45 78 2e 0a 20 20 20 20 2a 2f  ckFileEx..    */
161e0 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 63 65  .    res = wince
161f0 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
16200 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
16210 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 23 65 6c 73  , 0, 1, 0);.#els
16220 65 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c  e.    res = winL
16230 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
16240 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  h, SQLITE_LOCKFI
16250 4c 45 45 58 5f 46 4c 41 47 53 2c 20 53 48 41 52  LEEX_FLAGS, SHAR
16260 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20 20  ED_FIRST, 0,.   
16270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16280 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20     SHARED_SIZE, 
16290 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23  0);.#endif.  }.#
162a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
162b0 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
162c0 73 65 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 3b 0a  se{.    int lk;.
162d0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
162e0 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 6c 6b  omness(sizeof(lk
162f0 29 2c 20 26 6c 6b 29 3b 0a 20 20 20 20 70 46 69  ), &lk);.    pFi
16300 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  le->sharedLockBy
16310 74 65 20 3d 20 28 73 68 6f 72 74 29 28 28 6c 6b  te = (short)((lk
16320 20 26 20 30 78 37 66 66 66 66 66 66 66 29 25 28   & 0x7fffffff)%(
16330 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29  SHARED_SIZE - 1)
16340 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  );.    res = win
16350 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
16360 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  >h, SQLITE_LOCKF
16370 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20  ILE_FLAGS,.     
16380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16390 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 46   SHARED_FIRST+pF
163a0 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ile->sharedLockB
163b0 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  yte, 0, 1, 0);. 
163c0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
163d0 72 65 73 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  res == 0 ){.    
163e0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
163f0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
16400 72 28 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e  r();.    /* No n
16410 65 65 64 20 74 6f 20 6c 6f 67 20 61 20 66 61 69  eed to log a fai
16420 6c 75 72 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  lure to lock */.
16430 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
16440 52 45 41 44 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25  READ-LOCK file=%
16450 70 2c 20 72 65 73 75 6c 74 3d 25 64 5c 6e 22 2c  p, result=%d\n",
16460 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29   pFile->h, res))
16470 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
16480 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20  }../*.** Undo a 
16490 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74  readlock.*/.stat
164a0 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b  ic int winUnlock
164b0 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65  ReadLock(winFile
164c0 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
164d0 72 65 73 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  res;.  DWORD las
164e0 74 45 72 72 6e 6f 3b 0a 20 20 4f 53 54 52 41 43  tErrno;.  OSTRAC
164f0 45 28 28 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20  E(("READ-UNLOCK 
16500 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64  file=%p, lock=%d
16510 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70  \n", pFile->h, p
16520 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29  File->locktype))
16530 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  ;.  if( osIsNT()
16540 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69   ){.    res = wi
16550 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69  nUnlockFile(&pFi
16560 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
16570 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53  RST, 0, SHARED_S
16580 49 5a 45 2c 20 30 29 3b 0a 20 20 7d 0a 23 69 66  IZE, 0);.  }.#if
16590 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
165a0 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
165b0 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55  {.    res = winU
165c0 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
165d0 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
165e0 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c  T+pFile->sharedL
165f0 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30  ockByte, 0, 1, 0
16600 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
16610 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20 28 28  if( res==0 && ((
16620 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
16630 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 45  tLastError())!=E
16640 52 52 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 29  RROR_NOT_LOCKED)
16650 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
16660 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
16670 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  rrno;.    winLog
16680 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
16690 52 52 5f 55 4e 4c 4f 43 4b 2c 20 70 46 69 6c 65  RR_UNLOCK, pFile
166a0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
166b0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
166c0 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 22  nUnlockReadLock"
166d0 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
166e0 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
166f0 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c  "READ-UNLOCK fil
16700 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25 64 5c  e=%p, result=%d\
16710 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65  n", pFile->h, re
16720 73 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  s));.  return re
16730 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  s;.}../*.** Lock
16740 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
16750 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
16760 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c  d by parameter l
16770 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a  ocktype - one.**
16780 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
16790 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
167a0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
167b0 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
167c0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
167d0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
167e0 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
167f0 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
16800 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
16810 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
16820 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
16830 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
16840 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
16850 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
16860 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
16870 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
16880 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
16890 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
168a0 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
168b0 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
168c0 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
168d0 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
168e0 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
168f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
16900 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
16910 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
16920 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
16930 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
16940 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
16950 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
16960 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
16970 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
16980 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
16990 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
169a0 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
169b0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
169c0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
169d0 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
169e0 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
169f0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
16a00 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
16a10 6c 6f 63 6b 2e 20 20 54 68 65 20 77 69 6e 55 6e  lock.  The winUn
16a20 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a  lock() routine.*
16a30 2a 20 65 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63  * erases all loc
16a40 6b 73 20 61 74 20 6f 6e 63 65 20 61 6e 64 20 72  ks at once and r
16a50 65 74 75 72 6e 73 20 75 73 20 69 6d 6d 65 64 69  eturns us immedi
16a60 61 74 65 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67  ately to locking
16a70 20 6c 65 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20   level 0..** It 
16a80 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
16a90 74 6f 20 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63  to lower the loc
16aa0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73  king level one s
16ab0 74 65 70 20 61 74 20 61 20 74 69 6d 65 2e 20 20  tep at a time.  
16ac0 59 6f 75 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73  You.** must go s
16ad0 74 72 61 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69  traight to locki
16ae0 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73  ng level 0..*/.s
16af0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63  tatic int winLoc
16b00 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
16b10 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
16b20 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
16b30 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52  LITE_OK;    /* R
16b40 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
16b50 73 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20  subroutines */. 
16b60 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20   int res = 1;   
16b70 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
16b80 74 20 6f 66 20 61 20 57 69 6e 64 6f 77 73 20 6c  t of a Windows l
16b90 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e  ock call */.  in
16ba0 74 20 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 20 20  t newLocktype;  
16bb0 20 20 20 20 20 2f 2a 20 53 65 74 20 70 46 69 6c       /* Set pFil
16bc0 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74  e->locktype to t
16bd0 68 69 73 20 76 61 6c 75 65 20 62 65 66 6f 72 65  his value before
16be0 20 65 78 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e   exiting */.  in
16bf0 74 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b  t gotPendingLock
16c00 20 3d 20 30 3b 2f 2a 20 54 72 75 65 20 69 66 20   = 0;/* True if 
16c10 77 65 20 61 63 71 75 69 72 65 64 20 61 20 50 45  we acquired a PE
16c20 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20  NDING lock this 
16c30 74 69 6d 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c  time */.  winFil
16c40 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
16c50 69 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44  ile*)id;.  DWORD
16c60 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f   lastErrno = NO_
16c70 45 52 52 4f 52 3b 0a 0a 20 20 61 73 73 65 72 74  ERROR;..  assert
16c80 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 4f 53 54  ( id!=0 );.  OST
16c90 52 41 43 45 28 28 22 4c 4f 43 4b 20 66 69 6c 65  RACE(("LOCK file
16ca0 3d 25 70 2c 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28  =%p, oldLock=%d(
16cb0 25 64 29 2c 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c  %d), newLock=%d\
16cc0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
16cd0 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
16ce0 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d  locktype, pFile-
16cf0 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c  >sharedLockByte,
16d00 20 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20   locktype));..  
16d10 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
16d20 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66  lready a lock of
16d30 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f   this type or mo
16d40 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f  re restrictive o
16d50 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c  n the.  ** OsFil
16d60 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
16d70 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64  on't use the end
16d80 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
16d90 2c 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65  , as.  ** sqlite
16da0 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 20  3OsEnterMutex() 
16db0 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c  hasn't been call
16dc0 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ed yet..  */.  i
16dd0 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
16de0 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe>=locktype ){.
16df0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f      OSTRACE(("LO
16e00 43 4b 2d 48 45 4c 44 20 66 69 6c 65 3d 25 70 2c  CK-HELD file=%p,
16e10 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
16e20 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
16e30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16e40 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  OK;.  }..  /* Ma
16e50 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b  ke sure the lock
16e60 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
16e70 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61  correct.  */.  a
16e80 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
16e90 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20  cktype!=NO_LOCK 
16ea0 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  || locktype==SHA
16eb0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
16ec0 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d  sert( locktype!=
16ed0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a  PENDING_LOCK );.
16ee0 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
16ef0 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe!=RESERVED_LOC
16f00 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  K || pFile->lock
16f10 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
16f20 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20  K );..  /* Lock 
16f30 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  the PENDING_LOCK
16f40 20 62 79 74 65 20 69 66 20 77 65 20 6e 65 65 64   byte if we need
16f50 20 74 6f 20 61 63 71 75 69 72 65 20 61 20 50 45   to acquire a PE
16f60 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 20  NDING lock or.  
16f70 2a 2a 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ** a SHARED lock
16f80 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 63 71  .  If we are acq
16f90 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20  uiring a SHARED 
16fa0 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71 75 69 73  lock, the acquis
16fb0 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68  ition of.  ** th
16fc0 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62  e PENDING_LOCK b
16fd0 79 74 65 20 69 73 20 74 65 6d 70 6f 72 61 72 79  yte is temporary
16fe0 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b  ..  */.  newLock
16ff0 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f  type = pFile->lo
17000 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 20 20  cktype;.  if(   
17010 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  (pFile->locktype
17020 3d 3d 4e 4f 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  ==NO_LOCK).     
17030 7c 7c 20 28 20 20 20 28 6c 6f 63 6b 74 79 70 65  || (   (locktype
17040 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
17050 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  ).         && (p
17060 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
17070 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 29 0a  RESERVED_LOCK)).
17080 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74    ){.    int cnt
17090 20 3d 20 33 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 3;.    while(
170a0 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65 73   cnt-->0 && (res
170b0 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
170c0 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
170d0 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c  _LOCKFILE_FLAGS,
170e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
170f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17100 20 20 20 20 20 20 20 20 20 20 50 45 4e 44 49 4e            PENDIN
17110 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  G_BYTE, 0, 1, 0)
17120 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )==0 ){.      /*
17130 20 54 72 79 20 33 20 74 69 6d 65 73 20 74 6f 20   Try 3 times to 
17140 67 65 74 20 74 68 65 20 70 65 6e 64 69 6e 67 20  get the pending 
17150 6c 6f 63 6b 2e 20 20 54 68 69 73 20 69 73 20 6e  lock.  This is n
17160 65 65 64 65 64 20 74 6f 20 77 6f 72 6b 0a 20 20  eeded to work.  
17170 20 20 20 20 2a 2a 20 61 72 6f 75 6e 64 20 70 72      ** around pr
17180 6f 62 6c 65 6d 73 20 63 61 75 73 65 64 20 62 79  oblems caused by
17190 20 69 6e 64 65 78 69 6e 67 20 61 6e 64 2f 6f 72   indexing and/or
171a0 20 61 6e 74 69 2d 76 69 72 75 73 20 73 6f 66 74   anti-virus soft
171b0 77 61 72 65 20 6f 6e 0a 20 20 20 20 20 20 2a 2a  ware on.      **
171c0 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73   Windows systems
171d0 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 79 6f  ..      ** If yo
171e0 75 20 61 72 65 20 75 73 69 6e 67 20 74 68 69 73  u are using this
171f0 20 63 6f 64 65 20 61 73 20 61 20 6d 6f 64 65 6c   code as a model
17200 20 66 6f 72 20 61 6c 74 65 72 6e 61 74 69 76 65   for alternative
17210 20 56 46 53 65 73 2c 20 64 6f 20 6e 6f 74 0a 20   VFSes, do not. 
17220 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 74 68 69       ** copy thi
17230 73 20 72 65 74 72 79 20 6c 6f 67 69 63 2e 20 20  s retry logic.  
17240 49 74 20 69 73 20 61 20 68 61 63 6b 20 69 6e 74  It is a hack int
17250 65 6e 64 65 64 20 66 6f 72 20 57 69 6e 64 6f 77  ended for Window
17260 73 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 2a 2f  s only..      */
17270 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f  .      lastErrno
17280 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
17290 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  r();.      OSTRA
172a0 43 45 28 28 22 4c 4f 43 4b 2d 50 45 4e 44 49 4e  CE(("LOCK-PENDIN
172b0 47 2d 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c 20  G-FAIL file=%p, 
172c0 63 6f 75 6e 74 3d 25 64 2c 20 72 65 73 75 6c 74  count=%d, result
172d0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
172e0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
172f0 20 63 6e 74 2c 20 72 65 73 29 29 3b 0a 20 20 20   cnt, res));.   
17300 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f     if( lastErrno
17310 3d 3d 45 52 52 4f 52 5f 49 4e 56 41 4c 49 44 5f  ==ERROR_INVALID_
17320 48 41 4e 44 4c 45 20 29 7b 0a 20 20 20 20 20 20  HANDLE ){.      
17330 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
17340 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
17350 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
17360 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
17370 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
17380 28 22 4c 4f 43 4b 2d 46 41 49 4c 20 66 69 6c 65  ("LOCK-FAIL file
17390 3d 25 70 2c 20 63 6f 75 6e 74 3d 25 64 2c 20 72  =%p, count=%d, r
173a0 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
173b0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
173c0 3e 68 2c 20 63 6e 74 2c 20 73 71 6c 69 74 65 33  >h, cnt, sqlite3
173d0 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
173e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
173f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17400 69 66 28 20 63 6e 74 20 29 20 73 71 6c 69 74 65  if( cnt ) sqlite
17410 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 29  3_win32_sleep(1)
17420 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 50  ;.    }.    gotP
17430 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72 65 73  endingLock = res
17440 3b 0a 20 20 20 20 69 66 28 20 21 72 65 73 20 29  ;.    if( !res )
17450 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e  {.      lastErrn
17460 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
17470 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  or();.    }.  }.
17480 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20  .  /* Acquire a 
17490 73 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f  shared lock.  */
174a0 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
174b0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20  =SHARED_LOCK && 
174c0 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72  res ){.    asser
174d0 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
174e0 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20  pe==NO_LOCK );. 
174f0 20 20 20 72 65 73 20 3d 20 77 69 6e 47 65 74 52     res = winGetR
17500 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  eadLock(pFile);.
17510 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20      if( res ){. 
17520 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65       newLocktype
17530 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
17540 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17550 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
17560 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
17570 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
17580 63 71 75 69 72 65 20 61 20 52 45 53 45 52 56 45  cquire a RESERVE
17590 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66  D lock.  */.  if
175a0 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45  ( locktype==RESE
175b0 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73  RVED_LOCK && res
175c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
175d0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
175e0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
175f0 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63      res = winLoc
17600 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
17610 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
17620 5f 46 4c 41 47 53 2c 20 52 45 53 45 52 56 45 44  _FLAGS, RESERVED
17630 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
17640 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a  .    if( res ){.
17650 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70        newLocktyp
17660 65 20 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  e = RESERVED_LOC
17670 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
17680 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20      lastErrno = 
17690 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
176a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
176b0 2a 20 41 63 71 75 69 72 65 20 61 20 50 45 4e 44  * Acquire a PEND
176c0 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20  ING lock.  */.  
176d0 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
176e0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
176f0 72 65 73 20 29 7b 0a 20 20 20 20 6e 65 77 4c 6f  res ){.    newLo
17700 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47  cktype = PENDING
17710 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f 74 50 65  _LOCK;.    gotPe
17720 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ndingLock = 0;. 
17730 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
17740 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
17750 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  ck.  */.  if( lo
17760 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
17770 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b  E_LOCK && res ){
17780 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
17790 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53 48  le->locktype>=SH
177a0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
177b0 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b   res = winUnlock
177c0 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b  ReadLock(pFile);
177d0 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f  .    res = winLo
177e0 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
177f0 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  , SQLITE_LOCKFIL
17800 45 5f 46 4c 41 47 53 2c 20 53 48 41 52 45 44 5f  E_FLAGS, SHARED_
17810 46 49 52 53 54 2c 20 30 2c 0a 20 20 20 20 20 20  FIRST, 0,.      
17820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17830 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
17840 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a  .    if( res ){.
17850 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70        newLocktyp
17860 65 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  e = EXCLUSIVE_LO
17870 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  CK;.    }else{. 
17880 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d       lastErrno =
17890 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
178a0 29 3b 0a 20 20 20 20 20 20 77 69 6e 47 65 74 52  );.      winGetR
178b0 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  eadLock(pFile);.
178c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
178d0 49 66 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e  If we are holdin
178e0 67 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  g a PENDING lock
178f0 20 74 68 61 74 20 6f 75 67 68 74 20 74 6f 20 62   that ought to b
17900 65 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65 6e  e released, then
17910 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65 20 69 74  .  ** release it
17920 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   now..  */.  if(
17930 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
17940 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  && locktype==SHA
17950 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
17960 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70  winUnlockFile(&p
17970 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47  File->h, PENDING
17980 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
17990 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74  .  }..  /* Updat
179a0 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  e the state of t
179b0 68 65 20 6c 6f 63 6b 20 68 61 73 20 68 65 6c 64  he lock has held
179c0 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73   in the file des
179d0 63 72 69 70 74 6f 72 20 74 68 65 6e 0a 20 20 2a  criptor then.  *
179e0 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61 70 70  * return the app
179f0 72 6f 70 72 69 61 74 65 20 72 65 73 75 6c 74 20  ropriate result 
17a00 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  code..  */.  if(
17a10 20 72 65 73 20 29 7b 0a 20 20 20 20 72 63 20 3d   res ){.    rc =
17a20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
17a30 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lse{.    pFile->
17a40 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
17a50 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20  Errno;.    rc = 
17a60 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
17a70 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d   OSTRACE(("LOCK-
17a80 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c 20 77 61  FAIL file=%p, wa
17a90 6e 74 65 64 3d 25 64 2c 20 67 6f 74 3d 25 64 5c  nted=%d, got=%d\
17aa0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
17ab0 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74   pFile->h, lockt
17ac0 79 70 65 2c 20 6e 65 77 4c 6f 63 6b 74 79 70 65  ype, newLocktype
17ad0 29 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  ));.  }.  pFile-
17ae0 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29  >locktype = (u8)
17af0 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 0a 20 20 4f  newLocktype;.  O
17b00 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 66 69  STRACE(("LOCK fi
17b10 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20  le=%p, lock=%d, 
17b20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
17b30 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70       pFile->h, p
17b40 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  File->locktype, 
17b50 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
17b60 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  c)));.  return r
17b70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
17b80 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
17b90 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
17ba0 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
17bb0 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
17bc0 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
17bd0 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
17be0 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
17bf0 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
17c00 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
17c10 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 7a 65  ro, otherwise ze
17c20 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
17c30 74 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76  t winCheckReserv
17c40 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
17c50 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
17c60 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 65  esOut){.  int re
17c70 73 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  s;.  winFile *pF
17c80 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
17c90 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  id;..  SimulateI
17ca0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
17cb0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
17cc0 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
17cd0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  ;.  OSTRACE(("TE
17ce0 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d  ST-WR-LOCK file=
17cf0 25 70 2c 20 70 52 65 73 4f 75 74 3d 25 70 5c 6e  %p, pResOut=%p\n
17d00 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 52 65  ", pFile->h, pRe
17d10 73 4f 75 74 29 29 3b 0a 0a 20 20 61 73 73 65 72  sOut));..  asser
17d20 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 69 66  t( id!=0 );.  if
17d30 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
17d40 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e>=RESERVED_LOCK
17d50 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 31 3b   ){.    res = 1;
17d60 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54  .    OSTRACE(("T
17d70 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65  EST-WR-LOCK file
17d80 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25 64 20 28  =%p, result=%d (
17d90 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69 6c 65  local)\n", pFile
17da0 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20 7d 65  ->h, res));.  }e
17db0 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d 20 77  lse{.    res = w
17dc0 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  inLockFile(&pFil
17dd0 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  e->h, SQLITE_LOC
17de0 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c 52 45  KFILEEX_FLAGS,RE
17df0 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
17e00 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  1, 0);.    if( r
17e10 65 73 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 55  es ){.      winU
17e20 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
17e30 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ->h, RESERVED_BY
17e40 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
17e50 20 20 7d 0a 20 20 20 20 72 65 73 20 3d 20 21 72    }.    res = !r
17e60 65 73 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  es;.    OSTRACE(
17e70 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66  ("TEST-WR-LOCK f
17e80 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25  ile=%p, result=%
17e90 64 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20 70  d (remote)\n", p
17ea0 46 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a  File->h, res));.
17eb0 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d    }.  *pResOut =
17ec0 20 72 65 73 3b 0a 20 20 4f 53 54 52 41 43 45 28   res;.  OSTRACE(
17ed0 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66  ("TEST-WR-LOCK f
17ee0 69 6c 65 3d 25 70 2c 20 70 52 65 73 4f 75 74 3d  ile=%p, pResOut=
17ef0 25 70 2c 20 2a 70 52 65 73 4f 75 74 3d 25 64 2c  %p, *pResOut=%d,
17f00 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
17f10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
17f20 6c 65 2d 3e 68 2c 20 70 52 65 73 4f 75 74 2c 20  le->h, pResOut, 
17f30 2a 70 52 65 73 4f 75 74 29 29 3b 0a 20 20 72 65  *pResOut));.  re
17f40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17f50 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
17f60 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
17f70 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
17f80 74 6f 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79  tor id to lockty
17f90 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a  pe.  locktype.**
17fa0 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
17fb0 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
17fc0 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
17fd0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
17fe0 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
17ff0 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
18000 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
18010 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
18020 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
18030 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
18040 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
18050 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
18060 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74  le for this rout
18070 69 6e 65 20 74 6f 20 66 61 69 6c 20 69 66 20 74  ine to fail if t
18080 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
18090 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b  nt.** is NO_LOCK
180a0 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
180b0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 48 41   argument is SHA
180c0 52 45 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74 68  RED_LOCK then th
180d0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69  is routine.** mi
180e0 67 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ght return SQLIT
180f0 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61 74  E_IOERR;.*/.stat
18100 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b  ic int winUnlock
18110 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
18120 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
18130 7b 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20  {.  int type;.  
18140 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
18150 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20   (winFile*)id;. 
18160 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
18170 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
18180 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  File!=0 );.  ass
18190 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53  ert( locktype<=S
181a0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
181b0 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
181c0 20 66 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c 6f 63   file=%p, oldLoc
181d0 6b 3d 25 64 28 25 64 29 2c 20 6e 65 77 4c 6f 63  k=%d(%d), newLoc
181e0 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  k=%d\n",.       
181f0 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46      pFile->h, pF
18200 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70  ile->locktype, p
18210 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  File->sharedLock
18220 42 79 74 65 2c 20 6c 6f 63 6b 74 79 70 65 29 29  Byte, locktype))
18230 3b 0a 20 20 74 79 70 65 20 3d 20 70 46 69 6c 65  ;.  type = pFile
18240 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66  ->locktype;.  if
18250 28 20 74 79 70 65 3e 3d 45 58 43 4c 55 53 49 56  ( type>=EXCLUSIV
18260 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69  E_LOCK ){.    wi
18270 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69  nUnlockFile(&pFi
18280 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
18290 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53  RST, 0, SHARED_S
182a0 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  IZE, 0);.    if(
182b0 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
182c0 44 5f 4c 4f 43 4b 20 26 26 20 21 77 69 6e 47 65  D_LOCK && !winGe
182d0 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  tReadLock(pFile)
182e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
182f0 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68  s should never h
18300 61 70 70 65 6e 2e 20 20 57 65 20 73 68 6f 75 6c  appen.  We shoul
18310 64 20 61 6c 77 61 79 73 20 62 65 20 61 62 6c 65  d always be able
18320 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61   to.      ** rea
18330 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
18340 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63  lock */.      rc
18350 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
18360 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
18370 43 4b 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  CK, osGetLastErr
18380 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
18390 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
183a0 6e 55 6e 6c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d  nUnlock", pFile-
183b0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20  >zPath);.    }. 
183c0 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 52   }.  if( type>=R
183d0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
183e0 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c      winUnlockFil
183f0 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53  e(&pFile->h, RES
18400 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31  ERVED_BYTE, 0, 1
18410 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
18420 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43  locktype==NO_LOC
18430 4b 20 26 26 20 74 79 70 65 3e 3d 53 48 41 52 45  K && type>=SHARE
18440 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69  D_LOCK ){.    wi
18450 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28  nUnlockReadLock(
18460 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66  pFile);.  }.  if
18470 28 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f  ( type>=PENDING_
18480 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55  LOCK ){.    winU
18490 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
184a0 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ->h, PENDING_BYT
184b0 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  E, 0, 1, 0);.  }
184c0 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  .  pFile->lockty
184d0 70 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70  pe = (u8)locktyp
184e0 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  e;.  OSTRACE(("U
184f0 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c  NLOCK file=%p, l
18500 6f 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22  ock=%d, rc=%s\n"
18510 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
18520 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
18530 63 6b 74 79 70 65 2c 20 73 71 6c 69 74 65 33 45  cktype, sqlite3E
18540 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
18550 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
18560 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20  .** If *pArg is 
18570 69 6e 69 74 69 61 6c 6c 79 20 6e 65 67 61 74 69  initially negati
18580 76 65 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  ve then this is 
18590 61 20 71 75 65 72 79 2e 20 20 53 65 74 20 2a 70  a query.  Set *p
185a0 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30  Arg to.** 1 or 0
185b0 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
185c0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62 69 74  ether or not bit
185d0 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e   mask of pFile->
185e0 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73 65 74  ctrlFlags is set
185f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67  ..**.** If *pArg
18600 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68 65 6e   is 0 or 1, then
18610 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20 74 68   clear or set th
18620 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20 70 46  e mask bit of pF
18630 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a  ile->ctrlFlags..
18640 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
18650 69 6e 4d 6f 64 65 42 69 74 28 77 69 6e 46 69 6c  inModeBit(winFil
18660 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e  e *pFile, unsign
18670 65 64 20 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e  ed char mask, in
18680 74 20 2a 70 41 72 67 29 7b 0a 20 20 69 66 28 20  t *pArg){.  if( 
18690 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a  *pArg<0 ){.    *
186a0 70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63  pArg = (pFile->c
186b0 74 72 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b 29  trlFlags & mask)
186c0 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  !=0;.  }else if(
186d0 20 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20   (*pArg)==0 ){. 
186e0 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
186f0 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ags &= ~mask;.  
18700 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65  }else{.    pFile
18710 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d  ->ctrlFlags |= m
18720 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46  ask;.  }.}../* F
18730 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
18740 73 20 74 6f 20 56 46 53 20 68 65 6c 70 65 72 20  s to VFS helper 
18750 6d 65 74 68 6f 64 73 20 75 73 65 64 20 66 6f 72  methods used for
18760 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
18770 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77   */.static int w
18780 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 73 71  inGetTempname(sq
18790 6c 69 74 65 33 5f 76 66 73 20 2a 2c 20 63 68 61  lite3_vfs *, cha
187a0 72 20 2a 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  r **);.static in
187b0 74 20 77 69 6e 49 73 44 69 72 28 63 6f 6e 73 74  t winIsDir(const
187c0 20 76 6f 69 64 20 2a 29 3b 0a 73 74 61 74 69 63   void *);.static
187d0 20 42 4f 4f 4c 20 77 69 6e 49 73 44 72 69 76 65   BOOL winIsDrive
187e0 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 63  LetterAndColon(c
187f0 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 0a 2f  onst char *);../
18800 2a 0a 2a 2a 20 43 6f 6e 74 72 6f 6c 20 61 6e 64  *.** Control and
18810 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 6f 70   query of the op
18820 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a  en file handle..
18830 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
18840 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c  nFileControl(sql
18850 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
18860 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
18870 67 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  g){.  winFile *p
18880 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
18890 29 69 64 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  )id;.  OSTRACE((
188a0 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
188b0 6f 70 3d 25 64 2c 20 70 41 72 67 3d 25 70 5c 6e  op=%d, pArg=%p\n
188c0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6f 70 2c  ", pFile->h, op,
188d0 20 70 41 72 67 29 29 3b 0a 20 20 73 77 69 74 63   pArg));.  switc
188e0 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
188f0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  e SQLITE_FCNTL_L
18900 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20  OCKSTATE: {.    
18910 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20    *(int*)pArg = 
18920 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b  pFile->locktype;
18930 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
18940 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
18950 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
18960 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
18970 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18980 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
18990 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f  ase SQLITE_LAST_
189a0 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a  ERRNO: {.      *
189b0 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 69 6e  (int*)pArg = (in
189c0 74 29 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  t)pFile->lastErr
189d0 6e 6f 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  no;.      OSTRAC
189e0 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
189f0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
18a00 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
18a10 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
18a20 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
18a30 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
18a40 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20  NTL_CHUNK_SIZE: 
18a50 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
18a60 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a  zChunk = *(int *
18a70 29 70 41 72 67 3b 0a 20 20 20 20 20 20 4f 53 54  )pArg;.      OST
18a80 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
18a90 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
18aa0 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
18ab0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
18ac0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
18ad0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
18ae0 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  _FCNTL_SIZE_HINT
18af0 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46  : {.      if( pF
18b00 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29  ile->szChunk>0 )
18b10 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
18b20 33 5f 69 6e 74 36 34 20 6f 6c 64 53 7a 3b 0a 20  3_int64 oldSz;. 
18b30 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
18b40 77 69 6e 46 69 6c 65 53 69 7a 65 28 69 64 2c 20  winFileSize(id, 
18b50 26 6f 6c 64 53 7a 29 3b 0a 20 20 20 20 20 20 20  &oldSz);.       
18b60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18b70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
18b80 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 65  sqlite3_int64 ne
18b90 77 53 7a 20 3d 20 2a 28 73 71 6c 69 74 65 33 5f  wSz = *(sqlite3_
18ba0 69 6e 74 36 34 2a 29 70 41 72 67 3b 0a 20 20 20  int64*)pArg;.   
18bb0 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 53 7a         if( newSz
18bc0 3e 6f 6c 64 53 7a 20 29 7b 0a 20 20 20 20 20 20  >oldSz ){.      
18bd0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
18be0 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
18bf0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
18c00 20 77 69 6e 54 72 75 6e 63 61 74 65 28 69 64 2c   winTruncate(id,
18c10 20 6e 65 77 53 7a 29 3b 0a 20 20 20 20 20 20 20   newSz);.       
18c20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
18c30 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
18c40 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
18c50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 4f 53 54     }.        OST
18c60 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
18c70 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20  e=%p, rc=%s\n", 
18c80 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65  pFile->h, sqlite
18c90 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
18ca0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
18cb0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
18cc0 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
18cd0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
18ce0 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
18cf0 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
18d00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
18d10 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
18d20 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49  LITE_FCNTL_PERSI
18d30 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20  ST_WAL: {.      
18d40 69 6e 74 20 62 50 65 72 73 69 73 74 20 3d 20 2a  int bPersist = *
18d50 28 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20 20  (int*)pArg;.    
18d60 20 20 69 66 28 20 62 50 65 72 73 69 73 74 3c 30    if( bPersist<0
18d70 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 28 69 6e   ){.        *(in
18d80 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d  t*)pArg = pFile-
18d90 3e 62 50 65 72 73 69 73 74 57 61 6c 3b 0a 20 20  >bPersistWal;.  
18da0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18db0 20 20 20 70 46 69 6c 65 2d 3e 62 50 65 72 73 69     pFile->bPersi
18dc0 73 74 57 61 6c 20 3d 20 62 50 65 72 73 69 73 74  stWal = bPersist
18dd0 21 3d 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  !=0;.      }.   
18de0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18df0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
18e00 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
18e10 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a  _PERSIST_WAL: {.
18e20 20 20 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74        winModeBit
18e30 28 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f  (pFile, WINFILE_
18e40 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e  PERSIST_WAL, (in
18e50 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20  t*)pArg);.      
18e60 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
18e70 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
18e80 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
18e90 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  >h));.      retu
18ea0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
18eb0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
18ec0 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53  ITE_FCNTL_POWERS
18ed0 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b  AFE_OVERWRITE: {
18ee0 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64 65 42 69  .      winModeBi
18ef0 74 28 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45  t(pFile, WINFILE
18f00 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72  _PSOW, (int*)pAr
18f10 67 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  g);.      OSTRAC
18f20 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
18f30 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
18f40 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
18f50 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
18f60 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
18f70 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
18f80 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20  NTL_VFSNAME: {. 
18f90 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41       *(char**)pA
18fa0 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  rg = sqlite3_mpr
18fb0 69 6e 74 66 28 22 25 73 22 2c 20 70 46 69 6c 65  intf("%s", pFile
18fc0 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a  ->pVfs->zName);.
18fd0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
18fe0 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
18ff0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
19000 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
19010 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19020 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
19030 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
19040 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59 3a 20  WIN32_AV_RETRY: 
19050 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 20 3d  {.      int *a =
19060 20 28 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20   (int*)pArg;.   
19070 20 20 20 69 66 28 20 61 5b 30 5d 3e 30 20 29 7b     if( a[0]>0 ){
19080 0a 20 20 20 20 20 20 20 20 77 69 6e 49 6f 65 72  .        winIoer
19090 72 52 65 74 72 79 20 3d 20 61 5b 30 5d 3b 0a 20  rRetry = a[0];. 
190a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
190b0 20 20 20 20 61 5b 30 5d 20 3d 20 77 69 6e 49 6f      a[0] = winIo
190c0 65 72 72 52 65 74 72 79 3b 0a 20 20 20 20 20 20  errRetry;.      
190d0 7d 0a 20 20 20 20 20 20 69 66 28 20 61 5b 31 5d  }.      if( a[1]
190e0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69  >0 ){.        wi
190f0 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79  nIoerrRetryDelay
19100 20 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d   = a[1];.      }
19110 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 5b  else{.        a[
19120 31 5d 20 3d 20 77 69 6e 49 6f 65 72 72 52 65 74  1] = winIoerrRet
19130 72 79 44 65 6c 61 79 3b 0a 20 20 20 20 20 20 7d  ryDelay;.      }
19140 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
19150 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
19160 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
19170 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
19180 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19190 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  _OK;.    }.#ifde
191a0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
191b0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
191c0 4e 54 4c 5f 57 49 4e 33 32 5f 53 45 54 5f 48 41  NTL_WIN32_SET_HA
191d0 4e 44 4c 45 3a 20 7b 0a 20 20 20 20 20 20 4c 50  NDLE: {.      LP
191e0 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 20 3d 20  HANDLE phFile = 
191f0 28 4c 50 48 41 4e 44 4c 45 29 70 41 72 67 3b 0a  (LPHANDLE)pArg;.
19200 20 20 20 20 20 20 48 41 4e 44 4c 45 20 68 4f 6c        HANDLE hOl
19210 64 46 69 6c 65 20 3d 20 70 46 69 6c 65 2d 3e 68  dFile = pFile->h
19220 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68  ;.      pFile->h
19230 20 3d 20 2a 70 68 46 69 6c 65 3b 0a 20 20 20 20   = *phFile;.    
19240 20 20 2a 70 68 46 69 6c 65 20 3d 20 68 4f 6c 64    *phFile = hOld
19250 46 69 6c 65 3b 0a 20 20 20 20 20 20 4f 53 54 52  File;.      OSTR
19260 41 43 45 28 28 22 46 43 4e 54 4c 20 6f 6c 64 46  ACE(("FCNTL oldF
19270 69 6c 65 3d 25 70 2c 20 6e 65 77 46 69 6c 65 3d  ile=%p, newFile=
19280 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
19290 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
192a0 20 20 20 20 68 4f 6c 64 46 69 6c 65 2c 20 70 46      hOldFile, pF
192b0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
192c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
192d0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
192e0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
192f0 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d  CNTL_TEMPFILENAM
19300 45 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20  E: {.      char 
19310 2a 7a 54 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20  *zTFile = 0;.   
19320 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 47     int rc = winG
19330 65 74 54 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65  etTempname(pFile
19340 2d 3e 70 56 66 73 2c 20 26 7a 54 46 69 6c 65 29  ->pVfs, &zTFile)
19350 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
19360 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19370 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41       *(char**)pA
19380 72 67 20 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20  rg = zTFile;.   
19390 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41     }.      OSTRA
193a0 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
193b0 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46  %p, rc=%s\n", pF
193c0 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45  ile->h, sqlite3E
193d0 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
193e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
193f0 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f     }.#if SQLITE_
19400 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
19410 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
19420 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a  FCNTL_MMAP_SIZE:
19430 20 7b 0a 20 20 20 20 20 20 69 36 34 20 6e 65 77   {.      i64 new
19440 4c 69 6d 69 74 20 3d 20 2a 28 69 36 34 2a 29 70  Limit = *(i64*)p
19450 41 72 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  Arg;.      int r
19460 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
19470 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69       if( newLimi
19480 74 3e 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  t>sqlite3GlobalC
19490 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 20 29 7b 0a  onfig.mxMmap ){.
194a0 20 20 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74          newLimit
194b0 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
194c0 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20  Config.mxMmap;. 
194d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 28 69       }.      *(i
194e0 36 34 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65  64*)pArg = pFile
194f0 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20  ->mmapSizeMax;. 
19500 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69       if( newLimi
19510 74 3e 3d 30 20 26 26 20 6e 65 77 4c 69 6d 69 74  t>=0 && newLimit
19520 21 3d 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  !=pFile->mmapSiz
19530 65 4d 61 78 20 26 26 20 70 46 69 6c 65 2d 3e 6e  eMax && pFile->n
19540 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 7b 0a 20  FetchOut==0 ){. 
19550 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d         pFile->mm
19560 61 70 53 69 7a 65 4d 61 78 20 3d 20 6e 65 77 4c  apSizeMax = newL
19570 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 69 66  imit;.        if
19580 28 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  ( pFile->mmapSiz
19590 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  e>0 ){.         
195a0 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46   winUnmapfile(pF
195b0 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ile);.          
195c0 72 63 20 3d 20 77 69 6e 4d 61 70 66 69 6c 65 28  rc = winMapfile(
195d0 70 46 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 20 20  pFile, -1);.    
195e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
195f0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
19600 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
19610 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %s\n", pFile->h,
19620 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
19630 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74  rc)));.      ret
19640 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 65  urn rc;.    }.#e
19650 6e 64 69 66 0a 20 20 7d 0a 20 20 4f 53 54 52 41  ndif.  }.  OSTRA
19660 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
19670 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f  %p, rc=SQLITE_NO
19680 54 46 4f 55 4e 44 5c 6e 22 2c 20 70 46 69 6c 65  TFOUND\n", pFile
19690 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ->h));.  return 
196a0 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
196b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
196c0 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
196d0 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65   in bytes of the
196e0 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63   underlying bloc
196f0 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20  k device for.** 
19700 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
19710 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f  le. This is almo
19720 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79  st always 512 by
19730 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a  tes, but may be.
19740 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f  ** larger for so
19750 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a  me devices..**.*
19760 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73  * SQLite code as
19770 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74  sumes this funct
19780 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e  ion cannot fail.
19790 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73   It also assumes
197a0 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20   that.** if two 
197b0 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65  files are create
197c0 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69  d in the same fi
197d0 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74  le-system direct
197e0 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64  ory (i.e..** a d
197f0 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20  atabase and its 
19800 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68  journal file) th
19810 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  at the sector si
19820 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a  ze will be the.*
19830 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e  * same for both.
19840 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
19850 69 6e 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c  inSectorSize(sql
19860 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
19870 20 20 28 76 6f 69 64 29 69 64 3b 0a 20 20 72 65    (void)id;.  re
19880 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41  turn SQLITE_DEFA
19890 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  ULT_SECTOR_SIZE;
198a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
198b0 20 61 20 76 65 63 74 6f 72 20 6f 66 20 64 65 76   a vector of dev
198c0 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
198d0 69 63 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ics..*/.static i
198e0 6e 74 20 77 69 6e 44 65 76 69 63 65 43 68 61 72  nt winDeviceChar
198f0 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69  acteristics(sqli
19900 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
19910 20 77 69 6e 46 69 6c 65 20 2a 70 20 3d 20 28 77   winFile *p = (w
19920 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 72 65  inFile*)id;.  re
19930 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41  turn SQLITE_IOCA
19940 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48  P_UNDELETABLE_WH
19950 45 4e 5f 4f 50 45 4e 20 7c 0a 20 20 20 20 20 20  EN_OPEN |.      
19960 20 20 20 28 28 70 2d 3e 63 74 72 6c 46 6c 61 67     ((p->ctrlFlag
19970 73 20 26 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57  s & WINFILE_PSOW
19980 29 3f 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50  )?SQLITE_IOCAP_P
19990 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
199a0 54 45 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE:0);.}../*.** 
199b0 57 69 6e 64 6f 77 73 20 77 69 6c 6c 20 6f 6e 6c  Windows will onl
199c0 79 20 6c 65 74 20 79 6f 75 20 63 72 65 61 74 65  y let you create
199d0 20 66 69 6c 65 20 76 69 65 77 20 6d 61 70 70 69   file view mappi
199e0 6e 67 73 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f 63 61  ngs.** on alloca
199f0 74 69 6f 6e 20 73 69 7a 65 20 67 72 61 6e 75 6c  tion size granul
19a00 61 72 69 74 79 20 62 6f 75 6e 64 61 72 69 65 73  arity boundaries
19a10 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 73 71 6c 69  ..** During sqli
19a20 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 65  te3_os_init() we
19a30 20 64 6f 20 61 20 47 65 74 53 79 73 74 65 6d 49   do a GetSystemI
19a40 6e 66 6f 28 29 0a 2a 2a 20 74 6f 20 67 65 74 20  nfo().** to get 
19a50 74 68 65 20 67 72 61 6e 75 6c 61 72 69 74 79 20  the granularity 
19a60 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
19a70 53 59 53 54 45 4d 5f 49 4e 46 4f 20 77 69 6e 53  SYSTEM_INFO winS
19a80 79 73 49 6e 66 6f 3b 0a 0a 23 69 66 6e 64 65 66  ysInfo;..#ifndef
19a90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
19aa0 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66  ../*.** Helper f
19ab0 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61  unctions to obta
19ac0 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73  in and relinquis
19ad0 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74  h the global mut
19ae0 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61  ex. The.** globa
19af0 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65 64 20  l mutex is used 
19b00 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20 77  to protect the w
19b10 69 6e 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63  inLockInfo objec
19b20 74 73 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68  ts used by.** th
19b30 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20  is file, all of 
19b40 77 68 69 63 68 20 6d 61 79 20 62 65 20 73 68 61  which may be sha
19b50 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20  red by multiple 
19b60 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46  threads..**.** F
19b70 75 6e 63 74 69 6f 6e 20 77 69 6e 53 68 6d 4d 75  unction winShmMu
19b80 74 65 78 48 65 6c 64 28 29 20 69 73 20 75 73 65  texHeld() is use
19b90 64 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68  d to assert() th
19ba0 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75  at the global mu
19bb0 74 65 78 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77  tex.** is held w
19bc0 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68  hen required. Th
19bd0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
19be0 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74  nly used as part
19bf0 20 6f 66 20 61 73 73 65 72 74 28 29 0a 2a 2a 20   of assert().** 
19c00 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e  statements. e.g.
19c10 0a 2a 2a 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 45  .**.**   winShmE
19c20 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20  nterMutex().**  
19c30 20 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 68     assert( winSh
19c40 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  mMutexHeld() );.
19c50 2a 2a 20 20 20 77 69 6e 53 68 6d 4c 65 61 76 65  **   winShmLeave
19c60 4d 75 74 65 78 28 29 0a 2a 2f 0a 73 74 61 74 69  Mutex().*/.stati
19c70 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 45 6e 74  c void winShmEnt
19c80 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20  erMutex(void){. 
19c90 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
19ca0 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65  nter(sqlite3Mute
19cb0 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
19cc0 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
19cd0 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  R));.}.static vo
19ce0 69 64 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75  id winShmLeaveMu
19cf0 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  tex(void){.  sql
19d00 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
19d10 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
19d20 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
19d30 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b  STATIC_MASTER));
19d40 0a 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  .}.#ifndef NDEBU
19d50 47 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  G.static int win
19d60 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 76 6f 69  ShmMutexHeld(voi
19d70 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  d) {.  return sq
19d80 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
19d90 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
19da0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
19db0 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b  STATIC_MASTER));
19dc0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
19dd0 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20   Object used to 
19de0 72 65 70 72 65 73 65 6e 74 20 61 20 73 69 6e 67  represent a sing
19df0 6c 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61  le file opened a
19e00 6e 64 20 6d 6d 61 70 70 65 64 20 74 6f 20 70 72  nd mmapped to pr
19e10 6f 76 69 64 65 0a 2a 2a 20 73 68 61 72 65 64 20  ovide.** shared 
19e20 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75  memory.  When mu
19e30 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 20 61  ltiple threads a
19e40 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ll reference the
19e50 20 73 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d   same.** log-sum
19e60 6d 61 72 79 2c 20 65 61 63 68 20 74 68 72 65 61  mary, each threa
19e70 64 20 68 61 73 20 69 74 73 20 6f 77 6e 20 77 69  d has its own wi
19e80 6e 46 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75  nFile object, bu
19e90 74 20 74 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f  t they all.** po
19ea0 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  int to a single 
19eb0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
19ec0 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68   object.  In oth
19ed0 65 72 20 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a  er words, each.*
19ee0 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73  * log-summary is
19ef0 20 6f 70 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63   opened only onc
19f00 65 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a  e per process..*
19f10 2a 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78  *.** winShmMutex
19f20 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74  Held() must be t
19f30 72 75 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e  rue when creatin
19f40 67 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a  g or destroying.
19f50 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f  ** this object o
19f60 72 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  r while reading 
19f70 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 66  or writing the f
19f80 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a  ollowing fields:
19f90 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66  .**.**      nRef
19fa0 0a 2a 2a 20 20 20 20 20 20 70 4e 65 78 74 0a 2a  .**      pNext.*
19fb0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
19fc0 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  ng fields are re
19fd0 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68  ad-only after th
19fe0 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
19ff0 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ted:.**.**      
1a000 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c  fid.**      zFil
1a010 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68  ename.**.** Eith
1a020 65 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75  er winShmNode.mu
1a030 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64  tex must be held
1a040 20 6f 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e   or winShmNode.n
1a050 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77 69  Ref==0 and.** wi
1a060 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  nShmMutexHeld() 
1a070 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65 61  is true when rea
1a080 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
1a090 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a  any other field.
1a0a0 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ** in this struc
1a0b0 74 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75  ture..**.*/.stru
1a0c0 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a  ct winShmNode {.
1a0d0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
1a0e0 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20  *mutex;      /* 
1a0f0 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73 73 20  Mutex to access 
1a100 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  this object */. 
1a110 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1a120 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
1a130 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
1a140 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 68 46 69  */.  winFile hFi
1a150 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
1a160 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66  /* File handle f
1a170 72 6f 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a  rom winOpen */..
1a180 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20    int szRegion; 
1a190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a1a0 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d  Size of shared-m
1a1b0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f  emory regions */
1a1c0 0a 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20  .  int nRegion; 
1a1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a1e0 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61   Size of array a
1a1f0 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 74 72  pRegion */.  str
1a200 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b 0a  uct ShmRegion {.
1a210 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b      HANDLE hMap;
1a220 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a230 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d  File handle from
1a240 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69   CreateFileMappi
1a250 6e 67 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a  ng */.    void *
1a260 70 4d 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67 69  pMap;.  } *aRegi
1a270 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74  on;.  DWORD last
1a280 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  Errno;          
1a290 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20   /* The Windows 
1a2a0 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c  errno from the l
1a2b0 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f  ast I/O error */
1a2c0 0a 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  ..  int nRef;   
1a2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a2e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e 53  * Number of winS
1a2f0 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74  hm objects point
1a300 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20  ing to this */. 
1a310 20 77 69 6e 53 68 6d 20 2a 70 46 69 72 73 74 3b   winShm *pFirst;
1a320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1a330 6c 6c 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74  ll winShm object
1a340 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  s pointing to th
1a350 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f  is */.  winShmNo
1a360 64 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  de *pNext;      
1a370 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69     /* Next in li
1a380 73 74 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d  st of all winShm
1a390 4e 6f 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Node objects */.
1a3a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1a3b0 42 55 47 0a 20 20 75 38 20 6e 65 78 74 53 68 6d  BUG.  u8 nextShm
1a3c0 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Id;             
1a3d0 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62   /* Next availab
1a3e0 6c 65 20 77 69 6e 53 68 6d 2e 69 64 20 76 61 6c  le winShm.id val
1a3f0 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  ue */.#endif.};.
1a400 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20  ./*.** A global 
1a410 61 72 72 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e  array of all win
1a420 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e  ShmNode objects.
1a430 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68  .**.** The winSh
1a440 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73  mMutexHeld() mus
1a450 74 20 62 65 20 74 72 75 65 20 77 68 69 6c 65 20  t be true while 
1a460 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
1a470 6e 67 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f  ng this list..*/
1a480 0a 73 74 61 74 69 63 20 77 69 6e 53 68 6d 4e 6f  .static winShmNo
1a490 64 65 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c 69  de *winShmNodeLi
1a4a0 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53  st = 0;../*.** S
1a4b0 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e  tructure used in
1a4c0 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73  ternally by this
1a4d0 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74   VFS to record t
1a4e0 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a  he state of an.*
1a4f0 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65  * open shared me
1a500 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  mory connection.
1a510 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
1a520 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
1a530 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e  initialized when
1a540 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   this object is 
1a550 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61  created and.** a
1a560 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65  re read-only the
1a570 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20  reafter:.**.**  
1a580 20 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64    winShm.pShmNod
1a590 65 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 69  e.**    winShm.i
1a5a0 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65  d.**.** All othe
1a5b0 72 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61  r fields are rea
1a5c0 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20 77 69  d/write.  The wi
1a5d0 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nShm.pShmNode->m
1a5e0 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c  utex must be hel
1a5f0 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73  d.** while acces
1a600 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72  sing any read/wr
1a610 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73  ite fields..*/.s
1a620 74 72 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a 20  truct winShm {. 
1a630 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
1a640 6d 4e 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20 54  mNode;      /* T
1a650 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 77 69  he underlying wi
1a660 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  nShmNode object 
1a670 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e 65  */.  winShm *pNe
1a680 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  xt;             
1a690 2f 2a 20 4e 65 78 74 20 77 69 6e 53 68 6d 20 77  /* Next winShm w
1a6a0 69 74 68 20 74 68 65 20 73 61 6d 65 20 77 69 6e  ith the same win
1a6b0 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20  ShmNode */.  u8 
1a6c0 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20  hasMutex;       
1a6d0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1a6e0 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 77  if holding the w
1a6f0 69 6e 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20  inShmNode mutex 
1a700 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d  */.  u16 sharedM
1a710 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
1a720 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65  /* Mask of share
1a730 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  d locks held */.
1a740 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20    u16 exclMask; 
1a750 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a760 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76  Mask of exclusiv
1a770 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  e locks held */.
1a780 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1a790 42 55 47 0a 20 20 75 38 20 69 64 3b 20 20 20 20  BUG.  u8 id;    
1a7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7b0 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63   /* Id of this c
1a7c0 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 69  onnection with i
1a7d0 74 73 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f  ts winShmNode */
1a7e0 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
1a7f0 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64  * Constants used
1a800 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a   for locking.*/.
1a810 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f  #define WIN_SHM_
1a820 42 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49  BASE   ((22+SQLI
1a830 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29  TE_SHM_NLOCK)*4)
1a840 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74          /* first
1a850 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64   lock byte */.#d
1a860 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 44 4d  efine WIN_SHM_DM
1a870 53 20 20 20 20 28 57 49 4e 5f 53 48 4d 5f 42 41  S    (WIN_SHM_BA
1a880 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  SE+SQLITE_SHM_NL
1a890 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e  OCK)  /* deadman
1a8a0 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a   switch */../*.*
1a8b0 2a 20 41 70 70 6c 79 20 61 64 76 69 73 6f 72 79  * Apply advisory
1a8c0 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 6e   locks for all n
1a8d0 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67   bytes beginning
1a8e0 20 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64 65   at ofst..*/.#de
1a8f0 66 69 6e 65 20 5f 53 48 4d 5f 55 4e 4c 43 4b 20  fine _SHM_UNLCK 
1a900 20 31 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f   1.#define _SHM_
1a910 52 44 4c 43 4b 20 20 32 0a 23 64 65 66 69 6e 65  RDLCK  2.#define
1a920 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 20 33 0a 73   _SHM_WRLCK  3.s
1a930 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d  tatic int winShm
1a940 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 77 69  SystemLock(.  wi
1a950 6e 53 68 6d 4e 6f 64 65 20 2a 70 46 69 6c 65 2c  nShmNode *pFile,
1a960 20 20 20 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63      /* Apply loc
1a970 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20  ks to this open 
1a980 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65  shared-memory se
1a990 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  gment */.  int l
1a9a0 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20  ockType,        
1a9b0 20 2f 2a 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20   /* _SHM_UNLCK, 
1a9c0 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20 5f  _SHM_RDLCK, or _
1a9d0 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69  SHM_WRLCK */.  i
1a9e0 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20  nt ofst,        
1a9f0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
1aa00 6f 20 66 69 72 73 74 20 62 79 74 65 20 74 6f 20  o first byte to 
1aa10 62 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63 6b  be locked/unlock
1aa20 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  ed */.  int nByt
1aa30 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
1aa40 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1aa50 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f   to lock or unlo
1aa60 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ck */.){.  int r
1aa70 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
1aa80 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
1aa90 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b  form Lock/Unlock
1aaa0 46 69 6c 65 45 78 28 29 20 2a 2f 0a 0a 20 20 2f  FileEx() */..  /
1aab0 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20  * Access to the 
1aac0 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  winShmNode objec
1aad0 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20  t is serialized 
1aae0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f  by the caller */
1aaf0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1ab00 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 46  e3_mutex_held(pF
1ab10 69 6c 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70  ile->mutex) || p
1ab20 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b  File->nRef==0 );
1ab30 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ..  OSTRACE(("SH
1ab40 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  M-LOCK file=%p, 
1ab50 6c 6f 63 6b 3d 25 64 2c 20 6f 66 66 73 65 74 3d  lock=%d, offset=
1ab60 25 64 2c 20 73 69 7a 65 3d 25 64 5c 6e 22 2c 0a  %d, size=%d\n",.
1ab70 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
1ab80 2d 3e 68 46 69 6c 65 2e 68 2c 20 6c 6f 63 6b 54  ->hFile.h, lockT
1ab90 79 70 65 2c 20 6f 66 73 74 2c 20 6e 42 79 74 65  ype, ofst, nByte
1aba0 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73  ));..  /* Releas
1abb0 65 2f 41 63 71 75 69 72 65 20 74 68 65 20 73 79  e/Acquire the sy
1abc0 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20  stem-level lock 
1abd0 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79 70  */.  if( lockTyp
1abe0 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20 29 7b  e==_SHM_UNLCK ){
1abf0 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 55 6e 6c  .    rc = winUnl
1ac00 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
1ac10 68 46 69 6c 65 2e 68 2c 20 6f 66 73 74 2c 20 30  hFile.h, ofst, 0
1ac20 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d  , nByte, 0);.  }
1ac30 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69  else{.    /* Ini
1ac40 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b  tialize the lock
1ac50 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a  ing parameters *
1ac60 2f 0a 20 20 20 20 44 57 4f 52 44 20 64 77 46 6c  /.    DWORD dwFl
1ac70 61 67 73 20 3d 20 4c 4f 43 4b 46 49 4c 45 5f 46  ags = LOCKFILE_F
1ac80 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 3b  AIL_IMMEDIATELY;
1ac90 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70  .    if( lockTyp
1aca0 65 20 3d 3d 20 5f 53 48 4d 5f 57 52 4c 43 4b 20  e == _SHM_WRLCK 
1acb0 29 20 64 77 46 6c 61 67 73 20 7c 3d 20 4c 4f 43  ) dwFlags |= LOC
1acc0 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f  KFILE_EXCLUSIVE_
1acd0 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 77  LOCK;.    rc = w
1ace0 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  inLockFile(&pFil
1acf0 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 64 77 46 6c  e->hFile.h, dwFl
1ad00 61 67 73 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42  ags, ofst, 0, nB
1ad10 79 74 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  yte, 0);.  }..  
1ad20 69 66 28 20 72 63 21 3d 20 30 20 29 7b 0a 20 20  if( rc!= 0 ){.  
1ad30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1ad40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1ad50 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
1ad60 3d 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  =  osGetLastErro
1ad70 72 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  r();.    rc = SQ
1ad80 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a  LITE_BUSY;.  }..
1ad90 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
1ada0 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 66 75  LOCK file=%p, fu
1adb0 6e 63 3d 25 73 2c 20 65 72 72 6e 6f 3d 25 6c 75  nc=%s, errno=%lu
1adc0 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
1add0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 46         pFile->hF
1ade0 69 6c 65 2e 68 2c 20 28 6c 6f 63 6b 54 79 70 65  ile.h, (lockType
1adf0 20 3d 3d 20 5f 53 48 4d 5f 55 4e 4c 43 4b 29 20   == _SHM_UNLCK) 
1ae00 3f 20 22 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65  ? "winUnlockFile
1ae10 22 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20 22  " :.           "
1ae20 77 69 6e 4c 6f 63 6b 46 69 6c 65 22 2c 20 70 46  winLockFile", pF
1ae30 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20  ile->lastErrno, 
1ae40 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
1ae50 63 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  c)));..  return 
1ae60 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
1ae70 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  d references to 
1ae80 56 46 53 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73  VFS methods */.s
1ae90 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65  tatic int winOpe
1aea0 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 63  n(sqlite3_vfs*,c
1aeb0 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74  onst char*,sqlit
1aec0 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69 6e 74  e3_file*,int,int
1aed0 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  *);.static int w
1aee0 69 6e 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  inDelete(sqlite3
1aef0 5f 76 66 73 20 2a 2c 63 6f 6e 73 74 20 63 68 61  _vfs *,const cha
1af00 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  r*,int);../*.** 
1af10 50 75 72 67 65 20 74 68 65 20 77 69 6e 53 68 6d  Purge the winShm
1af20 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66  NodeList list of
1af30 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74   all entries wit
1af40 68 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65  h winShmNode.nRe
1af50 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  f==0..**.** This
1af60 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68   is not a VFS sh
1af70 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68  ared-memory meth
1af80 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c  od; it is a util
1af90 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ity function cal
1afa0 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68  led.** by VFS sh
1afb0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68  ared-memory meth
1afc0 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ods..*/.static v
1afd0 6f 69 64 20 77 69 6e 53 68 6d 50 75 72 67 65 28  oid winShmPurge(
1afe0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1aff0 73 2c 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61  s, int deleteFla
1b000 67 29 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65  g){.  winShmNode
1b010 20 2a 2a 70 70 3b 0a 20 20 77 69 6e 53 68 6d 4e   **pp;.  winShmN
1b020 6f 64 65 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  ode *p;.  assert
1b030 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  ( winShmMutexHel
1b040 64 28 29 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  d() );.  OSTRACE
1b050 28 28 22 53 48 4d 2d 50 55 52 47 45 20 70 69 64  (("SHM-PURGE pid
1b060 3d 25 6c 75 2c 20 64 65 6c 65 74 65 46 6c 61 67  =%lu, deleteFlag
1b070 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
1b080 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1b090 72 6f 63 65 73 73 49 64 28 29 2c 20 64 65 6c 65  rocessId(), dele
1b0a0 74 65 46 6c 61 67 29 29 3b 0a 20 20 70 70 20 3d  teFlag));.  pp =
1b0b0 20 26 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74   &winShmNodeList
1b0c0 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 20 3d 20  ;.  while( (p = 
1b0d0 2a 70 70 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  *pp)!=0 ){.    i
1b0e0 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  f( p->nRef==0 ){
1b0f0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
1b100 20 20 20 20 69 66 28 20 70 2d 3e 6d 75 74 65 78      if( p->mutex
1b110 20 29 7b 20 73 71 6c 69 74 65 33 5f 6d 75 74 65   ){ sqlite3_mute
1b120 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29  x_free(p->mutex)
1b130 3b 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ; }.      for(i=
1b140 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b  0; i<p->nRegion;
1b150 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 42   i++){.        B
1b160 4f 4f 4c 20 62 52 63 20 3d 20 6f 73 55 6e 6d 61  OOL bRc = osUnma
1b170 70 56 69 65 77 4f 66 46 69 6c 65 28 70 2d 3e 61  pViewOfFile(p->a
1b180 52 65 67 69 6f 6e 5b 69 5d 2e 70 4d 61 70 29 3b  Region[i].pMap);
1b190 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45  .        OSTRACE
1b1a0 28 28 22 53 48 4d 2d 50 55 52 47 45 2d 55 4e 4d  (("SHM-PURGE-UNM
1b1b0 41 50 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69  AP pid=%lu, regi
1b1c0 6f 6e 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c  on=%d, rc=%s\n",
1b1d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b1e0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1b1f0 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 20 62 52  ocessId(), i, bR
1b200 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  c ? "ok" : "fail
1b210 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 55  ed"));.        U
1b220 4e 55 53 45 44 5f 56 41 52 49 41 42 4c 45 5f 56  NUSED_VARIABLE_V
1b230 41 4c 55 45 28 62 52 63 29 3b 0a 20 20 20 20 20  ALUE(bRc);.     
1b240 20 20 20 62 52 63 20 3d 20 6f 73 43 6c 6f 73 65     bRc = osClose
1b250 48 61 6e 64 6c 65 28 70 2d 3e 61 52 65 67 69 6f  Handle(p->aRegio
1b260 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20 20 20 20  n[i].hMap);.    
1b270 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48      OSTRACE(("SH
1b280 4d 2d 50 55 52 47 45 2d 43 4c 4f 53 45 20 70 69  M-PURGE-CLOSE pi
1b290 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64  d=%lu, region=%d
1b2a0 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
1b2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
1b2c0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1b2d0 49 64 28 29 2c 20 69 2c 20 62 52 63 20 3f 20 22  Id(), i, bRc ? "
1b2e0 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
1b2f0 3b 0a 20 20 20 20 20 20 20 20 55 4e 55 53 45 44  ;.        UNUSED
1b300 5f 56 41 52 49 41 42 4c 45 5f 56 41 4c 55 45 28  _VARIABLE_VALUE(
1b310 62 52 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bRc);.      }.  
1b320 20 20 20 20 69 66 28 20 70 2d 3e 68 46 69 6c 65      if( p->hFile
1b330 2e 68 21 3d 4e 55 4c 4c 20 26 26 20 70 2d 3e 68  .h!=NULL && p->h
1b340 46 69 6c 65 2e 68 21 3d 49 4e 56 41 4c 49 44 5f  File.h!=INVALID_
1b350 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a  HANDLE_VALUE ){.
1b360 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65          Simulate
1b370 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
1b380 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 43 6c 6f  ;.        winClo
1b390 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  se((sqlite3_file
1b3a0 20 2a 29 26 70 2d 3e 68 46 69 6c 65 29 3b 0a 20   *)&p->hFile);. 
1b3b0 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49         SimulateI
1b3c0 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
1b3d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1b3e0 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20 29 7b  f( deleteFlag ){
1b3f0 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74  .        Simulat
1b400 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
1b410 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1b420 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
1b430 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 77  loc();.        w
1b440 69 6e 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70  inDelete(pVfs, p
1b450 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b  ->zFilename, 0);
1b460 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b470 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
1b480 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c  );.        Simul
1b490 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
1b4a0 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (0);.      }.   
1b4b0 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78     *pp = p->pNex
1b4c0 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
1b4d0 5f 66 72 65 65 28 70 2d 3e 61 52 65 67 69 6f 6e  _free(p->aRegion
1b4e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1b4f0 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 7d 65  _free(p);.    }e
1b500 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 20 3d 20  lse{.      pp = 
1b510 26 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  &p->pNext;.    }
1b520 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  .  }.}../*.** Op
1b530 65 6e 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65  en the shared-me
1b540 6d 6f 72 79 20 61 72 65 61 20 61 73 73 6f 63 69  mory area associ
1b550 61 74 65 64 20 77 69 74 68 20 64 61 74 61 62 61  ated with databa
1b560 73 65 20 66 69 6c 65 20 70 44 62 46 64 2e 0a 2a  se file pDbFd..*
1b570 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e  *.** When openin
1b580 67 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d  g a new shared-m
1b590 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e  emory file, if n
1b5a0 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65  o other instance
1b5b0 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c  s of that.** fil
1b5c0 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  e are currently 
1b5d0 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72  open, in this pr
1b5e0 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65  ocess or in othe
1b5f0 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65  r processes, the
1b600 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75  n.** the file mu
1b610 73 74 20 62 65 20 74 72 75 6e 63 61 74 65 64 20  st be truncated 
1b620 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f  to zero length o
1b630 72 20 68 61 76 65 20 69 74 73 20 68 65 61 64 65  r have its heade
1b640 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74  r cleared..*/.st
1b650 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e  atic int winOpen
1b660 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 77 69 6e  SharedMemory(win
1b670 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20  File *pDbFd){.  
1b680 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20 2a 70  struct winShm *p
1b690 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b6a0 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63     /* The connec
1b6b0 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65  tion to be opene
1b6c0 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 77 69  d */.  struct wi
1b6d0 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  nShmNode *pShmNo
1b6e0 64 65 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65  de = 0;   /* The
1b6f0 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70   underlying mmap
1b700 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ped file */.  in
1b710 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1b720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b730 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
1b740 2a 2f 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53  */.  struct winS
1b750 68 6d 4e 6f 64 65 20 2a 70 4e 65 77 3b 20 20 20  hmNode *pNew;   
1b760 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79          /* Newly
1b770 20 61 6c 6c 6f 63 61 74 65 64 20 77 69 6e 53 68   allocated winSh
1b780 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  mNode */.  int n
1b790 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
1b7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b7b0 20 53 69 7a 65 20 6f 66 20 7a 4e 61 6d 65 20 69   Size of zName i
1b7c0 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 61 73  n bytes */..  as
1b7d0 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68  sert( pDbFd->pSh
1b7e0 6d 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 4e 6f  m==0 );    /* No
1b7f0 74 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65  t previously ope
1b800 6e 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  ned */..  /* All
1b810 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
1b820 74 68 65 20 6e 65 77 20 73 71 6c 69 74 65 33 5f  the new sqlite3_
1b830 73 68 6d 20 6f 62 6a 65 63 74 2e 20 20 41 6c 73  shm object.  Als
1b840 6f 20 73 70 65 63 75 6c 61 74 69 76 65 6c 79 0a  o speculatively.
1b850 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 73 70    ** allocate sp
1b860 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20 77 69  ace for a new wi
1b870 6e 53 68 6d 4e 6f 64 65 20 61 6e 64 20 66 69 6c  nShmNode and fil
1b880 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 20  ename..  */.  p 
1b890 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
1b8a0 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 29 20  ero( sizeof(*p) 
1b8b0 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
1b8c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1b8d0 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 6e 4e 61  ERR_NOMEM;.  nNa
1b8e0 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
1b8f0 65 6e 33 30 28 70 44 62 46 64 2d 3e 7a 50 61 74  en30(pDbFd->zPat
1b900 68 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  h);.  pNew = sql
1b910 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
1b920 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65  sizeof(*pShmNode
1b930 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 37 20 29  ) + nName + 17 )
1b940 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
1b950 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
1b960 72 65 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75  ree(p);.    retu
1b970 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1b980 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 4e 65  NOMEM;.  }.  pNe
1b990 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28  w->zFilename = (
1b9a0 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  char*)&pNew[1];.
1b9b0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
1b9c0 74 66 28 6e 4e 61 6d 65 2b 31 35 2c 20 70 4e 65  tf(nName+15, pNe
1b9d0 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 25  w->zFilename, "%
1b9e0 73 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a  s-shm", pDbFd->z
1b9f0 50 61 74 68 29 3b 0a 20 20 73 71 6c 69 74 65 33  Path);.  sqlite3
1ba00 46 69 6c 65 53 75 66 66 69 78 33 28 70 44 62 46  FileSuffix3(pDbF
1ba10 64 2d 3e 7a 50 61 74 68 2c 20 70 4e 65 77 2d 3e  d->zPath, pNew->
1ba20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 0a 20 20 2f  zFilename);..  /
1ba30 2a 20 4c 6f 6f 6b 20 74 6f 20 73 65 65 20 69 66  * Look to see if
1ba40 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 78 69   there is an exi
1ba50 73 74 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65  sting winShmNode
1ba60 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
1ba70 64 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f 20 6d 61  d..  ** If no ma
1ba80 74 63 68 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64  tching winShmNod
1ba90 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73  e currently exis
1baa0 74 73 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77  ts, create a new
1bab0 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 69 6e   one..  */.  win
1bac0 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  ShmEnterMutex();
1bad0 0a 20 20 66 6f 72 28 70 53 68 6d 4e 6f 64 65 20  .  for(pShmNode 
1bae0 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74  = winShmNodeList
1baf0 3b 20 70 53 68 6d 4e 6f 64 65 3b 20 70 53 68 6d  ; pShmNode; pShm
1bb00 4e 6f 64 65 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  Node=pShmNode->p
1bb10 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54 42  Next){.    /* TB
1bb20 44 20 6e 65 65 64 20 74 6f 20 63 6f 6d 65 20 75  D need to come u
1bb30 70 20 77 69 74 68 20 62 65 74 74 65 72 20 6d 61  p with better ma
1bb40 74 63 68 20 68 65 72 65 2e 20 20 50 65 72 68 61  tch here.  Perha
1bb50 70 73 0a 20 20 20 20 2a 2a 20 75 73 65 20 46 49  ps.    ** use FI
1bb60 4c 45 5f 49 44 5f 42 4f 54 48 5f 44 49 52 5f 49  LE_ID_BOTH_DIR_I
1bb70 4e 46 4f 20 53 74 72 75 63 74 75 72 65 2e 0a 20  NFO Structure.. 
1bb80 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71     */.    if( sq
1bb90 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 53 68  lite3StrICmp(pSh
1bba0 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
1bbb0 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d  , pNew->zFilenam
1bbc0 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
1bbd0 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64   }.  if( pShmNod
1bbe0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
1bbf0 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 7d  _free(pNew);.  }
1bc00 65 6c 73 65 7b 0a 20 20 20 20 70 53 68 6d 4e 6f  else{.    pShmNo
1bc10 64 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70  de = pNew;.    p
1bc20 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 28 28 77  New = 0;.    ((w
1bc30 69 6e 46 69 6c 65 2a 29 28 26 70 53 68 6d 4e 6f  inFile*)(&pShmNo
1bc40 64 65 2d 3e 68 46 69 6c 65 29 29 2d 3e 68 20 3d  de->hFile))->h =
1bc50 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f   INVALID_HANDLE_
1bc60 56 41 4c 55 45 3b 0a 20 20 20 20 70 53 68 6d 4e  VALUE;.    pShmN
1bc70 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 77 69 6e  ode->pNext = win
1bc80 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 20  ShmNodeList;.   
1bc90 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20   winShmNodeList 
1bca0 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 20  = pShmNode;..   
1bcb0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
1bcc0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   = sqlite3_mutex
1bcd0 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
1bce0 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69  TEX_FAST);.    i
1bcf0 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  f( pShmNode->mut
1bd00 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ex==0 ){.      r
1bd10 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
1bd20 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
1bd30 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
1bd40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
1bd50 20 77 69 6e 4f 70 65 6e 28 70 44 62 46 64 2d 3e   winOpen(pDbFd->
1bd60 70 56 66 73 2c 0a 20 20 20 20 20 20 20 20 20 20  pVfs,.          
1bd70 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
1bd80 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20  >zFilename,     
1bd90 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1bda0 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55 54 46  of the file (UTF
1bdb0 2d 38 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  -8) */.         
1bdc0 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
1bdd0 5f 66 69 6c 65 2a 29 26 70 53 68 6d 4e 6f 64 65  _file*)&pShmNode
1bde0 2d 3e 68 46 69 6c 65 2c 20 20 2f 2a 20 46 69 6c  ->hFile,  /* Fil
1bdf0 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f  e handle here */
1be00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1be10 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41    SQLITE_OPEN_WA
1be20 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  L | SQLITE_OPEN_
1be30 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
1be40 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 0a  TE_OPEN_CREATE,.
1be50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be60 20 30 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c   0);.    if( SQL
1be70 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
1be80 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
1be90 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  n_err;.    }..  
1bea0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
1beb0 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f  e if another pro
1bec0 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
1bed0 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69  the dead-man swi
1bee0 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e  tch..    ** If n
1bef0 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  ot, truncate the
1bf00 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65   file to zero le
1bf10 6e 67 74 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ngth..    */.   
1bf20 20 69 66 28 20 77 69 6e 53 68 6d 53 79 73 74 65   if( winShmSyste
1bf30 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
1bf40 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e 5f  _SHM_WRLCK, WIN_
1bf50 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c  SHM_DMS, 1)==SQL
1bf60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1bf70 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65  rc = winTruncate
1bf80 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
1bf90 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  )&pShmNode->hFil
1bfa0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  e, 0);.      if(
1bfb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1bfc0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  {.        rc = w
1bfd0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
1bfe0 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c  E_IOERR_SHMOPEN,
1bff0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
1c000 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
1c010 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
1c020 4f 70 65 6e 53 68 6d 22 2c 20 70 44 62 46 64 2d  OpenShm", pDbFd-
1c030 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d  >zPath);.      }
1c040 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1c050 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c060 20 20 20 20 20 20 77 69 6e 53 68 6d 53 79 73 74        winShmSyst
1c070 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
1c080 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e   _SHM_UNLCK, WIN
1c090 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20  _SHM_DMS, 1);.  
1c0a0 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53      rc = winShmS
1c0b0 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
1c0c0 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20  de, _SHM_RDLCK, 
1c0d0 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b  WIN_SHM_DMS, 1);
1c0e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1c0f0 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65  c ) goto shm_ope
1c100 6e 5f 65 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  n_err;.  }..  /*
1c110 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f   Make the new co
1c120 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64  nnection a child
1c130 20 6f 66 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f   of the winShmNo
1c140 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e  de */.  p->pShmN
1c150 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a  ode = pShmNode;.
1c160 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1c170 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53  BUG.  p->id = pS
1c180 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49  hmNode->nextShmI
1c190 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53  d++;.#endif.  pS
1c1a0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a  hmNode->nRef++;.
1c1b0 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20    pDbFd->pShm = 
1c1c0 70 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65  p;.  winShmLeave
1c1d0 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54  Mutex();..  /* T
1c1e0 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
1c1f0 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68  nt on pShmNode h
1c200 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1c210 69 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65  incremented unde
1c220 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72  r.  ** the cover
1c230 20 6f 66 20 74 68 65 20 77 69 6e 53 68 6d 45 6e   of the winShmEn
1c240 74 65 72 4d 75 74 65 78 28 29 20 6d 75 74 65 78  terMutex() mutex
1c250 20 61 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72   and the pointer
1c260 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e   from the.  ** n
1c270 65 77 20 28 73 74 72 75 63 74 20 77 69 6e 53 68  ew (struct winSh
1c280 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  m) object to the
1c290 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65   pShmNode has be
1c2a0 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74  en set. All that
1c2b0 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f   is.  ** left to
1c2c0 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74   do is to link t
1c2d0 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e  he new object in
1c2e0 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  to the linked li
1c2f0 73 74 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a  st starting.  **
1c300 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46   at pShmNode->pF
1c310 69 72 73 74 2e 20 54 68 69 73 20 6d 75 73 74 20  irst. This must 
1c320 62 65 20 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f  be done while ho
1c330 6c 64 69 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f  lding the pShmNo
1c340 64 65 2d 3e 6d 75 74 65 78 0a 20 20 2a 2a 20 6d  de->mutex.  ** m
1c350 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  utex..  */.  sql
1c360 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1c370 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
1c380 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20  );.  p->pNext = 
1c390 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
1c3a0 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  ;.  pShmNode->pF
1c3b0 69 72 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69  irst = p;.  sqli
1c3c0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1c3d0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
1c3e0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1c3f0 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  E_OK;..  /* Jump
1c400 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72   here on any err
1c410 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65  or */.shm_open_e
1c420 72 72 3a 0a 20 20 77 69 6e 53 68 6d 53 79 73 74  rr:.  winShmSyst
1c430 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
1c440 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e   _SHM_UNLCK, WIN
1c450 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20  _SHM_DMS, 1);.  
1c460 77 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46  winShmPurge(pDbF
1c470 64 2d 3e 70 56 66 73 2c 20 30 29 3b 20 20 20 20  d->pVfs, 0);    
1c480 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66    /* This call f
1c490 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66  rees pShmNode if
1c4a0 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73   required */.  s
1c4b0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
1c4c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1c4d0 4e 65 77 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65  New);.  winShmLe
1c4e0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  aveMutex();.  re
1c4f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1c500 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63  * Close a connec
1c510 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d  tion to shared-m
1c520 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74  emory.  Delete t
1c530 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a  he underlying.**
1c540 20 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65   storage if dele
1c550 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a  teFlag is true..
1c560 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1c570 6e 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c  nShmUnmap(.  sql
1c580 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
1c590 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1c5a0 61 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72  ase holding shar
1c5b0 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69  ed memory */.  i
1c5c0 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20  nt deleteFlag   
1c5d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c            /* Del
1c5e0 65 74 65 20 61 66 74 65 72 20 63 6c 6f 73 69 6e  ete after closin
1c5f0 67 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  g if true */.){.
1c600 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64    winFile *pDbFd
1c610 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ;       /* Datab
1c620 61 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72  ase holding shar
1c630 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77  ed-memory */.  w
1c640 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20  inShm *p;       
1c650 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e       /* The conn
1c660 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f  ection to be clo
1c670 73 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e  sed */.  winShmN
1c680 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f  ode *pShmNode; /
1c690 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
1c6a0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
1c6b0 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ile */.  winShm 
1c6c0 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 2f  **pp;          /
1c6d0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
1c6e0 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  er sibling conne
1c6f0 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 70 44 62  ctions */..  pDb
1c700 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66  Fd = (winFile*)f
1c710 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e  d;.  p = pDbFd->
1c720 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30  pShm;.  if( p==0
1c730 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1c740 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20  _OK;.  pShmNode 
1c750 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a  = p->pShmNode;..
1c760 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e    /* Remove conn
1c770 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68  ection p from th
1c780 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74  e set of connect
1c790 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a  ions associated.
1c7a0 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f    ** with pShmNo
1c7b0 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
1c7c0 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
1c7d0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1c7e0 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65  for(pp=&pShmNode
1c7f0 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21  ->pFirst; (*pp)!
1c800 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d  =p; pp = &(*pp)-
1c810 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20  >pNext){}.  *pp 
1c820 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f  = p->pNext;..  /
1c830 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65  * Free the conne
1c840 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c  ction p */.  sql
1c850 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
1c860 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b  pDbFd->pShm = 0;
1c870 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1c880 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
1c890 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49  >mutex);..  /* I
1c8a0 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  f pShmNode->nRef
1c8b0 20 68 61 73 20 72 65 61 63 68 65 64 20 30 2c 20   has reached 0, 
1c8c0 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75  then close the u
1c8d0 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73  nderlying.  ** s
1c8e0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
1c8f0 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 77 69 6e 53  e, too */.  winS
1c900 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  hmEnterMutex();.
1c910 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
1c920 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  de->nRef>0 );.  
1c930 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d  pShmNode->nRef--
1c940 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ;.  if( pShmNode
1c950 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
1c960 20 77 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62   winShmPurge(pDb
1c970 46 64 2d 3e 70 56 66 73 2c 20 64 65 6c 65 74 65  Fd->pVfs, delete
1c980 46 6c 61 67 29 3b 0a 20 20 7d 0a 20 20 77 69 6e  Flag);.  }.  win
1c990 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  ShmLeaveMutex();
1c9a0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
1c9b0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
1c9c0 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73  hange the lock s
1c9d0 74 61 74 65 20 66 6f 72 20 61 20 73 68 61 72 65  tate for a share
1c9e0 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d-memory segment
1c9f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ca00 77 69 6e 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71  winShmLock(.  sq
1ca10 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
1ca20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
1ca30 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e  base file holdin
1ca40 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
1ca50 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  ory */.  int ofs
1ca60 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1ca70 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63      /* First loc
1ca80 6b 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20  k to acquire or 
1ca90 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
1caa0 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   n,             
1cab0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1cac0 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63  r of locks to ac
1cad0 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65  quire or release
1cae0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
1caf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb00 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
1cb10 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a  ith the lock */.
1cb20 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44  ){.  winFile *pD
1cb30 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  bFd = (winFile*)
1cb40 66 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  fd;        /* Co
1cb50 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67  nnection holding
1cb60 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
1cb70 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20  /.  winShm *p = 
1cb80 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20  pDbFd->pShm;    
1cb90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1cba0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62   shared memory b
1cbb0 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20  eing locked */. 
1cbc0 20 77 69 6e 53 68 6d 20 2a 70 58 3b 20 20 20 20   winShm *pX;    
1cbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbe0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
1cbf0 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73  oping over all s
1cc00 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 77 69 6e  iblings */.  win
1cc10 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
1cc20 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
1cc30 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1cc40 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
1cc50 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
1cc60 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36  lt code */.  u16
1cc70 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20   mask;          
1cc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc90 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f     /* Mask of lo
1cca0 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72  cks to take or r
1ccb0 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73  elease */..  ass
1ccc0 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20  ert( ofst>=0 && 
1ccd0 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53  ofst+n<=SQLITE_S
1cce0 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  HM_NLOCK );.  as
1ccf0 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20  sert( n>=1 );.  
1cd00 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28  assert( flags==(
1cd10 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20  SQLITE_SHM_LOCK 
1cd20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  | SQLITE_SHM_SHA
1cd30 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66  RED).       || f
1cd40 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
1cd50 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  M_LOCK | SQLITE_
1cd60 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20  SHM_EXCLUSIVE). 
1cd70 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
1cd80 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f  (SQLITE_SHM_UNLO
1cd90 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
1cda0 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c  SHARED).       |
1cdb0 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
1cdc0 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51  _SHM_UNLOCK | SQ
1cdd0 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
1cde0 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  VE) );.  assert(
1cdf0 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20   n==1 || (flags 
1ce00 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  & SQLITE_SHM_EXC
1ce10 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a 0a 20  LUSIVE)!=0 );.. 
1ce20 20 6d 61 73 6b 20 3d 20 28 75 31 36 29 28 28 31   mask = (u16)((1
1ce30 55 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28  U<<(ofst+n)) - (
1ce40 31 55 3c 3c 6f 66 73 74 29 29 3b 0a 20 20 61 73  1U<<ofst));.  as
1ce50 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73  sert( n>1 || mas
1ce60 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a  k==(1<<ofst) );.
1ce70 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1ce80 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
1ce90 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c  mutex);.  if( fl
1cea0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
1ceb0 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75  _UNLOCK ){.    u
1cec0 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20  16 allMask = 0; 
1ced0 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73  /* Mask of locks
1cee0 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67   held by sibling
1cef0 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65  s */..    /* See
1cf00 20 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73   if any siblings
1cf10 20 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20   hold this same 
1cf20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28  lock */.    for(
1cf30 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
1cf40 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
1cf50 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
1cf60 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e  ( pX==p ) contin
1cf70 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ue;.      assert
1cf80 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
1cf90 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70  & (p->exclMask|p
1cfa0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d  ->sharedMask))==
1cfb0 30 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61  0 );.      allMa
1cfc0 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64  sk |= pX->shared
1cfd0 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Mask;.    }..   
1cfe0 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73   /* Unlock the s
1cff0 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b  ystem-level lock
1d000 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61  s */.    if( (ma
1d010 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30  sk & allMask)==0
1d020 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
1d030 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
1d040 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55  pShmNode, _SHM_U
1d050 4e 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53  NLCK, ofst+WIN_S
1d060 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
1d070 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1d080 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1d090 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f    }..    /* Undo
1d0a0 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73   the local locks
1d0b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
1d0c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d0d0 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26     p->exclMask &
1d0e0 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  = ~mask;.      p
1d0f0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20  ->sharedMask &= 
1d100 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ~mask;.    }.  }
1d110 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
1d120 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
1d130 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c  ED ){.    u16 al
1d140 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a  lShared = 0;  /*
1d150 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20   Union of locks 
1d160 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
1d170 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22  ons other than "
1d180 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69  p" */..    /* Fi
1d190 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61  nd out which sha
1d1a0 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c  red locks are al
1d1b0 72 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69  ready held by si
1d1c0 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
1d1d0 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79  s..    ** If any
1d1e0 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79   sibling already
1d1f0 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73   holds an exclus
1d200 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65  ive lock, go ahe
1d210 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ad and return.  
1d220 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59    ** SQLITE_BUSY
1d230 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
1d240 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  (pX=pShmNode->pF
1d250 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
1d260 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
1d270 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  f( (pX->exclMask
1d280 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20   & mask)!=0 ){. 
1d290 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1d2a0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
1d2b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1d2c0 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20        allShared 
1d2d0 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73  |= pX->sharedMas
1d2e0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1d2f0 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b   Get shared lock
1d300 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  s at the system 
1d310 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73  level, if necess
1d320 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  ary */.    if( r
1d330 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d340 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68        if( (allSh
1d350 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20  ared & mask)==0 
1d360 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1d370 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
1d380 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
1d390 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f  RDLCK, ofst+WIN_
1d3a0 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20  SHM_BASE, n);.  
1d3b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d3c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1d3d0 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
1d3e0 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65  ..    /* Get the
1d3f0 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f   local shared lo
1d400 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  cks */.    if( r
1d410 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d420 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d        p->sharedM
1d430 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
1d440 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1d450 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20  /* Make sure no 
1d460 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69  sibling connecti
1d470 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74  ons hold locks t
1d480 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74  hat will block t
1d490 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e  his.    ** lock.
1d4a0 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74    If any do, ret
1d4b0 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20  urn SQLITE_BUSY 
1d4c0 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20  right away..    
1d4d0 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
1d4e0 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
1d4f0 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
1d500 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58  ){.      if( (pX
1d510 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73  ->exclMask & mas
1d520 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68  k)!=0 || (pX->sh
1d530 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29  aredMask & mask)
1d540 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
1d550 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
1d560 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1d570 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1d580 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78     /* Get the ex
1d590 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74  clusive locks at
1d5a0 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65   the system leve
1d5b0 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63 63  l.  Then if succ
1d5c0 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c  essful.    ** al
1d5d0 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61  so mark the loca
1d5e0 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20  l connection as 
1d5f0 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20  being locked..  
1d600 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
1d610 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d620 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53      rc = winShmS
1d630 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
1d640 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20  de, _SHM_WRLCK, 
1d650 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53  ofst+WIN_SHM_BAS
1d660 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  E, n);.      if(
1d670 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1d680 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1d690 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b  ( (p->sharedMask
1d6a0 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20   & mask)==0 );. 
1d6b0 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61         p->exclMa
1d6c0 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
1d6d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1d6e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1d6f0 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
1d700 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  tex);.  OSTRACE(
1d710 28 22 53 48 4d 2d 4c 4f 43 4b 20 70 69 64 3d 25  ("SHM-LOCK pid=%
1d720 6c 75 2c 20 69 64 3d 25 64 2c 20 73 68 61 72 65  lu, id=%d, share
1d730 64 4d 61 73 6b 3d 25 30 33 78 2c 20 65 78 63 6c  dMask=%03x, excl
1d740 4d 61 73 6b 3d 25 30 33 78 2c 20 72 63 3d 25 73  Mask=%03x, rc=%s
1d750 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1d760 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1d770 65 73 73 49 64 28 29 2c 20 70 2d 3e 69 64 2c 20  essId(), p->id, 
1d780 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70  p->sharedMask, p
1d790 2d 3e 65 78 63 6c 4d 61 73 6b 2c 0a 20 20 20 20  ->exclMask,.    
1d7a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1d7b0 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72  rName(rc)));.  r
1d7c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1d7d0 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d  ** Implement a m
1d7e0 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72  emory barrier or
1d7f0 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e   memory fence on
1d800 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 0a   shared memory..
1d810 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20  **.** All loads 
1d820 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e  and stores begun
1d830 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 72 72   before the barr
1d840 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74  ier must complet
1d850 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20  e before.** any 
1d860 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65  load or store be
1d870 67 75 6e 20 61 66 74 65 72 20 74 68 65 20 62 61  gun after the ba
1d880 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrier..*/.static
1d890 20 76 6f 69 64 20 77 69 6e 53 68 6d 42 61 72 72   void winShmBarr
1d8a0 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ier(.  sqlite3_f
1d8b0 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20 20  ile *fd         
1d8c0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
1d8d0 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  ding the shared 
1d8e0 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55  memory */.){.  U
1d8f0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1d900 66 64 29 3b 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79  fd);.  /* Memory
1d910 42 61 72 72 69 65 72 28 29 3b 20 2f 2f 20 64 6f  Barrier(); // do
1d920 65 73 20 6e 6f 74 20 77 6f 72 6b 20 2d 2d 20 64  es not work -- d
1d930 6f 20 6e 6f 74 20 6b 6e 6f 77 20 77 68 79 20 6e  o not know why n
1d940 6f 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e  ot */.  winShmEn
1d950 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 77 69  terMutex();.  wi
1d960 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29  nShmLeaveMutex()
1d970 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1d980 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1d990 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70  ed to obtain a p
1d9a0 6f 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e  ointer to region
1d9b0 20 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 0a   iRegion of the.
1d9c0 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ** shared-memory
1d9d0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1d9e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1d9f0 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65  le fd. Shared-me
1da00 6d 6f 72 79 20 72 65 67 69 6f 6e 73 0a 2a 2a 20  mory regions.** 
1da10 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61  are numbered sta
1da20 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e  rting from zero.
1da30 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d   Each shared-mem
1da40 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a  ory region is sz
1da50 52 65 67 69 6f 6e 0a 2a 2a 20 62 79 74 65 73 20  Region.** bytes 
1da60 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  in size..**.** I
1da70 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1da80 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
1da90 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1daa0 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e   *pp is set to N
1dab0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ULL..**.** Other
1dac0 77 69 73 65 2c 20 69 66 20 74 68 65 20 69 73 57  wise, if the isW
1dad0 72 69 74 65 20 70 61 72 61 6d 65 74 65 72 20 69  rite parameter i
1dae0 73 20 30 20 61 6e 64 20 74 68 65 20 72 65 71 75  s 0 and the requ
1daf0 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  ested shared-mem
1db00 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61  ory.** region ha
1db10 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63  s not been alloc
1db20 61 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69  ated (by any cli
1db30 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f  ent, including o
1db40 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a  ne running in a.
1db50 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63  ** separate proc
1db60 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69  ess), then *pp i
1db70 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e  s set to NULL an
1db80 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
1db90 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 69 73 57 72  rned. If.** isWr
1dba0 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  ite is non-zero 
1dbb0 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
1dbc0 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  d shared-memory 
1dbd0 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79  region has not y
1dbe0 65 74 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63  et.** been alloc
1dbf0 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f  ated, it is allo
1dc00 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  cated by this fu
1dc10 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
1dc20 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
1dc30 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c  ry region has al
1dc40 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
1dc50 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63  ated or is alloc
1dc60 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20  ated by.** this 
1dc70 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65  call as describe
1dc80 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74  d above, then it
1dc90 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20   is mapped into 
1dca0 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 0a 2a  this processes.*
1dcb0 2a 20 61 64 64 72 65 73 73 20 73 70 61 63 65 20  * address space 
1dcc0 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
1dcd0 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73  ready), *pp is s
1dce0 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
1dcf0 68 65 20 6d 61 70 70 65 64 0a 2a 2a 20 6d 65 6d  he mapped.** mem
1dd00 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ory and SQLITE_O
1dd10 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
1dd20 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d  tatic int winShm
1dd30 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  Map(.  sqlite3_f
1dd40 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
1dd50 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
1dd60 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61 73   open on databas
1dd70 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
1dd80 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20  iRegion,        
1dd90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1dda0 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76  egion to retriev
1ddb0 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67  e */.  int szReg
1ddc0 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ion,            
1ddd0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1dde0 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69  f regions */.  i
1ddf0 6e 74 20 69 73 57 72 69 74 65 2c 20 20 20 20 20  nt isWrite,     
1de00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1de10 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e 64  * True to extend
1de20 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73 61   file if necessa
1de30 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c  ry */.  void vol
1de40 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20 20  atile **pp      
1de50 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1de60 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  Mapped memory */
1de70 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  .){.  winFile *p
1de80 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a  DbFd = (winFile*
1de90 29 66 64 3b 0a 20 20 77 69 6e 53 68 6d 20 2a 70  )fd;.  winShm *p
1dea0 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
1deb0 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53    winShmNode *pS
1dec0 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63  hmNode;.  int rc
1ded0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1dee0 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72   if( !p ){.    r
1def0 63 20 3d 20 77 69 6e 4f 70 65 6e 53 68 61 72 65  c = winOpenShare
1df00 64 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a  dMemory(pDbFd);.
1df10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1df20 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
1df30 63 3b 0a 20 20 20 20 70 20 3d 20 70 44 62 46 64  c;.    p = pDbFd
1df40 2d 3e 70 53 68 6d 3b 0a 20 20 7d 0a 20 20 70 53  ->pShm;.  }.  pS
1df50 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
1df60 4e 6f 64 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33  Node;..  sqlite3
1df70 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
1df80 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
1df90 20 61 73 73 65 72 74 28 20 73 7a 52 65 67 69 6f   assert( szRegio
1dfa0 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52  n==pShmNode->szR
1dfb0 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64  egion || pShmNod
1dfc0 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b  e->nRegion==0 );
1dfd0 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ..  if( pShmNode
1dfe0 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69  ->nRegion<=iRegi
1dff0 6f 6e 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  on ){.    struct
1e000 20 53 68 6d 52 65 67 69 6f 6e 20 2a 61 70 4e 65   ShmRegion *apNe
1e010 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  w;           /* 
1e020 4e 65 77 20 61 52 65 67 69 6f 6e 5b 5d 20 61 72  New aRegion[] ar
1e030 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ray */.    int n
1e040 42 79 74 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b  Byte = (iRegion+
1e050 31 29 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a  1)*szRegion;  /*
1e060 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65   Minimum require
1e070 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20  d file size */. 
1e080 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
1e090 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20   sz;            
1e0a0 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
1e0b0 20 73 69 7a 65 20 6f 66 20 77 61 6c 2d 69 6e 64   size of wal-ind
1e0c0 65 78 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  ex file */..    
1e0d0 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69  pShmNode->szRegi
1e0e0 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a  on = szRegion;..
1e0f0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
1e100 73 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e  sted region is n
1e110 6f 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74  ot mapped into t
1e120 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64  his processes ad
1e130 64 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20  dress space..   
1e140 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   ** Check to see
1e150 20 69 66 20 69 74 20 68 61 73 20 62 65 65 6e 20   if it has been 
1e160 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e 20  allocated (i.e. 
1e170 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78  if the wal-index
1e180 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20   file is.    ** 
1e190 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
1e1a0 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75  contain the requ
1e1b0 65 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20  ested region).. 
1e1c0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77     */.    rc = w
1e1d0 69 6e 46 69 6c 65 53 69 7a 65 28 28 73 71 6c 69  inFileSize((sqli
1e1e0 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d  te3_file *)&pShm
1e1f0 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 26 73 7a  Node->hFile, &sz
1e200 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1e210 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e220 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
1e230 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1e240 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61  SHMSIZE, osGetLa
1e250 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
1e260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e270 20 20 22 77 69 6e 53 68 6d 4d 61 70 31 22 2c 20    "winShmMap1", 
1e280 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
1e290 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
1e2a0 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  e_out;.    }..  
1e2b0 20 20 69 66 28 20 73 7a 3c 6e 42 79 74 65 20 29    if( sz<nByte )
1e2c0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72  {.      /* The r
1e2d0 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20  equested memory 
1e2e0 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  region does not 
1e2f0 65 78 69 73 74 2e 20 49 66 20 69 73 57 72 69 74  exist. If isWrit
1e300 65 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20  e is set to.    
1e310 20 20 2a 2a 20 7a 65 72 6f 2c 20 65 78 69 74 20    ** zero, exit 
1e320 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20  early. *pp will 
1e330 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  be set to NULL a
1e340 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
1e350 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  urned..      **.
1e360 20 20 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61        ** Alterna
1e370 74 69 76 65 6c 79 2c 20 69 66 20 69 73 57 72 69  tively, if isWri
1e380 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  te is non-zero, 
1e390 75 73 65 20 66 74 72 75 6e 63 61 74 65 28 29 20  use ftruncate() 
1e3a0 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20  to allocate.    
1e3b0 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74    ** the request
1e3c0 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
1e3d0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1e3e0 20 69 66 28 20 21 69 73 57 72 69 74 65 20 29 20   if( !isWrite ) 
1e3f0 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
1e400 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  ;.      rc = win
1e410 54 72 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65  Truncate((sqlite
1e420 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f  3_file *)&pShmNo
1e430 64 65 2d 3e 68 46 69 6c 65 2c 20 6e 42 79 74 65  de->hFile, nByte
1e440 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1e450 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e460 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
1e470 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1e480 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47  ERR_SHMSIZE, osG
1e490 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
1e4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4b0 20 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d          "winShmM
1e4c0 61 70 32 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  ap2", pDbFd->zPa
1e4d0 74 68 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  th);.        got
1e4e0 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
1e4f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1e500 20 20 2f 2a 20 4d 61 70 20 74 68 65 20 72 65 71    /* Map the req
1e510 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
1e520 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20 70  gion into this p
1e530 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73  rocesses address
1e540 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61   space. */.    a
1e550 70 4e 65 77 20 3d 20 28 73 74 72 75 63 74 20 53  pNew = (struct S
1e560 68 6d 52 65 67 69 6f 6e 20 2a 29 73 71 6c 69 74  hmRegion *)sqlit
1e570 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20  e3_realloc(.    
1e580 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52      pShmNode->aR
1e590 65 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b  egion, (iRegion+
1e5a0 31 29 2a 73 69 7a 65 6f 66 28 61 70 4e 65 77 5b  1)*sizeof(apNew[
1e5b0 30 5d 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  0]).    );.    i
1e5c0 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20  f( !apNew ){.   
1e5d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
1e5e0 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
1e5f0 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
1e600 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  ut;.    }.    pS
1e610 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 20  hmNode->aRegion 
1e620 3d 20 61 70 4e 65 77 3b 0a 0a 20 20 20 20 77 68  = apNew;..    wh
1e630 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  ile( pShmNode->n
1e640 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20  Region<=iRegion 
1e650 29 7b 0a 20 20 20 20 20 20 48 41 4e 44 4c 45 20  ){.      HANDLE 
1e660 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 20 20 20 20  hMap = NULL;    
1e670 20 20 20 20 20 2f 2a 20 66 69 6c 65 2d 6d 61 70       /* file-map
1e680 70 69 6e 67 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  ping handle */. 
1e690 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 20       void *pMap 
1e6a0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1e6b0 20 2f 2a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72   /* Mapped memor
1e6c0 79 20 72 65 67 69 6f 6e 20 2a 2f 0a 0a 23 69 66  y region */..#if
1e6d0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
1e6e0 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73  .      hMap = os
1e6f0 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
1e700 67 46 72 6f 6d 41 70 70 28 70 53 68 6d 4e 6f 64  gFromApp(pShmNod
1e710 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20  e->hFile.h,.    
1e720 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45        NULL, PAGE
1e730 5f 52 45 41 44 57 52 49 54 45 2c 20 6e 42 79 74  _READWRITE, nByt
1e740 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b  e, NULL.      );
1e750 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
1e760 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
1e770 57 49 44 45 29 0a 20 20 20 20 20 20 68 4d 61 70  WIDE).      hMap
1e780 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d   = osCreateFileM
1e790 61 70 70 69 6e 67 57 28 70 53 68 6d 4e 6f 64 65  appingW(pShmNode
1e7a0 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20  ->hFile.h,.     
1e7b0 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f       NULL, PAGE_
1e7c0 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20 6e 42  READWRITE, 0, nB
1e7d0 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20  yte, NULL.      
1e7e0 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  );.#elif defined
1e7f0 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
1e800 53 5f 41 4e 53 49 29 0a 20 20 20 20 20 20 68 4d  S_ANSI).      hM
1e810 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ap = osCreateFil
1e820 65 4d 61 70 70 69 6e 67 41 28 70 53 68 6d 4e 6f  eMappingA(pShmNo
1e830 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20  de->hFile.h,.   
1e840 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47         NULL, PAG
1e850 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20  E_READWRITE, 0, 
1e860 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20  nByte, NULL.    
1e870 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20    );.#endif.    
1e880 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
1e890 4d 41 50 2d 43 52 45 41 54 45 20 70 69 64 3d 25  MAP-CREATE pid=%
1e8a0 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20 73  lu, region=%d, s
1e8b0 69 7a 65 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22  ize=%d, rc=%s\n"
1e8c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e8d0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1e8e0 63 65 73 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f  cessId(), pShmNo
1e8f0 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 6e 42 79  de->nRegion, nBy
1e900 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  te,.            
1e910 20 20 20 68 4d 61 70 20 3f 20 22 6f 6b 22 20 3a     hMap ? "ok" :
1e920 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20   "failed"));.   
1e930 20 20 20 69 66 28 20 68 4d 61 70 20 29 7b 0a 20     if( hMap ){. 
1e940 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73         int iOffs
1e950 65 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  et = pShmNode->n
1e960 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b  Region*szRegion;
1e970 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66  .        int iOf
1e980 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66  fsetShift = iOff
1e990 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f  set % winSysInfo
1e9a0 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61  .dwAllocationGra
1e9b0 6e 75 6c 61 72 69 74 79 3b 0a 23 69 66 20 53 51  nularity;.#if SQ
1e9c0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
1e9d0 20 20 20 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d        pMap = osM
1e9e0 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d  apViewOfFileFrom
1e9f0 41 70 70 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d  App(hMap, FILE_M
1ea00 41 50 5f 57 52 49 54 45 20 7c 20 46 49 4c 45 5f  AP_WRITE | FILE_
1ea10 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20 20 20 20  MAP_READ,.      
1ea20 20 20 20 20 20 20 69 4f 66 66 73 65 74 20 2d 20        iOffset - 
1ea30 69 4f 66 66 73 65 74 53 68 69 66 74 2c 20 73 7a  iOffsetShift, sz
1ea40 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74  Region + iOffset
1ea50 53 68 69 66 74 0a 20 20 20 20 20 20 20 20 29 3b  Shift.        );
1ea60 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 70  .#else.        p
1ea70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f  Map = osMapViewO
1ea80 66 46 69 6c 65 28 68 4d 61 70 2c 20 46 49 4c 45  fFile(hMap, FILE
1ea90 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20 46 49 4c  _MAP_WRITE | FIL
1eaa0 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20 20  E_MAP_READ,.    
1eab0 20 20 20 20 20 20 20 20 30 2c 20 69 4f 66 66 73          0, iOffs
1eac0 65 74 20 2d 20 69 4f 66 66 73 65 74 53 68 69 66  et - iOffsetShif
1ead0 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f  t, szRegion + iO
1eae0 66 66 73 65 74 53 68 69 66 74 0a 20 20 20 20 20  ffsetShift.     
1eaf0 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20     );.#endif.   
1eb00 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53       OSTRACE(("S
1eb10 48 4d 2d 4d 41 50 2d 4d 41 50 20 70 69 64 3d 25  HM-MAP-MAP pid=%
1eb20 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20 6f  lu, region=%d, o
1eb30 66 66 73 65 74 3d 25 64 2c 20 73 69 7a 65 3d 25  ffset=%d, size=%
1eb40 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
1eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
1eb60 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1eb70 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d  sId(), pShmNode-
1eb80 3e 6e 52 65 67 69 6f 6e 2c 20 69 4f 66 66 73 65  >nRegion, iOffse
1eb90 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
1eba0 20 20 20 20 73 7a 52 65 67 69 6f 6e 2c 20 70 4d      szRegion, pM
1ebb0 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  ap ? "ok" : "fai
1ebc0 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a  led"));.      }.
1ebd0 20 20 20 20 20 20 69 66 28 20 21 70 4d 61 70 20        if( !pMap 
1ebe0 29 7b 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e  ){.        pShmN
1ebf0 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ode->lastErrno =
1ec00 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
1ec10 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1ec20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
1ec30 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c  TE_IOERR_SHMMAP,
1ec40 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45   pShmNode->lastE
1ec50 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
1ec60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1ec70 77 69 6e 53 68 6d 4d 61 70 33 22 2c 20 70 44 62  winShmMap3", pDb
1ec80 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  Fd->zPath);.    
1ec90 20 20 20 20 69 66 28 20 68 4d 61 70 20 29 20 6f      if( hMap ) o
1eca0 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 4d 61  sCloseHandle(hMa
1ecb0 70 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  p);.        goto
1ecc0 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
1ecd0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 53 68      }..      pSh
1ece0 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70  mNode->aRegion[p
1ecf0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1ed00 5d 2e 70 4d 61 70 20 3d 20 70 4d 61 70 3b 0a 20  ].pMap = pMap;. 
1ed10 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61       pShmNode->a
1ed20 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d  Region[pShmNode-
1ed30 3e 6e 52 65 67 69 6f 6e 5d 2e 68 4d 61 70 20 3d  >nRegion].hMap =
1ed40 20 68 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 68   hMap;.      pSh
1ed50 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b  mNode->nRegion++
1ed60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d  ;.    }.  }..shm
1ed70 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
1ed80 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
1ed90 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  n>iRegion ){.   
1eda0 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20 69   int iOffset = i
1edb0 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b  Region*szRegion;
1edc0 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74  .    int iOffset
1edd0 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20  Shift = iOffset 
1ede0 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41  % winSysInfo.dwA
1edf0 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61  llocationGranula
1ee00 72 69 74 79 3b 0a 20 20 20 20 63 68 61 72 20 2a  rity;.    char *
1ee10 70 20 3d 20 28 63 68 61 72 20 2a 29 70 53 68 6d  p = (char *)pShm
1ee20 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 69 52  Node->aRegion[iR
1ee30 65 67 69 6f 6e 5d 2e 70 4d 61 70 3b 0a 20 20 20  egion].pMap;.   
1ee40 20 2a 70 70 20 3d 20 28 76 6f 69 64 20 2a 29 26   *pp = (void *)&
1ee50 70 5b 69 4f 66 66 73 65 74 53 68 69 66 74 5d 3b  p[iOffsetShift];
1ee60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
1ee70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  p = 0;.  }.  sql
1ee80 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1ee90 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
1eea0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1eeb0 7d 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  }..#else.# defin
1eec0 65 20 77 69 6e 53 68 6d 4d 61 70 20 20 20 20 20  e winShmMap     
1eed0 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68  0.# define winSh
1eee0 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66  mLock    0.# def
1eef0 69 6e 65 20 77 69 6e 53 68 6d 42 61 72 72 69 65  ine winShmBarrie
1ef00 72 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e  r 0.# define win
1ef10 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e  ShmUnmap   0.#en
1ef20 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
1ef30 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
1ef40 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 73 20  /../*.** Cleans 
1ef50 75 70 20 74 68 65 20 6d 61 70 70 65 64 20 72 65  up the mapped re
1ef60 67 69 6f 6e 20 6f 66 20 74 68 65 20 73 70 65 63  gion of the spec
1ef70 69 66 69 65 64 20 66 69 6c 65 2c 20 69 66 20 61  ified file, if a
1ef80 6e 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ny..*/.#if SQLIT
1ef90 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
1efa0 30 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  0.static int win
1efb0 55 6e 6d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c  Unmapfile(winFil
1efc0 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 61 73 73  e *pFile){.  ass
1efd0 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b  ert( pFile!=0 );
1efe0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d  .  OSTRACE(("UNM
1eff0 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c  AP-FILE pid=%lu,
1f000 20 70 46 69 6c 65 3d 25 70 2c 20 68 4d 61 70 3d   pFile=%p, hMap=
1f010 25 70 2c 20 70 4d 61 70 52 65 67 69 6f 6e 3d 25  %p, pMapRegion=%
1f020 70 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  p, ".           
1f030 22 6d 6d 61 70 53 69 7a 65 3d 25 6c 6c 64 2c 20  "mmapSize=%lld, 
1f040 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3d 25  mmapSizeActual=%
1f050 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a 65 4d 61 78  lld, mmapSizeMax
1f060 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20  =%lld\n",.      
1f070 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1f080 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
1f090 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 4d 61 70  ile, pFile->hMap
1f0a0 2c 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  , pFile->pMapReg
1f0b0 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ion,.           
1f0c0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 2c  pFile->mmapSize,
1f0d0 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1f0e0 41 63 74 75 61 6c 2c 20 70 46 69 6c 65 2d 3e 6d  Actual, pFile->m
1f0f0 6d 61 70 53 69 7a 65 4d 61 78 29 29 3b 0a 20 20  mapSizeMax));.  
1f100 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52  if( pFile->pMapR
1f110 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 69 66 28  egion ){.    if(
1f120 20 21 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46   !osUnmapViewOfF
1f130 69 6c 65 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52  ile(pFile->pMapR
1f140 65 67 69 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20  egion) ){.      
1f150 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1f160 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
1f170 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  r();.      OSTRA
1f180 43 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20  CE(("UNMAP-FILE 
1f190 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
1f1a0 70 2c 20 70 4d 61 70 52 65 67 69 6f 6e 3d 25 70  p, pMapRegion=%p
1f1b0 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  , ".            
1f1c0 20 20 20 22 72 63 3d 53 51 4c 49 54 45 5f 49 4f     "rc=SQLITE_IO
1f1d0 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c 20 6f 73 47  ERR_MMAP\n", osG
1f1e0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1f1f0 49 64 28 29 2c 20 70 46 69 6c 65 2c 0a 20 20 20  Id(), pFile,.   
1f200 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c              pFil
1f210 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 3b  e->pMapRegion));
1f220 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
1f230 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
1f240 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 69  _IOERR_MMAP, pFi
1f250 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
1f260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f270 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e 6d 61          "winUnma
1f280 70 66 69 6c 65 31 22 2c 20 70 46 69 6c 65 2d 3e  pfile1", pFile->
1f290 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20  zPath);.    }.  
1f2a0 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67    pFile->pMapReg
1f2b0 69 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  ion = 0;.    pFi
1f2c0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30  le->mmapSize = 0
1f2d0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61  ;.    pFile->mma
1f2e0 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b  pSizeActual = 0;
1f2f0 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65  .  }.  if( pFile
1f300 2d 3e 68 4d 61 70 21 3d 4e 55 4c 4c 20 29 7b 0a  ->hMap!=NULL ){.
1f310 20 20 20 20 69 66 28 20 21 6f 73 43 6c 6f 73 65      if( !osClose
1f320 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d  Handle(pFile->hM
1f330 61 70 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  ap) ){.      pFi
1f340 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
1f350 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
1f360 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
1f370 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64  ("UNMAP-FILE pid
1f380 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
1f390 68 4d 61 70 3d 25 70 2c 20 72 63 3d 53 51 4c 49  hMap=%p, rc=SQLI
1f3a0 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22  TE_IOERR_MMAP\n"
1f3b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f3c0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1f3d0 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
1f3e0 20 70 46 69 6c 65 2d 3e 68 4d 61 70 29 29 3b 0a   pFile->hMap));.
1f3f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
1f400 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1f410 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 69 6c  IOERR_MMAP, pFil
1f420 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
1f430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f440 20 20 20 20 20 20 20 22 77 69 6e 55 6e 6d 61 70         "winUnmap
1f450 66 69 6c 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a  file2", pFile->z
1f460 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Path);.    }.   
1f470 20 70 46 69 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e   pFile->hMap = N
1f480 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  ULL;.  }.  OSTRA
1f490 43 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20  CE(("UNMAP-FILE 
1f4a0 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
1f4b0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
1f4c0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
1f4d0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
1f4e0 73 73 49 64 28 29 2c 20 70 46 69 6c 65 29 29 3b  ssId(), pFile));
1f4f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1f500 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65  _OK;.}../*.** Me
1f510 6d 6f 72 79 20 6d 61 70 20 6f 72 20 72 65 6d 61  mory map or rema
1f520 70 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  p the file opene
1f530 64 20 62 79 20 66 69 6c 65 2d 64 65 73 63 72 69  d by file-descri
1f540 70 74 6f 72 20 70 46 64 20 28 69 66 20 74 68 65  ptor pFd (if the
1f550 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61 6c 72 65   file.** is alre
1f560 61 64 79 20 6d 61 70 70 65 64 2c 20 74 68 65 20  ady mapped, the 
1f570 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67  existing mapping
1f580 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79 20   is replaced by 
1f590 74 68 65 20 6e 65 77 29 2e 20 4f 72 2c 20 69 66  the new). Or, if
1f5a0 0a 2a 2a 20 74 68 65 72 65 20 61 6c 72 65 61 64  .** there alread
1f5b0 79 20 65 78 69 73 74 73 20 61 20 6d 61 70 70 69  y exists a mappi
1f5c0 6e 67 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65  ng for this file
1f5d0 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  , and there are 
1f5e0 73 74 69 6c 6c 0a 2a 2a 20 6f 75 74 73 74 61 6e  still.** outstan
1f5f0 64 69 6e 67 20 78 46 65 74 63 68 28 29 20 72 65  ding xFetch() re
1f600 66 65 72 65 6e 63 65 73 20 74 6f 20 69 74 2c 20  ferences to it, 
1f610 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1f620 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
1f630 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 42 79  If parameter nBy
1f640 74 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69  te is non-negati
1f650 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  ve, then it is t
1f660 68 65 20 72 65 71 75 65 73 74 65 64 20 73 69 7a  he requested siz
1f670 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6d 61 70 70  e of.** the mapp
1f680 69 6e 67 20 74 6f 20 63 72 65 61 74 65 2e 20 4f  ing to create. O
1f690 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 42 79  therwise, if nBy
1f6a0 74 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  te is less than 
1f6b0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a  zero, then the.*
1f6c0 2a 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65  * requested size
1f6d0 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20   is the size of 
1f6e0 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
1f6f0 2e 20 54 68 65 20 61 63 74 75 61 6c 20 73 69 7a  . The actual siz
1f700 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65 61  e of the.** crea
1f710 74 65 64 20 6d 61 70 70 69 6e 67 20 69 73 20 65  ted mapping is e
1f720 69 74 68 65 72 20 74 68 65 20 72 65 71 75 65 73  ither the reques
1f730 74 65 64 20 73 69 7a 65 20 6f 72 20 74 68 65 20  ted size or the 
1f740 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64  value configured
1f750 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c 49 54 45  .** using SQLITE
1f760 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45  _FCNTL_MMAP_SIZE
1f770 2c 20 77 68 69 63 68 65 76 65 72 20 69 73 20 73  , whichever is s
1f780 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51  maller..**.** SQ
1f790 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1f7a0 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  ned if no error 
1f7b0 6f 63 63 75 72 73 20 28 65 76 65 6e 20 69 66 20  occurs (even if 
1f7c0 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e  the mapping is n
1f7d0 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74 65 64 20  ot.** recreated 
1f7e0 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 6f  as a result of o
1f7f0 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
1f800 65 6e 63 65 73 29 20 6f 72 20 61 6e 20 53 51 4c  ences) or an SQL
1f810 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  ite error.** cod
1f820 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
1f830 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 61  static int winMa
1f840 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70  pfile(winFile *p
1f850 46 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  Fd, sqlite3_int6
1f860 34 20 6e 42 79 74 65 29 7b 0a 20 20 73 71 6c 69  4 nByte){.  sqli
1f870 74 65 33 5f 69 6e 74 36 34 20 6e 4d 61 70 20 3d  te3_int64 nMap =
1f880 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 72 63   nByte;.  int rc
1f890 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61  ;..  assert( nMa
1f8a0 70 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e 46 65  p>=0 || pFd->nFe
1f8b0 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 4f  tchOut==0 );.  O
1f8c0 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c  STRACE(("MAP-FIL
1f8d0 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
1f8e0 3d 25 70 2c 20 73 69 7a 65 3d 25 6c 6c 64 5c 6e  =%p, size=%lld\n
1f8f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
1f900 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1f910 73 49 64 28 29 2c 20 70 46 64 2c 20 6e 42 79 74  sId(), pFd, nByt
1f920 65 29 29 3b 0a 0a 20 20 69 66 28 20 70 46 64 2d  e));..  if( pFd-
1f930 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20 29 20 72  >nFetchOut>0 ) r
1f940 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f950 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30 20 29  ..  if( nMap<0 )
1f960 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69  {.    rc = winFi
1f970 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f  leSize((sqlite3_
1f980 66 69 6c 65 2a 29 70 46 64 2c 20 26 6e 4d 61 70  file*)pFd, &nMap
1f990 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
1f9a0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1f9b0 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c  "MAP-FILE pid=%l
1f9c0 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d  u, pFile=%p, rc=
1f9d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
1f9e0 41 54 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  AT\n",.         
1f9f0 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1fa00 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
1fa10 46 64 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Fd));.      retu
1fa20 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1fa30 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  FSTAT;.    }.  }
1fa40 0a 20 20 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d  .  if( nMap>pFd-
1fa50 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a  >mmapSizeMax ){.
1fa60 20 20 20 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e      nMap = pFd->
1fa70 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d  mmapSizeMax;.  }
1fa80 0a 20 20 6e 4d 61 70 20 26 3d 20 7e 28 73 71 6c  .  nMap &= ~(sql
1fa90 69 74 65 33 5f 69 6e 74 36 34 29 28 77 69 6e 53  ite3_int64)(winS
1faa0 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a  ysInfo.dwPageSiz
1fab0 65 20 2d 20 31 29 3b 0a 0a 20 20 69 66 28 20 6e  e - 1);..  if( n
1fac0 4d 61 70 3d 3d 30 20 26 26 20 70 46 64 2d 3e 6d  Map==0 && pFd->m
1fad0 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20  mapSize>0 ){.   
1fae0 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46   winUnmapfile(pF
1faf0 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d  d);.  }.  if( nM
1fb00 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  ap!=pFd->mmapSiz
1fb10 65 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70  e ){.    void *p
1fb20 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 44 57 4f  New = 0;.    DWO
1fb30 52 44 20 70 72 6f 74 65 63 74 20 3d 20 50 41 47  RD protect = PAG
1fb40 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
1fb50 44 57 4f 52 44 20 66 6c 61 67 73 20 3d 20 46 49  DWORD flags = FI
1fb60 4c 45 5f 4d 41 50 5f 52 45 41 44 3b 0a 0a 20 20  LE_MAP_READ;..  
1fb70 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70    winUnmapfile(p
1fb80 46 64 29 3b 0a 20 20 20 20 69 66 28 20 28 70 46  Fd);.    if( (pF
1fb90 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57  d->ctrlFlags & W
1fba0 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d  INFILE_RDONLY)==
1fbb0 30 20 29 7b 0a 20 20 20 20 20 20 70 72 6f 74 65  0 ){.      prote
1fbc0 63 74 20 3d 20 50 41 47 45 5f 52 45 41 44 57 52  ct = PAGE_READWR
1fbd0 49 54 45 3b 0a 20 20 20 20 20 20 66 6c 61 67 73  ITE;.      flags
1fbe0 20 7c 3d 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49   |= FILE_MAP_WRI
1fbf0 54 45 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53 51  TE;.    }.#if SQ
1fc00 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
1fc10 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73    pFd->hMap = os
1fc20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
1fc30 67 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68 2c  gFromApp(pFd->h,
1fc40 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 20   NULL, protect, 
1fc50 6e 4d 61 70 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c  nMap, NULL);.#el
1fc60 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1fc70 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
1fc80 29 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20  ).    pFd->hMap 
1fc90 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  = osCreateFileMa
1fca0 70 70 69 6e 67 57 28 70 46 64 2d 3e 68 2c 20 4e  ppingW(pFd->h, N
1fcb0 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a 20 20  ULL, protect,.  
1fcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 44                (D
1fce0 57 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33 32 29  WORD)((nMap>>32)
1fcf0 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c 0a   & 0xffffffff),.
1fd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd20 28 44 57 4f 52 44 29 28 6e 4d 61 70 20 26 20 30  (DWORD)(nMap & 0
1fd30 78 66 66 66 66 66 66 66 66 29 2c 20 4e 55 4c 4c  xffffffff), NULL
1fd40 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  );.#elif defined
1fd50 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
1fd60 53 5f 41 4e 53 49 29 0a 20 20 20 20 70 46 64 2d  S_ANSI).    pFd-
1fd70 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65  >hMap = osCreate
1fd80 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 70 46 64  FileMappingA(pFd
1fd90 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65  ->h, NULL, prote
1fda0 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ct,.            
1fdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdc0 20 20 20 20 28 44 57 4f 52 44 29 28 28 6e 4d 61      (DWORD)((nMa
1fdd0 70 3e 3e 33 32 29 20 26 20 30 78 66 66 66 66 66  p>>32) & 0xfffff
1fde0 66 66 66 29 2c 0a 20 20 20 20 20 20 20 20 20 20  fff),.          
1fdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe00 20 20 20 20 20 20 28 44 57 4f 52 44 29 28 6e 4d        (DWORD)(nM
1fe10 61 70 20 26 20 30 78 66 66 66 66 66 66 66 66 29  ap & 0xffffffff)
1fe20 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a  , NULL);.#endif.
1fe30 20 20 20 20 69 66 28 20 70 46 64 2d 3e 68 4d 61      if( pFd->hMa
1fe40 70 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  p==NULL ){.     
1fe50 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 20   pFd->lastErrno 
1fe60 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
1fe70 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ();.      rc = w
1fe80 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
1fe90 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46  E_IOERR_MMAP, pF
1fea0 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  d->lastErrno,.  
1feb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fec0 20 20 20 20 20 22 77 69 6e 4d 61 70 66 69 6c 65       "winMapfile
1fed0 31 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b  1", pFd->zPath);
1fee0 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74 68  .      /* Log th
1fef0 65 20 65 72 72 6f 72 2c 20 62 75 74 20 63 6f 6e  e error, but con
1ff00 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70 65  tinue normal ope
1ff10 72 61 74 69 6f 6e 20 75 73 69 6e 67 20 78 52 65  ration using xRe
1ff20 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20 20  ad/xWrite */.   
1ff30 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50     OSTRACE(("MAP
1ff40 2d 46 49 4c 45 2d 43 52 45 41 54 45 20 70 69 64  -FILE-CREATE pid
1ff50 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
1ff60 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
1ff70 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1ff80 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1ff90 2c 20 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72  , pFd, sqlite3Er
1ffa0 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20  rName(rc)));.   
1ffb0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ffc0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  _OK;.    }.    a
1ffd0 73 73 65 72 74 28 20 28 6e 4d 61 70 20 25 20 77  ssert( (nMap % w
1ffe0 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65  inSysInfo.dwPage
1fff0 53 69 7a 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20  Size)==0 );.    
20000 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 53  assert( sizeof(S
20010 49 5a 45 5f 54 29 3d 3d 73 69 7a 65 6f 66 28 73  IZE_T)==sizeof(s
20020 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 20 7c 7c  qlite3_int64) ||
20030 20 6e 4d 61 70 3c 3d 30 78 66 66 66 66 66 66 66   nMap<=0xfffffff
20040 66 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  f );.#if SQLITE_
20050 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 70 4e 65  OS_WINRT.    pNe
20060 77 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46  w = osMapViewOfF
20070 69 6c 65 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e  ileFromApp(pFd->
20080 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30 2c 20  hMap, flags, 0, 
20090 28 53 49 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a 23  (SIZE_T)nMap);.#
200a0 65 6c 73 65 0a 20 20 20 20 70 4e 65 77 20 3d 20  else.    pNew = 
200b0 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  osMapViewOfFile(
200c0 70 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61 67 73  pFd->hMap, flags
200d0 2c 20 30 2c 20 30 2c 20 28 53 49 5a 45 5f 54 29  , 0, 0, (SIZE_T)
200e0 6e 4d 61 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20  nMap);.#endif.  
200f0 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c    if( pNew==NULL
20100 20 29 7b 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73   ){.      osClos
20110 65 48 61 6e 64 6c 65 28 70 46 64 2d 3e 68 4d 61  eHandle(pFd->hMa
20120 70 29 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 68  p);.      pFd->h
20130 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  Map = NULL;.    
20140 20 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f    pFd->lastErrno
20150 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
20160 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  r();.      rc = 
20170 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
20180 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70  TE_IOERR_MMAP, p
20190 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  Fd->lastErrno,. 
201a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201b0 20 20 20 20 20 20 22 77 69 6e 4d 61 70 66 69 6c        "winMapfil
201c0 65 32 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29  e2", pFd->zPath)
201d0 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74  ;.      /* Log t
201e0 68 65 20 65 72 72 6f 72 2c 20 62 75 74 20 63 6f  he error, but co
201f0 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70  ntinue normal op
20200 65 72 61 74 69 6f 6e 20 75 73 69 6e 67 20 78 52  eration using xR
20210 65 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20  ead/xWrite */.  
20220 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41      OSTRACE(("MA
20230 50 2d 46 49 4c 45 2d 4d 41 50 20 70 69 64 3d 25  P-FILE-MAP pid=%
20240 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
20250 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
20260 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
20270 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
20280 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  pFd, sqlite3ErrN
20290 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20  ame(rc)));.     
202a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
202b0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 64  K;.    }.    pFd
202c0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 70  ->pMapRegion = p
202d0 4e 65 77 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d  New;.    pFd->mm
202e0 61 70 53 69 7a 65 20 3d 20 6e 4d 61 70 3b 0a 20  apSize = nMap;. 
202f0 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65     pFd->mmapSize
20300 41 63 74 75 61 6c 20 3d 20 6e 4d 61 70 3b 0a 20  Actual = nMap;. 
20310 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
20320 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75  MAP-FILE pid=%lu
20330 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53  , pFile=%p, rc=S
20340 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
20350 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
20360 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
20370 20 70 46 64 29 29 3b 0a 20 20 72 65 74 75 72 6e   pFd));.  return
20380 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
20390 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
203a0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a  AX_MMAP_SIZE>0 *
203b0 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73 73  /../*.** If poss
203c0 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 20 70  ible, return a p
203d0 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70 70  ointer to a mapp
203e0 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64 20 73  ing of file fd s
203f0 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66 73 65  tarting at offse
20400 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20 6d  t.** iOff. The m
20410 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20 76  apping must be v
20420 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65 61 73  alid for at leas
20430 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a 2a  t nAmt bytes..**
20440 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20 70 6f  .** If such a po
20450 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f 62 74  inter can be obt
20460 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69 74 20  ained, store it 
20470 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74 75 72  in *pp and retur
20480 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  n SQLITE_OK..** 
20490 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e 6f  Or, if one canno
204a0 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  t but no error o
204b0 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70 20 74  ccurs, set *pp t
204c0 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20 53  o 0 and return S
204d0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e  QLITE_OK..** Fin
204e0 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f  ally, if an erro
204f0 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 72 65  r does occur, re
20500 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
20510 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20 66  rror code. The f
20520 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f 66  inal.** value of
20530 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69 6e 65   *pp is undefine
20540 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  d in this case..
20550 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75  **.** If this fu
20560 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65 74 75  nction does retu
20570 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20 74 68  rn a pointer, th
20580 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 76  e caller must ev
20590 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 6c 65  entually.** rele
205a0 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63  ase the referenc
205b0 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 77 69 6e  e by calling win
205c0 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f 0a 73 74  Unfetch()..*/.st
205d0 61 74 69 63 20 69 6e 74 20 77 69 6e 46 65 74 63  atic int winFetc
205e0 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  h(sqlite3_file *
205f0 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 69 6e  fd, i64 iOff, in
20600 74 20 6e 41 6d 74 2c 20 76 6f 69 64 20 2a 2a 70  t nAmt, void **p
20610 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  p){.#if SQLITE_M
20620 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
20630 20 77 69 6e 46 69 6c 65 20 2a 70 46 64 20 3d 20   winFile *pFd = 
20640 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20  (winFile*)fd;   
20650 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
20660 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
20670 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 20  */.#endif.  *pp 
20680 3d 20 30 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28  = 0;..  OSTRACE(
20690 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c  ("FETCH pid=%lu,
206a0 20 70 46 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65   pFile=%p, offse
206b0 74 3d 25 6c 6c 64 2c 20 61 6d 6f 75 6e 74 3d 25  t=%lld, amount=%
206c0 64 2c 20 70 70 3d 25 70 5c 6e 22 2c 0a 20 20 20  d, pp=%p\n",.   
206d0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
206e0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
206f0 20 66 64 2c 20 69 4f 66 66 2c 20 6e 41 6d 74 2c   fd, iOff, nAmt,
20700 20 70 70 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49   pp));..#if SQLI
20710 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
20720 3e 30 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d  >0.  if( pFd->mm
20730 61 70 53 69 7a 65 4d 61 78 3e 30 20 29 7b 0a 20  apSizeMax>0 ){. 
20740 20 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70     if( pFd->pMap
20750 52 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20  Region==0 ){.   
20760 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 4d     int rc = winM
20770 61 70 66 69 6c 65 28 70 46 64 2c 20 2d 31 29 3b  apfile(pFd, -1);
20780 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
20790 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
207a0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 45      OSTRACE(("FE
207b0 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  TCH pid=%lu, pFi
207c0 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
207d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
207e0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
207f0 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20  ocessId(), pFd, 
20800 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
20810 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65  c)));.        re
20820 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
20830 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
20840 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20  Fd->mmapSize >= 
20850 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20  iOff+nAmt ){.   
20860 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38 20 2a     *pp = &((u8 *
20870 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  )pFd->pMapRegion
20880 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70  )[iOff];.      p
20890 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b  Fd->nFetchOut++;
208a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
208b0 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46  f..  OSTRACE(("F
208c0 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46  ETCH pid=%lu, pF
208d0 69 6c 65 3d 25 70 2c 20 70 70 3d 25 70 2c 20 2a  ile=%p, pp=%p, *
208e0 70 70 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  pp=%p, rc=SQLITE
208f0 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  _OK\n",.        
20900 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
20910 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64 2c 20  rocessId(), fd, 
20920 70 70 2c 20 2a 70 70 29 29 3b 0a 20 20 72 65 74  pp, *pp));.  ret
20930 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
20940 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74  ../*.** If the t
20950 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73  hird argument is
20960 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20   non-NULL, then 
20970 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
20980 6c 65 61 73 65 73 20 61 0a 2a 2a 20 72 65 66 65  leases a.** refe
20990 72 65 6e 63 65 20 6f 62 74 61 69 6e 65 64 20 62  rence obtained b
209a0 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c  y an earlier cal
209b0 6c 20 74 6f 20 77 69 6e 46 65 74 63 68 28 29 2e  l to winFetch().
209c0 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61   The second.** a
209d0 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
209e0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
209f0 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65  must be the same
20a00 20 61 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f   as the correspo
20a10 6e 64 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e  nding.** argumen
20a20 74 20 74 68 61 74 20 77 61 73 20 70 61 73 73 65  t that was passe
20a30 64 20 74 6f 20 74 68 65 20 77 69 6e 46 65 74 63  d to the winFetc
20a40 68 28 29 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a  h() invocation..
20a50 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  **.** Or, if the
20a60 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20   third argument 
20a70 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
20a80 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62  is function is b
20a90 65 69 6e 67 20 63 61 6c 6c 65 64 0a 2a 2a 20 74  eing called.** t
20aa0 6f 20 69 6e 66 6f 72 6d 20 74 68 65 20 56 46 53  o inform the VFS
20ab0 20 6c 61 79 65 72 20 74 68 61 74 2c 20 61 63 63   layer that, acc
20ac0 6f 72 64 69 6e 67 20 74 6f 20 50 4f 53 49 58 2c  ording to POSIX,
20ad0 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 6d 61   any existing ma
20ae0 70 70 69 6e 67 0a 2a 2a 20 6d 61 79 20 6e 6f 77  pping.** may now
20af0 20 62 65 20 69 6e 76 61 6c 69 64 20 61 6e 64 20   be invalid and 
20b00 73 68 6f 75 6c 64 20 62 65 20 75 6e 6d 61 70 70  should be unmapp
20b10 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
20b20 74 20 77 69 6e 55 6e 66 65 74 63 68 28 73 71 6c  t winUnfetch(sql
20b30 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
20b40 36 34 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70  64 iOff, void *p
20b50 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ){.#if SQLITE_MA
20b60 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
20b70 77 69 6e 46 69 6c 65 20 2a 70 46 64 20 3d 20 28  winFile *pFd = (
20b80 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 2f  winFile*)fd;   /
20b90 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
20ba0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
20bb0 2f 0a 0a 20 20 2f 2a 20 49 66 20 70 3d 3d 30 20  /..  /* If p==0 
20bc0 28 75 6e 6d 61 70 20 74 68 65 20 65 6e 74 69 72  (unmap the entir
20bd0 65 20 66 69 6c 65 29 20 74 68 65 6e 20 74 68 65  e file) then the
20be0 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 6f 75  re must be no ou
20bf0 74 73 74 61 6e 64 69 6e 67 0a 20 20 2a 2a 20 78  tstanding.  ** x
20c00 46 65 74 63 68 20 72 65 66 65 72 65 6e 63 65 73  Fetch references
20c10 2e 20 4f 72 2c 20 69 66 20 70 21 3d 30 20 28 6d  . Or, if p!=0 (m
20c20 65 61 6e 69 6e 67 20 69 74 20 69 73 20 61 6e 20  eaning it is an 
20c30 78 46 65 74 63 68 20 72 65 66 65 72 65 6e 63 65  xFetch reference
20c40 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  ),.  ** then the
20c50 72 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  re must be at le
20c60 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64  ast one outstand
20c70 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ing.  */.  asser
20c80 74 28 20 28 70 3d 3d 30 29 3d 3d 28 70 46 64 2d  t( (p==0)==(pFd-
20c90 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 29 20 29  >nFetchOut==0) )
20ca0 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 21 3d 30 2c  ;..  /* If p!=0,
20cb0 20 69 74 20 6d 75 73 74 20 6d 61 74 63 68 20 74   it must match t
20cc0 68 65 20 69 4f 66 66 20 76 61 6c 75 65 2e 20 2a  he iOff value. *
20cd0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  /.  assert( p==0
20ce0 20 7c 7c 20 70 3d 3d 26 28 28 75 38 20 2a 29 70   || p==&((u8 *)p
20cf0 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b  Fd->pMapRegion)[
20d00 69 4f 66 66 5d 20 29 3b 0a 0a 20 20 4f 53 54 52  iOff] );..  OSTR
20d10 41 43 45 28 28 22 55 4e 46 45 54 43 48 20 70 69  ACE(("UNFETCH pi
20d20 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
20d30 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 70 3d   offset=%lld, p=
20d40 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %p\n",.         
20d50 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
20d60 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20  ocessId(), pFd, 
20d70 69 4f 66 66 2c 20 70 29 29 3b 0a 0a 20 20 69 66  iOff, p));..  if
20d80 28 20 70 20 29 7b 0a 20 20 20 20 70 46 64 2d 3e  ( p ){.    pFd->
20d90 6e 46 65 74 63 68 4f 75 74 2d 2d 3b 0a 20 20 7d  nFetchOut--;.  }
20da0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46 49 58  else{.    /* FIX
20db0 4d 45 3a 20 20 49 66 20 57 69 6e 64 6f 77 73 20  ME:  If Windows 
20dc0 74 72 75 6c 79 20 61 6c 77 61 79 73 20 70 72 65  truly always pre
20dd0 76 65 6e 74 73 20 74 72 75 6e 63 61 74 69 6e 67  vents truncating
20de0 20 6f 72 20 64 65 6c 65 74 69 6e 67 20 61 0a 20   or deleting a. 
20df0 20 20 20 2a 2a 20 66 69 6c 65 20 77 68 69 6c 65     ** file while
20e00 20 61 20 6d 61 70 70 69 6e 67 20 69 73 20 68 65   a mapping is he
20e10 6c 64 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c  ld, then the fol
20e20 6c 6f 77 69 6e 67 20 77 69 6e 55 6e 6d 61 70 66  lowing winUnmapf
20e30 69 6c 65 28 29 20 63 61 6c 6c 0a 20 20 20 20 2a  ile() call.    *
20e40 2a 20 69 73 20 75 6e 6e 65 63 65 73 73 61 72 79  * is unnecessary
20e50 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 20   can be omitted 
20e60 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 69 6d  - potentially im
20e70 70 72 6f 76 69 6e 67 0a 20 20 20 20 2a 2a 20 70  proving.    ** p
20e80 65 72 66 6f 72 6d 61 6e 63 65 2e 20 20 2a 2f 0a  erformance.  */.
20e90 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65      winUnmapfile
20ea0 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  (pFd);.  }..  as
20eb0 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63  sert( pFd->nFetc
20ec0 68 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6e 64 69  hOut>=0 );.#endi
20ed0 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  f..  OSTRACE(("U
20ee0 4e 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20  NFETCH pid=%lu, 
20ef0 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c  pFile=%p, rc=SQL
20f00 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20  ITE_OK\n",.     
20f10 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
20f20 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66  ntProcessId(), f
20f30 64 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  d));.  return SQ
20f40 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
20f50 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68 65 20  * Here ends the 
20f60 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
20f70 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69  f all sqlite3_fi
20f80 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a  le methods..**.*
20f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20fa0 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65  ***** End sqlite
20fb0 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a  3_file Methods *
20fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
20fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
21030 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74 6f  /*.** This vecto
21040 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68  r defines all th
21050 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63  e methods that c
21060 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e  an operate on an
21070 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  .** sqlite3_file
21080 20 66 6f 72 20 77 69 6e 33 32 2e 0a 2a 2f 0a 73   for win32..*/.s
21090 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
210a0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 77  te3_io_methods w
210b0 69 6e 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20  inIoMethod = {. 
210c0 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   3,             
210d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210e0 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
210f0 20 20 77 69 6e 43 6c 6f 73 65 2c 20 20 20 20 20    winClose,     
21100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21110 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20    /* xClose */. 
21120 20 77 69 6e 52 65 61 64 2c 20 20 20 20 20 20 20   winRead,       
21130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21140 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20 77   /* xRead */.  w
21150 69 6e 57 72 69 74 65 2c 20 20 20 20 20 20 20 20  inWrite,        
21160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21170 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20 20 77 69  * xWrite */.  wi
21180 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  nTruncate,      
21190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
211a0 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20   xTruncate */.  
211b0 77 69 6e 53 79 6e 63 2c 20 20 20 20 20 20 20 20  winSync,        
211c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211d0 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 77 69  /* xSync */.  wi
211e0 6e 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20  nFileSize,      
211f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21200 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20   xFileSize */.  
21210 77 69 6e 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  winLock,        
21220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21230 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69  /* xLock */.  wi
21240 6e 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  nUnlock,        
21250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21260 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 77 69   xUnlock */.  wi
21270 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  nCheckReservedLo
21280 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ck,           /*
21290 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
212a0 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  ock */.  winFile
212b0 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20  Control,        
212c0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
212d0 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 77 69  eControl */.  wi
212e0 6e 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20  nSectorSize,    
212f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21300 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a   xSectorSize */.
21310 20 20 77 69 6e 44 65 76 69 63 65 43 68 61 72 61    winDeviceChara
21320 63 74 65 72 69 73 74 69 63 73 2c 20 20 20 20 20  cteristics,     
21330 20 20 2f 2a 20 78 44 65 76 69 63 65 43 68 61 72    /* xDeviceChar
21340 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20  acteristics */. 
21350 20 77 69 6e 53 68 6d 4d 61 70 2c 20 20 20 20 20   winShmMap,     
21360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21370 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 0a 20   /* xShmMap */. 
21380 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20 20 20   winShmLock,    
21390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213a0 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a   /* xShmLock */.
213b0 20 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 2c    winShmBarrier,
213c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213d0 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72    /* xShmBarrier
213e0 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 55 6e 6d 61   */.  winShmUnma
213f0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
21400 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d        /* xShmUnm
21410 61 70 20 2a 2f 0a 20 20 77 69 6e 46 65 74 63 68  ap */.  winFetch
21420 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21430 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63          /* xFetc
21440 68 20 2a 2f 0a 20 20 77 69 6e 55 6e 66 65 74 63  h */.  winUnfetc
21450 68 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h               
21460 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 66 65 74         /* xUnfet
21470 63 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a  ch */.};../*****
21480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
214a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
214b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
214c0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
214d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
214e0 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73  **** sqlite3_vfs
214f0 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   methods *******
21500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21510 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
21520 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
21530 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ns the implement
21540 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73  ation of methods
21550 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74   on the.** sqlit
21560 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a  e3_vfs object..*
21570 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  /..#if defined(_
21580 5f 43 59 47 57 49 4e 5f 5f 29 0a 2f 2a 0a 2a 2a  _CYGWIN__)./*.**
21590 20 43 6f 6e 76 65 72 74 20 61 20 66 69 6c 65 6e   Convert a filen
215a0 61 6d 65 20 66 72 6f 6d 20 77 68 61 74 65 76 65  ame from whateve
215b0 72 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  r the underlying
215c0 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
215d0 6d 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20 66 6f  m.** supports fo
215e0 72 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e 74 6f  r filenames into
215f0 20 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74   UTF-8.  Space t
21600 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75 6c  o hold the resul
21610 74 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64  t is.** obtained
21620 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64   from malloc and
21630 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
21640 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  y the calling fu
21650 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
21660 63 20 63 68 61 72 20 2a 77 69 6e 43 6f 6e 76 65  c char *winConve
21670 72 74 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65  rtToUtf8Filename
21680 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69  (const void *zFi
21690 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20  lename){.  char 
216a0 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b  *zConverted = 0;
216b0 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
216c0 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65  ){.    zConverte
216d0 64 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f  d = winUnicodeTo
216e0 55 74 66 38 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  Utf8(zFilename);
216f0 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
21700 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
21710 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 7a 43  I.  else{.    zC
21720 6f 6e 76 65 72 74 65 64 20 3d 20 73 71 6c 69 74  onverted = sqlit
21730 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f  e3_win32_mbcs_to
21740 5f 75 74 66 38 28 7a 46 69 6c 65 6e 61 6d 65 29  _utf8(zFilename)
21750 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f  ;.  }.#endif.  /
21760 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61  * caller will ha
21770 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f  ndle out of memo
21780 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a  ry */.  return z
21790 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 23 65 6e  Converted;.}.#en
217a0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  dif../*.** Conve
217b0 72 74 20 61 20 55 54 46 2d 38 20 66 69 6c 65 6e  rt a UTF-8 filen
217c0 61 6d 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65  ame into whateve
217d0 72 20 66 6f 72 6d 20 74 68 65 20 75 6e 64 65 72  r form the under
217e0 6c 79 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69  lying.** operati
217f0 6e 67 20 73 79 73 74 65 6d 20 77 61 6e 74 73 20  ng system wants 
21800 66 69 6c 65 6e 61 6d 65 73 20 69 6e 2e 20 20 53  filenames in.  S
21810 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
21820 20 72 65 73 75 6c 74 0a 2a 2a 20 69 73 20 6f 62   result.** is ob
21830 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
21840 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  oc and must be f
21850 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
21860 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e  ing.** function.
21870 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
21880 2a 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55  *winConvertFromU
21890 74 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73  tf8Filename(cons
218a0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
218b0 65 29 7b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e  e){.  void *zCon
218c0 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66  verted = 0;.  if
218d0 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20  ( osIsNT() ){.  
218e0 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
218f0 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28  inUtf8ToUnicode(
21900 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zFilename);.  }.
21910 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
21920 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
21930 6c 73 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72  lse{.    zConver
21940 74 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 77 69  ted = sqlite3_wi
21950 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73  n32_utf8_to_mbcs
21960 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d  (zFilename);.  }
21970 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61 6c  .#endif.  /* cal
21980 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20  ler will handle 
21990 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f  out of memory */
219a0 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65  .  return zConve
219b0 72 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rted;.}../*.** T
219c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
219d0 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  urns non-zero if
219e0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 55   the specified U
219f0 54 46 2d 38 20 73 74 72 69 6e 67 20 62 75 66 66  TF-8 string buff
21a00 65 72 0a 2a 2a 20 65 6e 64 73 20 77 69 74 68 20  er.** ends with 
21a10 61 20 64 69 72 65 63 74 6f 72 79 20 73 65 70 61  a directory sepa
21a20 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 20  rator character 
21a30 6f 72 20 6f 6e 65 20 77 61 73 20 73 75 63 63 65  or one was succe
21a40 73 73 66 75 6c 6c 79 0a 2a 2a 20 61 64 64 65 64  ssfully.** added
21a50 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69   to it..*/.stati
21a60 63 20 69 6e 74 20 77 69 6e 4d 61 6b 65 45 6e 64  c int winMakeEnd
21a70 49 6e 44 69 72 53 65 70 28 69 6e 74 20 6e 42 75  InDirSep(int nBu
21a80 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
21a90 20 20 69 66 28 20 7a 42 75 66 20 29 7b 0a 20 20    if( zBuf ){.  
21aa0 20 20 69 6e 74 20 6e 4c 65 6e 20 3d 20 73 71 6c    int nLen = sql
21ab0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75  ite3Strlen30(zBu
21ac0 66 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 6e  f);.    if( nLen
21ad0 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >0 ){.      if( 
21ae0 77 69 6e 49 73 44 69 72 53 65 70 28 7a 42 75 66  winIsDirSep(zBuf
21af0 5b 6e 4c 65 6e 2d 31 5d 29 20 29 7b 0a 20 20 20  [nLen-1]) ){.   
21b00 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
21b10 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
21b20 4c 65 6e 2b 31 3c 6e 42 75 66 20 29 7b 0a 20 20  Len+1<nBuf ){.  
21b30 20 20 20 20 20 20 7a 42 75 66 5b 6e 4c 65 6e 5d        zBuf[nLen]
21b40 20 3d 20 77 69 6e 47 65 74 44 69 72 53 65 70 28   = winGetDirSep(
21b50 29 3b 0a 20 20 20 20 20 20 20 20 7a 42 75 66 5b  );.        zBuf[
21b60 6e 4c 65 6e 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a  nLen+1] = '\0';.
21b70 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
21b80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21b90 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
21ba0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
21bb0 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
21bc0 20 6e 61 6d 65 20 61 6e 64 20 73 74 6f 72 65 20   name and store 
21bd0 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20 70 6f  the resulting po
21be0 69 6e 74 65 72 20 69 6e 74 6f 20 70 7a 42 75 66  inter into pzBuf
21bf0 2e 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  ..** The pointer
21c00 20 72 65 74 75 72 6e 65 64 20 69 6e 20 70 7a 42   returned in pzB
21c10 75 66 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  uf must be freed
21c20 20 76 69 61 20 73 71 6c 69 74 65 33 5f 66 72 65   via sqlite3_fre
21c30 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
21c40 6e 74 20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d  nt winGetTempnam
21c50 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  e(sqlite3_vfs *p
21c60 56 66 73 2c 20 63 68 61 72 20 2a 2a 70 7a 42 75  Vfs, char **pzBu
21c70 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61  f){.  static cha
21c80 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20  r zChars[] =.   
21c90 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e   "abcdefghijklmn
21ca0 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20  opqrstuvwxyz".  
21cb0 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d    "ABCDEFGHIJKLM
21cc0 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20  NOPQRSTUVWXYZ". 
21cd0 20 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b     "0123456789";
21ce0 0a 20 20 73 69 7a 65 5f 74 20 69 2c 20 6a 3b 0a  .  size_t i, j;.
21cf0 20 20 69 6e 74 20 6e 50 72 65 20 3d 20 73 71 6c    int nPre = sql
21d00 69 74 65 33 53 74 72 6c 65 6e 33 30 28 53 51 4c  ite3Strlen30(SQL
21d10 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52  ITE_TEMP_FILE_PR
21d20 45 46 49 58 29 3b 0a 20 20 69 6e 74 20 6e 4d 61  EFIX);.  int nMa
21d30 78 2c 20 6e 42 75 66 2c 20 6e 44 69 72 2c 20 6e  x, nBuf, nDir, n
21d40 4c 65 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 42 75  Len;.  char *zBu
21d50 66 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64  f;..  /* It's od
21d60 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e  d to simulate an
21d70 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20   io-error here, 
21d80 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20  but really this 
21d90 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69  is just.  ** usi
21da0 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20  ng the io-error 
21db0 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74  infrastructure t
21dc0 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69  o test that SQLi
21dd0 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a  te handles this.
21de0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61    ** function fa
21df0 69 6c 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 53 69  iling..  */.  Si
21e00 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
21e10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
21e20 52 52 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  RR );..  /* Allo
21e30 63 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79  cate a temporary
21e40 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65   buffer to store
21e50 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69   the fully quali
21e60 66 69 65 64 20 66 69 6c 65 0a 20 20 2a 2a 20 6e  fied file.  ** n
21e70 61 6d 65 20 66 6f 72 20 74 68 65 20 74 65 6d 70  ame for the temp
21e80 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 49 66 20  orary file.  If 
21e90 74 68 69 73 20 66 61 69 6c 73 2c 20 77 65 20 63  this fails, we c
21ea0 61 6e 6e 6f 74 20 63 6f 6e 74 69 6e 75 65 2e 0a  annot continue..
21eb0 20 20 2a 2f 0a 20 20 6e 4d 61 78 20 3d 20 70 56    */.  nMax = pV
21ec0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3b 20  fs->mxPathname; 
21ed0 6e 42 75 66 20 3d 20 6e 4d 61 78 20 2b 20 32 3b  nBuf = nMax + 2;
21ee0 0a 20 20 7a 42 75 66 20 3d 20 73 71 6c 69 74 65  .  zBuf = sqlite
21ef0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 75  3MallocZero( nBu
21f00 66 20 29 3b 0a 20 20 69 66 28 20 21 7a 42 75 66  f );.  if( !zBuf
21f10 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
21f20 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
21f30 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
21f40 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20  NOMEM\n"));.    
21f50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
21f60 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ERR_NOMEM;.  }..
21f70 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
21f80 74 68 65 20 65 66 66 65 63 74 69 76 65 20 74 65  the effective te
21f90 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
21fa0 79 2e 20 20 46 69 72 73 74 2c 20 63 68 65 63 6b  y.  First, check
21fb0 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 68 61 73   if one.  ** has
21fc0 20 62 65 65 6e 20 65 78 70 6c 69 63 69 74 6c 79   been explicitly
21fd0 20 73 65 74 20 62 79 20 74 68 65 20 61 70 70 6c   set by the appl
21fe0 69 63 61 74 69 6f 6e 3b 20 6f 74 68 65 72 77 69  ication; otherwi
21ff0 73 65 2c 20 75 73 65 20 74 68 65 20 6f 6e 65 0a  se, use the one.
22000 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20    ** configured 
22010 62 79 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  by the operating
22020 20 73 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20   system..  */.  
22030 6e 44 69 72 20 3d 20 6e 4d 61 78 20 2d 20 28 6e  nDir = nMax - (n
22040 50 72 65 20 2b 20 31 35 29 3b 0a 20 20 61 73 73  Pre + 15);.  ass
22050 65 72 74 28 20 6e 44 69 72 3e 30 20 29 3b 0a 20  ert( nDir>0 );. 
22060 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 6d   if( sqlite3_tem
22070 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a 20  p_directory ){. 
22080 20 20 20 69 6e 74 20 6e 44 69 72 4c 65 6e 20 3d     int nDirLen =
22090 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
220a0 28 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  (sqlite3_temp_di
220b0 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 69 66  rectory);.    if
220c0 28 20 6e 44 69 72 4c 65 6e 3e 30 20 29 7b 0a 20  ( nDirLen>0 ){. 
220d0 20 20 20 20 20 69 66 28 20 21 77 69 6e 49 73 44       if( !winIsD
220e0 69 72 53 65 70 28 73 71 6c 69 74 65 33 5f 74 65  irSep(sqlite3_te
220f0 6d 70 5f 64 69 72 65 63 74 6f 72 79 5b 6e 44 69  mp_directory[nDi
22100 72 4c 65 6e 2d 31 5d 29 20 29 7b 0a 20 20 20 20  rLen-1]) ){.    
22110 20 20 20 20 6e 44 69 72 4c 65 6e 2b 2b 3b 0a 20      nDirLen++;. 
22120 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
22130 20 6e 44 69 72 4c 65 6e 3e 6e 44 69 72 20 29 7b   nDirLen>nDir ){
22140 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22150 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
22160 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
22170 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
22180 53 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29  SQLITE_ERROR\n")
22190 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
221a0 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
221b0 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20 22  LITE_ERROR, 0, "
221c0 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 31 22  winGetTempname1"
221d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
221e0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
221f0 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c  intf(nMax, zBuf,
22200 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 74   "%s", sqlite3_t
22210 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a  emp_directory);.
22220 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 20 64 65      }.  }.#if de
22230 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
22240 29 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 74  ).  else{.    st
22250 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
22260 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20  *azDirs[] = {.  
22270 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e       0, /* geten
22280 76 28 22 53 51 4c 49 54 45 5f 54 4d 50 44 49 52  v("SQLITE_TMPDIR
22290 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20  ") */.       0, 
222a0 2f 2a 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49  /* getenv("TMPDI
222b0 52 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c  R") */.       0,
222c0 20 2f 2a 20 67 65 74 65 6e 76 28 22 54 4d 50 22   /* getenv("TMP"
222d0 29 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f  ) */.       0, /
222e0 2a 20 67 65 74 65 6e 76 28 22 54 45 4d 50 22 29  * getenv("TEMP")
222f0 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a   */.       0, /*
22300 20 67 65 74 65 6e 76 28 22 55 53 45 52 50 52 4f   getenv("USERPRO
22310 46 49 4c 45 22 29 20 2a 2f 0a 20 20 20 20 20 20  FILE") */.      
22320 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20   "/var/tmp",.   
22330 20 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a      "/usr/tmp",.
22340 20 20 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20         "/tmp",. 
22350 20 20 20 20 20 20 22 2e 22 2c 0a 20 20 20 20 20        ".",.     
22360 20 20 30 20 20 20 20 20 20 20 20 2f 2a 20 4c 69    0        /* Li
22370 73 74 20 74 65 72 6d 69 6e 61 74 6f 72 20 2a 2f  st terminator */
22380 0a 20 20 20 20 7d 3b 0a 20 20 20 20 75 6e 73 69  .    };.    unsi
22390 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 20 20  gned int i;.    
223a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72  const char *zDir
223b0 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 21   = 0;..    if( !
223c0 61 7a 44 69 72 73 5b 30 5d 20 29 20 61 7a 44 69  azDirs[0] ) azDi
223d0 72 73 5b 30 5d 20 3d 20 67 65 74 65 6e 76 28 22  rs[0] = getenv("
223e0 53 51 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 3b  SQLITE_TMPDIR");
223f0 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73  .    if( !azDirs
22400 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d 20  [1] ) azDirs[1] 
22410 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52  = getenv("TMPDIR
22420 22 29 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44  ");.    if( !azD
22430 69 72 73 5b 32 5d 20 29 20 61 7a 44 69 72 73 5b  irs[2] ) azDirs[
22440 32 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50  2] = getenv("TMP
22450 22 29 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44  ");.    if( !azD
22460 69 72 73 5b 33 5d 20 29 20 61 7a 44 69 72 73 5b  irs[3] ) azDirs[
22470 33 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 45 4d  3] = getenv("TEM
22480 50 22 29 3b 0a 20 20 20 20 69 66 28 20 21 61 7a  P");.    if( !az
22490 44 69 72 73 5b 34 5d 20 29 20 61 7a 44 69 72 73  Dirs[4] ) azDirs
224a0 5b 34 5d 20 3d 20 67 65 74 65 6e 76 28 22 55 53  [4] = getenv("US
224b0 45 52 50 52 4f 46 49 4c 45 22 29 3b 0a 20 20 20  ERPROFILE");.   
224c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
224d0 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f  of(azDirs)/sizeo
224e0 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 7a 44  f(azDirs[0]); zD
224f0 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b  ir=azDirs[i++]){
22500 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 7a 43 6f  .      void *zCo
22510 6e 76 65 72 74 65 64 3b 0a 20 20 20 20 20 20 69  nverted;.      i
22520 66 28 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e  f( zDir==0 ) con
22530 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 2f 2a 20  tinue;.      /* 
22540 49 66 20 74 68 65 20 70 61 74 68 20 73 74 61 72  If the path star
22550 74 73 20 77 69 74 68 20 61 20 64 72 69 76 65 20  ts with a drive 
22560 6c 65 74 74 65 72 20 66 6f 6c 6c 6f 77 65 64 20  letter followed 
22570 62 79 20 74 68 65 20 63 6f 6c 6f 6e 0a 20 20 20  by the colon.   
22580 20 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72 2c     ** character,
22590 20 61 73 73 75 6d 65 20 69 74 20 69 73 20 61 6c   assume it is al
225a0 72 65 61 64 79 20 61 20 6e 61 74 69 76 65 20 57  ready a native W
225b0 69 6e 33 32 20 70 61 74 68 3b 20 6f 74 68 65 72  in32 path; other
225c0 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 69  wise,.      ** i
225d0 74 20 6d 75 73 74 20 62 65 20 63 6f 6e 76 65 72  t must be conver
225e0 74 65 64 20 74 6f 20 61 20 6e 61 74 69 76 65 20  ted to a native 
225f0 57 69 6e 33 32 20 70 61 74 68 20 76 69 61 20 74  Win32 path via t
22600 68 65 20 43 79 67 77 69 6e 20 41 50 49 0a 20 20  he Cygwin API.  
22610 20 20 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20      ** prior to 
22620 75 73 69 6e 67 20 69 74 2e 0a 20 20 20 20 20 20  using it..      
22630 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 77 69 6e  */.      if( win
22640 49 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64  IsDriveLetterAnd
22650 43 6f 6c 6f 6e 28 7a 44 69 72 29 20 29 7b 0a 20  Colon(zDir) ){. 
22660 20 20 20 20 20 20 20 7a 43 6f 6e 76 65 72 74 65         zConverte
22670 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72  d = winConvertFr
22680 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  omUtf8Filename(z
22690 44 69 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Dir);.        if
226a0 28 20 21 7a 43 6f 6e 76 65 72 74 65 64 20 29 7b  ( !zConverted ){
226b0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
226c0 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20  e3_free(zBuf);. 
226d0 20 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45           OSTRACE
226e0 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
226f0 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
22700 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20  _NOMEM\n"));.   
22710 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
22720 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
22730 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22740 20 20 20 20 69 66 28 20 77 69 6e 49 73 44 69 72      if( winIsDir
22750 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a  (zConverted) ){.
22760 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
22770 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c  3_snprintf(nMax,
22780 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 44 69   zBuf, "%s", zDi
22790 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  r);.          sq
227a0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
227b0 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20  erted);.        
227c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
227d0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
227e0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
227f0 65 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ed);.      }else
22800 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6e 76 65  {.        zConve
22810 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 61  rted = sqlite3Ma
22820 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61 78 2b 31  llocZero( nMax+1
22830 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
22840 21 7a 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20  !zConverted ){. 
22850 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
22860 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
22870 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
22880 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
22890 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
228a0 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20  OMEM\n"));.     
228b0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
228c0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
228d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
228e0 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e    if( cygwin_con
228f0 76 5f 70 61 74 68 28 0a 20 20 20 20 20 20 20 20  v_path(.        
22900 20 20 20 20 20 20 20 20 6f 73 49 73 4e 54 28 29          osIsNT()
22910 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f   ? CCP_POSIX_TO_
22920 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49  WIN_W : CCP_POSI
22930 58 5f 54 4f 5f 57 49 4e 5f 41 2c 20 7a 44 69 72  X_TO_WIN_A, zDir
22940 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22950 20 20 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 4d    zConverted, nM
22960 61 78 2b 31 29 3c 30 20 29 7b 0a 20 20 20 20 20  ax+1)<0 ){.     
22970 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
22980 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
22990 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
229a0 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
229b0 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
229c0 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
229d0 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  c=SQLITE_IOERR_C
229e0 4f 4e 56 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20  ONVPATH\n"));.  
229f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 77          return w
22a00 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
22a10 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48  E_IOERR_CONVPATH
22a20 2c 20 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a  , (DWORD)errno,.
22a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a40 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
22a50 6e 47 65 74 54 65 6d 70 6e 61 6d 65 32 22 2c 20  nGetTempname2", 
22a60 7a 44 69 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  zDir);.        }
22a70 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 69 6e  .        if( win
22a80 49 73 44 69 72 28 7a 43 6f 6e 76 65 72 74 65 64  IsDir(zConverted
22a90 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
22aa0 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
22ab0 20 77 65 20 6b 6e 6f 77 20 74 68 65 20 63 61 6e   we know the can
22ac0 64 69 64 61 74 65 20 64 69 72 65 63 74 6f 72 79  didate directory
22ad0 20 65 78 69 73 74 73 20 61 6e 64 20 73 68 6f 75   exists and shou
22ae0 6c 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ld.          ** 
22af0 62 65 20 75 73 65 64 2e 20 20 48 6f 77 65 76 65  be used.  Howeve
22b00 72 2c 20 77 65 20 6d 61 79 20 6e 65 65 64 20 74  r, we may need t
22b10 6f 20 63 6f 6e 76 65 72 74 20 74 68 65 20 73 74  o convert the st
22b20 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 0a  ring containing.
22b30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 73            ** its
22b40 20 6e 61 6d 65 20 69 6e 74 6f 20 55 54 46 2d 38   name into UTF-8
22b50 20 28 69 2e 65 2e 20 69 66 20 69 74 20 69 73 20   (i.e. if it is 
22b60 55 54 46 2d 31 36 20 72 69 67 68 74 20 6e 6f 77  UTF-16 right now
22b70 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  )..          */.
22b80 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
22b90 7a 55 74 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65  zUtf8 = winConve
22ba0 72 74 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65  rtToUtf8Filename
22bb0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
22bc0 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 55 74          if( !zUt
22bd0 66 38 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  f8 ){.          
22be0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
22bf0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
22c00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
22c10 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
22c20 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
22c30 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
22c40 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
22c50 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20  NOMEM\n"));.    
22c60 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
22c70 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
22c80 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  M;.          }. 
22c90 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
22ca0 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20  _snprintf(nMax, 
22cb0 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 55 74 66  zBuf, "%s", zUtf
22cc0 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  8);.          sq
22cd0 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38  lite3_free(zUtf8
22ce0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
22cf0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
22d00 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20  rted);.         
22d10 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
22d20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
22d30 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
22d40 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d);.      }.    
22d50 7d 0a 20 20 7d 0a 23 65 6c 69 66 20 21 53 51 4c  }.  }.#elif !SQL
22d60 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
22d70 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49  !defined(__CYGWI
22d80 4e 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20  N__).  else if( 
22d90 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
22da0 63 68 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20  char *zMulti;.  
22db0 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65 50 61    LPWSTR zWidePa
22dc0 74 68 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  th = sqlite3Mall
22dd0 6f 63 5a 65 72 6f 28 20 6e 4d 61 78 2a 73 69 7a  ocZero( nMax*siz
22de0 65 6f 66 28 57 43 48 41 52 29 20 29 3b 0a 20 20  eof(WCHAR) );.  
22df0 20 20 69 66 28 20 21 7a 57 69 64 65 50 61 74 68    if( !zWidePath
22e00 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
22e10 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
22e20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
22e30 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
22e40 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
22e50 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65  M\n"));.      re
22e60 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
22e70 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  R_NOMEM;.    }. 
22e80 20 20 20 69 66 28 20 6f 73 47 65 74 54 65 6d 70     if( osGetTemp
22e90 50 61 74 68 57 28 6e 4d 61 78 2c 20 7a 57 69 64  PathW(nMax, zWid
22ea0 65 50 61 74 68 29 3d 3d 30 20 29 7b 0a 20 20 20  ePath)==0 ){.   
22eb0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22ec0 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20  zWidePath);.    
22ed0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
22ee0 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  Buf);.      OSTR
22ef0 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
22f00 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  AME rc=SQLITE_IO
22f10 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 5c  ERR_GETTEMPPATH\
22f20 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  n"));.      retu
22f30 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
22f40 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54  QLITE_IOERR_GETT
22f50 45 4d 50 50 41 54 48 2c 20 6f 73 47 65 74 4c 61  EMPPATH, osGetLa
22f60 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
22f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f80 20 20 20 20 22 77 69 6e 47 65 74 54 65 6d 70 6e      "winGetTempn
22f90 61 6d 65 32 22 2c 20 30 29 3b 0a 20 20 20 20 7d  ame2", 0);.    }
22fa0 0a 20 20 20 20 7a 4d 75 6c 74 69 20 3d 20 77 69  .    zMulti = wi
22fb0 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a  nUnicodeToUtf8(z
22fc0 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 69  WidePath);.    i
22fd0 66 28 20 7a 4d 75 6c 74 69 20 29 7b 0a 20 20 20  f( zMulti ){.   
22fe0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
22ff0 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20  ntf(nMax, zBuf, 
23000 22 25 73 22 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20  "%s", zMulti);. 
23010 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
23020 65 28 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20  e(zMulti);.     
23030 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57   sqlite3_free(zW
23040 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 7d 65  idePath);.    }e
23050 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
23060 65 33 5f 66 72 65 65 28 7a 57 69 64 65 50 61 74  e3_free(zWidePat
23070 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  h);.      sqlite
23080 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
23090 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
230a0 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
230b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
230c0 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65  M\n"));.      re
230d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
230e0 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  R_NOMEM;.    }. 
230f0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
23100 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
23110 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72    else{.    char
23120 20 2a 7a 55 74 66 38 3b 0a 20 20 20 20 63 68 61   *zUtf8;.    cha
23130 72 20 2a 7a 4d 62 63 73 50 61 74 68 20 3d 20 73  r *zMbcsPath = s
23140 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
23150 28 20 6e 4d 61 78 20 29 3b 0a 20 20 20 20 69 66  ( nMax );.    if
23160 28 20 21 7a 4d 62 63 73 50 61 74 68 20 29 7b 0a  ( !zMbcsPath ){.
23170 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
23180 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
23190 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
231a0 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
231b0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
231c0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
231d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
231e0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  MEM;.    }.    i
231f0 66 28 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68  f( osGetTempPath
23200 41 28 6e 4d 61 78 2c 20 7a 4d 62 63 73 50 61 74  A(nMax, zMbcsPat
23210 68 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  h)==0 ){.      s
23220 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
23230 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
23240 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
23250 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
23260 5f 47 45 54 54 45 4d 50 50 41 54 48 5c 6e 22 29  _GETTEMPPATH\n")
23270 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
23280 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
23290 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50  TE_IOERR_GETTEMP
232a0 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45  PATH, osGetLastE
232b0 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
232c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232d0 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65   "winGetTempname
232e0 33 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  3", 0);.    }.  
232f0 20 20 7a 55 74 66 38 20 3d 20 73 71 6c 69 74 65    zUtf8 = sqlite
23300 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f  3_win32_mbcs_to_
23310 75 74 66 38 28 7a 4d 62 63 73 50 61 74 68 29 3b  utf8(zMbcsPath);
23320 0a 20 20 20 20 69 66 28 20 7a 55 74 66 38 20 29  .    if( zUtf8 )
23330 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
23340 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a  snprintf(nMax, z
23350 42 75 66 2c 20 22 25 73 22 2c 20 7a 55 74 66 38  Buf, "%s", zUtf8
23360 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
23370 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20  _free(zUtf8);.  
23380 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
23390 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
233a0 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
233b0 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
233c0 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
233d0 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20  _NOMEM\n"));.   
233e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
233f0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
23400 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
23410 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  * SQLITE_WIN32_H
23420 41 53 5f 41 4e 53 49 20 2a 2f 0a 23 65 6e 64 69  AS_ANSI */.#endi
23430 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 53 5f  f /* !SQLITE_OS_
23440 57 49 4e 52 54 20 2a 2f 0a 0a 20 20 2f 2a 0a 20  WINRT */..  /*. 
23450 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b   ** Check to mak
23460 65 20 73 75 72 65 20 74 68 65 20 74 65 6d 70 6f  e sure the tempo
23470 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 65  rary directory e
23480 6e 64 73 20 77 69 74 68 20 61 6e 20 61 70 70 72  nds with an appr
23490 6f 70 72 69 61 74 65 0a 20 20 2a 2a 20 73 65 70  opriate.  ** sep
234a0 61 72 61 74 6f 72 2e 20 20 49 66 20 69 74 20 64  arator.  If it d
234b0 6f 65 73 20 6e 6f 74 20 61 6e 64 20 74 68 65 72  oes not and ther
234c0 65 20 69 73 20 6e 6f 74 20 65 6e 6f 75 67 68 20  e is not enough 
234d0 73 70 61 63 65 20 6c 65 66 74 20 74 6f 20 61 64  space left to ad
234e0 64 0a 20 20 2a 2a 20 6f 6e 65 2c 20 66 61 69 6c  d.  ** one, fail
234f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 77 69  ..  */.  if( !wi
23500 6e 4d 61 6b 65 45 6e 64 49 6e 44 69 72 53 65 70  nMakeEndInDirSep
23510 28 6e 44 69 72 2b 31 2c 20 7a 42 75 66 29 20 29  (nDir+1, zBuf) )
23520 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
23530 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 4f 53  ee(zBuf);.    OS
23540 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
23550 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
23560 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20  ERROR\n"));.    
23570 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
23580 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  or(SQLITE_ERROR,
23590 20 30 2c 20 22 77 69 6e 47 65 74 54 65 6d 70 6e   0, "winGetTempn
235a0 61 6d 65 34 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a  ame4", 0);.  }..
235b0 20 20 2f 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 20    /*.  ** Check 
235c0 74 68 61 74 20 74 68 65 20 6f 75 74 70 75 74 20  that the output 
235d0 62 75 66 66 65 72 20 69 73 20 6c 61 72 67 65 20  buffer is large 
235e0 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74  enough for the t
235f0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 0a 20 20  emporary file.  
23600 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 66  ** name in the f
23610 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 61 74 3a  ollowing format:
23620 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 22 3c 74  .  **.  **   "<t
23630 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63 74 6f  emporary_directo
23640 72 79 3e 2f 65 74 69 6c 71 73 5f 58 58 58 58 58  ry>/etilqs_XXXXX
23650 58 58 58 58 58 58 58 58 58 58 5c 30 5c 30 22 0a  XXXXXXXXXX\0\0".
23660 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 6e 6f 74    **.  ** If not
23670 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
23680 45 52 52 4f 52 2e 20 20 54 68 65 20 6e 75 6d 62  ERROR.  The numb
23690 65 72 20 31 37 20 69 73 20 75 73 65 64 20 68 65  er 17 is used he
236a0 72 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20  re in order to. 
236b0 20 2a 2a 20 61 63 63 6f 75 6e 74 20 66 6f 72 20   ** account for 
236c0 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62  the space used b
236d0 79 20 74 68 65 20 31 35 20 63 68 61 72 61 63 74  y the 15 charact
236e0 65 72 20 72 61 6e 64 6f 6d 20 73 75 66 66 69 78  er random suffix
236f0 20 61 6e 64 20 74 68 65 0a 20 20 2a 2a 20 74 77   and the.  ** tw
23700 6f 20 74 72 61 69 6c 69 6e 67 20 4e 55 4c 20 63  o trailing NUL c
23710 68 61 72 61 63 74 65 72 73 2e 20 20 54 68 65 20  haracters.  The 
23720 66 69 6e 61 6c 20 64 69 72 65 63 74 6f 72 79 20  final directory 
23730 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63  separator charac
23740 74 65 72 0a 20 20 2a 2a 20 68 61 73 20 61 6c 72  ter.  ** has alr
23750 65 61 64 79 20 61 64 64 65 64 20 69 66 20 69 74  eady added if it
23760 20 77 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   was not already
23770 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2f 0a 20   present..  */. 
23780 20 6e 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53   nLen = sqlite3S
23790 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20  trlen30(zBuf);. 
237a0 20 69 66 28 20 28 6e 4c 65 6e 20 2b 20 6e 50 72   if( (nLen + nPr
237b0 65 20 2b 20 31 37 29 20 3e 20 6e 42 75 66 20 29  e + 17) > nBuf )
237c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
237d0 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 4f 53  ee(zBuf);.    OS
237e0 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
237f0 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
23800 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20  ERROR\n"));.    
23810 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
23820 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  or(SQLITE_ERROR,
23830 20 30 2c 20 22 77 69 6e 47 65 74 54 65 6d 70 6e   0, "winGetTempn
23840 61 6d 65 35 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a  ame5", 0);.  }..
23850 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
23860 74 66 28 6e 42 75 66 2d 31 36 2d 6e 4c 65 6e 2c  tf(nBuf-16-nLen,
23870 20 7a 42 75 66 2b 6e 4c 65 6e 2c 20 53 51 4c 49   zBuf+nLen, SQLI
23880 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45  TE_TEMP_FILE_PRE
23890 46 49 58 29 3b 0a 0a 20 20 6a 20 3d 20 73 71 6c  FIX);..  j = sql
238a0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75  ite3Strlen30(zBu
238b0 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 61  f);.  sqlite3_ra
238c0 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42  ndomness(15, &zB
238d0 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69 3d  uf[j]);.  for(i=
238e0 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b  0; i<15; i++, j+
238f0 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20  +){.    zBuf[j] 
23900 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20  = (char)zChars[ 
23910 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29  ((unsigned char)
23920 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66  zBuf[j])%(sizeof
23930 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20  (zChars)-1) ];. 
23940 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30   }.  zBuf[j] = 0
23950 3b 0a 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20  ;.  zBuf[j+1] = 
23960 30 3b 0a 20 20 2a 70 7a 42 75 66 20 3d 20 7a 42  0;.  *pzBuf = zB
23970 75 66 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  uf;..  OSTRACE((
23980 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 6e  "TEMP-FILENAME n
23990 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54  ame=%s, rc=SQLIT
239a0 45 5f 4f 4b 5c 6e 22 2c 20 7a 42 75 66 29 29 3b  E_OK\n", zBuf));
239b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
239c0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
239d0 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
239e0 20 6e 61 6d 65 64 20 66 69 6c 65 20 69 73 20 72   named file is r
239f0 65 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72  eally a director
23a00 79 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  y.  Return false
23a10 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d   if.** it is som
23a20 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ething other tha
23a30 6e 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 6f  n a directory, o
23a40 72 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  r if there is an
23a50 79 20 6b 69 6e 64 20 6f 66 20 6d 65 6d 6f 72 79  y kind of memory
23a60 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  .** allocation f
23a70 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ailure..*/.stati
23a80 63 20 69 6e 74 20 77 69 6e 49 73 44 69 72 28 63  c int winIsDir(c
23a90 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  onst void *zConv
23aa0 65 72 74 65 64 29 7b 0a 20 20 44 57 4f 52 44 20  erted){.  DWORD 
23ab0 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  attr;.  int rc =
23ac0 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74   0;.  DWORD last
23ad0 45 72 72 6e 6f 3b 0a 0a 20 20 69 66 28 20 6f 73  Errno;..  if( os
23ae0 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 69 6e  IsNT() ){.    in
23af0 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57  t cnt = 0;.    W
23b00 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42  IN32_FILE_ATTRIB
23b10 55 54 45 5f 44 41 54 41 20 73 41 74 74 72 44 61  UTE_DATA sAttrDa
23b20 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ta;.    memset(&
23b30 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69  sAttrData, 0, si
23b40 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29 29  zeof(sAttrData))
23b50 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28 72  ;.    while( !(r
23b60 63 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74  c = osGetFileAtt
23b70 72 69 62 75 74 65 73 45 78 57 28 28 4c 50 43 57  ributesExW((LPCW
23b80 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a  STR)zConverted,.
23b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 47 65 74               Get
23bb0 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61  FileExInfoStanda
23bc0 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rd,.            
23bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23be0 20 26 73 41 74 74 72 44 61 74 61 29 29 20 26 26   &sAttrData)) &&
23bf0 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26   winRetryIoerr(&
23c00 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  cnt, &lastErrno)
23c10 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 21 72 63   ){}.    if( !rc
23c20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
23c30 20 30 3b 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6e   0; /* Invalid n
23c40 61 6d 65 3f 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  ame? */.    }.  
23c50 20 20 61 74 74 72 20 3d 20 73 41 74 74 72 44 61    attr = sAttrDa
23c60 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75  ta.dwFileAttribu
23c70 74 65 73 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  tes;.#if SQLITE_
23c80 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65  OS_WINCE==0.  }e
23c90 6c 73 65 7b 0a 20 20 20 20 61 74 74 72 20 3d 20  lse{.    attr = 
23ca0 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
23cb0 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  tesA((char*)zCon
23cc0 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a  verted);.#endif.
23cd0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 61 74    }.  return (at
23ce0 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45  tr!=INVALID_FILE
23cf0 5f 41 54 54 52 49 42 55 54 45 53 29 20 26 26 20  _ATTRIBUTES) && 
23d00 28 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49  (attr&FILE_ATTRI
23d10 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 29 3b  BUTE_DIRECTORY);
23d20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
23d30 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
23d40 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 0a 20 20   int winOpen(.  
23d50 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
23d60 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  s,        /* Use
23d70 64 20 74 6f 20 67 65 74 20 6d 61 78 69 6d 75 6d  d to get maximum
23d80 20 70 61 74 68 20 6e 61 6d 65 20 6c 65 6e 67 74   path name lengt
23d90 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  h */.  const cha
23da0 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20  r *zName,       
23db0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
23dc0 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a  file (UTF-8) */.
23dd0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
23de0 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57  id,         /* W
23df0 72 69 74 65 20 74 68 65 20 53 51 4c 69 74 65 20  rite the SQLite 
23e00 66 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65  file handle here
23e10 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
23e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e30 2f 2a 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61  /* Open mode fla
23e40 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75  gs */.  int *pOu
23e50 74 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  tFlags          
23e60 20 20 2f 2a 20 53 74 61 74 75 73 20 72 65 74 75    /* Status retu
23e70 72 6e 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  rn flags */.){. 
23e80 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f   HANDLE h;.  DWO
23e90 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30  RD lastErrno = 0
23ea0 3b 0a 20 20 44 57 4f 52 44 20 64 77 44 65 73 69  ;.  DWORD dwDesi
23eb0 72 65 64 41 63 63 65 73 73 3b 0a 20 20 44 57 4f  redAccess;.  DWO
23ec0 52 44 20 64 77 53 68 61 72 65 4d 6f 64 65 3b 0a  RD dwShareMode;.
23ed0 20 20 44 57 4f 52 44 20 64 77 43 72 65 61 74 69    DWORD dwCreati
23ee0 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 3b 0a 20  onDisposition;. 
23ef0 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 41 6e   DWORD dwFlagsAn
23f00 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 30 3b  dAttributes = 0;
23f10 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
23f20 49 4e 43 45 0a 20 20 69 6e 74 20 69 73 54 65 6d  INCE.  int isTem
23f30 70 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  p = 0;.#endif.  
23f40 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
23f50 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20   (winFile*)id;. 
23f60 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
23f70 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
23f80 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 4f  /* Filename in O
23f90 53 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20  S encoding */.  
23fa0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 74 66  const char *zUtf
23fb0 38 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20 2f  8Name = zName; /
23fc0 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 55 54  * Filename in UT
23fd0 46 2d 38 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a  F-8 encoding */.
23fe0 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 0a    int cnt = 0;..
23ff0 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74    /* If argument
24000 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c   zPath is a NULL
24010 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66   pointer, this f
24020 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69  unction is requi
24030 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a  red to open.  **
24040 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
24050 65 2e 20 55 73 65 20 74 68 69 73 20 62 75 66 66  e. Use this buff
24060 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  er to store the 
24070 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20  file name in..  
24080 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 6e  */.  char *zTmpn
24090 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 46 6f 72 20  ame = 0; /* For 
240a0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e 61  temporary filena
240b0 6d 65 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  me, if necessary
240c0 2e 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 63 20 3d  . */..  int rc =
240d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
240e0 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
240f0 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  on Return Code *
24100 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  /.#if !defined(N
24110 44 45 42 55 47 29 20 7c 7c 20 53 51 4c 49 54 45  DEBUG) || SQLITE
24120 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20  _OS_WINCE.  int 
24130 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78  eType = flags&0x
24140 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79  FFFFFF00;  /* Ty
24150 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70  pe of file to op
24160 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  en */.#endif..  
24170 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65 20  int isExclusive 
24180 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
24190 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
241a0 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65  E);.  int isDele
241b0 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20  te     = (flags 
241c0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  & SQLITE_OPEN_DE
241d0 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20  LETEONCLOSE);.  
241e0 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20 20  int isCreate    
241f0 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
24200 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b  TE_OPEN_CREATE);
24210 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c  .  int isReadonl
24220 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  y   = (flags & S
24230 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
24240 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65  NLY);.  int isRe
24250 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67  adWrite  = (flag
24260 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
24270 52 45 41 44 57 52 49 54 45 29 3b 0a 0a 23 69 66  READWRITE);..#if
24280 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e  ndef NDEBUG.  in
24290 74 20 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20  t isOpenJournal 
242a0 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20 28  = (isCreate && (
242b0 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d  .        eType==
242c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
242d0 45 52 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20  ER_JOURNAL.     
242e0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
242f0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
24300 41 4c 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65  AL.     || eType
24310 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  ==SQLITE_OPEN_WA
24320 4c 0a 20 20 29 29 3b 0a 23 65 6e 64 69 66 0a 0a  L.  ));.#endif..
24330 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
24340 20 6e 61 6d 65 3d 25 73 2c 20 70 46 69 6c 65 3d   name=%s, pFile=
24350 25 70 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70 4f  %p, flags=%x, pO
24360 75 74 46 6c 61 67 73 3d 25 70 5c 6e 22 2c 0a 20  utFlags=%p\n",. 
24370 20 20 20 20 20 20 20 20 20 20 7a 55 74 66 38 4e            zUtf8N
24380 61 6d 65 2c 20 69 64 2c 20 66 6c 61 67 73 2c 20  ame, id, flags, 
24390 70 4f 75 74 46 6c 61 67 73 29 29 3b 0a 0a 20 20  pOutFlags));..  
243a0 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c  /* Check the fol
243b0 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74  lowing statement
243c0 73 20 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a  s are true:.  **
243d0 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63  .  **   (a) Exac
243e0 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52  tly one of the R
243f0 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41  EADWRITE and REA
24400 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74  DONLY flags must
24410 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a   be set, and.  *
24420 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54  *   (b) if CREAT
24430 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52  E is set, then R
24440 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c  EADWRITE must al
24450 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20  so be set, and. 
24460 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43   **   (c) if EXC
24470 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74  LUSIVE is set, t
24480 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
24490 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
244a0 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54  *   (d) if DELET
244b0 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c  EONCLOSE is set,
244c0 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
244d0 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
244e0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73   */.  assert((is
244f0 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69  Readonly==0 || i
24500 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26  sReadWrite==0) &
24510 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c  & (isReadWrite |
24520 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a  | isReadonly));.
24530 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74    assert(isCreat
24540 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  e==0 || isReadWr
24550 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ite);.  assert(i
24560 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c  sExclusive==0 ||
24570 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73   isCreate);.  as
24580 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30  sert(isDelete==0
24590 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a   || isCreate);..
245a0 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42    /* The main DB
245b0 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  , main journal, 
245c0 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73  WAL file and mas
245d0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20  ter journal are 
245e0 6e 65 76 65 72 0a 20 20 2a 2a 20 61 75 74 6f 6d  never.  ** autom
245f0 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
24600 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65  . Nor are they e
24610 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  ver temporary fi
24620 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  les.  */.  asser
24630 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
24640 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
24650 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
24660 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  IN_DB );.  asser
24670 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
24680 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
24690 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
246a0 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  IN_JOURNAL );.  
246b0 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
246c0 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
246d0 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
246e0 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
246f0 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  L );.  assert( (
24700 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
24710 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
24720 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b  LITE_OPEN_WAL );
24730 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
24740 61 74 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  at the upper lay
24750 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f  er has set one o
24760 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65  f the "file-type
24770 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73  " flags. */.  as
24780 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c  sert( eType==SQL
24790 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
247a0 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
247b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
247c0 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  _DB.       || eT
247d0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
247e0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c  _MAIN_JOURNAL ||
247f0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
24800 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
24810 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
24820 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55  ==SQLITE_OPEN_SU
24830 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54  BJOURNAL   || eT
24840 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
24850 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 0a  _MASTER_JOURNAL.
24860 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
24870 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41  =SQLITE_OPEN_TRA
24880 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79  NSIENT_DB || eTy
24890 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
248a0 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65  WAL.  );..  asse
248b0 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a  rt( pFile!=0 );.
248c0 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20    memset(pFile, 
248d0 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c  0, sizeof(winFil
248e0 65 29 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20  e));.  pFile->h 
248f0 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  = INVALID_HANDLE
24900 5f 56 41 4c 55 45 3b 0a 0a 23 69 66 20 53 51 4c  _VALUE;..#if SQL
24910 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69  ITE_OS_WINRT.  i
24920 66 28 20 21 7a 55 74 66 38 4e 61 6d 65 20 26 26  f( !zUtf8Name &&
24930 20 21 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64   !sqlite3_temp_d
24940 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20  irectory ){.    
24950 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
24960 54 45 5f 45 52 52 4f 52 2c 0a 20 20 20 20 20 20  TE_ERROR,.      
24970 20 20 22 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f    "sqlite3_temp_
24980 64 69 72 65 63 74 6f 72 79 20 76 61 72 69 61 62  directory variab
24990 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74  le should be set
249a0 20 66 6f 72 20 57 69 6e 52 54 22 29 3b 0a 20 20   for WinRT");.  
249b0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
249c0 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
249d0 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
249e0 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20  nction is NULL, 
249f0 67 65 6e 65 72 61 74 65 20 61 0a 20 20 2a 2a 20  generate a.  ** 
24a00 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e  temporary file n
24a10 61 6d 65 20 74 6f 20 75 73 65 0a 20 20 2a 2f 0a  ame to use.  */.
24a20 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61 6d 65    if( !zUtf8Name
24a30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
24a40 69 73 44 65 6c 65 74 65 20 26 26 20 21 69 73 4f  isDelete && !isO
24a50 70 65 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  penJournal );.  
24a60 20 20 72 63 20 3d 20 77 69 6e 47 65 74 54 65 6d    rc = winGetTem
24a70 70 6e 61 6d 65 28 70 56 66 73 2c 20 26 7a 54 6d  pname(pVfs, &zTm
24a80 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pname);.    if( 
24a90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
24aa0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
24ab0 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72  "OPEN name=%s, r
24ac0 63 3d 25 73 22 2c 20 7a 55 74 66 38 4e 61 6d 65  c=%s", zUtf8Name
24ad0 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
24ae0 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65  (rc)));.      re
24af0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
24b00 20 20 20 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a     zUtf8Name = z
24b10 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20  Tmpname;.  }..  
24b20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
24b30 6e 61 6d 65 73 20 61 72 65 20 64 6f 75 62 6c 65  names are double
24b40 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64  -zero terminated
24b50 20 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74   if they are not
24b60 0a 20 20 2a 2a 20 55 52 49 73 20 77 69 74 68 20  .  ** URIs with 
24b70 70 61 72 61 6d 65 74 65 72 73 2e 20 20 48 65 6e  parameters.  Hen
24b80 63 65 2c 20 74 68 65 79 20 63 61 6e 20 61 6c 77  ce, they can alw
24b90 61 79 73 20 62 65 20 70 61 73 73 65 64 20 69 6e  ays be passed in
24ba0 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  to.  ** sqlite3_
24bb0 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e  uri_parameter().
24bc0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
24bd0 28 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f  (eType!=SQLITE_O
24be0 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 7c 20  PEN_MAIN_DB) || 
24bf0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
24c00 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 0a 20 20 20  OPEN_URI) ||.   
24c10 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 5b 73 71      zUtf8Name[sq
24c20 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 55  lite3Strlen30(zU
24c30 74 66 38 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29  tf8Name)+1]==0 )
24c40 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  ;..  /* Convert 
24c50 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 74 6f 20  the filename to 
24c60 74 68 65 20 73 79 73 74 65 6d 20 65 6e 63 6f 64  the system encod
24c70 69 6e 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e 76 65  ing. */.  zConve
24c80 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72  rted = winConver
24c90 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d  tFromUtf8Filenam
24ca0 65 28 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20  e(zUtf8Name);.  
24cb0 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d  if( zConverted==
24cc0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
24cd0 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b  _free(zTmpname);
24ce0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f  .    OSTRACE(("O
24cf0 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d  PEN name=%s, rc=
24d00 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
24d10 45 4d 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 29  EM", zUtf8Name))
24d20 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
24d30 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
24d40 0a 20 20 7d 0a 0a 20 20 69 66 28 20 77 69 6e 49  .  }..  if( winI
24d50 73 44 69 72 28 7a 43 6f 6e 76 65 72 74 65 64 29  sDir(zConverted)
24d60 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
24d70 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
24d80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
24d90 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20  ee(zTmpname);.  
24da0 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
24db0 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c   name=%s, rc=SQL
24dc0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44  ITE_CANTOPEN_ISD
24dd0 49 52 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 29  IR", zUtf8Name))
24de0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
24df0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44  ITE_CANTOPEN_ISD
24e00 49 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69  IR;.  }..  if( i
24e10 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20  sReadWrite ){.  
24e20 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
24e30 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44  s = GENERIC_READ
24e40 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45   | GENERIC_WRITE
24e50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
24e60 77 44 65 73 69 72 65 64 41 63 63 65 73 73 20 3d  wDesiredAccess =
24e70 20 47 45 4e 45 52 49 43 5f 52 45 41 44 3b 0a 20   GENERIC_READ;. 
24e80 20 7d 0a 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f   }..  /* SQLITE_
24e90 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 69  OPEN_EXCLUSIVE i
24ea0 73 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73  s used to make s
24eb0 75 72 65 20 74 68 61 74 20 61 20 6e 65 77 20 66  ure that a new f
24ec0 69 6c 65 20 69 73 0a 20 20 2a 2a 20 63 72 65 61  ile is.  ** crea
24ed0 74 65 64 2e 20 53 51 4c 69 74 65 20 64 6f 65 73  ted. SQLite does
24ee0 6e 27 74 20 75 73 65 20 69 74 20 74 6f 20 69 6e  n't use it to in
24ef0 64 69 63 61 74 65 20 22 65 78 63 6c 75 73 69 76  dicate "exclusiv
24f00 65 20 61 63 63 65 73 73 22 0a 20 20 2a 2a 20 61  e access".  ** a
24f10 73 20 69 74 20 69 73 20 75 73 75 61 6c 6c 79 20  s it is usually 
24f20 75 6e 64 65 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f  understood..  */
24f30 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75 73 69  .  if( isExclusi
24f40 76 65 20 29 7b 0a 20 20 20 20 2f 2a 20 43 72 65  ve ){.    /* Cre
24f50 61 74 65 73 20 61 20 6e 65 77 20 66 69 6c 65 2c  ates a new file,
24f60 20 6f 6e 6c 79 20 69 66 20 69 74 20 64 6f 65 73   only if it does
24f70 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
24f80 73 74 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66  st. */.    /* If
24f90 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73   the file exists
24fa0 2c 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20  , it fails. */. 
24fb0 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73     dwCreationDis
24fc0 70 6f 73 69 74 69 6f 6e 20 3d 20 43 52 45 41 54  position = CREAT
24fd0 45 5f 4e 45 57 3b 0a 20 20 7d 65 6c 73 65 20 69  E_NEW;.  }else i
24fe0 66 28 20 69 73 43 72 65 61 74 65 20 29 7b 0a 20  f( isCreate ){. 
24ff0 20 20 20 2f 2a 20 4f 70 65 6e 20 65 78 69 73 74     /* Open exist
25000 69 6e 67 20 66 69 6c 65 2c 20 6f 72 20 63 72 65  ing file, or cre
25010 61 74 65 20 69 66 20 69 74 20 64 6f 65 73 6e 27  ate if it doesn'
25020 74 20 65 78 69 73 74 20 2a 2f 0a 20 20 20 20 64  t exist */.    d
25030 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
25040 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41  tion = OPEN_ALWA
25050 59 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  YS;.  }else{.   
25060 20 2f 2a 20 4f 70 65 6e 73 20 61 20 66 69 6c 65   /* Opens a file
25070 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 65 78 69  , only if it exi
25080 73 74 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72  sts. */.    dwCr
25090 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
250a0 6e 20 3d 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e  n = OPEN_EXISTIN
250b0 47 3b 0a 20 20 7d 0a 0a 20 20 64 77 53 68 61 72  G;.  }..  dwShar
250c0 65 4d 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48 41  eMode = FILE_SHA
250d0 52 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f 53  RE_READ | FILE_S
250e0 48 41 52 45 5f 57 52 49 54 45 3b 0a 0a 20 20 69  HARE_WRITE;..  i
250f0 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23  f( isDelete ){.#
25100 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
25110 43 45 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e  CE.    dwFlagsAn
25120 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49  dAttributes = FI
25130 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44  LE_ATTRIBUTE_HID
25140 44 45 4e 3b 0a 20 20 20 20 69 73 54 65 6d 70 20  DEN;.    isTemp 
25150 3d 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64  = 1;.#else.    d
25160 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
25170 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49  tes = FILE_ATTRI
25180 42 55 54 45 5f 54 45 4d 50 4f 52 41 52 59 0a 20  BUTE_TEMPORARY. 
25190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
251b0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48  FILE_ATTRIBUTE_H
251c0 49 44 44 45 4e 0a 20 20 20 20 20 20 20 20 20 20  IDDEN.          
251d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251e0 20 20 20 20 20 7c 20 46 49 4c 45 5f 46 4c 41 47       | FILE_FLAG
251f0 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45  _DELETE_ON_CLOSE
25200 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
25210 7b 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64  {.    dwFlagsAnd
25220 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c  Attributes = FIL
25230 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d  E_ATTRIBUTE_NORM
25240 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 70  AL;.  }.  /* Rep
25250 6f 72 74 73 20 66 72 6f 6d 20 74 68 65 20 69 6e  orts from the in
25260 74 65 72 6e 65 74 20 61 72 65 20 74 68 61 74 20  ternet are that 
25270 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 73 20 61  performance is a
25280 6c 77 61 79 73 0a 20 20 2a 2a 20 62 65 74 74 65  lways.  ** bette
25290 72 20 69 66 20 46 49 4c 45 5f 46 4c 41 47 5f 52  r if FILE_FLAG_R
252a0 41 4e 44 4f 4d 5f 41 43 43 45 53 53 20 69 73 20  ANDOM_ACCESS is 
252b0 75 73 65 64 2e 20 20 54 69 63 6b 65 74 20 23 32  used.  Ticket #2
252c0 36 39 39 2e 20 2a 2f 0a 23 69 66 20 53 51 4c 49  699. */.#if SQLI
252d0 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 64 77  TE_OS_WINCE.  dw
252e0 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
252f0 65 73 20 7c 3d 20 46 49 4c 45 5f 46 4c 41 47 5f  es |= FILE_FLAG_
25300 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 23  RANDOM_ACCESS;.#
25310 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6f 73 49  endif..  if( osI
25320 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c  sNT() ){.#if SQL
25330 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
25340 20 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54   CREATEFILE2_EXT
25350 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53  ENDED_PARAMETERS
25360 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
25370 65 72 73 3b 0a 20 20 20 20 65 78 74 65 6e 64 65  ers;.    extende
25380 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53 69  dParameters.dwSi
25390 7a 65 20 3d 20 73 69 7a 65 6f 66 28 43 52 45 41  ze = sizeof(CREA
253a0 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44  TEFILE2_EXTENDED
253b0 5f 50 41 52 41 4d 45 54 45 52 53 29 3b 0a 20 20  _PARAMETERS);.  
253c0 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65    extendedParame
253d0 74 65 72 73 2e 64 77 46 69 6c 65 41 74 74 72 69  ters.dwFileAttri
253e0 62 75 74 65 73 20 3d 0a 20 20 20 20 20 20 20 20  butes =.        
253f0 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74      dwFlagsAndAt
25400 74 72 69 62 75 74 65 73 20 26 20 46 49 4c 45 5f  tributes & FILE_
25410 41 54 54 52 49 42 55 54 45 5f 4d 41 53 4b 3b 0a  ATTRIBUTE_MASK;.
25420 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61      extendedPara
25430 6d 65 74 65 72 73 2e 64 77 46 69 6c 65 46 6c 61  meters.dwFileFla
25440 67 73 20 3d 20 64 77 46 6c 61 67 73 41 6e 64 41  gs = dwFlagsAndA
25450 74 74 72 69 62 75 74 65 73 20 26 20 46 49 4c 45  ttributes & FILE
25460 5f 46 4c 41 47 5f 4d 41 53 4b 3b 0a 20 20 20 20  _FLAG_MASK;.    
25470 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65  extendedParamete
25480 72 73 2e 64 77 53 65 63 75 72 69 74 79 51 6f 73  rs.dwSecurityQos
25490 46 6c 61 67 73 20 3d 20 53 45 43 55 52 49 54 59  Flags = SECURITY
254a0 5f 41 4e 4f 4e 59 4d 4f 55 53 3b 0a 20 20 20 20  _ANONYMOUS;.    
254b0 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65  extendedParamete
254c0 72 73 2e 6c 70 53 65 63 75 72 69 74 79 41 74 74  rs.lpSecurityAtt
254d0 72 69 62 75 74 65 73 20 3d 20 4e 55 4c 4c 3b 0a  ributes = NULL;.
254e0 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61      extendedPara
254f0 6d 65 74 65 72 73 2e 68 54 65 6d 70 6c 61 74 65  meters.hTemplate
25500 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  File = NULL;.   
25510 20 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43   while( (h = osC
25520 72 65 61 74 65 46 69 6c 65 32 28 28 4c 50 43 57  reateFile2((LPCW
25530 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a  STR)zConverted,.
25540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
25560 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20  DesiredAccess,. 
25570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25580 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 53               dwS
25590 68 61 72 65 4d 6f 64 65 2c 0a 20 20 20 20 20 20  hareMode,.      
255a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255b0 20 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69          dwCreati
255c0 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20  onDisposition,. 
255d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255e0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 65 78               &ex
255f0 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73  tendedParameters
25600 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ))==INVALID_HAND
25610 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20  LE_VALUE &&.    
25620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25630 20 20 20 20 20 20 20 20 20 20 77 69 6e 52 65 74            winRet
25640 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c  ryIoerr(&cnt, &l
25650 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20  astErrno) ){.   
25660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
25670 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6c  oop */.    }.#el
25680 73 65 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68  se.    while( (h
25690 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 57   = osCreateFileW
256a0 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
256b0 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
256c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256d0 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63      dwDesiredAcc
256e0 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ess,.           
256f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25700 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 20     dwShareMode, 
25710 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
25720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25730 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69      dwCreationDi
25740 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20  sposition,.     
25750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25760 20 20 20 20 20 20 20 20 20 64 77 46 6c 61 67 73           dwFlags
25770 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a 20  AndAttributes,. 
25780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25790 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c               NUL
257a0 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  L))==INVALID_HAN
257b0 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20  DLE_VALUE &&.   
257c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257d0 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 52 65             winRe
257e0 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
257f0 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20  lastErrno) ){.  
25800 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25810 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 23 65  Noop */.    }.#e
25820 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20  ndif.  }.#ifdef 
25830 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
25840 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
25850 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73    while( (h = os
25860 43 72 65 61 74 65 46 69 6c 65 41 28 28 4c 50 43  CreateFileA((LPC
25870 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a  STR)zConverted,.
25880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
258a0 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20  DesiredAccess,. 
258b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258c0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 53               dwS
258d0 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a  hareMode, NULL,.
258e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
25900 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
25910 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ion,.           
25920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25930 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
25940 72 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20  ributes,.       
25950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25960 20 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49         NULL))==I
25970 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
25980 4c 55 45 20 26 26 0a 20 20 20 20 20 20 20 20 20  LUE &&.         
25990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
259a0 20 20 20 20 20 77 69 6e 52 65 74 72 79 49 6f 65       winRetryIoe
259b0 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
259c0 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  rno) ){.        
259d0 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a         /* Noop *
259e0 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  /.    }.  }.#end
259f0 69 66 0a 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72  if.  winLogIoerr
25a00 28 63 6e 74 29 3b 0a 0a 20 20 4f 53 54 52 41 43  (cnt);..  OSTRAC
25a10 45 28 28 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70  E(("OPEN file=%p
25a20 2c 20 6e 61 6d 65 3d 25 73 2c 20 61 63 63 65 73  , name=%s, acces
25a30 73 3d 25 6c 78 2c 20 72 63 3d 25 73 5c 6e 22 2c  s=%lx, rc=%s\n",
25a40 20 68 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 0a 20   h, zUtf8Name,. 
25a50 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69            dwDesi
25a60 72 65 64 41 63 63 65 73 73 2c 20 28 68 3d 3d 49  redAccess, (h==I
25a70 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
25a80 4c 55 45 29 20 3f 20 22 66 61 69 6c 65 64 22 20  LUE) ? "failed" 
25a90 3a 20 22 6f 6b 22 29 29 3b 0a 0a 20 20 69 66 28  : "ok"));..  if(
25aa0 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44   h==INVALID_HAND
25ab0 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20  LE_VALUE ){.    
25ac0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
25ad0 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
25ae0 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
25af0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 70  LITE_CANTOPEN, p
25b00 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
25b10 20 22 77 69 6e 4f 70 65 6e 22 2c 20 7a 55 74 66   "winOpen", zUtf
25b20 38 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  8Name);.    sqli
25b30 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
25b40 74 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ted);.    sqlite
25b50 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29  3_free(zTmpname)
25b60 3b 0a 20 20 20 20 69 66 28 20 69 73 52 65 61 64  ;.    if( isRead
25b70 57 72 69 74 65 20 26 26 20 21 69 73 45 78 63 6c  Write && !isExcl
25b80 75 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 72  usive ){.      r
25b90 65 74 75 72 6e 20 77 69 6e 4f 70 65 6e 28 70 56  eturn winOpen(pV
25ba0 66 73 2c 20 7a 4e 61 6d 65 2c 20 69 64 2c 0a 20  fs, zName, id,. 
25bb0 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 7c          ((flags|
25bc0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
25bd0 4f 4e 4c 59 29 20 26 0a 20 20 20 20 20 20 20 20  ONLY) &.        
25be0 20 20 20 20 20 20 20 20 20 20 20 20 20 7e 28 53               ~(S
25bf0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
25c00 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  E|SQLITE_OPEN_RE
25c10 41 44 57 52 49 54 45 29 29 2c 0a 20 20 20 20 20  ADWRITE)),.     
25c20 20 20 20 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a      pOutFlags);.
25c30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25c40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
25c50 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
25c60 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
25c70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  OutFlags ){.    
25c80 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
25c90 29 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c  ){.      *pOutFl
25ca0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ags = SQLITE_OPE
25cb0 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20  N_READWRITE;.   
25cc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70   }else{.      *p
25cd0 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  OutFlags = SQLIT
25ce0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b  E_OPEN_READONLY;
25cf0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 4f 53  .    }.  }..  OS
25d00 54 52 41 43 45 28 28 22 4f 50 45 4e 20 66 69 6c  TRACE(("OPEN fil
25d10 65 3d 25 70 2c 20 6e 61 6d 65 3d 25 73 2c 20 61  e=%p, name=%s, a
25d20 63 63 65 73 73 3d 25 6c 78 2c 20 70 4f 75 74 46  ccess=%lx, pOutF
25d30 6c 61 67 73 3d 25 70 2c 20 2a 70 4f 75 74 46 6c  lags=%p, *pOutFl
25d40 61 67 73 3d 25 64 2c 20 22 0a 20 20 20 20 20 20  ags=%d, ".      
25d50 20 20 20 20 20 22 72 63 3d 25 73 5c 6e 22 2c 20       "rc=%s\n", 
25d60 68 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 20 64 77  h, zUtf8Name, dw
25d70 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 20 70  DesiredAccess, p
25d80 4f 75 74 46 6c 61 67 73 2c 20 70 4f 75 74 46 6c  OutFlags, pOutFl
25d90 61 67 73 20 3f 0a 20 20 20 20 20 20 20 20 20 20  ags ?.          
25da0 20 2a 70 4f 75 74 46 6c 61 67 73 20 3a 20 30 2c   *pOutFlags : 0,
25db0 20 28 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e   (h==INVALID_HAN
25dc0 44 4c 45 5f 56 41 4c 55 45 29 20 3f 20 22 66 61  DLE_VALUE) ? "fa
25dd0 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a  iled" : "ok"));.
25de0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
25df0 49 4e 43 45 0a 20 20 69 66 28 20 69 73 52 65 61  INCE.  if( isRea
25e00 64 57 72 69 74 65 20 26 26 20 65 54 79 70 65 3d  dWrite && eType=
25e10 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
25e20 4e 5f 44 42 0a 20 20 20 20 20 20 20 26 26 20 28  N_DB.       && (
25e30 72 63 20 3d 20 77 69 6e 63 65 43 72 65 61 74 65  rc = winceCreate
25e40 4c 6f 63 6b 28 7a 4e 61 6d 65 2c 20 70 46 69 6c  Lock(zName, pFil
25e50 65 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20  e))!=SQLITE_OK. 
25e60 20 29 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48   ){.    osCloseH
25e70 61 6e 64 6c 65 28 68 29 3b 0a 20 20 20 20 73 71  andle(h);.    sq
25e80 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
25e90 65 72 74 65 64 29 3b 0a 20 20 20 20 73 71 6c 69  erted);.    sqli
25ea0 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d  te3_free(zTmpnam
25eb0 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  e);.    OSTRACE(
25ec0 28 22 4f 50 45 4e 2d 43 45 2d 4c 4f 43 4b 20 6e  ("OPEN-CE-LOCK n
25ed0 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73 5c 6e 22  ame=%s, rc=%s\n"
25ee0 2c 20 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33  , zName, sqlite3
25ef0 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
25f00 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
25f10 7d 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20 29  }.  if( isTemp )
25f20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 44 65  {.    pFile->zDe
25f30 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43  leteOnClose = zC
25f40 6f 6e 76 65 72 74 65 64 3b 0a 20 20 7d 65 6c 73  onverted;.  }els
25f50 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20  e.#endif.  {.   
25f60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
25f70 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 0a  onverted);.  }..
25f80 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
25f90 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 70 46 69 6c  Tmpname);.  pFil
25fa0 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 77 69  e->pMethod = &wi
25fb0 6e 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 70 46 69  nIoMethod;.  pFi
25fc0 6c 65 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b  le->pVfs = pVfs;
25fd0 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 68 3b  .  pFile->h = h;
25fe0 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c  .  if( isReadonl
25ff0 79 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  y ){.    pFile->
26000 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e  ctrlFlags |= WIN
26010 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 7d  FILE_RDONLY;.  }
26020 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75  .  if( sqlite3_u
26030 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61 6d 65  ri_boolean(zName
26040 2c 20 22 70 73 6f 77 22 2c 20 53 51 4c 49 54 45  , "psow", SQLITE
26050 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
26060 52 49 54 45 29 20 29 7b 0a 20 20 20 20 70 46 69  RITE) ){.    pFi
26070 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  le->ctrlFlags |=
26080 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 3b 0a 20   WINFILE_PSOW;. 
26090 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74   }.  pFile->last
260a0 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52  Errno = NO_ERROR
260b0 3b 0a 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  ;.  pFile->zPath
260c0 20 3d 20 7a 4e 61 6d 65 3b 0a 23 69 66 20 53 51   = zName;.#if SQ
260d0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
260e0 5a 45 3e 30 0a 20 20 70 46 69 6c 65 2d 3e 68 4d  ZE>0.  pFile->hM
260f0 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 70 46 69  ap = NULL;.  pFi
26100 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d  le->pMapRegion =
26110 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61   0;.  pFile->mma
26120 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 46 69  pSize = 0;.  pFi
26130 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  le->mmapSizeActu
26140 61 6c 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d  al = 0;.  pFile-
26150 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 73  >mmapSizeMax = s
26160 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
26170 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65 6e 64 69  ig.szMmap;.#endi
26180 66 0a 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  f..  OpenCounter
26190 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  (+1);.  return r
261a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  c;.}../*.** Dele
261b0 74 65 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c  te the named fil
261c0 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  e..**.** Note th
261d0 61 74 20 57 69 6e 64 6f 77 73 20 64 6f 65 73 20  at Windows does 
261e0 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 66 69 6c 65  not allow a file
261f0 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69   to be deleted i
26200 66 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  f some other.** 
26210 70 72 6f 63 65 73 73 20 68 61 73 20 69 74 20 6f  process has it o
26220 70 65 6e 2e 20 20 53 6f 6d 65 74 69 6d 65 73 20  pen.  Sometimes 
26230 61 20 76 69 72 75 73 20 73 63 61 6e 6e 65 72 20  a virus scanner 
26240 6f 72 20 69 6e 64 65 78 69 6e 67 20 70 72 6f 67  or indexing prog
26250 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70 65 6e  ram.** will open
26260 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
26270 73 68 6f 72 74 6c 79 20 61 66 74 65 72 20 69 74  shortly after it
26280 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 6f   is created in o
26290 72 64 65 72 20 74 6f 20 64 6f 0a 2a 2a 20 77 68  rder to do.** wh
262a0 61 74 65 76 65 72 20 69 74 20 64 6f 65 73 2e 20  atever it does. 
262b0 20 57 68 69 6c 65 20 74 68 69 73 20 6f 74 68 65   While this othe
262c0 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  r process is hol
262d0 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65  ding the.** file
262e0 20 6f 70 65 6e 2c 20 77 65 20 77 69 6c 6c 20 62   open, we will b
262f0 65 20 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65  e unable to dele
26300 74 65 20 69 74 2e 20 20 54 6f 20 77 6f 72 6b 20  te it.  To work 
26310 61 72 6f 75 6e 64 20 74 68 69 73 0a 2a 2a 20 70  around this.** p
26320 72 6f 62 6c 65 6d 2c 20 77 65 20 64 65 6c 61 79  roblem, we delay
26330 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64   100 millisecond
26340 73 20 61 6e 64 20 74 72 79 20 74 6f 20 64 65 6c  s and try to del
26350 65 74 65 20 61 67 61 69 6e 2e 20 20 55 70 0a 2a  ete again.  Up.*
26360 2a 20 74 6f 20 4d 58 5f 44 45 4c 45 54 49 4f 4e  * to MX_DELETION
26370 5f 41 54 54 45 4d 50 54 73 20 64 65 6c 65 74 69  _ATTEMPTs deleti
26380 6f 6e 20 61 74 74 65 6d 70 74 73 20 61 72 65 20  on attempts are 
26390 72 75 6e 20 62 65 66 6f 72 65 20 67 69 76 69 6e  run before givin
263a0 67 0a 2a 2a 20 75 70 20 61 6e 64 20 72 65 74 75  g.** up and retu
263b0 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a  rning an error..
263c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
263d0 6e 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74  nDelete(.  sqlit
263e0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
263f0 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73         /* Not us
26400 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20  ed on win32 */. 
26410 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
26420 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20  lename,      /* 
26430 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Name of file to 
26440 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20  delete */.  int 
26450 73 79 6e 63 44 69 72 20 20 20 20 20 20 20 20 20  syncDir         
26460 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75          /* Not u
26470 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a  sed on win32 */.
26480 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  ){.  int cnt = 0
26490 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 57  ;.  int rc;.  DW
264a0 4f 52 44 20 61 74 74 72 3b 0a 20 20 44 57 4f 52  ORD attr;.  DWOR
264b0 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b  D lastErrno = 0;
264c0 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
264d0 74 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ted;.  UNUSED_PA
264e0 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
264f0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
26500 52 28 73 79 6e 63 44 69 72 29 3b 0a 0a 20 20 53  R(syncDir);..  S
26510 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
26520 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
26530 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 4f 53  RR_DELETE);.  OS
26540 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 20 6e  TRACE(("DELETE n
26550 61 6d 65 3d 25 73 2c 20 73 79 6e 63 44 69 72 3d  ame=%s, syncDir=
26560 25 64 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  %d\n", zFilename
26570 2c 20 73 79 6e 63 44 69 72 29 29 3b 0a 0a 20 20  , syncDir));..  
26580 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
26590 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46  ConvertFromUtf8F
265a0 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d  ilename(zFilenam
265b0 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  e);.  if( zConve
265c0 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f  rted==0 ){.    O
265d0 53 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 20  STRACE(("DELETE 
265e0 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49  name=%s, rc=SQLI
265f0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e  TE_IOERR_NOMEM\n
26600 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a  ", zFilename));.
26610 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26620 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
26630 20 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28   }.  if( osIsNT(
26640 29 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 23 69  ) ){.    do {.#i
26650 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
26660 54 0a 20 20 20 20 20 20 57 49 4e 33 32 5f 46 49  T.      WIN32_FI
26670 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54  LE_ATTRIBUTE_DAT
26680 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20  A sAttrData;.   
26690 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72     memset(&sAttr
266a0 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Data, 0, sizeof(
266b0 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20  sAttrData));.   
266c0 20 20 20 69 66 20 28 20 6f 73 47 65 74 46 69 6c     if ( osGetFil
266d0 65 41 74 74 72 69 62 75 74 65 73 45 78 57 28 7a  eAttributesExW(z
266e0 43 6f 6e 76 65 72 74 65 64 2c 20 47 65 74 46 69  Converted, GetFi
266f0 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64  leExInfoStandard
26700 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
26710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26720 20 20 20 20 26 73 41 74 74 72 44 61 74 61 29 20      &sAttrData) 
26730 29 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20  ){.        attr 
26740 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77 46 69  = sAttrData.dwFi
26750 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a 20 20  leAttributes;.  
26760 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26770 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
26780 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
26790 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 61 73  .        if( las
267a0 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49  tErrno==ERROR_FI
267b0 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20  LE_NOT_FOUND.   
267c0 20 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72        || lastErr
267d0 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e  no==ERROR_PATH_N
267e0 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20  OT_FOUND ){.    
267f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
26800 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
26810 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79  OENT; /* Already
26820 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20   gone? */.      
26830 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26840 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
26850 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
26860 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
26870 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20       }.#else.   
26880 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46     attr = osGetF
26890 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 7a  ileAttributesW(z
268a0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64  Converted);.#end
268b0 69 66 0a 20 20 20 20 20 20 69 66 20 28 20 61 74  if.      if ( at
268c0 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45  tr==INVALID_FILE
268d0 5f 41 54 54 52 49 42 55 54 45 53 20 29 7b 0a 20  _ATTRIBUTES ){. 
268e0 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f         lastErrno
268f0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
26900 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  r();.        if(
26910 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f   lastErrno==ERRO
26920 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44  R_FILE_NOT_FOUND
26930 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61 73  .         || las
26940 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41  tErrno==ERROR_PA
26950 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a  TH_NOT_FOUND ){.
26960 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
26970 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
26980 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72  TE_NOENT; /* Alr
26990 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20  eady gone? */.  
269a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
269b0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
269c0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
269d0 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
269e0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
269f0 20 69 66 20 28 20 61 74 74 72 26 46 49 4c 45 5f   if ( attr&FILE_
26a00 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54  ATTRIBUTE_DIRECT
26a10 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ORY ){.        r
26a20 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
26a30 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 2e  ; /* Files only.
26a40 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
26a50 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
26a60 20 69 66 20 28 20 6f 73 44 65 6c 65 74 65 46 69   if ( osDeleteFi
26a70 6c 65 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 20  leW(zConverted) 
26a80 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
26a90 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65  SQLITE_OK; /* De
26aa0 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20  leted OK. */.   
26ab0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26ac0 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 21    }.      if ( !
26ad0 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63  winRetryIoerr(&c
26ae0 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  nt, &lastErrno) 
26af0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
26b00 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a  SQLITE_ERROR; /*
26b10 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69 65 73   No more retries
26b20 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  . */.        bre
26b30 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
26b40 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a  } while(1);.  }.
26b50 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
26b60 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
26b70 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  lse{.    do {.  
26b80 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74      attr = osGet
26b90 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28  FileAttributesA(
26ba0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
26bb0 20 20 20 69 66 20 28 20 61 74 74 72 3d 3d 49 4e     if ( attr==IN
26bc0 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
26bd0 42 55 54 45 53 20 29 7b 0a 20 20 20 20 20 20 20  BUTES ){.       
26be0 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
26bf0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
26c00 20 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45         if( lastE
26c10 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45  rrno==ERROR_FILE
26c20 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20  _NOT_FOUND.     
26c30 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f      || lastErrno
26c40 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54  ==ERROR_PATH_NOT
26c50 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20  _FOUND ){.      
26c60 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
26c70 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45  IOERR_DELETE_NOE
26c80 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67  NT; /* Already g
26c90 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20  one? */.        
26ca0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
26cb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
26cc0 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
26cd0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26ce0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20     }.      if ( 
26cf0 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42  attr&FILE_ATTRIB
26d00 55 54 45 5f 44 49 52 45 43 54 4f 52 59 20 29 7b  UTE_DIRECTORY ){
26d10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
26d20 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 46  LITE_ERROR; /* F
26d30 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20  iles only. */.  
26d40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26d50 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20     }.      if ( 
26d60 6f 73 44 65 6c 65 74 65 46 69 6c 65 41 28 7a 43  osDeleteFileA(zC
26d70 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20  onverted) ){.   
26d80 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
26d90 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64 20  _OK; /* Deleted 
26da0 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  OK. */.        b
26db0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
26dc0 20 20 20 20 69 66 20 28 20 21 77 69 6e 52 65 74      if ( !winRet
26dd0 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c  ryIoerr(&cnt, &l
26de0 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20  astErrno) ){.   
26df0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
26e00 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f  _ERROR; /* No mo
26e10 72 65 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20  re retries. */. 
26e20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
26e30 20 20 20 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c      }.    } whil
26e40 65 28 31 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  e(1);.  }.#endif
26e50 0a 20 20 69 66 28 20 72 63 20 26 26 20 72 63 21  .  if( rc && rc!
26e60 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45  =SQLITE_IOERR_DE
26e70 4c 45 54 45 5f 4e 4f 45 4e 54 20 29 7b 0a 20 20  LETE_NOENT ){.  
26e80 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
26e90 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
26ea0 44 45 4c 45 54 45 2c 20 6c 61 73 74 45 72 72 6e  DELETE, lastErrn
26eb0 6f 2c 20 22 77 69 6e 44 65 6c 65 74 65 22 2c 20  o, "winDelete", 
26ec0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 65  zFilename);.  }e
26ed0 6c 73 65 7b 0a 20 20 20 20 77 69 6e 4c 6f 67 49  lse{.    winLogI
26ee0 6f 65 72 72 28 63 6e 74 29 3b 0a 20 20 7d 0a 20  oerr(cnt);.  }. 
26ef0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
26f00 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 4f 53 54  onverted);.  OST
26f10 52 41 43 45 28 28 22 44 45 4c 45 54 45 20 6e 61  RACE(("DELETE na
26f20 6d 65 3d 25 73 2c 20 72 63 3d 25 73 5c 6e 22 2c  me=%s, rc=%s\n",
26f30 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c 69   zFilename, sqli
26f40 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
26f50 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
26f60 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  ../*.** Check th
26f70 65 20 65 78 69 73 74 65 6e 63 65 20 61 6e 64 20  e existence and 
26f80 73 74 61 74 75 73 20 6f 66 20 61 20 66 69 6c 65  status of a file
26f90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26fa0 77 69 6e 41 63 63 65 73 73 28 0a 20 20 73 71 6c  winAccess(.  sql
26fb0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
26fc0 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75          /* Not u
26fd0 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a  sed on win32 */.
26fe0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
26ff0 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20  ilename,     /* 
27000 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Name of file to 
27010 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 66  check */.  int f
27020 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
27030 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
27040 20 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 6f 6e   test to make on
27050 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
27060 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20  int *pResOut    
27070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
27080 54 3a 20 52 65 73 75 6c 74 20 2a 2f 0a 29 7b 0a  T: Result */.){.
27090 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20    DWORD attr;.  
270a0 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 44 57  int rc = 0;.  DW
270b0 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20  ORD lastErrno = 
270c0 30 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  0;.  void *zConv
270d0 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f  erted;.  UNUSED_
270e0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
270f0 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
27100 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
27110 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b  TE_IOERR_ACCESS;
27120 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
27130 41 43 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20  ACCESS name=%s, 
27140 66 6c 61 67 73 3d 25 78 2c 20 70 52 65 73 4f 75  flags=%x, pResOu
27150 74 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20  t=%p\n",.       
27160 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 66      zFilename, f
27170 6c 61 67 73 2c 20 70 52 65 73 4f 75 74 29 29 3b  lags, pResOut));
27180 0a 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d  ..  zConverted =
27190 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55   winConvertFromU
271a0 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c  tf8Filename(zFil
271b0 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43  ename);.  if( zC
271c0 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20  onverted==0 ){. 
271d0 20 20 20 4f 53 54 52 41 43 45 28 28 22 41 43 43     OSTRACE(("ACC
271e0 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d  ESS name=%s, rc=
271f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
27200 45 4d 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  EM\n", zFilename
27210 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
27220 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
27230 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49  M;.  }.  if( osI
27240 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 69 6e 74  sNT() ){.    int
27250 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57 49   cnt = 0;.    WI
27260 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  N32_FILE_ATTRIBU
27270 54 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74  TE_DATA sAttrDat
27280 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  a;.    memset(&s
27290 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a  AttrData, 0, siz
272a0 65 6f 66 28 73 41 74 74 72 44 61 74 61 29 29 3b  eof(sAttrData));
272b0 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28 72 63  .    while( !(rc
272c0 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   = osGetFileAttr
272d0 69 62 75 74 65 73 45 78 57 28 28 4c 50 43 57 53  ibutesExW((LPCWS
272e0 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  TR)zConverted,. 
272f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27300 20 20 20 20 20 20 20 20 20 20 20 20 47 65 74 46              GetF
27310 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72  ileExInfoStandar
27320 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
27330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27340 26 73 41 74 74 72 44 61 74 61 29 29 20 26 26 20  &sAttrData)) && 
27350 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63  winRetryIoerr(&c
27360 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  nt, &lastErrno) 
27370 29 7b 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29  ){}.    if( rc )
27380 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61  {.      /* For a
27390 6e 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  n SQLITE_ACCESS_
273a0 45 58 49 53 54 53 20 71 75 65 72 79 2c 20 74 72  EXISTS query, tr
273b0 65 61 74 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74  eat a zero-lengt
273c0 68 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  h file.      ** 
273d0 61 73 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  as if it does no
273e0 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a  t exist..      *
273f0 2f 0a 20 20 20 20 20 20 69 66 28 20 20 20 20 66  /.      if(    f
27400 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43  lags==SQLITE_ACC
27410 45 53 53 5f 45 58 49 53 54 53 0a 20 20 20 20 20  ESS_EXISTS.     
27420 20 20 20 20 20 26 26 20 73 41 74 74 72 44 61 74       && sAttrDat
27430 61 2e 6e 46 69 6c 65 53 69 7a 65 48 69 67 68 3d  a.nFileSizeHigh=
27440 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  =0.          && 
27450 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c 65 53  sAttrData.nFileS
27460 69 7a 65 4c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20  izeLow==0 ){.   
27470 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41       attr = INVA
27480 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
27490 54 45 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  TES;.      }else
274a0 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d  {.        attr =
274b0 20 73 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c   sAttrData.dwFil
274c0 65 41 74 74 72 69 62 75 74 65 73 3b 0a 20 20 20  eAttributes;.   
274d0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
274e0 20 20 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72        winLogIoer
274f0 72 28 63 6e 74 29 3b 0a 20 20 20 20 20 20 69 66  r(cnt);.      if
27500 28 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52  ( lastErrno!=ERR
27510 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e  OR_FILE_NOT_FOUN
27520 44 20 26 26 20 6c 61 73 74 45 72 72 6e 6f 21 3d  D && lastErrno!=
27530 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46  ERROR_PATH_NOT_F
27540 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20  OUND ){.        
27550 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
27560 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
27570 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
27580 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
27590 52 5f 41 43 43 45 53 53 2c 20 6c 61 73 74 45 72  R_ACCESS, lastEr
275a0 72 6e 6f 2c 20 22 77 69 6e 41 63 63 65 73 73 22  rno, "winAccess"
275b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
275c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 46 69               zFi
275d0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  lename);.      }
275e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74  else{.        at
275f0 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c  tr = INVALID_FIL
27600 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20  E_ATTRIBUTES;.  
27610 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
27620 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
27630 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
27640 6c 73 65 7b 0a 20 20 20 20 61 74 74 72 20 3d 20  lse{.    attr = 
27650 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
27660 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  tesA((char*)zCon
27670 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e  verted);.  }.#en
27680 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  dif.  sqlite3_fr
27690 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
276a0 20 20 73 77 69 74 63 68 28 20 66 6c 61 67 73 20    switch( flags 
276b0 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
276c0 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a  TE_ACCESS_READ:.
276d0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
276e0 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20  ACCESS_EXISTS:. 
276f0 20 20 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d       rc = attr!=
27700 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
27710 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 62  RIBUTES;.      b
27720 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
27730 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
27740 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20 72 63  DWRITE:.      rc
27750 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44   = attr!=INVALID
27760 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
27770 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
27780 20 28 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54   (attr & FILE_AT
27790 54 52 49 42 55 54 45 5f 52 45 41 44 4f 4e 4c 59  TRIBUTE_READONLY
277a0 29 3d 3d 30 3b 0a 20 20 20 20 20 20 62 72 65 61  )==0;.      brea
277b0 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
277c0 20 20 20 20 20 20 61 73 73 65 72 74 28 21 22 49        assert(!"I
277d0 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67  nvalid flags arg
277e0 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a  ument");.  }.  *
277f0 70 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20  pResOut = rc;.  
27800 4f 53 54 52 41 43 45 28 28 22 41 43 43 45 53 53  OSTRACE(("ACCESS
27810 20 6e 61 6d 65 3d 25 73 2c 20 70 52 65 73 4f 75   name=%s, pResOu
27820 74 3d 25 70 2c 20 2a 70 52 65 73 4f 75 74 3d 25  t=%p, *pResOut=%
27830 64 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  d, rc=SQLITE_OK\
27840 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a  n",.           z
27850 46 69 6c 65 6e 61 6d 65 2c 20 70 52 65 73 4f 75  Filename, pResOu
27860 74 2c 20 2a 70 52 65 73 4f 75 74 29 29 3b 0a 20  t, *pResOut));. 
27870 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27880 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
27890 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  rns non-zero if 
278a0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
278b0 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77  th name starts w
278c0 69 74 68 20 61 20 64 72 69 76 65 20 6c 65 74 74  ith a drive lett
278d0 65 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62  er.** followed b
278e0 79 20 61 20 63 6f 6c 6f 6e 20 63 68 61 72 61 63  y a colon charac
278f0 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  ter..*/.static B
27900 4f 4f 4c 20 77 69 6e 49 73 44 72 69 76 65 4c 65  OOL winIsDriveLe
27910 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 0a 20 20  tterAndColon(.  
27920 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
27930 68 6e 61 6d 65 0a 29 7b 0a 20 20 72 65 74 75 72  hname.){.  retur
27940 6e 20 28 20 73 71 6c 69 74 65 33 49 73 61 6c 70  n ( sqlite3Isalp
27950 68 61 28 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 29  ha(zPathname[0])
27960 20 26 26 20 7a 50 61 74 68 6e 61 6d 65 5b 31 5d   && zPathname[1]
27970 3d 3d 27 3a 27 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ==':' );.}../*.*
27980 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  * Returns non-ze
27990 72 6f 20 69 66 20 74 68 65 20 73 70 65 63 69 66  ro if the specif
279a0 69 65 64 20 70 61 74 68 20 6e 61 6d 65 20 73 68  ied path name sh
279b0 6f 75 6c 64 20 62 65 20 75 73 65 64 20 76 65 72  ould be used ver
279c0 62 61 74 69 6d 2e 20 20 49 66 0a 2a 2a 20 6e 6f  batim.  If.** no
279d0 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  n-zero is return
279e0 65 64 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  ed from this fun
279f0 63 74 69 6f 6e 2c 20 74 68 65 20 63 61 6c 6c 69  ction, the calli
27a00 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  ng function must
27a10 20 73 69 6d 70 6c 79 0a 2a 2a 20 75 73 65 20 74   simply.** use t
27a20 68 65 20 70 72 6f 76 69 64 65 64 20 70 61 74 68  he provided path
27a30 20 6e 61 6d 65 20 76 65 72 62 61 74 69 6d 20 2d   name verbatim -
27a40 4f 52 2d 20 72 65 73 6f 6c 76 65 20 69 74 20 69  OR- resolve it i
27a50 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 20  nto a full path 
27a60 6e 61 6d 65 0a 2a 2a 20 75 73 69 6e 67 20 74 68  name.** using th
27a70 65 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  e GetFullPathNam
27a80 65 20 57 69 6e 33 32 20 41 50 49 20 66 75 6e 63  e Win32 API func
27a90 74 69 6f 6e 20 28 69 66 20 61 76 61 69 6c 61 62  tion (if availab
27aa0 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  le)..*/.static B
27ab0 4f 4f 4c 20 77 69 6e 49 73 56 65 72 62 61 74 69  OOL winIsVerbati
27ac0 6d 50 61 74 68 6e 61 6d 65 28 0a 20 20 63 6f 6e  mPathname(.  con
27ad0 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61  st char *zPathna
27ae0 6d 65 0a 29 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20  me.){.  /*.  ** 
27af0 49 66 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65  If the path name
27b00 20 73 74 61 72 74 73 20 77 69 74 68 20 61 20 66   starts with a f
27b10 6f 72 77 61 72 64 20 73 6c 61 73 68 20 6f 72 20  orward slash or 
27b20 61 20 62 61 63 6b 73 6c 61 73 68 2c 20 69 74 20  a backslash, it 
27b30 69 73 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 61  is either.  ** a
27b40 20 6c 65 67 61 6c 20 55 4e 43 20 6e 61 6d 65 2c   legal UNC name,
27b50 20 61 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69   a volume relati
27b60 76 65 20 70 61 74 68 2c 20 6f 72 20 61 6e 20 61  ve path, or an a
27b70 62 73 6f 6c 75 74 65 20 70 61 74 68 20 6e 61 6d  bsolute path nam
27b80 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 55  e in the.  ** "U
27b90 6e 69 78 22 20 66 6f 72 6d 61 74 20 6f 6e 20 57  nix" format on W
27ba0 69 6e 64 6f 77 73 2e 20 20 54 68 65 72 65 20 69  indows.  There i
27bb0 73 20 6e 6f 20 65 61 73 79 20 77 61 79 20 74 6f  s no easy way to
27bc0 20 64 69 66 66 65 72 65 6e 74 69 61 74 65 20 62   differentiate b
27bd0 65 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20  etween.  ** the 
27be0 66 69 6e 61 6c 20 74 77 6f 20 63 61 73 65 73 3b  final two cases;
27bf0 20 74 68 65 72 65 66 6f 72 65 2c 20 77 65 20 72   therefore, we r
27c00 65 74 75 72 6e 20 74 68 65 20 73 61 66 65 72 20  eturn the safer 
27c10 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
27c20 54 52 55 45 0a 20 20 2a 2a 20 73 6f 20 74 68 61  TRUE.  ** so tha
27c30 74 20 63 61 6c 6c 65 72 73 20 6f 66 20 74 68 69  t callers of thi
27c40 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  s function will 
27c50 73 69 6d 70 6c 79 20 75 73 65 20 69 74 20 76 65  simply use it ve
27c60 72 62 61 74 69 6d 2e 0a 20 20 2a 2f 0a 20 20 69  rbatim..  */.  i
27c70 66 20 28 20 77 69 6e 49 73 44 69 72 53 65 70 28  f ( winIsDirSep(
27c80 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 29 20 29 7b  zPathname[0]) ){
27c90 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52 55 45  .    return TRUE
27ca0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
27cb0 20 49 66 20 74 68 65 20 70 61 74 68 20 6e 61 6d   If the path nam
27cc0 65 20 73 74 61 72 74 73 20 77 69 74 68 20 61 20  e starts with a 
27cd0 6c 65 74 74 65 72 20 61 6e 64 20 61 20 63 6f 6c  letter and a col
27ce0 6f 6e 20 69 74 20 69 73 20 65 69 74 68 65 72 20  on it is either 
27cf0 61 20 76 6f 6c 75 6d 65 0a 20 20 2a 2a 20 72 65  a volume.  ** re
27d00 6c 61 74 69 76 65 20 70 61 74 68 20 6f 72 20 61  lative path or a
27d10 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 2e  n absolute path.
27d20 20 20 43 61 6c 6c 65 72 73 20 6f 66 20 74 68 69    Callers of thi
27d30 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  s function must 
27d40 6e 6f 74 0a 20 20 2a 2a 20 61 74 74 65 6d 70 74  not.  ** attempt
27d50 20 74 6f 20 74 72 65 61 74 20 69 74 20 61 73 20   to treat it as 
27d60 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  a relative path 
27d70 6e 61 6d 65 20 28 69 2e 65 2e 20 74 68 65 79 20  name (i.e. they 
27d80 73 68 6f 75 6c 64 20 73 69 6d 70 6c 79 20 75 73  should simply us
27d90 65 0a 20 20 2a 2a 20 69 74 20 76 65 72 62 61 74  e.  ** it verbat
27da0 69 6d 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28  im)..  */.  if (
27db0 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65   winIsDriveLette
27dc0 72 41 6e 64 43 6f 6c 6f 6e 28 7a 50 61 74 68 6e  rAndColon(zPathn
27dd0 61 6d 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ame) ){.    retu
27de0 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20  rn TRUE;.  }..  
27df0 2f 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 67 65  /*.  ** If we ge
27e00 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  t to this point,
27e10 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73   the path name s
27e20 68 6f 75 6c 64 20 61 6c 6d 6f 73 74 20 63 65 72  hould almost cer
27e30 74 61 69 6e 6c 79 20 62 65 20 61 20 70 75 72 65  tainly be a pure
27e40 6c 79 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76 65  ly.  ** relative
27e50 20 6f 6e 65 20 28 69 2e 65 2e 20 6e 6f 74 20 61   one (i.e. not a
27e60 20 55 4e 43 20 6e 61 6d 65 2c 20 6e 6f 74 20 61   UNC name, not a
27e70 62 73 6f 6c 75 74 65 2c 20 61 6e 64 20 6e 6f 74  bsolute, and not
27e80 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76 65   volume relative
27e90 29 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  )..  */.  return
27ea0 20 46 41 4c 53 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   FALSE;.}../*.**
27eb0 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65   Turn a relative
27ec0 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61   pathname into a
27ed0 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20   full pathname. 
27ee0 20 57 72 69 74 65 20 74 68 65 20 66 75 6c 6c 0a   Write the full.
27ef0 2a 2a 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f  ** pathname into
27f00 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d   zOut[].  zOut[]
27f10 20 77 69 6c 6c 20 62 65 20 61 74 20 6c 65 61 73   will be at leas
27f20 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  t pVfs->mxPathna
27f30 6d 65 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  me.** bytes in s
27f40 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
27f50 6e 74 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61  nt winFullPathna
27f60 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  me(.  sqlite3_vf
27f70 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
27f80 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
27f90 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a  o vfs object */.
27fa0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52    const char *zR
27fb0 65 6c 61 74 69 76 65 2c 20 20 20 20 20 20 20 20  elative,        
27fc0 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61  /* Possibly rela
27fd0 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20  tive input path 
27fe0 2a 2f 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 2c 20  */.  int nFull, 
27ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28000 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75     /* Size of ou
28010 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62  tput buffer in b
28020 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ytes */.  char *
28030 7a 46 75 6c 6c 20 20 20 20 20 20 20 20 20 20 20  zFull           
28040 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
28050 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a  t buffer */.){..
28060 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59  #if defined(__CY
28070 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61  GWIN__).  Simula
28080 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
28090 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  n SQLITE_ERROR )
280a0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
280b0 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 61  ETER(nFull);.  a
280c0 73 73 65 72 74 28 20 6e 46 75 6c 6c 3e 3d 70 56  ssert( nFull>=pV
280d0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29  fs->mxPathname )
280e0 3b 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65 33  ;.  if ( sqlite3
280f0 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20  _data_directory 
28100 26 26 20 21 77 69 6e 49 73 56 65 72 62 61 74 69  && !winIsVerbati
28110 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74  mPathname(zRelat
28120 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  ive) ){.    /*. 
28130 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61     ** NOTE: We a
28140 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
28150 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  a relative path 
28160 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74  name and the dat
28170 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64  a.    **       d
28180 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
28190 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72  n set.  Therefor
281a0 65 2c 20 75 73 65 20 69 74 20 61 73 20 74 68 65  e, use it as the
281b0 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20   basis.    **   
281c0 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69      for converti
281d0 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76 65 20  ng the relative 
281e0 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20  path name to an 
281f0 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20  absolute.    ** 
28200 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65        one by pre
28210 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61  pending the data
28220 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61   directory and a
28230 20 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20   slash..    */. 
28240 20 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20     char *zOut = 
28250 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
28260 6f 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  o( pVfs->mxPathn
28270 61 6d 65 2b 31 20 29 3b 0a 20 20 20 20 69 66 28  ame+1 );.    if(
28280 20 21 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20 20   !zOut ){.      
28290 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
282a0 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ERR_NOMEM;.    }
282b0 0a 20 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f  .    if( cygwin_
282c0 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20 20 20  conv_path(.     
282d0 20 20 20 20 20 20 20 28 6f 73 49 73 4e 54 28 29         (osIsNT()
282e0 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f   ? CCP_POSIX_TO_
282f0 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49  WIN_W : CCP_POSI
28300 58 5f 54 4f 5f 57 49 4e 5f 41 29 20 7c 0a 20 20  X_TO_WIN_A) |.  
28310 20 20 20 20 20 20 20 20 20 20 43 43 50 5f 52 45            CCP_RE
28320 4c 41 54 49 56 45 2c 20 7a 52 65 6c 61 74 69 76  LATIVE, zRelativ
28330 65 2c 20 7a 4f 75 74 2c 20 70 56 66 73 2d 3e 6d  e, zOut, pVfs->m
28340 78 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30 20 29  xPathname+1)<0 )
28350 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
28360 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20  free(zOut);.    
28370 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
28380 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
28390 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c 20 28  OPEN_CONVPATH, (
283a0 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20  DWORD)errno,.   
283b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283c0 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61        "winFullPa
283d0 74 68 6e 61 6d 65 31 22 2c 20 7a 52 65 6c 61 74  thname1", zRelat
283e0 69 76 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ive);.    }else{
283f0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74  .      char *zUt
28400 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54  f8 = winConvertT
28410 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 4f  oUtf8Filename(zO
28420 75 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ut);.      if( !
28430 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 20  zUtf8 ){.       
28440 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
28450 75 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ut);.        ret
28460 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
28470 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
28480 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
28490 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c  printf(MIN(nFull
284a0 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
284b0 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25  me), zFull, "%s%
284c0 63 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c%s",.          
284d0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
284e0 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
284f0 6f 72 79 2c 20 77 69 6e 47 65 74 44 69 72 53 65  ory, winGetDirSe
28500 70 28 29 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20  p(), zUtf8);.   
28510 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
28520 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71  zUtf8);.      sq
28530 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
28540 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
28550 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 75 74 20  .    char *zOut 
28560 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
28570 65 72 6f 28 20 70 56 66 73 2d 3e 6d 78 50 61 74  ero( pVfs->mxPat
28580 68 6e 61 6d 65 2b 31 20 29 3b 0a 20 20 20 20 69  hname+1 );.    i
28590 66 28 20 21 7a 4f 75 74 20 29 7b 0a 20 20 20 20  f( !zOut ){.    
285a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
285b0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
285c0 20 7d 0a 20 20 20 20 69 66 28 20 63 79 67 77 69   }.    if( cygwi
285d0 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20  n_conv_path(.   
285e0 20 20 20 20 20 20 20 20 20 28 6f 73 49 73 4e 54           (osIsNT
285f0 28 29 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54  () ? CCP_POSIX_T
28600 4f 5f 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f  O_WIN_W : CCP_PO
28610 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 29 2c 0a 20  SIX_TO_WIN_A),. 
28620 20 20 20 20 20 20 20 20 20 20 20 7a 52 65 6c 61             zRela
28630 74 69 76 65 2c 20 7a 4f 75 74 2c 20 70 56 66 73  tive, zOut, pVfs
28640 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3c  ->mxPathname+1)<
28650 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
28660 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20  e3_free(zOut);. 
28670 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
28680 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
28690 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48  ANTOPEN_CONVPATH
286a0 2c 20 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a  , (DWORD)errno,.
286b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286c0 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c           "winFul
286d0 6c 50 61 74 68 6e 61 6d 65 32 22 2c 20 7a 52 65  lPathname2", zRe
286e0 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 65 6c  lative);.    }el
286f0 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
28700 7a 55 74 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65  zUtf8 = winConve
28710 72 74 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65  rtToUtf8Filename
28720 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 66  (zOut);.      if
28730 28 20 21 7a 55 74 66 38 20 29 7b 0a 20 20 20 20  ( !zUtf8 ){.    
28740 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
28750 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  (zOut);.        
28760 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
28770 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ERR_NOMEM;.     
28780 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
28790 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46  _snprintf(MIN(nF
287a0 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74  ull, pVfs->mxPat
287b0 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22  hname), zFull, "
287c0 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20  %s", zUtf8);.   
287d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
287e0 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71  zUtf8);.      sq
287f0 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
28800 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
28810 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
28820 23 65 6e 64 69 66 0a 0a 23 69 66 20 28 53 51 4c  #endif..#if (SQL
28830 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20  ITE_OS_WINCE || 
28840 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 29  SQLITE_OS_WINRT)
28850 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43   && !defined(__C
28860 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c  YGWIN__).  Simul
28870 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
28880 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
28890 29 3b 0a 20 20 2f 2a 20 57 69 6e 43 45 20 68 61  );.  /* WinCE ha
288a0 73 20 6e 6f 20 63 6f 6e 63 65 70 74 20 6f 66 20  s no concept of 
288b0 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e  a relative pathn
288c0 61 6d 65 2c 20 6f 72 20 73 6f 20 49 20 61 6d 20  ame, or so I am 
288d0 74 6f 6c 64 2e 20 2a 2f 0a 20 20 2f 2a 20 57 69  told. */.  /* Wi
288e0 6e 52 54 20 68 61 73 20 6e 6f 20 77 61 79 20 74  nRT has no way t
288f0 6f 20 63 6f 6e 76 65 72 74 20 61 20 72 65 6c 61  o convert a rela
28900 74 69 76 65 20 70 61 74 68 20 74 6f 20 61 6e 20  tive path to an 
28910 61 62 73 6f 6c 75 74 65 20 6f 6e 65 2e 20 2a 2f  absolute one. */
28920 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f  .  if ( sqlite3_
28930 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26  data_directory &
28940 26 20 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d  & !winIsVerbatim
28950 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69  Pathname(zRelati
28960 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  ve) ){.    /*.  
28970 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72    ** NOTE: We ar
28980 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
28990 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
289a0 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ame and the data
289b0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69  .    **       di
289c0 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
289d0 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65   set.  Therefore
289e0 2c 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  , use it as the 
289f0 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20  basis.    **    
28a00 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e     for convertin
28a10 67 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70  g the relative p
28a20 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61  ath name to an a
28a30 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20  bsolute.    **  
28a40 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70       one by prep
28a50 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  ending the data 
28a60 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20  directory and a 
28a70 62 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a  backslash..    *
28a80 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  /.    sqlite3_sn
28a90 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c  printf(MIN(nFull
28aa0 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
28ab0 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25  me), zFull, "%s%
28ac0 63 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c%s",.          
28ad0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
28ae0 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
28af0 79 2c 20 77 69 6e 47 65 74 44 69 72 53 65 70 28  y, winGetDirSep(
28b00 29 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  ), zRelative);. 
28b10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
28b20 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e  te3_snprintf(MIN
28b30 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78  (nFull, pVfs->mx
28b40 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c  Pathname), zFull
28b50 2c 20 22 25 73 22 2c 20 7a 52 65 6c 61 74 69 76  , "%s", zRelativ
28b60 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
28b70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
28b80 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  if..#if !SQLITE_
28b90 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
28ba0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
28bb0 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49  !defined(__CYGWI
28bc0 4e 5f 5f 29 0a 20 20 44 57 4f 52 44 20 6e 42 79  N__).  DWORD nBy
28bd0 74 65 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e  te;.  void *zCon
28be0 76 65 72 74 65 64 3b 0a 20 20 63 68 61 72 20 2a  verted;.  char *
28bf0 7a 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  zOut;..  /* If t
28c00 68 69 73 20 70 61 74 68 20 6e 61 6d 65 20 62 65  his path name be
28c10 67 69 6e 73 20 77 69 74 68 20 22 2f 58 3a 22 2c  gins with "/X:",
28c20 20 77 68 65 72 65 20 22 58 22 20 69 73 20 61 6e   where "X" is an
28c30 79 20 61 6c 70 68 61 62 65 74 69 63 0a 20 20 2a  y alphabetic.  *
28c40 2a 20 63 68 61 72 61 63 74 65 72 2c 20 64 69 73  * character, dis
28c50 63 61 72 64 20 74 68 65 20 69 6e 69 74 69 61 6c  card the initial
28c60 20 22 2f 22 20 66 72 6f 6d 20 74 68 65 20 70 61   "/" from the pa
28c70 74 68 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69  thname..  */.  i
28c80 66 28 20 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d  f( zRelative[0]=
28c90 3d 27 2f 27 20 26 26 20 77 69 6e 49 73 44 72 69  ='/' && winIsDri
28ca0 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e  veLetterAndColon
28cb0 28 7a 52 65 6c 61 74 69 76 65 2b 31 29 20 29 7b  (zRelative+1) ){
28cc0 0a 20 20 20 20 7a 52 65 6c 61 74 69 76 65 2b 2b  .    zRelative++
28cd0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 27 73  ;.  }..  /* It's
28ce0 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65   odd to simulate
28cf0 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72   an io-error her
28d00 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68  e, but really th
28d10 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20  is is just.  ** 
28d20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72  using the io-err
28d30 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72  or infrastructur
28d40 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  e to test that S
28d50 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68  QLite handles th
28d60 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
28d70 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66   failing. This f
28d80 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61  unction could fa
28d90 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70  il if, for examp
28da0 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72  le, the.  ** cur
28db0 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72  rent working dir
28dc0 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
28dd0 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20  unlinked..  */. 
28de0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
28df0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
28e00 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 20 28 20  ERROR );.  if ( 
28e10 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
28e20 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73  ectory && !winIs
28e30 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65  VerbatimPathname
28e40 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20  (zRelative) ){. 
28e50 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54     /*.    ** NOT
28e60 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e  E: We are dealin
28e70 67 20 77 69 74 68 20 61 20 72 65 6c 61 74 69 76  g with a relativ
28e80 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20  e path name and 
28e90 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20  the data.    ** 
28ea0 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
28eb0 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54  has been set.  T
28ec0 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
28ed0 20 61 73 20 74 68 65 20 62 61 73 69 73 0a 20 20   as the basis.  
28ee0 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63    **       for c
28ef0 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72 65  onverting the re
28f00 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65  lative path name
28f10 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a   to an absolute.
28f20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65      **       one
28f30 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74   by prepending t
28f40 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72  he data director
28f50 79 20 61 6e 64 20 61 20 62 61 63 6b 73 6c 61 73  y and a backslas
28f60 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  h..    */.    sq
28f70 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
28f80 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e  IN(nFull, pVfs->
28f90 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75  mxPathname), zFu
28fa0 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20 20  ll, "%s%c%s",.  
28fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fc0 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f     sqlite3_data_
28fd0 64 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47 65  directory, winGe
28fe0 74 44 69 72 53 65 70 28 29 2c 20 7a 52 65 6c 61  tDirSep(), zRela
28ff0 74 69 76 65 29 3b 0a 20 20 20 20 72 65 74 75 72  tive);.    retur
29000 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
29010 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  .  zConverted = 
29020 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74  winConvertFromUt
29030 66 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61  f8Filename(zRela
29040 74 69 76 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f  tive);.  if( zCo
29050 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
29060 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
29070 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  IOERR_NOMEM;.  }
29080 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
29090 29 7b 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54  ){.    LPWSTR zT
290a0 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d  emp;.    nByte =
290b0 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
290c0 6d 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  meW((LPCWSTR)zCo
290d0 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30  nverted, 0, 0, 0
290e0 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  );.    if( nByte
290f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
29100 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
29110 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74  rted);.      ret
29120 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
29130 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
29140 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c  FULLPATH, osGetL
29150 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
29160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29170 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74       "winFullPat
29180 68 6e 61 6d 65 31 22 2c 20 7a 52 65 6c 61 74 69  hname1", zRelati
29190 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  ve);.    }.    n
291a0 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a  Byte += 3;.    z
291b0 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  Temp = sqlite3Ma
291c0 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a  llocZero( nByte*
291d0 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29  sizeof(zTemp[0])
291e0 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d   );.    if( zTem
291f0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
29200 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
29210 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65  erted);.      re
29220 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
29230 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  R_NOMEM;.    }. 
29240 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74     nByte = osGet
29250 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c  FullPathNameW((L
29260 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
29270 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c  d, nByte, zTemp,
29280 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79   0);.    if( nBy
29290 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  te==0 ){.      s
292a0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
292b0 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 73  verted);.      s
292c0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d  qlite3_free(zTem
292d0 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
292e0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
292f0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c  ITE_CANTOPEN_FUL
29300 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74  LPATH, osGetLast
29310 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
29320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29330 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61    "winFullPathna
29340 6d 65 32 22 2c 20 7a 52 65 6c 61 74 69 76 65 29  me2", zRelative)
29350 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
29360 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
29370 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d  ted);.    zOut =
29380 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66   winUnicodeToUtf
29390 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71  8(zTemp);.    sq
293a0 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70  lite3_free(zTemp
293b0 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  );.  }.#ifdef SQ
293c0 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
293d0 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
293e0 63 68 61 72 20 2a 7a 54 65 6d 70 3b 0a 20 20 20  char *zTemp;.   
293f0 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75   nByte = osGetFu
29400 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61  llPathNameA((cha
29410 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30  r*)zConverted, 0
29420 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
29430 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
29440 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
29450 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
29460 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
29470 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
29480 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20  TOPEN_FULLPATH, 
29490 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
294a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
294b0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
294c0 75 6c 6c 50 61 74 68 6e 61 6d 65 33 22 2c 20 7a  ullPathname3", z
294d0 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d  Relative);.    }
294e0 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b  .    nByte += 3;
294f0 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c  .    zTemp = sql
29500 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
29510 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65  nByte*sizeof(zTe
29520 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  mp[0]) );.    if
29530 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20  ( zTemp==0 ){.  
29540 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
29550 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
29560 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29570 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
29580 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d     }.    nByte =
29590 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
295a0 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  meA((char*)zConv
295b0 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54  erted, nByte, zT
295c0 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  emp, 0);.    if(
295d0 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
295e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
295f0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
29600 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
29610 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 72 65  zTemp);.      re
29620 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
29630 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
29640 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74  _FULLPATH, osGet
29650 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
29660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29670 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61        "winFullPa
29680 74 68 6e 61 6d 65 34 22 2c 20 7a 52 65 6c 61 74  thname4", zRelat
29690 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ive);.    }.    
296a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
296b0 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f  nverted);.    zO
296c0 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  ut = sqlite3_win
296d0 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28  32_mbcs_to_utf8(
296e0 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69  zTemp);.    sqli
296f0 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b  te3_free(zTemp);
29700 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
29710 28 20 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73 71  ( zOut ){.    sq
29720 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
29730 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e  IN(nFull, pVfs->
29740 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75  mxPathname), zFu
29750 6c 6c 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b  ll, "%s", zOut);
29760 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
29770 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 72 65 74  e(zOut);.    ret
29780 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
29790 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
297a0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
297b0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69  NOMEM;.  }.#endi
297c0 66 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  f.}..#ifndef SQL
297d0 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
297e0 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e  TENSION./*.** In
297f0 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65  terfaces for ope
29800 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69  ning a shared li
29810 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65  brary, finding e
29820 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77  ntry points.** w
29830 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64  ithin the shared
29840 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c   library, and cl
29850 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  osing the shared
29860 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 73 74 61   library..*/.sta
29870 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 44 6c 4f  tic void *winDlO
29880 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20  pen(sqlite3_vfs 
29890 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61  *pVfs, const cha
298a0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
298b0 20 48 41 4e 44 4c 45 20 68 3b 0a 23 69 66 20 64   HANDLE h;.#if d
298c0 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f  efined(__CYGWIN_
298d0 5f 29 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 20 3d  _).  int nFull =
298e0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
298f0 65 2b 31 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75  e+1;.  char *zFu
29900 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ll = sqlite3Mall
29910 6f 63 5a 65 72 6f 28 20 6e 46 75 6c 6c 20 29 3b  ocZero( nFull );
29920 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
29930 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a  ted = 0;.  if( z
29940 46 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 4f  Full==0 ){.    O
29950 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20  STRACE(("DLOPEN 
29960 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d  name=%s, handle=
29970 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  %p\n", zFilename
29980 2c 20 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20  , (void*)0));.  
29990 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
299a0 20 20 69 66 28 20 77 69 6e 46 75 6c 6c 50 61 74    if( winFullPat
299b0 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c  hname(pVfs, zFil
299c0 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c 2c 20 7a 46  ename, nFull, zF
299d0 75 6c 6c 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ull)!=SQLITE_OK 
299e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
299f0 72 65 65 28 7a 46 75 6c 6c 29 3b 0a 20 20 20 20  ree(zFull);.    
29a00 4f 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e  OSTRACE(("DLOPEN
29a10 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65   name=%s, handle
29a20 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d  =%p\n", zFilenam
29a30 65 2c 20 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20  e, (void*)0));. 
29a40 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
29a50 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  .  zConverted = 
29a60 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74  winConvertFromUt
29a70 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 75 6c 6c  f8Filename(zFull
29a80 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
29a90 65 28 7a 46 75 6c 6c 29 3b 0a 23 65 6c 73 65 0a  e(zFull);.#else.
29aa0 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
29ab0 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46  ed = winConvertF
29ac0 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  romUtf8Filename(
29ad0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 55 4e  zFilename);.  UN
29ae0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
29af0 56 66 73 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69  Vfs);.#endif.  i
29b00 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
29b10 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
29b20 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73  ("DLOPEN name=%s
29b30 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20  , handle=%p\n", 
29b40 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64  zFilename, (void
29b50 2a 29 30 29 29 3b 0a 20 20 20 20 72 65 74 75 72  *)0));.    retur
29b60 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  n 0;.  }.  if( o
29b70 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53  sIsNT() ){.#if S
29b80 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
29b90 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 50 61 63     h = osLoadPac
29ba0 6b 61 67 65 64 4c 69 62 72 61 72 79 28 28 4c 50  kagedLibrary((LP
29bb0 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
29bc0 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  , 0);.#else.    
29bd0 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72  h = osLoadLibrar
29be0 79 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  yW((LPCWSTR)zCon
29bf0 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a  verted);.#endif.
29c00 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
29c10 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
29c20 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d  .  else{.    h =
29c30 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 28   osLoadLibraryA(
29c40 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
29c50 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  d);.  }.#endif. 
29c60 20 4f 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45   OSTRACE(("DLOPE
29c70 4e 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c  N name=%s, handl
29c80 65 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61  e=%p\n", zFilena
29c90 6d 65 2c 20 28 76 6f 69 64 2a 29 68 29 29 3b 0a  me, (void*)h));.
29ca0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
29cb0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 72 65  Converted);.  re
29cc0 74 75 72 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d  turn (void*)h;.}
29cd0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
29ce0 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  DlError(sqlite3_
29cf0 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e  vfs *pVfs, int n
29d00 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f  Buf, char *zBufO
29d10 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ut){.  UNUSED_PA
29d20 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
29d30 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
29d40 4d 73 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72  Msg(osGetLastErr
29d50 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66  or(), nBuf, zBuf
29d60 4f 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  Out);.}.static v
29d70 6f 69 64 20 28 2a 77 69 6e 44 6c 53 79 6d 28 73  oid (*winDlSym(s
29d80 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
29d90 2c 76 6f 69 64 20 2a 70 48 2c 63 6f 6e 73 74 20  ,void *pH,const 
29da0 63 68 61 72 20 2a 7a 53 79 6d 29 29 28 76 6f 69  char *zSym))(voi
29db0 64 29 7b 0a 20 20 46 41 52 50 52 4f 43 20 70 72  d){.  FARPROC pr
29dc0 6f 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  oc;.  UNUSED_PAR
29dd0 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
29de0 70 72 6f 63 20 3d 20 6f 73 47 65 74 50 72 6f 63  proc = osGetProc
29df0 41 64 64 72 65 73 73 41 28 28 48 41 4e 44 4c 45  AddressA((HANDLE
29e00 29 70 48 2c 20 7a 53 79 6d 29 3b 0a 20 20 4f 53  )pH, zSym);.  OS
29e10 54 52 41 43 45 28 28 22 44 4c 53 59 4d 20 68 61  TRACE(("DLSYM ha
29e20 6e 64 6c 65 3d 25 70 2c 20 73 79 6d 62 6f 6c 3d  ndle=%p, symbol=
29e30 25 73 2c 20 61 64 64 72 65 73 73 3d 25 70 5c 6e  %s, address=%p\n
29e40 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 76  ",.           (v
29e50 6f 69 64 2a 29 70 48 2c 20 7a 53 79 6d 2c 20 28  oid*)pH, zSym, (
29e60 76 6f 69 64 2a 29 70 72 6f 63 29 29 3b 0a 20 20  void*)proc));.  
29e70 72 65 74 75 72 6e 20 28 76 6f 69 64 28 2a 29 28  return (void(*)(
29e80 76 6f 69 64 29 29 70 72 6f 63 3b 0a 7d 0a 73 74  void))proc;.}.st
29e90 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 43  atic void winDlC
29ea0 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73  lose(sqlite3_vfs
29eb0 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48   *pVfs, void *pH
29ec0 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44  andle){.  UNUSED
29ed0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
29ee0 3b 0a 20 20 6f 73 46 72 65 65 4c 69 62 72 61 72  ;.  osFreeLibrar
29ef0 79 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c  y((HANDLE)pHandl
29f00 65 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  e);.  OSTRACE(("
29f10 44 4c 43 4c 4f 53 45 20 68 61 6e 64 6c 65 3d 25  DLCLOSE handle=%
29f20 70 5c 6e 22 2c 20 28 76 6f 69 64 2a 29 70 48 61  p\n", (void*)pHa
29f30 6e 64 6c 65 29 29 3b 0a 7d 0a 23 65 6c 73 65 20  ndle));.}.#else 
29f40 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  /* if SQLITE_OMI
29f50 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
29f60 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a   is defined: */.
29f70 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f    #define winDlO
29f80 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65  pen  0.  #define
29f90 20 77 69 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20   winDlError 0.  
29fa0 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d  #define winDlSym
29fb0 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77     0.  #define w
29fc0 69 6e 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64  inDlClose 0.#end
29fd0 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  if.../*.** Write
29fe0 20 75 70 20 74 6f 20 6e 42 75 66 20 62 79 74 65   up to nBuf byte
29ff0 73 20 6f 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20  s of randomness 
2a000 69 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74  into zBuf..*/.st
2a010 61 74 69 63 20 69 6e 74 20 77 69 6e 52 61 6e 64  atic int winRand
2a020 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76  omness(sqlite3_v
2a030 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
2a040 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
2a050 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  .  int n = 0;.  
2a060 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2a070 28 70 56 66 73 29 3b 0a 23 69 66 20 64 65 66 69  (pVfs);.#if defi
2a080 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
2a090 0a 20 20 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 6d  .  n = nBuf;.  m
2a0a0 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e  emset(zBuf, 0, n
2a0b0 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66  Buf);.#else.  if
2a0c0 28 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 54  ( sizeof(SYSTEMT
2a0d0 49 4d 45 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a  IME)<=nBuf-n ){.
2a0e0 20 20 20 20 53 59 53 54 45 4d 54 49 4d 45 20 78      SYSTEMTIME x
2a0f0 3b 0a 20 20 20 20 6f 73 47 65 74 53 79 73 74 65  ;.    osGetSyste
2a100 6d 54 69 6d 65 28 26 78 29 3b 0a 20 20 20 20 6d  mTime(&x);.    m
2a110 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20  emcpy(&zBuf[n], 
2a120 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a  &x, sizeof(x));.
2a130 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28      n += sizeof(
2a140 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69  x);.  }.  if( si
2a150 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75  zeof(DWORD)<=nBu
2a160 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44  f-n ){.    DWORD
2a170 20 70 69 64 20 3d 20 6f 73 47 65 74 43 75 72 72   pid = osGetCurr
2a180 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 3b 0a  entProcessId();.
2a190 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
2a1a0 5b 6e 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f  [n], &pid, sizeo
2a1b0 66 28 70 69 64 29 29 3b 0a 20 20 20 20 6e 20 2b  f(pid));.    n +
2a1c0 3d 20 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20  = sizeof(pid);. 
2a1d0 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53   }.#if SQLITE_OS
2a1e0 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 73 69 7a  _WINRT.  if( siz
2a1f0 65 6f 66 28 55 4c 4f 4e 47 4c 4f 4e 47 29 3c 3d  eof(ULONGLONG)<=
2a200 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 55 4c  nBuf-n ){.    UL
2a210 4f 4e 47 4c 4f 4e 47 20 63 6e 74 20 3d 20 6f 73  ONGLONG cnt = os
2a220 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 28 29  GetTickCount64()
2a230 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42  ;.    memcpy(&zB
2a240 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a  uf[n], &cnt, siz
2a250 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e  eof(cnt));.    n
2a260 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b   += sizeof(cnt);
2a270 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28  .  }.#else.  if(
2a280 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d   sizeof(DWORD)<=
2a290 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57  nBuf-n ){.    DW
2a2a0 4f 52 44 20 63 6e 74 20 3d 20 6f 73 47 65 74 54  ORD cnt = osGetT
2a2b0 69 63 6b 43 6f 75 6e 74 28 29 3b 0a 20 20 20 20  ickCount();.    
2a2c0 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c  memcpy(&zBuf[n],
2a2d0 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e   &cnt, sizeof(cn
2a2e0 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69  t));.    n += si
2a2f0 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 23  zeof(cnt);.  }.#
2a300 65 6e 64 69 66 0a 20 20 69 66 28 20 73 69 7a 65  endif.  if( size
2a310 6f 66 28 4c 41 52 47 45 5f 49 4e 54 45 47 45 52  of(LARGE_INTEGER
2a320 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20  )<=nBuf-n ){.   
2a330 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20 69   LARGE_INTEGER i
2a340 3b 0a 20 20 20 20 6f 73 51 75 65 72 79 50 65 72  ;.    osQueryPer
2a350 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 28  formanceCounter(
2a360 26 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  &i);.    memcpy(
2a370 26 7a 42 75 66 5b 6e 5d 2c 20 26 69 2c 20 73 69  &zBuf[n], &i, si
2a380 7a 65 6f 66 28 69 29 29 3b 0a 20 20 20 20 6e 20  zeof(i));.    n 
2a390 2b 3d 20 73 69 7a 65 6f 66 28 69 29 3b 0a 20 20  += sizeof(i);.  
2a3a0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
2a3b0 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53  n n;.}.../*.** S
2a3c0 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c  leep for a littl
2a3d0 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e  e while.  Return
2a3e0 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
2a3f0 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74  ime slept..*/.st
2a400 61 74 69 63 20 69 6e 74 20 77 69 6e 53 6c 65 65  atic int winSlee
2a410 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  p(sqlite3_vfs *p
2a420 56 66 73 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65  Vfs, int microse
2a430 63 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 77 69  c){.  sqlite3_wi
2a440 6e 33 32 5f 73 6c 65 65 70 28 28 6d 69 63 72 6f  n32_sleep((micro
2a450 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a  sec+999)/1000);.
2a460 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2a470 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75  ER(pVfs);.  retu
2a480 72 6e 20 28 28 6d 69 63 72 6f 73 65 63 2b 39 39  rn ((microsec+99
2a490 39 29 2f 31 30 30 30 29 2a 31 30 30 30 3b 0a 7d  9)/1000)*1000;.}
2a4a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
2a4b0 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20  owing variable, 
2a4c0 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d  if set to a non-
2a4d0 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69  zero value, is i
2a4e0 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a  nterpreted as.**
2a4f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
2a500 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37  econds since 197
2a510 30 20 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f  0 and is used to
2a520 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20   set the result 
2a530 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43  of.** sqlite3OsC
2a540 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72  urrentTime() dur
2a550 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a  ing testing..*/.
2a560 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
2a570 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  ST.int sqlite3_c
2a580 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b  urrent_time = 0;
2a590 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d    /* Fake system
2a5a0 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73   time in seconds
2a5b0 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a   since 1970. */.
2a5c0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69  #endif../*.** Fi
2a5d0 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  nd the current t
2a5e0 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61  ime (in Universa
2a5f0 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69  l Coordinated Ti
2a600 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f  me).  Write into
2a610 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63   *piNow.** the c
2a620 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20  urrent time and 
2a630 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e  date as a Julian
2a640 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65   Day number time
2a650 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49  s 86_400_000.  I
2a660 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73  n.** other words
2a670 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69  , write into *pi
2a680 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Now the number o
2a690 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73  f milliseconds s
2a6a0 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a  ince the Julian.
2a6b0 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e  ** epoch of noon
2a6c0 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e   in Greenwich on
2a6d0 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37   November 24, 47
2a6e0 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67  14 B.C according
2a6f0 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65   to the.** prole
2a700 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63  ptic Gregorian c
2a710 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f  alendar..**.** O
2a720 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 75 72  n success, retur
2a730 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65  n SQLITE_OK.  Re
2a740 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2a750 52 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e  R if the time an
2a760 64 20 64 61 74 65 0a 2a 2a 20 63 61 6e 6e 6f 74  d date.** cannot
2a770 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74   be found..*/.st
2a780 61 74 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72  atic int winCurr
2a790 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c  entTimeInt64(sql
2a7a0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
2a7b0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70  sqlite3_int64 *p
2a7c0 69 4e 6f 77 29 7b 0a 20 20 2f 2a 20 46 49 4c 45  iNow){.  /* FILE
2a7d0 54 49 4d 45 20 73 74 72 75 63 74 75 72 65 20 69  TIME structure i
2a7e0 73 20 61 20 36 34 2d 62 69 74 20 76 61 6c 75 65  s a 64-bit value
2a7f0 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68   representing th
2a800 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  e number of.    
2a810 20 31 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20   100-nanosecond 
2a820 69 6e 74 65 72 76 61 6c 73 20 73 69 6e 63 65 20  intervals since 
2a830 4a 61 6e 75 61 72 79 20 31 2c 20 31 36 30 31 20  January 1, 1601 
2a840 28 3d 20 4a 44 20 32 33 30 35 38 31 33 2e 35 29  (= JD 2305813.5)
2a850 2e 0a 20 20 2a 2f 0a 20 20 46 49 4c 45 54 49 4d  ..  */.  FILETIM
2a860 45 20 66 74 3b 0a 20 20 73 74 61 74 69 63 20 63  E ft;.  static c
2a870 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74  onst sqlite3_int
2a880 36 34 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70  64 winFiletimeEp
2a890 6f 63 68 20 3d 20 32 33 30 35 38 31 33 35 2a 28  och = 23058135*(
2a8a0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36  sqlite3_int64)86
2a8b0 34 30 30 30 30 3b 0a 23 69 66 64 65 66 20 53 51  40000;.#ifdef SQ
2a8c0 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 74 61 74  LITE_TEST.  stat
2a8d0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
2a8e0 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68  _int64 unixEpoch
2a8f0 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c   = 24405875*(sql
2a900 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30  ite3_int64)86400
2a910 30 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20  00;.#endif.  /* 
2a920 32 5e 33 32 20 2d 20 74 6f 20 61 76 6f 69 64 20  2^32 - to avoid 
2a930 75 73 65 20 6f 66 20 4c 4c 20 61 6e 64 20 77 61  use of LL and wa
2a940 72 6e 69 6e 67 73 20 69 6e 20 67 63 63 20 2a 2f  rnings in gcc */
2a950 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
2a960 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 61  sqlite3_int64 ma
2a970 78 33 32 42 69 74 56 61 6c 75 65 20 3d 0a 20 20  x32BitValue =.  
2a980 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74      (sqlite3_int
2a990 36 34 29 32 30 30 30 30 30 30 30 30 30 20 2b 20  64)2000000000 + 
2a9a0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32  (sqlite3_int64)2
2a9b0 30 30 30 30 30 30 30 30 30 20 2b 0a 20 20 20 20  000000000 +.    
2a9c0 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34    (sqlite3_int64
2a9d0 29 32 39 34 39 36 37 32 39 36 3b 0a 0a 23 69 66  )294967296;..#if
2a9e0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
2a9f0 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20 74 69  .  SYSTEMTIME ti
2aa00 6d 65 3b 0a 20 20 6f 73 47 65 74 53 79 73 74 65  me;.  osGetSyste
2aa10 6d 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a 20 20  mTime(&time);.  
2aa20 2f 2a 20 69 66 20 53 79 73 74 65 6d 54 69 6d 65  /* if SystemTime
2aa30 54 6f 46 69 6c 65 54 69 6d 65 28 29 20 66 61 69  ToFileTime() fai
2aa40 6c 73 2c 20 69 74 20 72 65 74 75 72 6e 73 20 7a  ls, it returns z
2aa50 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 20 28 21 6f  ero. */.  if (!o
2aa60 73 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c  sSystemTimeToFil
2aa70 65 54 69 6d 65 28 26 74 69 6d 65 2c 26 66 74 29  eTime(&time,&ft)
2aa80 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2aa90 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
2aaa0 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73  #else.  osGetSys
2aab0 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
2aac0 65 28 20 26 66 74 20 29 3b 0a 23 65 6e 64 69 66  e( &ft );.#endif
2aad0 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 77 69 6e  ..  *piNow = win
2aae0 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 2b 0a  FiletimeEpoch +.
2aaf0 20 20 20 20 20 20 20 20 20 20 20 20 28 28 28 28              ((((
2ab00 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74  sqlite3_int64)ft
2ab10 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 29  .dwHighDateTime)
2ab20 2a 6d 61 78 33 32 42 69 74 56 61 6c 75 65 29 20  *max32BitValue) 
2ab30 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +.              
2ab40 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
2ab50 66 74 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65  ft.dwLowDateTime
2ab60 29 2f 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  )/(sqlite3_int64
2ab70 29 31 30 30 30 30 3b 0a 0a 23 69 66 64 65 66 20  )10000;..#ifdef 
2ab80 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
2ab90 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  ( sqlite3_curren
2aba0 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70  t_time ){.    *p
2abb0 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c  iNow = 1000*(sql
2abc0 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74  ite3_int64)sqlit
2abd0 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
2abe0 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d  + unixEpoch;.  }
2abf0 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44  .#endif.  UNUSED
2ac00 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
2ac10 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2ac20 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  E_OK;.}../*.** F
2ac30 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
2ac40 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73  time (in Univers
2ac50 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54  al Coordinated T
2ac60 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65  ime).  Write the
2ac70 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65  .** current time
2ac80 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a   and date as a J
2ac90 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
2aca0 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64   into *prNow and
2acb0 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52  .** return 0.  R
2acc0 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74  eturn 1 if the t
2acd0 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e  ime and date can
2ace0 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
2acf0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43  .static int winC
2ad00 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74  urrentTime(sqlit
2ad10 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f  e3_vfs *pVfs, do
2ad20 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20  uble *prNow){.  
2ad30 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
2ad40 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20 72 63 20  3_int64 i;.  rc 
2ad50 3d 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65  = winCurrentTime
2ad60 49 6e 74 36 34 28 70 56 66 73 2c 20 26 69 29 3b  Int64(pVfs, &i);
2ad70 0a 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20  .  if( !rc ){.  
2ad80 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34    *prNow = i/864
2ad90 30 30 30 30 30 2e 30 3b 0a 20 20 7d 0a 20 20 72  00000.0;.  }.  r
2ada0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2adb0 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73 20 74  ** The idea is t
2adc0 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hat this functio
2add0 6e 20 77 6f 72 6b 73 20 6c 69 6b 65 20 61 20 63  n works like a c
2ade0 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a 2a  ombination of.**
2adf0 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20   GetLastError() 
2ae00 61 6e 64 20 46 6f 72 6d 61 74 4d 65 73 73 61 67  and FormatMessag
2ae10 65 28 29 20 6f 6e 20 57 69 6e 64 6f 77 73 20 28  e() on Windows (
2ae20 6f 72 20 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a 20  or errno and.** 
2ae30 73 74 72 65 72 72 6f 72 5f 72 28 29 20 6f 6e 20  strerror_r() on 
2ae40 55 6e 69 78 29 2e 20 41 66 74 65 72 20 61 6e 20  Unix). After an 
2ae50 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
2ae60 64 20 62 79 20 61 6e 20 4f 53 0a 2a 2a 20 66 75  d by an OS.** fu
2ae70 6e 63 74 69 6f 6e 2c 20 53 51 4c 69 74 65 20 63  nction, SQLite c
2ae80 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69  alls this functi
2ae90 6f 6e 20 77 69 74 68 20 7a 42 75 66 20 70 6f 69  on with zBuf poi
2aea0 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20 61 20 62 75  nting to.** a bu
2aeb0 66 66 65 72 20 6f 66 20 6e 42 75 66 20 62 79 74  ffer of nBuf byt
2aec0 65 73 2e 20 54 68 65 20 4f 53 20 6c 61 79 65 72  es. The OS layer
2aed0 20 73 68 6f 75 6c 64 20 70 6f 70 75 6c 61 74 65   should populate
2aee0 20 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 20 77   the.** buffer w
2aef0 69 74 68 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e  ith a nul-termin
2af00 61 74 65 64 20 55 54 46 2d 38 20 65 6e 63 6f 64  ated UTF-8 encod
2af10 65 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ed error message
2af20 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20 74  .** describing t
2af30 68 65 20 6c 61 73 74 20 49 4f 20 65 72 72 6f 72  he last IO error
2af40 20 74 6f 20 68 61 76 65 20 6f 63 63 75 72 72 65   to have occurre
2af50 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c  d within the cal
2af60 6c 69 6e 67 0a 2a 2a 20 74 68 72 65 61 64 2e 0a  ling.** thread..
2af70 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 72 72  **.** If the err
2af80 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 74 6f  or message is to
2af90 6f 20 6c 61 72 67 65 20 66 6f 72 20 74 68 65 20  o large for the 
2afa0 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 2c  supplied buffer,
2afb0 0a 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20 62 65  .** it should be
2afc0 20 74 72 75 6e 63 61 74 65 64 2e 20 54 68 65 20   truncated. The 
2afd0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
2afe0 78 47 65 74 4c 61 73 74 45 72 72 6f 72 0a 2a 2a  xGetLastError.**
2aff0 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20   is zero if the 
2b000 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69  error message fi
2b010 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 65 72  ts in the buffer
2b020 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a  , or non-zero.**
2b030 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20 74   otherwise (if t
2b040 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 20 74  he message was t
2b050 72 75 6e 63 61 74 65 64 29 2e 20 49 66 20 6e 6f  runcated). If no
2b060 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  n-zero is return
2b070 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69  ed,.** then it i
2b080 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
2b090 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  to include the n
2b0a0 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 63 68  ul-terminator ch
2b0b0 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 74 68  aracter.** in th
2b0c0 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e  e output buffer.
2b0d0 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70 70 6c  .**.** Not suppl
2b0e0 79 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d 65  ying an error me
2b0f0 73 73 61 67 65 20 77 69 6c 6c 20 68 61 76 65 20  ssage will have 
2b100 6e 6f 20 61 64 76 65 72 73 65 20 65 66 66 65 63  no adverse effec
2b110 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74 65 2e 20  t.** on SQLite. 
2b120 49 74 20 69 73 20 66 69 6e 65 20 74 6f 20 68 61  It is fine to ha
2b130 76 65 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  ve an implementa
2b140 74 69 6f 6e 20 74 68 61 74 20 6e 65 76 65 72 0a  tion that never.
2b150 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  ** returns an er
2b160 72 6f 72 20 6d 65 73 73 61 67 65 3a 0a 2a 2a 0a  ror message:.**.
2b170 2a 2a 20 20 20 69 6e 74 20 78 47 65 74 4c 61 73  **   int xGetLas
2b180 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  tError(sqlite3_v
2b190 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
2b1a0 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
2b1b0 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 7a  .**     assert(z
2b1c0 42 75 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a 2a  Buf[0]=='\0');.*
2b1d0 2a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  *     return 0;.
2b1e0 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77  **   }.**.** How
2b1f0 65 76 65 72 20 69 66 20 61 6e 20 65 72 72 6f 72  ever if an error
2b200 20 6d 65 73 73 61 67 65 20 69 73 20 73 75 70 70   message is supp
2b210 6c 69 65 64 2c 20 69 74 20 77 69 6c 6c 20 62 65  lied, it will be
2b220 20 69 6e 63 6f 72 70 6f 72 61 74 65 64 0a 2a 2a   incorporated.**
2b230 20 62 79 20 73 71 6c 69 74 65 20 69 6e 74 6f 20   by sqlite into 
2b240 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
2b250 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74  e available to t
2b260 68 65 20 75 73 65 72 20 75 73 69 6e 67 0a 2a 2a  he user using.**
2b270 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
2b280 29 2c 20 70 6f 73 73 69 62 6c 79 20 6d 61 6b 69  ), possibly maki
2b290 6e 67 20 49 4f 20 65 72 72 6f 72 73 20 65 61 73  ng IO errors eas
2b2a0 69 65 72 20 74 6f 20 64 65 62 75 67 2e 0a 2a 2f  ier to debug..*/
2b2b0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47  .static int winG
2b2c0 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69  etLastError(sqli
2b2d0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
2b2e0 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
2b2f0 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  Buf){.  UNUSED_P
2b300 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
2b310 20 20 72 65 74 75 72 6e 20 77 69 6e 47 65 74 4c    return winGetL
2b320 61 73 74 45 72 72 6f 72 4d 73 67 28 6f 73 47 65  astErrorMsg(osGe
2b330 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 6e 42  tLastError(), nB
2b340 75 66 2c 20 7a 42 75 66 29 3b 0a 7d 0a 0a 2f 2a  uf, zBuf);.}../*
2b350 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
2b360 6e 64 20 64 65 69 6e 69 74 69 61 6c 69 7a 65 20  nd deinitialize 
2b370 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
2b380 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a  stem interface..
2b390 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
2b3a0 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20  s_init(void){.  
2b3b0 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76  static sqlite3_v
2b3c0 66 73 20 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20  fs winVfs = {.  
2b3d0 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20    3,            
2b3e0 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
2b3f0 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66  on */.    sizeof
2b400 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f  (winFile),     /
2b410 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20  * szOsFile */.  
2b420 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d    SQLITE_WIN32_M
2b430 41 58 5f 50 41 54 48 5f 42 59 54 45 53 2c 20 2f  AX_PATH_BYTES, /
2b440 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  * mxPathname */.
2b450 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
2b460 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78           /* pNex
2b470 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 22  t */.    "win32"
2b480 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2b490 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c   zName */.    0,
2b4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4b0 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a     /* pAppData *
2b4c0 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20  /.    winOpen,  
2b4d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f             /* xO
2b4e0 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65  pen */.    winDe
2b4f0 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  lete,           
2b500 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20  /* xDelete */.  
2b510 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20    winAccess,    
2b520 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73         /* xAcces
2b530 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c  s */.    winFull
2b540 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a  Pathname,     /*
2b550 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a   xFullPathname *
2b560 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c  /.    winDlOpen,
2b570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
2b580 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e  lOpen */.    win
2b590 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20  DlError,        
2b5a0 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f    /* xDlError */
2b5b0 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20  .    winDlSym,  
2b5c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
2b5d0 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  Sym */.    winDl
2b5e0 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
2b5f0 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20  /* xDlClose */. 
2b600 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73     winRandomness
2b610 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64  ,       /* xRand
2b620 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77 69  omness */.    wi
2b630 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20  nSleep,         
2b640 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a     /* xSleep */.
2b650 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69      winCurrentTi
2b660 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72  me,      /* xCur
2b670 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20  rentTime */.    
2b680 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c  winGetLastError,
2b690 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74       /* xGetLast
2b6a0 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e  Error */.    win
2b6b0 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
2b6c0 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d  , /* xCurrentTim
2b6d0 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77 69  eInt64 */.    wi
2b6e0 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  nSetSystemCall, 
2b6f0 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d     /* xSetSystem
2b700 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47  Call */.    winG
2b710 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20  etSystemCall,   
2b720 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61   /* xGetSystemCa
2b730 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78  ll */.    winNex
2b740 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 2f  tSystemCall,   /
2b750 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  * xNextSystemCal
2b760 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 69 66 20 64 65  l */.  };.#if de
2b770 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
2b780 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 73  32_HAS_WIDE).  s
2b790 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66  tatic sqlite3_vf
2b7a0 73 20 77 69 6e 4c 6f 6e 67 50 61 74 68 56 66 73  s winLongPathVfs
2b7b0 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20 20 20   = {.    3,     
2b7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b7d0 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20   iVersion */.   
2b7e0 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29   sizeof(winFile)
2b7f0 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c  ,     /* szOsFil
2b800 65 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f  e */.    SQLITE_
2b810 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42  WINNT_MAX_PATH_B
2b820 59 54 45 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e  YTES, /* mxPathn
2b830 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ame */.    0,   
2b840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b850 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20  /* pNext */.    
2b860 22 77 69 6e 33 32 2d 6c 6f 6e 67 70 61 74 68 22  "win32-longpath"
2b870 2c 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f  ,    /* zName */
2b880 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
2b890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70            /* pAp
2b8a0 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e  pData */.    win
2b8b0 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
2b8c0 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20    /* xOpen */.  
2b8d0 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20    winDelete,    
2b8e0 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74         /* xDelet
2b8f0 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65  e */.    winAcce
2b900 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ss,           /*
2b910 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20   xAccess */.    
2b920 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  winFullPathname,
2b930 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74       /* xFullPat
2b940 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e  hname */.    win
2b950 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  DlOpen,         
2b960 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a    /* xDlOpen */.
2b970 20 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20      winDlError, 
2b980 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45           /* xDlE
2b990 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44  rror */.    winD
2b9a0 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20  lSym,           
2b9b0 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20   /* xDlSym */.  
2b9c0 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20    winDlClose,   
2b9d0 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f         /* xDlClo
2b9e0 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e  se */.    winRan
2b9f0 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f  domness,       /
2ba00 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f  * xRandomness */
2ba10 0a 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20  .    winSleep,  
2ba20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c            /* xSl
2ba30 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75  eep */.    winCu
2ba40 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20  rrentTime,      
2ba50 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20  /* xCurrentTime 
2ba60 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73  */.    winGetLas
2ba70 74 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78  tError,     /* x
2ba80 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a  GetLastError */.
2ba90 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69      winCurrentTi
2baa0 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72  meInt64, /* xCur
2bab0 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f  rentTimeInt64 */
2bac0 0a 20 20 20 20 77 69 6e 53 65 74 53 79 73 74 65  .    winSetSyste
2bad0 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65  mCall,    /* xSe
2bae0 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20  tSystemCall */. 
2baf0 20 20 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43     winGetSystemC
2bb00 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74 53  all,    /* xGetS
2bb10 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20  ystemCall */.   
2bb20 20 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61   winNextSystemCa
2bb30 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53 79  ll,   /* xNextSy
2bb40 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b  stemCall */.  };
2bb50 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f  .#endif..  /* Do
2bb60 75 62 6c 65 2d 63 68 65 63 6b 20 74 68 61 74 20  uble-check that 
2bb70 74 68 65 20 61 53 79 73 63 61 6c 6c 5b 5d 20 61  the aSyscall[] a
2bb80 72 72 61 79 20 68 61 73 20 62 65 65 6e 20 63 6f  rray has been co
2bb90 6e 73 74 72 75 63 74 65 64 0a 20 20 2a 2a 20 63  nstructed.  ** c
2bba0 6f 72 72 65 63 74 6c 79 2e 20 20 53 65 65 20 74  orrectly.  See t
2bbb0 69 63 6b 65 74 20 5b 62 62 33 61 38 36 65 38 39  icket [bb3a86e89
2bbc0 30 63 38 65 39 36 61 62 5d 20 2a 2f 0a 20 20 61  0c8e96ab] */.  a
2bbd0 73 73 65 72 74 28 20 41 72 72 61 79 53 69 7a 65  ssert( ArraySize
2bbe0 28 61 53 79 73 63 61 6c 6c 29 3d 3d 37 37 20 29  (aSyscall)==77 )
2bbf0 3b 0a 0a 20 20 2f 2a 20 67 65 74 20 6d 65 6d 6f  ;..  /* get memo
2bc00 72 79 20 6d 61 70 20 61 6c 6c 6f 63 61 74 69 6f  ry map allocatio
2bc10 6e 20 67 72 61 6e 75 6c 61 72 69 74 79 20 2a 2f  n granularity */
2bc20 0a 20 20 6d 65 6d 73 65 74 28 26 77 69 6e 53 79  .  memset(&winSy
2bc30 73 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  sInfo, 0, sizeof
2bc40 28 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 3b 0a  (SYSTEM_INFO));.
2bc50 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
2bc60 4e 52 54 0a 20 20 6f 73 47 65 74 4e 61 74 69 76  NRT.  osGetNativ
2bc70 65 53 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e  eSystemInfo(&win
2bc80 53 79 73 49 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a  SysInfo);.#else.
2bc90 20 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66    osGetSystemInf
2bca0 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a  o(&winSysInfo);.
2bcb0 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
2bcc0 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c   winSysInfo.dwAl
2bcd0 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72  locationGranular
2bce0 69 74 79 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ity>0 );.  asser
2bcf0 74 28 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77  t( winSysInfo.dw
2bd00 50 61 67 65 53 69 7a 65 3e 30 20 29 3b 0a 0a 20  PageSize>0 );.. 
2bd10 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
2bd20 69 73 74 65 72 28 26 77 69 6e 56 66 73 2c 20 31  ister(&winVfs, 1
2bd30 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  );..#if defined(
2bd40 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
2bd50 5f 57 49 44 45 29 0a 20 20 73 71 6c 69 74 65 33  _WIDE).  sqlite3
2bd60 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 77  _vfs_register(&w
2bd70 69 6e 4c 6f 6e 67 50 61 74 68 56 66 73 2c 20 30  inLongPathVfs, 0
2bd80 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74  );.#endif..  ret
2bd90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2bda0 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73  ..int sqlite3_os
2bdb0 5f 65 6e 64 28 76 6f 69 64 29 7b 0a 23 69 66 20  _end(void){.#if 
2bdc0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
2bdd0 20 20 69 66 28 20 73 6c 65 65 70 4f 62 6a 21 3d    if( sleepObj!=
2bde0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 6f 73 43 6c  NULL ){.    osCl
2bdf0 6f 73 65 48 61 6e 64 6c 65 28 73 6c 65 65 70 4f  oseHandle(sleepO
2be00 62 6a 29 3b 0a 20 20 20 20 73 6c 65 65 70 4f 62  bj);.    sleepOb
2be10 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 23 65  j = NULL;.  }.#e
2be20 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
2be30 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64  LITE_OK;.}..#end
2be40 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f  if /* SQLITE_OS_
2be50 57 49 4e 20 2a 2f 0a                             WIN */.