/ Hex Artifact Content
Login

Artifact 2f6dd3eed5566b13e75569c18984fffb5a546241:


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 5f 57 49 4e 33 32 5f 57 49 4e 4e 54 5f 56 49   _WIN32_WINNT_VI
07c0: 53 54 41 0a 23 20 20 64 65 66 69 6e 65 20 5f 57  STA.#  define _W
07d0: 49 4e 33 32 5f 57 49 4e 4e 54 5f 56 49 53 54 41  IN32_WINNT_VISTA
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 30 78 30 36 30 30 0a 23 65 6e 64 69 66 0a 0a 23  0x0600.#endif..#
0800: 69 66 6e 64 65 66 20 5f 57 49 4e 33 32 5f 57 49  ifndef _WIN32_WI
0810: 4e 4e 54 5f 57 49 4e 38 0a 23 20 20 64 65 66 69  NNT_WIN8.#  defi
0820: 6e 65 20 5f 57 49 4e 33 32 5f 57 49 4e 4e 54 5f  ne _WIN32_WINNT_
0830: 57 49 4e 38 20 20 20 20 20 20 20 20 20 20 20 20  WIN8            
0840: 20 20 20 20 20 30 78 30 36 30 32 0a 23 65 6e 64       0x0602.#end
0850: 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 54 44 44  if..#ifndef NTDD
0860: 49 5f 57 49 4e 38 0a 23 20 20 64 65 66 69 6e 65  I_WIN8.#  define
0870: 20 4e 54 44 44 49 5f 57 49 4e 38 20 20 20 20 20   NTDDI_WIN8     
0880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0890: 20 20 20 30 78 30 36 30 32 30 30 30 30 0a 23 65     0x06020000.#e
08a0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 54  ndif..#ifndef NT
08b0: 44 44 49 5f 57 49 4e 42 4c 55 45 0a 23 20 20 64  DDI_WINBLUE.#  d
08c0: 65 66 69 6e 65 20 4e 54 44 44 49 5f 57 49 4e 42  efine NTDDI_WINB
08d0: 4c 55 45 20 20 20 20 20 20 20 20 20 20 20 20 20  LUE             
08e0: 20 20 20 20 20 20 20 20 30 78 30 36 30 33 30 30          0x060300
08f0: 30 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  00.#endif..#ifnd
0900: 65 66 20 4e 54 44 44 49 5f 57 49 4e 54 48 52 45  ef NTDDI_WINTHRE
0910: 53 48 4f 4c 44 0a 23 20 20 64 65 66 69 6e 65 20  SHOLD.#  define 
0920: 4e 54 44 44 49 5f 57 49 4e 54 48 52 45 53 48 4f  NTDDI_WINTHRESHO
0930: 4c 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LD              
0940: 20 20 30 78 30 36 30 34 30 30 30 30 0a 23 65 6e    0x06040000.#en
0950: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  dif../*.** Check
0960: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 47   to see if the G
0970: 65 74 56 65 72 73 69 6f 6e 45 78 5b 41 57 5d 20  etVersionEx[AW] 
0980: 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 64 65  functions are de
0990: 70 72 65 63 61 74 65 64 20 6f 6e 20 74 68 65 0a  precated on the.
09a0: 2a 2a 20 74 61 72 67 65 74 20 73 79 73 74 65 6d  ** target system
09b0: 2e 20 20 47 65 74 56 65 72 73 69 6f 6e 45 78 20  .  GetVersionEx 
09c0: 77 61 73 20 66 69 72 73 74 20 64 65 70 72 65 63  was first deprec
09d0: 61 74 65 64 20 69 6e 20 57 69 6e 38 2e 31 2e 0a  ated in Win8.1..
09e0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
09f0: 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49  E_WIN32_GETVERSI
0a00: 4f 4e 45 58 0a 23 20 20 69 66 20 64 65 66 69 6e  ONEX.#  if defin
0a10: 65 64 28 4e 54 44 44 49 5f 56 45 52 53 49 4f 4e  ed(NTDDI_VERSION
0a20: 29 20 26 26 20 4e 54 44 44 49 5f 56 45 52 53 49  ) && NTDDI_VERSI
0a30: 4f 4e 20 3e 3d 20 4e 54 44 44 49 5f 57 49 4e 42  ON >= NTDDI_WINB
0a40: 4c 55 45 0a 23 20 20 20 20 64 65 66 69 6e 65 20  LUE.#    define 
0a50: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54  SQLITE_WIN32_GET
0a60: 56 45 52 53 49 4f 4e 45 58 20 20 20 30 20 20 20  VERSIONEX   0   
0a70: 2f 2a 20 47 65 74 56 65 72 73 69 6f 6e 45 78 28  /* GetVersionEx(
0a80: 29 20 69 73 20 64 65 70 72 65 63 61 74 65 64 20  ) is deprecated 
0a90: 2a 2f 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20  */.#  else.#    
0aa0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
0ab0: 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58  N32_GETVERSIONEX
0ac0: 20 20 20 31 20 20 20 2f 2a 20 47 65 74 56 65 72     1   /* GetVer
0ad0: 73 69 6f 6e 45 78 28 29 20 69 73 20 63 75 72 72  sionEx() is curr
0ae0: 65 6e 74 20 2a 2f 0a 23 20 20 65 6e 64 69 66 0a  ent */.#  endif.
0af0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68  #endif../*.** Ch
0b00: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
0b10: 65 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  e CreateFileMapp
0b20: 69 6e 67 41 20 66 75 6e 63 74 69 6f 6e 20 69 73  ingA function is
0b30: 20 73 75 70 70 6f 72 74 65 64 20 6f 6e 20 74 68   supported on th
0b40: 65 0a 2a 2a 20 74 61 72 67 65 74 20 73 79 73 74  e.** target syst
0b50: 65 6d 2e 20 20 49 74 20 69 73 20 75 6e 61 76 61  em.  It is unava
0b60: 69 6c 61 62 6c 65 20 77 68 65 6e 20 75 73 69 6e  ilable when usin
0b70: 67 20 22 6d 69 6e 63 6f 72 65 2e 6c 69 62 22 20  g "mincore.lib" 
0b80: 6f 6e 20 57 69 6e 31 30 2e 0a 2a 2a 20 57 68 65  on Win10..** Whe
0b90: 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20  n compiling for 
0ba0: 57 69 6e 64 6f 77 73 20 31 30 2c 20 61 6c 77 61  Windows 10, alwa
0bb0: 79 73 20 61 73 73 75 6d 65 20 22 6d 69 6e 63 6f  ys assume "minco
0bc0: 72 65 2e 6c 69 62 22 20 69 73 20 69 6e 20 75 73  re.lib" is in us
0bd0: 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
0be0: 4c 49 54 45 5f 57 49 4e 33 32 5f 43 52 45 41 54  LITE_WIN32_CREAT
0bf0: 45 46 49 4c 45 4d 41 50 50 49 4e 47 41 0a 23 20  EFILEMAPPINGA.# 
0c00: 20 69 66 20 64 65 66 69 6e 65 64 28 4e 54 44 44   if defined(NTDD
0c10: 49 5f 56 45 52 53 49 4f 4e 29 20 26 26 20 4e 54  I_VERSION) && NT
0c20: 44 44 49 5f 56 45 52 53 49 4f 4e 20 3e 3d 20 4e  DDI_VERSION >= N
0c30: 54 44 44 49 5f 57 49 4e 54 48 52 45 53 48 4f 4c  TDDI_WINTHRESHOL
0c40: 44 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51  D.#    define SQ
0c50: 4c 49 54 45 5f 57 49 4e 33 32 5f 43 52 45 41 54  LITE_WIN32_CREAT
0c60: 45 46 49 4c 45 4d 41 50 50 49 4e 47 41 20 20 20  EFILEMAPPINGA   
0c70: 30 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  0.#  else.#    d
0c80: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
0c90: 33 32 5f 43 52 45 41 54 45 46 49 4c 45 4d 41 50  32_CREATEFILEMAP
0ca0: 50 49 4e 47 41 20 20 20 31 0a 23 20 20 65 6e 64  PINGA   1.#  end
0cb0: 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  if.#endif../*.**
0cc0: 20 54 68 69 73 20 63 6f 6e 73 74 61 6e 74 20 73   This constant s
0cd0: 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65  hould already be
0ce0: 20 64 65 66 69 6e 65 64 20 28 69 6e 20 74 68 65   defined (in the
0cf0: 20 22 57 69 6e 44 65 66 2e 68 22 20 53 44 4b 20   "WinDef.h" SDK 
0d00: 66 69 6c 65 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65  file)..*/.#ifnde
0d10: 66 20 4d 41 58 5f 50 41 54 48 0a 23 20 20 64 65  f MAX_PATH.#  de
0d20: 66 69 6e 65 20 4d 41 58 5f 50 41 54 48 20 20 20  fine MAX_PATH   
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 20 20 20 28 32 36 30 29 0a 23 65 6e 64 69 66 0a     (260).#endif.
0d50: 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 70  ./*.** Maximum p
0d60: 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68 20 28  athname length (
0d70: 69 6e 20 63 68 61 72 73 29 20 66 6f 72 20 57 69  in chars) for Wi
0d80: 6e 33 32 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  n32.  This shoul
0d90: 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a 2a 2a  d normally be.**
0da0: 20 4d 41 58 5f 50 41 54 48 2e 0a 2a 2f 0a 23 69   MAX_PATH..*/.#i
0db0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
0dc0: 33 32 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41 52  32_MAX_PATH_CHAR
0dd0: 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  S.#  define SQLI
0de0: 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54  TE_WIN32_MAX_PAT
0df0: 48 5f 43 48 41 52 53 20 20 20 28 4d 41 58 5f 50  H_CHARS   (MAX_P
0e00: 41 54 48 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ATH).#endif../*.
0e10: 2a 2a 20 54 68 69 73 20 63 6f 6e 73 74 61 6e 74  ** This constant
0e20: 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
0e30: 62 65 20 64 65 66 69 6e 65 64 20 28 69 6e 20 74  be defined (in t
0e40: 68 65 20 22 57 69 6e 4e 54 2e 68 22 20 53 44 4b  he "WinNT.h" SDK
0e50: 20 66 69 6c 65 29 2e 0a 2a 2f 0a 23 69 66 6e 64   file)..*/.#ifnd
0e60: 65 66 20 55 4e 49 43 4f 44 45 5f 53 54 52 49 4e  ef UNICODE_STRIN
0e70: 47 5f 4d 41 58 5f 43 48 41 52 53 0a 23 20 20 64  G_MAX_CHARS.#  d
0e80: 65 66 69 6e 65 20 55 4e 49 43 4f 44 45 5f 53 54  efine UNICODE_ST
0e90: 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52 53 20 20  RING_MAX_CHARS  
0ea0: 20 20 20 20 28 33 32 37 36 37 29 0a 23 65 6e 64      (32767).#end
0eb0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75  if../*.** Maximu
0ec0: 6d 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74  m pathname lengt
0ed0: 68 20 28 69 6e 20 63 68 61 72 73 29 20 66 6f 72  h (in chars) for
0ee0: 20 57 69 6e 4e 54 2e 20 20 54 68 69 73 20 73 68   WinNT.  This sh
0ef0: 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65  ould normally be
0f00: 0a 2a 2a 20 55 4e 49 43 4f 44 45 5f 53 54 52 49  .** UNICODE_STRI
0f10: 4e 47 5f 4d 41 58 5f 43 48 41 52 53 2e 0a 2a 2f  NG_MAX_CHARS..*/
0f20: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
0f30: 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 43  WINNT_MAX_PATH_C
0f40: 48 41 52 53 0a 23 20 20 64 65 66 69 6e 65 20 53  HARS.#  define S
0f50: 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f  QLITE_WINNT_MAX_
0f60: 50 41 54 48 5f 43 48 41 52 53 20 20 20 28 55 4e  PATH_CHARS   (UN
0f70: 49 43 4f 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58  ICODE_STRING_MAX
0f80: 5f 43 48 41 52 53 29 0a 23 65 6e 64 69 66 0a 0a  _CHARS).#endif..
0f90: 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 70 61  /*.** Maximum pa
0fa0: 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68 20 28 69  thname length (i
0fb0: 6e 20 62 79 74 65 73 29 20 66 6f 72 20 57 69 6e  n bytes) for Win
0fc0: 33 32 2e 20 20 54 68 65 20 4d 41 58 5f 50 41 54  32.  The MAX_PAT
0fd0: 48 20 6d 61 63 72 6f 20 69 73 20 69 6e 0a 2a 2a  H macro is in.**
0fe0: 20 63 68 61 72 61 63 74 65 72 73 2c 20 73 6f 20   characters, so 
0ff0: 77 65 20 61 6c 6c 6f 63 61 74 65 20 34 20 62 79  we allocate 4 by
1000: 74 65 73 20 70 65 72 20 63 68 61 72 61 63 74 65  tes per characte
1010: 72 20 61 73 73 75 6d 69 6e 67 20 77 6f 72 73 74  r assuming worst
1020: 2d 63 61 73 65 20 6f 66 0a 2a 2a 20 34 2d 62 79  -case of.** 4-by
1030: 74 65 73 2d 70 65 72 2d 63 68 61 72 61 63 74 65  tes-per-characte
1040: 72 20 66 6f 72 20 55 54 46 38 2e 0a 2a 2f 0a 23  r for UTF8..*/.#
1050: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
1060: 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54  N32_MAX_PATH_BYT
1070: 45 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  ES.#  define SQL
1080: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41  ITE_WIN32_MAX_PA
1090: 54 48 5f 42 59 54 45 53 20 20 20 28 53 51 4c 49  TH_BYTES   (SQLI
10a0: 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54  TE_WIN32_MAX_PAT
10b0: 48 5f 43 48 41 52 53 2a 34 29 0a 23 65 6e 64 69  H_CHARS*4).#endi
10c0: 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d  f../*.** Maximum
10d0: 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68   pathname length
10e0: 20 28 69 6e 20 62 79 74 65 73 29 20 66 6f 72 20   (in bytes) for 
10f0: 57 69 6e 4e 54 2e 20 20 54 68 69 73 20 73 68 6f  WinNT.  This sho
1100: 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a  uld normally be.
1110: 2a 2a 20 55 4e 49 43 4f 44 45 5f 53 54 52 49 4e  ** UNICODE_STRIN
1120: 47 5f 4d 41 58 5f 43 48 41 52 53 20 2a 20 73 69  G_MAX_CHARS * si
1130: 7a 65 6f 66 28 57 43 48 41 52 29 2e 0a 2a 2f 0a  zeof(WCHAR)..*/.
1140: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
1150: 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42 59  INNT_MAX_PATH_BY
1160: 54 45 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51  TES.#  define SQ
1170: 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50  LITE_WINNT_MAX_P
1180: 41 54 48 5f 42 59 54 45 53 20 20 20 5c 0a 20 20  ATH_BYTES   \.  
1190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a0: 20 20 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f            (sizeo
11b0: 66 28 57 43 48 41 52 29 20 2a 20 53 51 4c 49 54  f(WCHAR) * SQLIT
11c0: 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48  E_WINNT_MAX_PATH
11d0: 5f 43 48 41 52 53 29 0a 23 65 6e 64 69 66 0a 0a  _CHARS).#endif..
11e0: 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 65 72  /*.** Maximum er
11f0: 72 6f 72 20 6d 65 73 73 61 67 65 20 6c 65 6e 67  ror message leng
1200: 74 68 20 28 69 6e 20 63 68 61 72 73 29 20 66 6f  th (in chars) fo
1210: 72 20 57 69 6e 52 54 2e 0a 2a 2f 0a 23 69 66 6e  r WinRT..*/.#ifn
1220: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
1230: 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41 52  _MAX_ERRMSG_CHAR
1240: 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  S.#  define SQLI
1250: 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52  TE_WIN32_MAX_ERR
1260: 4d 53 47 5f 43 48 41 52 53 20 28 31 30 32 34 29  MSG_CHARS (1024)
1270: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
1280: 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20  eturns non-zero 
1290: 69 66 20 74 68 65 20 63 68 61 72 61 63 74 65 72  if the character
12a0: 20 73 68 6f 75 6c 64 20 62 65 20 74 72 65 61 74   should be treat
12b0: 65 64 20 61 73 20 61 20 64 69 72 65 63 74 6f 72  ed as a director
12c0: 79 0a 2a 2a 20 73 65 70 61 72 61 74 6f 72 2e 0a  y.** separator..
12d0: 2a 2f 0a 23 69 66 6e 64 65 66 20 77 69 6e 49 73  */.#ifndef winIs
12e0: 44 69 72 53 65 70 0a 23 20 20 64 65 66 69 6e 65  DirSep.#  define
12f0: 20 77 69 6e 49 73 44 69 72 53 65 70 28 61 29 20   winIsDirSep(a) 
1300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1310: 28 28 61 29 20 3d 3d 20 27 2f 27 29 20 7c 7c 20  ((a) == '/') || 
1320: 28 28 61 29 20 3d 3d 20 27 5c 5c 27 29 29 0a 23  ((a) == '\\')).#
1330: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1340: 73 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20  s macro is used 
1350: 77 68 65 6e 20 61 20 6c 6f 63 61 6c 20 76 61 72  when a local var
1360: 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20  iable is set to 
1370: 61 20 76 61 6c 75 65 20 74 68 61 74 20 69 73 0a  a value that is.
1380: 2a 2a 20 5b 73 6f 6d 65 74 69 6d 65 73 5d 20 6e  ** [sometimes] n
1390: 6f 74 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ot used by the c
13a0: 6f 64 65 20 28 65 2e 67 2e 20 76 69 61 20 63 6f  ode (e.g. via co
13b0: 6e 64 69 74 69 6f 6e 61 6c 20 63 6f 6d 70 69 6c  nditional compil
13c0: 61 74 69 6f 6e 29 2e 0a 2a 2f 0a 23 69 66 6e 64  ation)..*/.#ifnd
13d0: 65 66 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42  ef UNUSED_VARIAB
13e0: 4c 45 5f 56 41 4c 55 45 0a 23 20 20 64 65 66 69  LE_VALUE.#  defi
13f0: 6e 65 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42  ne UNUSED_VARIAB
1400: 4c 45 5f 56 41 4c 55 45 28 78 29 20 20 20 20 20  LE_VALUE(x)     
1410: 20 28 76 6f 69 64 29 28 78 29 0a 23 65 6e 64 69   (void)(x).#endi
1420: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73  f../*.** Returns
1430: 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20 74   the character t
1440: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
1450: 65 64 20 61 73 20 74 68 65 20 64 69 72 65 63 74  ed as the direct
1460: 6f 72 79 20 73 65 70 61 72 61 74 6f 72 2e 0a 2a  ory separator..*
1470: 2f 0a 23 69 66 6e 64 65 66 20 77 69 6e 47 65 74  /.#ifndef winGet
1480: 44 69 72 53 65 70 0a 23 20 20 64 65 66 69 6e 65  DirSep.#  define
1490: 20 77 69 6e 47 65 74 44 69 72 53 65 70 28 29 20   winGetDirSep() 
14a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 27                 '
14b0: 5c 5c 27 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  \\'.#endif../*.*
14c0: 2a 20 44 6f 20 77 65 20 6e 65 65 64 20 74 6f 20  * Do we need to 
14d0: 6d 61 6e 75 61 6c 6c 79 20 64 65 66 69 6e 65 20  manually define 
14e0: 74 68 65 20 57 69 6e 33 32 20 66 69 6c 65 20 6d  the Win32 file m
14f0: 61 70 70 69 6e 67 20 41 50 49 73 20 66 6f 72 20  apping APIs for 
1500: 75 73 65 20 77 69 74 68 20 57 41 4c 0a 2a 2a 20  use with WAL.** 
1510: 6d 6f 64 65 20 6f 72 20 6d 65 6d 6f 72 79 20 6d  mode or memory m
1520: 61 70 70 65 64 20 66 69 6c 65 73 20 28 65 2e 67  apped files (e.g
1530: 2e 20 74 68 65 73 65 20 41 50 49 73 20 61 72 65  . these APIs are
1540: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68   available in th
1550: 65 20 57 69 6e 64 6f 77 73 0a 2a 2a 20 43 45 20  e Windows.** CE 
1560: 53 44 4b 3b 20 68 6f 77 65 76 65 72 2c 20 74 68  SDK; however, th
1570: 65 79 20 61 72 65 20 6e 6f 74 20 70 72 65 73 65  ey are not prese
1580: 6e 74 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  nt in the header
1590: 20 66 69 6c 65 29 3f 0a 2a 2f 0a 23 69 66 20 53   file)?.*/.#if S
15a0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 46 49 4c 45  QLITE_WIN32_FILE
15b0: 4d 41 50 50 49 4e 47 5f 41 50 49 20 26 26 20 5c  MAPPING_API && \
15c0: 0a 20 20 20 20 20 20 20 20 28 21 64 65 66 69 6e  .        (!defin
15d0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
15e0: 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  AL) || SQLITE_MA
15f0: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 29 0a 2f  X_MMAP_SIZE>0)./
1600: 2a 0a 2a 2a 20 54 77 6f 20 6f 66 20 74 68 65 20  *.** Two of the 
1610: 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 41 50 49  file mapping API
1620: 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 20  s are different 
1630: 75 6e 64 65 72 20 57 69 6e 52 54 2e 20 20 46 69  under WinRT.  Fi
1640: 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 0a 2a  gure out which.*
1650: 2a 20 73 65 74 20 77 65 20 6e 65 65 64 2e 0a 2a  * set we need..*
1660: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
1670: 57 49 4e 52 54 0a 57 49 4e 42 41 53 45 41 50 49  WINRT.WINBASEAPI
1680: 20 48 41 4e 44 4c 45 20 57 49 4e 41 50 49 20 43   HANDLE WINAPI C
1690: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
16a0: 46 72 6f 6d 41 70 70 28 48 41 4e 44 4c 45 2c 20  FromApp(HANDLE, 
16b0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43 55  \.        LPSECU
16c0: 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c  RITY_ATTRIBUTES,
16d0: 20 55 4c 4f 4e 47 2c 20 55 4c 4f 4e 47 36 34 2c   ULONG, ULONG64,
16e0: 20 4c 50 43 57 53 54 52 29 3b 0a 0a 57 49 4e 42   LPCWSTR);..WINB
16f0: 41 53 45 41 50 49 20 4c 50 56 4f 49 44 20 57 49  ASEAPI LPVOID WI
1700: 4e 41 50 49 20 4d 61 70 56 69 65 77 4f 66 46 69  NAPI MapViewOfFi
1710: 6c 65 46 72 6f 6d 41 70 70 28 48 41 4e 44 4c 45  leFromApp(HANDLE
1720: 2c 20 55 4c 4f 4e 47 2c 20 55 4c 4f 4e 47 36 34  , ULONG, ULONG64
1730: 2c 20 53 49 5a 45 5f 54 29 3b 0a 23 65 6c 73 65  , SIZE_T);.#else
1740: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1750: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
1760: 53 49 29 0a 57 49 4e 42 41 53 45 41 50 49 20 48  SI).WINBASEAPI H
1770: 41 4e 44 4c 45 20 57 49 4e 41 50 49 20 43 72 65  ANDLE WINAPI Cre
1780: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 28  ateFileMappingA(
1790: 48 41 4e 44 4c 45 2c 20 4c 50 53 45 43 55 52 49  HANDLE, LPSECURI
17a0: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c  TY_ATTRIBUTES, \
17b0: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 20  .        DWORD, 
17c0: 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 4c 50  DWORD, DWORD, LP
17d0: 43 53 54 52 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  CSTR);.#endif /*
17e0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
17f0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20  WIN32_HAS_ANSI) 
1800: 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  */..#if defined(
1810: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
1820: 5f 57 49 44 45 29 0a 57 49 4e 42 41 53 45 41 50  _WIDE).WINBASEAP
1830: 49 20 48 41 4e 44 4c 45 20 57 49 4e 41 50 49 20  I HANDLE WINAPI 
1840: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
1850: 67 57 28 48 41 4e 44 4c 45 2c 20 4c 50 53 45 43  gW(HANDLE, LPSEC
1860: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
1870: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
1880: 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c  D, DWORD, DWORD,
1890: 20 4c 50 43 57 53 54 52 29 3b 0a 23 65 6e 64 69   LPCWSTR);.#endi
18a0: 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c  f /* defined(SQL
18b0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
18c0: 44 45 29 20 2a 2f 0a 0a 57 49 4e 42 41 53 45 41  DE) */..WINBASEA
18d0: 50 49 20 4c 50 56 4f 49 44 20 57 49 4e 41 50 49  PI LPVOID WINAPI
18e0: 20 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 48   MapViewOfFile(H
18f0: 41 4e 44 4c 45 2c 20 44 57 4f 52 44 2c 20 44 57  ANDLE, DWORD, DW
1900: 4f 52 44 2c 20 44 57 4f 52 44 2c 20 53 49 5a 45  ORD, DWORD, SIZE
1910: 5f 54 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  _T);.#endif /* S
1920: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 2a  QLITE_OS_WINRT *
1930: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 66  /../*.** These f
1940: 69 6c 65 20 6d 61 70 70 69 6e 67 20 41 50 49 73  ile mapping APIs
1950: 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20 62   are common to b
1960: 6f 74 68 20 57 69 6e 33 32 20 61 6e 64 20 57 69  oth Win32 and Wi
1970: 6e 52 54 2e 0a 2a 2f 0a 0a 57 49 4e 42 41 53 45  nRT..*/..WINBASE
1980: 41 50 49 20 42 4f 4f 4c 20 57 49 4e 41 50 49 20  API BOOL WINAPI 
1990: 46 6c 75 73 68 56 69 65 77 4f 66 46 69 6c 65 28  FlushViewOfFile(
19a0: 4c 50 43 56 4f 49 44 2c 20 53 49 5a 45 5f 54 29  LPCVOID, SIZE_T)
19b0: 3b 0a 57 49 4e 42 41 53 45 41 50 49 20 42 4f 4f  ;.WINBASEAPI BOO
19c0: 4c 20 57 49 4e 41 50 49 20 55 6e 6d 61 70 56 69  L WINAPI UnmapVi
19d0: 65 77 4f 66 46 69 6c 65 28 4c 50 43 56 4f 49 44  ewOfFile(LPCVOID
19e0: 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
19f0: 49 54 45 5f 57 49 4e 33 32 5f 46 49 4c 45 4d 41  ITE_WIN32_FILEMA
1a00: 50 50 49 4e 47 5f 41 50 49 20 2a 2f 0a 0a 2f 2a  PPING_API */../*
1a10: 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63 72 6f 73 6f  .** Some Microso
1a20: 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63  ft compilers lac
1a30: 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74 69 6f  k this definitio
1a40: 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e  n..*/.#ifndef IN
1a50: 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
1a60: 42 55 54 45 53 0a 23 20 64 65 66 69 6e 65 20 49  BUTES.# define I
1a70: 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
1a80: 49 42 55 54 45 53 20 28 28 44 57 4f 52 44 29 2d  IBUTES ((DWORD)-
1a90: 31 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  1).#endif..#ifnd
1aa0: 65 66 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53  ef FILE_FLAG_MAS
1ab0: 4b 0a 23 20 64 65 66 69 6e 65 20 46 49 4c 45 5f  K.# define FILE_
1ac0: 46 4c 41 47 5f 4d 41 53 4b 20 20 20 20 20 20 20  FLAG_MASK       
1ad0: 20 20 20 28 30 78 46 46 33 43 30 30 30 30 29 0a     (0xFF3C0000).
1ae0: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
1af0: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4d  FILE_ATTRIBUTE_M
1b00: 41 53 4b 0a 23 20 64 65 66 69 6e 65 20 46 49 4c  ASK.# define FIL
1b10: 45 5f 41 54 54 52 49 42 55 54 45 5f 4d 41 53 4b  E_ATTRIBUTE_MASK
1b20: 20 20 20 20 20 28 30 78 30 30 30 33 46 46 46 37       (0x0003FFF7
1b30: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ).#endif..#ifnde
1b40: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
1b50: 4c 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  L./* Forward ref
1b60: 65 72 65 6e 63 65 73 20 74 6f 20 73 74 72 75 63  erences to struc
1b70: 74 75 72 65 73 20 75 73 65 64 20 66 6f 72 20 57  tures used for W
1b80: 41 4c 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  AL */.typedef st
1b90: 72 75 63 74 20 77 69 6e 53 68 6d 20 77 69 6e 53  ruct winShm winS
1ba0: 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  hm;           /*
1bb0: 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   A connection to
1bc0: 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a   shared-memory *
1bd0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1be0: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 77 69 6e 53   winShmNode winS
1bf0: 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 41 20 72  hmNode;   /* A r
1c00: 65 67 69 6f 6e 20 6f 66 20 73 68 61 72 65 64 2d  egion of shared-
1c10: 6d 65 6d 6f 72 79 20 2a 2f 0a 23 65 6e 64 69 66  memory */.#endif
1c20: 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 43 45 20 6c 61  ../*.** WinCE la
1c30: 63 6b 73 20 6e 61 74 69 76 65 20 73 75 70 70 6f  cks native suppo
1c40: 72 74 20 66 6f 72 20 66 69 6c 65 20 6c 6f 63 6b  rt for file lock
1c50: 69 6e 67 20 73 6f 20 77 65 20 68 61 76 65 20 74  ing so we have t
1c60: 6f 20 66 61 6b 65 20 69 74 0a 2a 2a 20 77 69 74  o fake it.** wit
1c70: 68 20 73 6f 6d 65 20 63 6f 64 65 20 6f 66 20 6f  h some code of o
1c80: 75 72 20 6f 77 6e 2e 0a 2a 2f 0a 23 69 66 20 53  ur own..*/.#if S
1c90: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 74  QLITE_OS_WINCE.t
1ca0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77 69  ypedef struct wi
1cb0: 6e 63 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e 74 20  nceLock {.  int 
1cc0: 6e 52 65 61 64 65 72 73 3b 20 20 20 20 20 20 20  nReaders;       
1cd0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 61  /* Number of rea
1ce0: 64 65 72 20 6c 6f 63 6b 73 20 6f 62 74 61 69 6e  der locks obtain
1cf0: 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 50 65  ed */.  BOOL bPe
1d00: 6e 64 69 6e 67 3b 20 20 20 20 20 20 2f 2a 20 49  nding;      /* I
1d10: 6e 64 69 63 61 74 65 73 20 61 20 70 65 6e 64 69  ndicates a pendi
1d20: 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  ng lock has been
1d30: 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42   obtained */.  B
1d40: 4f 4f 4c 20 62 52 65 73 65 72 76 65 64 3b 20 20  OOL bReserved;  
1d50: 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65 73 20     /* Indicates 
1d60: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  a reserved lock 
1d70: 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  has been obtaine
1d80: 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 45 78 63  d */.  BOOL bExc
1d90: 6c 75 73 69 76 65 3b 20 20 20 20 2f 2a 20 49 6e  lusive;    /* In
1da0: 64 69 63 61 74 65 73 20 61 6e 20 65 78 63 6c 75  dicates an exclu
1db0: 73 69 76 65 20 6c 6f 63 6b 20 68 61 73 20 62 65  sive lock has be
1dc0: 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 7d  en obtained */.}
1dd0: 20 77 69 6e 63 65 4c 6f 63 6b 3b 0a 23 65 6e 64   winceLock;.#end
1de0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 69  if../*.** The wi
1df0: 6e 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20  nFile structure 
1e00: 69 73 20 61 20 73 75 62 63 6c 61 73 73 20 6f 66  is a subclass of
1e10: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 20 73   sqlite3_file* s
1e20: 70 65 63 69 66 69 63 20 74 6f 20 74 68 65 20 77  pecific to the w
1e30: 69 6e 33 32 0a 2a 2a 20 70 6f 72 74 61 62 69 6c  in32.** portabil
1e40: 69 74 79 20 6c 61 79 65 72 2e 0a 2a 2f 0a 74 79  ity layer..*/.ty
1e50: 70 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e  pedef struct win
1e60: 46 69 6c 65 20 77 69 6e 46 69 6c 65 3b 0a 73 74  File winFile;.st
1e70: 72 75 63 74 20 77 69 6e 46 69 6c 65 20 7b 0a 20  ruct winFile {. 
1e80: 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
1e90: 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68  o_methods *pMeth
1ea0: 6f 64 3b 20 2f 2a 2a 2a 20 4d 75 73 74 20 62 65  od; /*** Must be
1eb0: 20 66 69 72 73 74 20 2a 2a 2a 2f 0a 20 20 73 71   first ***/.  sq
1ec0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b  lite3_vfs *pVfs;
1ed0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
1ee0: 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68   used to open th
1ef0: 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 48 41 4e  is file */.  HAN
1f00: 44 4c 45 20 68 3b 20 20 20 20 20 20 20 20 20 20  DLE h;          
1f10: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
1f20: 6f 72 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  or accessing the
1f30: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6c 6f   file */.  u8 lo
1f40: 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20 20 20  cktype;         
1f50: 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 6c 6f     /* Type of lo
1f60: 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  ck currently hel
1f70: 64 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a  d on this file *
1f80: 2f 0a 20 20 73 68 6f 72 74 20 73 68 61 72 65 64  /.  short shared
1f90: 4c 6f 63 6b 42 79 74 65 3b 20 20 20 2f 2a 20 52  LockByte;   /* R
1fa0: 61 6e 64 6f 6d 6c 79 20 63 68 6f 73 65 6e 20 62  andomly chosen b
1fb0: 79 74 65 20 75 73 65 64 20 61 73 20 61 20 73 68  yte used as a sh
1fc0: 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75  ared lock */.  u
1fd0: 38 20 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20  8 ctrlFlags;    
1fe0: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 2e         /* Flags.
1ff0: 20 20 53 65 65 20 57 49 4e 46 49 4c 45 5f 2a 20    See WINFILE_* 
2000: 62 65 6c 6f 77 20 2a 2f 0a 20 20 44 57 4f 52 44  below */.  DWORD
2010: 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20   lastErrno;     
2020: 20 20 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77     /* The Window
2030: 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65  s errno from the
2040: 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20   last I/O error 
2050: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2060: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 77 69 6e  E_OMIT_WAL.  win
2070: 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20  Shm *pShm;      
2080: 20 20 20 20 20 2f 2a 20 49 6e 73 74 61 6e 63 65       /* Instance
2090: 20 6f 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   of shared memor
20a0: 79 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a  y on this file *
20b0: 2f 0a 23 65 6e 64 69 66 0a 20 20 63 6f 6e 73 74  /.#endif.  const
20c0: 20 63 68 61 72 20 2a 7a 50 61 74 68 3b 20 20 20   char *zPath;   
20d0: 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 6e     /* Full pathn
20e0: 61 6d 65 20 6f 66 20 74 68 69 73 20 66 69 6c 65  ame of this file
20f0: 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 43 68 75 6e   */.  int szChun
2100: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k;            /*
2110: 20 43 68 75 6e 6b 20 73 69 7a 65 20 63 6f 6e 66   Chunk size conf
2120: 69 67 75 72 65 64 20 62 79 20 46 43 4e 54 4c 5f  igured by FCNTL_
2130: 43 48 55 4e 4b 5f 53 49 5a 45 20 2a 2f 0a 23 69  CHUNK_SIZE */.#i
2140: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
2150: 45 0a 20 20 4c 50 57 53 54 52 20 7a 44 65 6c 65  E.  LPWSTR zDele
2160: 74 65 4f 6e 43 6c 6f 73 65 3b 20 20 2f 2a 20 4e  teOnClose;  /* N
2170: 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 64  ame of file to d
2180: 65 6c 65 74 65 20 77 68 65 6e 20 63 6c 6f 73 69  elete when closi
2190: 6e 67 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68  ng */.  HANDLE h
21a0: 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20  Mutex;          
21b0: 2f 2a 20 4d 75 74 65 78 20 75 73 65 64 20 74 6f  /* Mutex used to
21c0: 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20   control access 
21d0: 74 6f 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a  to shared lock *
21e0: 2f 0a 20 20 48 41 4e 44 4c 45 20 68 53 68 61 72  /.  HANDLE hShar
21f0: 65 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ed;         /* S
2200: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 73 65 67  hared memory seg
2210: 6d 65 6e 74 20 75 73 65 64 20 66 6f 72 20 6c 6f  ment used for lo
2220: 63 6b 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65  cking */.  wince
2230: 4c 6f 63 6b 20 6c 6f 63 61 6c 3b 20 20 20 20 20  Lock local;     
2240: 20 20 20 2f 2a 20 4c 6f 63 6b 73 20 6f 62 74 61     /* Locks obta
2250: 69 6e 65 64 20 62 79 20 74 68 69 73 20 69 6e 73  ined by this ins
2260: 74 61 6e 63 65 20 6f 66 20 77 69 6e 46 69 6c 65  tance of winFile
2270: 20 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20   */.  winceLock 
2280: 2a 73 68 61 72 65 64 3b 20 20 20 20 20 20 2f 2a  *shared;      /*
2290: 20 47 6c 6f 62 61 6c 20 73 68 61 72 65 64 20 6c   Global shared l
22a0: 6f 63 6b 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74  ock memory for t
22b0: 68 65 20 66 69 6c 65 20 20 2a 2f 0a 23 65 6e 64  he file  */.#end
22c0: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
22d0: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
22e0: 69 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b 20 20  int nFetchOut;  
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2300: 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74   Number of outst
2310: 61 6e 64 69 6e 67 20 78 46 65 74 63 68 20 72 65  anding xFetch re
2320: 66 65 72 65 6e 63 65 73 20 2a 2f 0a 20 20 48 41  ferences */.  HA
2330: 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20 20 20 20  NDLE hMap;      
2340: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
2350: 61 6e 64 6c 65 20 66 6f 72 20 61 63 63 65 73 73  andle for access
2360: 69 6e 67 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69  ing memory mappi
2370: 6e 67 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 4d  ng */.  void *pM
2380: 61 70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20  apRegion;       
2390: 20 20 20 20 20 20 2f 2a 20 41 72 65 61 20 6d 65        /* Area me
23a0: 6d 6f 72 79 20 6d 61 70 70 65 64 20 2a 2f 0a 20  mory mapped */. 
23b0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d   sqlite3_int64 m
23c0: 6d 61 70 53 69 7a 65 3b 20 20 20 20 20 20 20 2f  mapSize;       /
23d0: 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66  * Usable size of
23e0: 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20 2a   mapped region *
23f0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
2400: 34 20 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  4 mmapSizeActual
2410: 3b 20 2f 2a 20 41 63 74 75 61 6c 20 73 69 7a 65  ; /* Actual size
2420: 20 6f 66 20 6d 61 70 70 65 64 20 72 65 67 69 6f   of mapped regio
2430: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  n */.  sqlite3_i
2440: 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 4d 61 78  nt64 mmapSizeMax
2450: 3b 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72  ;    /* Configur
2460: 65 64 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49  ed FCNTL_MMAP_SI
2470: 5a 45 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64  ZE value */.#end
2480: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  if.};../*.** The
2490: 20 77 69 6e 56 66 73 41 70 70 44 61 74 61 20 73   winVfsAppData s
24a0: 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64  tructure is used
24b0: 20 66 6f 72 20 74 68 65 20 70 41 70 70 44 61 74   for the pAppDat
24c0: 61 20 6d 65 6d 62 65 72 20 66 6f 72 20 61 6c 6c  a member for all
24d0: 20 6f 66 20 74 68 65 0a 2a 2a 20 57 69 6e 33 32   of the.** Win32
24e0: 20 56 46 53 20 76 61 72 69 61 6e 74 73 2e 0a 2a   VFS variants..*
24f0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
2500: 20 77 69 6e 56 66 73 41 70 70 44 61 74 61 20 77   winVfsAppData w
2510: 69 6e 56 66 73 41 70 70 44 61 74 61 3b 0a 73 74  inVfsAppData;.st
2520: 72 75 63 74 20 77 69 6e 56 66 73 41 70 70 44 61  ruct winVfsAppDa
2530: 74 61 20 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c  ta {.  const sql
2540: 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2550: 2a 70 4d 65 74 68 6f 64 3b 20 2f 2a 20 54 68 65  *pMethod; /* The
2560: 20 66 69 6c 65 20 49 2f 4f 20 6d 65 74 68 6f 64   file I/O method
2570: 73 20 74 6f 20 75 73 65 2e 20 2a 2f 0a 20 20 76  s to use. */.  v
2580: 6f 69 64 20 2a 70 41 70 70 44 61 74 61 3b 20 20  oid *pAppData;  
2590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a0: 20 20 2f 2a 20 54 68 65 20 65 78 74 72 61 20 70    /* The extra p
25b0: 41 70 70 44 61 74 61 2c 20 69 66 20 61 6e 79 2e  AppData, if any.
25c0: 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 4e 6f 4c 6f   */.  BOOL bNoLo
25d0: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
25e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d           /* Non-
25f0: 7a 65 72 6f 20 69 66 20 6c 6f 63 6b 69 6e 67 20  zero if locking 
2600: 69 73 20 64 69 73 61 62 6c 65 64 2e 20 2a 2f 0a  is disabled. */.
2610: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65  };../*.** Allowe
2620: 64 20 76 61 6c 75 65 73 20 66 6f 72 20 77 69 6e  d values for win
2630: 46 69 6c 65 2e 63 74 72 6c 46 6c 61 67 73 0a 2a  File.ctrlFlags.*
2640: 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49 4c  /.#define WINFIL
2650: 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20 20 20 20  E_RDONLY        
2660: 20 20 30 78 30 32 20 20 20 2f 2a 20 43 6f 6e 6e    0x02   /* Conn
2670: 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 20 6f  ection is read o
2680: 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  nly */.#define W
2690: 49 4e 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57  INFILE_PERSIST_W
26a0: 41 4c 20 20 20 20 20 30 78 30 34 20 20 20 2f 2a  AL     0x04   /*
26b0: 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c 20   Persistent WAL 
26c0: 6d 6f 64 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  mode */.#define 
26d0: 57 49 4e 46 49 4c 45 5f 50 53 4f 57 20 20 20 20  WINFILE_PSOW    
26e0: 20 20 20 20 20 20 20 20 30 78 31 30 20 20 20 2f          0x10   /
26f0: 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50  * SQLITE_IOCAP_P
2700: 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
2710: 54 45 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 54 68 65  TE */../*. * The
2720: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66   size of the buf
2730: 66 65 72 20 75 73 65 64 20 62 79 20 73 71 6c 69  fer used by sqli
2740: 74 65 33 5f 77 69 6e 33 32 5f 77 72 69 74 65 5f  te3_win32_write_
2750: 64 65 62 75 67 28 29 2e 0a 20 2a 2f 0a 23 69 66  debug().. */.#if
2760: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
2770: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 0a 23  2_DBG_BUF_SIZE.#
2780: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
2790: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
27a0: 5a 45 20 20 20 28 28 69 6e 74 29 28 34 30 39 36  ZE   ((int)(4096
27b0: 2d 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 29 29  -sizeof(DWORD)))
27c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54  .#endif../*. * T
27d0: 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 77 69  he value used wi
27e0: 74 68 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  th sqlite3_win32
27f0: 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 29  _set_directory()
2800: 20 74 6f 20 73 70 65 63 69 66 79 20 74 68 61 74   to specify that
2810: 0a 20 2a 20 74 68 65 20 64 61 74 61 20 64 69 72  . * the data dir
2820: 65 63 74 6f 72 79 20 73 68 6f 75 6c 64 20 62 65  ectory should be
2830: 20 63 68 61 6e 67 65 64 2e 0a 20 2a 2f 0a 23 69   changed.. */.#i
2840: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
2850: 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52  32_DATA_DIRECTOR
2860: 59 5f 54 59 50 45 0a 23 20 20 64 65 66 69 6e 65  Y_TYPE.#  define
2870: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41   SQLITE_WIN32_DA
2880: 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50  TA_DIRECTORY_TYP
2890: 45 20 28 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  E (1).#endif../*
28a0: 0a 20 2a 20 54 68 65 20 76 61 6c 75 65 20 75 73  . * The value us
28b0: 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 5f  ed with sqlite3_
28c0: 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
28d0: 6f 72 79 28 29 20 74 6f 20 73 70 65 63 69 66 79  ory() to specify
28e0: 20 74 68 61 74 0a 20 2a 20 74 68 65 20 74 65 6d   that. * the tem
28f0: 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79  porary directory
2900: 20 73 68 6f 75 6c 64 20 62 65 20 63 68 61 6e 67   should be chang
2910: 65 64 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ed.. */.#ifndef 
2920: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d  SQLITE_WIN32_TEM
2930: 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  P_DIRECTORY_TYPE
2940: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
2950: 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52  E_WIN32_TEMP_DIR
2960: 45 43 54 4f 52 59 5f 54 59 50 45 20 28 32 29 0a  ECTORY_TYPE (2).
2970: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 49 66  #endif../*. * If
2980: 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53   compiled with S
2990: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
29a0: 4f 43 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20 77  OC on Windows, w
29b0: 65 20 77 69 6c 6c 20 75 73 65 20 74 68 65 0a 20  e will use the. 
29c0: 2a 20 76 61 72 69 6f 75 73 20 57 69 6e 33 32 20  * various Win32 
29d0: 41 50 49 20 68 65 61 70 20 66 75 6e 63 74 69 6f  API heap functio
29e0: 6e 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 75  ns instead of ou
29f0: 72 20 6f 77 6e 2e 0a 20 2a 2f 0a 23 69 66 64 65  r own.. */.#ifde
2a00: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  f SQLITE_WIN32_M
2a10: 41 4c 4c 4f 43 0a 0a 2f 2a 0a 20 2a 20 49 66 20  ALLOC../*. * If 
2a20: 74 68 69 73 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  this is non-zero
2a30: 2c 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 68 65  , an isolated he
2a40: 61 70 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74  ap will be creat
2a50: 65 64 20 62 79 20 74 68 65 20 6e 61 74 69 76 65  ed by the native
2a60: 20 57 69 6e 33 32 0a 20 2a 20 61 6c 6c 6f 63 61   Win32. * alloca
2a70: 74 6f 72 20 73 75 62 73 79 73 74 65 6d 3b 20 6f  tor subsystem; o
2a80: 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 64 65  therwise, the de
2a90: 66 61 75 6c 74 20 70 72 6f 63 65 73 73 20 68 65  fault process he
2aa0: 61 70 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2e  ap will be used.
2ab0: 20 20 54 68 69 73 0a 20 2a 20 73 65 74 74 69 6e    This. * settin
2ac0: 67 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20  g has no effect 
2ad0: 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 66  when compiling f
2ae0: 6f 72 20 57 69 6e 52 54 2e 20 20 42 79 20 64 65  or WinRT.  By de
2af0: 66 61 75 6c 74 2c 20 74 68 69 73 20 69 73 20 65  fault, this is e
2b00: 6e 61 62 6c 65 64 0a 20 2a 20 61 6e 64 20 61 6e  nabled. * and an
2b10: 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77   isolated heap w
2b20: 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 74  ill be created t
2b30: 6f 20 73 74 6f 72 65 20 61 6c 6c 20 61 6c 6c 6f  o store all allo
2b40: 63 61 74 65 64 20 64 61 74 61 2e 0a 20 2a 0a 20  cated data.. *. 
2b50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20  **************. 
2ba0: 2a 20 57 41 52 4e 49 4e 47 3a 20 49 74 20 69 73  * WARNING: It is
2bb0: 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f   important to no
2bc0: 74 65 20 74 68 61 74 20 77 68 65 6e 20 74 68 69  te that when thi
2bd0: 73 20 73 65 74 74 69 6e 67 20 69 73 20 6e 6f 6e  s setting is non
2be0: 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 0a 20 2a  -zero and the. *
2bf0: 20 20 20 20 20 20 20 20 20 20 77 69 6e 4d 65 6d            winMem
2c00: 53 68 75 74 64 6f 77 6e 20 66 75 6e 63 74 69 6f  Shutdown functio
2c10: 6e 20 69 73 20 63 61 6c 6c 65 64 20 28 65 2e 67  n is called (e.g
2c20: 2e 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  . by the sqlite3
2c30: 5f 73 68 75 74 64 6f 77 6e 0a 20 2a 20 20 20 20  _shutdown. *    
2c40: 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 29 2c        function),
2c50: 20 61 6c 6c 20 64 61 74 61 20 74 68 61 74 20 77   all data that w
2c60: 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69  as allocated usi
2c70: 6e 67 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20  ng the isolated 
2c80: 68 65 61 70 20 77 69 6c 6c 0a 20 2a 20 20 20 20  heap will. *    
2c90: 20 20 20 20 20 20 62 65 20 66 72 65 65 64 20 69        be freed i
2ca0: 6d 6d 65 64 69 61 74 65 6c 79 20 61 6e 64 20 61  mmediately and a
2cb0: 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63  ny attempt to ac
2cc0: 63 65 73 73 20 61 6e 79 20 6f 66 20 74 68 61 74  cess any of that
2cd0: 20 66 72 65 65 64 0a 20 2a 20 20 20 20 20 20 20   freed. *       
2ce0: 20 20 20 64 61 74 61 20 77 69 6c 6c 20 61 6c 6d     data will alm
2cf0: 6f 73 74 20 63 65 72 74 61 69 6e 6c 79 20 72 65  ost certainly re
2d00: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6d 6d 65 64  sult in an immed
2d10: 69 61 74 65 20 61 63 63 65 73 73 20 76 69 6f 6c  iate access viol
2d20: 61 74 69 6f 6e 2e 0a 20 2a 2a 2a 2a 2a 2a 2a 2a  ation.. ********
2d30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d70: 2a 2a 2a 2a 2a 2a 0a 20 2a 2f 0a 23 69 66 6e 64  ******. */.#ifnd
2d80: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
2d90: 48 45 41 50 5f 43 52 45 41 54 45 0a 23 20 20 64  HEAP_CREATE.#  d
2da0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
2db0: 33 32 5f 48 45 41 50 5f 43 52 45 41 54 45 20 20  32_HEAP_CREATE  
2dc0: 20 20 28 54 52 55 45 29 0a 23 65 6e 64 69 66 0a    (TRUE).#endif.
2dd0: 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 69 73 20 63  ./*. * This is c
2de0: 61 63 68 65 20 73 69 7a 65 20 75 73 65 64 20 69  ache size used i
2df0: 6e 20 74 68 65 20 63 61 6c 63 75 6c 61 74 69 6f  n the calculatio
2e00: 6e 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c  n of the initial
2e10: 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 20 2a 20   size of the. * 
2e20: 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63 20 68  Win32-specific h
2e30: 65 61 70 2e 20 20 49 74 20 63 61 6e 6e 6f 74 20  eap.  It cannot 
2e40: 62 65 20 6e 65 67 61 74 69 76 65 2e 0a 20 2a 2f  be negative.. */
2e50: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2e60: 57 49 4e 33 32 5f 43 41 43 48 45 5f 53 49 5a 45  WIN32_CACHE_SIZE
2e70: 0a 23 20 20 69 66 20 53 51 4c 49 54 45 5f 44 45  .#  if SQLITE_DE
2e80: 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45  FAULT_CACHE_SIZE
2e90: 3e 3d 30 0a 23 20 20 20 20 64 65 66 69 6e 65 20  >=0.#    define 
2ea0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 43 41 43  SQLITE_WIN32_CAC
2eb0: 48 45 5f 53 49 5a 45 20 28 53 51 4c 49 54 45 5f  HE_SIZE (SQLITE_
2ec0: 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49  DEFAULT_CACHE_SI
2ed0: 5a 45 29 0a 23 20 20 65 6c 73 65 0a 23 20 20 20  ZE).#  else.#   
2ee0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
2ef0: 49 4e 33 32 5f 43 41 43 48 45 5f 53 49 5a 45 20  IN32_CACHE_SIZE 
2f00: 28 2d 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  (-(SQLITE_DEFAUL
2f10: 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 29 0a 23  T_CACHE_SIZE)).#
2f20: 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a    endif.#endif..
2f30: 2f 2a 0a 20 2a 20 54 68 65 20 69 6e 69 74 69 61  /*. * The initia
2f40: 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 57 69  l size of the Wi
2f50: 6e 33 32 2d 73 70 65 63 69 66 69 63 20 68 65 61  n32-specific hea
2f60: 70 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d  p.  This value m
2f70: 61 79 20 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a  ay be zero.. */.
2f80: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
2f90: 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53  IN32_HEAP_INIT_S
2fa0: 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51  IZE.#  define SQ
2fb0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
2fc0: 49 4e 49 54 5f 53 49 5a 45 20 28 28 53 51 4c 49  INIT_SIZE ((SQLI
2fd0: 54 45 5f 57 49 4e 33 32 5f 43 41 43 48 45 5f 53  TE_WIN32_CACHE_S
2fe0: 49 5a 45 29 20 2a 20 5c 0a 20 20 20 20 20 20 20  IZE) * \.       
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3010: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
3020: 50 41 47 45 5f 53 49 5a 45 29 20 2b 20 34 31 39  PAGE_SIZE) + 419
3030: 34 33 30 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  4304).#endif../*
3040: 0a 20 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  . * The maximum 
3050: 73 69 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33  size of the Win3
3060: 32 2d 73 70 65 63 69 66 69 63 20 68 65 61 70 2e  2-specific heap.
3070: 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79    This value may
3080: 20 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69   be zero.. */.#i
3090: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
30a0: 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45  32_HEAP_MAX_SIZE
30b0: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
30c0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58  E_WIN32_HEAP_MAX
30d0: 5f 53 49 5a 45 20 20 28 30 29 0a 23 65 6e 64 69  _SIZE  (0).#endi
30e0: 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 65 78 74  f../*. * The ext
30f0: 72 61 20 66 6c 61 67 73 20 74 6f 20 75 73 65 20  ra flags to use 
3100: 69 6e 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 20  in calls to the 
3110: 57 69 6e 33 32 20 68 65 61 70 20 41 50 49 73 2e  Win32 heap APIs.
3120: 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79    This value may
3130: 20 62 65 0a 20 2a 20 7a 65 72 6f 20 66 6f 72 20   be. * zero for 
3140: 74 68 65 20 64 65 66 61 75 6c 74 20 62 65 68 61  the default beha
3150: 76 69 6f 72 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65  vior.. */.#ifnde
3160: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
3170: 45 41 50 5f 46 4c 41 47 53 0a 23 20 20 64 65 66  EAP_FLAGS.#  def
3180: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
3190: 5f 48 45 41 50 5f 46 4c 41 47 53 20 20 20 20 20  _HEAP_FLAGS     
31a0: 28 30 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  (0).#endif.../*.
31b0: 2a 2a 20 54 68 65 20 77 69 6e 4d 65 6d 44 61 74  ** The winMemDat
31c0: 61 20 73 74 72 75 63 74 75 72 65 20 73 74 6f 72  a structure stor
31d0: 65 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 72  es information r
31e0: 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 57  equired by the W
31f0: 69 6e 33 32 2d 73 70 65 63 69 66 69 63 0a 2a 2a  in32-specific.**
3200: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
3210: 68 6f 64 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74  hods implementat
3220: 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ion..*/.typedef 
3230: 73 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74  struct winMemDat
3240: 61 20 77 69 6e 4d 65 6d 44 61 74 61 3b 0a 73 74  a winMemData;.st
3250: 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20  ruct winMemData 
3260: 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  {.#ifndef NDEBUG
3270: 0a 20 20 75 33 32 20 6d 61 67 69 63 31 3b 20 20  .  u32 magic1;  
3280: 20 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72   /* Magic number
3290: 20 74 6f 20 64 65 74 65 63 74 20 73 74 72 75 63   to detect struc
32a0: 74 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  ture corruption.
32b0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 48 41 4e   */.#endif.  HAN
32c0: 44 4c 45 20 68 48 65 61 70 3b 20 2f 2a 20 54 68  DLE hHeap; /* Th
32d0: 65 20 68 61 6e 64 6c 65 20 74 6f 20 6f 75 72 20  e handle to our 
32e0: 68 65 61 70 2e 20 2a 2f 0a 20 20 42 4f 4f 4c 20  heap. */.  BOOL 
32f0: 62 4f 77 6e 65 64 3b 20 20 2f 2a 20 44 6f 20 77  bOwned;  /* Do w
3300: 65 20 6f 77 6e 20 74 68 65 20 68 65 61 70 20 28  e own the heap (
3310: 69 2e 65 2e 20 64 65 73 74 72 6f 79 20 69 74 20  i.e. destroy it 
3320: 6f 6e 20 73 68 75 74 64 6f 77 6e 29 3f 20 2a 2f  on shutdown)? */
3330: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
3340: 20 20 75 33 32 20 6d 61 67 69 63 32 3b 20 20 20    u32 magic2;   
3350: 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20  /* Magic number 
3360: 74 6f 20 64 65 74 65 63 74 20 73 74 72 75 63 74  to detect struct
3370: 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ure corruption. 
3380: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 23 69  */.#endif.};..#i
3390: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 64 65  fndef NDEBUG.#de
33a0: 66 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41 47 49  fine WINMEM_MAGI
33b0: 43 31 20 20 20 20 20 30 78 34 32 62 32 38 33 30  C1     0x42b2830
33c0: 62 0a 23 64 65 66 69 6e 65 20 57 49 4e 4d 45 4d  b.#define WINMEM
33d0: 5f 4d 41 47 49 43 32 20 20 20 20 20 30 78 62 64  _MAGIC2     0xbd
33e0: 34 64 37 63 66 34 0a 23 65 6e 64 69 66 0a 0a 73  4d7cf4.#endif..s
33f0: 74 61 74 69 63 20 73 74 72 75 63 74 20 77 69 6e  tatic struct win
3400: 4d 65 6d 44 61 74 61 20 77 69 6e 5f 6d 65 6d 5f  MemData win_mem_
3410: 64 61 74 61 20 3d 20 7b 0a 23 69 66 6e 64 65 66  data = {.#ifndef
3420: 20 4e 44 45 42 55 47 0a 20 20 57 49 4e 4d 45 4d   NDEBUG.  WINMEM
3430: 5f 4d 41 47 49 43 31 2c 0a 23 65 6e 64 69 66 0a  _MAGIC1,.#endif.
3440: 20 20 4e 55 4c 4c 2c 20 46 41 4c 53 45 0a 23 69    NULL, FALSE.#i
3450: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2c  fndef NDEBUG.  ,
3460: 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 0a 23 65  WINMEM_MAGIC2.#e
3470: 6e 64 69 66 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66  ndif.};..#ifndef
3480: 20 4e 44 45 42 55 47 0a 23 64 65 66 69 6e 65 20   NDEBUG.#define 
3490: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
34a0: 63 31 28 29 20 61 73 73 65 72 74 28 20 77 69 6e  c1() assert( win
34b0: 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69 63 31  _mem_data.magic1
34c0: 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20  ==WINMEM_MAGIC1 
34d0: 29 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d  ).#define winMem
34e0: 41 73 73 65 72 74 4d 61 67 69 63 32 28 29 20 61  AssertMagic2() a
34f0: 73 73 65 72 74 28 20 77 69 6e 5f 6d 65 6d 5f 64  ssert( win_mem_d
3500: 61 74 61 2e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d  ata.magic2==WINM
3510: 45 4d 5f 4d 41 47 49 43 32 20 29 0a 23 64 65 66  EM_MAGIC2 ).#def
3520: 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ine winMemAssert
3530: 4d 61 67 69 63 28 29 20 20 77 69 6e 4d 65 6d 41  Magic()  winMemA
3540: 73 73 65 72 74 4d 61 67 69 63 31 28 29 3b 20 77  ssertMagic1(); w
3550: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
3560: 32 28 29 3b 0a 23 65 6c 73 65 0a 23 64 65 66 69  2();.#else.#defi
3570: 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  ne winMemAssertM
3580: 61 67 69 63 28 29 0a 23 65 6e 64 69 66 0a 0a 23  agic().#endif..#
3590: 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74  define winMemGet
35a0: 44 61 74 61 50 74 72 28 29 20 20 26 77 69 6e 5f  DataPtr()  &win_
35b0: 6d 65 6d 5f 64 61 74 61 0a 23 64 65 66 69 6e 65  mem_data.#define
35c0: 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29   winMemGetHeap()
35d0: 20 20 20 20 20 77 69 6e 5f 6d 65 6d 5f 64 61 74       win_mem_dat
35e0: 61 2e 68 48 65 61 70 0a 23 64 65 66 69 6e 65 20  a.hHeap.#define 
35f0: 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29  winMemGetOwned()
3600: 20 20 20 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61      win_mem_data
3610: 2e 62 4f 77 6e 65 64 0a 0a 73 74 61 74 69 63 20  .bOwned..static 
3620: 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c  void *winMemMall
3630: 6f 63 28 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a  oc(int nBytes);.
3640: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d  static void winM
3650: 65 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72  emFree(void *pPr
3660: 69 6f 72 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  ior);.static voi
3670: 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63  d *winMemRealloc
3680: 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69  (void *pPrior, i
3690: 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73 74 61 74  nt nBytes);.stat
36a0: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a  ic int winMemSiz
36b0: 65 28 76 6f 69 64 20 2a 70 29 3b 0a 73 74 61 74  e(void *p);.stat
36c0: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75  ic int winMemRou
36d0: 6e 64 75 70 28 69 6e 74 20 6e 29 3b 0a 73 74 61  ndup(int n);.sta
36e0: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e  tic int winMemIn
36f0: 69 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74  it(void *pAppDat
3700: 61 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  a);.static void 
3710: 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76  winMemShutdown(v
3720: 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 3b 0a  oid *pAppData);.
3730: 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d  .const sqlite3_m
3740: 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69  em_methods *sqli
3750: 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 76  te3MemGetWin32(v
3760: 6f 69 64 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  oid);.#endif /* 
3770: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
3780: 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  LOC */../*.** Th
3790: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
37a0: 61 62 6c 65 20 69 73 20 28 6e 6f 72 6d 61 6c 6c  able is (normall
37b0: 79 29 20 73 65 74 20 6f 6e 63 65 20 61 6e 64 20  y) set once and 
37c0: 6e 65 76 65 72 20 63 68 61 6e 67 65 73 0a 2a 2a  never changes.**
37d0: 20 74 68 65 72 65 61 66 74 65 72 2e 20 20 49 74   thereafter.  It
37e0: 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72   records whether
37f0: 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
3800: 79 73 74 65 6d 20 69 73 20 57 69 6e 39 78 0a 2a  ystem is Win9x.*
3810: 2a 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a  * or WinNT..**.*
3820: 2a 20 30 3a 20 20 20 4f 70 65 72 61 74 69 6e 67  * 0:   Operating
3830: 20 73 79 73 74 65 6d 20 75 6e 6b 6e 6f 77 6e 2e   system unknown.
3840: 0a 2a 2a 20 31 3a 20 20 20 4f 70 65 72 61 74 69  .** 1:   Operati
3850: 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e  ng system is Win
3860: 39 78 2e 0a 2a 2a 20 32 3a 20 20 20 4f 70 65 72  9x..** 2:   Oper
3870: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20  ating system is 
3880: 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  WinNT..**.** In 
3890: 6f 72 64 65 72 20 74 6f 20 66 61 63 69 6c 69 74  order to facilit
38a0: 61 74 65 20 74 65 73 74 69 6e 67 20 6f 6e 20 61  ate testing on a
38b0: 20 57 69 6e 4e 54 20 73 79 73 74 65 6d 2c 20 74   WinNT system, t
38c0: 68 65 20 74 65 73 74 20 66 69 78 74 75 72 65 0a  he test fixture.
38d0: 2a 2a 20 63 61 6e 20 6d 61 6e 75 61 6c 6c 79 20  ** can manually 
38e0: 73 65 74 20 74 68 69 73 20 76 61 6c 75 65 20 74  set this value t
38f0: 6f 20 31 20 74 6f 20 65 6d 75 6c 61 74 65 20 57  o 1 to emulate W
3900: 69 6e 39 38 20 62 65 68 61 76 69 6f 72 2e 0a 2a  in98 behavior..*
3910: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3920: 54 45 53 54 0a 4c 4f 4e 47 20 53 51 4c 49 54 45  TEST.LONG SQLITE
3930: 5f 57 49 4e 33 32 5f 56 4f 4c 41 54 49 4c 45 20  _WIN32_VOLATILE 
3940: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20  sqlite3_os_type 
3950: 3d 20 30 3b 0a 4c 4f 4e 47 20 53 51 4c 49 54 45  = 0;.LONG SQLITE
3960: 5f 57 49 4e 33 32 5f 56 4f 4c 41 54 49 4c 45 20  _WIN32_VOLATILE 
3970: 73 71 6c 69 74 65 33 5f 6f 73 5f 6d 61 6a 6f 72  sqlite3_os_major
3980: 20 3d 20 30 3b 0a 4c 4f 4e 47 20 53 51 4c 49 54   = 0;.LONG SQLIT
3990: 45 5f 57 49 4e 33 32 5f 56 4f 4c 41 54 49 4c 45  E_WIN32_VOLATILE
39a0: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 6d 69 6e 6f   sqlite3_os_mino
39b0: 72 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61  r = 0;.#else.sta
39c0: 74 69 63 20 4c 4f 4e 47 20 53 51 4c 49 54 45 5f  tic LONG SQLITE_
39d0: 57 49 4e 33 32 5f 56 4f 4c 41 54 49 4c 45 20 73  WIN32_VOLATILE s
39e0: 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d  qlite3_os_type =
39f0: 20 30 3b 0a 73 74 61 74 69 63 20 4c 4f 4e 47 20   0;.static LONG 
3a00: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 56 4f 4c  SQLITE_WIN32_VOL
3a10: 41 54 49 4c 45 20 73 71 6c 69 74 65 33 5f 6f 73  ATILE sqlite3_os
3a20: 5f 6d 61 6a 6f 72 20 3d 20 30 3b 0a 73 74 61 74  _major = 0;.stat
3a30: 69 63 20 4c 4f 4e 47 20 53 51 4c 49 54 45 5f 57  ic LONG SQLITE_W
3a40: 49 4e 33 32 5f 56 4f 4c 41 54 49 4c 45 20 73 71  IN32_VOLATILE sq
3a50: 6c 69 74 65 33 5f 6f 73 5f 6d 69 6e 6f 72 20 3d  lite3_os_minor =
3a60: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e   0;.#endif..#ifn
3a70: 64 65 66 20 53 59 53 43 41 4c 4c 0a 23 20 20 64  def SYSCALL.#  d
3a80: 65 66 69 6e 65 20 53 59 53 43 41 4c 4c 20 73 71  efine SYSCALL sq
3a90: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3aa0: 72 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  r.#endif../*.** 
3ab0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
3ac0: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 6f   not available o
3ad0: 6e 20 57 69 6e 64 6f 77 73 20 43 45 20 6f 72 20  n Windows CE or 
3ae0: 57 69 6e 52 54 2e 0a 20 2a 2f 0a 0a 23 69 66 20  WinRT.. */..#if 
3af0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
3b00: 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  || SQLITE_OS_WIN
3b10: 52 54 0a 23 20 20 64 65 66 69 6e 65 20 6f 73 41  RT.#  define osA
3b20: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29  reFileApisANSI()
3b30: 20 20 20 20 20 20 20 31 0a 23 65 6e 64 69 66 0a         1.#endif.
3b40: 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74  ./*.** Many syst
3b50: 65 6d 20 63 61 6c 6c 73 20 61 72 65 20 61 63 63  em calls are acc
3b60: 65 73 73 65 64 20 74 68 72 6f 75 67 68 20 70 6f  essed through po
3b70: 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f  inter-to-functio
3b80: 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68  ns so that.** th
3b90: 65 79 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69  ey may be overri
3ba0: 64 64 65 6e 20 61 74 20 72 75 6e 74 69 6d 65 20  dden at runtime 
3bb0: 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 66 61  to facilitate fa
3bc0: 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75  ult injection du
3bd0: 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20  ring.** testing 
3be0: 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20  and sandboxing. 
3bf0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
3c00: 72 72 61 79 20 68 6f 6c 64 73 20 74 68 65 20 6e  rray holds the n
3c10: 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e 74 65 72  ames and pointer
3c20: 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72  s.** to all over
3c30: 72 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20  rideable system 
3c40: 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  calls..*/.static
3c50: 20 73 74 72 75 63 74 20 77 69 6e 5f 73 79 73 63   struct win_sysc
3c60: 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68  all {.  const ch
3c70: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20  ar *zName;      
3c80: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
3c90: 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   the system call
3ca0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79   */.  sqlite3_sy
3cb0: 73 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72 65  scall_ptr pCurre
3cc0: 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76  nt; /* Current v
3cd0: 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73 74  alue of the syst
3ce0: 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c  em call */.  sql
3cf0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3d00: 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65   pDefault; /* De
3d10: 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d  fault value */.}
3d20: 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a   aSyscall[] = {.
3d30: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
3d40: 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
3d50: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 41 72  OS_WINRT.  { "Ar
3d60: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20  eFileApisANSI", 
3d70: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3d80: 29 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  )AreFileApisANSI
3d90: 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  ,         0 },.#
3da0: 65 6c 73 65 0a 20 20 7b 20 22 41 72 65 46 69 6c  else.  { "AreFil
3db0: 65 41 70 69 73 41 4e 53 49 22 2c 20 20 20 20 20  eApisANSI",     
3dc0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
3dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3de0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3df0: 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 41 72 65  f..#ifndef osAre
3e00: 46 69 6c 65 41 70 69 73 41 4e 53 49 0a 23 64 65  FileApisANSI.#de
3e10: 66 69 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70  fine osAreFileAp
3e20: 69 73 41 4e 53 49 20 28 28 42 4f 4f 4c 28 57 49  isANSI ((BOOL(WI
3e30: 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79  NAPI*)(VOID))aSy
3e40: 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e  scall[0].pCurren
3e50: 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53  t).#endif..#if S
3e60: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
3e70: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
3e80: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
3e90: 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57  .  { "CharLowerW
3ea0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
3eb0: 28 53 59 53 43 41 4c 4c 29 43 68 61 72 4c 6f 77  (SYSCALL)CharLow
3ec0: 65 72 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  erW,            
3ed0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
3ee0: 20 22 43 68 61 72 4c 6f 77 65 72 57 22 2c 20 20   "CharLowerW",  
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3f00: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3f20: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
3f30: 6e 65 20 6f 73 43 68 61 72 4c 6f 77 65 72 57 20  ne osCharLowerW 
3f40: 28 28 4c 50 57 53 54 52 28 57 49 4e 41 50 49 2a  ((LPWSTR(WINAPI*
3f50: 29 28 4c 50 57 53 54 52 29 29 61 53 79 73 63 61  )(LPWSTR))aSysca
3f60: 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[1].pCurrent).
3f70: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
3f80: 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28  INCE && defined(
3f90: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
3fa0: 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 68 61 72  _WIDE).  { "Char
3fb0: 55 70 70 65 72 57 22 2c 20 20 20 20 20 20 20 20  UpperW",        
3fc0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
3fd0: 68 61 72 55 70 70 65 72 57 2c 20 20 20 20 20 20  harUpperW,      
3fe0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
3ff0: 73 65 0a 20 20 7b 20 22 43 68 61 72 55 70 70 65  se.  { "CharUppe
4000: 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  rW",            
4010: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
4020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4030: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4040: 0a 23 64 65 66 69 6e 65 20 6f 73 43 68 61 72 55  .#define osCharU
4050: 70 70 65 72 57 20 28 28 4c 50 57 53 54 52 28 57  pperW ((LPWSTR(W
4060: 49 4e 41 50 49 2a 29 28 4c 50 57 53 54 52 29 29  INAPI*)(LPWSTR))
4070: 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72  aSyscall[2].pCur
4080: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 43 6c 6f 73  rent)..  { "Clos
4090: 65 48 61 6e 64 6c 65 22 2c 20 20 20 20 20 20 20  eHandle",       
40a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
40b0: 6c 6f 73 65 48 61 6e 64 6c 65 2c 20 20 20 20 20  loseHandle,     
40c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
40d0: 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65 48 61 6e  efine osCloseHan
40e0: 64 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  dle ((BOOL(WINAP
40f0: 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73  I*)(HANDLE))aSys
4100: 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74  call[3].pCurrent
4110: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
4120: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4130: 41 4e 53 49 29 0a 20 20 7b 20 22 43 72 65 61 74  ANSI).  { "Creat
4140: 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20  eFileA",        
4150: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
4160: 65 61 74 65 46 69 6c 65 41 2c 20 20 20 20 20 20  eateFileA,      
4170: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
4180: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  e.  { "CreateFil
4190: 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eA",            
41a0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41c0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
41d0: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
41e0: 46 69 6c 65 41 20 28 28 48 41 4e 44 4c 45 28 57  FileA ((HANDLE(W
41f0: 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44  INAPI*)(LPCSTR,D
4200: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
4210: 20 20 20 20 20 20 4c 50 53 45 43 55 52 49 54 59        LPSECURITY
4220: 5f 41 54 54 52 49 42 55 54 45 53 2c 44 57 4f 52  _ATTRIBUTES,DWOR
4230: 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29  D,DWORD,HANDLE))
4240: 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72  aSyscall[4].pCur
4250: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
4260: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
4270: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
4280: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
4290: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c  { "CreateFileW",
42a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
42b0: 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65  SCALL)CreateFile
42c0: 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  W,             0
42d0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
42e0: 72 65 61 74 65 46 69 6c 65 57 22 2c 20 20 20 20  reateFileW",    
42f0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4300: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4310: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4320: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4330: 6f 73 43 72 65 61 74 65 46 69 6c 65 57 20 28 28  osCreateFileW ((
4340: 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28  HANDLE(WINAPI*)(
4350: 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 44 57  LPCWSTR,DWORD,DW
4360: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
4370: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
4380: 55 54 45 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44  UTES,DWORD,DWORD
4390: 2c 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c  ,HANDLE))aSyscal
43a0: 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[5].pCurrent)..
43b0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
43c0: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
43d0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
43e0: 5f 41 4e 53 49 29 20 26 26 20 5c 0a 20 20 20 20  _ANSI) && \.    
43f0: 20 20 20 20 28 21 64 65 66 69 6e 65 64 28 53 51      (!defined(SQ
4400: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c  LITE_OMIT_WAL) |
4410: 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  | SQLITE_MAX_MMA
4420: 50 5f 53 49 5a 45 3e 30 29 20 26 26 20 5c 0a 20  P_SIZE>0) && \. 
4430: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49         SQLITE_WI
4440: 4e 33 32 5f 43 52 45 41 54 45 46 49 4c 45 4d 41  N32_CREATEFILEMA
4450: 50 50 49 4e 47 41 0a 20 20 7b 20 22 43 72 65 61  PPINGA.  { "Crea
4460: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 22 2c  teFileMappingA",
4470: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
4480: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
4490: 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  A,      0 },.#el
44a0: 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  se.  { "CreateFi
44b0: 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20 20 20 20  leMappingA",    
44c0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44e0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
44f0: 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74  .#define osCreat
4500: 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 20 28 28  eFileMappingA ((
4510: 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28  HANDLE(WINAPI*)(
4520: 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49 54  HANDLE,LPSECURIT
4530: 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a  Y_ATTRIBUTES, \.
4540: 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57          DWORD,DW
4550: 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52  ORD,DWORD,LPCSTR
4560: 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43  ))aSyscall[6].pC
4570: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
4580: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20  ITE_OS_WINCE || 
4590: 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  (!SQLITE_OS_WINR
45a0: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
45b0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
45c0: 44 45 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20  DE) && \.       
45d0: 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54   (!defined(SQLIT
45e0: 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53  E_OMIT_WAL) || S
45f0: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
4600: 49 5a 45 3e 30 29 29 0a 20 20 7b 20 22 43 72 65  IZE>0)).  { "Cre
4610: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 22  ateFileMappingW"
4620: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
4630: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
4640: 67 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  gW,      0 },.#e
4650: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46  lse.  { "CreateF
4660: 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20 20 20  ileMappingW",   
4670: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
4680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4690: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
46a0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
46b0: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 20 28  teFileMappingW (
46c0: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
46d0: 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49  (HANDLE,LPSECURI
46e0: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c  TY_ATTRIBUTES, \
46f0: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44  .        DWORD,D
4700: 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43 57 53  WORD,DWORD,LPCWS
4710: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e  TR))aSyscall[7].
4720: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
4730: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
4740: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
4750: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
4760: 29 0a 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74  ).  { "CreateMut
4770: 65 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  exW",           
4780: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
4790: 4d 75 74 65 78 57 2c 20 20 20 20 20 20 20 20 20  MutexW,         
47a0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
47b0: 7b 20 22 43 72 65 61 74 65 4d 75 74 65 78 57 22  { "CreateMutexW"
47c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
47d0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
47f0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4800: 69 6e 65 20 6f 73 43 72 65 61 74 65 4d 75 74 65  ine osCreateMute
4810: 78 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  xW ((HANDLE(WINA
4820: 50 49 2a 29 28 4c 50 53 45 43 55 52 49 54 59 5f  PI*)(LPSECURITY_
4830: 41 54 54 52 49 42 55 54 45 53 2c 42 4f 4f 4c 2c  ATTRIBUTES,BOOL,
4840: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 57 53   \.        LPCWS
4850: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e  TR))aSyscall[8].
4860: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
4870: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
4880: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
4890: 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c  { "DeleteFileA",
48a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
48b0: 53 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65  SCALL)DeleteFile
48c0: 41 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  A,             0
48d0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44   },.#else.  { "D
48e0: 65 6c 65 74 65 46 69 6c 65 41 22 2c 20 20 20 20  eleteFileA",    
48f0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4900: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4910: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4920: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4930: 6f 73 44 65 6c 65 74 65 46 69 6c 65 41 20 28 28  osDeleteFileA ((
4940: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50  BOOL(WINAPI*)(LP
4950: 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 39  CSTR))aSyscall[9
4960: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4970: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4980: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
4990: 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57    { "DeleteFileW
49a0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
49b0: 53 59 53 43 41 4c 4c 29 44 65 6c 65 74 65 46 69  SYSCALL)DeleteFi
49c0: 6c 65 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  leW,            
49d0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
49e0: 22 44 65 6c 65 74 65 46 69 6c 65 57 22 2c 20 20  "DeleteFileW",  
49f0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4a00: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4a20: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4a30: 65 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 20  e osDeleteFileW 
4a40: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
4a50: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
4a60: 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[10].pCurrent).
4a70: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
4a80: 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65 54 69  INCE.  { "FileTi
4a90: 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d  meToLocalFileTim
4aa0: 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 46 69 6c  e", (SYSCALL)Fil
4ab0: 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65  eTimeToLocalFile
4ac0: 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65  Time, 0 },.#else
4ad0: 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f  .  { "FileTimeTo
4ae0: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20  LocalFileTime", 
4af0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
4b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b10: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
4b20: 64 65 66 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d  define osFileTim
4b30: 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65  eToLocalFileTime
4b40: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
4b50: 28 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a  (CONST FILETIME*
4b60: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49  , \.        LPFI
4b70: 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c  LETIME))aSyscall
4b80: 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [11].pCurrent)..
4b90: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
4ba0: 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d  NCE.  { "FileTim
4bb0: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c 20  eToSystemTime", 
4bc0: 20 20 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65     (SYSCALL)File
4bd0: 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65  TimeToSystemTime
4be0: 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  ,    0 },.#else.
4bf0: 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 53    { "FileTimeToS
4c00: 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20 28  ystemTime",    (
4c10: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c30: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4c40: 65 66 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65  efine osFileTime
4c50: 54 6f 53 79 73 74 65 6d 54 69 6d 65 20 28 28 42  ToSystemTime ((B
4c60: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e  OOL(WINAPI*)(CON
4c70: 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a  ST FILETIME*, \.
4c80: 20 20 20 20 20 20 20 20 4c 50 53 59 53 54 45 4d          LPSYSTEM
4c90: 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 31  TIME))aSyscall[1
4ca0: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  2].pCurrent)..  
4cb0: 7b 20 22 46 6c 75 73 68 46 69 6c 65 42 75 66 66  { "FlushFileBuff
4cc0: 65 72 73 22 2c 20 20 20 20 20 20 20 20 28 53 59  ers",        (SY
4cd0: 53 43 41 4c 4c 29 46 6c 75 73 68 46 69 6c 65 42  SCALL)FlushFileB
4ce0: 75 66 66 65 72 73 2c 20 20 20 20 20 20 20 20 30  uffers,        0
4cf0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46   },..#define osF
4d00: 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 20  lushFileBuffers 
4d10: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
4d20: 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c  HANDLE))aSyscall
4d30: 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [13].pCurrent)..
4d40: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
4d50: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
4d60: 49 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65  I).  { "FormatMe
4d70: 73 73 61 67 65 41 22 2c 20 20 20 20 20 20 20 20  ssageA",        
4d80: 20 20 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61    (SYSCALL)Forma
4d90: 74 4d 65 73 73 61 67 65 41 2c 20 20 20 20 20 20  tMessageA,      
4da0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4db0: 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67   { "FormatMessag
4dc0: 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  eA",          (S
4dd0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4df0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4e00: 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73  fine osFormatMes
4e10: 73 61 67 65 41 20 28 28 44 57 4f 52 44 28 57 49  sageA ((DWORD(WI
4e20: 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43  NAPI*)(DWORD,LPC
4e30: 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  VOID,DWORD,DWORD
4e40: 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20 20  ,LPSTR, \.      
4e50: 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a    DWORD,va_list*
4e60: 29 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70  ))aSyscall[14].p
4e70: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
4e80: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
4e90: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
4ea0: 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57   "FormatMessageW
4eb0: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
4ec0: 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61  CALL)FormatMessa
4ed0: 67 65 57 2c 20 20 20 20 20 20 20 20 20 20 30 20  geW,          0 
4ee0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f  },.#else.  { "Fo
4ef0: 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c 20 20  rmatMessageW",  
4f00: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4f10: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4f20: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4f30: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
4f40: 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 20  sFormatMessageW 
4f50: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
4f60: 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44  (DWORD,LPCVOID,D
4f70: 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 57 53 54  WORD,DWORD,LPWST
4f80: 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  R, \.        DWO
4f90: 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61 53 79  RD,va_list*))aSy
4fa0: 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65  scall[15].pCurre
4fb0: 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  nt)..#if !define
4fc0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  d(SQLITE_OMIT_LO
4fd0: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20  AD_EXTENSION).  
4fe0: 7b 20 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c  { "FreeLibrary",
4ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
5000: 53 43 41 4c 4c 29 46 72 65 65 4c 69 62 72 61 72  SCALL)FreeLibrar
5010: 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  y,             0
5020: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46   },.#else.  { "F
5030: 72 65 65 4c 69 62 72 61 72 79 22 2c 20 20 20 20  reeLibrary",    
5040: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5050: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
5060: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5070: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5080: 6f 73 46 72 65 65 4c 69 62 72 61 72 79 20 28 28  osFreeLibrary ((
5090: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 4d  BOOL(WINAPI*)(HM
50a0: 4f 44 55 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ODULE))aSyscall[
50b0: 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  16].pCurrent).. 
50c0: 20 7b 20 22 47 65 74 43 75 72 72 65 6e 74 50 72   { "GetCurrentPr
50d0: 6f 63 65 73 73 49 64 22 2c 20 20 20 20 20 28 53  ocessId",     (S
50e0: 59 53 43 41 4c 4c 29 47 65 74 43 75 72 72 65 6e  YSCALL)GetCurren
50f0: 74 50 72 6f 63 65 73 73 49 64 2c 20 20 20 20 20  tProcessId,     
5100: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
5110: 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
5120: 73 49 64 20 28 28 44 57 4f 52 44 28 57 49 4e 41  sId ((DWORD(WINA
5130: 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63  PI*)(VOID))aSysc
5140: 61 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74  all[17].pCurrent
5150: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
5160: 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e  S_WINCE && defin
5170: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
5180: 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47  HAS_ANSI).  { "G
5190: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41  etDiskFreeSpaceA
51a0: 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ",       (SYSCAL
51b0: 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53 70 61  L)GetDiskFreeSpa
51c0: 63 65 41 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a  ceA,       0 },.
51d0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44 69  #else.  { "GetDi
51e0: 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20 20  skFreeSpaceA",  
51f0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
5200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5210: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5220: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
5230: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41 20  tDiskFreeSpaceA 
5240: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
5250: 4c 50 43 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c  LPCSTR,LPDWORD,L
5260: 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20  PDWORD,LPDWORD, 
5270: 5c 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f 52  \.        LPDWOR
5280: 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e  D))aSyscall[18].
5290: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
52a0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
52b0: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
52c0: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
52d0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
52e0: 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 44 69  WIDE).  { "GetDi
52f0: 73 6b 46 72 65 65 53 70 61 63 65 57 22 2c 20 20  skFreeSpaceW",  
5300: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
5310: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 2c  tDiskFreeSpaceW,
5320: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
5330: 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72  e.  { "GetDiskFr
5340: 65 65 53 70 61 63 65 57 22 2c 20 20 20 20 20 20  eeSpaceW",      
5350: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5370: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5380: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44 69 73  #define osGetDis
5390: 6b 46 72 65 65 53 70 61 63 65 57 20 28 28 42 4f  kFreeSpaceW ((BO
53a0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  OL(WINAPI*)(LPCW
53b0: 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57  STR,LPDWORD,LPDW
53c0: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20  ORD,LPDWORD, \. 
53d0: 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29 29         LPDWORD))
53e0: 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75  aSyscall[19].pCu
53f0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
5400: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
5410: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
5420: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
5430: 73 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  sA",      (SYSCA
5440: 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62  LL)GetFileAttrib
5450: 75 74 65 73 41 2c 20 20 20 20 20 20 30 20 7d 2c  utesA,      0 },
5460: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
5470: 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 22 2c  ileAttributesA",
5480: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
5490: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
54a0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
54b0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
54c0: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
54d0: 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  A ((DWORD(WINAPI
54e0: 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63  *)(LPCSTR))aSysc
54f0: 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74  all[20].pCurrent
5500: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
5510: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
5520: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
5530: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
5540: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
5550: 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  W",      (SYSCAL
5560: 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  L)GetFileAttribu
5570: 74 65 73 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a  tesW,      0 },.
5580: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69  #else.  { "GetFi
5590: 6c 65 41 74 74 72 69 62 75 74 65 73 57 22 2c 20  leAttributesW", 
55a0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
55b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55c0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
55d0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
55e0: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
55f0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
5600: 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73 63  )(LPCWSTR))aSysc
5610: 61 6c 6c 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74  all[21].pCurrent
5620: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
5630: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
5640: 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46 69  WIDE).  { "GetFi
5650: 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 22  leAttributesExW"
5660: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65  ,    (SYSCALL)Ge
5670: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
5680: 78 57 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  xW,    0 },.#els
5690: 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74  e.  { "GetFileAt
56a0: 74 72 69 62 75 74 65 73 45 78 57 22 2c 20 20 20  tributesExW",   
56b0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
56c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56d0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
56e0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c  #define osGetFil
56f0: 65 41 74 74 72 69 62 75 74 65 73 45 78 57 20 28  eAttributesExW (
5700: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c  (BOOL(WINAPI*)(L
5710: 50 43 57 53 54 52 2c 47 45 54 5f 46 49 4c 45 45  PCWSTR,GET_FILEE
5720: 58 5f 49 4e 46 4f 5f 4c 45 56 45 4c 53 2c 20 5c  X_INFO_LEVELS, \
5730: 0a 20 20 20 20 20 20 20 20 4c 50 56 4f 49 44 29  .        LPVOID)
5740: 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43  )aSyscall[22].pC
5750: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
5760: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
5770: 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22 2c  { "GetFileSize",
5780: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
5790: 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 53 69 7a  SCALL)GetFileSiz
57a0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  e,             0
57b0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
57c0: 65 74 46 69 6c 65 53 69 7a 65 22 2c 20 20 20 20  etFileSize",    
57d0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
57e0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
57f0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5800: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5810: 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 20 28 28  osGetFileSize ((
5820: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48  DWORD(WINAPI*)(H
5830: 41 4e 44 4c 45 2c 4c 50 44 57 4f 52 44 29 29 61  ANDLE,LPDWORD))a
5840: 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75 72  Syscall[23].pCur
5850: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
5860: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64  TE_OS_WINCE && d
5870: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
5880: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
5890: 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  { "GetFullPathNa
58a0: 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28 53 59  meA",        (SY
58b0: 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74  SCALL)GetFullPat
58c0: 68 4e 61 6d 65 41 2c 20 20 20 20 20 20 20 20 30  hNameA,        0
58d0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
58e0: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 22  etFullPathNameA"
58f0: 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ,        (SYSCAL
5900: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
5910: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5920: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5930: 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  osGetFullPathNam
5940: 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  eA ((DWORD(WINAP
5950: 49 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52 44  I*)(LPCSTR,DWORD
5960: 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20 20  ,LPSTR, \.      
5970: 20 20 4c 50 53 54 52 2a 29 29 61 53 79 73 63 61    LPSTR*))aSysca
5980: 6c 6c 5b 32 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[24].pCurrent)
5990: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
59a0: 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
59b0: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
59c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
59d0: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
59e0: 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d   "GetFullPathNam
59f0: 65 57 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  eW",        (SYS
5a00: 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68  CALL)GetFullPath
5a10: 4e 61 6d 65 57 2c 20 20 20 20 20 20 20 20 30 20  NameW,        0 
5a20: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
5a30: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c  tFullPathNameW",
5a40: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5a50: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
5a60: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5a70: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
5a80: 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
5a90: 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  W ((DWORD(WINAPI
5aa0: 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44  *)(LPCWSTR,DWORD
5ab0: 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20  ,LPWSTR, \.     
5ac0: 20 20 20 4c 50 57 53 54 52 2a 29 29 61 53 79 73     LPWSTR*))aSys
5ad0: 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e  call[25].pCurren
5ae0: 74 29 0a 0a 20 20 7b 20 22 47 65 74 4c 61 73 74  t)..  { "GetLast
5af0: 45 72 72 6f 72 22 2c 20 20 20 20 20 20 20 20 20  Error",         
5b00: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 4c     (SYSCALL)GetL
5b10: 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20 20  astError,       
5b20: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
5b30: 6e 65 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  ne osGetLastErro
5b40: 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  r ((DWORD(WINAPI
5b50: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c  *)(VOID))aSyscal
5b60: 6c 5b 32 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[26].pCurrent).
5b70: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
5b80: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
5b90: 58 54 45 4e 53 49 4f 4e 29 0a 23 69 66 20 53 51  XTENSION).#if SQ
5ba0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
5bb0: 2f 2a 20 54 68 65 20 47 65 74 50 72 6f 63 41 64  /* The GetProcAd
5bc0: 64 72 65 73 73 41 28 29 20 72 6f 75 74 69 6e 65  dressA() routine
5bd0: 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62   is only availab
5be0: 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45  le on Windows CE
5bf0: 2e 20 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f  . */.  { "GetPro
5c00: 63 41 64 64 72 65 73 73 41 22 2c 20 20 20 20 20  cAddressA",     
5c10: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
5c20: 50 72 6f 63 41 64 64 72 65 73 73 41 2c 20 20 20  ProcAddressA,   
5c30: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
5c40: 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20  .  /* All other 
5c50: 57 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d  Windows platform
5c60: 73 20 65 78 70 65 63 74 20 47 65 74 50 72 6f 63  s expect GetProc
5c70: 41 64 64 72 65 73 73 28 29 20 74 6f 20 74 61 6b  Address() to tak
5c80: 65 0a 20 20 2a 2a 20 61 6e 20 41 4e 53 49 20 73  e.  ** an ANSI s
5c90: 74 72 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73  tring regardless
5ca0: 20 6f 66 20 74 68 65 20 5f 55 4e 49 43 4f 44 45   of the _UNICODE
5cb0: 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 7b 20   setting */.  { 
5cc0: 22 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  "GetProcAddressA
5cd0: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
5ce0: 41 4c 4c 29 47 65 74 50 72 6f 63 41 64 64 72 65  ALL)GetProcAddre
5cf0: 73 73 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  ss,          0 }
5d00: 2c 0a 23 65 6e 64 69 66 0a 23 65 6c 73 65 0a 20  ,.#endif.#else. 
5d10: 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72 65   { "GetProcAddre
5d20: 73 73 41 22 2c 20 20 20 20 20 20 20 20 20 28 53  ssA",         (S
5d30: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
5d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d50: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
5d60: 66 69 6e 65 20 6f 73 47 65 74 50 72 6f 63 41 64  fine osGetProcAd
5d70: 64 72 65 73 73 41 20 28 28 46 41 52 50 52 4f 43  dressA ((FARPROC
5d80: 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55 4c  (WINAPI*)(HMODUL
5d90: 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43  E, \.        LPC
5da0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 37  STR))aSyscall[27
5db0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5dc0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
5dd0: 54 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d  T.  { "GetSystem
5de0: 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20 20  Info",          
5df0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73   (SYSCALL)GetSys
5e00: 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  temInfo,        
5e10: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5e20: 7b 20 22 47 65 74 53 79 73 74 65 6d 49 6e 66 6f  { "GetSystemInfo
5e30: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
5e40: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5e60: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5e70: 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 49  ine osGetSystemI
5e80: 6e 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50  nfo ((VOID(WINAP
5e90: 49 2a 29 28 4c 50 53 59 53 54 45 4d 5f 49 4e 46  I*)(LPSYSTEM_INF
5ea0: 4f 29 29 61 53 79 73 63 61 6c 6c 5b 32 38 5d 2e  O))aSyscall[28].
5eb0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
5ec0: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 22 2c 20  GetSystemTime", 
5ed0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5ee0: 4c 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65  LL)GetSystemTime
5ef0: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ,           0 },
5f00: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53  ..#define osGetS
5f10: 79 73 74 65 6d 54 69 6d 65 20 28 28 56 4f 49 44  ystemTime ((VOID
5f20: 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54  (WINAPI*)(LPSYST
5f30: 45 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c  EMTIME))aSyscall
5f40: 5b 32 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [29].pCurrent)..
5f50: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
5f60: 49 4e 43 45 0a 20 20 7b 20 22 47 65 74 53 79 73  INCE.  { "GetSys
5f70: 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
5f80: 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74  e", (SYSCALL)Get
5f90: 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65  SystemTimeAsFile
5fa0: 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65  Time, 0 },.#else
5fb0: 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54  .  { "GetSystemT
5fc0: 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 22 2c 20  imeAsFileTime", 
5fd0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
5fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ff0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
6000: 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74  define osGetSyst
6010: 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
6020: 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29   ((VOID(WINAPI*)
6030: 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49  ( \.        LPFI
6040: 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c  LETIME))aSyscall
6050: 5b 33 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [30].pCurrent)..
6060: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
6070: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
6080: 49 29 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50  I).  { "GetTempP
6090: 61 74 68 41 22 2c 20 20 20 20 20 20 20 20 20 20  athA",          
60a0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65    (SYSCALL)GetTe
60b0: 6d 70 50 61 74 68 41 2c 20 20 20 20 20 20 20 20  mpPathA,        
60c0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
60d0: 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 41   { "GetTempPathA
60e0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
60f0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
6100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6110: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
6120: 66 69 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61  fine osGetTempPa
6130: 74 68 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41  thA ((DWORD(WINA
6140: 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 53 54 52  PI*)(DWORD,LPSTR
6150: 29 29 61 53 79 73 63 61 6c 6c 5b 33 31 5d 2e 70  ))aSyscall[31].p
6160: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
6170: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
6180: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
6190: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
61a0: 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74  .  { "GetTempPat
61b0: 68 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  hW",            
61c0: 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70  (SYSCALL)GetTemp
61d0: 50 61 74 68 57 2c 20 20 20 20 20 20 20 20 20 20  PathW,          
61e0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
61f0: 20 22 47 65 74 54 65 6d 70 50 61 74 68 57 22 2c   "GetTempPathW",
6200: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6210: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
6220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6230: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
6240: 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68  ne osGetTempPath
6250: 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  W ((DWORD(WINAPI
6260: 2a 29 28 44 57 4f 52 44 2c 4c 50 57 53 54 52 29  *)(DWORD,LPWSTR)
6270: 29 61 53 79 73 63 61 6c 6c 5b 33 32 5d 2e 70 43  )aSyscall[32].pC
6280: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
6290: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
62a0: 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 22  { "GetTickCount"
62b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
62c0: 53 43 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75  SCALL)GetTickCou
62d0: 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  nt,            0
62e0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
62f0: 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20  etTickCount",   
6300: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6310: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
6320: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6330: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
6340: 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 20 28  osGetTickCount (
6350: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
6360: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 33  VOID))aSyscall[3
6370: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  3].pCurrent)..#i
6380: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
6390: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
63a0: 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   && SQLITE_WIN32
63b0: 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a 20 20  _GETVERSIONEX.  
63c0: 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41  { "GetVersionExA
63d0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
63e0: 53 43 41 4c 4c 29 47 65 74 56 65 72 73 69 6f 6e  SCALL)GetVersion
63f0: 45 78 41 2c 20 20 20 20 20 20 20 20 20 20 20 30  ExA,           0
6400: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
6410: 65 74 56 65 72 73 69 6f 6e 45 78 41 22 2c 20 20  etVersionExA",  
6420: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6430: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
6440: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6450: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
6460: 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78 41 20  osGetVersionExA 
6470: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
6480: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 53 56   \.        LPOSV
6490: 45 52 53 49 4f 4e 49 4e 46 4f 41 29 29 61 53 79  ERSIONINFOA))aSy
64a0: 73 63 61 6c 6c 5b 33 34 5d 2e 70 43 75 72 72 65  scall[34].pCurre
64b0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
64c0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
64d0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
64e0: 32 5f 48 41 53 5f 57 49 44 45 29 20 26 26 20 5c  2_HAS_WIDE) && \
64f0: 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
6500: 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e  WIN32_GETVERSION
6510: 45 58 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69  EX.  { "GetVersi
6520: 6f 6e 45 78 57 22 2c 20 20 20 20 20 20 20 20 20  onExW",         
6530: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 56 65    (SYSCALL)GetVe
6540: 72 73 69 6f 6e 45 78 57 2c 20 20 20 20 20 20 20  rsionExW,       
6550: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
6560: 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78   { "GetVersionEx
6570: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  W",           (S
6580: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
6590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65a0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
65b0: 66 69 6e 65 20 6f 73 47 65 74 56 65 72 73 69 6f  fine osGetVersio
65c0: 6e 45 78 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41  nExW ((BOOL(WINA
65d0: 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20  PI*)( \.        
65e0: 4c 50 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 57  LPOSVERSIONINFOW
65f0: 29 29 61 53 79 73 63 61 6c 6c 5b 33 35 5d 2e 70  ))aSyscall[35].p
6600: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48  Current)..  { "H
6610: 65 61 70 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20  eapAlloc",      
6620: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6630: 4c 29 48 65 61 70 41 6c 6c 6f 63 2c 20 20 20 20  L)HeapAlloc,    
6640: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6650: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 41  .#define osHeapA
6660: 6c 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49  lloc ((LPVOID(WI
6670: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
6680: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53  ORD, \.        S
6690: 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b  IZE_T))aSyscall[
66a0: 33 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  36].pCurrent)..#
66b0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
66c0: 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 43 72 65  NRT.  { "HeapCre
66d0: 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ate",           
66e0: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70     (SYSCALL)Heap
66f0: 43 72 65 61 74 65 2c 20 20 20 20 20 20 20 20 20  Create,         
6700: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
6710: 20 20 7b 20 22 48 65 61 70 43 72 65 61 74 65 22    { "HeapCreate"
6720: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
6730: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
6740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6750: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
6760: 65 66 69 6e 65 20 6f 73 48 65 61 70 43 72 65 61  efine osHeapCrea
6770: 74 65 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  te ((HANDLE(WINA
6780: 50 49 2a 29 28 44 57 4f 52 44 2c 53 49 5a 45 5f  PI*)(DWORD,SIZE_
6790: 54 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a  T, \.        SIZ
67a0: 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 37  E_T))aSyscall[37
67b0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
67c0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
67d0: 54 0a 20 20 7b 20 22 48 65 61 70 44 65 73 74 72  T.  { "HeapDestr
67e0: 6f 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  oy",            
67f0: 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 44 65   (SYSCALL)HeapDe
6800: 73 74 72 6f 79 2c 20 20 20 20 20 20 20 20 20 20  stroy,          
6810: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
6820: 7b 20 22 48 65 61 70 44 65 73 74 72 6f 79 22 2c  { "HeapDestroy",
6830: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6840: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
6850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6860: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
6870: 69 6e 65 20 6f 73 48 65 61 70 44 65 73 74 72 6f  ine osHeapDestro
6880: 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  y ((BOOL(WINAPI*
6890: 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61  )(HANDLE))aSysca
68a0: 6c 6c 5b 33 38 5d 2e 70 43 75 72 72 65 6e 74 29  ll[38].pCurrent)
68b0: 0a 0a 20 20 7b 20 22 48 65 61 70 46 72 65 65 22  ..  { "HeapFree"
68c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
68d0: 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 46 72   (SYSCALL)HeapFr
68e0: 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ee,             
68f0: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
6900: 20 6f 73 48 65 61 70 46 72 65 65 20 28 28 42 4f   osHeapFree ((BO
6910: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
6920: 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44 29  LE,DWORD,LPVOID)
6930: 29 61 53 79 73 63 61 6c 6c 5b 33 39 5d 2e 70 43  )aSyscall[39].pC
6940: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65  urrent)..  { "He
6950: 61 70 52 65 41 6c 6c 6f 63 22 2c 20 20 20 20 20  apReAlloc",     
6960: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6970: 29 48 65 61 70 52 65 41 6c 6c 6f 63 2c 20 20 20  )HeapReAlloc,   
6980: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
6990: 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 52 65  #define osHeapRe
69a0: 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28 57  Alloc ((LPVOID(W
69b0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
69c0: 57 4f 52 44 2c 4c 50 56 4f 49 44 2c 20 5c 0a 20  WORD,LPVOID, \. 
69d0: 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61         SIZE_T))a
69e0: 53 79 73 63 61 6c 6c 5b 34 30 5d 2e 70 43 75 72  Syscall[40].pCur
69f0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70  rent)..  { "Heap
6a00: 53 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20  Size",          
6a10: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
6a20: 65 61 70 53 69 7a 65 2c 20 20 20 20 20 20 20 20  eapSize,        
6a30: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
6a40: 65 66 69 6e 65 20 6f 73 48 65 61 70 53 69 7a 65  efine osHeapSize
6a50: 20 28 28 53 49 5a 45 5f 54 28 57 49 4e 41 50 49   ((SIZE_T(WINAPI
6a60: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
6a70: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 56 4f   \.        LPCVO
6a80: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 31 5d  ID))aSyscall[41]
6a90: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
6aa0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
6ab0: 0a 20 20 7b 20 22 48 65 61 70 56 61 6c 69 64 61  .  { "HeapValida
6ac0: 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  te",            
6ad0: 28 53 59 53 43 41 4c 4c 29 48 65 61 70 56 61 6c  (SYSCALL)HeapVal
6ae0: 69 64 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  idate,          
6af0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
6b00: 20 22 48 65 61 70 56 61 6c 69 64 61 74 65 22 2c   "HeapValidate",
6b10: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6b20: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
6b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6b40: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
6b50: 6e 65 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74  ne osHeapValidat
6b60: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
6b70: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20  )(HANDLE,DWORD, 
6b80: 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 56 4f 49  \.        LPCVOI
6b90: 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 32 5d 2e  D))aSyscall[42].
6ba0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
6bb0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
6bc0: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
6bd0: 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 43 6f 6d  NRT.  { "HeapCom
6be0: 70 61 63 74 22 2c 20 20 20 20 20 20 20 20 20 20  pact",          
6bf0: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70     (SYSCALL)Heap
6c00: 43 6f 6d 70 61 63 74 2c 20 20 20 20 20 20 20 20  Compact,        
6c10: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
6c20: 20 20 7b 20 22 48 65 61 70 43 6f 6d 70 61 63 74    { "HeapCompact
6c30: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
6c40: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
6c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c60: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
6c70: 65 66 69 6e 65 20 6f 73 48 65 61 70 43 6f 6d 70  efine osHeapComp
6c80: 61 63 74 20 28 28 55 49 4e 54 28 57 49 4e 41 50  act ((UINT(WINAP
6c90: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
6ca0: 29 29 61 53 79 73 63 61 6c 6c 5b 34 33 5d 2e 70  ))aSyscall[43].p
6cb0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
6cc0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
6cd0: 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20  32_HAS_ANSI) && 
6ce0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6cf0: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
6d00: 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 4c 69  ION).  { "LoadLi
6d10: 62 72 61 72 79 41 22 2c 20 20 20 20 20 20 20 20  braryA",        
6d20: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61      (SYSCALL)Loa
6d30: 64 4c 69 62 72 61 72 79 41 2c 20 20 20 20 20 20  dLibraryA,      
6d40: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
6d50: 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72  .  { "LoadLibrar
6d60: 79 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  yA",            
6d70: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
6d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d90: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
6da0: 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69 62  define osLoadLib
6db0: 72 61 72 79 41 20 28 28 48 4d 4f 44 55 4c 45 28  raryA ((HMODULE(
6dc0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29  WINAPI*)(LPCSTR)
6dd0: 29 61 53 79 73 63 61 6c 6c 5b 34 34 5d 2e 70 43  )aSyscall[44].pC
6de0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
6df0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
6e00: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
6e10: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20  WIN32_HAS_WIDE) 
6e20: 26 26 20 5c 0a 20 20 20 20 20 20 20 20 21 64 65  && \.        !de
6e30: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
6e40: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
6e50: 29 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61  ).  { "LoadLibra
6e60: 72 79 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  ryW",           
6e70: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69   (SYSCALL)LoadLi
6e80: 62 72 61 72 79 57 2c 20 20 20 20 20 20 20 20 20  braryW,         
6e90: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
6ea0: 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 57 22  { "LoadLibraryW"
6eb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
6ec0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
6ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6ee0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
6ef0: 69 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72  ine osLoadLibrar
6f00: 79 57 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e  yW ((HMODULE(WIN
6f10: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61  API*)(LPCWSTR))a
6f20: 53 79 73 63 61 6c 6c 5b 34 35 5d 2e 70 43 75 72  Syscall[45].pCur
6f30: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
6f40: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
6f50: 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20 20 20  "LocalFree",    
6f60: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6f70: 41 4c 4c 29 4c 6f 63 61 6c 46 72 65 65 2c 20 20  ALL)LocalFree,  
6f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6f90: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63  ,.#else.  { "Loc
6fa0: 61 6c 46 72 65 65 22 2c 20 20 20 20 20 20 20 20  alFree",        
6fb0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6fc0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6fd0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6fe0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6ff0: 4c 6f 63 61 6c 46 72 65 65 20 28 28 48 4c 4f 43  LocalFree ((HLOC
7000: 41 4c 28 57 49 4e 41 50 49 2a 29 28 48 4c 4f 43  AL(WINAPI*)(HLOC
7010: 41 4c 29 29 61 53 79 73 63 61 6c 6c 5b 34 36 5d  AL))aSyscall[46]
7020: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
7030: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
7040: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
7050: 49 4e 52 54 0a 20 20 7b 20 22 4c 6f 63 6b 46 69  INRT.  { "LockFi
7060: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
7070: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63      (SYSCALL)Loc
7080: 6b 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  kFile,          
7090: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
70a0: 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c  .  { "LockFile",
70b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70c0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
70d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70e0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
70f0: 69 66 6e 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c  ifndef osLockFil
7100: 65 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b  e.#define osLock
7110: 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  File ((BOOL(WINA
7120: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
7130: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  D,DWORD,DWORD, \
7140: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29  .        DWORD))
7150: 61 53 79 73 63 61 6c 6c 5b 34 37 5d 2e 70 43 75  aSyscall[47].pCu
7160: 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23  rrent).#endif..#
7170: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
7180: 4e 43 45 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c  NCE.  { "LockFil
7190: 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20  eEx",           
71a0: 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b     (SYSCALL)Lock
71b0: 46 69 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20  FileEx,         
71c0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
71d0: 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22    { "LockFileEx"
71e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
71f0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
7200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7210: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69   0 },.#endif..#i
7220: 66 6e 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65  fndef osLockFile
7230: 45 78 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63  Ex.#define osLoc
7240: 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57  kFileEx ((BOOL(W
7250: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
7260: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
7270: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
7280: 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29    LPOVERLAPPED))
7290: 61 53 79 73 63 61 6c 6c 5b 34 38 5d 2e 70 43 75  aSyscall[48].pCu
72a0: 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23  rrent).#endif..#
72b0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
72c0: 43 45 20 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f  CE || (!SQLITE_O
72d0: 53 5f 57 49 4e 52 54 20 26 26 20 5c 0a 20 20 20  S_WINRT && \.   
72e0: 20 20 20 20 20 28 21 64 65 66 69 6e 65 64 28 53       (!defined(S
72f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20  QLITE_OMIT_WAL) 
7300: 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  || SQLITE_MAX_MM
7310: 41 50 5f 53 49 5a 45 3e 30 29 29 0a 20 20 7b 20  AP_SIZE>0)).  { 
7320: 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c  "MapViewOfFile",
7330: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
7340: 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46 69 6c  ALL)MapViewOfFil
7350: 65 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  e,           0 }
7360: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70  ,.#else.  { "Map
7370: 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20  ViewOfFile",    
7380: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7390: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
73a0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
73b0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
73c0: 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28  MapViewOfFile ((
73d0: 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  LPVOID(WINAPI*)(
73e0: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f  HANDLE,DWORD,DWO
73f0: 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  RD,DWORD, \.    
7400: 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73      SIZE_T))aSys
7410: 63 61 6c 6c 5b 34 39 5d 2e 70 43 75 72 72 65 6e  call[49].pCurren
7420: 74 29 0a 0a 20 20 7b 20 22 4d 75 6c 74 69 42 79  t)..  { "MultiBy
7430: 74 65 54 6f 57 69 64 65 43 68 61 72 22 2c 20 20  teToWideChar",  
7440: 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 75 6c 74     (SYSCALL)Mult
7450: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 2c  iByteToWideChar,
7460: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
7470: 6e 65 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f  ne osMultiByteTo
7480: 57 69 64 65 43 68 61 72 20 28 28 69 6e 74 28 57  WideChar ((int(W
7490: 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f  INAPI*)(UINT,DWO
74a0: 52 44 2c 4c 50 43 53 54 52 2c 69 6e 74 2c 4c 50  RD,LPCSTR,int,LP
74b0: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  WSTR, \.        
74c0: 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 35 30  int))aSyscall[50
74d0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
74e0: 20 22 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e   "QueryPerforman
74f0: 63 65 43 6f 75 6e 74 65 72 22 2c 20 28 53 59 53  ceCounter", (SYS
7500: 43 41 4c 4c 29 51 75 65 72 79 50 65 72 66 6f 72  CALL)QueryPerfor
7510: 6d 61 6e 63 65 43 6f 75 6e 74 65 72 2c 20 30 20  manceCounter, 0 
7520: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 51 75  },..#define osQu
7530: 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f  eryPerformanceCo
7540: 75 6e 74 65 72 20 28 28 42 4f 4f 4c 28 57 49 4e  unter ((BOOL(WIN
7550: 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20  API*)( \.       
7560: 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2a 29   LARGE_INTEGER*)
7570: 29 61 53 79 73 63 61 6c 6c 5b 35 31 5d 2e 70 43  )aSyscall[51].pC
7580: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 52 65  urrent)..  { "Re
7590: 61 64 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  adFile",        
75a0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
75b0: 29 52 65 61 64 46 69 6c 65 2c 20 20 20 20 20 20  )ReadFile,      
75c0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
75d0: 23 64 65 66 69 6e 65 20 6f 73 52 65 61 64 46 69  #define osReadFi
75e0: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
75f0: 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 56 4f 49 44  *)(HANDLE,LPVOID
7600: 2c 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20  ,DWORD,LPDWORD, 
7610: 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52  \.        LPOVER
7620: 4c 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c  LAPPED))aSyscall
7630: 5b 35 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [52].pCurrent)..
7640: 20 20 7b 20 22 53 65 74 45 6e 64 4f 66 46 69 6c    { "SetEndOfFil
7650: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  e",            (
7660: 53 59 53 43 41 4c 4c 29 53 65 74 45 6e 64 4f 66  SYSCALL)SetEndOf
7670: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
7680: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
7690: 73 53 65 74 45 6e 64 4f 66 46 69 6c 65 20 28 28  sSetEndOfFile ((
76a0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
76b0: 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 35  NDLE))aSyscall[5
76c0: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  3].pCurrent)..#i
76d0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
76e0: 52 54 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50  RT.  { "SetFileP
76f0: 6f 69 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20  ointer",        
7700: 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46 69    (SYSCALL)SetFi
7710: 6c 65 50 6f 69 6e 74 65 72 2c 20 20 20 20 20 20  lePointer,      
7720: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
7730: 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74   { "SetFilePoint
7740: 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  er",          (S
7750: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
7760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7770: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
7780: 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50 6f  fine osSetFilePo
7790: 69 6e 74 65 72 20 28 28 44 57 4f 52 44 28 57 49  inter ((DWORD(WI
77a0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 4f  NAPI*)(HANDLE,LO
77b0: 4e 47 2c 50 4c 4f 4e 47 2c 20 5c 0a 20 20 20 20  NG,PLONG, \.    
77c0: 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63      DWORD))aSysc
77d0: 61 6c 6c 5b 35 34 5d 2e 70 43 75 72 72 65 6e 74  all[54].pCurrent
77e0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
77f0: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 6c 65  S_WINRT.  { "Sle
7800: 65 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ep",            
7810: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7820: 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20  Sleep,          
7830: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
7840: 6c 73 65 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c  lse.  { "Sleep",
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7860: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
7870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7880: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
7890: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 6c 65 65  ..#define osSlee
78a0: 70 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  p ((VOID(WINAPI*
78b0: 29 28 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  )(DWORD))aSyscal
78c0: 6c 5b 35 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[55].pCurrent).
78d0: 0a 20 20 7b 20 22 53 79 73 74 65 6d 54 69 6d 65  .  { "SystemTime
78e0: 54 6f 46 69 6c 65 54 69 6d 65 22 2c 20 20 20 20  ToFileTime",    
78f0: 28 53 59 53 43 41 4c 4c 29 53 79 73 74 65 6d 54  (SYSCALL)SystemT
7900: 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 2c 20 20  imeToFileTime,  
7910: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
7920: 6f 73 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69  osSystemTimeToFi
7930: 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49  leTime ((BOOL(WI
7940: 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20 53 59 53  NAPI*)(CONST SYS
7950: 54 45 4d 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20  TEMTIME*, \.    
7960: 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29      LPFILETIME))
7970: 61 53 79 73 63 61 6c 6c 5b 35 36 5d 2e 70 43 75  aSyscall[56].pCu
7980: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
7990: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
79a0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
79b0: 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65  .  { "UnlockFile
79c0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
79d0: 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46  (SYSCALL)UnlockF
79e0: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
79f0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7a00: 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20   "UnlockFile",  
7a10: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
7a20: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7a40: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  },.#endif..#ifnd
7a50: 65 66 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 0a  ef osUnlockFile.
7a60: 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b  #define osUnlock
7a70: 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  File ((BOOL(WINA
7a80: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
7a90: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  D,DWORD,DWORD, \
7aa0: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29  .        DWORD))
7ab0: 61 53 79 73 63 61 6c 6c 5b 35 37 5d 2e 70 43 75  aSyscall[57].pCu
7ac0: 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23  rrent).#endif..#
7ad0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
7ae0: 4e 43 45 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46  NCE.  { "UnlockF
7af0: 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20  ileEx",         
7b00: 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f     (SYSCALL)Unlo
7b10: 63 6b 46 69 6c 65 45 78 2c 20 20 20 20 20 20 20  ckFileEx,       
7b20: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
7b30: 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45    { "UnlockFileE
7b40: 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  x",            (
7b50: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
7b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b70: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
7b80: 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69  efine osUnlockFi
7b90: 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41  leEx ((BOOL(WINA
7ba0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
7bb0: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  D,DWORD,DWORD, \
7bc0: 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c  .        LPOVERL
7bd0: 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b  APPED))aSyscall[
7be0: 35 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  58].pCurrent)..#
7bf0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
7c00: 43 45 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  CE || !defined(S
7c10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20  QLITE_OMIT_WAL) 
7c20: 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  || SQLITE_MAX_MM
7c30: 41 50 5f 53 49 5a 45 3e 30 0a 20 20 7b 20 22 55  AP_SIZE>0.  { "U
7c40: 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c  nmapViewOfFile",
7c50: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
7c60: 4c 29 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c  L)UnmapViewOfFil
7c70: 65 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  e,         0 },.
7c80: 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6d 61 70  #else.  { "Unmap
7c90: 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20  ViewOfFile",    
7ca0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
7cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cc0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
7cd0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e  if..#define osUn
7ce0: 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28  mapViewOfFile ((
7cf0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50  BOOL(WINAPI*)(LP
7d00: 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  CVOID))aSyscall[
7d10: 35 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  59].pCurrent).. 
7d20: 20 7b 20 22 57 69 64 65 43 68 61 72 54 6f 4d 75   { "WideCharToMu
7d30: 6c 74 69 42 79 74 65 22 2c 20 20 20 20 20 28 53  ltiByte",     (S
7d40: 59 53 43 41 4c 4c 29 57 69 64 65 43 68 61 72 54  YSCALL)WideCharT
7d50: 6f 4d 75 6c 74 69 42 79 74 65 2c 20 20 20 20 20  oMultiByte,     
7d60: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
7d70: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
7d80: 79 74 65 20 28 28 69 6e 74 28 57 49 4e 41 50 49  yte ((int(WINAPI
7d90: 2a 29 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50  *)(UINT,DWORD,LP
7da0: 43 57 53 54 52 2c 69 6e 74 2c 4c 50 53 54 52 2c  CWSTR,int,LPSTR,
7db0: 69 6e 74 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  int, \.        L
7dc0: 50 43 53 54 52 2c 4c 50 42 4f 4f 4c 29 29 61 53  PCSTR,LPBOOL))aS
7dd0: 79 73 63 61 6c 6c 5b 36 30 5d 2e 70 43 75 72 72  yscall[60].pCurr
7de0: 65 6e 74 29 0a 0a 20 20 7b 20 22 57 72 69 74 65  ent)..  { "Write
7df0: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
7e00: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 72       (SYSCALL)Wr
7e10: 69 74 65 46 69 6c 65 2c 20 20 20 20 20 20 20 20  iteFile,        
7e20: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
7e30: 66 69 6e 65 20 6f 73 57 72 69 74 65 46 69 6c 65  fine osWriteFile
7e40: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
7e50: 28 48 41 4e 44 4c 45 2c 4c 50 43 56 4f 49 44 2c  (HANDLE,LPCVOID,
7e60: 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c  DWORD,LPDWORD, \
7e70: 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c  .        LPOVERL
7e80: 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b  APPED))aSyscall[
7e90: 36 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  61].pCurrent)..#
7ea0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
7eb0: 52 54 0a 20 20 7b 20 22 43 72 65 61 74 65 45 76  RT.  { "CreateEv
7ec0: 65 6e 74 45 78 57 22 2c 20 20 20 20 20 20 20 20  entExW",        
7ed0: 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74    (SYSCALL)Creat
7ee0: 65 45 76 65 6e 74 45 78 57 2c 20 20 20 20 20 20  eEventExW,      
7ef0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
7f00: 20 7b 20 22 43 72 65 61 74 65 45 76 65 6e 74 45   { "CreateEventE
7f10: 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  xW",          (S
7f20: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
7f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f40: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
7f50: 66 69 6e 65 20 6f 73 43 72 65 61 74 65 45 76 65  fine osCreateEve
7f60: 6e 74 45 78 57 20 28 28 48 41 4e 44 4c 45 28 57  ntExW ((HANDLE(W
7f70: 49 4e 41 50 49 2a 29 28 4c 50 53 45 43 55 52 49  INAPI*)(LPSECURI
7f80: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 4c 50  TY_ATTRIBUTES,LP
7f90: 43 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20  CWSTR, \.       
7fa0: 20 44 57 4f 52 44 2c 44 57 4f 52 44 29 29 61 53   DWORD,DWORD))aS
7fb0: 79 73 63 61 6c 6c 5b 36 32 5d 2e 70 43 75 72 72  yscall[62].pCurr
7fc0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
7fd0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
7fe0: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
7ff0: 65 63 74 22 2c 20 20 20 20 20 28 53 59 53 43 41  ect",     (SYSCA
8000: 4c 4c 29 57 61 69 74 46 6f 72 53 69 6e 67 6c 65  LL)WaitForSingle
8010: 4f 62 6a 65 63 74 2c 20 20 20 20 20 30 20 7d 2c  Object,     0 },
8020: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 57 61 69 74  .#else.  { "Wait
8030: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 22  ForSingleObject"
8040: 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30  ,     (SYSCALL)0
8050: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8060: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
8070: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57  dif..#define osW
8080: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
8090: 63 74 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  ct ((DWORD(WINAP
80a0: 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20  I*)(HANDLE, \.  
80b0: 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79        DWORD))aSy
80c0: 73 63 61 6c 6c 5b 36 33 5d 2e 70 43 75 72 72 65  scall[63].pCurre
80d0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
80e0: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 57  _OS_WINCE.  { "W
80f0: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
8100: 63 74 45 78 22 2c 20 20 20 28 53 59 53 43 41 4c  ctEx",   (SYSCAL
8110: 4c 29 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f  L)WaitForSingleO
8120: 62 6a 65 63 74 45 78 2c 20 20 20 30 20 7d 2c 0a  bjectEx,   0 },.
8130: 23 65 6c 73 65 0a 20 20 7b 20 22 57 61 69 74 46  #else.  { "WaitF
8140: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78  orSingleObjectEx
8150: 22 2c 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c  ",   (SYSCALL)0,
8160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8170: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
8180: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 61  if..#define osWa
8190: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
81a0: 74 45 78 20 28 28 44 57 4f 52 44 28 57 49 4e 41  tEx ((DWORD(WINA
81b0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
81c0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 42 4f 4f  D, \.        BOO
81d0: 4c 29 29 61 53 79 73 63 61 6c 6c 5b 36 34 5d 2e  L))aSyscall[64].
81e0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
81f0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
8200: 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74   { "SetFilePoint
8210: 65 72 45 78 22 2c 20 20 20 20 20 20 20 20 28 53  erEx",        (S
8220: 59 53 43 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f  YSCALL)SetFilePo
8230: 69 6e 74 65 72 45 78 2c 20 20 20 20 20 20 20 20  interEx,        
8240: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
8250: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78  SetFilePointerEx
8260: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
8270: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
8280: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
8290: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
82a0: 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65   osSetFilePointe
82b0: 72 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  rEx ((BOOL(WINAP
82c0: 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 41 52 47 45  I*)(HANDLE,LARGE
82d0: 5f 49 4e 54 45 47 45 52 2c 20 5c 0a 20 20 20 20  _INTEGER, \.    
82e0: 20 20 20 20 50 4c 41 52 47 45 5f 49 4e 54 45 47      PLARGE_INTEG
82f0: 45 52 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61  ER,DWORD))aSysca
8300: 6c 6c 5b 36 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[65].pCurrent)
8310: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
8320: 57 49 4e 52 54 20 7c 7c 20 28 64 65 66 69 6e 65  WINRT || (define
8330: 64 28 5f 57 49 4e 33 32 5f 57 49 4e 4e 54 29 20  d(_WIN32_WINNT) 
8340: 26 26 20 5c 0a 20 20 20 20 20 20 20 20 5f 57 49  && \.        _WI
8350: 4e 33 32 5f 57 49 4e 4e 54 20 3e 3d 20 5f 57 49  N32_WINNT >= _WI
8360: 4e 33 32 5f 57 49 4e 4e 54 5f 57 49 4e 38 29 0a  N32_WINNT_WIN8).
8370: 20 20 7b 20 22 47 65 74 46 69 6c 65 49 6e 66 6f    { "GetFileInfo
8380: 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45  rmationByHandleE
8390: 78 22 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74  x", (SYSCALL)Get
83a0: 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42  FileInformationB
83b0: 79 48 61 6e 64 6c 65 45 78 2c 20 30 20 7d 2c 0a  yHandleEx, 0 },.
83c0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69  #else.  { "GetFi
83d0: 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48  leInformationByH
83e0: 61 6e 64 6c 65 45 78 22 2c 20 28 53 59 53 43 41  andleEx", (SYSCA
83f0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
8400: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
8410: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
8420: 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e  tFileInformation
8430: 42 79 48 61 6e 64 6c 65 45 78 20 28 28 42 4f 4f  ByHandleEx ((BOO
8440: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
8450: 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 46 49 4c  E, \.        FIL
8460: 45 5f 49 4e 46 4f 5f 42 59 5f 48 41 4e 44 4c 45  E_INFO_BY_HANDLE
8470: 5f 43 4c 41 53 53 2c 4c 50 56 4f 49 44 2c 44 57  _CLASS,LPVOID,DW
8480: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 36  ORD))aSyscall[66
8490: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
84a0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
84b0: 20 26 26 20 28 21 64 65 66 69 6e 65 64 28 53 51   && (!defined(SQ
84c0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c  LITE_OMIT_WAL) |
84d0: 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  | SQLITE_MAX_MMA
84e0: 50 5f 53 49 5a 45 3e 30 29 0a 20 20 7b 20 22 4d  P_SIZE>0).  { "M
84f0: 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d  apViewOfFileFrom
8500: 41 70 70 22 2c 20 20 20 20 28 53 59 53 43 41 4c  App",    (SYSCAL
8510: 4c 29 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46  L)MapViewOfFileF
8520: 72 6f 6d 41 70 70 2c 20 20 20 20 30 20 7d 2c 0a  romApp,    0 },.
8530: 23 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70 56 69  #else.  { "MapVi
8540: 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 22  ewOfFileFromApp"
8550: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c  ,    (SYSCALL)0,
8560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8570: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
8580: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61  if..#define osMa
8590: 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41  pViewOfFileFromA
85a0: 70 70 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41  pp ((LPVOID(WINA
85b0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 55 4c 4f 4e  PI*)(HANDLE,ULON
85c0: 47 2c 55 4c 4f 4e 47 36 34 2c 20 5c 0a 20 20 20  G,ULONG64, \.   
85d0: 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79       SIZE_T))aSy
85e0: 73 63 61 6c 6c 5b 36 37 5d 2e 70 43 75 72 72 65  scall[67].pCurre
85f0: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
8600: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43 72  OS_WINRT.  { "Cr
8610: 65 61 74 65 46 69 6c 65 32 22 2c 20 20 20 20 20  eateFile2",     
8620: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
8630: 29 43 72 65 61 74 65 46 69 6c 65 32 2c 20 20 20  )CreateFile2,   
8640: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
8650: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
8660: 46 69 6c 65 32 22 2c 20 20 20 20 20 20 20 20 20  File2",         
8670: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
8680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8690: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
86a0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
86b0: 61 74 65 46 69 6c 65 32 20 28 28 48 41 4e 44 4c  ateFile2 ((HANDL
86c0: 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53  E(WINAPI*)(LPCWS
86d0: 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44  TR,DWORD,DWORD,D
86e0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
86f0: 4c 50 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58  LPCREATEFILE2_EX
8700: 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52  TENDED_PARAMETER
8710: 53 29 29 61 53 79 73 63 61 6c 6c 5b 36 38 5d 2e  S))aSyscall[68].
8720: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
8730: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
8740: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
8750: 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
8760: 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64  NSION).  { "Load
8770: 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 22  PackagedLibrary"
8780: 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c  ,     (SYSCALL)L
8790: 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61  oadPackagedLibra
87a0: 72 79 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ry,     0 },.#el
87b0: 73 65 0a 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b  se.  { "LoadPack
87c0: 61 67 65 64 4c 69 62 72 61 72 79 22 2c 20 20 20  agedLibrary",   
87d0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
87e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87f0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
8800: 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 50  .#define osLoadP
8810: 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 20 28  ackagedLibrary (
8820: 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a  (HMODULE(WINAPI*
8830: 29 28 4c 50 43 57 53 54 52 2c 20 5c 0a 20 20 20  )(LPCWSTR, \.   
8840: 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73       DWORD))aSys
8850: 63 61 6c 6c 5b 36 39 5d 2e 70 43 75 72 72 65 6e  call[69].pCurren
8860: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
8870: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74  S_WINRT.  { "Get
8880: 54 69 63 6b 43 6f 75 6e 74 36 34 22 2c 20 20 20  TickCount64",   
8890: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
88a0: 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 2c 20  GetTickCount64, 
88b0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
88c0: 6c 73 65 0a 20 20 7b 20 22 47 65 74 54 69 63 6b  lse.  { "GetTick
88d0: 43 6f 75 6e 74 36 34 22 2c 20 20 20 20 20 20 20  Count64",       
88e0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
88f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8900: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
8910: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54  ..#define osGetT
8920: 69 63 6b 43 6f 75 6e 74 36 34 20 28 28 55 4c 4f  ickCount64 ((ULO
8930: 4e 47 4c 4f 4e 47 28 57 49 4e 41 50 49 2a 29 28  NGLONG(WINAPI*)(
8940: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 37  VOID))aSyscall[7
8950: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
8960: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
8970: 54 0a 20 20 7b 20 22 47 65 74 4e 61 74 69 76 65  T.  { "GetNative
8980: 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20  SystemInfo",    
8990: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 4e 61 74   (SYSCALL)GetNat
89a0: 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20  iveSystemInfo,  
89b0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
89c0: 7b 20 22 47 65 74 4e 61 74 69 76 65 53 79 73 74  { "GetNativeSyst
89d0: 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 28 53 59  emInfo",     (SY
89e0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
89f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
8a00: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
8a10: 69 6e 65 20 6f 73 47 65 74 4e 61 74 69 76 65 53  ine osGetNativeS
8a20: 79 73 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44  ystemInfo ((VOID
8a30: 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20  (WINAPI*)( \.   
8a40: 20 20 20 20 20 4c 50 53 59 53 54 45 4d 5f 49 4e       LPSYSTEM_IN
8a50: 46 4f 29 29 61 53 79 73 63 61 6c 6c 5b 37 31 5d  FO))aSyscall[71]
8a60: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
8a70: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
8a80: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
8a90: 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67 53   { "OutputDebugS
8aa0: 74 72 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53  tringA",      (S
8ab0: 59 53 43 41 4c 4c 29 4f 75 74 70 75 74 44 65 62  YSCALL)OutputDeb
8ac0: 75 67 53 74 72 69 6e 67 41 2c 20 20 20 20 20 20  ugStringA,      
8ad0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
8ae0: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
8af0: 67 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  gA",      (SYSCA
8b00: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
8b10: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
8b20: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
8b30: 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74   osOutputDebugSt
8b40: 72 69 6e 67 41 20 28 28 56 4f 49 44 28 57 49 4e  ringA ((VOID(WIN
8b50: 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53  API*)(LPCSTR))aS
8b60: 79 73 63 61 6c 6c 5b 37 32 5d 2e 70 43 75 72 72  yscall[72].pCurr
8b70: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
8b80: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
8b90: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 4f 75  AS_WIDE).  { "Ou
8ba0: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57  tputDebugStringW
8bb0: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
8bc0: 29 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  )OutputDebugStri
8bd0: 6e 67 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23  ngW,      0 },.#
8be0: 65 6c 73 65 0a 20 20 7b 20 22 4f 75 74 70 75 74  else.  { "Output
8bf0: 44 65 62 75 67 53 74 72 69 6e 67 57 22 2c 20 20  DebugStringW",  
8c00: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
8c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c20: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
8c30: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4f 75 74  f..#define osOut
8c40: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 20  putDebugStringW 
8c50: 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  ((VOID(WINAPI*)(
8c60: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
8c70: 6c 5b 37 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[73].pCurrent).
8c80: 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 65 73 73  .  { "GetProcess
8c90: 48 65 61 70 22 2c 20 20 20 20 20 20 20 20 20 20  Heap",          
8ca0: 28 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63  (SYSCALL)GetProc
8cb0: 65 73 73 48 65 61 70 2c 20 20 20 20 20 20 20 20  essHeap,        
8cc0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
8cd0: 6f 73 47 65 74 50 72 6f 63 65 73 73 48 65 61 70  osGetProcessHeap
8ce0: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
8cf0: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c  *)(VOID))aSyscal
8d00: 6c 5b 37 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[74].pCurrent).
8d10: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
8d20: 49 4e 52 54 20 26 26 20 28 21 64 65 66 69 6e 65  INRT && (!define
8d30: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
8d40: 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  L) || SQLITE_MAX
8d50: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 29 0a 20 20  _MMAP_SIZE>0).  
8d60: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70  { "CreateFileMap
8d70: 70 69 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28 53  pingFromApp", (S
8d80: 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c  YSCALL)CreateFil
8d90: 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 2c  eMappingFromApp,
8da0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
8db0: 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  "CreateFileMappi
8dc0: 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28 53 59 53  ngFromApp", (SYS
8dd0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
8de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
8df0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
8e00: 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  e osCreateFileMa
8e10: 70 70 69 6e 67 46 72 6f 6d 41 70 70 20 28 28 48  ppingFromApp ((H
8e20: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48  ANDLE(WINAPI*)(H
8e30: 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20  ANDLE, \.       
8e40: 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52   LPSECURITY_ATTR
8e50: 49 42 55 54 45 53 2c 55 4c 4f 4e 47 2c 55 4c 4f  IBUTES,ULONG,ULO
8e60: 4e 47 36 34 2c 4c 50 43 57 53 54 52 29 29 61 53  NG64,LPCWSTR))aS
8e70: 79 73 63 61 6c 6c 5b 37 35 5d 2e 70 43 75 72 72  yscall[75].pCurr
8e80: 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 4e 4f 54 45  ent)../*.** NOTE
8e90: 3a 20 4f 6e 20 73 6f 6d 65 20 73 75 62 2d 70 6c  : On some sub-pl
8ea0: 61 74 66 6f 72 6d 73 2c 20 74 68 65 20 49 6e 74  atforms, the Int
8eb0: 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45  erlockedCompareE
8ec0: 78 63 68 61 6e 67 65 20 22 66 75 6e 63 74 69 6f  xchange "functio
8ed0: 6e 22 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 72  n".**       is r
8ee0: 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6d 61 63  eally just a mac
8ef0: 72 6f 20 74 68 61 74 20 75 73 65 73 20 61 20 63  ro that uses a c
8f00: 6f 6d 70 69 6c 65 72 20 69 6e 74 72 69 6e 73 69  ompiler intrinsi
8f10: 63 20 28 65 2e 67 2e 20 78 36 34 29 2e 0a 2a 2a  c (e.g. x64)..**
8f20: 20 20 20 20 20 20 20 53 6f 20 64 6f 20 6e 6f 74         So do not
8f30: 20 74 72 79 20 74 6f 20 6d 61 6b 65 20 74 68 69   try to make thi
8f40: 73 20 69 73 20 69 6e 74 6f 20 61 20 72 65 64 65  s is into a rede
8f50: 66 69 6e 61 62 6c 65 20 69 6e 74 65 72 66 61 63  finable interfac
8f60: 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  e..*/.#if define
8f70: 64 28 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d  d(InterlockedCom
8f80: 70 61 72 65 45 78 63 68 61 6e 67 65 29 0a 20 20  pareExchange).  
8f90: 7b 20 22 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f  { "InterlockedCo
8fa0: 6d 70 61 72 65 45 78 63 68 61 6e 67 65 22 2c 20  mpareExchange", 
8fb0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
8fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
8fd0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 49   },..#define osI
8fe0: 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72  nterlockedCompar
8ff0: 65 45 78 63 68 61 6e 67 65 20 49 6e 74 65 72 6c  eExchange Interl
9000: 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68  ockedCompareExch
9010: 61 6e 67 65 0a 23 65 6c 73 65 0a 20 20 7b 20 22  ange.#else.  { "
9020: 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61  InterlockedCompa
9030: 72 65 45 78 63 68 61 6e 67 65 22 2c 20 28 53 59  reExchange", (SY
9040: 53 43 41 4c 4c 29 49 6e 74 65 72 6c 6f 63 6b 65  SCALL)Interlocke
9050: 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65  dCompareExchange
9060: 2c 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20  , 0 },..#define 
9070: 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d  osInterlockedCom
9080: 70 61 72 65 45 78 63 68 61 6e 67 65 20 28 28 4c  pareExchange ((L
9090: 4f 4e 47 28 57 49 4e 41 50 49 2a 29 28 4c 4f 4e  ONG(WINAPI*)(LON
90a0: 47 20 5c 0a 20 20 20 20 20 20 20 20 53 51 4c 49  G \.        SQLI
90b0: 54 45 5f 57 49 4e 33 32 5f 56 4f 4c 41 54 49 4c  TE_WIN32_VOLATIL
90c0: 45 2a 2c 20 4c 4f 4e 47 2c 4c 4f 4e 47 29 29 61  E*, LONG,LONG))a
90d0: 53 79 73 63 61 6c 6c 5b 37 36 5d 2e 70 43 75 72  Syscall[76].pCur
90e0: 72 65 6e 74 29 0a 23 65 6e 64 69 66 20 2f 2a 20  rent).#endif /* 
90f0: 64 65 66 69 6e 65 64 28 49 6e 74 65 72 6c 6f 63  defined(Interloc
9100: 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e  kedCompareExchan
9110: 67 65 29 20 2a 2f 0a 0a 23 69 66 20 21 53 51 4c  ge) */..#if !SQL
9120: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
9130: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
9140: 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   && SQLITE_WIN32
9150: 5f 55 53 45 5f 55 55 49 44 0a 20 20 7b 20 22 55  _USE_UUID.  { "U
9160: 75 69 64 43 72 65 61 74 65 22 2c 20 20 20 20 20  uidCreate",     
9170: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
9180: 4c 4c 29 55 75 69 64 43 72 65 61 74 65 2c 20 20  LL)UuidCreate,  
9190: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
91a0: 23 65 6c 73 65 0a 20 20 7b 20 22 55 75 69 64 43  #else.  { "UuidC
91b0: 72 65 61 74 65 22 2c 20 20 20 20 20 20 20 20 20  reate",         
91c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
91d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
91e0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
91f0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 75  if..#define osUu
9200: 69 64 43 72 65 61 74 65 20 28 28 52 50 43 5f 53  idCreate ((RPC_S
9210: 54 41 54 55 53 28 52 50 43 5f 45 4e 54 52 59 2a  TATUS(RPC_ENTRY*
9220: 29 28 55 55 49 44 2a 29 29 61 53 79 73 63 61 6c  )(UUID*))aSyscal
9230: 6c 5b 37 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[77].pCurrent).
9240: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
9250: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
9260: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 53 51 4c  _OS_WINRT && SQL
9270: 49 54 45 5f 57 49 4e 33 32 5f 55 53 45 5f 55 55  ITE_WIN32_USE_UU
9280: 49 44 0a 20 20 7b 20 22 55 75 69 64 43 72 65 61  ID.  { "UuidCrea
9290: 74 65 53 65 71 75 65 6e 74 69 61 6c 22 2c 20 20  teSequential",  
92a0: 20 20 20 28 53 59 53 43 41 4c 4c 29 55 75 69 64     (SYSCALL)Uuid
92b0: 43 72 65 61 74 65 53 65 71 75 65 6e 74 69 61 6c  CreateSequential
92c0: 2c 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20  ,   0 },.#else. 
92d0: 20 7b 20 22 55 75 69 64 43 72 65 61 74 65 53 65   { "UuidCreateSe
92e0: 71 75 65 6e 74 69 61 6c 22 2c 20 20 20 20 20 28  quential",     (
92f0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
9300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9310: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
9320: 66 69 6e 65 20 6f 73 55 75 69 64 43 72 65 61 74  fine osUuidCreat
9330: 65 53 65 71 75 65 6e 74 69 61 6c 20 5c 0a 20 20  eSequential \.  
9340: 20 20 20 20 20 20 28 28 52 50 43 5f 53 54 41 54        ((RPC_STAT
9350: 55 53 28 52 50 43 5f 45 4e 54 52 59 2a 29 28 55  US(RPC_ENTRY*)(U
9360: 55 49 44 2a 29 29 61 53 79 73 63 61 6c 6c 5b 37  UID*))aSyscall[7
9370: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  8].pCurrent)..#i
9380: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
9390: 45 5f 4e 4f 5f 53 59 4e 43 29 20 26 26 20 53 51  E_NO_SYNC) && SQ
93a0: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
93b0: 5a 45 3e 30 0a 20 20 7b 20 22 46 6c 75 73 68 56  ZE>0.  { "FlushV
93c0: 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20  iewOfFile",     
93d0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6c       (SYSCALL)Fl
93e0: 75 73 68 56 69 65 77 4f 66 46 69 6c 65 2c 20 20  ushViewOfFile,  
93f0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
9400: 0a 20 20 7b 20 22 46 6c 75 73 68 56 69 65 77 4f  .  { "FlushViewO
9410: 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  fFile",         
9420: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
9430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9440: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
9450: 64 65 66 69 6e 65 20 6f 73 46 6c 75 73 68 56 69  define osFlushVi
9460: 65 77 4f 66 46 69 6c 65 20 5c 0a 20 20 20 20 20  ewOfFile \.     
9470: 20 20 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49     ((BOOL(WINAPI
9480: 2a 29 28 4c 50 43 56 4f 49 44 2c 53 49 5a 45 5f  *)(LPCVOID,SIZE_
9490: 54 29 29 61 53 79 73 63 61 6c 6c 5b 37 39 5d 2e  T))aSyscall[79].
94a0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
94b0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
94c0: 4e 33 32 5f 56 49 53 54 41 5f 53 45 43 54 4f 52  N32_VISTA_SECTOR
94d0: 5f 53 49 5a 45 29 20 26 26 20 64 65 66 69 6e 65  _SIZE) && define
94e0: 64 28 5f 57 49 4e 33 32 5f 57 49 4e 4e 54 29 20  d(_WIN32_WINNT) 
94f0: 26 26 20 5c 0a 20 20 20 20 20 20 20 20 5f 57 49  && \.        _WI
9500: 4e 33 32 5f 57 49 4e 4e 54 20 3e 3d 20 5f 57 49  N32_WINNT >= _WI
9510: 4e 33 32 5f 57 49 4e 4e 54 5f 56 49 53 54 41 0a  N32_WINNT_VISTA.
9520: 20 20 7b 20 22 44 65 76 69 63 65 49 6f 43 6f 6e    { "DeviceIoCon
9530: 74 72 6f 6c 22 2c 20 20 20 20 20 20 20 20 20 20  trol",          
9540: 28 53 59 53 43 41 4c 4c 29 44 65 76 69 63 65 49  (SYSCALL)DeviceI
9550: 6f 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20  oControl,       
9560: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
9570: 22 44 65 76 69 63 65 49 6f 43 6f 6e 74 72 6f 6c  "DeviceIoControl
9580: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
9590: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
95a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
95b0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
95c0: 65 20 6f 73 44 65 76 69 63 65 49 6f 43 6f 6e 74  e osDeviceIoCont
95d0: 72 6f 6c 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  rol ((BOOL(WINAP
95e0: 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 48  I*)( \.        H
95f0: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f  ANDLE,DWORD,LPVO
9600: 49 44 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44 2c  ID,DWORD,LPVOID,
9610: 44 57 4f 52 44 2c 4c 50 56 4f 49 44 2c 20 5c 0a  DWORD,LPVOID, \.
9620: 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41          LPOVERLA
9630: 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 38  PPED))aSyscall[8
9640: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
9650: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
9660: 5f 57 49 4e 33 32 5f 56 49 53 54 41 5f 53 45 43  _WIN32_VISTA_SEC
9670: 54 4f 52 5f 53 49 5a 45 29 20 26 26 20 64 65 66  TOR_SIZE) && def
9680: 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57 49 4e 4e  ined(_WIN32_WINN
9690: 54 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20  T) && \.        
96a0: 5f 57 49 4e 33 32 5f 57 49 4e 4e 54 20 3e 3d 20  _WIN32_WINNT >= 
96b0: 5f 57 49 4e 33 32 5f 57 49 4e 4e 54 5f 56 49 53  _WIN32_WINNT_VIS
96c0: 54 41 0a 20 20 7b 20 22 47 65 74 56 6f 6c 75 6d  TA.  { "GetVolum
96d0: 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61  eInformationByHa
96e0: 6e 64 6c 65 57 22 2c 20 28 53 59 53 43 41 4c 4c  ndleW", (SYSCALL
96f0: 29 47 65 74 56 6f 6c 75 6d 65 49 6e 66 6f 72 6d  )GetVolumeInform
9700: 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 57 2c 20  ationByHandleW, 
9710: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
9720: 47 65 74 56 6f 6c 75 6d 65 49 6e 66 6f 72 6d 61  GetVolumeInforma
9730: 74 69 6f 6e 42 79 48 61 6e 64 6c 65 57 22 2c 20  tionByHandleW", 
9740: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
9750: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
9760: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
9770: 20 6f 73 47 65 74 56 6f 6c 75 6d 65 49 6e 66 6f   osGetVolumeInfo
9780: 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 57  rmationByHandleW
9790: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
97a0: 28 20 5c 0a 20 20 20 20 20 20 20 20 48 41 4e 44  ( \.        HAND
97b0: 4c 45 2c 4c 50 57 53 54 52 2c 44 57 4f 52 44 2c  LE,LPWSTR,DWORD,
97c0: 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c  LPDWORD,LPDWORD,
97d0: 4c 50 44 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20  LPDWORD,LPWSTR, 
97e0: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29  \.        DWORD)
97f0: 29 61 53 79 73 63 61 6c 6c 5b 38 31 5d 2e 70 43  )aSyscall[81].pC
9800: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
9810: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
9820: 32 5f 56 49 53 54 41 5f 53 45 43 54 4f 52 5f 53  2_VISTA_SECTOR_S
9830: 49 5a 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  IZE) && defined(
9840: 5f 57 49 4e 33 32 5f 57 49 4e 4e 54 29 20 26 26  _WIN32_WINNT) &&
9850: 20 5c 0a 20 20 20 20 20 20 20 20 5f 57 49 4e 33   \.        _WIN3
9860: 32 5f 57 49 4e 4e 54 20 3e 3d 20 5f 57 49 4e 33  2_WINNT >= _WIN3
9870: 32 5f 57 49 4e 4e 54 5f 56 49 53 54 41 0a 20 20  2_WINNT_VISTA.  
9880: 7b 20 22 47 65 74 56 6f 6c 75 6d 65 49 6e 66 6f  { "GetVolumeInfo
9890: 72 6d 61 74 69 6f 6e 57 22 2c 20 20 20 20 20 28  rmationW",     (
98a0: 53 59 53 43 41 4c 4c 29 47 65 74 56 6f 6c 75 6d  SYSCALL)GetVolum
98b0: 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 57 2c 20 30  eInformationW, 0
98c0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
98d0: 65 74 56 6f 6c 75 6d 65 49 6e 66 6f 72 6d 61 74  etVolumeInformat
98e0: 69 6f 6e 57 22 2c 20 20 20 20 20 28 53 59 53 43  ionW",     (SYSC
98f0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
9900: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
9910: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
9920: 6f 73 47 65 74 56 6f 6c 75 6d 65 49 6e 66 6f 72  osGetVolumeInfor
9930: 6d 61 74 69 6f 6e 57 20 28 28 42 4f 4f 4c 28 57  mationW ((BOOL(W
9940: 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20  INAPI*)( \.     
9950: 20 20 20 4c 50 43 57 53 54 52 2c 4c 50 57 53 54     LPCWSTR,LPWST
9960: 52 2c 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c  R,DWORD,LPDWORD,
9970: 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c  LPDWORD,LPDWORD,
9980: 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20  LPWSTR, \.      
9990: 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c    DWORD))aSyscal
99a0: 6c 5b 38 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[82].pCurrent).
99b0: 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68  .}; /* End of th
99c0: 65 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73  e overrideable s
99d0: 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a  ystem calls */..
99e0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
99f0: 65 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  e xSetSystemCall
9a00: 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c  () method of sql
9a10: 69 74 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c  ite3_vfs for all
9a20: 20 6f 66 20 74 68 65 0a 2a 2a 20 22 77 69 6e 33   of the.** "win3
9a30: 32 22 20 56 46 53 65 73 2e 20 20 52 65 74 75 72  2" VFSes.  Retur
9a40: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e  n SQLITE_OK opon
9a50: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 75 70   successfully up
9a60: 64 61 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79  dating the.** sy
9a70: 73 74 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65  stem call pointe
9a80: 72 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54  r, or SQLITE_NOT
9a90: 46 4f 55 4e 44 20 69 66 20 74 68 65 72 65 20 69  FOUND if there i
9aa0: 73 20 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c  s no configurabl
9ab0: 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c  e.** system call
9ac0: 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f   named zName..*/
9ad0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
9ae0: 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20  etSystemCall(.  
9af0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f  sqlite3_vfs *pNo
9b00: 74 55 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a  tUsed,        /*
9b10: 20 54 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72   The VFS pointer
9b20: 2e 20 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20  .  Not used */. 
9b30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
9b40: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  me,            /
9b50: 2a 20 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d  * Name of system
9b60: 20 63 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64   call to overrid
9b70: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  e */.  sqlite3_s
9b80: 79 73 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46  yscall_ptr pNewF
9b90: 75 6e 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  unc  /* Pointer 
9ba0: 74 6f 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61  to new system ca
9bb0: 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20  ll value */.){. 
9bc0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
9bd0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
9be0: 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20  TE_NOTFOUND;..  
9bf0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
9c00: 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66  (pNotUsed);.  if
9c10: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zName==0 ){.  
9c20: 20 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65    /* If no zName
9c30: 20 69 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f   is given, resto
9c40: 72 65 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61  re all system ca
9c50: 6c 6c 73 20 74 6f 20 74 68 65 69 72 20 64 65 66  lls to their def
9c60: 61 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74  ault.    ** sett
9c70: 69 6e 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20  ings and return 
9c80: 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20  NULL.    */.    
9c90: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
9ca0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
9cb0: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f  izeof(aSyscall)/
9cc0: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b  sizeof(aSyscall[
9cd0: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  0]); i++){.     
9ce0: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
9cf0: 2e 70 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20  .pDefault ){.   
9d00: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d       aSyscall[i]
9d10: 2e 70 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73  .pCurrent = aSys
9d20: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
9d30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9d40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
9d50: 49 66 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63  If zName is spec
9d60: 69 66 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f  ified, operate o
9d70: 6e 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73  n only the one s
9d80: 79 73 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a  ystem call.    *
9d90: 2a 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20  * specified..   
9da0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
9db0: 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61   i<sizeof(aSysca
9dc0: 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63  ll)/sizeof(aSysc
9dd0: 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  all[0]); i++){. 
9de0: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
9df0: 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b  zName, aSyscall[
9e00: 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
9e10: 20 20 20 20 20 20 20 20 69 66 28 20 61 53 79 73          if( aSys
9e20: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
9e30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
9e40: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
9e50: 66 61 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c  fault = aSyscall
9e60: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20  [i].pCurrent;.  
9e70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9e80: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
9e90: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
9ea0: 46 75 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75  Func==0 ) pNewFu
9eb0: 6e 63 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  nc = aSyscall[i]
9ec0: 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20  .pDefault;.     
9ed0: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
9ee0: 43 75 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75  Current = pNewFu
9ef0: 6e 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  nc;.        brea
9f00: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
9f10: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
9f20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
9f30: 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61  n the value of a
9f40: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52   system call.  R
9f50: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e  eturn NULL if zN
9f60: 61 6d 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20  ame is not a.** 
9f70: 72 65 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65  recognized syste
9f80: 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55  m call name.  NU
9f90: 4c 4c 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72  LL is also retur
9fa0: 6e 65 64 20 69 66 20 74 68 65 20 73 79 73 74 65  ned if the syste
9fb0: 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72  m call.** is cur
9fc0: 72 65 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64  rently undefined
9fd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  ..*/.static sqli
9fe0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
9ff0: 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c  winGetSystemCall
a000: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
a010: 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e  *pNotUsed,.  con
a020: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29  st char *zName.)
a030: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  {.  unsigned int
a040: 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41   i;..  UNUSED_PA
a050: 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64  RAMETER(pNotUsed
a060: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
a070: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29  sizeof(aSyscall)
a080: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  /sizeof(aSyscall
a090: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
a0a0: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
a0b0: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  , aSyscall[i].zN
a0c0: 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ame)==0 ) return
a0d0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
a0e0: 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74  rrent;.  }.  ret
a0f0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
a100: 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
a110: 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73  of the first sys
a120: 74 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a  tem call after z
a130: 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d  Name.  If zName=
a140: 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65  =NULL.** then re
a150: 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
a160: 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65   the first syste
a170: 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20  m call.  Return 
a180: 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a  NULL if zName.**
a190: 20 69 73 20 74 68 65 20 6c 61 73 74 20 73 79 73   is the last sys
a1a0: 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a  tem call or if z
a1b0: 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20  Name is not the 
a1c0: 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a  name of a valid.
a1d0: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a  ** system call..
a1e0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
a1f0: 63 68 61 72 20 2a 77 69 6e 4e 65 78 74 53 79 73  char *winNextSys
a200: 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f  temCall(sqlite3_
a210: 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  vfs *p, const ch
a220: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
a230: 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55  t i = -1;..  UNU
a240: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
a250: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b  ;.  if( zName ){
a260: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
a270: 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61  ArraySize(aSysca
a280: 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  ll)-1; i++){.   
a290: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
a2a0: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
a2b0: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  .zName)==0 ) bre
a2c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
a2d0: 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79  for(i++; i<Array
a2e0: 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20  Size(aSyscall); 
a2f0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53  i++){.    if( aS
a300: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
a310: 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61  nt!=0 ) return a
a320: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
a330: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
a340: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
a350: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a  TE_WIN32_MALLOC.
a360: 2f 2a 0a 2a 2a 20 49 66 20 61 20 57 69 6e 33 32  /*.** If a Win32
a370: 20 6e 61 74 69 76 65 20 68 65 61 70 20 68 61 73   native heap has
a380: 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64   been configured
a390: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
a3a0: 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f 0a  will attempt to.
a3b0: 2a 2a 20 63 6f 6d 70 61 63 74 20 69 74 2e 20 20  ** compact it.  
a3c0: 55 70 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51  Upon success, SQ
a3d0: 4c 49 54 45 5f 4f 4b 20 77 69 6c 6c 20 62 65 20  LITE_OK will be 
a3e0: 72 65 74 75 72 6e 65 64 2e 20 20 55 70 6f 6e 20  returned.  Upon 
a3f0: 66 61 69 6c 75 72 65 2c 20 6f 6e 65 0a 2a 2a 20  failure, one.** 
a400: 6f 66 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  of SQLITE_NOMEM,
a410: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 6f   SQLITE_ERROR, o
a420: 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  r SQLITE_NOTFOUN
a430: 44 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  D will be return
a440: 65 64 2e 20 20 54 68 65 0a 2a 2a 20 22 70 6e 4c  ed.  The.** "pnL
a450: 61 72 67 65 73 74 22 20 61 72 67 75 6d 65 6e 74  argest" argument
a460: 2c 20 69 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 77  , if non-zero, w
a470: 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 72  ill be used to r
a480: 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
a490: 66 20 74 68 65 0a 2a 2a 20 6c 61 72 67 65 73 74  f the.** largest
a4a0: 20 63 6f 6d 6d 69 74 74 65 64 20 66 72 65 65 20   committed free 
a4b0: 62 6c 6f 63 6b 20 69 6e 20 74 68 65 20 68 65 61  block in the hea
a4c0: 70 2c 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a  p, in bytes..*/.
a4d0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  int sqlite3_win3
a4e0: 32 5f 63 6f 6d 70 61 63 74 5f 68 65 61 70 28 4c  2_compact_heap(L
a4f0: 50 55 49 4e 54 20 70 6e 4c 61 72 67 65 73 74 29  PUINT pnLargest)
a500: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
a510: 49 54 45 5f 4f 4b 3b 0a 20 20 55 49 4e 54 20 6e  ITE_OK;.  UINT n
a520: 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a 20 20 48  Largest = 0;.  H
a530: 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20  ANDLE hHeap;..  
a540: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
a550: 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77  c();.  hHeap = w
a560: 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a  inMemGetHeap();.
a570: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
a580: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
a590: 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48  hHeap!=INVALID_H
a5a0: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23  ANDLE_VALUE );.#
a5b0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
a5c0: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
a5d0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
a5e0: 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61  OC_VALIDATE).  a
a5f0: 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c  ssert( osHeapVal
a600: 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c  idate(hHeap, SQL
a610: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
a620: 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23  LAGS, NULL) );.#
a630: 65 6e 64 69 66 0a 23 69 66 20 21 53 51 4c 49 54  endif.#if !SQLIT
a640: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
a650: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
a660: 20 69 66 28 20 28 6e 4c 61 72 67 65 73 74 3d 6f   if( (nLargest=o
a670: 73 48 65 61 70 43 6f 6d 70 61 63 74 28 68 48 65  sHeapCompact(hHe
a680: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
a690: 5f 48 45 41 50 5f 46 4c 41 47 53 29 29 3d 3d 30  _HEAP_FLAGS))==0
a6a0: 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 6c 61   ){.    DWORD la
a6b0: 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
a6c0: 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
a6d0: 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 4e  if( lastErrno==N
a6e0: 4f 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20  O_ERROR ){.     
a6f0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
a700: 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c  ITE_NOMEM, "fail
a710: 65 64 20 74 6f 20 48 65 61 70 43 6f 6d 70 61 63  ed to HeapCompac
a720: 74 20 28 6e 6f 20 73 70 61 63 65 29 2c 20 68 65  t (no space), he
a730: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
a740: 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
a750: 29 68 48 65 61 70 29 3b 0a 20 20 20 20 20 20 72  )hHeap);.      r
a760: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
a770: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _BKPT;.    }else
a780: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
a790: 6c 6f 67 28 53 51 4c 49 54 45 5f 45 52 52 4f 52  log(SQLITE_ERROR
a7a0: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61  , "failed to Hea
a7b0: 70 43 6f 6d 70 61 63 74 20 28 25 6c 75 29 2c 20  pCompact (%lu), 
a7c0: 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20  heap=%p",.      
a7d0: 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
a7e0: 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76  tLastError(), (v
a7f0: 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 20  oid*)hHeap);.   
a800: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
a810: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RROR;.    }.  }.
a820: 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 5f  #else.  sqlite3_
a830: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  log(SQLITE_NOTFO
a840: 55 4e 44 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  UND, "failed to 
a850: 48 65 61 70 43 6f 6d 70 61 63 74 2c 20 68 65 61  HeapCompact, hea
a860: 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20  p=%p",.         
a870: 20 20 20 20 20 28 76 6f 69 64 2a 29 68 48 65 61       (void*)hHea
a880: 70 29 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49 54  p);.  rc = SQLIT
a890: 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 23 65 6e 64  E_NOTFOUND;.#end
a8a0: 69 66 0a 20 20 69 66 28 20 70 6e 4c 61 72 67 65  if.  if( pnLarge
a8b0: 73 74 20 29 20 2a 70 6e 4c 61 72 67 65 73 74 20  st ) *pnLargest 
a8c0: 3d 20 6e 4c 61 72 67 65 73 74 3b 0a 20 20 72 65  = nLargest;.  re
a8d0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
a8e0: 2a 20 49 66 20 61 20 57 69 6e 33 32 20 6e 61 74  * If a Win32 nat
a8f0: 69 76 65 20 68 65 61 70 20 68 61 73 20 62 65 65  ive heap has bee
a900: 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 74 68  n configured, th
a910: 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  is function will
a920: 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 64   attempt to.** d
a930: 65 73 74 72 6f 79 20 61 6e 64 20 72 65 63 72 65  estroy and recre
a940: 61 74 65 20 69 74 2e 20 20 49 66 20 74 68 65 20  ate it.  If the 
a950: 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61  Win32 native hea
a960: 70 20 69 73 20 6e 6f 74 20 69 73 6f 6c 61 74 65  p is not isolate
a970: 64 20 61 6e 64 2f 6f 72 0a 2a 2a 20 74 68 65 20  d and/or.** the 
a980: 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75  sqlite3_memory_u
a990: 73 65 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 64  sed() function d
a9a0: 6f 65 73 20 6e 6f 74 20 72 65 74 75 72 6e 20 7a  oes not return z
a9b0: 65 72 6f 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  ero, SQLITE_BUSY
a9c0: 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 72 65 74 75   will.** be retu
a9d0: 72 6e 65 64 20 61 6e 64 20 6e 6f 20 63 68 61 6e  rned and no chan
a9e0: 67 65 73 20 77 69 6c 6c 20 62 65 20 6d 61 64 65  ges will be made
a9f0: 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 6e 61   to the Win32 na
aa00: 74 69 76 65 20 68 65 61 70 2e 0a 2a 2f 0a 69 6e  tive heap..*/.in
aa10: 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  t sqlite3_win32_
aa20: 72 65 73 65 74 5f 68 65 61 70 28 29 7b 0a 20 20  reset_heap(){.  
aa30: 69 6e 74 20 72 63 3b 0a 20 20 4d 55 54 45 58 5f  int rc;.  MUTEX_
aa40: 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
aa50: 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29  utex *pMaster; )
aa60: 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 73 74 61   /* The main sta
aa70: 74 69 63 20 6d 75 74 65 78 20 2a 2f 0a 20 20 4d  tic mutex */.  M
aa80: 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
aa90: 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 65 6d 3b  te3_mutex *pMem;
aaa0: 20 29 20 20 20 20 2f 2a 20 54 68 65 20 6d 65 6d   )    /* The mem
aab0: 73 79 73 20 73 74 61 74 69 63 20 6d 75 74 65 78  sys static mutex
aac0: 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49   */.  MUTEX_LOGI
aad0: 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c  C( pMaster = sql
aae0: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
aaf0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
ab00: 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20  IC_MASTER); ).  
ab10: 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 65  MUTEX_LOGIC( pMe
ab20: 6d 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  m = sqlite3Mutex
ab30: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
ab40: 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 29 3b 20  EX_STATIC_MEM); 
ab50: 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ).  sqlite3_mute
ab60: 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
ab70: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
ab80: 78 5f 65 6e 74 65 72 28 70 4d 65 6d 29 3b 0a 20  x_enter(pMem);. 
ab90: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
aba0: 69 63 28 29 3b 0a 20 20 69 66 28 20 77 69 6e 4d  ic();.  if( winM
abb0: 65 6d 47 65 74 48 65 61 70 28 29 21 3d 4e 55 4c  emGetHeap()!=NUL
abc0: 4c 20 26 26 20 77 69 6e 4d 65 6d 47 65 74 4f 77  L && winMemGetOw
abd0: 6e 65 64 28 29 20 26 26 20 73 71 6c 69 74 65 33  ned() && sqlite3
abe0: 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d  _memory_used()==
abf0: 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  0 ){.    /*.    
ac00: 2a 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  ** At this point
ac10: 2c 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62  , there should b
ac20: 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
ac30: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
ac40: 6f 6e 73 20 6f 6e 0a 20 20 20 20 2a 2a 20 74 68  ons on.    ** th
ac50: 65 20 68 65 61 70 2e 20 20 41 6c 73 6f 2c 20 73  e heap.  Also, s
ac60: 69 6e 63 65 20 62 6f 74 68 20 74 68 65 20 6d 61  ince both the ma
ac70: 73 74 65 72 20 61 6e 64 20 6d 65 6d 73 79 73 20  ster and memsys 
ac80: 6c 6f 63 6b 73 20 61 72 65 20 63 75 72 72 65 6e  locks are curren
ac90: 74 6c 79 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67  tly.    ** being
aca0: 20 68 65 6c 64 20 62 79 20 75 73 2c 20 6e 6f 20   held by us, no 
acb0: 6f 74 68 65 72 20 66 75 6e 63 74 69 6f 6e 20 28  other function (
acc0: 69 2e 65 2e 20 66 72 6f 6d 20 61 6e 6f 74 68 65  i.e. from anothe
acd0: 72 20 74 68 72 65 61 64 29 20 73 68 6f 75 6c 64  r thread) should
ace0: 0a 20 20 20 20 2a 2a 20 62 65 20 61 62 6c 65 20  .    ** be able 
acf0: 74 6f 20 65 76 65 6e 20 61 63 63 65 73 73 20 74  to even access t
ad00: 68 65 20 68 65 61 70 2e 20 20 41 74 74 65 6d 70  he heap.  Attemp
ad10: 74 20 74 6f 20 64 65 73 74 72 6f 79 20 61 6e 64  t to destroy and
ad20: 20 72 65 63 72 65 61 74 65 20 6f 75 72 0a 20 20   recreate our.  
ad30: 20 20 2a 2a 20 69 73 6f 6c 61 74 65 64 20 57 69    ** isolated Wi
ad40: 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 20  n32 native heap 
ad50: 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  now..    */.    
ad60: 61 73 73 65 72 74 28 20 77 69 6e 4d 65 6d 47 65  assert( winMemGe
ad70: 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c 20 29 3b  tHeap()!=NULL );
ad80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 69 6e  .    assert( win
ad90: 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20 29 3b  MemGetOwned() );
ada0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
adb0: 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64  ite3_memory_used
adc0: 28 29 3d 3d 30 20 29 3b 0a 20 20 20 20 77 69 6e  ()==0 );.    win
add0: 4d 65 6d 53 68 75 74 64 6f 77 6e 28 77 69 6e 4d  MemShutdown(winM
ade0: 65 6d 47 65 74 44 61 74 61 50 74 72 28 29 29 3b  emGetDataPtr());
adf0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 69 6e  .    assert( win
ae00: 4d 65 6d 47 65 74 48 65 61 70 28 29 3d 3d 4e 55  MemGetHeap()==NU
ae10: 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  LL );.    assert
ae20: 28 20 21 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65  ( !winMemGetOwne
ae30: 64 28 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  d() );.    asser
ae40: 74 28 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72  t( sqlite3_memor
ae50: 79 5f 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20  y_used()==0 );. 
ae60: 20 20 20 72 63 20 3d 20 77 69 6e 4d 65 6d 49 6e     rc = winMemIn
ae70: 69 74 28 77 69 6e 4d 65 6d 47 65 74 44 61 74 61  it(winMemGetData
ae80: 50 74 72 28 29 29 3b 0a 20 20 20 20 61 73 73 65  Ptr());.    asse
ae90: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
aea0: 4b 20 7c 7c 20 77 69 6e 4d 65 6d 47 65 74 48 65  K || winMemGetHe
aeb0: 61 70 28 29 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20  ap()!=NULL );.  
aec0: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
aed0: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 77 69 6e 4d 65  LITE_OK || winMe
aee0: 6d 47 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20  mGetOwned() );. 
aef0: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
af00: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69  QLITE_OK || sqli
af10: 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28  te3_memory_used(
af20: 29 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  )==0 );.  }else{
af30: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
af40: 68 65 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20  he Win32 native 
af50: 68 65 61 70 20 63 61 6e 6e 6f 74 20 62 65 20 6d  heap cannot be m
af60: 6f 64 69 66 69 65 64 20 62 65 63 61 75 73 65 20  odified because 
af70: 69 74 20 6d 61 79 20 62 65 20 69 6e 20 75 73 65  it may be in use
af80: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
af90: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
afa0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
afb0: 65 78 5f 6c 65 61 76 65 28 70 4d 65 6d 29 3b 0a  ex_leave(pMem);.
afc0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
afd0: 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a  leave(pMaster);.
afe0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
aff0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
b000: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a  WIN32_MALLOC */.
b010: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
b020: 74 69 6f 6e 20 6f 75 74 70 75 74 73 20 74 68 65  tion outputs the
b030: 20 73 70 65 63 69 66 69 65 64 20 28 41 4e 53 49   specified (ANSI
b040: 29 20 73 74 72 69 6e 67 20 74 6f 20 74 68 65 20  ) string to the 
b050: 57 69 6e 33 32 20 64 65 62 75 67 67 65 72 0a 2a  Win32 debugger.*
b060: 2a 20 28 69 66 20 61 76 61 69 6c 61 62 6c 65 29  * (if available)
b070: 2e 0a 2a 2f 0a 0a 76 6f 69 64 20 73 71 6c 69 74  ..*/..void sqlit
b080: 65 33 5f 77 69 6e 33 32 5f 77 72 69 74 65 5f 64  e3_win32_write_d
b090: 65 62 75 67 28 63 6f 6e 73 74 20 63 68 61 72 20  ebug(const char 
b0a0: 2a 7a 42 75 66 2c 20 69 6e 74 20 6e 42 75 66 29  *zBuf, int nBuf)
b0b0: 7b 0a 20 20 63 68 61 72 20 7a 44 62 67 42 75 66  {.  char zDbgBuf
b0c0: 5b 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42  [SQLITE_WIN32_DB
b0d0: 47 5f 42 55 46 5f 53 49 5a 45 5d 3b 0a 20 20 69  G_BUF_SIZE];.  i
b0e0: 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28 6e 42  nt nMin = MIN(nB
b0f0: 75 66 2c 20 28 53 51 4c 49 54 45 5f 57 49 4e 33  uf, (SQLITE_WIN3
b100: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 2d  2_DBG_BUF_SIZE -
b110: 20 31 29 29 3b 20 2f 2a 20 6d 61 79 20 62 65 20   1)); /* may be 
b120: 6e 65 67 61 74 69 76 65 2e 20 2a 2f 0a 20 20 69  negative. */.  i
b130: 66 28 20 6e 4d 69 6e 3c 2d 31 20 29 20 6e 4d 69  f( nMin<-1 ) nMi
b140: 6e 20 3d 20 2d 31 3b 20 2f 2a 20 61 6c 6c 20 6e  n = -1; /* all n
b150: 65 67 61 74 69 76 65 20 76 61 6c 75 65 73 20 62  egative values b
b160: 65 63 6f 6d 65 20 2d 31 2e 20 2a 2f 0a 20 20 61  ecome -1. */.  a
b170: 73 73 65 72 74 28 20 6e 4d 69 6e 3d 3d 2d 31 20  ssert( nMin==-1 
b180: 7c 7c 20 6e 4d 69 6e 3d 3d 30 20 7c 7c 20 6e 4d  || nMin==0 || nM
b190: 69 6e 3c 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  in<SQLITE_WIN32_
b1a0: 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 29 3b 0a  DBG_BUF_SIZE );.
b1b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
b1c0: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
b1d0: 20 69 66 28 20 21 7a 42 75 66 20 29 7b 0a 20 20   if( !zBuf ){.  
b1e0: 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
b1f0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
b200: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
b210: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
b220: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
b230: 41 4e 53 49 29 0a 20 20 69 66 28 20 6e 4d 69 6e  ANSI).  if( nMin
b240: 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  >0 ){.    memset
b250: 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c  (zDbgBuf, 0, SQL
b260: 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55  ITE_WIN32_DBG_BU
b270: 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d  F_SIZE);.    mem
b280: 63 70 79 28 7a 44 62 67 42 75 66 2c 20 7a 42 75  cpy(zDbgBuf, zBu
b290: 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 6f 73  f, nMin);.    os
b2a0: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
b2b0: 67 41 28 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d  gA(zDbgBuf);.  }
b2c0: 65 6c 73 65 7b 0a 20 20 20 20 6f 73 4f 75 74 70  else{.    osOutp
b2d0: 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 28 7a  utDebugStringA(z
b2e0: 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6c 69 66 20  Buf);.  }.#elif 
b2f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
b300: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
b310: 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c   memset(zDbgBuf,
b320: 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   0, SQLITE_WIN32
b330: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a  _DBG_BUF_SIZE);.
b340: 20 20 69 66 20 28 20 6f 73 4d 75 6c 74 69 42 79    if ( osMultiBy
b350: 74 65 54 6f 57 69 64 65 43 68 61 72 28 0a 20 20  teToWideChar(.  
b360: 20 20 20 20 20 20 20 20 6f 73 41 72 65 46 69 6c          osAreFil
b370: 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50  eApisANSI() ? CP
b380: 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 2c  _ACP : CP_OEMCP,
b390: 20 30 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20 20   0, zBuf,.      
b3a0: 20 20 20 20 6e 4d 69 6e 2c 20 28 4c 50 57 53 54      nMin, (LPWST
b3b0: 52 29 7a 44 62 67 42 75 66 2c 20 53 51 4c 49 54  R)zDbgBuf, SQLIT
b3c0: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
b3d0: 53 49 5a 45 2f 73 69 7a 65 6f 66 28 57 43 48 41  SIZE/sizeof(WCHA
b3e0: 52 29 29 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65  R))<=0 ){.    re
b3f0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 73 4f 75  turn;.  }.  osOu
b400: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57  tputDebugStringW
b410: 28 28 4c 50 43 57 53 54 52 29 7a 44 62 67 42 75  ((LPCWSTR)zDbgBu
b420: 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  f);.#else.  if( 
b430: 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65  nMin>0 ){.    me
b440: 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c  mset(zDbgBuf, 0,
b450: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42   SQLITE_WIN32_DB
b460: 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20  G_BUF_SIZE);.   
b470: 20 6d 65 6d 63 70 79 28 7a 44 62 67 42 75 66 2c   memcpy(zDbgBuf,
b480: 20 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20   zBuf, nMin);.  
b490: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
b4a0: 2c 20 22 25 73 22 2c 20 7a 44 62 67 42 75 66 29  , "%s", zDbgBuf)
b4b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
b4c0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
b4d0: 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a  %s", zBuf);.  }.
b4e0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
b4f0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
b500: 75 74 69 6e 65 20 73 75 73 70 65 6e 64 73 20 74  utine suspends t
b510: 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61  he current threa
b520: 64 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6d  d for at least m
b530: 73 0a 2a 2a 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  s.** millisecond
b540: 73 2e 20 20 54 68 69 73 20 69 73 20 65 71 75 69  s.  This is equi
b550: 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 57 69  valent to the Wi
b560: 6e 33 32 20 53 6c 65 65 70 28 29 20 69 6e 74 65  n32 Sleep() inte
b570: 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 20 53 51  rface..*/.#if SQ
b580: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 73 74  LITE_OS_WINRT.st
b590: 61 74 69 63 20 48 41 4e 44 4c 45 20 73 6c 65 65  atic HANDLE slee
b5a0: 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e  pObj = NULL;.#en
b5b0: 64 69 66 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65  dif..void sqlite
b5c0: 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 44 57  3_win32_sleep(DW
b5d0: 4f 52 44 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  ORD milliseconds
b5e0: 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
b5f0: 5f 57 49 4e 52 54 0a 20 20 69 66 20 28 20 73 6c  _WINRT.  if ( sl
b600: 65 65 70 4f 62 6a 3d 3d 4e 55 4c 4c 20 29 7b 0a  eepObj==NULL ){.
b610: 20 20 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20 6f      sleepObj = o
b620: 73 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 28  sCreateEventExW(
b630: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 43 52 45 41  NULL, NULL, CREA
b640: 54 45 5f 45 56 45 4e 54 5f 4d 41 4e 55 41 4c 5f  TE_EVENT_MANUAL_
b650: 52 45 53 45 54 2c 0a 20 20 20 20 20 20 20 20 20  RESET,.         
b660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b670: 20 20 20 20 20 20 20 53 59 4e 43 48 52 4f 4e 49         SYNCHRONI
b680: 5a 45 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ZE);.  }.  asser
b690: 74 28 20 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c  t( sleepObj!=NUL
b6a0: 4c 20 29 3b 0a 20 20 6f 73 57 61 69 74 46 6f 72  L );.  osWaitFor
b6b0: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 28 73  SingleObjectEx(s
b6c0: 6c 65 65 70 4f 62 6a 2c 20 6d 69 6c 6c 69 73 65  leepObj, millise
b6d0: 63 6f 6e 64 73 2c 20 46 41 4c 53 45 29 3b 0a 23  conds, FALSE);.#
b6e0: 65 6c 73 65 0a 20 20 6f 73 53 6c 65 65 70 28 6d  else.  osSleep(m
b6f0: 69 6c 6c 69 73 65 63 6f 6e 64 73 29 3b 0a 23 65  illiseconds);.#e
b700: 6e 64 69 66 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  ndif.}..#if SQLI
b710: 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48  TE_MAX_WORKER_TH
b720: 52 45 41 44 53 3e 30 20 26 26 20 21 53 51 4c 49  READS>0 && !SQLI
b730: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
b740: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
b750: 26 26 20 5c 0a 20 20 20 20 20 20 20 20 53 51 4c  && \.        SQL
b760: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30  ITE_THREADSAFE>0
b770: 0a 44 57 4f 52 44 20 73 71 6c 69 74 65 33 57 69  .DWORD sqlite3Wi
b780: 6e 33 32 57 61 69 74 28 48 41 4e 44 4c 45 20 68  n32Wait(HANDLE h
b790: 4f 62 6a 65 63 74 29 7b 0a 20 20 44 57 4f 52 44  Object){.  DWORD
b7a0: 20 72 63 3b 0a 20 20 77 68 69 6c 65 28 20 28 72   rc;.  while( (r
b7b0: 63 20 3d 20 6f 73 57 61 69 74 46 6f 72 53 69 6e  c = osWaitForSin
b7c0: 67 6c 65 4f 62 6a 65 63 74 45 78 28 68 4f 62 6a  gleObjectEx(hObj
b7d0: 65 63 74 2c 20 49 4e 46 49 4e 49 54 45 2c 0a 20  ect, INFINITE,. 
b7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b800: 20 20 20 20 20 20 54 52 55 45 29 29 3d 3d 57 41        TRUE))==WA
b810: 49 54 5f 49 4f 5f 43 4f 4d 50 4c 45 54 49 4f 4e  IT_IO_COMPLETION
b820: 20 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20 72 63   ){}.  return rc
b830: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
b840: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 28 6e  * Return true (n
b850: 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 77 65 20 61  on-zero) if we a
b860: 72 65 20 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72  re running under
b870: 20 57 69 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20 57   WinNT, Win2K, W
b880: 69 6e 58 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43  inXP,.** or WinC
b890: 45 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  E.  Return false
b8a0: 20 28 7a 65 72 6f 29 20 66 6f 72 20 57 69 6e 39   (zero) for Win9
b8b0: 35 2c 20 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e  5, Win98, or Win
b8c0: 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69  ME..**.** Here i
b8d0: 73 20 61 6e 20 69 6e 74 65 72 65 73 74 69 6e 67  s an interesting
b8e0: 20 6f 62 73 65 72 76 61 74 69 6f 6e 3a 20 20 57   observation:  W
b8f0: 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64  in95, Win98, and
b900: 20 57 69 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74   WinME lack.** t
b910: 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20  he LockFileEx() 
b920: 41 50 49 2e 20 20 42 75 74 20 77 65 20 63 61 6e  API.  But we can
b930: 20 73 74 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c   still staticall
b940: 79 20 6c 69 6e 6b 20 61 67 61 69 6e 73 74 20 74  y link against t
b950: 68 61 74 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f  hat.** API as lo
b960: 6e 67 20 61 73 20 77 65 20 64 6f 6e 27 74 20 63  ng as we don't c
b970: 61 6c 6c 20 69 74 20 77 68 65 6e 20 72 75 6e 6e  all it when runn
b980: 69 6e 67 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e  ing Win95/98/ME.
b990: 20 20 41 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74    A call to.** t
b9a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
b9b0: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
b9c0: 20 69 66 20 74 68 65 20 68 6f 73 74 20 69 73 20   if the host is 
b9d0: 57 69 6e 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a  Win95/98/ME or.*
b9e0: 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f  * WinNT/2K/XP so
b9f0: 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e   that we will kn
ba00: 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ow whether or no
ba10: 74 20 77 65 20 63 61 6e 20 73 61 66 65 6c 79 20  t we can safely 
ba20: 63 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b  call.** the Lock
ba30: 46 69 6c 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f  FileEx() API..*/
ba40: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 57 49  ..#if !SQLITE_WI
ba50: 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58  N32_GETVERSIONEX
ba60: 0a 23 20 64 65 66 69 6e 65 20 6f 73 49 73 4e 54  .# define osIsNT
ba70: 28 29 20 20 28 31 29 0a 23 65 6c 69 66 20 53 51  ()  (1).#elif SQ
ba80: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c  LITE_OS_WINCE ||
ba90: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
baa0: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
bab0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
bac0: 53 49 29 0a 23 20 64 65 66 69 6e 65 20 6f 73 49  SI).# define osI
bad0: 73 4e 54 28 29 20 20 28 31 29 0a 23 65 6c 69 66  sNT()  (1).#elif
bae0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
baf0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
bb00: 0a 23 20 64 65 66 69 6e 65 20 6f 73 49 73 4e 54  .# define osIsNT
bb10: 28 29 20 20 28 30 29 0a 23 65 6c 73 65 0a 23 20  ()  (0).#else.# 
bb20: 64 65 66 69 6e 65 20 6f 73 49 73 4e 54 28 29 20  define osIsNT() 
bb30: 20 28 28 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79   ((sqlite3_os_ty
bb40: 70 65 3d 3d 32 29 20 7c 7c 20 73 71 6c 69 74 65  pe==2) || sqlite
bb50: 33 5f 77 69 6e 33 32 5f 69 73 5f 6e 74 28 29 29  3_win32_is_nt())
bb60: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
bb70: 68 69 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 65  his following ve
bb80: 72 73 69 6f 6e 20 63 68 65 63 6b 69 6e 67 20 6d  rsion checking m
bb90: 61 63 72 6f 73 20 73 68 6f 75 6c 64 20 65 76 61  acros should eva
bba0: 6c 75 61 74 65 20 74 6f 20 6e 6f 6e 2d 7a 65 72  luate to non-zer
bbb0: 6f 20 6f 6e 6c 79 0a 2a 2a 20 77 68 65 6e 20 72  o only.** when r
bbc0: 75 6e 6e 69 6e 67 20 6f 6e 20 57 69 6e 64 6f 77  unning on Window
bbd0: 73 20 56 69 73 74 61 20 28 6f 72 20 68 69 67 68  s Vista (or high
bbe0: 65 72 29 20 6f 72 20 57 69 6e 64 6f 77 73 20 38  er) or Windows 8
bbf0: 20 28 6f 72 20 68 69 67 68 65 72 29 2e 0a 2a 2f   (or higher)..*/
bc00: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 57 49  ..#if !SQLITE_WI
bc10: 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58  N32_GETVERSIONEX
bc20: 0a 23 20 64 65 66 69 6e 65 20 6f 73 49 73 56 69  .# define osIsVi
bc30: 73 74 61 50 6c 75 73 28 29 20 20 28 31 29 0a 23  staPlus()  (1).#
bc40: 20 64 65 66 69 6e 65 20 6f 73 49 73 57 69 6e 38   define osIsWin8
bc50: 50 6c 75 73 28 29 20 20 20 28 31 29 0a 23 65 6c  Plus()   (1).#el
bc60: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
bc70: 43 45 0a 23 20 64 65 66 69 6e 65 20 6f 73 49 73  CE.# define osIs
bc80: 56 69 73 74 61 50 6c 75 73 28 29 20 20 28 30 29  VistaPlus()  (0)
bc90: 0a 23 20 64 65 66 69 6e 65 20 6f 73 49 73 57 69  .# define osIsWi
bca0: 6e 38 50 6c 75 73 28 29 20 20 20 28 30 29 0a 23  n8Plus()   (0).#
bcb0: 65 6c 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  elif SQLITE_OS_W
bcc0: 49 4e 52 54 0a 23 20 64 65 66 69 6e 65 20 6f 73  INRT.# define os
bcd0: 49 73 56 69 73 74 61 50 6c 75 73 28 29 20 20 28  IsVistaPlus()  (
bce0: 31 29 0a 23 20 64 65 66 69 6e 65 20 6f 73 49 73  1).# define osIs
bcf0: 57 69 6e 38 50 6c 75 73 28 29 20 20 20 28 31 29  Win8Plus()   (1)
bd00: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
bd10: 6f 73 49 73 56 69 73 74 61 50 6c 75 73 28 29 20  osIsVistaPlus() 
bd20: 20 28 77 69 6e 47 65 74 56 65 72 73 69 6f 6e 45   (winGetVersionE
bd30: 78 28 29 20 26 26 20 28 28 73 71 6c 69 74 65 33  x() && ((sqlite3
bd40: 5f 6f 73 5f 6d 61 6a 6f 72 3e 36 29 20 7c 7c 20  _os_major>6) || 
bd50: 5c 0a 20 20 20 20 28 28 73 71 6c 69 74 65 33 5f  \.    ((sqlite3_
bd60: 6f 73 5f 6d 61 6a 6f 72 3d 3d 36 29 20 26 26 20  os_major==6) && 
bd70: 28 73 71 6c 69 74 65 33 5f 6f 73 5f 6d 69 6e 6f  (sqlite3_os_mino
bd80: 72 3e 3d 30 29 29 29 29 0a 23 20 64 65 66 69 6e  r>=0)))).# defin
bd90: 65 20 6f 73 49 73 57 69 6e 38 50 6c 75 73 28 29  e osIsWin8Plus()
bda0: 20 20 20 28 77 69 6e 47 65 74 56 65 72 73 69 6f     (winGetVersio
bdb0: 6e 45 78 28 29 20 26 26 20 28 28 73 71 6c 69 74  nEx() && ((sqlit
bdc0: 65 33 5f 6f 73 5f 6d 61 6a 6f 72 3e 36 29 20 7c  e3_os_major>6) |
bdd0: 7c 20 5c 0a 20 20 20 20 28 28 73 71 6c 69 74 65  | \.    ((sqlite
bde0: 33 5f 6f 73 5f 6d 61 6a 6f 72 3d 3d 36 29 20 26  3_os_major==6) &
bdf0: 26 20 28 73 71 6c 69 74 65 33 5f 6f 73 5f 6d 69  & (sqlite3_os_mi
be00: 6e 6f 72 3e 3d 32 29 29 29 29 0a 23 65 6e 64 69  nor>=2)))).#endi
be10: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
be20: 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61 74 65 73  nction populates
be30: 20 74 68 65 20 57 69 6e 64 6f 77 73 20 76 65 72   the Windows ver
be40: 73 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  sion information
be50: 20 6e 65 65 64 65 64 20 62 79 20 74 68 69 73 0a   needed by this.
be60: 2a 2a 20 6d 6f 64 75 6c 65 2e 20 20 55 73 65 20  ** module.  Use 
be70: 6f 66 20 74 68 65 20 47 65 74 56 65 72 73 69 6f  of the GetVersio
be80: 6e 45 78 41 20 6f 72 20 47 65 74 56 65 72 73 69  nExA or GetVersi
be90: 6f 6e 45 78 57 20 66 75 6e 63 74 69 6f 6e 20 69  onExW function i
bea0: 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 20 54  s required..** T
beb0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
bec0: 77 69 6c 6c 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f  will be non-zero
bed0: 20 69 66 20 76 65 72 73 69 6f 6e 20 69 6e 66 6f   if version info
bee0: 72 6d 61 74 69 6f 6e 20 77 61 73 20 71 75 65 72  rmation was quer
bef0: 69 65 64 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  ied..*/.#if SQLI
bf00: 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53  TE_WIN32_GETVERS
bf10: 49 4f 4e 45 58 0a 73 74 61 74 69 63 20 69 6e 74  IONEX.static int
bf20: 20 77 69 6e 47 65 74 56 65 72 73 69 6f 6e 45 78   winGetVersionEx
bf30: 28 29 7b 0a 20 20 69 66 28 20 6f 73 49 6e 74 65  (){.  if( osInte
bf40: 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78  rlockedCompareEx
bf50: 63 68 61 6e 67 65 28 26 73 71 6c 69 74 65 33 5f  change(&sqlite3_
bf60: 6f 73 5f 74 79 70 65 2c 20 30 2c 20 30 29 3d 3d  os_type, 0, 0)==
bf70: 30 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  0 ){.#if defined
bf80: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
bf90: 53 5f 41 4e 53 49 29 0a 20 20 20 20 4f 53 56 45  S_ANSI).    OSVE
bfa0: 52 53 49 4f 4e 49 4e 46 4f 41 20 73 49 6e 66 6f  RSIONINFOA sInfo
bfb0: 3b 0a 20 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53  ;.    sInfo.dwOS
bfc0: 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20  VersionInfoSize 
bfd0: 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b  = sizeof(sInfo);
bfe0: 0a 20 20 20 20 6f 73 47 65 74 56 65 72 73 69 6f  .    osGetVersio
bff0: 6e 45 78 41 28 26 73 49 6e 66 6f 29 3b 0a 20 20  nExA(&sInfo);.  
c000: 20 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43    osInterlockedC
c010: 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 28 26  ompareExchange(&
c020: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c  sqlite3_os_type,
c030: 0a 20 20 20 20 20 20 20 20 28 73 49 6e 66 6f 2e  .        (sInfo.
c040: 64 77 50 6c 61 74 66 6f 72 6d 49 64 20 3d 3d 20  dwPlatformId == 
c050: 56 45 52 5f 50 4c 41 54 46 4f 52 4d 5f 57 49 4e  VER_PLATFORM_WIN
c060: 33 32 5f 4e 54 29 20 3f 20 32 20 3a 20 31 2c 20  32_NT) ? 2 : 1, 
c070: 30 29 3b 0a 20 20 20 20 6f 73 49 6e 74 65 72 6c  0);.    osInterl
c080: 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68  ockedCompareExch
c090: 61 6e 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73  ange(&sqlite3_os
c0a0: 5f 6d 61 6a 6f 72 2c 0a 20 20 20 20 20 20 20 20  _major,.        
c0b0: 28 4c 4f 4e 47 29 73 49 6e 66 6f 2e 64 77 4d 61  (LONG)sInfo.dwMa
c0c0: 6a 6f 72 56 65 72 73 69 6f 6e 2c 20 30 29 3b 0a  jorVersion, 0);.
c0d0: 20 20 20 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65      osInterlocke
c0e0: 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65  dCompareExchange
c0f0: 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f 6d 69 6e  (&sqlite3_os_min
c100: 6f 72 2c 0a 20 20 20 20 20 20 20 20 28 4c 4f 4e  or,.        (LON
c110: 47 29 73 49 6e 66 6f 2e 64 77 4d 69 6e 6f 72 56  G)sInfo.dwMinorV
c120: 65 72 73 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20  ersion, 0);.    
c130: 72 65 74 75 72 6e 20 31 3b 0a 23 65 6c 69 66 20  return 1;.#elif 
c140: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
c150: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
c160: 20 20 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f     OSVERSIONINFO
c170: 57 20 73 49 6e 66 6f 3b 0a 20 20 20 20 73 49 6e  W sInfo;.    sIn
c180: 66 6f 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e  fo.dwOSVersionIn
c190: 66 6f 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28  foSize = sizeof(
c1a0: 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 47 65  sInfo);.    osGe
c1b0: 74 56 65 72 73 69 6f 6e 45 78 57 28 26 73 49 6e  tVersionExW(&sIn
c1c0: 66 6f 29 3b 0a 20 20 20 20 6f 73 49 6e 74 65 72  fo);.    osInter
c1d0: 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63  lockedCompareExc
c1e0: 68 61 6e 67 65 28 26 73 71 6c 69 74 65 33 5f 6f  hange(&sqlite3_o
c1f0: 73 5f 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20  s_type,.        
c200: 28 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72  (sInfo.dwPlatfor
c210: 6d 49 64 20 3d 3d 20 56 45 52 5f 50 4c 41 54 46  mId == VER_PLATF
c220: 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54 29 20 3f 20  ORM_WIN32_NT) ? 
c230: 32 20 3a 20 31 2c 20 30 29 3b 0a 20 20 20 20 6f  2 : 1, 0);.    o
c240: 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70  sInterlockedComp
c250: 61 72 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c  areExchange(&sql
c260: 69 74 65 33 5f 6f 73 5f 6d 61 6a 6f 72 2c 0a 20  ite3_os_major,. 
c270: 20 20 20 20 20 20 20 28 4c 4f 4e 47 29 73 49 6e         (LONG)sIn
c280: 66 6f 2e 64 77 4d 61 6a 6f 72 56 65 72 73 69 6f  fo.dwMajorVersio
c290: 6e 2c 20 30 29 3b 0a 20 20 20 20 6f 73 49 6e 74  n, 0);.    osInt
c2a0: 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45  erlockedCompareE
c2b0: 78 63 68 61 6e 67 65 28 26 73 71 6c 69 74 65 33  xchange(&sqlite3
c2c0: 5f 6f 73 5f 6d 69 6e 6f 72 2c 0a 20 20 20 20 20  _os_minor,.     
c2d0: 20 20 20 28 4c 4f 4e 47 29 73 49 6e 66 6f 2e 64     (LONG)sInfo.d
c2e0: 77 4d 69 6e 6f 72 56 65 72 73 69 6f 6e 2c 20 30  wMinorVersion, 0
c2f0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
c300: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65  .#endif.  }.  re
c310: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
c320: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
c330: 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73  ction determines
c340: 20 69 66 20 74 68 65 20 6d 61 63 68 69 6e 65 20   if the machine 
c350: 69 73 20 72 75 6e 6e 69 6e 67 20 61 20 76 65 72  is running a ver
c360: 73 69 6f 6e 20 6f 66 20 57 69 6e 64 6f 77 73 0a  sion of Windows.
c370: 2a 2a 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ** based on the 
c380: 4e 54 20 6b 65 72 6e 65 6c 2e 0a 2a 2f 0a 69 6e  NT kernel..*/.in
c390: 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  t sqlite3_win32_
c3a0: 69 73 5f 6e 74 28 76 6f 69 64 29 7b 0a 23 69 66  is_nt(void){.#if
c3b0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
c3c0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a  .  /*.  ** NOTE:
c3d0: 20 54 68 65 20 57 69 6e 52 54 20 73 75 62 2d 70   The WinRT sub-p
c3e0: 6c 61 74 66 6f 72 6d 20 69 73 20 61 6c 77 61 79  latform is alway
c3f0: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20  s assumed to be 
c400: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 4e 54 0a  based on the NT.
c410: 20 20 2a 2a 20 20 20 20 20 20 20 6b 65 72 6e 65    **       kerne
c420: 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  l..  */.  return
c430: 20 31 3b 0a 23 65 6c 69 66 20 53 51 4c 49 54 45   1;.#elif SQLITE
c440: 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f  _WIN32_GETVERSIO
c450: 4e 45 58 0a 20 20 77 69 6e 47 65 74 56 65 72 73  NEX.  winGetVers
c460: 69 6f 6e 45 78 28 29 3b 0a 20 20 72 65 74 75 72  ionEx();.  retur
c470: 6e 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43  n osInterlockedC
c480: 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 28 26  ompareExchange(&
c490: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c  sqlite3_os_type,
c4a0: 20 32 2c 20 32 29 3d 3d 32 3b 0a 23 65 6c 69 66   2, 2)==2;.#elif
c4b0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 72   SQLITE_TEST.  r
c4c0: 65 74 75 72 6e 20 6f 73 49 6e 74 65 72 6c 6f 63  eturn osInterloc
c4d0: 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e  kedCompareExchan
c4e0: 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74  ge(&sqlite3_os_t
c4f0: 79 70 65 2c 20 32 2c 20 32 29 3d 3d 32 3b 0a 23  ype, 2, 2)==2;.#
c500: 65 6c 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e  else.  /*.  ** N
c510: 4f 54 45 3a 20 41 6c 6c 20 73 75 62 2d 70 6c 61  OTE: All sub-pla
c520: 74 66 6f 72 6d 73 20 77 68 65 72 65 20 74 68 65  tforms where the
c530: 20 47 65 74 56 65 72 73 69 6f 6e 45 78 5b 41 57   GetVersionEx[AW
c540: 5d 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 0a  ] functions are.
c550: 20 20 2a 2a 20 20 20 20 20 20 20 64 65 70 72 65    **       depre
c560: 63 61 74 65 64 20 61 72 65 20 61 6c 77 61 79 73  cated are always
c570: 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20 62   assumed to be b
c580: 61 73 65 64 20 6f 6e 20 74 68 65 20 4e 54 20 6b  ased on the NT k
c590: 65 72 6e 65 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65  ernel..  */.  re
c5a0: 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d  turn 1;.#endif.}
c5b0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
c5c0: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a  WIN32_MALLOC./*.
c5d0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74  ** Allocate nByt
c5e0: 65 73 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f  es of memory..*/
c5f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69  .static void *wi
c600: 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e  nMemMalloc(int n
c610: 42 79 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45  Bytes){.  HANDLE
c620: 20 68 48 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a   hHeap;.  void *
c630: 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65  p;..  winMemAsse
c640: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65  rtMagic();.  hHe
c650: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65  ap = winMemGetHe
c660: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ap();.  assert( 
c670: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
c680: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56  sert( hHeap!=INV
c690: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
c6a0: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
c6b0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
c6c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
c6d0: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
c6e0: 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48  E).  assert( osH
c6f0: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
c700: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
c710: 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c  HEAP_FLAGS, NULL
c720: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  ) );.#endif.  as
c730: 73 65 72 74 28 20 6e 42 79 74 65 73 3e 3d 30 20  sert( nBytes>=0 
c740: 29 3b 0a 20 20 70 20 3d 20 6f 73 48 65 61 70 41  );.  p = osHeapA
c750: 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49  lloc(hHeap, SQLI
c760: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
c770: 41 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79  AGS, (SIZE_T)nBy
c780: 74 65 73 29 3b 0a 20 20 69 66 28 20 21 70 20 29  tes);.  if( !p )
c790: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
c7a0: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  g(SQLITE_NOMEM, 
c7b0: 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 41  "failed to HeapA
c7c0: 6c 6c 6f 63 20 25 75 20 62 79 74 65 73 20 28 25  lloc %u bytes (%
c7d0: 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20  lu), heap=%p",. 
c7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
c7f0: 42 79 74 65 73 2c 20 6f 73 47 65 74 4c 61 73 74  Bytes, osGetLast
c800: 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29  Error(), (void*)
c810: 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65  hHeap);.  }.  re
c820: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
c830: 20 46 72 65 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f   Free memory..*/
c840: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
c850: 4d 65 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50  MemFree(void *pP
c860: 72 69 6f 72 29 7b 0a 20 20 48 41 4e 44 4c 45 20  rior){.  HANDLE 
c870: 68 48 65 61 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d  hHeap;..  winMem
c880: 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20  AssertMagic();. 
c890: 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47   hHeap = winMemG
c8a0: 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65  etHeap();.  asse
c8b0: 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a  rt( hHeap!=0 );.
c8c0: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
c8d0: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
c8e0: 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51  VALUE );.#if !SQ
c8f0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
c900: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
c910: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c  WIN32_MALLOC_VAL
c920: 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28  IDATE).  assert(
c930: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28   osHeapValidate(
c940: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
c950: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
c960: 70 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69  pPrior) );.#endi
c970: 66 0a 20 20 69 66 28 20 21 70 50 72 69 6f 72 20  f.  if( !pPrior 
c980: 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 50 61 73  ) return; /* Pas
c990: 73 69 6e 67 20 4e 55 4c 4c 20 74 6f 20 48 65 61  sing NULL to Hea
c9a0: 70 46 72 65 65 20 69 73 20 75 6e 64 65 66 69 6e  pFree is undefin
c9b0: 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 21 6f 73  ed. */.  if( !os
c9c0: 48 65 61 70 46 72 65 65 28 68 48 65 61 70 2c 20  HeapFree(hHeap, 
c9d0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
c9e0: 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29  P_FLAGS, pPrior)
c9f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
ca00: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  log(SQLITE_NOMEM
ca10: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61  , "failed to Hea
ca20: 70 46 72 65 65 20 62 6c 6f 63 6b 20 25 70 20 28  pFree block %p (
ca30: 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a  %lu), heap=%p",.
ca40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca50: 70 50 72 69 6f 72 2c 20 6f 73 47 65 74 4c 61 73  pPrior, osGetLas
ca60: 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a  tError(), (void*
ca70: 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  )hHeap);.  }.}..
ca80: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
ca90: 20 73 69 7a 65 20 6f 66 20 61 6e 20 65 78 69 73   size of an exis
caa0: 74 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  ting memory allo
cab0: 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  cation.*/.static
cac0: 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61   void *winMemRea
cad0: 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72 69 6f  lloc(void *pPrio
cae0: 72 2c 20 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a  r, int nBytes){.
caf0: 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a    HANDLE hHeap;.
cb00: 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69    void *p;..  wi
cb10: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
cb20: 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e  );.  hHeap = win
cb30: 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20  MemGetHeap();.  
cb40: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30  assert( hHeap!=0
cb50: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48   );.  assert( hH
cb60: 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  eap!=INVALID_HAN
cb70: 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66  DLE_VALUE );.#if
cb80: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
cb90: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
cba0: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
cbb0: 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73  _VALIDATE).  ass
cbc0: 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64  ert( osHeapValid
cbd0: 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54  ate(hHeap, SQLIT
cbe0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
cbf0: 47 53 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23  GS, pPrior) );.#
cc00: 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
cc10: 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20 69  nBytes>=0 );.  i
cc20: 66 28 20 21 70 50 72 69 6f 72 20 29 7b 0a 20 20  f( !pPrior ){.  
cc30: 20 20 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f    p = osHeapAllo
cc40: 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  c(hHeap, SQLITE_
cc50: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
cc60: 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73  , (SIZE_T)nBytes
cc70: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
cc80: 70 20 3d 20 6f 73 48 65 61 70 52 65 41 6c 6c 6f  p = osHeapReAllo
cc90: 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  c(hHeap, SQLITE_
cca0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
ccb0: 2c 20 70 50 72 69 6f 72 2c 20 28 53 49 5a 45 5f  , pPrior, (SIZE_
ccc0: 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d 0a 20  T)nBytes);.  }. 
ccd0: 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 73   if( !p ){.    s
cce0: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
ccf0: 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64  E_NOMEM, "failed
cd00: 20 74 6f 20 25 73 20 25 75 20 62 79 74 65 73 20   to %s %u bytes 
cd10: 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c  (%lu), heap=%p",
cd20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cd30: 20 70 50 72 69 6f 72 20 3f 20 22 48 65 61 70 52   pPrior ? "HeapR
cd40: 65 41 6c 6c 6f 63 22 20 3a 20 22 48 65 61 70 41  eAlloc" : "HeapA
cd50: 6c 6c 6f 63 22 2c 20 6e 42 79 74 65 73 2c 20 6f  lloc", nBytes, o
cd60: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
cd70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cd80: 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a   (void*)hHeap);.
cd90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
cda0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
cdb0: 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 6f  the size of an o
cdc0: 75 74 73 74 61 6e 64 69 6e 67 20 61 6c 6c 6f 63  utstanding alloc
cdd0: 61 74 69 6f 6e 2c 20 69 6e 20 62 79 74 65 73 2e  ation, in bytes.
cde0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
cdf0: 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a  inMemSize(void *
ce00: 70 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65  p){.  HANDLE hHe
ce10: 61 70 3b 0a 20 20 53 49 5a 45 5f 54 20 6e 3b 0a  ap;.  SIZE_T n;.
ce20: 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  .  winMemAssertM
ce30: 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20  agic();.  hHeap 
ce40: 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  = winMemGetHeap(
ce50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
ce60: 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ap!=0 );.  asser
ce70: 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  t( hHeap!=INVALI
ce80: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
ce90: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
cea0: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
ceb0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
cec0: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a  ALLOC_VALIDATE).
ced0: 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70    assert( osHeap
cee0: 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20  Validate(hHeap, 
cef0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
cf00: 50 5f 46 4c 41 47 53 2c 20 70 29 20 29 3b 0a 23  P_FLAGS, p) );.#
cf10: 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70 20 29  endif.  if( !p )
cf20: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d   return 0;.  n =
cf30: 20 6f 73 48 65 61 70 53 69 7a 65 28 68 48 65 61   osHeapSize(hHea
cf40: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
cf50: 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 29 3b 0a  HEAP_FLAGS, p);.
cf60: 20 20 69 66 28 20 6e 3d 3d 28 53 49 5a 45 5f 54    if( n==(SIZE_T
cf70: 29 2d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  )-1 ){.    sqlit
cf80: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
cf90: 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  MEM, "failed to 
cfa0: 48 65 61 70 53 69 7a 65 20 62 6c 6f 63 6b 20 25  HeapSize block %
cfb0: 70 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70  p (%lu), heap=%p
cfc0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
cfd0: 20 20 20 70 2c 20 6f 73 47 65 74 4c 61 73 74 45     p, osGetLastE
cfe0: 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68  rror(), (void*)h
cff0: 48 65 61 70 29 3b 0a 20 20 20 20 72 65 74 75 72  Heap);.    retur
d000: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
d010: 6e 20 28 69 6e 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a  n (int)n;.}../*.
d020: 2a 2a 20 52 6f 75 6e 64 20 75 70 20 61 20 72 65  ** Round up a re
d030: 71 75 65 73 74 20 73 69 7a 65 20 74 6f 20 74 68  quest size to th
d040: 65 20 6e 65 78 74 20 76 61 6c 69 64 20 61 6c 6c  e next valid all
d050: 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 2a 2f  ocation size..*/
d060: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d  .static int winM
d070: 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29  emRoundup(int n)
d080: 7b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  {.  return n;.}.
d090: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
d0a0: 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a  e this module..*
d0b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
d0c0: 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70 41  MemInit(void *pA
d0d0: 70 70 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65  ppData){.  winMe
d0e0: 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61  mData *pWinMemDa
d0f0: 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61  ta = (winMemData
d100: 20 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a 20 20   *)pAppData;..  
d110: 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  if( !pWinMemData
d120: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
d130: 5f 45 52 52 4f 52 3b 0a 20 20 61 73 73 65 72 74  _ERROR;.  assert
d140: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d  ( pWinMemData->m
d150: 61 67 69 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41  agic1==WINMEM_MA
d160: 47 49 43 31 20 29 3b 0a 20 20 61 73 73 65 72 74  GIC1 );.  assert
d170: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d  ( pWinMemData->m
d180: 61 67 69 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41  agic2==WINMEM_MA
d190: 47 49 43 32 20 29 3b 0a 0a 23 69 66 20 21 53 51  GIC2 );..#if !SQ
d1a0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
d1b0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
d1c0: 41 50 5f 43 52 45 41 54 45 0a 20 20 69 66 28 20  AP_CREATE.  if( 
d1d0: 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  !pWinMemData->hH
d1e0: 65 61 70 20 29 7b 0a 20 20 20 20 44 57 4f 52 44  eap ){.    DWORD
d1f0: 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 20 3d   dwInitialSize =
d200: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
d210: 41 50 5f 49 4e 49 54 5f 53 49 5a 45 3b 0a 20 20  AP_INIT_SIZE;.  
d220: 20 20 44 57 4f 52 44 20 64 77 4d 61 78 69 6d 75    DWORD dwMaximu
d230: 6d 53 69 7a 65 20 3d 20 28 44 57 4f 52 44 29 73  mSize = (DWORD)s
d240: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
d250: 69 67 2e 6e 48 65 61 70 3b 0a 20 20 20 20 69 66  ig.nHeap;.    if
d260: 28 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 3d  ( dwMaximumSize=
d270: 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 77 4d 61  =0 ){.      dwMa
d280: 78 69 6d 75 6d 53 69 7a 65 20 3d 20 53 51 4c 49  ximumSize = SQLI
d290: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41  TE_WIN32_HEAP_MA
d2a0: 58 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 65 6c 73  X_SIZE;.    }els
d2b0: 65 20 69 66 28 20 64 77 49 6e 69 74 69 61 6c 53  e if( dwInitialS
d2c0: 69 7a 65 3e 64 77 4d 61 78 69 6d 75 6d 53 69 7a  ize>dwMaximumSiz
d2d0: 65 20 29 7b 0a 20 20 20 20 20 20 64 77 49 6e 69  e ){.      dwIni
d2e0: 74 69 61 6c 53 69 7a 65 20 3d 20 64 77 4d 61 78  tialSize = dwMax
d2f0: 69 6d 75 6d 53 69 7a 65 3b 0a 20 20 20 20 7d 0a  imumSize;.    }.
d300: 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d      pWinMemData-
d310: 3e 68 48 65 61 70 20 3d 20 6f 73 48 65 61 70 43  >hHeap = osHeapC
d320: 72 65 61 74 65 28 53 51 4c 49 54 45 5f 57 49 4e  reate(SQLITE_WIN
d330: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a 20  32_HEAP_FLAGS,. 
d340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d360: 20 20 20 20 20 64 77 49 6e 69 74 69 61 6c 53 69       dwInitialSi
d370: 7a 65 2c 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a  ze, dwMaximumSiz
d380: 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 57 69  e);.    if( !pWi
d390: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20  nMemData->hHeap 
d3a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
d3b0: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
d3c0: 4d 2c 0a 20 20 20 20 20 20 20 20 20 20 22 66 61  M,.          "fa
d3d0: 69 6c 65 64 20 74 6f 20 48 65 61 70 43 72 65 61  iled to HeapCrea
d3e0: 74 65 20 28 25 6c 75 29 2c 20 66 6c 61 67 73 3d  te (%lu), flags=
d3f0: 25 75 2c 20 69 6e 69 74 53 69 7a 65 3d 25 6c 75  %u, initSize=%lu
d400: 2c 20 6d 61 78 53 69 7a 65 3d 25 6c 75 22 2c 0a  , maxSize=%lu",.
d410: 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c            osGetL
d420: 61 73 74 45 72 72 6f 72 28 29 2c 20 53 51 4c 49  astError(), SQLI
d430: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
d440: 41 47 53 2c 20 64 77 49 6e 69 74 69 61 6c 53 69  AGS, dwInitialSi
d450: 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 64 77  ze,.          dw
d460: 4d 61 78 69 6d 75 6d 53 69 7a 65 29 3b 0a 20 20  MaximumSize);.  
d470: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d480: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
d490: 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44    }.    pWinMemD
d4a0: 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 54 52  ata->bOwned = TR
d4b0: 55 45 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  UE;.    assert( 
d4c0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77  pWinMemData->bOw
d4d0: 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65  ned );.  }.#else
d4e0: 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  .  pWinMemData->
d4f0: 68 48 65 61 70 20 3d 20 6f 73 47 65 74 50 72 6f  hHeap = osGetPro
d500: 63 65 73 73 48 65 61 70 28 29 3b 0a 20 20 69 66  cessHeap();.  if
d510: 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  ( !pWinMemData->
d520: 68 48 65 61 70 20 29 7b 0a 20 20 20 20 73 71 6c  hHeap ){.    sql
d530: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
d540: 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20 22  NOMEM,.        "
d550: 66 61 69 6c 65 64 20 74 6f 20 47 65 74 50 72 6f  failed to GetPro
d560: 63 65 73 73 48 65 61 70 20 28 25 6c 75 29 22 2c  cessHeap (%lu)",
d570: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
d580: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
d590: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
d5a0: 3b 0a 20 20 7d 0a 20 20 70 57 69 6e 4d 65 6d 44  ;.  }.  pWinMemD
d5b0: 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 46 41  ata->bOwned = FA
d5c0: 4c 53 45 3b 0a 20 20 61 73 73 65 72 74 28 20 21  LSE;.  assert( !
d5d0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77  pWinMemData->bOw
d5e0: 6e 65 64 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ned );.#endif.  
d5f0: 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44  assert( pWinMemD
d600: 61 74 61 2d 3e 68 48 65 61 70 21 3d 30 20 29 3b  ata->hHeap!=0 );
d610: 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d  .  assert( pWinM
d620: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 49  emData->hHeap!=I
d630: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
d640: 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49  LUE );.#if !SQLI
d650: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
d660: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
d670: 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44  N32_MALLOC_VALID
d680: 41 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f  ATE).  assert( o
d690: 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 70 57  sHeapValidate(pW
d6a0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
d6b0: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
d6c0: 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29  EAP_FLAGS, NULL)
d6d0: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74   );.#endif.  ret
d6e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
d6f0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e 69 74 69 61  ../*.** Deinitia
d700: 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65  lize this module
d710: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d720: 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28   winMemShutdown(
d730: 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b  void *pAppData){
d740: 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70  .  winMemData *p
d750: 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28 77 69  WinMemData = (wi
d760: 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70 70 44  nMemData *)pAppD
d770: 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70 57 69  ata;..  if( !pWi
d780: 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74 75 72  nMemData ) retur
d790: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69  n;.  assert( pWi
d7a0: 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63 31  nMemData->magic1
d7b0: 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20  ==WINMEM_MAGIC1 
d7c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69  );.  assert( pWi
d7d0: 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63 32  nMemData->magic2
d7e0: 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20  ==WINMEM_MAGIC2 
d7f0: 29 3b 0a 0a 20 20 69 66 28 20 70 57 69 6e 4d 65  );..  if( pWinMe
d800: 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a  mData->hHeap ){.
d810: 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e      assert( pWin
d820: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d  MemData->hHeap!=
d830: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
d840: 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c  ALUE );.#if !SQL
d850: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
d860: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
d870: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49  IN32_MALLOC_VALI
d880: 44 41 54 45 29 0a 20 20 20 20 61 73 73 65 72 74  DATE).    assert
d890: 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65  ( osHeapValidate
d8a0: 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  (pWinMemData->hH
d8b0: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
d8c0: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55  2_HEAP_FLAGS, NU
d8d0: 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  LL) );.#endif.  
d8e0: 20 20 69 66 28 20 70 57 69 6e 4d 65 6d 44 61 74    if( pWinMemDat
d8f0: 61 2d 3e 62 4f 77 6e 65 64 20 29 7b 0a 20 20 20  a->bOwned ){.   
d900: 20 20 20 69 66 28 20 21 6f 73 48 65 61 70 44 65     if( !osHeapDe
d910: 73 74 72 6f 79 28 70 57 69 6e 4d 65 6d 44 61 74  stroy(pWinMemDat
d920: 61 2d 3e 68 48 65 61 70 29 20 29 7b 0a 20 20 20  a->hHeap) ){.   
d930: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
d940: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22  (SQLITE_NOMEM, "
d950: 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 44 65  failed to HeapDe
d960: 73 74 72 6f 79 20 28 25 6c 75 29 2c 20 68 65 61  stroy (%lu), hea
d970: 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20  p=%p",.         
d980: 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
d990: 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f  LastError(), (vo
d9a0: 69 64 2a 29 70 57 69 6e 4d 65 6d 44 61 74 61 2d  id*)pWinMemData-
d9b0: 3e 68 48 65 61 70 29 3b 0a 20 20 20 20 20 20 7d  >hHeap);.      }
d9c0: 0a 20 20 20 20 20 20 70 57 69 6e 4d 65 6d 44 61  .      pWinMemDa
d9d0: 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 46 41 4c  ta->bOwned = FAL
d9e0: 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57  SE;.    }.    pW
d9f0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
da00: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a   = NULL;.  }.}..
da10: 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74  /*.** Populate t
da20: 68 65 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d  he low-level mem
da30: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
da40: 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73  unction pointers
da50: 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 47 6c   in.** sqlite3Gl
da60: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 77 69 74  obalConfig.m wit
da70: 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  h pointers to th
da80: 65 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68  e routines in th
da90: 69 73 20 66 69 6c 65 2e 20 54 68 65 0a 2a 2a 20  is file. The.** 
daa0: 61 72 67 75 6d 65 6e 74 73 20 73 70 65 63 69 66  arguments specif
dab0: 79 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 6d  y the block of m
dac0: 65 6d 6f 72 79 20 74 6f 20 6d 61 6e 61 67 65 2e  emory to manage.
dad0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
dae0: 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
daf0: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 63 6f  ed by sqlite3_co
db00: 6e 66 69 67 28 29 2c 20 61 6e 64 20 74 68 65 72  nfig(), and ther
db10: 65 66 6f 72 65 0a 2a 2a 20 69 73 20 6e 6f 74 20  efore.** is not 
db20: 72 65 71 75 69 72 65 64 20 74 6f 20 62 65 20 74  required to be t
db30: 68 72 65 61 64 73 61 66 65 20 28 69 74 20 69 73  hreadsafe (it is
db40: 20 6e 6f 74 29 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   not)..*/.const 
db50: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
db60: 6f 64 73 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47  ods *sqlite3MemG
db70: 65 74 57 69 6e 33 32 28 76 6f 69 64 29 7b 0a 20  etWin32(void){. 
db80: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71   static const sq
db90: 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64  lite3_mem_method
dba0: 73 20 77 69 6e 4d 65 6d 4d 65 74 68 6f 64 73 20  s winMemMethods 
dbb0: 3d 20 7b 0a 20 20 20 20 77 69 6e 4d 65 6d 4d 61  = {.    winMemMa
dbc0: 6c 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d  lloc,.    winMem
dbd0: 46 72 65 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d  Free,.    winMem
dbe0: 52 65 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69 6e  Realloc,.    win
dbf0: 4d 65 6d 53 69 7a 65 2c 0a 20 20 20 20 77 69 6e  MemSize,.    win
dc00: 4d 65 6d 52 6f 75 6e 64 75 70 2c 0a 20 20 20 20  MemRoundup,.    
dc10: 77 69 6e 4d 65 6d 49 6e 69 74 2c 0a 20 20 20 20  winMemInit,.    
dc20: 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 2c 0a  winMemShutdown,.
dc30: 20 20 20 20 26 77 69 6e 5f 6d 65 6d 5f 64 61 74      &win_mem_dat
dc40: 61 0a 20 20 7d 3b 0a 20 20 72 65 74 75 72 6e 20  a.  };.  return 
dc50: 26 77 69 6e 4d 65 6d 4d 65 74 68 6f 64 73 3b 0a  &winMemMethods;.
dc60: 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d  }..void sqlite3M
dc70: 65 6d 53 65 74 44 65 66 61 75 6c 74 28 76 6f 69  emSetDefault(voi
dc80: 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  d){.  sqlite3_co
dc90: 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46  nfig(SQLITE_CONF
dca0: 49 47 5f 4d 41 4c 4c 4f 43 2c 20 73 71 6c 69 74  IG_MALLOC, sqlit
dcb0: 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 29 29  e3MemGetWin32())
dcc0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
dcd0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
dce0: 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  C */../*.** Conv
dcf0: 65 72 74 20 61 20 55 54 46 2d 38 20 73 74 72 69  ert a UTF-8 stri
dd00: 6e 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66 74 20  ng to Microsoft 
dd10: 55 6e 69 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53  Unicode..**.** S
dd20: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
dd30: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
dd40: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
dd50: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
dd60: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50  ()..*/.static LP
dd70: 57 53 54 52 20 77 69 6e 55 74 66 38 54 6f 55 6e  WSTR winUtf8ToUn
dd80: 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72  icode(const char
dd90: 20 2a 7a 54 65 78 74 29 7b 0a 20 20 69 6e 74 20   *zText){.  int 
dda0: 6e 43 68 61 72 3b 0a 20 20 4c 50 57 53 54 52 20  nChar;.  LPWSTR 
ddb0: 7a 57 69 64 65 54 65 78 74 3b 0a 0a 20 20 6e 43  zWideText;..  nC
ddc0: 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74  har = osMultiByt
ddd0: 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55  eToWideChar(CP_U
dde0: 54 46 38 2c 20 30 2c 20 7a 54 65 78 74 2c 20 2d  TF8, 0, zText, -
ddf0: 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 69  1, NULL, 0);.  i
de00: 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20  f( nChar==0 ){. 
de10: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
de20: 0a 20 20 7a 57 69 64 65 54 65 78 74 20 3d 20 73  .  zWideText = s
de30: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
de40: 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28 57  ( nChar*sizeof(W
de50: 43 48 41 52 29 20 29 3b 0a 20 20 69 66 28 20 7a  CHAR) );.  if( z
de60: 57 69 64 65 54 65 78 74 3d 3d 30 20 29 7b 0a 20  WideText==0 ){. 
de70: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
de80: 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c  .  nChar = osMul
de90: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
dea0: 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 54 65  (CP_UTF8, 0, zTe
deb0: 78 74 2c 20 2d 31 2c 20 7a 57 69 64 65 54 65 78  xt, -1, zWideTex
dec0: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
ded0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dee0: 20 20 20 6e 43 68 61 72 29 3b 0a 20 20 69 66 28     nChar);.  if(
def0: 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20   nChar==0 ){.   
df00: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57   sqlite3_free(zW
df10: 69 64 65 54 65 78 74 29 3b 0a 20 20 20 20 7a 57  ideText);.    zW
df20: 69 64 65 54 65 78 74 20 3d 20 30 3b 0a 20 20 7d  ideText = 0;.  }
df30: 0a 20 20 72 65 74 75 72 6e 20 7a 57 69 64 65 54  .  return zWideT
df40: 65 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ext;.}../*.** Co
df50: 6e 76 65 72 74 20 61 20 4d 69 63 72 6f 73 6f 66  nvert a Microsof
df60: 74 20 55 6e 69 63 6f 64 65 20 73 74 72 69 6e 67  t Unicode string
df70: 20 74 6f 20 55 54 46 2d 38 2e 0a 2a 2a 0a 2a 2a   to UTF-8..**.**
df80: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
df90: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
dfa0: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
dfb0: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
dfc0: 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oc()..*/.static 
dfd0: 63 68 61 72 20 2a 77 69 6e 55 6e 69 63 6f 64 65  char *winUnicode
dfe0: 54 6f 55 74 66 38 28 4c 50 43 57 53 54 52 20 7a  ToUtf8(LPCWSTR z
dff0: 57 69 64 65 54 65 78 74 29 7b 0a 20 20 69 6e 74  WideText){.  int
e000: 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a   nByte;.  char *
e010: 7a 54 65 78 74 3b 0a 0a 20 20 6e 42 79 74 65 20  zText;..  nByte 
e020: 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75  = osWideCharToMu
e030: 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c  ltiByte(CP_UTF8,
e040: 20 30 2c 20 7a 57 69 64 65 54 65 78 74 2c 20 2d   0, zWideText, -
e050: 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  1, 0, 0, 0, 0);.
e060: 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30    if( nByte == 0
e070: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
e080: 3b 0a 20 20 7d 0a 20 20 7a 54 65 78 74 20 3d 20  ;.  }.  zText = 
e090: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
e0a0: 6f 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  o( nByte );.  if
e0b0: 28 20 7a 54 65 78 74 3d 3d 30 20 29 7b 0a 20 20  ( zText==0 ){.  
e0c0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
e0d0: 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65    nByte = osWide
e0e0: 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28  CharToMultiByte(
e0f0: 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64  CP_UTF8, 0, zWid
e100: 65 54 65 78 74 2c 20 2d 31 2c 20 7a 54 65 78 74  eText, -1, zText
e110: 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20  , nByte,.       
e120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e130: 20 20 20 20 20 20 20 20 20 30 2c 20 30 29 3b 0a           0, 0);.
e140: 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30    if( nByte == 0
e150: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
e160: 66 72 65 65 28 7a 54 65 78 74 29 3b 0a 20 20 20  free(zText);.   
e170: 20 7a 54 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a   zText = 0;.  }.
e180: 20 20 72 65 74 75 72 6e 20 7a 54 65 78 74 3b 0a    return zText;.
e190: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
e1a0: 20 61 6e 20 41 4e 53 49 20 73 74 72 69 6e 67 20   an ANSI string 
e1b0: 74 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69  to Microsoft Uni
e1c0: 63 6f 64 65 2c 20 75 73 69 6e 67 20 74 68 65 20  code, using the 
e1d0: 41 4e 53 49 20 6f 72 20 4f 45 4d 0a 2a 2a 20 63  ANSI or OEM.** c
e1e0: 6f 64 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ode page..**.** 
e1f0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
e200: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
e210: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
e220: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
e230: 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c  c()..*/.static L
e240: 50 57 53 54 52 20 77 69 6e 4d 62 63 73 54 6f 55  PWSTR winMbcsToU
e250: 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61  nicode(const cha
e260: 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20 75 73  r *zText, int us
e270: 65 41 6e 73 69 29 7b 0a 20 20 69 6e 74 20 6e 42  eAnsi){.  int nB
e280: 79 74 65 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4d  yte;.  LPWSTR zM
e290: 62 63 73 54 65 78 74 3b 0a 20 20 69 6e 74 20 63  bcsText;.  int c
e2a0: 6f 64 65 70 61 67 65 20 3d 20 75 73 65 41 6e 73  odepage = useAns
e2b0: 69 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f  i ? CP_ACP : CP_
e2c0: 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20  OEMCP;..  nByte 
e2d0: 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  = osMultiByteToW
e2e0: 69 64 65 43 68 61 72 28 63 6f 64 65 70 61 67 65  ideChar(codepage
e2f0: 2c 20 30 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20  , 0, zText, -1, 
e300: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
e310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e320: 20 20 20 20 20 20 30 29 2a 73 69 7a 65 6f 66 28        0)*sizeof(
e330: 57 43 48 41 52 29 3b 0a 20 20 69 66 28 20 6e 42  WCHAR);.  if( nB
e340: 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  yte==0 ){.    re
e350: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d  turn 0;.  }.  zM
e360: 62 63 73 54 65 78 74 20 3d 20 73 71 6c 69 74 65  bcsText = sqlite
e370: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79  3MallocZero( nBy
e380: 74 65 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29  te*sizeof(WCHAR)
e390: 20 29 3b 0a 20 20 69 66 28 20 7a 4d 62 63 73 54   );.  if( zMbcsT
e3a0: 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ext==0 ){.    re
e3b0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42  turn 0;.  }.  nB
e3c0: 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74  yte = osMultiByt
e3d0: 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65  eToWideChar(code
e3e0: 70 61 67 65 2c 20 30 2c 20 7a 54 65 78 74 2c 20  page, 0, zText, 
e3f0: 2d 31 2c 20 7a 4d 62 63 73 54 65 78 74 2c 0a 20  -1, zMbcsText,. 
e400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
e420: 42 79 74 65 29 3b 0a 20 20 69 66 28 20 6e 42 79  Byte);.  if( nBy
e430: 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  te==0 ){.    sql
e440: 69 74 65 33 5f 66 72 65 65 28 7a 4d 62 63 73 54  ite3_free(zMbcsT
e450: 65 78 74 29 3b 0a 20 20 20 20 7a 4d 62 63 73 54  ext);.    zMbcsT
e460: 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ext = 0;.  }.  r
e470: 65 74 75 72 6e 20 7a 4d 62 63 73 54 65 78 74 3b  eturn zMbcsText;
e480: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
e490: 74 20 61 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e  t a Microsoft Un
e4a0: 69 63 6f 64 65 20 73 74 72 69 6e 67 20 74 6f 20  icode string to 
e4b0: 61 20 6d 75 6c 74 69 2d 62 79 74 65 20 63 68 61  a multi-byte cha
e4c0: 72 61 63 74 65 72 20 73 74 72 69 6e 67 2c 0a 2a  racter string,.*
e4d0: 2a 20 75 73 69 6e 67 20 74 68 65 20 41 4e 53 49  * using the ANSI
e4e0: 20 6f 72 20 4f 45 4d 20 63 6f 64 65 20 70 61 67   or OEM code pag
e4f0: 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  e..**.** Space t
e500: 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72  o hold the retur
e510: 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62  ned string is ob
e520: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
e530: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  te3_malloc()..*/
e540: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 77 69  .static char *wi
e550: 6e 55 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28 4c  nUnicodeToMbcs(L
e560: 50 43 57 53 54 52 20 7a 57 69 64 65 54 65 78 74  PCWSTR zWideText
e570: 2c 20 69 6e 74 20 75 73 65 41 6e 73 69 29 7b 0a  , int useAnsi){.
e580: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63    int nByte;.  c
e590: 68 61 72 20 2a 7a 54 65 78 74 3b 0a 20 20 69 6e  har *zText;.  in
e5a0: 74 20 63 6f 64 65 70 61 67 65 20 3d 20 75 73 65  t codepage = use
e5b0: 41 6e 73 69 20 3f 20 43 50 5f 41 43 50 20 3a 20  Ansi ? CP_ACP : 
e5c0: 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79  CP_OEMCP;..  nBy
e5d0: 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54  te = osWideCharT
e5e0: 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65 70  oMultiByte(codep
e5f0: 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 54 65 78  age, 0, zWideTex
e600: 74 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20  t, -1, 0, 0, 0, 
e610: 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20  0);.  if( nByte 
e620: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75  == 0 ){.    retu
e630: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 54 65 78  rn 0;.  }.  zTex
e640: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
e650: 63 5a 65 72 6f 28 20 6e 42 79 74 65 20 29 3b 0a  cZero( nByte );.
e660: 20 20 69 66 28 20 7a 54 65 78 74 3d 3d 30 20 29    if( zText==0 )
e670: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
e680: 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73    }.  nByte = os
e690: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
e6a0: 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30 2c  yte(codepage, 0,
e6b0: 20 7a 57 69 64 65 54 65 78 74 2c 20 2d 31 2c 20   zWideText, -1, 
e6c0: 7a 54 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20  zText,.         
e6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6e0: 20 20 20 20 20 20 20 6e 42 79 74 65 2c 20 30 2c         nByte, 0,
e6f0: 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65   0);.  if( nByte
e700: 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 71 6c   == 0 ){.    sql
e710: 69 74 65 33 5f 66 72 65 65 28 7a 54 65 78 74 29  ite3_free(zText)
e720: 3b 0a 20 20 20 20 7a 54 65 78 74 20 3d 20 30 3b  ;.    zText = 0;
e730: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 54  .  }.  return zT
e740: 65 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ext;.}../*.** Co
e750: 6e 76 65 72 74 20 61 20 6d 75 6c 74 69 2d 62 79  nvert a multi-by
e760: 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72  te character str
e770: 69 6e 67 20 74 6f 20 55 54 46 2d 38 2e 0a 2a 2a  ing to UTF-8..**
e780: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
e790: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
e7a0: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
e7b0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
e7c0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74  alloc()..*/.stat
e7d0: 69 63 20 63 68 61 72 20 2a 77 69 6e 4d 62 63 73  ic char *winMbcs
e7e0: 54 6f 55 74 66 38 28 63 6f 6e 73 74 20 63 68 61  ToUtf8(const cha
e7f0: 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20 75 73  r *zText, int us
e800: 65 41 6e 73 69 29 7b 0a 20 20 63 68 61 72 20 2a  eAnsi){.  char *
e810: 7a 54 65 78 74 55 74 66 38 3b 0a 20 20 4c 50 57  zTextUtf8;.  LPW
e820: 53 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20  STR zTmpWide;.. 
e830: 20 7a 54 6d 70 57 69 64 65 20 3d 20 77 69 6e 4d   zTmpWide = winM
e840: 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 7a 54 65  bcsToUnicode(zTe
e850: 78 74 2c 20 75 73 65 41 6e 73 69 29 3b 0a 20 20  xt, useAnsi);.  
e860: 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20  if( zTmpWide==0 
e870: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
e880: 0a 20 20 7d 0a 20 20 7a 54 65 78 74 55 74 66 38  .  }.  zTextUtf8
e890: 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55   = winUnicodeToU
e8a0: 74 66 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20  tf8(zTmpWide);. 
e8b0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
e8c0: 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72  mpWide);.  retur
e8d0: 6e 20 7a 54 65 78 74 55 74 66 38 3b 0a 7d 0a 0a  n zTextUtf8;.}..
e8e0: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
e8f0: 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74 6f 20  UTF-8 string to 
e900: 61 20 6d 75 6c 74 69 2d 62 79 74 65 20 63 68 61  a multi-byte cha
e910: 72 61 63 74 65 72 20 73 74 72 69 6e 67 2e 0a 2a  racter string..*
e920: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
e930: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
e940: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
e950: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
e960: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61  malloc()..*/.sta
e970: 74 69 63 20 63 68 61 72 20 2a 77 69 6e 55 74 66  tic char *winUtf
e980: 38 54 6f 4d 62 63 73 28 63 6f 6e 73 74 20 63 68  8ToMbcs(const ch
e990: 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20 75  ar *zText, int u
e9a0: 73 65 41 6e 73 69 29 7b 0a 20 20 63 68 61 72 20  seAnsi){.  char 
e9b0: 2a 7a 54 65 78 74 4d 62 63 73 3b 0a 20 20 4c 50  *zTextMbcs;.  LP
e9c0: 57 53 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a  WSTR zTmpWide;..
e9d0: 20 20 7a 54 6d 70 57 69 64 65 20 3d 20 77 69 6e    zTmpWide = win
e9e0: 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 54  Utf8ToUnicode(zT
e9f0: 65 78 74 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70  ext);.  if( zTmp
ea00: 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Wide==0 ){.    r
ea10: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
ea20: 54 65 78 74 4d 62 63 73 20 3d 20 77 69 6e 55 6e  TextMbcs = winUn
ea30: 69 63 6f 64 65 54 6f 4d 62 63 73 28 7a 54 6d 70  icodeToMbcs(zTmp
ea40: 57 69 64 65 2c 20 75 73 65 41 6e 73 69 29 3b 0a  Wide, useAnsi);.
ea50: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
ea60: 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75  TmpWide);.  retu
ea70: 72 6e 20 7a 54 65 78 74 4d 62 63 73 3b 0a 7d 0a  rn zTextMbcs;.}.
ea80: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
ea90: 20 70 75 62 6c 69 63 20 77 72 61 70 70 65 72 20   public wrapper 
eaa0: 66 6f 72 20 74 68 65 20 77 69 6e 55 74 66 38 54  for the winUtf8T
eab0: 6f 55 6e 69 63 6f 64 65 28 29 20 66 75 6e 63 74  oUnicode() funct
eac0: 69 6f 6e 2e 0a 2a 2f 0a 4c 50 57 53 54 52 20 73  ion..*/.LPWSTR s
ead0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66  qlite3_win32_utf
eae0: 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 63 6f 6e  8_to_unicode(con
eaf0: 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 29 7b  st char *zText){
eb00: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
eb10: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
eb20: 20 20 69 66 28 20 21 7a 54 65 78 74 20 29 7b 0a    if( !zText ){.
eb30: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
eb40: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
eb50: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
eb60: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
eb70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
eb80: 4e 49 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65  NIT.  if( sqlite
eb90: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 29  3_initialize() )
eba0: 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
ebb0: 66 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 55 74  f.  return winUt
ebc0: 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 54 65 78  f8ToUnicode(zTex
ebd0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  t);.}../*.** Thi
ebe0: 73 20 69 73 20 61 20 70 75 62 6c 69 63 20 77 72  s is a public wr
ebf0: 61 70 70 65 72 20 66 6f 72 20 74 68 65 20 77 69  apper for the wi
ec00: 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 29  nUnicodeToUtf8()
ec10: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68   function..*/.ch
ec20: 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33  ar *sqlite3_win3
ec30: 32 5f 75 6e 69 63 6f 64 65 5f 74 6f 5f 75 74 66  2_unicode_to_utf
ec40: 38 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65 54  8(LPCWSTR zWideT
ec50: 65 78 74 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  ext){.#ifdef SQL
ec60: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
ec70: 52 4d 4f 52 0a 20 20 69 66 28 20 21 7a 57 69 64  RMOR.  if( !zWid
ec80: 65 54 65 78 74 20 29 7b 0a 20 20 20 20 28 76 6f  eText ){.    (vo
ec90: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
eca0: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
ecb0: 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
ecc0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ecd0: 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69  MIT_AUTOINIT.  i
ece0: 66 28 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69  f( sqlite3_initi
ecf0: 61 6c 69 7a 65 28 29 20 29 20 72 65 74 75 72 6e  alize() ) return
ed00: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74   0;.#endif.  ret
ed10: 75 72 6e 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f  urn winUnicodeTo
ed20: 55 74 66 38 28 7a 57 69 64 65 54 65 78 74 29 3b  Utf8(zWideText);
ed30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
ed40: 73 20 61 20 70 75 62 6c 69 63 20 77 72 61 70 70  s a public wrapp
ed50: 65 72 20 66 6f 72 20 74 68 65 20 77 69 6e 4d 62  er for the winMb
ed60: 63 73 54 6f 55 74 66 38 28 29 20 66 75 6e 63 74  csToUtf8() funct
ed70: 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  ion..*/.char *sq
ed80: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73  lite3_win32_mbcs
ed90: 5f 74 6f 5f 75 74 66 38 28 63 6f 6e 73 74 20 63  _to_utf8(const c
eda0: 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a 23 69 66  har *zText){.#if
edb0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
edc0: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
edd0: 28 20 21 7a 54 65 78 74 20 29 7b 0a 20 20 20 20  ( !zText ){.    
ede0: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
edf0: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
ee00: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
ee10: 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
ee20: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a  E_OMIT_AUTOINIT.
ee30: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69 6e    if( sqlite3_in
ee40: 69 74 69 61 6c 69 7a 65 28 29 20 29 20 72 65 74  itialize() ) ret
ee50: 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  urn 0;.#endif.  
ee60: 72 65 74 75 72 6e 20 77 69 6e 4d 62 63 73 54 6f  return winMbcsTo
ee70: 55 74 66 38 28 7a 54 65 78 74 2c 20 6f 73 41 72  Utf8(zText, osAr
ee80: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 29  eFileApisANSI())
ee90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
eea0: 69 73 20 61 20 70 75 62 6c 69 63 20 77 72 61 70  is a public wrap
eeb0: 70 65 72 20 66 6f 72 20 74 68 65 20 77 69 6e 4d  per for the winM
eec0: 62 63 73 54 6f 55 74 66 38 28 29 20 66 75 6e 63  bcsToUtf8() func
eed0: 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  tion..*/.char *s
eee0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63  qlite3_win32_mbc
eef0: 73 5f 74 6f 5f 75 74 66 38 5f 76 32 28 63 6f 6e  s_to_utf8_v2(con
ef00: 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 2c 20  st char *zText, 
ef10: 69 6e 74 20 75 73 65 41 6e 73 69 29 7b 0a 23 69  int useAnsi){.#i
ef20: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
ef30: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
ef40: 66 28 20 21 7a 54 65 78 74 20 29 7b 0a 20 20 20  f( !zText ){.   
ef50: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
ef60: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
ef70: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
ef80: 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
ef90: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
efa0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69  .  if( sqlite3_i
efb0: 6e 69 74 69 61 6c 69 7a 65 28 29 20 29 20 72 65  nitialize() ) re
efc0: 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20  turn 0;.#endif. 
efd0: 20 72 65 74 75 72 6e 20 77 69 6e 4d 62 63 73 54   return winMbcsT
efe0: 6f 55 74 66 38 28 7a 54 65 78 74 2c 20 75 73 65  oUtf8(zText, use
eff0: 41 6e 73 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Ansi);.}../*.** 
f000: 54 68 69 73 20 69 73 20 61 20 70 75 62 6c 69 63  This is a public
f010: 20 77 72 61 70 70 65 72 20 66 6f 72 20 74 68 65   wrapper for the
f020: 20 77 69 6e 55 74 66 38 54 6f 4d 62 63 73 28 29   winUtf8ToMbcs()
f030: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68   function..*/.ch
f040: 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33  ar *sqlite3_win3
f050: 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28 63  2_utf8_to_mbcs(c
f060: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
f070: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
f080: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
f090: 52 0a 20 20 69 66 28 20 21 7a 54 65 78 74 20 29  R.  if( !zText )
f0a0: 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
f0b0: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
f0c0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
f0d0: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  }.#endif.#ifndef
f0e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
f0f0: 4f 49 4e 49 54 0a 20 20 69 66 28 20 73 71 6c 69  OINIT.  if( sqli
f100: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
f110: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e   ) return 0;.#en
f120: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 77 69 6e  dif.  return win
f130: 55 74 66 38 54 6f 4d 62 63 73 28 7a 54 65 78 74  Utf8ToMbcs(zText
f140: 2c 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41  , osAreFileApisA
f150: 4e 53 49 28 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  NSI());.}../*.**
f160: 20 54 68 69 73 20 69 73 20 61 20 70 75 62 6c 69   This is a publi
f170: 63 20 77 72 61 70 70 65 72 20 66 6f 72 20 74 68  c wrapper for th
f180: 65 20 77 69 6e 55 74 66 38 54 6f 4d 62 63 73 28  e winUtf8ToMbcs(
f190: 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63  ) function..*/.c
f1a0: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e  har *sqlite3_win
f1b0: 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 5f  32_utf8_to_mbcs_
f1c0: 76 32 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  v2(const char *z
f1d0: 54 65 78 74 2c 20 69 6e 74 20 75 73 65 41 6e 73  Text, int useAns
f1e0: 69 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  i){.#ifdef SQLIT
f1f0: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
f200: 4f 52 0a 20 20 69 66 28 20 21 7a 54 65 78 74 20  OR.  if( !zText 
f210: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
f220: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
f230: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
f240: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   }.#endif.#ifnde
f250: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
f260: 54 4f 49 4e 49 54 0a 20 20 69 66 28 20 73 71 6c  TOINIT.  if( sql
f270: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
f280: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  ) ) return 0;.#e
f290: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 77 69  ndif.  return wi
f2a0: 6e 55 74 66 38 54 6f 4d 62 63 73 28 7a 54 65 78  nUtf8ToMbcs(zTex
f2b0: 74 2c 20 75 73 65 41 6e 73 69 29 3b 0a 7d 0a 0a  t, useAnsi);.}..
f2c0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
f2d0: 69 6f 6e 20 73 65 74 73 20 74 68 65 20 64 61 74  ion sets the dat
f2e0: 61 20 64 69 72 65 63 74 6f 72 79 20 6f 72 20 74  a directory or t
f2f0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  he temporary dir
f300: 65 63 74 6f 72 79 20 62 61 73 65 64 20 6f 6e 0a  ectory based on.
f310: 2a 2a 20 74 68 65 20 70 72 6f 76 69 64 65 64 20  ** the provided 
f320: 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 65 20  arguments.  The 
f330: 74 79 70 65 20 61 72 67 75 6d 65 6e 74 20 6d 75  type argument mu
f340: 73 74 20 62 65 20 31 20 69 6e 20 6f 72 64 65 72  st be 1 in order
f350: 20 74 6f 20 73 65 74 20 74 68 65 0a 2a 2a 20 64   to set the.** d
f360: 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 6f 72  ata directory or
f370: 20 32 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73   2 in order to s
f380: 65 74 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  et the temporary
f390: 20 64 69 72 65 63 74 6f 72 79 2e 20 20 54 68 65   directory.  The
f3a0: 20 7a 56 61 6c 75 65 0a 2a 2a 20 61 72 67 75 6d   zValue.** argum
f3b0: 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ent is the name 
f3c0: 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  of the directory
f3d0: 20 74 6f 20 75 73 65 2e 20 20 54 68 65 20 72 65   to use.  The re
f3e0: 74 75 72 6e 20 76 61 6c 75 65 20 77 69 6c 6c 20  turn value will 
f3f0: 62 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  be.** SQLITE_OK 
f400: 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a  if successful..*
f410: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69  /.int sqlite3_wi
f420: 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
f430: 79 28 44 57 4f 52 44 20 74 79 70 65 2c 20 4c 50  y(DWORD type, LP
f440: 43 57 53 54 52 20 7a 56 61 6c 75 65 29 7b 0a 20  CWSTR zValue){. 
f450: 20 63 68 61 72 20 2a 2a 70 70 44 69 72 65 63 74   char **ppDirect
f460: 6f 72 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  ory = 0;.#ifndef
f470: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
f480: 4f 49 4e 49 54 0a 20 20 69 6e 74 20 72 63 20 3d  OINIT.  int rc =
f490: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
f4a0: 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20  ize();.  if( rc 
f4b0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e  ) return rc;.#en
f4c0: 64 69 66 0a 20 20 69 66 28 20 74 79 70 65 3d 3d  dif.  if( type==
f4d0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54  SQLITE_WIN32_DAT
f4e0: 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  A_DIRECTORY_TYPE
f4f0: 20 29 7b 0a 20 20 20 20 70 70 44 69 72 65 63 74   ){.    ppDirect
f500: 6f 72 79 20 3d 20 26 73 71 6c 69 74 65 33 5f 64  ory = &sqlite3_d
f510: 61 74 61 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20  ata_directory;. 
f520: 20 7d 65 6c 73 65 20 69 66 28 20 74 79 70 65 3d   }else if( type=
f530: 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45  =SQLITE_WIN32_TE
f540: 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50  MP_DIRECTORY_TYP
f550: 45 20 29 7b 0a 20 20 20 20 70 70 44 69 72 65 63  E ){.    ppDirec
f560: 74 6f 72 79 20 3d 20 26 73 71 6c 69 74 65 33 5f  tory = &sqlite3_
f570: 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a  temp_directory;.
f580: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
f590: 70 44 69 72 65 63 74 6f 72 79 20 7c 7c 20 74 79  pDirectory || ty
f5a0: 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32  pe==SQLITE_WIN32
f5b0: 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f  _DATA_DIRECTORY_
f5c0: 54 59 50 45 0a 20 20 20 20 20 20 20 20 20 20 7c  TYPE.          |
f5d0: 7c 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57  | type==SQLITE_W
f5e0: 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54  IN32_TEMP_DIRECT
f5f0: 4f 52 59 5f 54 59 50 45 0a 20 20 29 3b 0a 20 20  ORY_TYPE.  );.  
f600: 61 73 73 65 72 74 28 20 21 70 70 44 69 72 65 63  assert( !ppDirec
f610: 74 6f 72 79 20 7c 7c 20 73 71 6c 69 74 65 33 4d  tory || sqlite3M
f620: 65 6d 64 65 62 75 67 48 61 73 54 79 70 65 28 2a  emdebugHasType(*
f630: 70 70 44 69 72 65 63 74 6f 72 79 2c 20 4d 45 4d  ppDirectory, MEM
f640: 54 59 50 45 5f 48 45 41 50 29 20 29 3b 0a 20 20  TYPE_HEAP) );.  
f650: 69 66 28 20 70 70 44 69 72 65 63 74 6f 72 79 20  if( ppDirectory 
f660: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 61  ){.    char *zVa
f670: 6c 75 65 55 74 66 38 20 3d 20 30 3b 0a 20 20 20  lueUtf8 = 0;.   
f680: 20 69 66 28 20 7a 56 61 6c 75 65 20 26 26 20 7a   if( zValue && z
f690: 56 61 6c 75 65 5b 30 5d 20 29 7b 0a 20 20 20 20  Value[0] ){.    
f6a0: 20 20 7a 56 61 6c 75 65 55 74 66 38 20 3d 20 77    zValueUtf8 = w
f6b0: 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  inUnicodeToUtf8(
f6c0: 7a 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69  zValue);.      i
f6d0: 66 20 28 20 7a 56 61 6c 75 65 55 74 66 38 3d 3d  f ( zValueUtf8==
f6e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
f6f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
f700: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
f710: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
f720: 5f 66 72 65 65 28 2a 70 70 44 69 72 65 63 74 6f  _free(*ppDirecto
f730: 72 79 29 3b 0a 20 20 20 20 2a 70 70 44 69 72 65  ry);.    *ppDire
f740: 63 74 6f 72 79 20 3d 20 7a 56 61 6c 75 65 55 74  ctory = zValueUt
f750: 66 38 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  f8;.    return S
f760: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
f770: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
f780: 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ROR;.}../*.** Th
f790: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
f7a0: 66 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f  f winGetLastErro
f7b0: 72 4d 73 67 0a 2a 2a 20 69 73 20 7a 65 72 6f 20  rMsg.** is zero 
f7c0: 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  if the error mes
f7d0: 73 61 67 65 20 66 69 74 73 20 69 6e 20 74 68 65  sage fits in the
f7e0: 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d   buffer, or non-
f7f0: 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73  zero.** otherwis
f800: 65 20 28 69 66 20 74 68 65 20 6d 65 73 73 61 67  e (if the messag
f810: 65 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 29  e was truncated)
f820: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f830: 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d  winGetLastErrorM
f840: 73 67 28 44 57 4f 52 44 20 6c 61 73 74 45 72 72  sg(DWORD lastErr
f850: 6e 6f 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  no, int nBuf, ch
f860: 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a 20  ar *zBuf){.  /* 
f870: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 72 65  FormatMessage re
f880: 74 75 72 6e 73 20 30 20 6f 6e 20 66 61 69 6c 75  turns 0 on failu
f890: 72 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 69  re.  Otherwise i
f8a0: 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 74  t.  ** returns t
f8b0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 54 43 48  he number of TCH
f8c0: 41 52 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ARs written to t
f8d0: 68 65 20 6f 75 74 70 75 74 0a 20 20 2a 2a 20 62  he output.  ** b
f8e0: 75 66 66 65 72 2c 20 65 78 63 6c 75 64 69 6e 67  uffer, excluding
f8f0: 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6e 67   the terminating
f900: 20 6e 75 6c 6c 20 63 68 61 72 2e 0a 20 20 2a 2f   null char..  */
f910: 0a 20 20 44 57 4f 52 44 20 64 77 4c 65 6e 20 3d  .  DWORD dwLen =
f920: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74   0;.  char *zOut
f930: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 73 49   = 0;..  if( osI
f940: 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c  sNT() ){.#if SQL
f950: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
f960: 20 57 43 48 41 52 20 7a 54 65 6d 70 57 69 64 65   WCHAR zTempWide
f970: 5b 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  [SQLITE_WIN32_MA
f980: 58 5f 45 52 52 4d 53 47 5f 43 48 41 52 53 2b 31  X_ERRMSG_CHARS+1
f990: 5d 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f  ];.    dwLen = o
f9a0: 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 28  sFormatMessageW(
f9b0: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46  FORMAT_MESSAGE_F
f9c0: 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20  ROM_SYSTEM |.   
f9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9e0: 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54            FORMAT
f9f0: 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f  _MESSAGE_IGNORE_
fa00: 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20  INSERTS,.       
fa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa20: 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20        NULL,.    
fa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa40: 20 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72           lastErr
fa50: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
fa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa70: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
fa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa90: 20 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20 20 20   zTempWide,.    
faa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fab0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
fac0: 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47  WIN32_MAX_ERRMSG
fad0: 5f 43 48 41 52 53 2c 0a 20 20 20 20 20 20 20 20  _CHARS,.        
fae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
faf0: 20 20 20 20 20 30 29 3b 0a 23 65 6c 73 65 0a 20       0);.#else. 
fb00: 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70 57     LPWSTR zTempW
fb10: 69 64 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ide = NULL;.    
fb20: 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74  dwLen = osFormat
fb30: 4d 65 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f  MessageW(FORMAT_
fb40: 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45  MESSAGE_ALLOCATE
fb50: 5f 42 55 46 46 45 52 20 7c 0a 20 20 20 20 20 20  _BUFFER |.      
fb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb70: 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45         FORMAT_ME
fb80: 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45  SSAGE_FROM_SYSTE
fb90: 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  M |.            
fba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbb0: 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f   FORMAT_MESSAGE_
fbc0: 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a  IGNORE_INSERTS,.
fbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c               NUL
fbf0: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
fc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc10: 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
fc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc30: 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20          0,.     
fc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc50: 20 20 20 20 20 20 20 20 28 4c 50 57 53 54 52 29          (LPWSTR)
fc60: 20 26 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20 20   &zTempWide,.   
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc80: 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20            0,.   
fc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fca0: 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 23 65            0);.#e
fcb0: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 64 77 4c  ndif.    if( dwL
fcc0: 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20 20 20  en > 0 ){.      
fcd0: 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20 62 75  /* allocate a bu
fce0: 66 66 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74  ffer and convert
fcf0: 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20 20   to UTF8 */.    
fd00: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
fd10: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
fd20: 20 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e 55 6e      zOut = winUn
fd30: 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d  icodeToUtf8(zTem
fd40: 70 57 69 64 65 29 3b 0a 20 20 20 20 20 20 73 71  pWide);.      sq
fd50: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
fd60: 6c 6c 6f 63 28 29 3b 0a 23 69 66 20 21 53 51 4c  lloc();.#if !SQL
fd70: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
fd80: 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73     /* free the s
fd90: 79 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c  ystem buffer all
fda0: 6f 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74  ocated by Format
fdb0: 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20  Message */.     
fdc0: 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65   osLocalFree(zTe
fdd0: 6d 70 57 69 64 65 29 3b 0a 23 65 6e 64 69 66 0a  mpWide);.#endif.
fde0: 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66      }.  }.#ifdef
fdf0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
fe00: 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
fe10: 20 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 20 3d     char *zTemp =
fe20: 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e   NULL;.    dwLen
fe30: 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61   = osFormatMessa
fe40: 67 65 41 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41  geA(FORMAT_MESSA
fe50: 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46  GE_ALLOCATE_BUFF
fe60: 45 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ER |.           
fe70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe80: 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45    FORMAT_MESSAGE
fe90: 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20  _FROM_SYSTEM |. 
fea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
feb0: 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d              FORM
fec0: 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52  AT_MESSAGE_IGNOR
fed0: 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20  E_INSERTS,.     
fee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fef0: 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20          NULL,.  
ff00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff10: 20 20 20 20 20 20 20 20 20 20 20 6c 61 73 74 45             lastE
ff20: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
ff30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff40: 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20     0,.          
ff50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff60: 20 20 20 28 4c 50 53 54 52 29 20 26 7a 54 65 6d     (LPSTR) &zTem
ff70: 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
ff80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff90: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
ffa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffb0: 30 29 3b 0a 20 20 20 20 69 66 28 20 64 77 4c 65  0);.    if( dwLe
ffc0: 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 2f  n > 0 ){.      /
ffd0: 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20 62 75 66  * allocate a buf
ffe0: 66 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20  fer and convert 
fff0: 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20 20 20  to UTF8 */.     
10000 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
10010 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
10020 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e 4d 62 63     zOut = winMbc
10030 73 54 6f 55 74 66 38 28 7a 54 65 6d 70 2c 20 6f  sToUtf8(zTemp, o
10040 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  sAreFileApisANSI
10050 28 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ());.      sqlit
10060 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
10070 63 28 29 3b 0a 20 20 20 20 20 20 2f 2a 20 66 72  c();.      /* fr
10080 65 65 20 74 68 65 20 73 79 73 74 65 6d 20 62 75  ee the system bu
10090 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62  ffer allocated b
100a0 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20  y FormatMessage 
100b0 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c  */.      osLocal
100c0 46 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20  Free(zTemp);.   
100d0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
100e0 69 66 28 20 30 20 3d 3d 20 64 77 4c 65 6e 20 29  if( 0 == dwLen )
100f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
10100 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75  printf(nBuf, zBu
10110 66 2c 20 22 4f 73 45 72 72 6f 72 20 30 78 25 6c  f, "OsError 0x%l
10120 78 20 28 25 6c 75 29 22 2c 20 6c 61 73 74 45 72  x (%lu)", lastEr
10130 72 6e 6f 2c 20 6c 61 73 74 45 72 72 6e 6f 29 3b  rno, lastErrno);
10140 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
10150 20 63 6f 70 79 20 61 20 6d 61 78 69 6d 75 6d 20   copy a maximum 
10160 6f 66 20 6e 42 75 66 20 63 68 61 72 73 20 74 6f  of nBuf chars to
10170 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   output buffer *
10180 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  /.    sqlite3_sn
10190 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75  printf(nBuf, zBu
101a0 66 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a  f, "%s", zOut);.
101b0 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20      /* free the 
101c0 55 54 46 38 20 62 75 66 66 65 72 20 2a 2f 0a 20  UTF8 buffer */. 
101d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
101e0 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  zOut);.  }.  ret
101f0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a  urn 0;.}../*.**.
10200 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
10210 20 2d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74   - winLogErrorAt
10220 4c 69 6e 65 28 29 20 2d 20 69 73 20 6f 6e 6c 79  Line() - is only
10230 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61   ever called via
10240 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 77 69   the macro.** wi
10250 6e 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a  nLogError()..**.
10260 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
10270 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72  is invoked after
10280 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
10290 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69   in an OS functi
102a0 6f 6e 2e 0a 2a 2a 20 49 74 20 6c 6f 67 73 20 61  on..** It logs a
102b0 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20 73   message using s
102c0 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e  qlite3_log() con
102d0 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72  taining the curr
102e0 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  ent value of.** 
102f0 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 2c 20  error code and, 
10300 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65  if possible, the
10310 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
10320 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 0a  equivalent from.
10330 2a 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  ** FormatMessage
10340 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
10350 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
10360 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73  d to the macro s
10370 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72 72  hould be the err
10380 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20  or code that.** 
10390 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
103a0 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e   to SQLite (e.g.
103b0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
103c0 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e  LETE, SQLITE_CAN
103d0 54 4f 50 45 4e 29 2e 0a 2a 2a 20 54 68 65 20 74  TOPEN)..** The t
103e0 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61 72  wo subsequent ar
103f0 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62  guments should b
10400 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
10410 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68  e OS function th
10420 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 61 6e 64  at.** failed and
10430 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
10440 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 68  file-system path
10450 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65  , if any..*/.#de
10460 66 69 6e 65 20 77 69 6e 4c 6f 67 45 72 72 6f 72  fine winLogError
10470 28 61 2c 62 2c 63 2c 64 29 20 20 20 77 69 6e 4c  (a,b,c,d)   winL
10480 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c  ogErrorAtLine(a,
10490 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a  b,c,d,__LINE__).
104a0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f  static int winLo
104b0 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20  gErrorAtLine(.  
104c0 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20 20  int errcode,    
104d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104e0 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  /* SQLite error 
104f0 63 6f 64 65 20 2a 2f 0a 20 20 44 57 4f 52 44 20  code */.  DWORD 
10500 6c 61 73 74 45 72 72 6e 6f 2c 20 20 20 20 20 20  lastErrno,      
10510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6e            /* Win
10520 33 32 20 6c 61 73 74 20 65 72 72 6f 72 20 2a 2f  32 last error */
10530 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
10540 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Func,           
10550 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53     /* Name of OS
10560 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66   function that f
10570 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ailed */.  const
10580 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
10590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
105a0 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69 61 74  le path associat
105b0 65 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f  ed with error */
105c0 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20  .  int iLine    
105d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105e0 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e     /* Source lin
105f0 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65  e number where e
10600 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f  rror occurred */
10610 0a 29 7b 0a 20 20 63 68 61 72 20 7a 4d 73 67 5b  .){.  char zMsg[
10620 35 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20 20  500];           
10630 20 20 20 20 20 20 2f 2a 20 48 75 6d 61 6e 20 72        /* Human r
10640 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20 74 65  eadable error te
10650 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  xt */.  int i;  
10660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10670 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
10680 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 7a 4d  counter */..  zM
10690 73 67 5b 30 5d 20 3d 20 30 3b 0a 20 20 77 69 6e  sg[0] = 0;.  win
106a0 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28  GetLastErrorMsg(
106b0 6c 61 73 74 45 72 72 6e 6f 2c 20 73 69 7a 65 6f  lastErrno, sizeo
106c0 66 28 7a 4d 73 67 29 2c 20 7a 4d 73 67 29 3b 0a  f(zMsg), zMsg);.
106d0 20 20 61 73 73 65 72 74 28 20 65 72 72 63 6f 64    assert( errcod
106e0 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e!=SQLITE_OK );.
106f0 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29    if( zPath==0 )
10700 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20 20 66   zPath = "";.  f
10710 6f 72 28 69 3d 30 3b 20 7a 4d 73 67 5b 69 5d 20  or(i=0; zMsg[i] 
10720 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 72 27  && zMsg[i]!='\r'
10730 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 6e   && zMsg[i]!='\n
10740 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7a 4d 73 67  '; i++){}.  zMsg
10750 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  [i] = 0;.  sqlit
10760 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a  e3_log(errcode,.
10770 20 20 20 20 20 20 22 6f 73 5f 77 69 6e 2e 63 3a        "os_win.c:
10780 25 64 3a 20 28 25 6c 75 29 20 25 73 28 25 73 29  %d: (%lu) %s(%s)
10790 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69 4c   - %s",.      iL
107a0 69 6e 65 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20  ine, lastErrno, 
107b0 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 4d  zFunc, zPath, zM
107c0 73 67 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72  sg.  );..  retur
107d0 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a  n errcode;.}../*
107e0 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  .** The number o
107f0 66 20 74 69 6d 65 73 20 74 68 61 74 20 61 20 52  f times that a R
10800 65 61 64 46 69 6c 65 28 29 2c 20 57 72 69 74 65  eadFile(), Write
10810 46 69 6c 65 28 29 2c 20 61 6e 64 20 44 65 6c 65  File(), and Dele
10820 74 65 46 69 6c 65 28 29 0a 2a 2a 20 77 69 6c 6c  teFile().** will
10830 20 62 65 20 72 65 74 72 69 65 64 20 66 6f 6c 6c   be retried foll
10840 6f 77 69 6e 67 20 61 20 6c 6f 63 6b 69 6e 67 20  owing a locking 
10850 65 72 72 6f 72 20 2d 20 70 72 6f 62 61 62 6c 79  error - probably
10860 20 63 61 75 73 65 64 20 62 79 0a 2a 2a 20 61 6e   caused by.** an
10870 74 69 76 69 72 75 73 20 73 6f 66 74 77 61 72 65  tivirus software
10880 2e 20 20 41 6c 73 6f 20 74 68 65 20 69 6e 69 74  .  Also the init
10890 69 61 6c 20 64 65 6c 61 79 20 62 65 66 6f 72 65  ial delay before
108a0 20 74 68 65 20 66 69 72 73 74 20 72 65 74 72 79   the first retry
108b0 2e 0a 2a 2a 20 54 68 65 20 64 65 6c 61 79 20 69  ..** The delay i
108c0 6e 63 72 65 61 73 65 73 20 6c 69 6e 65 61 72 6c  ncreases linearl
108d0 79 20 77 69 74 68 20 65 61 63 68 20 72 65 74 72  y with each retr
108e0 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  y..*/.#ifndef SQ
108f0 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52  LITE_WIN32_IOERR
10900 5f 52 45 54 52 59 0a 23 20 64 65 66 69 6e 65 20  _RETRY.# define 
10910 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45  SQLITE_WIN32_IOE
10920 52 52 5f 52 45 54 52 59 20 31 30 0a 23 65 6e 64  RR_RETRY 10.#end
10930 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
10940 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45  E_WIN32_IOERR_RE
10950 54 52 59 5f 44 45 4c 41 59 0a 23 20 64 65 66 69  TRY_DELAY.# defi
10960 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
10970 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41  IOERR_RETRY_DELA
10980 59 20 32 35 0a 23 65 6e 64 69 66 0a 73 74 61 74  Y 25.#endif.stat
10990 69 63 20 69 6e 74 20 77 69 6e 49 6f 65 72 72 52  ic int winIoerrR
109a0 65 74 72 79 20 3d 20 53 51 4c 49 54 45 5f 57 49  etry = SQLITE_WI
109b0 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 3b  N32_IOERR_RETRY;
109c0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49  .static int winI
109d0 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 20 3d  oerrRetryDelay =
109e0 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
109f0 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 3b  ERR_RETRY_DELAY;
10a00 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 77 69 6e  ../*.** The "win
10a10 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 22 20  IoerrCanRetry1" 
10a20 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20 74 6f  macro is used to
10a30 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61 20   determine if a 
10a40 70 61 72 74 69 63 75 6c 61 72 20 49 2f 4f 0a 2a  particular I/O.*
10a50 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 62 74  * error code obt
10a60 61 69 6e 65 64 20 76 69 61 20 47 65 74 4c 61 73  ained via GetLas
10a70 74 45 72 72 6f 72 28 29 20 69 73 20 65 6c 69 67  tError() is elig
10a80 69 62 6c 65 20 74 6f 20 62 65 20 72 65 74 72 69  ible to be retri
10a90 65 64 2e 20 20 49 74 0a 2a 2a 20 6d 75 73 74 20  ed.  It.** must 
10aa0 61 63 63 65 70 74 20 74 68 65 20 65 72 72 6f 72  accept the error
10ab0 20 63 6f 64 65 20 44 57 4f 52 44 20 61 73 20 69   code DWORD as i
10ac0 74 73 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  ts only argument
10ad0 20 61 6e 64 20 73 68 6f 75 6c 64 20 72 65 74 75   and should retu
10ae0 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69  rn.** non-zero i
10af0 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  f the error code
10b00 20 69 73 20 74 72 61 6e 73 69 65 6e 74 20 69 6e   is transient in
10b10 20 6e 61 74 75 72 65 20 61 6e 64 20 74 68 65 20   nature and the 
10b20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 72 65 73  operation.** res
10b30 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 67 65 6e  ponsible for gen
10b40 65 72 61 74 69 6e 67 20 74 68 65 20 6f 72 69 67  erating the orig
10b50 69 6e 61 6c 20 65 72 72 6f 72 20 6d 69 67 68 74  inal error might
10b60 20 73 75 63 63 65 65 64 20 75 70 6f 6e 20 62 65   succeed upon be
10b70 69 6e 67 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20  ing.** retried. 
10b80 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   The argument to
10b90 20 74 68 69 73 20 6d 61 63 72 6f 20 73 68 6f 75   this macro shou
10ba0 6c 64 20 62 65 20 61 20 76 61 72 69 61 62 6c 65  ld be a variable
10bb0 2e 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74 69 6f 6e  ..**.** Addition
10bc0 61 6c 6c 79 2c 20 61 20 6d 61 63 72 6f 20 6e 61  ally, a macro na
10bd0 6d 65 64 20 22 77 69 6e 49 6f 65 72 72 43 61 6e  med "winIoerrCan
10be0 52 65 74 72 79 32 22 20 6d 61 79 20 62 65 20 64  Retry2" may be d
10bf0 65 66 69 6e 65 64 2e 20 20 49 66 20 69 74 0a 2a  efined.  If it.*
10c00 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 69 74  * is defined, it
10c10 20 77 69 6c 6c 20 62 65 20 63 6f 6e 73 75 6c 74   will be consult
10c20 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65  ed only when the
10c30 20 6d 61 63 72 6f 20 22 77 69 6e 49 6f 65 72 72   macro "winIoerr
10c40 43 61 6e 52 65 74 72 79 31 22 0a 2a 2a 20 72 65  CanRetry1".** re
10c50 74 75 72 6e 73 20 7a 65 72 6f 2e 20 20 54 68 65  turns zero.  The
10c60 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74   "winIoerrCanRet
10c70 72 79 32 22 20 6d 61 63 72 6f 20 69 73 20 63 6f  ry2" macro is co
10c80 6d 70 6c 65 74 65 6c 79 20 6f 70 74 69 6f 6e 61  mpletely optiona
10c90 6c 20 61 6e 64 0a 2a 2a 20 6d 61 79 20 62 65 20  l and.** may be 
10ca0 75 73 65 64 20 74 6f 20 69 6e 63 6c 75 64 65 20  used to include 
10cb0 61 64 64 69 74 69 6f 6e 61 6c 20 65 72 72 6f 72  additional error
10cc0 20 63 6f 64 65 73 20 69 6e 20 74 68 65 20 73 65   codes in the se
10cd0 74 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a  t that should.**
10ce0 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20 66   result in the f
10cf0 61 69 6c 69 6e 67 20 49 2f 4f 20 6f 70 65 72 61  ailing I/O opera
10d00 74 69 6f 6e 20 62 65 69 6e 67 20 72 65 74 72 69  tion being retri
10d10 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
10d20 2e 20 20 49 66 0a 2a 2a 20 64 65 66 69 6e 65 64  .  If.** defined
10d30 2c 20 74 68 65 20 22 77 69 6e 49 6f 65 72 72 43  , the "winIoerrC
10d40 61 6e 52 65 74 72 79 32 22 20 6d 61 63 72 6f 20  anRetry2" macro 
10d50 6d 75 73 74 20 65 78 68 69 62 69 74 20 65 78 74  must exhibit ext
10d60 65 72 6e 61 6c 20 73 65 6d 61 6e 74 69 63 73 0a  ernal semantics.
10d70 2a 2a 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20  ** identical to 
10d80 74 68 6f 73 65 20 6f 66 20 74 68 65 20 22 77 69  those of the "wi
10d90 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 22  nIoerrCanRetry1"
10da0 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 21   macro..*/.#if !
10db0 64 65 66 69 6e 65 64 28 77 69 6e 49 6f 65 72 72  defined(winIoerr
10dc0 43 61 6e 52 65 74 72 79 31 29 0a 23 64 65 66 69  CanRetry1).#defi
10dd0 6e 65 20 77 69 6e 49 6f 65 72 72 43 61 6e 52 65  ne winIoerrCanRe
10de0 74 72 79 31 28 61 29 20 28 28 28 61 29 3d 3d 45  try1(a) (((a)==E
10df0 52 52 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e 49  RROR_ACCESS_DENI
10e00 45 44 29 20 20 20 20 20 20 20 20 7c 7c 20 5c 0a  ED)        || \.
10e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
10e30 61 29 3d 3d 45 52 52 4f 52 5f 53 48 41 52 49 4e  a)==ERROR_SHARIN
10e40 47 5f 56 49 4f 4c 41 54 49 4f 4e 29 20 20 20 20  G_VIOLATION)    
10e50 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  || \.           
10e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e70 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 4c     ((a)==ERROR_L
10e80 4f 43 4b 5f 56 49 4f 4c 41 54 49 4f 4e 29 20 20  OCK_VIOLATION)  
10e90 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20       || \.      
10ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10eb0 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52          ((a)==ER
10ec0 52 4f 52 5f 44 45 56 5f 4e 4f 54 5f 45 58 49 53  ROR_DEV_NOT_EXIS
10ed0 54 29 20 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20  T)        || \. 
10ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 61               ((a
10f00 29 3d 3d 45 52 52 4f 52 5f 4e 45 54 4e 41 4d 45  )==ERROR_NETNAME
10f10 5f 44 45 4c 45 54 45 44 29 20 20 20 20 20 20 7c  _DELETED)      |
10f20 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  | \.            
10f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f40 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 53 45    ((a)==ERROR_SE
10f50 4d 5f 54 49 4d 45 4f 55 54 29 20 20 20 20 20 20  M_TIMEOUT)      
10f60 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20      || \.       
10f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f80 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52 52         ((a)==ERR
10f90 4f 52 5f 4e 45 54 57 4f 52 4b 5f 55 4e 52 45 41  OR_NETWORK_UNREA
10fa0 43 48 41 42 4c 45 29 29 0a 23 65 6e 64 69 66 0a  CHABLE)).#endif.
10fb0 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 52 65 61 64  ./*.** If a Read
10fc0 46 69 6c 65 28 29 20 6f 72 20 57 72 69 74 65 46  File() or WriteF
10fd0 69 6c 65 28 29 20 65 72 72 6f 72 20 6f 63 63 75  ile() error occu
10fe0 72 73 2c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20  rs, invoke this 
10ff0 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 6f 20 73 65  routine.** to se
11000 65 20 69 66 20 69 74 20 73 68 6f 75 6c 64 20 62  e if it should b
11010 65 20 72 65 74 72 69 65 64 2e 20 20 52 65 74 75  e retried.  Retu
11020 72 6e 20 54 52 55 45 20 74 6f 20 72 65 74 72 79  rn TRUE to retry
11030 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a  .  Return FALSE.
11040 2a 2a 20 74 6f 20 67 69 76 65 20 75 70 20 77 69  ** to give up wi
11050 74 68 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a  th an error..*/.
11060 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52 65  static int winRe
11070 74 72 79 49 6f 65 72 72 28 69 6e 74 20 2a 70 6e  tryIoerr(int *pn
11080 52 65 74 72 79 2c 20 44 57 4f 52 44 20 2a 70 45  Retry, DWORD *pE
11090 72 72 6f 72 29 7b 0a 20 20 44 57 4f 52 44 20 65  rror){.  DWORD e
110a0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
110b0 72 28 29 3b 0a 20 20 69 66 28 20 2a 70 6e 52 65  r();.  if( *pnRe
110c0 74 72 79 3e 3d 77 69 6e 49 6f 65 72 72 52 65 74  try>=winIoerrRet
110d0 72 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45  ry ){.    if( pE
110e0 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2a 70  rror ){.      *p
110f0 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20 20 20 7d  Error = e;.    }
11100 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
11110 20 7d 0a 20 20 69 66 28 20 77 69 6e 49 6f 65 72   }.  if( winIoer
11120 72 43 61 6e 52 65 74 72 79 31 28 65 29 20 29 7b  rCanRetry1(e) ){
11130 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e  .    sqlite3_win
11140 33 32 5f 73 6c 65 65 70 28 77 69 6e 49 6f 65 72  32_sleep(winIoer
11150 72 52 65 74 72 79 44 65 6c 61 79 2a 28 31 2b 2a  rRetryDelay*(1+*
11160 70 6e 52 65 74 72 79 29 29 3b 0a 20 20 20 20 2b  pnRetry));.    +
11170 2b 2a 70 6e 52 65 74 72 79 3b 0a 20 20 20 20 72  +*pnRetry;.    r
11180 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 69 66  eturn 1;.  }.#if
11190 20 64 65 66 69 6e 65 64 28 77 69 6e 49 6f 65 72   defined(winIoer
111a0 72 43 61 6e 52 65 74 72 79 32 29 0a 20 20 65 6c  rCanRetry2).  el
111b0 73 65 20 69 66 28 20 77 69 6e 49 6f 65 72 72 43  se if( winIoerrC
111c0 61 6e 52 65 74 72 79 32 28 65 29 20 29 7b 0a 20  anRetry2(e) ){. 
111d0 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32     sqlite3_win32
111e0 5f 73 6c 65 65 70 28 77 69 6e 49 6f 65 72 72 52  _sleep(winIoerrR
111f0 65 74 72 79 44 65 6c 61 79 2a 28 31 2b 2a 70 6e  etryDelay*(1+*pn
11200 52 65 74 72 79 29 29 3b 0a 20 20 20 20 2b 2b 2a  Retry));.    ++*
11210 70 6e 52 65 74 72 79 3b 0a 20 20 20 20 72 65 74  pnRetry;.    ret
11220 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 1;.  }.#endi
11230 66 0a 20 20 69 66 28 20 70 45 72 72 6f 72 20 29  f.  if( pError )
11240 7b 0a 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20  {.    *pError = 
11250 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
11260 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 67 20  0;.}../*.** Log 
11270 61 20 49 2f 4f 20 65 72 72 6f 72 20 72 65 74 72  a I/O error retr
11280 79 20 65 70 69 73 6f 64 65 2e 0a 2a 2f 0a 73 74  y episode..*/.st
11290 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4c 6f 67  atic void winLog
112a0 49 6f 65 72 72 28 69 6e 74 20 6e 52 65 74 72 79  Ioerr(int nRetry
112b0 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20  , int lineno){. 
112c0 20 69 66 28 20 6e 52 65 74 72 79 20 29 7b 0a 20   if( nRetry ){. 
112d0 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
112e0 51 4c 49 54 45 5f 4e 4f 54 49 43 45 2c 0a 20 20  QLITE_NOTICE,.  
112f0 20 20 20 20 22 64 65 6c 61 79 65 64 20 25 64 6d      "delayed %dm
11300 73 20 66 6f 72 20 6c 6f 63 6b 2f 73 68 61 72 69  s for lock/shari
11310 6e 67 20 63 6f 6e 66 6c 69 63 74 20 61 74 20 6c  ng conflict at l
11320 69 6e 65 20 25 64 22 2c 0a 20 20 20 20 20 20 77  ine %d",.      w
11330 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  inIoerrRetryDela
11340 79 2a 6e 52 65 74 72 79 2a 28 6e 52 65 74 72 79  y*nRetry*(nRetry
11350 2b 31 29 2f 32 2c 20 6c 69 6e 65 6e 6f 0a 20 20  +1)/2, lineno.  
11360 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a    );.  }.}../*.*
11370 2a 20 54 68 69 73 20 23 69 66 20 64 6f 65 73 20  * This #if does 
11380 6e 6f 74 20 72 65 6c 79 20 6f 6e 20 74 68 65 20  not rely on the 
11390 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
113a0 64 65 66 69 6e 65 20 62 65 63 61 75 73 65 20 74  define because t
113b0 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  he.** correspond
113c0 69 6e 67 20 73 65 63 74 69 6f 6e 20 69 6e 20 22  ing section in "
113d0 64 61 74 65 2e 63 22 20 63 61 6e 6e 6f 74 20 75  date.c" cannot u
113e0 73 65 20 69 74 2e 0a 2a 2f 0a 23 69 66 20 21 64  se it..*/.#if !d
113f0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
11400 49 54 5f 4c 4f 43 41 4c 54 49 4d 45 29 20 26 26  IT_LOCALTIME) &&
11410 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f   defined(_WIN32_
11420 57 43 45 29 20 26 26 20 5c 0a 20 20 20 20 28 21  WCE) && \.    (!
11430 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4d  defined(SQLITE_M
11440 53 56 43 5f 4c 4f 43 41 4c 54 49 4d 45 5f 41 50  SVC_LOCALTIME_AP
11450 49 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f 4d 53  I) || !SQLITE_MS
11460 56 43 5f 4c 4f 43 41 4c 54 49 4d 45 5f 41 50 49  VC_LOCALTIME_API
11470 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 4d 53 56 43  )./*.** The MSVC
11480 20 43 52 54 20 6f 6e 20 57 69 6e 64 6f 77 73 20   CRT on Windows 
11490 43 45 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  CE may not have 
114a0 61 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 66 75  a localtime() fu
114b0 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 53 6f 20 64 65  nction..** So de
114c0 66 69 6e 65 20 61 20 73 75 62 73 74 69 74 75 74  fine a substitut
114d0 65 2e 0a 2a 2f 0a 23 20 20 69 6e 63 6c 75 64 65  e..*/.#  include
114e0 20 3c 74 69 6d 65 2e 68 3e 0a 73 74 72 75 63 74   <time.h>.struct
114f0 20 74 6d 20 2a 5f 5f 63 64 65 63 6c 20 6c 6f 63   tm *__cdecl loc
11500 61 6c 74 69 6d 65 28 63 6f 6e 73 74 20 74 69 6d  altime(const tim
11510 65 5f 74 20 2a 74 29 0a 7b 0a 20 20 73 74 61 74  e_t *t).{.  stat
11520 69 63 20 73 74 72 75 63 74 20 74 6d 20 79 3b 0a  ic struct tm y;.
11530 20 20 46 49 4c 45 54 49 4d 45 20 75 54 6d 2c 20    FILETIME uTm, 
11540 6c 54 6d 3b 0a 20 20 53 59 53 54 45 4d 54 49 4d  lTm;.  SYSTEMTIM
11550 45 20 70 54 6d 3b 0a 20 20 73 71 6c 69 74 65 33  E pTm;.  sqlite3
11560 5f 69 6e 74 36 34 20 74 36 34 3b 0a 20 20 74 36  _int64 t64;.  t6
11570 34 20 3d 20 2a 74 3b 0a 20 20 74 36 34 20 3d 20  4 = *t;.  t64 = 
11580 28 74 36 34 20 2b 20 31 31 36 34 34 34 37 33 36  (t64 + 116444736
11590 30 30 29 2a 31 30 30 30 30 30 30 30 3b 0a 20 20  00)*10000000;.  
115a0 75 54 6d 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d  uTm.dwLowDateTim
115b0 65 20 3d 20 28 44 57 4f 52 44 29 28 74 36 34 20  e = (DWORD)(t64 
115c0 26 20 30 78 46 46 46 46 46 46 46 46 29 3b 0a 20  & 0xFFFFFFFF);. 
115d0 20 75 54 6d 2e 64 77 48 69 67 68 44 61 74 65 54   uTm.dwHighDateT
115e0 69 6d 65 3d 20 28 44 57 4f 52 44 29 28 74 36 34  ime= (DWORD)(t64
115f0 20 3e 3e 20 33 32 29 3b 0a 20 20 6f 73 46 69 6c   >> 32);.  osFil
11600 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65  eTimeToLocalFile
11610 54 69 6d 65 28 26 75 54 6d 2c 26 6c 54 6d 29 3b  Time(&uTm,&lTm);
11620 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 53  .  osFileTimeToS
11630 79 73 74 65 6d 54 69 6d 65 28 26 6c 54 6d 2c 26  ystemTime(&lTm,&
11640 70 54 6d 29 3b 0a 20 20 79 2e 74 6d 5f 79 65 61  pTm);.  y.tm_yea
11650 72 20 3d 20 70 54 6d 2e 77 59 65 61 72 20 2d 20  r = pTm.wYear - 
11660 31 39 30 30 3b 0a 20 20 79 2e 74 6d 5f 6d 6f 6e  1900;.  y.tm_mon
11670 20 3d 20 70 54 6d 2e 77 4d 6f 6e 74 68 20 2d 20   = pTm.wMonth - 
11680 31 3b 0a 20 20 79 2e 74 6d 5f 77 64 61 79 20 3d  1;.  y.tm_wday =
11690 20 70 54 6d 2e 77 44 61 79 4f 66 57 65 65 6b 3b   pTm.wDayOfWeek;
116a0 0a 20 20 79 2e 74 6d 5f 6d 64 61 79 20 3d 20 70  .  y.tm_mday = p
116b0 54 6d 2e 77 44 61 79 3b 0a 20 20 79 2e 74 6d 5f  Tm.wDay;.  y.tm_
116c0 68 6f 75 72 20 3d 20 70 54 6d 2e 77 48 6f 75 72  hour = pTm.wHour
116d0 3b 0a 20 20 79 2e 74 6d 5f 6d 69 6e 20 3d 20 70  ;.  y.tm_min = p
116e0 54 6d 2e 77 4d 69 6e 75 74 65 3b 0a 20 20 79 2e  Tm.wMinute;.  y.
116f0 74 6d 5f 73 65 63 20 3d 20 70 54 6d 2e 77 53 65  tm_sec = pTm.wSe
11700 63 6f 6e 64 3b 0a 20 20 72 65 74 75 72 6e 20 26  cond;.  return &
11710 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  y;.}.#endif..#if
11720 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
11730 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
11740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54  ***********.** T
11780 68 69 73 20 73 65 63 74 69 6f 6e 20 63 6f 6e 74  his section cont
11790 61 69 6e 73 20 63 6f 64 65 20 66 6f 72 20 57 69  ains code for Wi
117a0 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 64 65  nCE only..*/.#de
117b0 66 69 6e 65 20 48 41 4e 44 4c 45 5f 54 4f 5f 57  fine HANDLE_TO_W
117c0 49 4e 46 49 4c 45 28 61 29 20 28 77 69 6e 46 69  INFILE(a) (winFi
117d0 6c 65 2a 29 26 28 28 63 68 61 72 2a 29 61 29 5b  le*)&((char*)a)[
117e0 2d 28 69 6e 74 29 6f 66 66 73 65 74 6f 66 28 77  -(int)offsetof(w
117f0 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f 2a 0a 2a  inFile,h)]../*.*
11800 2a 20 41 63 71 75 69 72 65 20 61 20 6c 6f 63 6b  * Acquire a lock
11810 20 6f 6e 20 74 68 65 20 68 61 6e 64 6c 65 20 68   on the handle h
11820 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11830 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72  winceMutexAcquir
11840 65 28 48 41 4e 44 4c 45 20 68 29 7b 0a 20 20 20  e(HANDLE h){.   
11850 44 57 4f 52 44 20 64 77 45 72 72 3b 0a 20 20 20  DWORD dwErr;.   
11860 64 6f 20 7b 0a 20 20 20 20 20 64 77 45 72 72 20  do {.     dwErr 
11870 3d 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c  = osWaitForSingl
11880 65 4f 62 6a 65 63 74 28 68 2c 20 49 4e 46 49 4e  eObject(h, INFIN
11890 49 54 45 29 3b 0a 20 20 20 7d 20 77 68 69 6c 65  ITE);.   } while
118a0 20 28 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f   (dwErr != WAIT_
118b0 4f 42 4a 45 43 54 5f 30 20 26 26 20 64 77 45 72  OBJECT_0 && dwEr
118c0 72 20 21 3d 20 57 41 49 54 5f 41 42 41 4e 44 4f  r != WAIT_ABANDO
118d0 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65  NED);.}./*.** Re
118e0 6c 65 61 73 65 20 61 20 6c 6f 63 6b 20 61 63 71  lease a lock acq
118f0 75 69 72 65 64 20 62 79 20 77 69 6e 63 65 4d 75  uired by winceMu
11900 74 65 78 41 63 71 75 69 72 65 28 29 0a 2a 2f 0a  texAcquire().*/.
11910 23 64 65 66 69 6e 65 20 77 69 6e 63 65 4d 75 74  #define winceMut
11920 65 78 52 65 6c 65 61 73 65 28 68 29 20 52 65 6c  exRelease(h) Rel
11930 65 61 73 65 4d 75 74 65 78 28 68 29 0a 0a 2f 2a  easeMutex(h)../*
11940 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 6d  .** Create the m
11950 75 74 65 78 20 61 6e 64 20 73 68 61 72 65 64 20  utex and shared 
11960 6d 65 6d 6f 72 79 20 75 73 65 64 20 66 6f 72 20  memory used for 
11970 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 65 20 66  locking in the f
11980 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  ile.** descripto
11990 72 20 70 46 69 6c 65 0a 2a 2f 0a 73 74 61 74 69  r pFile.*/.stati
119a0 63 20 69 6e 74 20 77 69 6e 63 65 43 72 65 61 74  c int winceCreat
119b0 65 4c 6f 63 6b 28 63 6f 6e 73 74 20 63 68 61 72  eLock(const char
119c0 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 77 69 6e   *zFilename, win
119d0 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
119e0 4c 50 57 53 54 52 20 7a 54 6f 6b 3b 0a 20 20 4c  LPWSTR zTok;.  L
119f0 50 57 53 54 52 20 7a 4e 61 6d 65 3b 0a 20 20 44  PWSTR zName;.  D
11a00 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  WORD lastErrno;.
11a10 20 20 42 4f 4f 4c 20 62 4c 6f 67 67 65 64 20 3d    BOOL bLogged =
11a20 20 46 41 4c 53 45 3b 0a 20 20 42 4f 4f 4c 20 62   FALSE;.  BOOL b
11a30 49 6e 69 74 20 3d 20 54 52 55 45 3b 0a 0a 20 20  Init = TRUE;..  
11a40 7a 4e 61 6d 65 20 3d 20 77 69 6e 55 74 66 38 54  zName = winUtf8T
11a50 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
11a60 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  me);.  if( zName
11a70 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6f 75  ==0 ){.    /* ou
11a80 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  t of memory */. 
11a90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11aa0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50  _IOERR_NOMEM_BKP
11ab0 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  T;.  }..  /* Ini
11ac0 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 61  tialize the loca
11ad0 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20 20  l lockdata */.  
11ae0 6d 65 6d 73 65 74 28 26 70 46 69 6c 65 2d 3e 6c  memset(&pFile->l
11af0 6f 63 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ocal, 0, sizeof(
11b00 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a  pFile->local));.
11b10 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68  .  /* Replace th
11b20 65 20 62 61 63 6b 73 6c 61 73 68 65 73 20 66 72  e backslashes fr
11b30 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  om the filename 
11b40 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 69 74  and lowercase it
11b50 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69 76 65 20  .  ** to derive 
11b60 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a 2f  a mutex name. */
11b70 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73 43 68 61 72  .  zTok = osChar
11b80 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20  LowerW(zName);. 
11b90 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f   for (;*zTok;zTo
11ba0 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a 7a  k++){.    if (*z
11bb0 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54  Tok == '\\') *zT
11bc0 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20  ok = '_';.  }.. 
11bd0 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e 20   /* Create/open 
11be0 74 68 65 20 6e 61 6d 65 64 20 6d 75 74 65 78 20  the named mutex 
11bf0 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74  */.  pFile->hMut
11c00 65 78 20 3d 20 6f 73 43 72 65 61 74 65 4d 75 74  ex = osCreateMut
11c10 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c  exW(NULL, FALSE,
11c20 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28 21   zName);.  if (!
11c30 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a  pFile->hMutex){.
11c40 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
11c50 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
11c60 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 73 71 6c  Error();.    sql
11c70 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29  ite3_free(zName)
11c80 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
11c90 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
11ca0 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61  IOERR, pFile->la
11cb0 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
11cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cd0 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b  "winceCreateLock
11ce0 31 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  1", zFilename);.
11cf0 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
11d00 65 20 74 68 65 20 6d 75 74 65 78 20 62 65 66 6f  e the mutex befo
11d10 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 20 2a 2f  re continuing */
11d20 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  .  winceMutexAcq
11d30 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
11d40 65 78 29 3b 0a 0a 20 20 2f 2a 20 53 69 6e 63 65  ex);..  /* Since
11d50 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6e 61   the names of na
11d60 6d 65 64 20 6d 75 74 65 78 65 73 2c 20 73 65 6d  med mutexes, sem
11d70 61 70 68 6f 72 65 73 2c 20 66 69 6c 65 20 6d 61  aphores, file ma
11d80 70 70 69 6e 67 73 20 65 74 63 20 61 72 65 0a 20  ppings etc are. 
11d90 20 2a 2a 20 63 61 73 65 2d 73 65 6e 73 69 74 69   ** case-sensiti
11da0 76 65 2c 20 74 61 6b 65 20 61 64 76 61 6e 74 61  ve, take advanta
11db0 67 65 20 6f 66 20 74 68 61 74 20 62 79 20 75 70  ge of that by up
11dc0 70 65 72 63 61 73 69 6e 67 20 74 68 65 20 6d 75  percasing the mu
11dd0 74 65 78 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e  tex name.  ** an
11de0 64 20 75 73 69 6e 67 20 74 68 61 74 20 61 73 20  d using that as 
11df0 74 68 65 20 73 68 61 72 65 64 20 66 69 6c 65 6d  the shared filem
11e00 61 70 70 69 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a  apping name..  *
11e10 2f 0a 20 20 6f 73 43 68 61 72 55 70 70 65 72 57  /.  osCharUpperW
11e20 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65  (zName);.  pFile
11e30 2d 3e 68 53 68 61 72 65 64 20 3d 20 6f 73 43 72  ->hShared = osCr
11e40 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
11e50 28 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  (INVALID_HANDLE_
11e60 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20  VALUE, NULL,.   
11e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e90 20 20 20 20 20 50 41 47 45 5f 52 45 41 44 57 52       PAGE_READWR
11ea0 49 54 45 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  ITE, 0, sizeof(w
11eb0 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20  inceLock),.     
11ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ee0 20 20 20 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a     zName);..  /*
11ef0 20 53 65 74 20 61 20 66 6c 61 67 20 74 68 61 74   Set a flag that
11f00 20 69 6e 64 69 63 61 74 65 73 20 77 65 27 72 65   indicates we're
11f10 20 74 68 65 20 66 69 72 73 74 20 74 6f 20 63 72   the first to cr
11f20 65 61 74 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  eate the memory 
11f30 73 6f 20 69 74 0a 20 20 2a 2a 20 6d 75 73 74 20  so it.  ** must 
11f40 62 65 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c 69  be zero-initiali
11f50 7a 65 64 20 2a 2f 0a 20 20 6c 61 73 74 45 72 72  zed */.  lastErr
11f60 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
11f70 72 6f 72 28 29 3b 0a 20 20 69 66 20 28 6c 61 73  ror();.  if (las
11f80 74 45 72 72 6e 6f 20 3d 3d 20 45 52 52 4f 52 5f  tErrno == ERROR_
11f90 41 4c 52 45 41 44 59 5f 45 58 49 53 54 53 29 7b  ALREADY_EXISTS){
11fa0 0a 20 20 20 20 62 49 6e 69 74 20 3d 20 46 41 4c  .    bInit = FAL
11fb0 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  SE;.  }..  sqlit
11fc0 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  e3_free(zName);.
11fd0 0a 20 20 2f 2a 20 49 66 20 77 65 20 73 75 63 63  .  /* If we succ
11fe0 65 65 64 65 64 20 69 6e 20 6d 61 6b 69 6e 67 20  eeded in making 
11ff0 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
12000 79 20 68 61 6e 64 6c 65 2c 20 6d 61 70 20 69 74  y handle, map it
12010 2e 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  . */.  if( pFile
12020 2d 3e 68 53 68 61 72 65 64 20 29 7b 0a 20 20 20  ->hShared ){.   
12030 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 3d   pFile->shared =
12040 20 28 77 69 6e 63 65 4c 6f 63 6b 2a 29 6f 73 4d   (winceLock*)osM
12050 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69  apViewOfFile(pFi
12060 6c 65 2d 3e 68 53 68 61 72 65 64 2c 0a 20 20 20  le->hShared,.   
12070 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 4d            FILE_M
12080 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f 4d 41 50  AP_READ|FILE_MAP
12090 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c 20 73 69  _WRITE, 0, 0, si
120a0 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29  zeof(winceLock))
120b0 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d 61 70 70  ;.    /* If mapp
120c0 69 6e 67 20 66 61 69 6c 65 64 2c 20 63 6c 6f 73  ing failed, clos
120d0 65 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  e the shared mem
120e0 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e 64 20 65  ory handle and e
120f0 72 61 73 65 20 69 74 20 2a 2f 0a 20 20 20 20 69  rase it */.    i
12100 66 28 20 21 70 46 69 6c 65 2d 3e 73 68 61 72 65  f( !pFile->share
12110 64 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  d ){.      pFile
12120 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
12130 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
12140 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f        winLogErro
12150 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  r(SQLITE_IOERR, 
12160 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
12170 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12180 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74 65      "winceCreate
12190 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c 65 6e 61 6d  Lock2", zFilenam
121a0 65 29 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67 65  e);.      bLogge
121b0 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  d = TRUE;.      
121c0 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
121d0 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 20  ile->hShared);. 
121e0 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 53 68 61       pFile->hSha
121f0 72 65 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  red = NULL;.    
12200 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73  }.  }..  /* If s
12210 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 75  hared memory cou
12220 6c 64 20 6e 6f 74 20 62 65 20 63 72 65 61 74 65  ld not be create
12230 64 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68  d, then close th
12240 65 20 6d 75 74 65 78 20 61 6e 64 20 66 61 69 6c  e mutex and fail
12250 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
12260 3e 68 53 68 61 72 65 64 3d 3d 4e 55 4c 4c 20 29  >hShared==NULL )
12270 7b 0a 20 20 20 20 69 66 28 20 21 62 4c 6f 67 67  {.    if( !bLogg
12280 65 64 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ed ){.      pFil
12290 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
122a0 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
122b0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
122c0 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d  TE_IOERR, pFile-
122d0 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
122e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
122f0 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 33 22  inceCreateLock3"
12300 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
12310 20 20 20 20 62 4c 6f 67 67 65 64 20 3d 20 54 52      bLogged = TR
12320 55 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 69  UE;.    }.    wi
12330 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
12340 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
12350 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
12360 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
12370 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75  ;.    pFile->hMu
12380 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  tex = NULL;.    
12390 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
123a0 45 52 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ERR;.  }..  /* I
123b0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 68  nitialize the sh
123c0 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 66 20 77  ared memory if w
123d0 65 27 72 65 20 73 75 70 70 6f 73 65 64 20 74 6f  e're supposed to
123e0 20 2a 2f 0a 20 20 69 66 28 20 62 49 6e 69 74 20   */.  if( bInit 
123f0 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 46  ){.    memset(pF
12400 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20 30 2c 20  ile->shared, 0, 
12410 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b  sizeof(winceLock
12420 29 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65  ));.  }..  wince
12430 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
12440 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72  le->hMutex);.  r
12450 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12460 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f  .}../*.** Destro
12470 79 20 74 68 65 20 70 61 72 74 20 6f 66 20 77 69  y the part of wi
12480 6e 46 69 6c 65 20 74 68 61 74 20 64 65 61 6c 73  nFile that deals
12490 20 77 69 74 68 20 77 69 6e 63 65 20 6c 6f 63 6b   with wince lock
124a0 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
124b0 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63   winceDestroyLoc
124c0 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  k(winFile *pFile
124d0 29 7b 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  ){.  if (pFile->
124e0 68 4d 75 74 65 78 29 7b 0a 20 20 20 20 2f 2a 20  hMutex){.    /* 
124f0 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 65  Acquire the mute
12500 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75  x */.    winceMu
12510 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65  texAcquire(pFile
12520 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20  ->hMutex);..    
12530 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
12540 20 62 6c 6f 63 6b 73 20 73 68 6f 75 6c 64 20 70   blocks should p
12550 72 6f 62 61 62 6c 79 20 61 73 73 65 72 74 20 69  robably assert i
12560 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 62 75  n debug mode, bu
12570 74 20 74 68 65 79 0a 20 20 20 20 20 20 20 61 72  t they.       ar
12580 65 20 74 6f 20 63 6c 65 61 6e 75 70 20 69 6e 20  e to cleanup in 
12590 63 61 73 65 20 61 6e 79 20 6c 6f 63 6b 73 20 72  case any locks r
125a0 65 6d 61 69 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a  emained open */.
125b0 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
125c0 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a  ocal.nReaders){.
125d0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
125e0 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d  red->nReaders --
125f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
12600 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65  pFile->local.bRe
12610 73 65 72 76 65 64 29 7b 0a 20 20 20 20 20 20 70  served){.      p
12620 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52  File->shared->bR
12630 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b  eserved = FALSE;
12640 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70  .    }.    if (p
12650 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e  File->local.bPen
12660 64 69 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69  ding){.      pFi
12670 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e  le->shared->bPen
12680 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20  ding = FALSE;.  
12690 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c    }.    if (pFil
126a0 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73  e->local.bExclus
126b0 69 76 65 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ive){.      pFil
126c0 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c  e->shared->bExcl
126d0 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20  usive = FALSE;. 
126e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 2d     }..    /* De-
126f0 72 65 66 65 72 65 6e 63 65 20 61 6e 64 20 63 6c  reference and cl
12700 6f 73 65 20 6f 75 72 20 63 6f 70 79 20 6f 66 20  ose our copy of 
12710 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
12720 79 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20  y handle */.    
12730 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c  osUnmapViewOfFil
12740 65 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 29  e(pFile->shared)
12750 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e  ;.    osCloseHan
12760 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72  dle(pFile->hShar
12770 65 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 6e  ed);..    /* Don
12780 65 20 77 69 74 68 20 74 68 65 20 6d 75 74 65 78  e with the mutex
12790 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74   */.    winceMut
127a0 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d  exRelease(pFile-
127b0 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 6f 73  >hMutex);.    os
127c0 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
127d0 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20  e->hMutex);.    
127e0 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20  pFile->hMutex = 
127f0 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  NULL;.  }.}../*.
12800 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  ** An implementa
12810 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b  tion of the Lock
12820 46 69 6c 65 28 29 20 41 50 49 20 6f 66 20 57 69  File() API of Wi
12830 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a  ndows for CE.*/.
12840 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63  static BOOL winc
12850 65 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48  eLockFile(.  LPH
12860 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20  ANDLE phFile,.  
12870 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73  DWORD dwFileOffs
12880 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64  etLow,.  DWORD d
12890 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c  wFileOffsetHigh,
128a0 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
128b0 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77  OfBytesToLockLow
128c0 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65  ,.  DWORD nNumbe
128d0 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69  rOfBytesToLockHi
128e0 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  gh.){.  winFile 
128f0 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f  *pFile = HANDLE_
12900 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c  TO_WINFILE(phFil
12910 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75  e);.  BOOL bRetu
12920 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55  rn = FALSE;..  U
12930 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
12940 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68  dwFileOffsetHigh
12950 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
12960 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42  METER(nNumberOfB
12970 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b  ytesToLockHigh);
12980 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e  ..  if (!pFile->
12990 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20 54  hMutex) return T
129a0 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65  RUE;.  winceMute
129b0 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e  xAcquire(pFile->
129c0 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 57  hMutex);..  /* W
129d0 61 6e 74 69 6e 67 20 61 6e 20 65 78 63 6c 75 73  anting an exclus
129e0 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69  ive lock? */.  i
129f0 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
12a00 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41  ow == (DWORD)SHA
12a10 52 45 44 5f 46 49 52 53 54 0a 20 20 20 20 20 20  RED_FIRST.      
12a20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74   && nNumberOfByt
12a30 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28  esToLockLow == (
12a40 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a  DWORD)SHARED_SIZ
12a50 45 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  E){.    if (pFil
12a60 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64  e->shared->nRead
12a70 65 72 73 20 3d 3d 20 30 20 26 26 20 70 46 69 6c  ers == 0 && pFil
12a80 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c  e->shared->bExcl
12a90 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20  usive == 0){.   
12aa0 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
12ab0 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20  d->bExclusive = 
12ac0 54 52 55 45 3b 0a 20 20 20 20 20 20 20 70 46 69  TRUE;.       pFi
12ad0 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75  le->local.bExclu
12ae0 73 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20  sive = TRUE;.   
12af0 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
12b00 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
12b10 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 61 64 2d   /* Want a read-
12b20 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  only lock? */.  
12b30 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f  else if (dwFileO
12b40 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
12b50 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 20  RD)SHARED_FIRST 
12b60 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 6e 4e  &&.           nN
12b70 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
12b80 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20  ckLow == 1){.   
12b90 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72   if (pFile->shar
12ba0 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
12bb0 3d 20 30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  = 0){.      pFil
12bc0 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
12bd0 73 20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 28  s ++;.      if (
12be0 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
12bf0 61 64 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20  aders == 1){.   
12c00 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
12c10 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b  ed->nReaders ++;
12c20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
12c30 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
12c40 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
12c50 61 6e 74 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f  ant a pending lo
12c60 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ck? */.  else if
12c70 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
12c80 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44  w == (DWORD)PEND
12c90 49 4e 47 5f 42 59 54 45 0a 20 20 20 20 20 20 20  ING_BYTE.       
12ca0 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66      && nNumberOf
12cb0 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d  BytesToLockLow =
12cc0 3d 20 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  = 1){.    /* If 
12cd0 6e 6f 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20  no pending lock 
12ce0 68 61 73 20 62 65 65 6e 20 61 63 71 75 69 72 65  has been acquire
12cf0 64 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20  d, then acquire 
12d00 69 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46  it */.    if (pF
12d10 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65  ile->shared->bPe
12d20 6e 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20 20  nding == 0) {.  
12d30 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
12d40 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52  d->bPending = TR
12d50 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  UE;.      pFile-
12d60 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20  >local.bPending 
12d70 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52  = TRUE;.      bR
12d80 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
12d90 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61    }.  }..  /* Wa
12da0 6e 74 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  nt a reserved lo
12db0 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ck? */.  else if
12dc0 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
12dd0 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45  w == (DWORD)RESE
12de0 52 56 45 44 5f 42 59 54 45 0a 20 20 20 20 20 20  RVED_BYTE.      
12df0 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f       && nNumberO
12e00 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
12e10 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70  == 1){.    if (p
12e20 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52  File->shared->bR
12e30 65 73 65 72 76 65 64 20 3d 3d 20 30 29 20 7b 0a  eserved == 0) {.
12e40 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
12e50 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d  red->bReserved =
12e60 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69   TRUE;.      pFi
12e70 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
12e80 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ved = TRUE;.    
12e90 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
12ea0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77  ;.    }.  }..  w
12eb0 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
12ec0 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
12ed0 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74 75 72  .  return bRetur
12ee0 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  n;.}../*.** An i
12ef0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
12f00 20 74 68 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 20   the UnlockFile 
12f10 41 50 49 20 6f 66 20 57 69 6e 64 6f 77 73 20 66  API of Windows f
12f20 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20  or CE.*/.static 
12f30 42 4f 4f 4c 20 77 69 6e 63 65 55 6e 6c 6f 63 6b  BOOL winceUnlock
12f40 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45  File(.  LPHANDLE
12f50 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44   phFile,.  DWORD
12f60 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77   dwFileOffsetLow
12f70 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65  ,.  DWORD dwFile
12f80 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57  OffsetHigh,.  DW
12f90 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ORD nNumberOfByt
12fa0 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20  esToUnlockLow,. 
12fb0 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66   DWORD nNumberOf
12fc0 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67  BytesToUnlockHig
12fd0 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  h.){.  winFile *
12fe0 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54  pFile = HANDLE_T
12ff0 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65  O_WINFILE(phFile
13000 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72  );.  BOOL bRetur
13010 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e  n = FALSE;..  UN
13020 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
13030 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29  wFileOffsetHigh)
13040 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
13050 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79  ETER(nNumberOfBy
13060 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 29  tesToUnlockHigh)
13070 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d  ;..  if (!pFile-
13080 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20  >hMutex) return 
13090 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74  TRUE;.  winceMut
130a0 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d  exAcquire(pFile-
130b0 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  >hMutex);..  /* 
130c0 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65 61 64  Releasing a read
130d0 65 72 20 6c 6f 63 6b 20 6f 72 20 61 6e 20 65 78  er lock or an ex
130e0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a  clusive lock */.
130f0 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73    if (dwFileOffs
13100 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
13110 53 48 41 52 45 44 5f 46 49 52 53 54 29 7b 0a 20  SHARED_FIRST){. 
13120 20 20 20 2f 2a 20 44 69 64 20 77 65 20 68 61 76     /* Did we hav
13130 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  e an exclusive l
13140 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 69 66 20 28  ock? */.    if (
13150 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78  pFile->local.bEx
13160 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20  clusive){.      
13170 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66  assert(nNumberOf
13180 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
13190 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
131a0 44 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 70  D_SIZE);.      p
131b0 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63  File->local.bExc
131c0 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a  lusive = FALSE;.
131d0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
131e0 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
131f0 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62  = FALSE;.      b
13200 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
13210 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 64     }..    /* Did
13220 20 77 65 20 6a 75 73 74 20 68 61 76 65 20 61 20   we just have a 
13230 72 65 61 64 65 72 20 6c 6f 63 6b 3f 20 2a 2f 0a  reader lock? */.
13240 20 20 20 20 65 6c 73 65 20 69 66 20 28 70 46 69      else if (pFi
13250 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
13260 72 73 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  rs){.      asser
13270 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  t(nNumberOfBytes
13280 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28  ToUnlockLow == (
13290 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a  DWORD)SHARED_SIZ
132a0 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  E.             |
132b0 7c 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  | nNumberOfBytes
132c0 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  ToUnlockLow == 1
132d0 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
132e0 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d  local.nReaders -
132f0 2d 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46 69  -;.      if (pFi
13300 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
13310 72 73 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b  rs == 0).      {
13320 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
13330 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73  shared->nReaders
13340 20 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   --;.      }.   
13350 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
13360 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
13370 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 70  /* Releasing a p
13380 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20  ending lock */. 
13390 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65   else if (dwFile
133a0 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
133b0 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45  ORD)PENDING_BYTE
133c0 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e  .           && n
133d0 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
133e0 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  nlockLow == 1){.
133f0 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
13400 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a  ocal.bPending){.
13410 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
13420 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41  al.bPending = FA
13430 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  LSE;.      pFile
13440 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69  ->shared->bPendi
13450 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ng = FALSE;.    
13460 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
13470 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  ;.    }.  }.  /*
13480 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65 73   Releasing a res
13490 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20  erved lock */.  
134a0 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f  else if (dwFileO
134b0 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
134c0 52 44 29 52 45 53 45 52 56 45 44 5f 42 59 54 45  RD)RESERVED_BYTE
134d0 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e  .           && n
134e0 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
134f0 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  nlockLow == 1){.
13500 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
13510 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29 20  ocal.bReserved) 
13520 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
13530 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d  ocal.bReserved =
13540 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46   FALSE;.      pF
13550 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65  ile->shared->bRe
13560 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a  served = FALSE;.
13570 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
13580 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
13590 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c  .  winceMutexRel
135a0 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
135b0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52  ex);.  return bR
135c0 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45  eturn;.}./*.** E
135d0 6e 64 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  nd of the specia
135e0 6c 20 63 6f 64 65 20 66 6f 72 20 77 69 6e 63 65  l code for wince
135f0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
13600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
13640 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
13650 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a  _OS_WINCE */../*
13660 0a 2a 2a 20 4c 6f 63 6b 20 61 20 66 69 6c 65 20  .** Lock a file 
13670 72 65 67 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  region..*/.stati
13680 63 20 42 4f 4f 4c 20 77 69 6e 4c 6f 63 6b 46 69  c BOOL winLockFi
13690 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70  le(.  LPHANDLE p
136a0 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 66  hFile,.  DWORD f
136b0 6c 61 67 73 2c 0a 20 20 44 57 4f 52 44 20 6f 66  lags,.  DWORD of
136c0 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  fsetLow,.  DWORD
136d0 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44   offsetHigh,.  D
136e0 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77  WORD numBytesLow
136f0 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74  ,.  DWORD numByt
13700 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51  esHigh.){.#if SQ
13710 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
13720 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69  /*.  ** NOTE: Wi
13730 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64  ndows CE is hand
13740 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  led differently 
13750 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63  here due its lac
13760 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20  k of the Win32. 
13770 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f   **       API Lo
13780 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72  ckFile..  */.  r
13790 65 74 75 72 6e 20 77 69 6e 63 65 4c 6f 63 6b 46  eturn winceLockF
137a0 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66 66 73  ile(phFile, offs
137b0 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67  etLow, offsetHig
137c0 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h,.             
137d0 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74            numByt
137e0 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48  esLow, numBytesH
137f0 69 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66  igh);.#else.  if
13800 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20  ( osIsNT() ){.  
13810 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c    OVERLAPPED ovl
13820 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f  p;.    memset(&o
13830 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f  vlp, 0, sizeof(O
13840 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20  VERLAPPED));.   
13850 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f   ovlp.Offset = o
13860 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76  ffsetLow;.    ov
13870 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20  lp.OffsetHigh = 
13880 6f 66 66 73 65 74 48 69 67 68 3b 0a 20 20 20 20  offsetHigh;.    
13890 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c  return osLockFil
138a0 65 45 78 28 2a 70 68 46 69 6c 65 2c 20 66 6c 61  eEx(*phFile, fla
138b0 67 73 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c  gs, 0, numBytesL
138c0 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68  ow, numBytesHigh
138d0 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73  , &ovlp);.  }els
138e0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  e{.    return os
138f0 4c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65  LockFile(*phFile
13900 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66  , offsetLow, off
13910 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65  setHigh, numByte
13920 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  sLow,.          
13930 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42              numB
13940 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23  ytesHigh);.  }.#
13950 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  endif.}../*.** U
13960 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67  nlock a file reg
13970 69 6f 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ion.. */.static 
13980 42 4f 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  BOOL winUnlockFi
13990 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70  le(.  LPHANDLE p
139a0 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 6f  hFile,.  DWORD o
139b0 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52  ffsetLow,.  DWOR
139c0 44 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20  D offsetHigh,.  
139d0 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f  DWORD numBytesLo
139e0 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79  w,.  DWORD numBy
139f0 74 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53  tesHigh.){.#if S
13a00 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
13a10 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57   /*.  ** NOTE: W
13a20 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e  indows CE is han
13a30 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  dled differently
13a40 20 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61   here due its la
13a50 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a  ck of the Win32.
13a60 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 55    **       API U
13a70 6e 6c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a  nlockFile..  */.
13a80 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65 55 6e    return winceUn
13a90 6c 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c  lockFile(phFile,
13aa0 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73   offsetLow, offs
13ab0 65 74 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20  etHigh,.        
13ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ad0 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75   numBytesLow, nu
13ae0 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 23 65 6c  mBytesHigh);.#el
13af0 73 65 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28  se.  if( osIsNT(
13b00 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50  ) ){.    OVERLAP
13b10 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65  PED ovlp;.    me
13b20 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73  mset(&ovlp, 0, s
13b30 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44  izeof(OVERLAPPED
13b40 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66  ));.    ovlp.Off
13b50 73 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b  set = offsetLow;
13b60 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74  .    ovlp.Offset
13b70 48 69 67 68 20 3d 20 6f 66 66 73 65 74 48 69 67  High = offsetHig
13b80 68 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  h;.    return os
13b90 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68  UnlockFileEx(*ph
13ba0 46 69 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74 65  File, 0, numByte
13bb0 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69  sLow, numBytesHi
13bc0 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65  gh, &ovlp);.  }e
13bd0 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
13be0 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a 70 68  osUnlockFile(*ph
13bf0 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c  File, offsetLow,
13c00 20 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d   offsetHigh, num
13c10 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20  BytesLow,.      
13c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c30 20 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b    numBytesHigh);
13c40 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
13c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
13ca0 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20   The next group 
13cb0 6f 66 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c  of routines impl
13cc0 65 6d 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d 65  ement the I/O me
13cd0 74 68 6f 64 73 20 73 70 65 63 69 66 69 65 64 0a  thods specified.
13ce0 2a 2a 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  ** by the sqlite
13cf0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
13d00 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ect..***********
13d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d50 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  ***/../*.** Some
13d60 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69   Microsoft compi
13d70 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64  lers lack this d
13d80 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  efinition..*/.#i
13d90 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45  fndef INVALID_SE
13da0 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23  T_FILE_POINTER.#
13db0 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f   define INVALID_
13dc0 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
13dd0 20 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e   ((DWORD)-1).#en
13de0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  dif../*.** Move 
13df0 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69  the current posi
13e00 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65  tion of the file
13e10 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61   handle passed a
13e20 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61  s the first.** a
13e30 72 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73 65  rgument to offse
13e40 74 20 69 4f 66 66 73 65 74 20 77 69 74 68 69 6e  t iOffset within
13e50 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 73 75   the file. If su
13e60 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
13e70 20 30 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65   0..** Otherwise
13e80 2c 20 73 65 74 20 70 46 69 6c 65 2d 3e 6c 61 73  , set pFile->las
13e90 74 45 72 72 6e 6f 20 61 6e 64 20 72 65 74 75 72  tErrno and retur
13ea0 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73  n non-zero..*/.s
13eb0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 65  tatic int winSee
13ec0 6b 46 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70  kFile(winFile *p
13ed0 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e  File, sqlite3_in
13ee0 74 36 34 20 69 4f 66 66 73 65 74 29 7b 0a 23 69  t64 iOffset){.#i
13ef0 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
13f00 52 54 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72 42  RT.  LONG upperB
13f10 69 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  its;            
13f20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 73 69 67       /* Most sig
13f30 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77  . 32 bits of new
13f40 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 4c 4f 4e   offset */.  LON
13f50 47 20 6c 6f 77 65 72 42 69 74 73 3b 20 20 20 20  G lowerBits;    
13f60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13f70 4c 65 61 73 74 20 73 69 67 2e 20 33 32 20 62 69  Least sig. 32 bi
13f80 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65 74  ts of new offset
13f90 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 52 65   */.  DWORD dwRe
13fa0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
13fb0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
13fc0 65 74 75 72 6e 65 64 20 62 79 20 53 65 74 46 69  eturned by SetFi
13fd0 6c 65 50 6f 69 6e 74 65 72 28 29 20 2a 2f 0a 20  lePointer() */. 
13fe0 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
13ff0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14000 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
14010 65 64 20 62 79 20 47 65 74 4c 61 73 74 45 72 72  ed by GetLastErr
14020 6f 72 28 29 20 2a 2f 0a 0a 20 20 4f 53 54 52 41  or() */..  OSTRA
14030 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25  CE(("SEEK file=%
14040 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 5c 6e  p, offset=%lld\n
14050 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 69 4f 66  ", pFile->h, iOf
14060 66 73 65 74 29 29 3b 0a 0a 20 20 75 70 70 65 72  fset));..  upper
14070 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28 69  Bits = (LONG)((i
14080 4f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78  Offset>>32) & 0x
14090 37 66 66 66 66 66 66 66 29 3b 0a 20 20 6c 6f 77  7fffffff);.  low
140a0 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28  erBits = (LONG)(
140b0 69 4f 66 66 73 65 74 20 26 20 30 78 66 66 66 66  iOffset & 0xffff
140c0 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20 41 50 49  ffff);..  /* API
140d0 20 6f 64 64 69 74 79 3a 20 49 66 20 73 75 63 63   oddity: If succ
140e0 65 73 73 66 75 6c 2c 20 53 65 74 46 69 6c 65 50  essful, SetFileP
140f0 6f 69 6e 74 65 72 28 29 20 72 65 74 75 72 6e 73  ointer() returns
14100 20 61 20 64 77 6f 72 64 0a 20 20 2a 2a 20 63 6f   a dword.  ** co
14110 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f 77  ntaining the low
14120 65 72 20 33 32 2d 62 69 74 73 20 6f 66 20 74 68  er 32-bits of th
14130 65 20 6e 65 77 20 66 69 6c 65 2d 6f 66 66 73 65  e new file-offse
14140 74 2e 20 4f 72 2c 20 69 66 20 69 74 20 66 61 69  t. Or, if it fai
14150 6c 73 2c 0a 20 20 2a 2a 20 69 74 20 72 65 74 75  ls,.  ** it retu
14160 72 6e 73 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f  rns INVALID_SET_
14170 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2e 20 48 6f  FILE_POINTER. Ho
14180 77 65 76 65 72 20 61 63 63 6f 72 64 69 6e 67 20  wever according 
14190 74 6f 20 4d 53 44 4e 2c 0a 20 20 2a 2a 20 49 4e  to MSDN,.  ** IN
141a0 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
141b0 4f 49 4e 54 45 52 20 6d 61 79 20 61 6c 73 6f 20  OINTER may also 
141c0 62 65 20 61 20 76 61 6c 69 64 20 6e 65 77 20 6f  be a valid new o
141d0 66 66 73 65 74 2e 20 53 6f 20 74 6f 20 64 65 74  ffset. So to det
141e0 65 72 6d 69 6e 65 0a 20 20 2a 2a 20 77 68 65 74  ermine.  ** whet
141f0 68 65 72 20 61 6e 20 65 72 72 6f 72 20 68 61 73  her an error has
14200 20 61 63 74 75 61 6c 6c 79 20 6f 63 63 75 72 72   actually occurr
14210 65 64 2c 20 69 74 20 69 73 20 61 6c 73 6f 20 6e  ed, it is also n
14220 65 63 65 73 73 61 72 79 20 74 6f 20 63 61 6c 6c  ecessary to call
14230 0a 20 20 2a 2a 20 47 65 74 4c 61 73 74 45 72 72  .  ** GetLastErr
14240 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 64 77 52  or()..  */.  dwR
14250 65 74 20 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f  et = osSetFilePo
14260 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20  inter(pFile->h, 
14270 6c 6f 77 65 72 42 69 74 73 2c 20 26 75 70 70 65  lowerBits, &uppe
14280 72 42 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49  rBits, FILE_BEGI
14290 4e 29 3b 0a 0a 20 20 69 66 28 20 28 64 77 52 65  N);..  if( (dwRe
142a0 74 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46  t==INVALID_SET_F
142b0 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 20 20 20 20  ILE_POINTER.    
142c0 20 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f    && ((lastErrno
142d0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
142e0 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 29  r())!=NO_ERROR))
142f0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
14300 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
14310 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  rrno;.    winLog
14320 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
14330 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e  RR_SEEK, pFile->
14340 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
14350 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53             "winS
14360 65 65 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d  eekFile", pFile-
14370 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 4f 53 54  >zPath);.    OST
14380 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65  RACE(("SEEK file
14390 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%p, rc=SQLITE_I
143a0 4f 45 52 52 5f 53 45 45 4b 5c 6e 22 2c 20 70 46  OERR_SEEK\n", pF
143b0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65  ile->h));.    re
143c0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f  turn 1;.  }..  O
143d0 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69  STRACE(("SEEK fi
143e0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
143f0 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
14400 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  ));.  return 0;.
14410 23 65 6c 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20  #else.  /*.  ** 
14420 53 61 6d 65 20 61 73 20 61 62 6f 76 65 2c 20 65  Same as above, e
14430 78 63 65 70 74 20 74 68 61 74 20 74 68 69 73 20  xcept that this 
14440 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77  implementation w
14450 6f 72 6b 73 20 66 6f 72 20 57 69 6e 52 54 2e 0a  orks for WinRT..
14460 20 20 2a 2f 0a 0a 20 20 4c 41 52 47 45 5f 49 4e    */..  LARGE_IN
14470 54 45 47 45 52 20 78 3b 20 20 20 20 20 20 20 20  TEGER x;        
14480 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
14490 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 42  ew offset */.  B
144a0 4f 4f 4c 20 62 52 65 74 3b 20 20 20 20 20 20 20  OOL bRet;       
144b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
144c0 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
144d0 20 62 79 20 53 65 74 46 69 6c 65 50 6f 69 6e 74   by SetFilePoint
144e0 65 72 45 78 28 29 20 2a 2f 0a 0a 20 20 78 2e 51  erEx() */..  x.Q
144f0 75 61 64 50 61 72 74 20 3d 20 69 4f 66 66 73 65  uadPart = iOffse
14500 74 3b 0a 20 20 62 52 65 74 20 3d 20 6f 73 53 65  t;.  bRet = osSe
14510 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 28 70  tFilePointerEx(p
14520 46 69 6c 65 2d 3e 68 2c 20 78 2c 20 30 2c 20 46  File->h, x, 0, F
14530 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69  ILE_BEGIN);..  i
14540 66 28 21 62 52 65 74 29 7b 0a 20 20 20 20 70 46  f(!bRet){.    pF
14550 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
14560 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
14570 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  );.    winLogErr
14580 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
14590 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  SEEK, pFile->las
145a0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
145b0 20 20 20 20 20 20 20 20 22 77 69 6e 53 65 65 6b          "winSeek
145c0 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  File", pFile->zP
145d0 61 74 68 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ath);.    OSTRAC
145e0 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70  E(("SEEK file=%p
145f0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
14600 52 5f 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c 65  R_SEEK\n", pFile
14610 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
14620 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52  n 1;.  }..  OSTR
14630 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d  ACE(("SEEK file=
14640 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
14650 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
14660 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e  .  return 0;.#en
14670 64 69 66 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  dif.}..#if SQLIT
14680 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
14690 30 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  0./* Forward ref
146a0 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 68  erences to VFS h
146b0 65 6c 70 65 72 20 6d 65 74 68 6f 64 73 20 75 73  elper methods us
146c0 65 64 20 66 6f 72 20 6d 65 6d 6f 72 79 20 6d 61  ed for memory ma
146d0 70 70 65 64 20 66 69 6c 65 73 20 2a 2f 0a 73 74  pped files */.st
146e0 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 61 70 66  atic int winMapf
146f0 69 6c 65 28 77 69 6e 46 69 6c 65 2a 2c 20 73 71  ile(winFile*, sq
14700 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 73 74  lite3_int64);.st
14710 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61  atic int winUnma
14720 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 2a 29 3b  pfile(winFile*);
14730 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
14740 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a  lose a file..**.
14750 2a 2a 20 49 74 20 69 73 20 72 65 70 6f 72 74 65  ** It is reporte
14760 64 20 74 68 61 74 20 61 6e 20 61 74 74 65 6d 70  d that an attemp
14770 74 20 74 6f 20 63 6c 6f 73 65 20 61 20 68 61 6e  t to close a han
14780 64 6c 65 20 6d 69 67 68 74 20 73 6f 6d 65 74 69  dle might someti
14790 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54 68  mes.** fail.  Th
147a0 69 73 20 69 73 20 61 20 76 65 72 79 20 75 6e 72  is is a very unr
147b0 65 61 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c 74  easonable result
147c0 2c 20 62 75 74 20 57 69 6e 64 6f 77 73 20 69 73  , but Windows is
147d0 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f   notorious.** fo
147e0 72 20 62 65 69 6e 67 20 75 6e 72 65 61 73 6f 6e  r being unreason
147f0 61 62 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f 74  able so I do not
14800 20 64 6f 75 62 74 20 74 68 61 74 20 69 74 20 6d   doubt that it m
14810 69 67 68 74 20 68 61 70 70 65 6e 2e 20 20 49 66  ight happen.  If
14820 0a 2a 2a 20 74 68 65 20 63 6c 6f 73 65 20 66 61  .** the close fa
14830 69 6c 73 2c 20 77 65 20 70 61 75 73 65 20 66 6f  ils, we pause fo
14840 72 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e  r 100 millisecon
14850 64 73 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e  ds and try again
14860 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61 73  .  As.** many as
14870 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50   MX_CLOSE_ATTEMP
14880 54 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63 6c  T attempts to cl
14890 6f 73 65 20 74 68 65 20 68 61 6e 64 6c 65 20 61  ose the handle a
148a0 72 65 20 6d 61 64 65 20 62 65 66 6f 72 65 0a 2a  re made before.*
148b0 2a 20 67 69 76 69 6e 67 20 75 70 20 61 6e 64 20  * giving up and 
148c0 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  returning an err
148d0 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  or..*/.#define M
148e0 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20  X_CLOSE_ATTEMPT 
148f0 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  3.static int win
14900 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
14910 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72  le *id){.  int r
14920 63 2c 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77 69  c, cnt = 0;.  wi
14930 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
14940 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  winFile*)id;..  
14950 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
14960 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14970 4f 4d 49 54 5f 57 41 4c 0a 20 20 61 73 73 65 72  OMIT_WAL.  asser
14980 74 28 20 70 46 69 6c 65 2d 3e 70 53 68 6d 3d 3d  t( pFile->pShm==
14990 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  0 );.#endif.  as
149a0 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 68 21 3d  sert( pFile->h!=
149b0 4e 55 4c 4c 20 26 26 20 70 46 69 6c 65 2d 3e 68  NULL && pFile->h
149c0 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
149d0 5f 56 41 4c 55 45 20 29 3b 0a 20 20 4f 53 54 52  _VALUE );.  OSTR
149e0 41 43 45 28 28 22 43 4c 4f 53 45 20 70 69 64 3d  ACE(("CLOSE pid=
149f0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66  %lu, pFile=%p, f
14a00 69 6c 65 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20  ile=%p\n",.     
14a10 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
14a20 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
14a30 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29  File, pFile->h))
14a40 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ;..#if SQLITE_MA
14a50 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
14a60 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 69  winUnmapfile(pFi
14a70 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64  le);.#endif..  d
14a80 6f 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 43 6c  o{.    rc = osCl
14a90 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
14aa0 3e 68 29 3b 0a 20 20 20 20 2f 2a 20 53 69 6d 75  >h);.    /* Simu
14ab0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
14ac0 30 3b 20 63 6e 74 3d 4d 58 5f 43 4c 4f 53 45 5f  0; cnt=MX_CLOSE_
14ad0 41 54 54 45 4d 50 54 3b 20 29 3b 20 2a 2f 0a 20  ATTEMPT; ); */. 
14ae0 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 30 20 26   }while( rc==0 &
14af0 26 20 2b 2b 63 6e 74 20 3c 20 4d 58 5f 43 4c 4f  & ++cnt < MX_CLO
14b00 53 45 5f 41 54 54 45 4d 50 54 20 26 26 20 28 73  SE_ATTEMPT && (s
14b10 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
14b20 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 23  ep(100), 1) );.#
14b30 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
14b40 43 45 0a 23 64 65 66 69 6e 65 20 57 49 4e 43 45  CE.#define WINCE
14b50 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50  _DELETION_ATTEMP
14b60 54 53 20 33 0a 20 20 7b 0a 20 20 20 20 77 69 6e  TS 3.  {.    win
14b70 56 66 73 41 70 70 44 61 74 61 20 2a 70 41 70 70  VfsAppData *pApp
14b80 44 61 74 61 20 3d 20 28 77 69 6e 56 66 73 41 70  Data = (winVfsAp
14b90 70 44 61 74 61 2a 29 70 46 69 6c 65 2d 3e 70 56  pData*)pFile->pV
14ba0 66 73 2d 3e 70 41 70 70 44 61 74 61 3b 0a 20 20  fs->pAppData;.  
14bb0 20 20 69 66 28 20 70 41 70 70 44 61 74 61 3d 3d    if( pAppData==
14bc0 4e 55 4c 4c 20 7c 7c 20 21 70 41 70 70 44 61 74  NULL || !pAppDat
14bd0 61 2d 3e 62 4e 6f 4c 6f 63 6b 20 29 7b 0a 20 20  a->bNoLock ){.  
14be0 20 20 20 20 77 69 6e 63 65 44 65 73 74 72 6f 79      winceDestroy
14bf0 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20  Lock(pFile);.   
14c00 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69   }.  }.  if( pFi
14c10 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  le->zDeleteOnClo
14c20 73 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e  se ){.    int cn
14c30 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  t = 0;.    while
14c40 28 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 44  (.           osD
14c50 65 6c 65 74 65 46 69 6c 65 57 28 70 46 69 6c 65  eleteFileW(pFile
14c60 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  ->zDeleteOnClose
14c70 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20  )==0.        && 
14c80 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
14c90 74 65 73 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c  tesW(pFile->zDel
14ca0 65 74 65 4f 6e 43 6c 6f 73 65 29 21 3d 30 78 66  eteOnClose)!=0xf
14cb0 66 66 66 66 66 66 66 0a 20 20 20 20 20 20 20 20  fffffff.        
14cc0 26 26 20 63 6e 74 2b 2b 20 3c 20 57 49 4e 43 45  && cnt++ < WINCE
14cd0 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50  _DELETION_ATTEMP
14ce0 54 53 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  TS.    ){.      
14cf0 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
14d00 6c 65 65 70 28 31 30 30 29 3b 20 20 2f 2a 20 57  leep(100);  /* W
14d10 61 69 74 20 61 20 6c 69 74 74 6c 65 20 62 65 66  ait a little bef
14d20 6f 72 65 20 74 72 79 69 6e 67 20 61 67 61 69 6e  ore trying again
14d30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   */.    }.    sq
14d40 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65  lite3_free(pFile
14d50 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  ->zDeleteOnClose
14d60 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
14d70 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46  if( rc ){.    pF
14d80 69 6c 65 2d 3e 68 20 3d 20 4e 55 4c 4c 3b 0a 20  ile->h = NULL;. 
14d90 20 7d 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72   }.  OpenCounter
14da0 28 2d 31 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  (-1);.  OSTRACE(
14db0 28 22 43 4c 4f 53 45 20 70 69 64 3d 25 6c 75 2c  ("CLOSE pid=%lu,
14dc0 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d   pFile=%p, file=
14dd0 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  %p, rc=%s\n",.  
14de0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
14df0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
14e00 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  , pFile, pFile->
14e10 68 2c 20 72 63 20 3f 20 22 6f 6b 22 20 3a 20 22  h, rc ? "ok" : "
14e20 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74  failed"));.  ret
14e30 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f  urn rc ? SQLITE_
14e40 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 3a  OK.            :
14e50 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
14e60 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c  ITE_IOERR_CLOSE,
14e70 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
14e80 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
14e90 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
14ea0 6e 43 6c 6f 73 65 22 2c 20 70 46 69 6c 65 2d 3e  nClose", pFile->
14eb0 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  zPath);.}../*.**
14ec0 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20   Read data from 
14ed0 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75  a file into a bu
14ee0 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ffer.  Return SQ
14ef0 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a  LITE_OK if all.*
14f00 2a 20 62 79 74 65 73 20 77 65 72 65 20 72 65 61  * bytes were rea
14f10 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61  d successfully a
14f20 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  nd SQLITE_IOERR 
14f30 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
14f40 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  .** wrong..*/.st
14f50 61 74 69 63 20 69 6e 74 20 77 69 6e 52 65 61 64  atic int winRead
14f60 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
14f70 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20 2f   *id,          /
14f80 2a 20 46 69 6c 65 20 74 6f 20 72 65 61 64 20 66  * File to read f
14f90 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  rom */.  void *p
14fa0 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
14fb0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 6f 6e      /* Write con
14fc0 74 65 6e 74 20 69 6e 74 6f 20 74 68 69 73 20 62  tent into this b
14fd0 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61  uffer */.  int a
14fe0 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
14ff0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
15000 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 61 64  of bytes to read
15010 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
15020 74 36 34 20 6f 66 66 73 65 74 20 20 20 20 20 20  t64 offset      
15030 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e   /* Begin readin
15040 67 20 61 74 20 74 68 69 73 20 6f 66 66 73 65 74  g at this offset
15050 20 2a 2f 0a 29 7b 0a 23 69 66 20 21 53 51 4c 49   */.){.#if !SQLI
15060 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
15070 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
15080 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50  IN32_NO_OVERLAPP
15090 45 44 29 0a 20 20 4f 56 45 52 4c 41 50 50 45 44  ED).  OVERLAPPED
150a0 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20 20   overlapped;    
150b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66        /* The off
150c0 73 65 74 20 66 6f 72 20 52 65 61 64 46 69 6c 65  set for ReadFile
150d0 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 77 69  . */.#endif.  wi
150e0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
150f0 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a  winFile*)id;  /*
15100 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a   file handle */.
15110 20 20 44 57 4f 52 44 20 6e 52 65 61 64 3b 20 20    DWORD nRead;  
15120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15130 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
15140 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65  ytes actually re
15150 61 64 20 66 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a  ad from file */.
15160 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30    int nRetry = 0
15170 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15180 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
15190 65 74 72 79 73 20 2a 2f 0a 0a 20 20 61 73 73 65  etrys */..  asse
151a0 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61  rt( id!=0 );.  a
151b0 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a  ssert( amt>0 );.
151c0 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
151d0 3e 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  >=0 );.  Simulat
151e0 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
151f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
15200 44 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  D);.  OSTRACE(("
15210 52 45 41 44 20 70 69 64 3d 25 6c 75 2c 20 70 46  READ pid=%lu, pF
15220 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c  ile=%p, file=%p,
15230 20 62 75 66 66 65 72 3d 25 70 2c 20 61 6d 6f 75   buffer=%p, amou
15240 6e 74 3d 25 64 2c 20 22 0a 20 20 20 20 20 20 20  nt=%d, ".       
15250 20 20 20 20 22 6f 66 66 73 65 74 3d 25 6c 6c 64      "offset=%lld
15260 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 6f 73  , lock=%d\n", os
15270 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
15280 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 0a 20 20  sId(), pFile,.  
15290 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
152a0 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 6f 66  h, pBuf, amt, of
152b0 66 73 65 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  fset, pFile->loc
152c0 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 20 53 51  ktype));..#if SQ
152d0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
152e0 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77  ZE>0.  /* Deal w
152f0 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74  ith as much of t
15300 68 69 73 20 72 65 61 64 20 72 65 71 75 65 73 74  his read request
15310 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20   as possible by 
15320 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a  transfering.  **
15330 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d   data from the m
15340 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73  emory mapping us
15350 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a  ing memcpy().  *
15360 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70  /.  if( offset<p
15370 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
15380 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74  {.    if( offset
15390 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d  +amt <= pFile->m
153a0 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  mapSize ){.     
153b0 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28   memcpy(pBuf, &(
153c0 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d  (u8 *)(pFile->pM
153d0 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65  apRegion))[offse
153e0 74 5d 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20  t], amt);.      
153f0 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 4d  OSTRACE(("READ-M
15400 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  MAP pid=%lu, pFi
15410 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20  le=%p, file=%p, 
15420 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
15430 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15440 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
15450 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20  essId(), pFile, 
15460 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
15470 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15480 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
15490 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d       int nCopy =
154a0 20 28 69 6e 74 29 28 70 46 69 6c 65 2d 3e 6d 6d   (int)(pFile->mm
154b0 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 29  apSize - offset)
154c0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
154d0 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46  Buf, &((u8 *)(pF
154e0 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
154f0 29 5b 6f 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79  )[offset], nCopy
15500 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20  );.      pBuf = 
15510 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43  &((u8 *)pBuf)[nC
15520 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20  opy];.      amt 
15530 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20  -= nCopy;.      
15540 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b  offset += nCopy;
15550 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
15560 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  f..#if SQLITE_OS
15570 5f 57 49 4e 43 45 20 7c 7c 20 64 65 66 69 6e 65  _WINCE || define
15580 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e  d(SQLITE_WIN32_N
15590 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a 20 20  O_OVERLAPPED).  
155a0 69 66 28 20 77 69 6e 53 65 65 6b 46 69 6c 65 28  if( winSeekFile(
155b0 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 29 20 29  pFile, offset) )
155c0 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
155d0 52 45 41 44 20 70 69 64 3d 25 6c 75 2c 20 70 46  READ pid=%lu, pF
155e0 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c  ile=%p, file=%p,
155f0 20 72 63 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 5c   rc=SQLITE_FULL\
15600 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
15610 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
15620 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
15630 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
15640 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
15650 55 4c 4c 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  ULL;.  }.  while
15660 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46  ( !osReadFile(pF
15670 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d  ile->h, pBuf, am
15680 74 2c 20 26 6e 52 65 61 64 2c 20 30 29 20 29 7b  t, &nRead, 0) ){
15690 0a 23 65 6c 73 65 0a 20 20 6d 65 6d 73 65 74 28  .#else.  memset(
156a0 26 6f 76 65 72 6c 61 70 70 65 64 2c 20 30 2c 20  &overlapped, 0, 
156b0 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45  sizeof(OVERLAPPE
156c0 44 29 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65  D));.  overlappe
156d0 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47  d.Offset = (LONG
156e0 29 28 6f 66 66 73 65 74 20 26 20 30 78 66 66 66  )(offset & 0xfff
156f0 66 66 66 66 66 29 3b 0a 20 20 6f 76 65 72 6c 61  fffff);.  overla
15700 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20  pped.OffsetHigh 
15710 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74  = (LONG)((offset
15720 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66  >>32) & 0x7fffff
15730 66 66 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 6f  ff);.  while( !o
15740 73 52 65 61 64 46 69 6c 65 28 70 46 69 6c 65 2d  sReadFile(pFile-
15750 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26  >h, pBuf, amt, &
15760 6e 52 65 61 64 2c 20 26 6f 76 65 72 6c 61 70 70  nRead, &overlapp
15770 65 64 29 20 26 26 0a 20 20 20 20 20 20 20 20 20  ed) &&.         
15780 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
15790 21 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 45  !=ERROR_HANDLE_E
157a0 4f 46 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20  OF ){.#endif.   
157b0 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
157c0 3b 0a 20 20 20 20 69 66 28 20 77 69 6e 52 65 74  ;.    if( winRet
157d0 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c  ryIoerr(&nRetry,
157e0 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63   &lastErrno) ) c
157f0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 46 69  ontinue;.    pFi
15800 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
15810 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 4f  lastErrno;.    O
15820 53 54 52 41 43 45 28 28 22 52 45 41 44 20 70 69  STRACE(("READ pi
15830 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
15840 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
15850 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 5c 6e  ITE_IOERR_READ\n
15860 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
15870 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
15880 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20  essId(), pFile, 
15890 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
158a0 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
158b0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
158c0 52 45 41 44 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  READ, pFile->las
158d0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
158e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
158f0 77 69 6e 52 65 61 64 22 2c 20 70 46 69 6c 65 2d  winRead", pFile-
15900 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 77  >zPath);.  }.  w
15910 69 6e 4c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72  inLogIoerr(nRetr
15920 79 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  y, __LINE__);.  
15930 69 66 28 20 6e 52 65 61 64 3c 28 44 57 4f 52 44  if( nRead<(DWORD
15940 29 61 6d 74 20 29 7b 0a 20 20 20 20 2f 2a 20 55  )amt ){.    /* U
15950 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66 20 74  nread parts of t
15960 68 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62  he buffer must b
15970 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f  e zero-filled */
15980 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63  .    memset(&((c
15990 68 61 72 2a 29 70 42 75 66 29 5b 6e 52 65 61 64  har*)pBuf)[nRead
159a0 5d 2c 20 30 2c 20 61 6d 74 2d 6e 52 65 61 64 29  ], 0, amt-nRead)
159b0 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
159c0 52 45 41 44 20 70 69 64 3d 25 6c 75 2c 20 70 46  READ pid=%lu, pF
159d0 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c  ile=%p, file=%p,
159e0 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
159f0 5f 53 48 4f 52 54 5f 52 45 41 44 5c 6e 22 2c 0a  _SHORT_READ\n",.
15a00 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
15a10 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
15a20 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69  Id(), pFile, pFi
15a30 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74  le->h));.    ret
15a40 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
15a50 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d  _SHORT_READ;.  }
15a60 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  ..  OSTRACE(("RE
15a70 41 44 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  AD pid=%lu, pFil
15a80 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72  e=%p, file=%p, r
15a90 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a  c=SQLITE_OK\n",.
15aa0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
15ab0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
15ac0 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
15ad0 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ->h));.  return 
15ae0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
15af0 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66  .** Write data f
15b00 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74  rom a buffer int
15b10 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72  o a file.  Retur
15b20 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
15b30 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d  uccess.** or som
15b40 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
15b50 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  de on failure..*
15b60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
15b70 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33  Write(.  sqlite3
15b80 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20  _file *id,      
15b90 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
15ba0 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 2a   to write into *
15bb0 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
15bc0 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
15bd0 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65 73      /* The bytes
15be0 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a   to be written *
15bf0 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20  /.  int amt,    
15c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c10 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
15c20 20 62 79 74 65 73 20 74 6f 20 77 72 69 74 65 20   bytes to write 
15c30 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
15c40 36 34 20 6f 66 66 73 65 74 20 20 20 20 20 20 20  64 offset       
15c50 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
15c60 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 74 6f 20  nto the file to 
15c70 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74  begin writing at
15c80 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
15c90 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
15ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
15cb0 20 69 66 20 65 72 72 6f 72 20 68 61 73 20 6f 63   if error has oc
15cc0 63 75 72 72 65 64 2c 20 65 6c 73 65 20 66 61 6c  curred, else fal
15cd0 73 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20  se */.  winFile 
15ce0 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
15cf0 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20  e*)id;  /* File 
15d00 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  handle */.  int 
15d10 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20 20  nRetry = 0;     
15d20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
15d30 75 6d 62 65 72 20 6f 66 20 72 65 74 72 69 65 73  umber of retries
15d40 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 61   */..  assert( a
15d50 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  mt>0 );.  assert
15d60 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d  ( pFile );.  Sim
15d70 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
15d80 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
15d90 5f 57 52 49 54 45 29 3b 0a 20 20 53 69 6d 75 6c  _WRITE);.  Simul
15da0 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
15db0 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46  (return SQLITE_F
15dc0 55 4c 4c 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45  ULL);..  OSTRACE
15dd0 28 28 22 57 52 49 54 45 20 70 69 64 3d 25 6c 75  (("WRITE pid=%lu
15de0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65  , pFile=%p, file
15df0 3d 25 70 2c 20 62 75 66 66 65 72 3d 25 70 2c 20  =%p, buffer=%p, 
15e00 61 6d 6f 75 6e 74 3d 25 64 2c 20 22 0a 20 20 20  amount=%d, ".   
15e10 20 20 20 20 20 20 20 20 22 6f 66 66 73 65 74 3d          "offset=
15e20 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22  %lld, lock=%d\n"
15e30 2c 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  , osGetCurrentPr
15e40 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
15e50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
15e60 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74  le->h, pBuf, amt
15e70 2c 20 6f 66 66 73 65 74 2c 20 70 46 69 6c 65 2d  , offset, pFile-
15e80 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69  >locktype));..#i
15e90 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
15ea0 5f 4d 4d 41 50 5f 52 45 41 44 57 52 49 54 45 29  _MMAP_READWRITE)
15eb0 20 26 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   && SQLITE_MAX_M
15ec0 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20  MAP_SIZE>0.  /* 
15ed0 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63  Deal with as muc
15ee0 68 20 6f 66 20 74 68 69 73 20 77 72 69 74 65 20  h of this write 
15ef0 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73 69  request as possi
15f00 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72 69  ble by transferi
15f10 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f  ng.  ** data fro
15f20 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70  m the memory map
15f30 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70  ping using memcp
15f40 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f  y().  */.  if( o
15f50 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61  ffset<pFile->mma
15f60 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28  pSize ){.    if(
15f70 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70   offset+amt <= p
15f80 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
15f90 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  {.      memcpy(&
15fa0 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70  ((u8 *)(pFile->p
15fb0 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73  MapRegion))[offs
15fc0 65 74 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b  et], pBuf, amt);
15fd0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
15fe0 22 57 52 49 54 45 2d 4d 4d 41 50 20 70 69 64 3d  "WRITE-MMAP pid=
15ff0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66  %lu, pFile=%p, f
16000 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
16010 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
16020 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
16030 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
16040 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
16050 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
16060 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
16070 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
16080 20 6e 43 6f 70 79 20 3d 20 28 69 6e 74 29 28 70   nCopy = (int)(p
16090 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d  File->mmapSize -
160a0 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20   offset);.      
160b0 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28  memcpy(&((u8 *)(
160c0 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
160d0 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75  n))[offset], pBu
160e0 66 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20  f, nCopy);.     
160f0 20 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29   pBuf = &((u8 *)
16100 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20  pBuf)[nCopy];.  
16110 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79      amt -= nCopy
16120 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b  ;.      offset +
16130 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20  = nCopy;.    }. 
16140 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53   }.#endif..#if S
16150 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
16160 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
16170 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41  _WIN32_NO_OVERLA
16180 50 50 45 44 29 0a 20 20 72 63 20 3d 20 77 69 6e  PPED).  rc = win
16190 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20  SeekFile(pFile, 
161a0 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72  offset);.  if( r
161b0 63 3d 3d 30 20 29 7b 0a 23 65 6c 73 65 0a 20 20  c==0 ){.#else.  
161c0 7b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 53 51  {.#endif.#if !SQ
161d0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
161e0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
161f0 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41  _WIN32_NO_OVERLA
16200 50 50 45 44 29 0a 20 20 20 20 4f 56 45 52 4c 41  PPED).    OVERLA
16210 50 50 45 44 20 6f 76 65 72 6c 61 70 70 65 64 3b  PPED overlapped;
16220 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
16230 66 66 73 65 74 20 66 6f 72 20 57 72 69 74 65 46  ffset for WriteF
16240 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ile. */.#endif. 
16250 20 20 20 75 38 20 2a 61 52 65 6d 20 3d 20 28 75     u8 *aRem = (u
16260 38 20 2a 29 70 42 75 66 3b 20 20 20 20 20 20 20  8 *)pBuf;       
16270 20 2f 2a 20 44 61 74 61 20 79 65 74 20 74 6f 20   /* Data yet to 
16280 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  be written */.  
16290 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 61 6d 74    int nRem = amt
162a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
162b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
162c0 65 73 20 79 65 74 20 74 6f 20 62 65 20 77 72 69  es yet to be wri
162d0 74 74 65 6e 20 2a 2f 0a 20 20 20 20 44 57 4f 52  tten */.    DWOR
162e0 44 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20  D nWrite;       
162f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
16300 65 73 20 77 72 69 74 74 65 6e 20 62 79 20 65 61  es written by ea
16310 63 68 20 57 72 69 74 65 46 69 6c 65 28 29 20 63  ch WriteFile() c
16320 61 6c 6c 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44  all */.    DWORD
16330 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f   lastErrno = NO_
16340 45 52 52 4f 52 3b 20 20 20 2f 2a 20 56 61 6c 75  ERROR;   /* Valu
16350 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 47 65  e returned by Ge
16360 74 4c 61 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a  tLastError() */.
16370 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
16380 57 49 4e 43 45 20 26 26 20 21 64 65 66 69 6e 65  WINCE && !define
16390 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e  d(SQLITE_WIN32_N
163a0 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a 20 20  O_OVERLAPPED).  
163b0 20 20 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c 61    memset(&overla
163c0 70 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pped, 0, sizeof(
163d0 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20  OVERLAPPED));.  
163e0 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66    overlapped.Off
163f0 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66  set = (LONG)(off
16400 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66  set & 0xffffffff
16410 29 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70 70 65  );.    overlappe
16420 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28  d.OffsetHigh = (
16430 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33  LONG)((offset>>3
16440 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29  2) & 0x7fffffff)
16450 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 77 68  ;.#endif..    wh
16460 69 6c 65 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 23  ile( nRem>0 ){.#
16470 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
16480 43 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  CE || defined(SQ
16490 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56  LITE_WIN32_NO_OV
164a0 45 52 4c 41 50 50 45 44 29 0a 20 20 20 20 20 20  ERLAPPED).      
164b0 69 66 28 20 21 6f 73 57 72 69 74 65 46 69 6c 65  if( !osWriteFile
164c0 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c  (pFile->h, aRem,
164d0 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20   nRem, &nWrite, 
164e0 30 29 20 29 7b 0a 23 65 6c 73 65 0a 20 20 20 20  0) ){.#else.    
164f0 20 20 69 66 28 20 21 6f 73 57 72 69 74 65 46 69    if( !osWriteFi
16500 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65  le(pFile->h, aRe
16510 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65  m, nRem, &nWrite
16520 2c 20 26 6f 76 65 72 6c 61 70 70 65 64 29 20 29  , &overlapped) )
16530 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  {.#endif.       
16540 20 69 66 28 20 77 69 6e 52 65 74 72 79 49 6f 65   if( winRetryIoe
16550 72 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73  rr(&nRetry, &las
16560 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e  tErrno) ) contin
16570 75 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ue;.        brea
16580 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
16590 20 61 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d   assert( nWrite=
165a0 3d 30 20 7c 7c 20 6e 57 72 69 74 65 3c 3d 28 44  =0 || nWrite<=(D
165b0 57 4f 52 44 29 6e 52 65 6d 20 29 3b 0a 20 20 20  WORD)nRem );.   
165c0 20 20 20 69 66 28 20 6e 57 72 69 74 65 3d 3d 30     if( nWrite==0
165d0 20 7c 7c 20 6e 57 72 69 74 65 3e 28 44 57 4f 52   || nWrite>(DWOR
165e0 44 29 6e 52 65 6d 20 29 7b 0a 20 20 20 20 20 20  D)nRem ){.      
165f0 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
16600 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
16610 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
16620 20 20 20 20 20 7d 0a 23 69 66 20 21 53 51 4c 49       }.#if !SQLI
16630 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
16640 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
16650 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50  IN32_NO_OVERLAPP
16660 45 44 29 0a 20 20 20 20 20 20 6f 66 66 73 65 74  ED).      offset
16670 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20   += nWrite;.    
16680 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66    overlapped.Off
16690 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66  set = (LONG)(off
166a0 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66  set & 0xffffffff
166b0 29 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c 61 70  );.      overlap
166c0 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d  ped.OffsetHigh =
166d0 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e   (LONG)((offset>
166e0 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66  >32) & 0x7ffffff
166f0 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  f);.#endif.     
16700 20 61 52 65 6d 20 2b 3d 20 6e 57 72 69 74 65 3b   aRem += nWrite;
16710 0a 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e  .      nRem -= n
16720 57 72 69 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20  Write;.    }.   
16730 20 69 66 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20   if( nRem>0 ){. 
16740 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
16750 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e  Errno = lastErrn
16760 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  o;.      rc = 1;
16770 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
16780 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20  ( rc ){.    if( 
16790 20 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45    ( pFile->lastE
167a0 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e 44  rrno==ERROR_HAND
167b0 4c 45 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 0a 20  LE_DISK_FULL ). 
167c0 20 20 20 20 20 20 7c 7c 20 28 20 70 46 69 6c 65        || ( pFile
167d0 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  ->lastErrno==ERR
167e0 4f 52 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 29 7b  OR_DISK_FULL )){
167f0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
16800 22 57 52 49 54 45 20 70 69 64 3d 25 6c 75 2c 20  "WRITE pid=%lu, 
16810 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25  pFile=%p, file=%
16820 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 46 55 4c  p, rc=SQLITE_FUL
16830 4c 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  L\n",.          
16840 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
16850 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
16860 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  ile, pFile->h));
16870 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
16880 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
16890 5f 46 55 4c 4c 2c 20 70 46 69 6c 65 2d 3e 6c 61  _FULL, pFile->la
168a0 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
168b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168c0 20 20 22 77 69 6e 57 72 69 74 65 31 22 2c 20 70    "winWrite1", p
168d0 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
168e0 20 20 7d 0a 20 20 20 20 4f 53 54 52 41 43 45 28    }.    OSTRACE(
168f0 28 22 57 52 49 54 45 20 70 69 64 3d 25 6c 75 2c  ("WRITE pid=%lu,
16900 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d   pFile=%p, file=
16910 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %p, rc=SQLITE_IO
16920 45 52 52 5f 57 52 49 54 45 5c 6e 22 2c 0a 20 20  ERR_WRITE\n",.  
16930 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
16940 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
16950 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
16960 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
16970 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
16980 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
16990 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
169a0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
169b0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 57             "winW
169c0 72 69 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a  rite2", pFile->z
169d0 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Path);.  }else{.
169e0 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28      winLogIoerr(
169f0 6e 52 65 74 72 79 2c 20 5f 5f 4c 49 4e 45 5f 5f  nRetry, __LINE__
16a00 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  );.  }.  OSTRACE
16a10 28 28 22 57 52 49 54 45 20 70 69 64 3d 25 6c 75  (("WRITE pid=%lu
16a20 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65  , pFile=%p, file
16a30 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
16a40 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  K\n",.          
16a50 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
16a60 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
16a70 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72   pFile->h));.  r
16a80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16a90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
16aa0 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  te an open file 
16ab0 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73  to a specified s
16ac0 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ize.*/.static in
16ad0 74 20 77 69 6e 54 72 75 6e 63 61 74 65 28 73 71  t winTruncate(sq
16ae0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
16af0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42  sqlite3_int64 nB
16b00 79 74 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  yte){.  winFile 
16b10 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
16b20 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20  e*)id;  /* File 
16b30 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74 20 2a 2f  handle object */
16b40 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
16b50 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
16b60 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
16b70 65 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74  e for this funct
16b80 69 6f 6e 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c  ion */.  DWORD l
16b90 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 61 73 73  astErrno;..  ass
16ba0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
16bb0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
16bc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
16bd0 45 52 52 5f 54 52 55 4e 43 41 54 45 29 3b 0a 20  ERR_TRUNCATE);. 
16be0 20 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e 43   OSTRACE(("TRUNC
16bf0 41 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ATE pid=%lu, pFi
16c00 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20  le=%p, file=%p, 
16c10 73 69 7a 65 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d  size=%lld, lock=
16c20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
16c30 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
16c40 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
16c50 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74  , pFile->h, nByt
16c60 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  e, pFile->lockty
16c70 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  pe));..  /* If t
16c80 68 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66  he user has conf
16c90 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73  igured a chunk-s
16ca0 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c  ize for this fil
16cb0 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  e, truncate the.
16cc0 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61    ** file so tha
16cd0 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  t it consists of
16ce0 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62   an integer numb
16cf0 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e  er of chunks (i.
16d00 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75  e. the.  ** actu
16d10 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74  al file size aft
16d20 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  er the operation
16d30 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20 74   may be larger t
16d40 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
16d50 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20  d.  ** size)..  
16d60 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
16d70 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20  szChunk>0 ){.   
16d80 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65   nByte = ((nByte
16d90 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   + pFile->szChun
16da0 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a  k - 1)/pFile->sz
16db0 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e  Chunk) * pFile->
16dc0 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20  szChunk;.  }..  
16dd0 2f 2a 20 53 65 74 45 6e 64 4f 66 46 69 6c 65 28  /* SetEndOfFile(
16de0 29 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  ) returns non-ze
16df0 72 6f 20 77 68 65 6e 20 73 75 63 63 65 73 73 66  ro when successf
16e00 75 6c 2c 20 6f 72 20 7a 65 72 6f 20 77 68 65 6e  ul, or zero when
16e10 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20   it fails. */.  
16e20 69 66 28 20 77 69 6e 53 65 65 6b 46 69 6c 65 28  if( winSeekFile(
16e30 70 46 69 6c 65 2c 20 6e 42 79 74 65 29 20 29 7b  pFile, nByte) ){
16e40 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67  .    rc = winLog
16e50 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
16e60 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 70 46 69  RR_TRUNCATE, pFi
16e70 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
16e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e90 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65      "winTruncate
16ea0 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  1", pFile->zPath
16eb0 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 30  );.  }else if( 0
16ec0 3d 3d 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65  ==osSetEndOfFile
16ed0 28 70 46 69 6c 65 2d 3e 68 29 20 26 26 0a 20 20  (pFile->h) &&.  
16ee0 20 20 20 20 20 20 20 20 20 20 28 28 6c 61 73 74            ((last
16ef0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
16f00 74 45 72 72 6f 72 28 29 29 21 3d 45 52 52 4f 52  tError())!=ERROR
16f10 5f 55 53 45 52 5f 4d 41 50 50 45 44 5f 46 49 4c  _USER_MAPPED_FIL
16f20 45 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  E) ){.    pFile-
16f30 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
16f40 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d  tErrno;.    rc =
16f50 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
16f60 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
16f70 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  TE, pFile->lastE
16f80 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
16f90 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 54             "winT
16fa0 72 75 6e 63 61 74 65 32 22 2c 20 70 46 69 6c 65  runcate2", pFile
16fb0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 23  ->zPath);.  }..#
16fc0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
16fd0 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 49  AP_SIZE>0.  /* I
16fe0 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 74  f the file was t
16ff0 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20 73 69  runcated to a si
17000 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ze smaller than 
17010 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  the currently.  
17020 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e  ** mapped region
17030 2c 20 72 65 64 75 63 65 20 74 68 65 20 65 66 66  , reduce the eff
17040 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67 20 73  ective mapping s
17050 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53 51 4c  ize as well. SQL
17060 69 74 65 20 77 69 6c 6c 0a 20 20 2a 2a 20 75 73  ite will.  ** us
17070 65 20 72 65 61 64 28 29 20 61 6e 64 20 77 72 69  e read() and wri
17080 74 65 28 29 20 74 6f 20 61 63 63 65 73 73 20 64  te() to access d
17090 61 74 61 20 62 65 79 6f 6e 64 20 74 68 69 73 20  ata beyond this 
170a0 70 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f 77 20 6f  point from now o
170b0 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  n..  */.  if( pF
170c0 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  ile->pMapRegion 
170d0 26 26 20 6e 42 79 74 65 3c 70 46 69 6c 65 2d 3e  && nByte<pFile->
170e0 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
170f0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
17100 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 23 65 6e  = nByte;.  }.#en
17110 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  dif..  OSTRACE((
17120 22 54 52 55 4e 43 41 54 45 20 70 69 64 3d 25 6c  "TRUNCATE pid=%l
17130 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c  u, pFile=%p, fil
17140 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  e=%p, rc=%s\n",.
17150 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
17160 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
17170 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
17180 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  ->h, sqlite3ErrN
17190 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74  ame(rc)));.  ret
171a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
171b0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
171c0 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
171d0 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63  mber of fullsync
171e0 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e  s and normal syn
171f0 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  cs.  This is use
17200 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61  d to test.** tha
17210 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c  t syncs and full
17220 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 69  syncs are occuri
17230 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20  ng at the right 
17240 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  times..*/.int sq
17250 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
17260 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65   = 0;.int sqlite
17270 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
17280 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
17290 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c  .** Make sure al
172a0 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20 70 61  l writes to a pa
172b0 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72  rticular file ar
172c0 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64  e committed to d
172d0 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  isk..*/.static i
172e0 6e 74 20 77 69 6e 53 79 6e 63 28 73 71 6c 69 74  nt winSync(sqlit
172f0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
17300 20 66 6c 61 67 73 29 7b 0a 23 69 66 6e 64 65 66   flags){.#ifndef
17310 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
17320 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20 6f    /*.  ** Used o
17330 6e 6c 79 20 77 68 65 6e 20 53 51 4c 49 54 45 5f  nly when SQLITE_
17340 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20 64  NO_SYNC is not d
17350 65 66 69 6e 65 64 2e 0a 20 20 20 2a 2f 0a 20 20  efined..   */.  
17360 42 4f 4f 4c 20 72 63 3b 0a 23 65 6e 64 69 66 0a  BOOL rc;.#endif.
17370 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
17380 42 55 47 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  BUG) || !defined
17390 28 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29  (SQLITE_NO_SYNC)
173a0 20 7c 7c 20 5c 0a 20 20 20 20 64 65 66 69 6e 65   || \.    define
173b0 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53  d(SQLITE_HAVE_OS
173c0 5f 54 52 41 43 45 29 0a 20 20 2f 2a 0a 20 20 2a  _TRACE).  /*.  *
173d0 2a 20 55 73 65 64 20 77 68 65 6e 20 53 51 4c 49  * Used when SQLI
173e0 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f  TE_NO_SYNC is no
173f0 74 20 64 65 66 69 6e 65 64 20 61 6e 64 20 62 79  t defined and by
17400 20 74 68 65 20 61 73 73 65 72 74 28 29 20 61 6e   the assert() an
17410 64 2f 6f 72 0a 20 20 2a 2a 20 4f 53 54 52 41 43  d/or.  ** OSTRAC
17420 45 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 20 2a  E() macros..   *
17430 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  /.  winFile *pFi
17440 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
17450 64 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45  d;.#else.  UNUSE
17460 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64 29 3b  D_PARAMETER(id);
17470 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
17480 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 2f 2a  t( pFile );.  /*
17490 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20   Check that one 
174a0 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  of SQLITE_SYNC_N
174b0 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61  ORMAL or FULL wa
174c0 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73  s passed */.  as
174d0 73 65 72 74 28 28 66 6c 61 67 73 26 30 78 30 46  sert((flags&0x0F
174e0 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  )==SQLITE_SYNC_N
174f0 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28  ORMAL.      || (
17500 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
17510 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20  ITE_SYNC_FULL.  
17520 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61  );..  /* Unix ca
17530 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73  nnot, but some s
17540 79 73 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72  ystems may retur
17550 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72  n SQLITE_FULL fr
17560 6f 6d 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20  om here. This.  
17570 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65  ** line is to te
17580 73 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f  st that doing so
17590 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20   does not cause 
175a0 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20  any problems..  
175b0 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73  */.  SimulateDis
175c0 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75  kfullError( retu
175d0 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  rn SQLITE_FULL )
175e0 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  ;..  OSTRACE(("S
175f0 59 4e 43 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  YNC pid=%lu, pFi
17600 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20  le=%p, file=%p, 
17610 66 6c 61 67 73 3d 25 78 2c 20 6c 6f 63 6b 3d 25  flags=%x, lock=%
17620 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
17630 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
17640 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
17650 20 70 46 69 6c 65 2d 3e 68 2c 20 66 6c 61 67 73   pFile->h, flags
17660 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
17670 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  le->locktype));.
17680 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17690 54 45 53 54 0a 20 20 55 4e 55 53 45 44 5f 50 41  TEST.  UNUSED_PA
176a0 52 41 4d 45 54 45 52 28 66 6c 61 67 73 29 3b 0a  RAMETER(flags);.
176b0 23 65 6c 73 65 0a 20 20 69 66 28 20 28 66 6c 61  #else.  if( (fla
176c0 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
176d0 5f 53 59 4e 43 5f 46 55 4c 4c 20 29 7b 0a 20 20  _SYNC_FULL ){.  
176e0 20 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79    sqlite3_fullsy
176f0 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 7d 0a  nc_count++;.  }.
17700 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63    sqlite3_sync_c
17710 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a  ount++;.#endif..
17720 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69    /* If we compi
17730 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c  led with the SQL
17740 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67  ITE_NO_SYNC flag
17750 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69  , then syncing i
17760 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20  s a.  ** no-op. 
17770 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
17780 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 4f 53 54 52  E_NO_SYNC.  OSTR
17790 41 43 45 28 28 22 53 59 4e 43 2d 4e 4f 50 20 70  ACE(("SYNC-NOP p
177a0 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
177b0 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  , file=%p, rc=SQ
177c0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20  LITE_OK\n",.    
177d0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
177e0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
177f0 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29  pFile, pFile->h)
17800 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
17810 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 23 69 66  TE_OK;.#else.#if
17820 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
17830 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46  _SIZE>0.  if( pF
17840 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  ile->pMapRegion 
17850 29 7b 0a 20 20 20 20 69 66 28 20 6f 73 46 6c 75  ){.    if( osFlu
17860 73 68 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69  shViewOfFile(pFi
17870 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 20  le->pMapRegion, 
17880 30 29 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  0) ){.      OSTR
17890 41 43 45 28 28 22 53 59 4e 43 2d 4d 4d 41 50 20  ACE(("SYNC-MMAP 
178a0 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
178b0 70 2c 20 70 4d 61 70 52 65 67 69 6f 6e 3d 25 70  p, pMapRegion=%p
178c0 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  , ".            
178d0 20 20 20 22 72 63 3d 53 51 4c 49 54 45 5f 4f 4b     "rc=SQLITE_OK
178e0 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72 72 65 6e  \n", osGetCurren
178f0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 0a 20 20  tProcessId(),.  
17900 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69               pFi
17910 6c 65 2c 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52  le, pFile->pMapR
17920 65 67 69 6f 6e 29 29 3b 0a 20 20 20 20 7d 65 6c  egion));.    }el
17930 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  se{.      pFile-
17940 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
17950 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
17960 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53       OSTRACE(("S
17970 59 4e 43 2d 4d 4d 41 50 20 70 69 64 3d 25 6c 75  YNC-MMAP pid=%lu
17980 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 4d 61 70  , pFile=%p, pMap
17990 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20  Region=%p, ".   
179a0 20 20 20 20 20 20 20 20 20 20 20 20 22 72 63 3d              "rc=
179b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
179c0 50 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72 72 65  P\n", osGetCurre
179d0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 0a 20  ntProcessId(),. 
179e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46                pF
179f0 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 70 4d 61 70  ile, pFile->pMap
17a00 52 65 67 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20  Region));.      
17a10 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
17a20 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
17a30 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  MMAP, pFile->las
17a40 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
17a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a60 20 22 77 69 6e 53 79 6e 63 31 22 2c 20 70 46 69   "winSync1", pFi
17a70 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
17a80 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  }.  }.#endif.  r
17a90 63 20 3d 20 6f 73 46 6c 75 73 68 46 69 6c 65 42  c = osFlushFileB
17aa0 75 66 66 65 72 73 28 70 46 69 6c 65 2d 3e 68 29  uffers(pFile->h)
17ab0 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
17ac0 72 6f 72 28 20 72 63 3d 46 41 4c 53 45 20 29 3b  ror( rc=FALSE );
17ad0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
17ae0 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 20   OSTRACE(("SYNC 
17af0 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
17b00 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  p, file=%p, rc=S
17b10 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
17b20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
17b30 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
17b40 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  ), pFile, pFile-
17b50 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >h));.    return
17b60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
17b70 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lse{.    pFile->
17b80 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
17b90 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
17ba0 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43    OSTRACE(("SYNC
17bb0 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
17bc0 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  %p, file=%p, rc=
17bd0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59  SQLITE_IOERR_FSY
17be0 4e 43 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  NC\n",.         
17bf0 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
17c00 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
17c10 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  le, pFile->h));.
17c20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
17c30 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
17c40 45 52 52 5f 46 53 59 4e 43 2c 20 70 46 69 6c 65  ERR_FSYNC, pFile
17c50 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
17c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c70 20 20 20 20 22 77 69 6e 53 79 6e 63 32 22 2c 20      "winSync2", 
17c80 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
17c90 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
17ca0 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  ** Determine the
17cb0 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
17cc0 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73   a file in bytes
17cd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
17ce0 69 6e 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74  inFileSize(sqlit
17cf0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c  e3_file *id, sql
17d00 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a  ite3_int64 *pSiz
17d10 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  e){.  winFile *p
17d20 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
17d30 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  )id;.  int rc = 
17d40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
17d50 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
17d60 20 61 73 73 65 72 74 28 20 70 53 69 7a 65 21 3d   assert( pSize!=
17d70 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  0 );.  SimulateI
17d80 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
17d90 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
17da0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  );.  OSTRACE(("S
17db0 49 5a 45 20 66 69 6c 65 3d 25 70 2c 20 70 53 69  IZE file=%p, pSi
17dc0 7a 65 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d  ze=%p\n", pFile-
17dd0 3e 68 2c 20 70 53 69 7a 65 29 29 3b 0a 0a 23 69  >h, pSize));..#i
17de0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
17df0 54 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 5f 53  T.  {.    FILE_S
17e00 54 41 4e 44 41 52 44 5f 49 4e 46 4f 20 69 6e 66  TANDARD_INFO inf
17e10 6f 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74  o;.    if( osGet
17e20 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42  FileInformationB
17e30 79 48 61 6e 64 6c 65 45 78 28 70 46 69 6c 65 2d  yHandleEx(pFile-
17e40 3e 68 2c 20 46 69 6c 65 53 74 61 6e 64 61 72 64  >h, FileStandard
17e50 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  Info,.          
17e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e70 20 20 20 20 20 20 20 20 20 20 20 26 69 6e 66 6f             &info
17e80 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 20  , sizeof(info)) 
17e90 29 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20  ){.      *pSize 
17ea0 3d 20 69 6e 66 6f 2e 45 6e 64 4f 66 46 69 6c 65  = info.EndOfFile
17eb0 2e 51 75 61 64 50 61 72 74 3b 0a 20 20 20 20 7d  .QuadPart;.    }
17ec0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c  else{.      pFil
17ed0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
17ee0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
17ef0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  .      rc = winL
17f00 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
17f10 4f 45 52 52 5f 46 53 54 41 54 2c 20 70 46 69 6c  OERR_FSTAT, pFil
17f20 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
17f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f40 20 20 20 20 20 22 77 69 6e 46 69 6c 65 53 69 7a       "winFileSiz
17f50 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
17f60 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  );.    }.  }.#el
17f70 73 65 0a 20 20 7b 0a 20 20 20 20 44 57 4f 52 44  se.  {.    DWORD
17f80 20 75 70 70 65 72 42 69 74 73 3b 0a 20 20 20 20   upperBits;.    
17f90 44 57 4f 52 44 20 6c 6f 77 65 72 42 69 74 73 3b  DWORD lowerBits;
17fa0 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45  .    DWORD lastE
17fb0 72 72 6e 6f 3b 0a 0a 20 20 20 20 6c 6f 77 65 72  rrno;..    lower
17fc0 42 69 74 73 20 3d 20 6f 73 47 65 74 46 69 6c 65  Bits = osGetFile
17fd0 53 69 7a 65 28 70 46 69 6c 65 2d 3e 68 2c 20 26  Size(pFile->h, &
17fe0 75 70 70 65 72 42 69 74 73 29 3b 0a 20 20 20 20  upperBits);.    
17ff0 2a 70 53 69 7a 65 20 3d 20 28 28 28 73 71 6c 69  *pSize = (((sqli
18000 74 65 33 5f 69 6e 74 36 34 29 75 70 70 65 72 42  te3_int64)upperB
18010 69 74 73 29 3c 3c 33 32 29 20 2b 20 6c 6f 77 65  its)<<32) + lowe
18020 72 42 69 74 73 3b 0a 20 20 20 20 69 66 28 20 20  rBits;.    if(  
18030 20 28 6c 6f 77 65 72 42 69 74 73 20 3d 3d 20 49   (lowerBits == I
18040 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 53 49 5a 45  NVALID_FILE_SIZE
18050 29 0a 20 20 20 20 20 20 20 26 26 20 28 28 6c 61  ).       && ((la
18060 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
18070 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f  astError())!=NO_
18080 45 52 52 4f 52 29 20 29 7b 0a 20 20 20 20 20 20  ERROR) ){.      
18090 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
180a0 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
180b0 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
180c0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
180d0 52 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e  R_FSTAT, pFile->
180e0 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
180f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18100 20 20 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c    "winFileSize",
18110 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
18120 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
18130 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 49 5a  .  OSTRACE(("SIZ
18140 45 20 66 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65  E file=%p, pSize
18150 3d 25 70 2c 20 2a 70 53 69 7a 65 3d 25 6c 6c 64  =%p, *pSize=%lld
18160 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
18170 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
18180 20 70 53 69 7a 65 2c 20 2a 70 53 69 7a 65 2c 20   pSize, *pSize, 
18190 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
181a0 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  c)));.  return r
181b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b  c;.}../*.** LOCK
181c0 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
181d0 41 54 45 4c 59 20 69 73 20 75 6e 64 65 66 69 6e  ATELY is undefin
181e0 65 64 20 6f 6e 20 73 6f 6d 65 20 57 69 6e 64 6f  ed on some Windo
181f0 77 73 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23  ws systems..*/.#
18200 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f  ifndef LOCKFILE_
18210 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
18220 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49  .# define LOCKFI
18230 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54  LE_FAIL_IMMEDIAT
18240 45 4c 59 20 31 0a 23 65 6e 64 69 66 0a 0a 23 69  ELY 1.#endif..#i
18250 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 45  fndef LOCKFILE_E
18260 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 23 20  XCLUSIVE_LOCK.# 
18270 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f  define LOCKFILE_
18280 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 32  EXCLUSIVE_LOCK 2
18290 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48  .#endif../*.** H
182a0 69 73 74 6f 72 69 63 61 6c 6c 79 2c 20 53 51 4c  istorically, SQL
182b0 69 74 65 20 68 61 73 20 75 73 65 64 20 62 6f 74  ite has used bot
182c0 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20 61  h the LockFile a
182d0 6e 64 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75  nd LockFileEx fu
182e0 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 57 68 65 6e  nctions..** When
182f0 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20 66 75   the LockFile fu
18300 6e 63 74 69 6f 6e 20 77 61 73 20 75 73 65 64 2c  nction was used,
18310 20 69 74 20 77 61 73 20 61 6c 77 61 79 73 20 65   it was always e
18320 78 70 65 63 74 65 64 20 74 6f 20 66 61 69 6c 0a  xpected to fail.
18330 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69  ** immediately i
18340 66 20 74 68 65 20 6c 6f 63 6b 20 63 6f 75 6c 64  f the lock could
18350 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64   not be obtained
18360 2e 20 20 41 6c 73 6f 2c 20 69 74 20 61 6c 77 61  .  Also, it alwa
18370 79 73 20 65 78 70 65 63 74 65 64 20 74 6f 0a 2a  ys expected to.*
18380 2a 20 6f 62 74 61 69 6e 20 61 6e 20 65 78 63 6c  * obtain an excl
18390 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 54 68 65  usive lock.  The
183a0 73 65 20 66 6c 61 67 73 20 61 72 65 20 75 73 65  se flags are use
183b0 64 20 77 69 74 68 20 74 68 65 20 4c 6f 63 6b 46  d with the LockF
183c0 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 0a 2a  ileEx function.*
183d0 2a 20 61 6e 64 20 72 65 66 6c 65 63 74 20 74 68  * and reflect th
183e0 6f 73 65 20 65 78 70 65 63 74 61 74 69 6f 6e 73  ose expectations
183f0 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 74 68 65  ; therefore, the
18400 79 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  y should not be 
18410 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23 69 66 6e  changed..*/.#ifn
18420 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  def SQLITE_LOCKF
18430 49 4c 45 5f 46 4c 41 47 53 0a 23 20 64 65 66 69  ILE_FLAGS.# defi
18440 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  ne SQLITE_LOCKFI
18450 4c 45 5f 46 4c 41 47 53 20 20 20 28 4c 4f 43 4b  LE_FLAGS   (LOCK
18460 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
18470 41 54 45 4c 59 20 7c 20 5c 0a 20 20 20 20 20 20  ATELY | \.      
18480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18490 20 20 20 20 20 20 20 20 20 20 20 20 4c 4f 43 4b              LOCK
184a0 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c  FILE_EXCLUSIVE_L
184b0 4f 43 4b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  OCK).#endif../*.
184c0 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 53 51  ** Currently, SQ
184d0 4c 69 74 65 20 6e 65 76 65 72 20 63 61 6c 6c 73  Lite never calls
184e0 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20   the LockFileEx 
184f0 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 6f 75 74  function without
18500 20 77 61 6e 74 69 6e 67 20 74 68 65 0a 2a 2a 20   wanting the.** 
18510 63 61 6c 6c 20 74 6f 20 66 61 69 6c 20 69 6d 6d  call to fail imm
18520 65 64 69 61 74 65 6c 79 20 69 66 20 74 68 65 20  ediately if the 
18530 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f  lock cannot be o
18540 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e  btained..*/.#ifn
18550 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  def SQLITE_LOCKF
18560 49 4c 45 45 58 5f 46 4c 41 47 53 0a 23 20 64 65  ILEEX_FLAGS.# de
18570 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  fine SQLITE_LOCK
18580 46 49 4c 45 45 58 5f 46 4c 41 47 53 20 28 4c 4f  FILEEX_FLAGS (LO
18590 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
185a0 44 49 41 54 45 4c 59 29 0a 23 65 6e 64 69 66 0a  DIATELY).#endif.
185b0 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
185c0 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2a   reader lock..**
185d0 20 44 69 66 66 65 72 65 6e 74 20 41 50 49 20 72   Different API r
185e0 6f 75 74 69 6e 65 73 20 61 72 65 20 63 61 6c 6c  outines are call
185f0 65 64 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ed depending on 
18600 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
18610 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39 78 20  his.** is Win9x 
18620 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74 61  or WinNT..*/.sta
18630 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 52 65  tic int winGetRe
18640 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a  adLock(winFile *
18650 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65  pFile){.  int re
18660 73 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52  s;.  OSTRACE(("R
18670 45 41 44 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  EAD-LOCK file=%p
18680 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46  , lock=%d\n", pF
18690 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
186a0 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 69 66 28  ocktype));.  if(
186b0 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66   osIsNT() ){.#if
186c0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
186d0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e  .    /*.    ** N
186e0 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20 43 45 20  OTE: Windows CE 
186f0 69 73 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65  is handled diffe
18700 72 65 6e 74 6c 79 20 68 65 72 65 20 64 75 65 20  rently here due 
18710 69 74 73 20 6c 61 63 6b 20 6f 66 20 74 68 65 20  its lack of the 
18720 57 69 6e 33 32 0a 20 20 20 20 2a 2a 20 20 20 20  Win32.    **    
18730 20 20 20 41 50 49 20 4c 6f 63 6b 46 69 6c 65 45     API LockFileE
18740 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  x..    */.    re
18750 73 20 3d 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c  s = winceLockFil
18760 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  e(&pFile->h, SHA
18770 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 31 2c  RED_FIRST, 0, 1,
18780 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72   0);.#else.    r
18790 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  es = winLockFile
187a0 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49  (&pFile->h, SQLI
187b0 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c  TE_LOCKFILEEX_FL
187c0 41 47 53 2c 20 53 48 41 52 45 44 5f 46 49 52 53  AGS, SHARED_FIRS
187d0 54 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  T, 0,.          
187e0 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52              SHAR
187f0 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 23 65 6e  ED_SIZE, 0);.#en
18800 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  dif.  }.#ifdef S
18810 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
18820 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
18830 20 69 6e 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c   int lk;.    sql
18840 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
18850 73 69 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29  sizeof(lk), &lk)
18860 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61  ;.    pFile->sha
18870 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28 73  redLockByte = (s
18880 68 6f 72 74 29 28 28 6c 6b 20 26 20 30 78 37 66  hort)((lk & 0x7f
18890 66 66 66 66 66 66 29 25 28 53 48 41 52 45 44 5f  ffffff)%(SHARED_
188a0 53 49 5a 45 20 2d 20 31 29 29 3b 0a 20 20 20 20  SIZE - 1));.    
188b0 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c  res = winLockFil
188c0 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c  e(&pFile->h, SQL
188d0 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41  ITE_LOCKFILE_FLA
188e0 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  GS,.            
188f0 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
18900 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68  _FIRST+pFile->sh
18910 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c  aredLockByte, 0,
18920 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   1, 0);.  }.#end
18930 69 66 0a 20 20 69 66 28 20 72 65 73 20 3d 3d 20  if.  if( res == 
18940 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 ){.    pFile->
18950 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
18960 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
18970 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20    /* No need to 
18980 6c 6f 67 20 61 20 66 61 69 6c 75 72 65 20 74 6f  log a failure to
18990 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 4f   lock */.  }.  O
189a0 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 4c 4f  STRACE(("READ-LO
189b0 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65 73 75  CK file=%p, resu
189c0 6c 74 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  lt=%d\n", pFile-
189d0 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20 72 65 74  >h, res));.  ret
189e0 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
189f0 2a 20 55 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63  * Undo a readloc
18a00 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  k.*/.static int 
18a10 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63  winUnlockReadLoc
18a20 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  k(winFile *pFile
18a30 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  ){.  int res;.  
18a40 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
18a50 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
18a60 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  D-UNLOCK file=%p
18a70 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46  , lock=%d\n", pF
18a80 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
18a90 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 69 66 28  ocktype));.  if(
18aa0 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
18ab0 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b   res = winUnlock
18ac0 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
18ad0 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
18ae0 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
18af0 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
18b00 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
18b10 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 72  SI.  else{.    r
18b20 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  es = winUnlockFi
18b30 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48  le(&pFile->h, SH
18b40 41 52 45 44 5f 46 49 52 53 54 2b 70 46 69 6c 65  ARED_FIRST+pFile
18b50 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  ->sharedLockByte
18b60 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 1, 0);.  }.
18b70 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 65 73  #endif.  if( res
18b80 3d 3d 30 20 26 26 20 28 28 6c 61 73 74 45 72 72  ==0 && ((lastErr
18b90 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
18ba0 72 6f 72 28 29 29 21 3d 45 52 52 4f 52 5f 4e 4f  ror())!=ERROR_NO
18bb0 54 5f 4c 4f 43 4b 45 44 29 20 29 7b 0a 20 20 20  T_LOCKED) ){.   
18bc0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
18bd0 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
18be0 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
18bf0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
18c00 43 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  CK, pFile->lastE
18c10 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
18c20 20 20 20 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b        "winUnlock
18c30 52 65 61 64 4c 6f 63 6b 22 2c 20 70 46 69 6c 65  ReadLock", pFile
18c40 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20  ->zPath);.  }.  
18c50 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 55  OSTRACE(("READ-U
18c60 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72  NLOCK file=%p, r
18c70 65 73 75 6c 74 3d 25 64 5c 6e 22 2c 20 70 46 69  esult=%d\n", pFi
18c80 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20  le->h, res));.  
18c90 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
18ca0 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
18cb0 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
18cc0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
18cd0 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65  rameter locktype
18ce0 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
18cf0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
18d00 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
18d10 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
18d20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
18d30 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
18d40 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
18d50 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
18d60 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
18d70 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
18d80 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
18d90 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
18da0 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
18db0 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
18dc0 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
18dd0 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
18de0 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
18df0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
18e00 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
18e10 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
18e20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
18e30 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
18e40 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
18e50 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
18e60 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
18e70 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
18e80 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
18e90 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
18ea0 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
18eb0 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
18ec0 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
18ed0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
18ee0 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
18ef0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
18f00 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
18f10 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
18f20 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
18f30 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
18f40 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
18f50 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
18f60 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
18f70 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
18f80 54 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29 20  The winUnlock() 
18f90 72 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73 65  routine.** erase
18fa0 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 6f  s all locks at o
18fb0 6e 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20  nce and returns 
18fc0 75 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  us immediately t
18fd0 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  o locking level 
18fe0 30 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20  0..** It is not 
18ff0 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77 65  possible to lowe
19000 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
19010 76 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74 20  vel one step at 
19020 61 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20  a time.  You.** 
19030 6d 75 73 74 20 67 6f 20 73 74 72 61 69 67 68 74  must go straight
19040 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65   to locking leve
19050 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  l 0..*/.static i
19060 6e 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c 69 74  nt winLock(sqlit
19070 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
19080 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e   locktype){.  in
19090 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
190a0 3b 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63  ;    /* Return c
190b0 6f 64 65 20 66 72 6f 6d 20 73 75 62 72 6f 75 74  ode from subrout
190c0 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ines */.  int re
190d0 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  s = 1;          
190e0 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61 20   /* Result of a 
190f0 57 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61 6c  Windows lock cal
19100 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c 6f  l */.  int newLo
19110 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20 2f 2a  cktype;       /*
19120 20 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   Set pFile->lock
19130 74 79 70 65 20 74 6f 20 74 68 69 73 20 76 61 6c  type to this val
19140 75 65 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e  ue before exitin
19150 67 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50 65  g */.  int gotPe
19160 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a  ndingLock = 0;/*
19170 20 54 72 75 65 20 69 66 20 77 65 20 61 63 71 75   True if we acqu
19180 69 72 65 64 20 61 20 50 45 4e 44 49 4e 47 20 6c  ired a PENDING l
19190 6f 63 6b 20 74 68 69 73 20 74 69 6d 65 20 2a 2f  ock this time */
191a0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
191b0 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
191c0 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
191d0 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a  rno = NO_ERROR;.
191e0 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
191f0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
19200 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 6c  LOCK file=%p, ol
19210 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c 20 6e 65  dLock=%d(%d), ne
19220 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20  wLock=%d\n",.   
19230 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
19240 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
19250 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  e, pFile->shared
19260 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63 6b 74 79  LockByte, lockty
19270 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  pe));..  /* If t
19280 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
19290 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74  a lock of this t
192a0 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74  ype or more rest
192b0 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20  rictive on the. 
192c0 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e   ** OsFile, do n
192d0 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73  othing. Don't us
192e0 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20  e the end_lock: 
192f0 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20  exit path, as.  
19300 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65  ** sqlite3OsEnte
19310 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20  rMutex() hasn't 
19320 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e  been called yet.
19330 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
19340 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63  e->locktype>=loc
19350 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 4f 53 54  ktype ){.    OST
19360 52 41 43 45 28 28 22 4c 4f 43 4b 2d 48 45 4c 44  RACE(("LOCK-HELD
19370 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
19380 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
19390 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
193a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
193b0 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c  ..  /* Do not al
193c0 6c 6f 77 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20  low any kind of 
193d0 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 61 20  write-lock on a 
193e0 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61  read-only databa
193f0 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  se.  */.  if( (p
19400 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
19410 26 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59  & WINFILE_RDONLY
19420 29 21 3d 30 20 26 26 20 6c 6f 63 6b 74 79 70 65  )!=0 && locktype
19430 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
19440 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
19450 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b  LITE_IOERR_LOCK;
19460 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
19470 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  sure the locking
19480 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72   sequence is cor
19490 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65  rect.  */.  asse
194a0 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
194b0 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ype!=NO_LOCK || 
194c0 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
194d0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
194e0 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e  t( locktype!=PEN
194f0 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  DING_LOCK );.  a
19500 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
19510 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
19520 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  | pFile->locktyp
19530 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
19540 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74 68 65  ;..  /* Lock the
19550 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79   PENDING_LOCK by
19560 74 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  te if we need to
19570 20 61 63 71 75 69 72 65 20 61 20 50 45 4e 44 49   acquire a PENDI
19580 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20  NG lock or.  ** 
19590 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 20  a SHARED lock.  
195a0 49 66 20 77 65 20 61 72 65 20 61 63 71 75 69 72  If we are acquir
195b0 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ing a SHARED loc
195c0 6b 2c 20 74 68 65 20 61 63 71 75 69 73 69 74 69  k, the acquisiti
195d0 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 50  on of.  ** the P
195e0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65  ENDING_LOCK byte
195f0 20 69 73 20 74 65 6d 70 6f 72 61 72 79 2e 0a 20   is temporary.. 
19600 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74 79 70   */.  newLocktyp
19610 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  e = pFile->lockt
19620 79 70 65 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  ype;.  if( pFile
19630 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c  ->locktype==NO_L
19640 4f 43 4b 0a 20 20 20 7c 7c 20 28 6c 6f 63 6b 74  OCK.   || (lockt
19650 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
19660 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f  OCK && pFile->lo
19670 63 6b 74 79 70 65 3c 3d 52 45 53 45 52 56 45 44  cktype<=RESERVED
19680 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20  _LOCK).  ){.    
19690 69 6e 74 20 63 6e 74 20 3d 20 33 3b 0a 20 20 20  int cnt = 3;.   
196a0 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e 30 20   while( cnt-->0 
196b0 26 26 20 28 72 65 73 20 3d 20 77 69 6e 4c 6f 63  && (res = winLoc
196c0 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
196d0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
196e0 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20  _FLAGS,.        
196f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19710 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30   PENDING_BYTE, 0
19720 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20  , 1, 0))==0 ){. 
19730 20 20 20 20 20 2f 2a 20 54 72 79 20 33 20 74 69       /* Try 3 ti
19740 6d 65 73 20 74 6f 20 67 65 74 20 74 68 65 20 70  mes to get the p
19750 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20 20 54 68  ending lock.  Th
19760 69 73 20 69 73 20 6e 65 65 64 65 64 20 74 6f 20  is is needed to 
19770 77 6f 72 6b 0a 20 20 20 20 20 20 2a 2a 20 61 72  work.      ** ar
19780 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20 63 61  ound problems ca
19790 75 73 65 64 20 62 79 20 69 6e 64 65 78 69 6e 67  used by indexing
197a0 20 61 6e 64 2f 6f 72 20 61 6e 74 69 2d 76 69 72   and/or anti-vir
197b0 75 73 20 73 6f 66 74 77 61 72 65 20 6f 6e 0a 20  us software on. 
197c0 20 20 20 20 20 2a 2a 20 57 69 6e 64 6f 77 73 20       ** Windows 
197d0 73 79 73 74 65 6d 73 2e 0a 20 20 20 20 20 20 2a  systems..      *
197e0 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75 73 69  * If you are usi
197f0 6e 67 20 74 68 69 73 20 63 6f 64 65 20 61 73 20  ng this code as 
19800 61 20 6d 6f 64 65 6c 20 66 6f 72 20 61 6c 74 65  a model for alte
19810 72 6e 61 74 69 76 65 20 56 46 53 65 73 2c 20 64  rnative VFSes, d
19820 6f 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 63  o not.      ** c
19830 6f 70 79 20 74 68 69 73 20 72 65 74 72 79 20 6c  opy this retry l
19840 6f 67 69 63 2e 20 20 49 74 20 69 73 20 61 20 68  ogic.  It is a h
19850 61 63 6b 20 69 6e 74 65 6e 64 65 64 20 66 6f 72  ack intended for
19860 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79 2e 0a 20   Windows only.. 
19870 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6c 61       */.      la
19880 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
19890 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
198a0 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
198b0 2d 50 45 4e 44 49 4e 47 2d 46 41 49 4c 20 66 69  -PENDING-FAIL fi
198c0 6c 65 3d 25 70 2c 20 63 6f 75 6e 74 3d 25 64 2c  le=%p, count=%d,
198d0 20 72 65 73 75 6c 74 3d 25 64 5c 6e 22 2c 0a 20   result=%d\n",. 
198e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46                pF
198f0 69 6c 65 2d 3e 68 2c 20 63 6e 74 2c 20 72 65 73  ile->h, cnt, res
19900 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 61  ));.      if( la
19910 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 49  stErrno==ERROR_I
19920 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 20 29 7b  NVALID_HANDLE ){
19930 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
19940 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
19950 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  Errno;.        r
19960 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
19970 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 4f  _LOCK;.        O
19980 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d 46 41  STRACE(("LOCK-FA
19990 49 4c 20 66 69 6c 65 3d 25 70 2c 20 63 6f 75 6e  IL file=%p, coun
199a0 74 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  t=%d, rc=%s\n",.
199b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199c0 20 70 46 69 6c 65 2d 3e 68 2c 20 63 6e 74 2c 20   pFile->h, cnt, 
199d0 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
199e0 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65  c)));.        re
199f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
19a00 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74 20 29  .      if( cnt )
19a10 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
19a20 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20  leep(1);.    }. 
19a30 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63     gotPendingLoc
19a40 6b 20 3d 20 72 65 73 3b 0a 20 20 20 20 69 66 28  k = res;.    if(
19a50 20 21 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6c   !res ){.      l
19a60 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
19a70 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
19a80 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71   }.  }..  /* Acq
19a90 75 69 72 65 20 61 20 73 68 61 72 65 64 20 6c 6f  uire a shared lo
19aa0 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  ck.  */.  if( lo
19ab0 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
19ac0 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20  OCK && res ){.  
19ad0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
19ae0 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f  >locktype==NO_LO
19af0 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  CK );.    res = 
19b00 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70  winGetReadLock(p
19b10 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72  File);.    if( r
19b20 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  es ){.      newL
19b30 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44  ocktype = SHARED
19b40 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
19b50 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e  {.      lastErrn
19b60 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
19b70 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  or();.    }.  }.
19b80 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20  .  /* Acquire a 
19b90 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20  RESERVED lock.  
19ba0 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
19bb0 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e==RESERVED_LOCK
19bc0 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61   && res ){.    a
19bd0 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
19be0 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
19bf0 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d  OCK );.    res =
19c00 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
19c10 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
19c20 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 52  OCKFILE_FLAGS, R
19c30 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c  ESERVED_BYTE, 0,
19c40 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   1, 0);.    if( 
19c50 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77  res ){.      new
19c60 4c 6f 63 6b 74 79 70 65 20 3d 20 52 45 53 45 52  Locktype = RESER
19c70 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65  VED_LOCK;.    }e
19c80 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45  lse{.      lastE
19c90 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
19ca0 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20  Error();.    }. 
19cb0 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
19cc0 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a   a PENDING lock.
19cd0 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
19ce0 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
19cf0 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20  OCK && res ){.  
19d00 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
19d10 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
19d20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b    gotPendingLock
19d30 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
19d40 41 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55  Acquire an EXCLU
19d50 53 49 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20  SIVE lock.  */. 
19d60 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45   if( locktype==E
19d70 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
19d80 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65   res ){.    asse
19d90 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
19da0 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype>=SHARED_LOCK
19db0 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69   );.    res = wi
19dc0 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28  nUnlockReadLock(
19dd0 70 46 69 6c 65 29 3b 0a 20 20 20 20 72 65 73 20  pFile);.    res 
19de0 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
19df0 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f  File->h, SQLITE_
19e00 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20  LOCKFILE_FLAGS, 
19e10 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
19e20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19e30 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49         SHARED_SI
19e40 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ZE, 0);.    if( 
19e50 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77  res ){.      new
19e60 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58 43 4c 55  Locktype = EXCLU
19e70 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  SIVE_LOCK;.    }
19e80 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74  else{.      last
19e90 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
19ea0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
19eb0 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70  winGetReadLock(p
19ec0 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  File);.    }.  }
19ed0 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65  ..  /* If we are
19ee0 20 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44 49   holding a PENDI
19ef0 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75 67  NG lock that oug
19f00 68 74 20 74 6f 20 62 65 20 72 65 6c 65 61 73 65  ht to be release
19f10 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 6c  d, then.  ** rel
19f20 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a  ease it now..  *
19f30 2f 0a 20 20 69 66 28 20 67 6f 74 50 65 6e 64 69  /.  if( gotPendi
19f40 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74 79  ngLock && lockty
19f50 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
19f60 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b  ){.    winUnlock
19f70 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
19f80 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c  PENDING_BYTE, 0,
19f90 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f   1, 0);.  }..  /
19fa0 2a 20 55 70 64 61 74 65 20 74 68 65 20 73 74 61  * Update the sta
19fb0 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68  te of the lock h
19fc0 61 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66  as held in the f
19fd0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
19fe0 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  hen.  ** return 
19ff0 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
1a000 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a  result code..  *
1a010 2f 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20  /.  if( res ){. 
1a020 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1a030 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
1a040 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1a050 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
1a060 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
1a070 53 59 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  SY;.    OSTRACE(
1a080 28 22 4c 4f 43 4b 2d 46 41 49 4c 20 66 69 6c 65  ("LOCK-FAIL file
1a090 3d 25 70 2c 20 77 61 6e 74 65 64 3d 25 64 2c 20  =%p, wanted=%d, 
1a0a0 67 6f 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  got=%d\n",.     
1a0b0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
1a0c0 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77 4c  , locktype, newL
1a0d0 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 7d 0a 20  ocktype));.  }. 
1a0e0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
1a0f0 20 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74 79   = (u8)newLockty
1a100 70 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  pe;.  OSTRACE(("
1a110 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f  LOCK file=%p, lo
1a120 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c  ck=%d, rc=%s\n",
1a130 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
1a140 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  e->h, pFile->loc
1a150 6b 74 79 70 65 2c 20 73 71 6c 69 74 65 33 45 72  ktype, sqlite3Er
1a160 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72  rName(rc)));.  r
1a170 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1a180 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1a190 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
1a1a0 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
1a1b0 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
1a1c0 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
1a1d0 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
1a1e0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
1a1f0 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
1a200 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a   held, return.**
1a210 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65 72   non-zero, other
1a220 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  wise zero..*/.st
1a230 61 74 69 63 20 69 6e 74 20 77 69 6e 43 68 65 63  atic int winChec
1a240 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
1a250 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1a260 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
1a270 20 69 6e 74 20 72 65 73 3b 0a 20 20 77 69 6e 46   int res;.  winF
1a280 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
1a290 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69  nFile*)id;..  Si
1a2a0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
1a2b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1a2c0 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
1a2d0 4c 4f 43 4b 3b 20 29 3b 0a 20 20 4f 53 54 52 41  LOCK; );.  OSTRA
1a2e0 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43  CE(("TEST-WR-LOC
1a2f0 4b 20 66 69 6c 65 3d 25 70 2c 20 70 52 65 73 4f  K file=%p, pResO
1a300 75 74 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d  ut=%p\n", pFile-
1a310 3e 68 2c 20 70 52 65 73 4f 75 74 29 29 3b 0a 0a  >h, pResOut));..
1a320 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
1a330 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
1a340 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56  locktype>=RESERV
1a350 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
1a360 65 73 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52  es = 1;.    OSTR
1a370 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f  ACE(("TEST-WR-LO
1a380 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65 73 75  CK file=%p, resu
1a390 6c 74 3d 25 64 20 28 6c 6f 63 61 6c 29 5c 6e 22  lt=%d (local)\n"
1a3a0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73 29  , pFile->h, res)
1a3b0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1a3c0 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c  res = winLockFil
1a3d0 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c  e(&pFile->h, SQL
1a3e0 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46  ITE_LOCKFILEEX_F
1a3f0 4c 41 47 53 2c 52 45 53 45 52 56 45 44 5f 42 59  LAGS,RESERVED_BY
1a400 54 45 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20 69  TE,0,1,0);.    i
1a410 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
1a420 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70  winUnlockFile(&p
1a430 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45  File->h, RESERVE
1a440 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  D_BYTE, 0, 1, 0)
1a450 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 73 20  ;.    }.    res 
1a460 3d 20 21 72 65 73 3b 0a 20 20 20 20 4f 53 54 52  = !res;.    OSTR
1a470 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f  ACE(("TEST-WR-LO
1a480 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65 73 75  CK file=%p, resu
1a490 6c 74 3d 25 64 20 28 72 65 6d 6f 74 65 29 5c 6e  lt=%d (remote)\n
1a4a0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73  ", pFile->h, res
1a4b0 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f  ));.  }.  *pResO
1a4c0 75 74 20 3d 20 72 65 73 3b 0a 20 20 4f 53 54 52  ut = res;.  OSTR
1a4d0 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f  ACE(("TEST-WR-LO
1a4e0 43 4b 20 66 69 6c 65 3d 25 70 2c 20 70 52 65 73  CK file=%p, pRes
1a4f0 4f 75 74 3d 25 70 2c 20 2a 70 52 65 73 4f 75 74  Out=%p, *pResOut
1a500 3d 25 64 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%d, rc=SQLITE_O
1a510 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  K\n",.          
1a520 20 70 46 69 6c 65 2d 3e 68 2c 20 70 52 65 73 4f   pFile->h, pResO
1a530 75 74 2c 20 2a 70 52 65 73 4f 75 74 29 29 3b 0a  ut, *pResOut));.
1a540 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a550 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  OK;.}../*.** Low
1a560 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
1a570 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
1a580 63 72 69 70 74 6f 72 20 69 64 20 74 6f 20 6c 6f  criptor id to lo
1a590 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70  cktype.  locktyp
1a5a0 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  e.** must be eit
1a5b0 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
1a5c0 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
1a5d0 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
1a5e0 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
1a5f0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
1a600 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
1a610 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
1a620 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
1a630 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
1a640 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
1a650 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f  .** It is not po
1a660 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20  ssible for this 
1a670 72 6f 75 74 69 6e 65 20 74 6f 20 66 61 69 6c 20  routine to fail 
1a680 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  if the second ar
1a690 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f  gument.** is NO_
1a6a0 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65 20 73 65  LOCK.  If the se
1a6b0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
1a6c0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 74 68 65   SHARED_LOCK the
1a6d0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
1a6e0 2a 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 53  * might return S
1a6f0 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a  QLITE_IOERR;.*/.
1a700 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e  static int winUn
1a710 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
1a720 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
1a730 79 70 65 29 7b 0a 20 20 69 6e 74 20 74 79 70 65  ype){.  int type
1a740 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  ;.  winFile *pFi
1a750 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
1a760 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
1a770 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
1a780 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20  t( pFile!=0 );. 
1a790 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
1a7a0 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e<=SHARED_LOCK )
1a7b0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
1a7c0 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 6c  LOCK file=%p, ol
1a7d0 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c 20 6e 65  dLock=%d(%d), ne
1a7e0 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20  wLock=%d\n",.   
1a7f0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
1a800 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
1a810 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  e, pFile->shared
1a820 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63 6b 74 79  LockByte, lockty
1a830 70 65 29 29 3b 0a 20 20 74 79 70 65 20 3d 20 70  pe));.  type = p
1a840 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a  File->locktype;.
1a850 20 20 69 66 28 20 74 79 70 65 3e 3d 45 58 43 4c    if( type>=EXCL
1a860 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
1a870 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28    winUnlockFile(
1a880 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45  &pFile->h, SHARE
1a890 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52  D_FIRST, 0, SHAR
1a8a0 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20  ED_SIZE, 0);.   
1a8b0 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53   if( locktype==S
1a8c0 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 21 77  HARED_LOCK && !w
1a8d0 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 46  inGetReadLock(pF
1a8e0 69 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ile) ){.      /*
1a8f0 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76   This should nev
1a900 65 72 20 68 61 70 70 65 6e 2e 20 20 57 65 20 73  er happen.  We s
1a910 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
1a920 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  able to.      **
1a930 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72   reacquire the r
1a940 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ead lock */.    
1a950 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
1a960 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1a970 55 4e 4c 4f 43 4b 2c 20 6f 73 47 65 74 4c 61 73  UNLOCK, osGetLas
1a980 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
1a990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9a0 20 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c 20 70 46   "winUnlock", pF
1a9b0 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
1a9c0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70   }.  }.  if( typ
1a9d0 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e>=RESERVED_LOCK
1a9e0 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63   ){.    winUnloc
1a9f0 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
1aa00 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
1aa10 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 1, 0);.  }.  
1aa20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  if( locktype==NO
1aa30 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d 53  _LOCK && type>=S
1aa40 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
1aa50 20 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c    winUnlockReadL
1aa60 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a  ock(pFile);.  }.
1aa70 20 20 69 66 28 20 74 79 70 65 3e 3d 50 45 4e 44    if( type>=PEND
1aa80 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  ING_LOCK ){.    
1aa90 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70  winUnlockFile(&p
1aaa0 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47  File->h, PENDING
1aab0 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
1aac0 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f  .  }.  pFile->lo
1aad0 63 6b 74 79 70 65 20 3d 20 28 75 38 29 6c 6f 63  cktype = (u8)loc
1aae0 6b 74 79 70 65 3b 0a 20 20 4f 53 54 52 41 43 45  ktype;.  OSTRACE
1aaf0 28 28 22 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25  (("UNLOCK file=%
1ab00 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 72 63 3d 25  p, lock=%d, rc=%
1ab10 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1ab20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65   pFile->h, pFile
1ab30 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 73 71 6c 69  ->locktype, sqli
1ab40 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
1ab50 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1ab60 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
1ab70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1abb0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
1abc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1abd0 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a   No-op Locking *
1abe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1abf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ac00 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76  *.**.** Of the v
1ac10 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69  arious locking i
1ac20 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61  mplementations a
1ac30 76 61 69 6c 61 62 6c 65 2c 20 74 68 69 73 20 69  vailable, this i
1ac40 73 20 62 79 20 66 61 72 20 74 68 65 0a 2a 2a 20  s by far the.** 
1ac50 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69  simplest:  locki
1ac60 6e 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20  ng is ignored.  
1ac70 4e 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  No attempt is ma
1ac80 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64  de to lock the d
1ac90 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
1aca0 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 77  for reading or w
1acb0 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  riting..**.** Th
1acc0 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20  is locking mode 
1acd0 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
1ace0 6f 72 20 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f  or use on read-o
1acf0 6e 6c 79 20 64 61 74 61 62 61 73 65 73 0a 2a 2a  nly databases.**
1ad00 20 28 65 78 3a 20 64 61 74 61 62 61 73 65 73 20   (ex: databases 
1ad10 74 68 61 74 20 61 72 65 20 62 75 72 6e 65 64 20  that are burned 
1ad20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72  into CD-ROM, for
1ad30 20 65 78 61 6d 70 6c 65 2e 29 20 20 49 74 20 63   example.)  It c
1ad40 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73  an.** also be us
1ad50 65 64 20 69 66 20 74 68 65 20 61 70 70 6c 69 63  ed if the applic
1ad60 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f  ation employs so
1ad70 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d 65 63 68  me external mech
1ad80 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76  anism to.** prev
1ad90 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  ent simultaneous
1ada0 20 61 63 63 65 73 73 20 6f 66 20 74 68 65 20 73   access of the s
1adb0 61 6d 65 20 64 61 74 61 62 61 73 65 20 62 79 20  ame database by 
1adc0 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64  two or more.** d
1add0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1ade0 6f 6e 73 2e 20 20 42 75 74 20 74 68 65 72 65 20  ons.  But there 
1adf0 69 73 20 61 20 73 65 72 69 6f 75 73 20 72 69 73  is a serious ris
1ae00 6b 20 6f 66 20 64 61 74 61 62 61 73 65 0a 2a 2a  k of database.**
1ae10 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 66 20 74   corruption if t
1ae20 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  his locking mode
1ae30 20 69 73 20 75 73 65 64 20 69 6e 20 73 69 74 75   is used in situ
1ae40 61 74 69 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c  ations where mul
1ae50 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73  tiple.** databas
1ae60 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72  e connections ar
1ae70 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  e accessing the 
1ae80 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
1ae90 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 0a 2a  le at the same.*
1aea0 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f  * time and one o
1aeb0 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65 20  r more of those 
1aec0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20  connections are 
1aed0 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61  writing..*/..sta
1aee0 74 69 63 20 69 6e 74 20 77 69 6e 4e 6f 6c 6f 63  tic int winNoloc
1aef0 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  kLock(sqlite3_fi
1af00 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
1af10 74 79 70 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  type){.  UNUSED_
1af20 50 41 52 41 4d 45 54 45 52 28 69 64 29 3b 0a 20  PARAMETER(id);. 
1af30 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1af40 52 28 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 72  R(locktype);.  r
1af50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1af60 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .}..static int w
1af70 69 6e 4e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73  inNolockCheckRes
1af80 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
1af90 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
1afa0 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55  *pResOut){.  UNU
1afb0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64  SED_PARAMETER(id
1afc0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1afd0 4d 45 54 45 52 28 70 52 65 73 4f 75 74 29 3b 0a  METER(pResOut);.
1afe0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1aff0 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  OK;.}..static in
1b000 74 20 77 69 6e 4e 6f 6c 6f 63 6b 55 6e 6c 6f 63  t winNolockUnloc
1b010 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
1b020 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
1b030 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
1b040 4d 45 54 45 52 28 69 64 29 3b 0a 20 20 55 4e 55  METER(id);.  UNU
1b050 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6c 6f  SED_PARAMETER(lo
1b060 63 6b 74 79 70 65 29 3b 0a 20 20 72 65 74 75 72  cktype);.  retur
1b070 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1b080 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
1b090 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
1b0a0 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65  no-op lock imple
1b0b0 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
1b0c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
1b0d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b0e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b0f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
1b120 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20  ./*.** If *pArg 
1b130 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 65 67  is initially neg
1b140 61 74 69 76 65 20 74 68 65 6e 20 74 68 69 73 20  ative then this 
1b150 69 73 20 61 20 71 75 65 72 79 2e 20 20 53 65 74  is a query.  Set
1b160 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f   *pArg to.** 1 o
1b170 72 20 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  r 0 depending on
1b180 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
1b190 62 69 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c  bit mask of pFil
1b1a0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20  e->ctrlFlags is 
1b1b0 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70  set..**.** If *p
1b1c0 41 72 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74  Arg is 0 or 1, t
1b1d0 68 65 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74  hen clear or set
1b1e0 20 74 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66   the mask bit of
1b1f0 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
1b200 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
1b210 64 20 77 69 6e 4d 6f 64 65 42 69 74 28 77 69 6e  d winModeBit(win
1b220 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73  File *pFile, uns
1b230 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c  igned char mask,
1b240 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69   int *pArg){.  i
1b250 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20  f( *pArg<0 ){.  
1b260 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65    *pArg = (pFile
1b270 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61  ->ctrlFlags & ma
1b280 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20  sk)!=0;.  }else 
1b290 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29  if( (*pArg)==0 )
1b2a0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
1b2b0 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b  lFlags &= ~mask;
1b2c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
1b2d0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  ile->ctrlFlags |
1b2e0 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = mask;.  }.}../
1b2f0 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
1b300 6e 63 65 73 20 74 6f 20 56 46 53 20 68 65 6c 70  nces to VFS help
1b310 65 72 20 6d 65 74 68 6f 64 73 20 75 73 65 64 20  er methods used 
1b320 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  for temporary fi
1b330 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  les */.static in
1b340 74 20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65  t winGetTempname
1b350 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 20  (sqlite3_vfs *, 
1b360 63 68 61 72 20 2a 2a 29 3b 0a 73 74 61 74 69 63  char **);.static
1b370 20 69 6e 74 20 77 69 6e 49 73 44 69 72 28 63 6f   int winIsDir(co
1b380 6e 73 74 20 76 6f 69 64 20 2a 29 3b 0a 73 74 61  nst void *);.sta
1b390 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 44 72  tic BOOL winIsDr
1b3a0 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f  iveLetterAndColo
1b3b0 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b  n(const char *);
1b3c0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 72 6f 6c 20  ../*.** Control 
1b3d0 61 6e 64 20 71 75 65 72 79 20 6f 66 20 74 68 65  and query of the
1b3e0 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c   open file handl
1b3f0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1b400 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 28   winFileControl(
1b410 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1b420 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a  , int op, void *
1b430 70 41 72 67 29 7b 0a 20 20 77 69 6e 46 69 6c 65  pArg){.  winFile
1b440 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
1b450 6c 65 2a 29 69 64 3b 0a 20 20 4f 53 54 52 41 43  le*)id;.  OSTRAC
1b460 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
1b470 70 2c 20 6f 70 3d 25 64 2c 20 70 41 72 67 3d 25  p, op=%d, pArg=%
1b480 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  p\n", pFile->h, 
1b490 6f 70 2c 20 70 41 72 67 29 29 3b 0a 20 20 73 77  op, pArg));.  sw
1b4a0 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
1b4b0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1b4c0 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20  L_LOCKSTATE: {. 
1b4d0 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
1b4e0 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79   = pFile->lockty
1b4f0 70 65 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  pe;.      OSTRAC
1b500 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
1b510 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
1b520 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
1b530 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1b540 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1b550 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1b560 4e 54 4c 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20  NTL_LAST_ERRNO: 
1b570 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70  {.      *(int*)p
1b580 41 72 67 20 3d 20 28 69 6e 74 29 70 46 69 6c 65  Arg = (int)pFile
1b590 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  ->lastErrno;.   
1b5a0 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e     OSTRACE(("FCN
1b5b0 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  TL file=%p, rc=S
1b5c0 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
1b5d0 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72  le->h));.      r
1b5e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b5f0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1b600 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55  SQLITE_FCNTL_CHU
1b610 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20  NK_SIZE: {.     
1b620 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20   pFile->szChunk 
1b630 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a  = *(int *)pArg;.
1b640 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1b650 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
1b660 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
1b670 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
1b680 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b690 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
1b6a0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1b6b0 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20  SIZE_HINT: {.   
1b6c0 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a     if( pFile->sz
1b6d0 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 20  Chunk>0 ){.     
1b6e0 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
1b6f0 20 6f 6c 64 53 7a 3b 0a 20 20 20 20 20 20 20 20   oldSz;.        
1b700 69 6e 74 20 72 63 20 3d 20 77 69 6e 46 69 6c 65  int rc = winFile
1b710 53 69 7a 65 28 69 64 2c 20 26 6f 6c 64 53 7a 29  Size(id, &oldSz)
1b720 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1b730 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1b740 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1b750 5f 69 6e 74 36 34 20 6e 65 77 53 7a 20 3d 20 2a  _int64 newSz = *
1b760 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29  (sqlite3_int64*)
1b770 70 41 72 67 3b 0a 20 20 20 20 20 20 20 20 20 20  pArg;.          
1b780 69 66 28 20 6e 65 77 53 7a 3e 6f 6c 64 53 7a 20  if( newSz>oldSz 
1b790 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  ){.            S
1b7a0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1b7b0 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20  nign(1);.       
1b7c0 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75       rc = winTru
1b7d0 6e 63 61 74 65 28 69 64 2c 20 6e 65 77 53 7a 29  ncate(id, newSz)
1b7e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 69  ;.            Si
1b7f0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1b800 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 20 20  ign(0);.        
1b810 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1b820 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1b830 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
1b840 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  c=%s\n", pFile->
1b850 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  h, sqlite3ErrNam
1b860 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20  e(rc)));.       
1b870 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1b880 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43    }.      OSTRAC
1b890 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
1b8a0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
1b8b0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
1b8c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1b8d0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1b8e0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1b8f0 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a  NTL_PERSIST_WAL:
1b900 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64 65   {.      winMode
1b910 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46 49  Bit(pFile, WINFI
1b920 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20  LE_PERSIST_WAL, 
1b930 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20  (int*)pArg);.   
1b940 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e     OSTRACE(("FCN
1b950 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  TL file=%p, rc=S
1b960 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
1b970 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72  le->h));.      r
1b980 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b990 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1b9a0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57  SQLITE_FCNTL_POW
1b9b0 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
1b9c0 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64  : {.      winMod
1b9d0 65 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46  eBit(pFile, WINF
1b9e0 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29  ILE_PSOW, (int*)
1b9f0 70 41 72 67 29 3b 0a 20 20 20 20 20 20 4f 53 54  pArg);.      OST
1ba00 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
1ba10 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
1ba20 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
1ba30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1ba40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1ba50 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1ba60 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20  _FCNTL_VFSNAME: 
1ba70 7b 0a 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a  {.      *(char**
1ba80 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f  )pArg = sqlite3_
1ba90 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 70 46  mprintf("%s", pF
1baa0 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d 65  ile->pVfs->zName
1bab0 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
1bac0 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
1bad0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
1bae0 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
1baf0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1bb00 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1bb10 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1bb20 54 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52  TL_WIN32_AV_RETR
1bb30 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a  Y: {.      int *
1bb40 61 20 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b 0a  a = (int*)pArg;.
1bb50 20 20 20 20 20 20 69 66 28 20 61 5b 30 5d 3e 30        if( a[0]>0
1bb60 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 49   ){.        winI
1bb70 6f 65 72 72 52 65 74 72 79 20 3d 20 61 5b 30 5d  oerrRetry = a[0]
1bb80 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1bb90 20 20 20 20 20 20 20 61 5b 30 5d 20 3d 20 77 69         a[0] = wi
1bba0 6e 49 6f 65 72 72 52 65 74 72 79 3b 0a 20 20 20  nIoerrRetry;.   
1bbb0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61     }.      if( a
1bbc0 5b 31 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  [1]>0 ){.       
1bbd0 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65   winIoerrRetryDe
1bbe0 6c 61 79 20 3d 20 61 5b 31 5d 3b 0a 20 20 20 20  lay = a[1];.    
1bbf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1bc00 20 61 5b 31 5d 20 3d 20 77 69 6e 49 6f 65 72 72   a[1] = winIoerr
1bc10 52 65 74 72 79 44 65 6c 61 79 3b 0a 20 20 20 20  RetryDelay;.    
1bc20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43    }.      OSTRAC
1bc30 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
1bc40 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
1bc50 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
1bc60 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1bc70 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1bc80 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1bc90 4e 54 4c 5f 57 49 4e 33 32 5f 47 45 54 5f 48 41  NTL_WIN32_GET_HA
1bca0 4e 44 4c 45 3a 20 7b 0a 20 20 20 20 20 20 4c 50  NDLE: {.      LP
1bcb0 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 20 3d 20  HANDLE phFile = 
1bcc0 28 4c 50 48 41 4e 44 4c 45 29 70 41 72 67 3b 0a  (LPHANDLE)pArg;.
1bcd0 20 20 20 20 20 20 2a 70 68 46 69 6c 65 20 3d 20        *phFile = 
1bce0 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 20 20 20 20  pFile->h;.      
1bcf0 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
1bd00 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
1bd10 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
1bd20 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  >h));.      retu
1bd30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1bd40 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
1bd50 45 5f 54 45 53 54 0a 20 20 20 20 63 61 73 65 20  E_TEST.    case 
1bd60 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e  SQLITE_FCNTL_WIN
1bd70 33 32 5f 53 45 54 5f 48 41 4e 44 4c 45 3a 20 7b  32_SET_HANDLE: {
1bd80 0a 20 20 20 20 20 20 4c 50 48 41 4e 44 4c 45 20  .      LPHANDLE 
1bd90 70 68 46 69 6c 65 20 3d 20 28 4c 50 48 41 4e 44  phFile = (LPHAND
1bda0 4c 45 29 70 41 72 67 3b 0a 20 20 20 20 20 20 48  LE)pArg;.      H
1bdb0 41 4e 44 4c 45 20 68 4f 6c 64 46 69 6c 65 20 3d  ANDLE hOldFile =
1bdc0 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 20 20 20   pFile->h;.     
1bdd0 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2a 70 68 46   pFile->h = *phF
1bde0 69 6c 65 3b 0a 20 20 20 20 20 20 2a 70 68 46 69  ile;.      *phFi
1bdf0 6c 65 20 3d 20 68 4f 6c 64 46 69 6c 65 3b 0a 20  le = hOldFile;. 
1be00 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
1be10 43 4e 54 4c 20 6f 6c 64 46 69 6c 65 3d 25 70 2c  CNTL oldFile=%p,
1be20 20 6e 65 77 46 69 6c 65 3d 25 70 2c 20 72 63 3d   newFile=%p, rc=
1be30 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20  SQLITE_OK\n",.  
1be40 20 20 20 20 20 20 20 20 20 20 20 20 20 68 4f 6c               hOl
1be50 64 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29  dFile, pFile->h)
1be60 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1be70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1be80 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
1be90 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45   SQLITE_FCNTL_TE
1bea0 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20  MPFILENAME: {.  
1beb0 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69 6c 65      char *zTFile
1bec0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
1bed0 72 63 20 3d 20 77 69 6e 47 65 74 54 65 6d 70 6e  rc = winGetTempn
1bee0 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66 73 2c  ame(pFile->pVfs,
1bef0 20 26 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20 20   &zTFile);.     
1bf00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1bf10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 28  OK ){.        *(
1bf20 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a 54  char**)pArg = zT
1bf30 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  File;.      }.  
1bf40 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
1bf50 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
1bf60 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %s\n", pFile->h,
1bf70 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
1bf80 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74  rc)));.      ret
1bf90 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 69  urn rc;.    }.#i
1bfa0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
1bfb0 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63 61 73  P_SIZE>0.    cas
1bfc0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d  e SQLITE_FCNTL_M
1bfd0 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20  MAP_SIZE: {.    
1bfe0 20 20 69 36 34 20 6e 65 77 4c 69 6d 69 74 20 3d    i64 newLimit =
1bff0 20 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a 20 20   *(i64*)pArg;.  
1c000 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
1c010 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66  ITE_OK;.      if
1c020 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69 74  ( newLimit>sqlit
1c030 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
1c040 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20 20 20  xMmap ){.       
1c050 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c 69   newLimit = sqli
1c060 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1c070 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d 0a  mxMmap;.      }.
1c080 20 20 20 20 20 20 2a 28 69 36 34 2a 29 70 41 72        *(i64*)pAr
1c090 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  g = pFile->mmapS
1c0a0 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20 69 66  izeMax;.      if
1c0b0 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 26 26  ( newLimit>=0 &&
1c0c0 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46 69 6c 65   newLimit!=pFile
1c0d0 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 26 26  ->mmapSizeMax &&
1c0e0 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63 68 4f 75   pFile->nFetchOu
1c0f0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
1c100 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
1c110 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20  ax = newLimit;. 
1c120 20 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65         if( pFile
1c130 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a  ->mmapSize>0 ){.
1c140 20 20 20 20 20 20 20 20 20 20 77 69 6e 55 6e 6d            winUnm
1c150 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20  apfile(pFile);. 
1c160 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69           rc = wi
1c170 6e 4d 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20  nMapfile(pFile, 
1c180 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  -1);.        }. 
1c190 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54       }.      OST
1c1a0 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
1c1b0 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20  e=%p, rc=%s\n", 
1c1c0 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65  pFile->h, sqlite
1c1d0 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
1c1e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1c1f0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1c200 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46 43  }.  OSTRACE(("FC
1c210 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
1c220 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 5c  SQLITE_NOTFOUND\
1c230 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
1c240 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c250 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 23 69 66  NOTFOUND;.}..#if
1c260 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1c270 57 49 4e 33 32 5f 56 49 53 54 41 5f 53 45 43 54  WIN32_VISTA_SECT
1c280 4f 52 5f 53 49 5a 45 29 20 26 26 20 5c 0a 20 20  OR_SIZE) && \.  
1c290 20 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32    defined(_WIN32
1c2a0 5f 57 49 4e 4e 54 29 20 26 26 20 5f 57 49 4e 33  _WINNT) && _WIN3
1c2b0 32 5f 57 49 4e 4e 54 20 3e 3d 20 5f 57 49 4e 33  2_WINNT >= _WIN3
1c2c0 32 5f 57 49 4e 4e 54 5f 56 49 53 54 41 0a 2f 2a  2_WINNT_VISTA./*
1c2d0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1c2e0 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65  n attempts to de
1c2f0 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 73  termine if the s
1c300 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 72 65  pecified file re
1c310 73 69 64 65 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  sides on the.** 
1c320 73 61 6d 65 20 76 6f 6c 75 6d 65 20 61 73 20 74  same volume as t
1c330 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
1c340 20 72 6f 6f 74 20 64 69 72 65 63 74 6f 72 79 2e   root directory.
1c350 20 20 49 66 20 6e 6f 74 2c 20 74 68 65 20 73 70    If not, the sp
1c360 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
1c370 6d 61 79 20 62 65 20 69 6d 70 61 63 74 65 64 20  may be impacted 
1c380 62 79 20 61 20 68 61 72 64 20 6c 69 6e 6b 2c 20  by a hard link, 
1c390 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 2c 20 6f  symbolic link, o
1c3a0 72 20 72 65 70 61 72 73 65 20 70 6f 69 6e 74 20  r reparse point 
1c3b0 28 65 2e 67 2e 0a 2a 2a 20 6a 75 6e 63 74 69 6f  (e.g..** junctio
1c3c0 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  n)..**.** This f
1c3d0 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75  unction may retu
1c3e0 72 6e 20 66 61 6c 73 65 20 65 76 65 6e 20 77 68  rn false even wh
1c3f0 65 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 6f  en the file is o
1c400 6e 20 74 68 65 20 73 61 6d 65 20 76 6f 6c 75 6d  n the same volum
1c410 65 0a 2a 2a 20 61 73 20 74 68 65 20 63 6f 72 72  e.** as the corr
1c420 65 73 70 6f 6e 64 69 6e 67 20 72 6f 6f 74 20 64  esponding root d
1c430 69 72 65 63 74 6f 72 79 2e 20 20 54 68 69 73 20  irectory.  This 
1c440 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74  function may ret
1c450 75 72 6e 20 74 72 75 65 20 6f 6e 6c 79 0a 2a 2a  urn true only.**
1c460 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   when there is n
1c470 6f 20 64 6f 75 62 74 20 74 68 61 74 20 74 68 65  o doubt that the
1c480 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20   specified file 
1c490 69 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 76  is on the same v
1c4a0 6f 6c 75 6d 65 20 61 73 0a 2a 2a 20 74 68 65 20  olume as.** the 
1c4b0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 72 6f  corresponding ro
1c4c0 6f 74 20 64 69 72 65 63 74 6f 72 79 20 61 73 73  ot directory ass
1c4d0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1c4e0 20 76 6f 6c 75 6d 65 2e 0a 2a 2f 0a 73 74 61 74   volume..*/.stat
1c4f0 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 4f 6e 53  ic BOOL winIsOnS
1c500 61 6d 65 56 6f 6c 75 6d 65 28 77 69 6e 46 69 6c  ameVolume(winFil
1c510 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 57 43 48  e *pFile){.  WCH
1c520 41 52 20 7a 52 6f 6f 74 5b 5d 20 3d 20 4c 22 5f  AR zRoot[] = L"_
1c530 3a 5c 5c 5c 30 22 3b 20 2f 2a 20 75 6e 64 65 72  :\\\0"; /* under
1c540 73 63 6f 72 65 20 77 69 6c 6c 20 62 65 20 64 72  score will be dr
1c550 69 76 65 20 6c 65 74 74 65 72 20 2a 2f 0a 20 20  ive letter */.  
1c560 44 57 4f 52 44 20 64 77 46 69 6c 65 56 6f 6c 75  DWORD dwFileVolu
1c570 6d 65 53 65 72 69 61 6c 4e 75 6d 62 65 72 20 3d  meSerialNumber =
1c580 20 30 3b 0a 20 20 44 57 4f 52 44 20 64 77 52 6f   0;.  DWORD dwRo
1c590 6f 74 56 6f 6c 75 6d 65 53 65 72 69 61 6c 4e 75  otVolumeSerialNu
1c5a0 6d 62 65 72 20 3d 20 30 3b 0a 0a 20 20 69 66 20  mber = 0;..  if 
1c5b0 28 20 21 6f 73 47 65 74 56 6f 6c 75 6d 65 49 6e  ( !osGetVolumeIn
1c5c0 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c  formationByHandl
1c5d0 65 57 28 70 46 69 6c 65 2d 3e 68 2c 20 4e 55 4c  eW(pFile->h, NUL
1c5e0 4c 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  L, 0,.          
1c5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 64                &d
1c610 77 46 69 6c 65 56 6f 6c 75 6d 65 53 65 72 69 61  wFileVolumeSeria
1c620 6c 4e 75 6d 62 65 72 2c 20 4e 55 4c 4c 2c 0a 20  lNumber, NULL,. 
1c630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c650 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 4e 55 4c         NULL, NUL
1c660 4c 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74  L, 0) ){.    ret
1c670 75 72 6e 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 20  urn FALSE;.  }. 
1c680 20 7a 52 6f 6f 74 5b 30 5d 20 3d 20 28 57 43 48   zRoot[0] = (WCH
1c690 41 52 29 70 46 69 6c 65 2d 3e 7a 50 61 74 68 5b  AR)pFile->zPath[
1c6a0 30 5d 3b 20 2f 2a 20 27 41 27 20 74 6f 20 27 5a  0]; /* 'A' to 'Z
1c6b0 27 20 6f 6e 6c 79 2c 20 75 70 70 65 72 2f 6c 6f  ' only, upper/lo
1c6c0 77 65 72 20 63 61 73 65 20 2a 2f 0a 20 20 69 66  wer case */.  if
1c6d0 28 20 21 6f 73 47 65 74 56 6f 6c 75 6d 65 49 6e  ( !osGetVolumeIn
1c6e0 66 6f 72 6d 61 74 69 6f 6e 57 28 7a 52 6f 6f 74  formationW(zRoot
1c6f0 2c 20 4e 55 4c 4c 2c 20 30 2c 20 26 64 77 52 6f  , NULL, 0, &dwRo
1c700 6f 74 56 6f 6c 75 6d 65 53 65 72 69 61 6c 4e 75  otVolumeSerialNu
1c710 6d 62 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20  mber,.          
1c720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c730 20 20 20 20 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c       NULL, NULL,
1c740 20 4e 55 4c 4c 2c 20 30 29 20 29 7b 0a 20 20 20   NULL, 0) ){.   
1c750 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 20   return FALSE;. 
1c760 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 64 77 46   }.  return (dwF
1c770 69 6c 65 56 6f 6c 75 6d 65 53 65 72 69 61 6c 4e  ileVolumeSerialN
1c780 75 6d 62 65 72 20 3d 3d 20 64 77 52 6f 6f 74 56  umber == dwRootV
1c790 6f 6c 75 6d 65 53 65 72 69 61 6c 4e 75 6d 62 65  olumeSerialNumbe
1c7a0 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  r);.}.#endif../*
1c7b0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
1c7c0 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79  ector size in by
1c7d0 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72  tes of the under
1c7e0 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69  lying block devi
1c7f0 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70  ce for.** the sp
1c800 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68  ecified file. Th
1c810 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  is is almost alw
1c820 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62  ays 512 bytes, b
1c830 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72  ut may be.** lar
1c840 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76  ger for some dev
1c850 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  ices..**.** SQLi
1c860 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20  te code assumes 
1c870 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
1c880 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c  nnot fail. It al
1c890 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a  so assumes that.
1c8a0 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20  ** if two files 
1c8b0 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74  are created in t
1c8c0 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73  he same file-sys
1c8d0 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69  tem directory (i
1c8e0 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73  .e..** a databas
1c8f0 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61  e and its journa
1c900 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65  l file) that the
1c910 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
1c920 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65  l be the.** same
1c930 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74   for both..*/.st
1c940 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 63 74  atic int winSect
1c950 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  orSize(sqlite3_f
1c960 69 6c 65 20 2a 69 64 29 7b 0a 23 69 66 20 64 65  ile *id){.#if de
1c970 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57 49 4e  fined(_WIN32_WIN
1c980 4e 54 29 20 26 26 20 5f 57 49 4e 33 32 5f 57 49  NT) && _WIN32_WI
1c990 4e 4e 54 20 3e 3d 20 5f 57 49 4e 33 32 5f 57 49  NNT >= _WIN32_WI
1c9a0 4e 4e 54 5f 57 49 4e 38 0a 20 20 69 66 28 20 6f  NNT_WIN8.  if( o
1c9b0 73 49 73 57 69 6e 38 50 6c 75 73 28 29 20 29 7b  sIsWin8Plus() ){
1c9c0 0a 20 20 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  .    winFile *pF
1c9d0 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
1c9e0 69 64 3b 0a 20 20 20 20 46 49 4c 45 5f 53 54 4f  id;.    FILE_STO
1c9f0 52 41 47 45 5f 49 4e 46 4f 20 69 6e 66 6f 3b 0a  RAGE_INFO info;.
1ca00 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f      memset(&info
1ca10 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 49 4c 45  , 0, sizeof(FILE
1ca20 5f 53 54 4f 52 41 47 45 5f 49 4e 46 4f 29 29 3b  _STORAGE_INFO));
1ca30 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 46 69  .    if( osGetFi
1ca40 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48  leInformationByH
1ca50 61 6e 64 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68  andleEx(pFile->h
1ca60 2c 20 46 69 6c 65 53 74 6f 72 61 67 65 49 6e 66  , FileStorageInf
1ca70 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
1ca80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca90 20 20 20 20 20 20 20 20 20 20 26 69 6e 66 6f 2c            &info,
1caa0 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 20 29   sizeof(info)) )
1cab0 7b 0a 20 20 20 20 20 20 55 4c 4f 4e 47 20 73 69  {.      ULONG si
1cac0 7a 65 20 3d 20 69 6e 66 6f 2e 46 69 6c 65 53 79  ze = info.FileSy
1cad0 73 74 65 6d 45 66 66 65 63 74 69 76 65 50 68 79  stemEffectivePhy
1cae0 73 69 63 61 6c 42 79 74 65 73 50 65 72 53 65 63  sicalBytesPerSec
1caf0 74 6f 72 46 6f 72 41 74 6f 6d 69 63 69 74 79 3b  torForAtomicity;
1cb00 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1cb10 22 53 45 43 54 4f 52 20 66 69 6c 65 3d 25 70 2c  "SECTOR file=%p,
1cb20 20 73 69 7a 65 3d 25 6c 75 5c 6e 22 2c 20 70 46   size=%lu\n", pF
1cb30 69 6c 65 2d 3e 68 2c 20 73 69 7a 65 29 29 3b 0a  ile->h, size));.
1cb40 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e 30        if( size>0
1cb50 20 26 26 20 73 69 7a 65 3c 3d 32 31 34 37 34 38   && size<=214748
1cb60 33 36 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20  3647 ){.        
1cb70 72 65 74 75 72 6e 20 28 69 6e 74 29 73 69 7a 65  return (int)size
1cb80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
1cb90 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
1cba0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
1cbb0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
1cbc0 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f        winLogErro
1cbd0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  r(SQLITE_IOERR_F
1cbe0 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  STAT, pFile->las
1cbf0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
1cc00 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 65            "winSe
1cc10 63 74 6f 72 53 69 7a 65 31 22 2c 20 70 46 69 6c  ctorSize1", pFil
1cc20 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  e->zPath);.    }
1cc30 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
1cc40 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1cc50 57 49 4e 33 32 5f 56 49 53 54 41 5f 53 45 43 54  WIN32_VISTA_SECT
1cc60 4f 52 5f 53 49 5a 45 29 20 26 26 20 5c 0a 20 20  OR_SIZE) && \.  
1cc70 20 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32    defined(_WIN32
1cc80 5f 57 49 4e 4e 54 29 20 26 26 20 5f 57 49 4e 33  _WINNT) && _WIN3
1cc90 32 5f 57 49 4e 4e 54 20 3e 3d 20 5f 57 49 4e 33  2_WINNT >= _WIN3
1cca0 32 5f 57 49 4e 4e 54 5f 56 49 53 54 41 0a 20 20  2_WINNT_VISTA.  
1ccb0 69 66 28 20 6f 73 49 73 56 69 73 74 61 50 6c 75  if( osIsVistaPlu
1ccc0 73 28 29 20 29 7b 0a 20 20 20 20 77 69 6e 46 69  s() ){.    winFi
1ccd0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
1cce0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 69 66  File*)id;.    if
1ccf0 28 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74  ( winIsDriveLett
1cd00 65 72 41 6e 64 43 6f 6c 6f 6e 28 70 46 69 6c 65  erAndColon(pFile
1cd10 2d 3e 7a 50 61 74 68 29 20 26 26 20 77 69 6e 49  ->zPath) && winI
1cd20 73 4f 6e 53 61 6d 65 56 6f 6c 75 6d 65 28 70 46  sOnSameVolume(pF
1cd30 69 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 57 43  ile) ){.      WC
1cd40 48 41 52 20 7a 44 69 73 6b 5b 5d 20 3d 20 4c 22  HAR zDisk[] = L"
1cd50 5c 5c 5c 5c 2e 5c 5c 5f 3a 5c 30 22 3b 20 2f 2a  \\\\.\\_:\0"; /*
1cd60 20 75 6e 64 65 72 73 63 6f 72 65 20 77 69 6c 6c   underscore will
1cd70 20 62 65 20 64 72 69 76 65 20 6c 65 74 74 65 72   be drive letter
1cd80 20 2a 2f 0a 20 20 20 20 20 20 48 41 4e 44 4c 45   */.      HANDLE
1cd90 20 68 44 69 73 6b 3b 0a 20 20 20 20 20 20 7a 44   hDisk;.      zD
1cda0 69 73 6b 5b 34 5d 20 3d 20 28 57 43 48 41 52 29  isk[4] = (WCHAR)
1cdb0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 5b 30 5d 3b  pFile->zPath[0];
1cdc0 20 2f 2a 20 27 41 27 20 74 6f 20 27 5a 27 20 6f   /* 'A' to 'Z' o
1cdd0 6e 6c 79 2c 20 75 70 70 65 72 2f 6c 6f 77 65 72  nly, upper/lower
1cde0 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 61   case */.      a
1cdf0 73 73 65 72 74 28 20 28 7a 44 69 73 6b 5b 34 5d  ssert( (zDisk[4]
1ce00 3e 3d 4c 27 41 27 20 26 26 20 7a 44 69 73 6b 5b  >=L'A' && zDisk[
1ce10 34 5d 3c 3d 4c 27 5a 27 29 0a 20 20 20 20 20 20  4]<=L'Z').      
1ce20 20 20 20 20 20 7c 7c 20 28 7a 44 69 73 6b 5b 34       || (zDisk[4
1ce30 5d 3e 3d 4c 27 61 27 20 26 26 20 7a 44 69 73 6b  ]>=L'a' && zDisk
1ce40 5b 34 5d 3c 3d 4c 27 7a 27 29 0a 20 20 20 20 20  [4]<=L'z').     
1ce50 20 29 3b 0a 20 20 20 20 20 20 68 44 69 73 6b 20   );.      hDisk 
1ce60 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 57 28  = osCreateFileW(
1ce70 7a 44 69 73 6b 2c 20 30 2c 20 46 49 4c 45 5f 53  zDisk, 0, FILE_S
1ce80 48 41 52 45 5f 52 45 41 44 20 7c 20 46 49 4c 45  HARE_READ | FILE
1ce90 5f 53 48 41 52 45 5f 57 52 49 54 45 2c 20 4e 55  _SHARE_WRITE, NU
1cea0 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
1ceb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cec0 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47 2c 20 46  OPEN_EXISTING, F
1ced0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f  ILE_ATTRIBUTE_NO
1cee0 52 4d 41 4c 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  RMAL, NULL);.   
1cef0 20 20 20 69 66 28 20 68 44 69 73 6b 21 3d 4e 55     if( hDisk!=NU
1cf00 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 53 54  LL ){.        ST
1cf10 4f 52 41 47 45 5f 50 52 4f 50 45 52 54 59 5f 51  ORAGE_PROPERTY_Q
1cf20 55 45 52 59 20 71 75 65 72 79 3b 0a 20 20 20 20  UERY query;.    
1cf30 20 20 20 20 53 54 4f 52 41 47 45 5f 41 43 43 45      STORAGE_ACCE
1cf40 53 53 5f 41 4c 49 47 4e 4d 45 4e 54 5f 44 45 53  SS_ALIGNMENT_DES
1cf50 43 52 49 50 54 4f 52 20 61 6c 69 67 6e 6d 65 6e  CRIPTOR alignmen
1cf60 74 3b 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44  t;.        DWORD
1cf70 20 62 79 74 65 73 20 3d 20 30 3b 0a 20 20 20 20   bytes = 0;.    
1cf80 20 20 20 20 6d 65 6d 73 65 74 28 26 71 75 65 72      memset(&quer
1cf90 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 54 4f  y, 0, sizeof(STO
1cfa0 52 41 47 45 5f 50 52 4f 50 45 52 54 59 5f 51 55  RAGE_PROPERTY_QU
1cfb0 45 52 59 29 29 3b 0a 20 20 20 20 20 20 20 20 6d  ERY));.        m
1cfc0 65 6d 73 65 74 28 26 61 6c 69 67 6e 6d 65 6e 74  emset(&alignment
1cfd0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 54 4f 52  , 0, sizeof(STOR
1cfe0 41 47 45 5f 41 43 43 45 53 53 5f 41 4c 49 47 4e  AGE_ACCESS_ALIGN
1cff0 4d 45 4e 54 5f 44 45 53 43 52 49 50 54 4f 52 29  MENT_DESCRIPTOR)
1d000 29 3b 0a 20 20 20 20 20 20 20 20 71 75 65 72 79  );.        query
1d010 2e 51 75 65 72 79 54 79 70 65 20 20 3d 20 50 72  .QueryType  = Pr
1d020 6f 70 65 72 74 79 53 74 61 6e 64 61 72 64 51 75  opertyStandardQu
1d030 65 72 79 3b 0a 20 20 20 20 20 20 20 20 71 75 65  ery;.        que
1d040 72 79 2e 50 72 6f 70 65 72 74 79 49 64 20 3d 20  ry.PropertyId = 
1d050 53 74 6f 72 61 67 65 41 63 63 65 73 73 41 6c 69  StorageAccessAli
1d060 67 6e 6d 65 6e 74 50 72 6f 70 65 72 74 79 3b 0a  gnmentProperty;.
1d070 20 20 20 20 20 20 20 20 69 66 28 20 6f 73 44 65          if( osDe
1d080 76 69 63 65 49 6f 43 6f 6e 74 72 6f 6c 28 68 44  viceIoControl(hD
1d090 69 73 6b 2c 20 49 4f 43 54 4c 5f 53 54 4f 52 41  isk, IOCTL_STORA
1d0a0 47 45 5f 51 55 45 52 59 5f 50 52 4f 50 45 52 54  GE_QUERY_PROPERT
1d0b0 59 2c 20 26 71 75 65 72 79 2c 0a 20 20 20 20 20  Y, &query,.     
1d0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0d0 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
1d0e0 53 54 4f 52 41 47 45 5f 50 52 4f 50 45 52 54 59  STORAGE_PROPERTY
1d0f0 5f 51 55 45 52 59 29 2c 20 26 61 6c 69 67 6e 6d  _QUERY), &alignm
1d100 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ent,.           
1d110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d120 20 20 20 73 69 7a 65 6f 66 28 53 54 4f 52 41 47     sizeof(STORAG
1d130 45 5f 41 43 43 45 53 53 5f 41 4c 49 47 4e 4d 45  E_ACCESS_ALIGNME
1d140 4e 54 5f 44 45 53 43 52 49 50 54 4f 52 29 2c 0a  NT_DESCRIPTOR),.
1d150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 62                &b
1d170 79 74 65 73 2c 20 4e 55 4c 4c 29 20 29 7b 0a 20  ytes, NULL) ){. 
1d180 20 20 20 20 20 20 20 20 20 44 57 4f 52 44 20 73           DWORD s
1d190 69 7a 65 20 3d 20 61 6c 69 67 6e 6d 65 6e 74 2e  ize = alignment.
1d1a0 42 79 74 65 73 50 65 72 50 68 79 73 69 63 61 6c  BytesPerPhysical
1d1b0 53 65 63 74 6f 72 3b 0a 20 20 20 20 20 20 20 20  Sector;.        
1d1c0 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 43 54    OSTRACE(("SECT
1d1d0 4f 52 20 66 69 6c 65 3d 25 70 2c 20 73 69 7a 65  OR file=%p, size
1d1e0 3d 25 6c 75 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  =%lu\n", pFile->
1d1f0 68 2c 20 73 69 7a 65 29 29 3b 0a 20 20 20 20 20  h, size));.     
1d200 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e 30 20       if( size>0 
1d210 26 26 20 73 69 7a 65 3c 3d 32 31 34 37 34 38 33  && size<=2147483
1d220 36 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20  647 ){.         
1d230 20 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73     return (int)s
1d240 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ize;.          }
1d250 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1d260 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
1d270 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
1d280 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
1d290 20 20 20 20 20 20 20 20 20 77 69 6e 4c 6f 67 45           winLogE
1d2a0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1d2b0 52 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e  R_FSTAT, pFile->
1d2c0 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
1d2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2e0 20 22 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 32   "winSectorSize2
1d2f0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
1d300 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1d310 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
1d320 65 28 68 44 69 73 6b 29 3b 0a 20 20 20 20 20 20  e(hDisk);.      
1d330 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
1d340 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
1d350 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
1d360 28 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 4c  ();.        winL
1d370 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1d380 4f 45 52 52 5f 46 53 54 41 54 2c 20 70 46 69 6c  OERR_FSTAT, pFil
1d390 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
1d3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3b0 20 20 22 77 69 6e 53 65 63 74 6f 72 53 69 7a 65    "winSectorSize
1d3c0 33 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  3", pFile->zPath
1d3d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1d3e0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 28  .  }.#endif..  (
1d3f0 76 6f 69 64 29 69 64 3b 0a 20 20 72 65 74 75 72  void)id;.  retur
1d400 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  n SQLITE_DEFAULT
1d410 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a  _SECTOR_SIZE;.}.
1d420 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1d430 76 65 63 74 6f 72 20 6f 66 20 64 65 76 69 63 65  vector of device
1d440 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
1d450 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d460 77 69 6e 44 65 76 69 63 65 43 68 61 72 61 63 74  winDeviceCharact
1d470 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33  eristics(sqlite3
1d480 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 77 69  _file *id){.  wi
1d490 6e 46 69 6c 65 20 2a 70 20 3d 20 28 77 69 6e 46  nFile *p = (winF
1d4a0 69 6c 65 2a 29 69 64 3b 0a 20 20 72 65 74 75 72  ile*)id;.  retur
1d4b0 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55  n SQLITE_IOCAP_U
1d4c0 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
1d4d0 4f 50 45 4e 20 7c 0a 20 20 20 20 20 20 20 20 20  OPEN |.         
1d4e0 28 28 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ((p->ctrlFlags &
1d4f0 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 29 3f 53   WINFILE_PSOW)?S
1d500 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45  QLITE_IOCAP_POWE
1d510 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a  RSAFE_OVERWRITE:
1d520 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e  0);.}../*.** Win
1d530 64 6f 77 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 6c  dows will only l
1d540 65 74 20 79 6f 75 20 63 72 65 61 74 65 20 66 69  et you create fi
1d550 6c 65 20 76 69 65 77 20 6d 61 70 70 69 6e 67 73  le view mappings
1d560 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74 69 6f  .** on allocatio
1d570 6e 20 73 69 7a 65 20 67 72 61 6e 75 6c 61 72 69  n size granulari
1d580 74 79 20 62 6f 75 6e 64 61 72 69 65 73 2e 0a 2a  ty boundaries..*
1d590 2a 20 44 75 72 69 6e 67 20 73 71 6c 69 74 65 33  * During sqlite3
1d5a0 5f 6f 73 5f 69 6e 69 74 28 29 20 77 65 20 64 6f  _os_init() we do
1d5b0 20 61 20 47 65 74 53 79 73 74 65 6d 49 6e 66 6f   a GetSystemInfo
1d5c0 28 29 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65  ().** to get the
1d5d0 20 67 72 61 6e 75 6c 61 72 69 74 79 20 73 69 7a   granularity siz
1d5e0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 59 53  e..*/.static SYS
1d5f0 54 45 4d 5f 49 4e 46 4f 20 77 69 6e 53 79 73 49  TEM_INFO winSysI
1d600 6e 66 6f 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  nfo;..#ifndef SQ
1d610 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f  LITE_OMIT_WAL../
1d620 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
1d630 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20  tions to obtain 
1d640 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74  and relinquish t
1d650 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e  he global mutex.
1d660 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d   The.** global m
1d670 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f 20  utex is used to 
1d680 70 72 6f 74 65 63 74 20 74 68 65 20 77 69 6e 4c  protect the winL
1d690 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20  ockInfo objects 
1d6a0 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20  used by.** this 
1d6b0 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69  file, all of whi
1d6c0 63 68 20 6d 61 79 20 62 65 20 73 68 61 72 65 64  ch may be shared
1d6d0 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 74 68 72   by multiple thr
1d6e0 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63  eads..**.** Func
1d6f0 74 69 6f 6e 20 77 69 6e 53 68 6d 4d 75 74 65 78  tion winShmMutex
1d700 48 65 6c 64 28 29 20 69 73 20 75 73 65 64 20 74  Held() is used t
1d710 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20  o assert() that 
1d720 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
1d730 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68 65 6e  .** is held when
1d740 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20   required. This 
1d750 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
1d760 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66   used as part of
1d770 20 61 73 73 65 72 74 28 29 0a 2a 2a 20 73 74 61   assert().** sta
1d780 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a  tements. e.g..**
1d790 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 45 6e 74 65  .**   winShmEnte
1d7a0 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20 20  rMutex().**     
1d7b0 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75  assert( winShmMu
1d7c0 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20  texHeld() );.** 
1d7d0 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74    winShmLeaveMut
1d7e0 65 78 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ex().*/.static v
1d7f0 6f 69 64 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  oid winShmEnterM
1d800 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71  utex(void){.  sq
1d810 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1d820 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  r(sqlite3MutexAl
1d830 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
1d840 5f 53 54 41 54 49 43 5f 56 46 53 31 29 29 3b 0a  _STATIC_VFS1));.
1d850 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  }.static void wi
1d860 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 76  nShmLeaveMutex(v
1d870 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
1d880 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
1d890 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
1d8a0 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
1d8b0 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 23 69 66 6e  C_VFS1));.}.#ifn
1d8c0 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69  def NDEBUG.stati
1d8d0 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 75 74 65  c int winShmMute
1d8e0 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20  xHeld(void) {.  
1d8f0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d  return sqlite3_m
1d900 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65  utex_held(sqlite
1d910 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
1d920 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
1d930 56 46 53 31 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  VFS1));.}.#endif
1d940 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75  ../*.** Object u
1d950 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sed to represent
1d960 20 61 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 6f   a single file o
1d970 70 65 6e 65 64 20 61 6e 64 20 6d 6d 61 70 70 65  pened and mmappe
1d980 64 20 74 6f 20 70 72 6f 76 69 64 65 0a 2a 2a 20  d to provide.** 
1d990 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20  shared memory.  
1d9a0 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68  When multiple th
1d9b0 72 65 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65  reads all refere
1d9c0 6e 63 65 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20  nce the same.** 
1d9d0 6c 6f 67 2d 73 75 6d 6d 61 72 79 2c 20 65 61 63  log-summary, eac
1d9e0 68 20 74 68 72 65 61 64 20 68 61 73 20 69 74 73  h thread has its
1d9f0 20 6f 77 6e 20 77 69 6e 46 69 6c 65 20 6f 62 6a   own winFile obj
1da00 65 63 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c  ect, but they al
1da10 6c 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20  l.** point to a 
1da20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 20  single instance 
1da30 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 2e 20  of this object. 
1da40 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1da50 20 65 61 63 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d   each.** log-sum
1da60 6d 61 72 79 20 69 73 20 6f 70 65 6e 65 64 20 6f  mary is opened o
1da70 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f  nly once per pro
1da80 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e 53  cess..**.** winS
1da90 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75  hmMutexHeld() mu
1daa0 73 74 20 62 65 20 74 72 75 65 20 77 68 65 6e 20  st be true when 
1dab0 63 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74  creating or dest
1dac0 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f  roying.** this o
1dad0 62 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72  bject or while r
1dae0 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1daf0 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
1db00 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  fields:.**.**   
1db10 20 20 20 6e 52 65 66 0a 2a 2a 20 20 20 20 20 20     nRef.**      
1db20 70 4e 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20  pNext.**.** The 
1db30 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
1db40 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61   are read-only a
1db50 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20  fter the object 
1db60 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a  is created:.**.*
1db70 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20  *      fid.**   
1db80 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a     zFilename.**.
1db90 2a 2a 20 45 69 74 68 65 72 20 77 69 6e 53 68 6d  ** Either winShm
1dba0 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20  Node.mutex must 
1dbb0 62 65 20 68 65 6c 64 20 6f 72 20 77 69 6e 53 68  be held or winSh
1dbc0 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e  mNode.nRef==0 an
1dbd0 64 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78  d.** winShmMutex
1dbe0 48 65 6c 64 28 29 20 69 73 20 74 72 75 65 20 77  Held() is true w
1dbf0 68 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77  hen reading or w
1dc00 72 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72  riting any other
1dc10 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69   field.** in thi
1dc20 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  s structure..**.
1dc30 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d  */.struct winShm
1dc40 4e 6f 64 65 20 7b 0a 20 20 73 71 6c 69 74 65 33  Node {.  sqlite3
1dc50 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20  _mutex *mutex;  
1dc60 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20      /* Mutex to 
1dc70 61 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65  access this obje
1dc80 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  ct */.  char *zF
1dc90 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
1dca0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1dcb0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 46  e file */.  winF
1dcc0 69 6c 65 20 68 46 69 6c 65 3b 20 20 20 20 20 20  ile hFile;      
1dcd0 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68         /* File h
1dce0 61 6e 64 6c 65 20 66 72 6f 6d 20 77 69 6e 4f 70  andle from winOp
1dcf0 65 6e 20 2a 2f 0a 0a 20 20 69 6e 74 20 73 7a 52  en */..  int szR
1dd00 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
1dd10 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73      /* Size of s
1dd20 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
1dd30 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ions */.  int nR
1dd40 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
1dd50 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1dd60 61 72 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a  array apRegion *
1dd70 2f 0a 20 20 73 74 72 75 63 74 20 53 68 6d 52 65  /.  struct ShmRe
1dd80 67 69 6f 6e 20 7b 0a 20 20 20 20 48 41 4e 44 4c  gion {.    HANDL
1dd90 45 20 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20  E hMap;         
1dda0 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64      /* File hand
1ddb0 6c 65 20 66 72 6f 6d 20 43 72 65 61 74 65 46 69  le from CreateFi
1ddc0 6c 65 4d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 20  leMapping */.   
1ddd0 20 76 6f 69 64 20 2a 70 4d 61 70 3b 0a 20 20 7d   void *pMap;.  }
1dde0 20 2a 61 52 65 67 69 6f 6e 3b 0a 20 20 44 57 4f   *aRegion;.  DWO
1ddf0 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20  RD lastErrno;   
1de00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
1de10 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f  indows errno fro
1de20 6d 20 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65  m the last I/O e
1de30 72 72 6f 72 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e  rror */..  int n
1de40 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
1de50 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1de60 6f 66 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74  of winShm object
1de70 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  s pointing to th
1de80 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  is */.  winShm *
1de90 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  pFirst;         
1dea0 20 20 20 2f 2a 20 41 6c 6c 20 77 69 6e 53 68 6d     /* All winShm
1deb0 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e   objects pointin
1dec0 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77  g to this */.  w
1ded0 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 78 74  inShmNode *pNext
1dee0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78  ;         /* Nex
1def0 74 20 69 6e 20 6c 69 73 74 20 6f 66 20 61 6c 6c  t in list of all
1df00 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65   winShmNode obje
1df10 63 74 73 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  cts */.#if defin
1df20 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
1df30 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
1df40 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45  TE_HAVE_OS_TRACE
1df50 29 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64  ).  u8 nextShmId
1df60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1df70 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65  * Next available
1df80 20 77 69 6e 53 68 6d 2e 69 64 20 76 61 6c 75 65   winShm.id value
1df90 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
1dfa0 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 61 72  *.** A global ar
1dfb0 72 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68  ray of all winSh
1dfc0 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e 0a 2a  mNode objects..*
1dfd0 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68 6d 4d  *.** The winShmM
1dfe0 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20  utexHeld() must 
1dff0 62 65 20 74 72 75 65 20 77 68 69 6c 65 20 72 65  be true while re
1e000 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1e010 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a 73   this list..*/.s
1e020 74 61 74 69 63 20 77 69 6e 53 68 6d 4e 6f 64 65  tatic winShmNode
1e030 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74   *winShmNodeList
1e040 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72   = 0;../*.** Str
1e050 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74 65  ucture used inte
1e060 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56  rnally by this V
1e070 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  FS to record the
1e080 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20   state of an.** 
1e090 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  open shared memo
1e0a0 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  ry connection..*
1e0b0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
1e0c0 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e  ng fields are in
1e0d0 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74  itialized when t
1e0e0 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72  his object is cr
1e0f0 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65  eated and.** are
1e100 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65   read-only there
1e110 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  after:.**.**    
1e120 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 0a  winShm.pShmNode.
1e130 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 69 64 0a  **    winShm.id.
1e140 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20  **.** All other 
1e150 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f  fields are read/
1e160 77 72 69 74 65 2e 20 20 54 68 65 20 77 69 6e 53  write.  The winS
1e170 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  hm.pShmNode->mut
1e180 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  ex must be held.
1e190 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69  ** while accessi
1e1a0 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74  ng any read/writ
1e1b0 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72  e fields..*/.str
1e1c0 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a 20 20 77  uct winShm {.  w
1e1d0 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
1e1e0 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  ode;      /* The
1e1f0 20 75 6e 64 65 72 6c 79 69 6e 67 20 77 69 6e 53   underlying winS
1e200 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f  hmNode object */
1e210 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e 65 78 74  .  winShm *pNext
1e220 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1e230 20 4e 65 78 74 20 77 69 6e 53 68 6d 20 77 69 74   Next winShm wit
1e240 68 20 74 68 65 20 73 61 6d 65 20 77 69 6e 53 68  h the same winSh
1e250 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61  mNode */.  u8 ha
1e260 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20  sMutex;         
1e270 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1e280 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 77 69 6e   holding the win
1e290 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f  ShmNode mutex */
1e2a0 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d 61 73  .  u16 sharedMas
1e2b0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k;            /*
1e2c0 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20   Mask of shared 
1e2d0 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
1e2e0 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20  u16 exclMask;   
1e2f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1e300 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
1e310 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23 69  locks held */.#i
1e320 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1e330 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
1e340 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f  ed(SQLITE_HAVE_O
1e350 53 5f 54 52 41 43 45 29 0a 20 20 75 38 20 69 64  S_TRACE).  u8 id
1e360 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e370 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74        /* Id of t
1e380 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
1e390 69 74 68 20 69 74 73 20 77 69 6e 53 68 6d 4e 6f  ith its winShmNo
1e3a0 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  de */.#endif.};.
1e3b0 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73  ./*.** Constants
1e3c0 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
1e3d0 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e  g.*/.#define WIN
1e3e0 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32 32  _SHM_BASE   ((22
1e3f0 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
1e400 4b 29 2a 34 29 20 20 20 20 20 20 20 20 2f 2a 20  K)*4)        /* 
1e410 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20  first lock byte 
1e420 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53  */.#define WIN_S
1e430 48 4d 5f 44 4d 53 20 20 20 20 28 57 49 4e 5f 53  HM_DMS    (WIN_S
1e440 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53  HM_BASE+SQLITE_S
1e450 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65  HM_NLOCK)  /* de
1e460 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a  adman switch */.
1e470 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 64 76  ./*.** Apply adv
1e480 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20  isory locks for 
1e490 61 6c 6c 20 6e 20 62 79 74 65 73 20 62 65 67 69  all n bytes begi
1e4a0 6e 6e 69 6e 67 20 61 74 20 6f 66 73 74 2e 0a 2a  nning at ofst..*
1e4b0 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 53 48 4d  /.#define WINSHM
1e4c0 5f 55 4e 4c 43 4b 20 20 31 0a 23 64 65 66 69 6e  _UNLCK  1.#defin
1e4d0 65 20 57 49 4e 53 48 4d 5f 52 44 4c 43 4b 20 20  e WINSHM_RDLCK  
1e4e0 32 0a 23 64 65 66 69 6e 65 20 57 49 4e 53 48 4d  2.#define WINSHM
1e4f0 5f 57 52 4c 43 4b 20 20 33 0a 73 74 61 74 69 63  _WRLCK  3.static
1e500 20 69 6e 74 20 77 69 6e 53 68 6d 53 79 73 74 65   int winShmSyste
1e510 6d 4c 6f 63 6b 28 0a 20 20 77 69 6e 53 68 6d 4e  mLock(.  winShmN
1e520 6f 64 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 2f  ode *pFile,    /
1e530 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f  * Apply locks to
1e540 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65   this open share
1e550 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d-memory segment
1e560 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79   */.  int lockTy
1e570 70 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57  pe,         /* W
1e580 49 4e 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e  INSHM_UNLCK, WIN
1e590 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20 57 49  SHM_RDLCK, or WI
1e5a0 4e 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20  NSHM_WRLCK */.  
1e5b0 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
1e5c0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1e5d0 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74 6f  to first byte to
1e5e0 20 62 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63   be locked/unloc
1e5f0 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  ked */.  int nBy
1e600 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  te             /
1e610 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1e620 73 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c  s to lock or unl
1e630 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ock */.){.  int 
1e640 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rc = 0;         
1e650 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
1e660 20 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63   form Lock/Unloc
1e670 6b 46 69 6c 65 45 78 28 29 20 2a 2f 0a 0a 20 20  kFileEx() */..  
1e680 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68 65  /* Access to the
1e690 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65   winShmNode obje
1e6a0 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64  ct is serialized
1e6b0 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a   by the caller *
1e6c0 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
1e6d0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1e6e0 46 69 6c 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20  File->mutex) || 
1e6f0 70 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  pFile->nRef==0 )
1e700 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  ;..  OSTRACE(("S
1e710 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  HM-LOCK file=%p,
1e720 20 6c 6f 63 6b 3d 25 64 2c 20 6f 66 66 73 65 74   lock=%d, offset
1e730 3d 25 64 2c 20 73 69 7a 65 3d 25 64 5c 6e 22 2c  =%d, size=%d\n",
1e740 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
1e750 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 6c 6f 63 6b  e->hFile.h, lock
1e760 54 79 70 65 2c 20 6f 66 73 74 2c 20 6e 42 79 74  Type, ofst, nByt
1e770 65 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61  e));..  /* Relea
1e780 73 65 2f 41 63 71 75 69 72 65 20 74 68 65 20 73  se/Acquire the s
1e790 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b  ystem-level lock
1e7a0 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79   */.  if( lockTy
1e7b0 70 65 3d 3d 57 49 4e 53 48 4d 5f 55 4e 4c 43 4b  pe==WINSHM_UNLCK
1e7c0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   ){.    rc = win
1e7d0 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  UnlockFile(&pFil
1e7e0 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 6f 66 73 74  e->hFile.h, ofst
1e7f0 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a  , 0, nByte, 0);.
1e800 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1e810 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c  Initialize the l
1e820 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72  ocking parameter
1e830 73 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 64  s */.    DWORD d
1e840 77 46 6c 61 67 73 20 3d 20 4c 4f 43 4b 46 49 4c  wFlags = LOCKFIL
1e850 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
1e860 4c 59 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b  LY;.    if( lock
1e870 54 79 70 65 20 3d 3d 20 57 49 4e 53 48 4d 5f 57  Type == WINSHM_W
1e880 52 4c 43 4b 20 29 20 64 77 46 6c 61 67 73 20 7c  RLCK ) dwFlags |
1e890 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55  = LOCKFILE_EXCLU
1e8a0 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72  SIVE_LOCK;.    r
1e8b0 63 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28  c = winLockFile(
1e8c0 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c  &pFile->hFile.h,
1e8d0 20 64 77 46 6c 61 67 73 2c 20 6f 66 73 74 2c 20   dwFlags, ofst, 
1e8e0 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20  0, nByte, 0);.  
1e8f0 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 20 30 20  }..  if( rc!= 0 
1e900 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
1e910 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
1e920 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
1e930 72 72 6e 6f 20 3d 20 20 6f 73 47 65 74 4c 61 73  rrno =  osGetLas
1e940 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 63  tError();.    rc
1e950 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
1e960 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28    }..  OSTRACE((
1e970 22 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25  "SHM-LOCK file=%
1e980 70 2c 20 66 75 6e 63 3d 25 73 2c 20 65 72 72 6e  p, func=%s, errn
1e990 6f 3d 25 6c 75 2c 20 72 63 3d 25 73 5c 6e 22 2c  o=%lu, rc=%s\n",
1e9a0 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
1e9b0 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 28 6c 6f 63  e->hFile.h, (loc
1e9c0 6b 54 79 70 65 20 3d 3d 20 57 49 4e 53 48 4d 5f  kType == WINSHM_
1e9d0 55 4e 4c 43 4b 29 20 3f 20 22 77 69 6e 55 6e 6c  UNLCK) ? "winUnl
1e9e0 6f 63 6b 46 69 6c 65 22 20 3a 0a 20 20 20 20 20  ockFile" :.     
1e9f0 20 20 20 20 20 20 22 77 69 6e 4c 6f 63 6b 46 69        "winLockFi
1ea00 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  le", pFile->last
1ea10 45 72 72 6e 6f 2c 20 73 71 6c 69 74 65 33 45 72  Errno, sqlite3Er
1ea20 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 0a 20 20  rName(rc)));..  
1ea30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1ea40 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
1ea50 63 65 73 20 74 6f 20 56 46 53 20 6d 65 74 68 6f  ces to VFS metho
1ea60 64 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ds */.static int
1ea70 20 77 69 6e 4f 70 65 6e 28 73 71 6c 69 74 65 33   winOpen(sqlite3
1ea80 5f 76 66 73 2a 2c 63 6f 6e 73 74 20 63 68 61 72  _vfs*,const char
1ea90 2a 2c 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  *,sqlite3_file*,
1eaa0 69 6e 74 2c 69 6e 74 2a 29 3b 0a 73 74 61 74 69  int,int*);.stati
1eab0 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28  c int winDelete(
1eac0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 63 6f  sqlite3_vfs *,co
1ead0 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a  nst char*,int);.
1eae0 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65  ./*.** Purge the
1eaf0 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20   winShmNodeList 
1eb00 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72  list of all entr
1eb10 69 65 73 20 77 69 74 68 20 77 69 6e 53 68 6d 4e  ies with winShmN
1eb20 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a  ode.nRef==0..**.
1eb30 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
1eb40 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f   VFS shared-memo
1eb50 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73  ry method; it is
1eb60 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74   a utility funct
1eb70 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79  ion called.** by
1eb80 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f   VFS shared-memo
1eb90 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73  ry methods..*/.s
1eba0 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68  tatic void winSh
1ebb0 6d 50 75 72 67 65 28 73 71 6c 69 74 65 33 5f 76  mPurge(sqlite3_v
1ebc0 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 64 65  fs *pVfs, int de
1ebd0 6c 65 74 65 46 6c 61 67 29 7b 0a 20 20 77 69 6e  leteFlag){.  win
1ebe0 53 68 6d 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20 20  ShmNode **pp;.  
1ebf0 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20  winShmNode *p;. 
1ec00 20 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d   assert( winShmM
1ec10 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
1ec20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55  OSTRACE(("SHM-PU
1ec30 52 47 45 20 70 69 64 3d 25 6c 75 2c 20 64 65 6c  RGE pid=%lu, del
1ec40 65 74 65 46 6c 61 67 3d 25 64 5c 6e 22 2c 0a 20  eteFlag=%d\n",. 
1ec50 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1ec60 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1ec70 29 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 29 3b  ), deleteFlag));
1ec80 0a 20 20 70 70 20 3d 20 26 77 69 6e 53 68 6d 4e  .  pp = &winShmN
1ec90 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65  odeList;.  while
1eca0 28 20 28 70 20 3d 20 2a 70 70 29 21 3d 30 20 29  ( (p = *pp)!=0 )
1ecb0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65  {.    if( p->nRe
1ecc0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  f==0 ){.      in
1ecd0 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t i;.      if( p
1ece0 2d 3e 6d 75 74 65 78 20 29 7b 20 73 71 6c 69 74  ->mutex ){ sqlit
1ecf0 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d  e3_mutex_free(p-
1ed00 3e 6d 75 74 65 78 29 3b 20 7d 0a 20 20 20 20 20  >mutex); }.     
1ed10 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
1ed20 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Region; i++){.  
1ed30 20 20 20 20 20 20 42 4f 4f 4c 20 62 52 63 20 3d        BOOL bRc =
1ed40 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69   osUnmapViewOfFi
1ed50 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d  le(p->aRegion[i]
1ed60 2e 70 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20  .pMap);.        
1ed70 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55  OSTRACE(("SHM-PU
1ed80 52 47 45 2d 55 4e 4d 41 50 20 70 69 64 3d 25 6c  RGE-UNMAP pid=%l
1ed90 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20 72 63  u, region=%d, rc
1eda0 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
1edb0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1edc0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1edd0 2c 20 69 2c 20 62 52 63 20 3f 20 22 6f 6b 22 20  , i, bRc ? "ok" 
1ede0 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
1edf0 20 20 20 20 20 20 55 4e 55 53 45 44 5f 56 41 52        UNUSED_VAR
1ee00 49 41 42 4c 45 5f 56 41 4c 55 45 28 62 52 63 29  IABLE_VALUE(bRc)
1ee10 3b 0a 20 20 20 20 20 20 20 20 62 52 63 20 3d 20  ;.        bRc = 
1ee20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d  osCloseHandle(p-
1ee30 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70  >aRegion[i].hMap
1ee40 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41  );.        OSTRA
1ee50 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45 2d 43  CE(("SHM-PURGE-C
1ee60 4c 4f 53 45 20 70 69 64 3d 25 6c 75 2c 20 72 65  LOSE pid=%lu, re
1ee70 67 69 6f 6e 3d 25 64 2c 20 72 63 3d 25 73 5c 6e  gion=%d, rc=%s\n
1ee80 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1ee90 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1eea0 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 20  ProcessId(), i, 
1eeb0 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  bRc ? "ok" : "fa
1eec0 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20  iled"));.       
1eed0 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42 4c 45   UNUSED_VARIABLE
1eee0 5f 56 41 4c 55 45 28 62 52 63 29 3b 0a 20 20 20  _VALUE(bRc);.   
1eef0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
1ef00 2d 3e 68 46 69 6c 65 2e 68 21 3d 4e 55 4c 4c 20  ->hFile.h!=NULL 
1ef10 26 26 20 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 49  && p->hFile.h!=I
1ef20 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
1ef30 4c 55 45 20 29 7b 0a 20 20 20 20 20 20 20 20 53  LUE ){.        S
1ef40 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1ef50 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20  nign(1);.       
1ef60 20 77 69 6e 43 6c 6f 73 65 28 28 73 71 6c 69 74   winClose((sqlit
1ef70 65 33 5f 66 69 6c 65 20 2a 29 26 70 2d 3e 68 46  e3_file *)&p->hF
1ef80 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 53 69  ile);.        Si
1ef90 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1efa0 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ign(0);.      }.
1efb0 20 20 20 20 20 20 69 66 28 20 64 65 6c 65 74 65        if( delete
1efc0 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Flag ){.        
1efd0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1efe0 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
1eff0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
1f000 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
1f010 20 20 20 20 20 20 77 69 6e 44 65 6c 65 74 65 28        winDelete(
1f020 70 56 66 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61  pVfs, p->zFilena
1f030 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  me, 0);.        
1f040 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
1f050 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
1f060 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1f070 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
1f080 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20    }.      *pp = 
1f090 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  p->pNext;.      
1f0a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
1f0b0 61 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20  aRegion);.      
1f0c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
1f0d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f0e0 20 20 70 70 20 3d 20 26 70 2d 3e 70 4e 65 78 74    pp = &p->pNext
1f0f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
1f100 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 68  *.** Open the sh
1f110 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61  ared-memory area
1f120 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1f130 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   database file p
1f140 44 62 46 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  DbFd..**.** When
1f150 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73   opening a new s
1f160 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
1f170 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69  e, if no other i
1f180 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74  nstances of that
1f190 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72  .** file are cur
1f1a0 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20  rently open, in 
1f1b0 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20  this process or 
1f1c0 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  in other process
1f1d0 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  es, then.** the 
1f1e0 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75  file must be tru
1f1f0 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c  ncated to zero l
1f200 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69 74  ength or have it
1f210 73 20 68 65 61 64 65 72 20 63 6c 65 61 72 65 64  s header cleared
1f220 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f230 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  winOpenSharedMem
1f240 6f 72 79 28 77 69 6e 46 69 6c 65 20 2a 70 44 62  ory(winFile *pDb
1f250 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20 77 69  Fd){.  struct wi
1f260 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20  nShm *p;        
1f270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1f280 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
1f290 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74  e opened */.  st
1f2a0 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ruct winShmNode 
1f2b0 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 20  *pShmNode = 0;  
1f2c0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
1f2d0 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20  ng mmapped file 
1f2e0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
1f2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f300 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
1f310 74 20 63 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75  t code */.  stru
1f320 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  ct winShmNode *p
1f330 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f  New;           /
1f340 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65  * Newly allocate
1f350 64 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a  d winShmNode */.
1f360 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20    int nName;    
1f370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f380 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1f390 7a 4e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a  zName in bytes *
1f3a0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  /..  assert( pDb
1f3b0 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 20 20  Fd->pShm==0 );  
1f3c0 20 20 2f 2a 20 4e 6f 74 20 70 72 65 76 69 6f 75    /* Not previou
1f3d0 73 6c 79 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20  sly opened */.. 
1f3e0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
1f3f0 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73  ce for the new s
1f400 71 6c 69 74 65 33 5f 73 68 6d 20 6f 62 6a 65 63  qlite3_shm objec
1f410 74 2e 20 20 41 6c 73 6f 20 73 70 65 63 75 6c 61  t.  Also specula
1f420 74 69 76 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f  tively.  ** allo
1f430 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 61  cate space for a
1f440 20 6e 65 77 20 77 69 6e 53 68 6d 4e 6f 64 65 20   new winShmNode 
1f450 61 6e 64 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20  and filename..  
1f460 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  */.  p = sqlite3
1f470 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
1f480 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20  of(*p) );.  if( 
1f490 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
1f4a0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1f4b0 5f 42 4b 50 54 3b 0a 20 20 6e 4e 61 6d 65 20 3d  _BKPT;.  nName =
1f4c0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1f4d0 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a  (pDbFd->zPath);.
1f4e0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
1f4f0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
1f500 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20  of(*pShmNode) + 
1f510 6e 4e 61 6d 65 20 2b 20 31 37 20 29 3b 0a 20 20  nName + 17 );.  
1f520 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
1f530 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1f540 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  p);.    return S
1f550 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
1f560 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 4e  M_BKPT;.  }.  pN
1f570 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  ew->zFilename = 
1f580 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b  (char*)&pNew[1];
1f590 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
1f5a0 6e 74 66 28 6e 4e 61 6d 65 2b 31 35 2c 20 70 4e  ntf(nName+15, pN
1f5b0 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 22  ew->zFilename, "
1f5c0 25 73 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e  %s-shm", pDbFd->
1f5d0 7a 50 61 74 68 29 3b 0a 20 20 73 71 6c 69 74 65  zPath);.  sqlite
1f5e0 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 44 62  3FileSuffix3(pDb
1f5f0 46 64 2d 3e 7a 50 61 74 68 2c 20 70 4e 65 77 2d  Fd->zPath, pNew-
1f600 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 0a 20 20  >zFilename);..  
1f610 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73 65 65 20 69  /* Look to see i
1f620 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 78  f there is an ex
1f630 69 73 74 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64  isting winShmNod
1f640 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  e that can be us
1f650 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f 20 6d  ed..  ** If no m
1f660 61 74 63 68 69 6e 67 20 77 69 6e 53 68 6d 4e 6f  atching winShmNo
1f670 64 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69  de currently exi
1f680 73 74 73 2c 20 63 72 65 61 74 65 20 61 20 6e 65  sts, create a ne
1f690 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 69  w one..  */.  wi
1f6a0 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29  nShmEnterMutex()
1f6b0 3b 0a 20 20 66 6f 72 28 70 53 68 6d 4e 6f 64 65  ;.  for(pShmNode
1f6c0 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73   = winShmNodeLis
1f6d0 74 3b 20 70 53 68 6d 4e 6f 64 65 3b 20 70 53 68  t; pShmNode; pSh
1f6e0 6d 4e 6f 64 65 3d 70 53 68 6d 4e 6f 64 65 2d 3e  mNode=pShmNode->
1f6f0 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54  pNext){.    /* T
1f700 42 44 20 6e 65 65 64 20 74 6f 20 63 6f 6d 65 20  BD need to come 
1f710 75 70 20 77 69 74 68 20 62 65 74 74 65 72 20 6d  up with better m
1f720 61 74 63 68 20 68 65 72 65 2e 20 20 50 65 72 68  atch here.  Perh
1f730 61 70 73 0a 20 20 20 20 2a 2a 20 75 73 65 20 46  aps.    ** use F
1f740 49 4c 45 5f 49 44 5f 42 4f 54 48 5f 44 49 52 5f  ILE_ID_BOTH_DIR_
1f750 49 4e 46 4f 20 53 74 72 75 63 74 75 72 65 2e 0a  INFO Structure..
1f760 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
1f770 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 53  qlite3StrICmp(pS
1f780 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
1f790 65 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61  e, pNew->zFilena
1f7a0 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  me)==0 ) break;.
1f7b0 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f    }.  if( pShmNo
1f7c0 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  de ){.    sqlite
1f7d0 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
1f7e0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 68 6d 4e  }else{.    pShmN
1f7f0 6f 64 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ode = pNew;.    
1f800 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 28 28  pNew = 0;.    ((
1f810 77 69 6e 46 69 6c 65 2a 29 28 26 70 53 68 6d 4e  winFile*)(&pShmN
1f820 6f 64 65 2d 3e 68 46 69 6c 65 29 29 2d 3e 68 20  ode->hFile))->h 
1f830 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  = INVALID_HANDLE
1f840 5f 56 41 4c 55 45 3b 0a 20 20 20 20 70 53 68 6d  _VALUE;.    pShm
1f850 4e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 77 69  Node->pNext = wi
1f860 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20  nShmNodeList;.  
1f870 20 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74    winShmNodeList
1f880 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20   = pShmNode;..  
1f890 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
1f8a0 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
1f8b0 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 70 53  utex ){.      pS
1f8c0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20  hmNode->mutex = 
1f8d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
1f8e0 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
1f8f0 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 69 66  _FAST);.      if
1f900 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  ( pShmNode->mute
1f910 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x==0 ){.        
1f920 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
1f930 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  R_NOMEM_BKPT;.  
1f940 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
1f950 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  pen_err;.      }
1f960 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
1f970 20 77 69 6e 4f 70 65 6e 28 70 44 62 46 64 2d 3e   winOpen(pDbFd->
1f980 70 56 66 73 2c 0a 20 20 20 20 20 20 20 20 20 20  pVfs,.          
1f990 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
1f9a0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20  >zFilename,     
1f9b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1f9c0 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55 54 46  of the file (UTF
1f9d0 2d 38 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  -8) */.         
1f9e0 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
1f9f0 5f 66 69 6c 65 2a 29 26 70 53 68 6d 4e 6f 64 65  _file*)&pShmNode
1fa00 2d 3e 68 46 69 6c 65 2c 20 20 2f 2a 20 46 69 6c  ->hFile,  /* Fil
1fa10 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f  e handle here */
1fa20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fa30 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41    SQLITE_OPEN_WA
1fa40 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  L | SQLITE_OPEN_
1fa50 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
1fa60 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 0a  TE_OPEN_CREATE,.
1fa70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa80 20 30 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c   0);.    if( SQL
1fa90 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
1faa0 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
1fab0 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  n_err;.    }..  
1fac0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
1fad0 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f  e if another pro
1fae0 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
1faf0 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69  the dead-man swi
1fb00 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e  tch..    ** If n
1fb10 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  ot, truncate the
1fb20 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65   file to zero le
1fb30 6e 67 74 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ngth..    */.   
1fb40 20 69 66 28 20 77 69 6e 53 68 6d 53 79 73 74 65   if( winShmSyste
1fb50 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
1fb60 57 49 4e 53 48 4d 5f 57 52 4c 43 4b 2c 20 57 49  WINSHM_WRLCK, WI
1fb70 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53  N_SHM_DMS, 1)==S
1fb80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1fb90 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61    rc = winTrunca
1fba0 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  te((sqlite3_file
1fbb0 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46   *)&pShmNode->hF
1fbc0 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ile, 0);.      i
1fbd0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1fbe0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1fbf0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
1fc00 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45  ITE_IOERR_SHMOPE
1fc10 4e 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  N, osGetLastErro
1fc20 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
1fc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
1fc40 69 6e 4f 70 65 6e 53 68 6d 22 2c 20 70 44 62 46  inOpenShm", pDbF
1fc50 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
1fc60 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1fc70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1fc80 7b 0a 20 20 20 20 20 20 77 69 6e 53 68 6d 53 79  {.      winShmSy
1fc90 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
1fca0 65 2c 20 57 49 4e 53 48 4d 5f 55 4e 4c 43 4b 2c  e, WINSHM_UNLCK,
1fcb0 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29   WIN_SHM_DMS, 1)
1fcc0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  ;.      rc = win
1fcd0 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
1fce0 68 6d 4e 6f 64 65 2c 20 57 49 4e 53 48 4d 5f 52  hmNode, WINSHM_R
1fcf0 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d  DLCK, WIN_SHM_DM
1fd00 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  S, 1);.    }.   
1fd10 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
1fd20 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d  hm_open_err;.  }
1fd30 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20  ..  /* Make the 
1fd40 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  new connection a
1fd50 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 77 69   child of the wi
1fd60 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d  nShmNode */.  p-
1fd70 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d  >pShmNode = pShm
1fd80 4e 6f 64 65 3b 0a 23 69 66 20 64 65 66 69 6e 65  Node;.#if define
1fd90 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
1fda0 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
1fdb0 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45 29  E_HAVE_OS_TRACE)
1fdc0 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e  .  p->id = pShmN
1fdd0 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b  ode->nextShmId++
1fde0 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e  ;.#endif.  pShmN
1fdf0 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70  ode->nRef++;.  p
1fe00 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a  DbFd->pShm = p;.
1fe10 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74    winShmLeaveMut
1fe20 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ex();..  /* The 
1fe30 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
1fe40 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20  on pShmNode has 
1fe50 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63  already been inc
1fe60 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20  remented under. 
1fe70 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66   ** the cover of
1fe80 20 74 68 65 20 77 69 6e 53 68 6d 45 6e 74 65 72   the winShmEnter
1fe90 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e  Mutex() mutex an
1fea0 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72  d the pointer fr
1feb0 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20  om the.  ** new 
1fec0 28 73 74 72 75 63 74 20 77 69 6e 53 68 6d 29 20  (struct winShm) 
1fed0 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53  object to the pS
1fee0 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20  hmNode has been 
1fef0 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73  set. All that is
1ff00 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f  .  ** left to do
1ff10 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20   is to link the 
1ff20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20  new object into 
1ff30 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
1ff40 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74  starting.  ** at
1ff50 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
1ff60 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20  t. This must be 
1ff70 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69  done while holdi
1ff80 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d  ng the pShmNode-
1ff90 3e 6d 75 74 65 78 0a 20 20 2a 2a 20 6d 75 74 65  >mutex.  ** mute
1ffa0 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  x..  */.  sqlite
1ffb0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
1ffc0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
1ffd0 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68    p->pNext = pSh
1ffe0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20  mNode->pFirst;. 
1fff0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
20000 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33  t = p;.  sqlite3
20010 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
20020 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
20030 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20040 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  K;..  /* Jump he
20050 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20  re on any error 
20060 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a  */.shm_open_err:
20070 0a 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c  .  winShmSystemL
20080 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 57 49  ock(pShmNode, WI
20090 4e 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f  NSHM_UNLCK, WIN_
200a0 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 77  SHM_DMS, 1);.  w
200b0 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46 64  inShmPurge(pDbFd
200c0 2d 3e 70 56 66 73 2c 20 30 29 3b 20 20 20 20 20  ->pVfs, 0);     
200d0 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72   /* This call fr
200e0 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20  ees pShmNode if 
200f0 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71  required */.  sq
20100 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
20110 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
20120 65 77 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61  ew);.  winShmLea
20130 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
20140 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
20150 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74   Close a connect
20160 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65  ion to shared-me
20170 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68  mory.  Delete th
20180 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20  e underlying.** 
20190 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74  storage if delet
201a0 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a  eFlag is true..*
201b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
201c0 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69  ShmUnmap(.  sqli
201d0 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
201e0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
201f0 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65  se holding share
20200 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  d memory */.  in
20210 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20  t deleteFlag    
20220 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65           /* Dele
20230 74 65 20 61 66 74 65 72 20 63 6c 6f 73 69 6e 67  te after closing
20240 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
20250 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 3b   winFile *pDbFd;
20260 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
20270 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65  se holding share
20280 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69  d-memory */.  wi
20290 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20  nShm *p;        
202a0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65      /* The conne
202b0 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73  ction to be clos
202c0 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f  ed */.  winShmNo
202d0 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a  de *pShmNode; /*
202e0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
202f0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
20300 6c 65 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  le */.  winShm *
20310 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  *pp;          /*
20320 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
20330 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  r sibling connec
20340 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 70 44 62 46  tions */..  pDbF
20350 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
20360 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70  ;.  p = pDbFd->p
20370 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  Shm;.  if( p==0 
20380 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
20390 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d  OK;.  pShmNode =
203a0 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20   p->pShmNode;.. 
203b0 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65   /* Remove conne
203c0 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65  ction p from the
203d0 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69   set of connecti
203e0 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20  ons associated. 
203f0 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64   ** with pShmNod
20400 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  e */.  sqlite3_m
20410 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
20420 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66  ode->mutex);.  f
20430 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d  or(pp=&pShmNode-
20440 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d  >pFirst; (*pp)!=
20450 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e  p; pp = &(*pp)->
20460 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d  pNext){}.  *pp =
20470 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a   p->pNext;..  /*
20480 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63   Free the connec
20490 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69  tion p */.  sqli
204a0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70  te3_free(p);.  p
204b0 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a  DbFd->pShm = 0;.
204c0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
204d0 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
204e0 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66  mutex);..  /* If
204f0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20   pShmNode->nRef 
20500 68 61 73 20 72 65 61 63 68 65 64 20 30 2c 20 74  has reached 0, t
20510 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e  hen close the un
20520 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68  derlying.  ** sh
20530 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
20540 2c 20 74 6f 6f 20 2a 2f 0a 20 20 77 69 6e 53 68  , too */.  winSh
20550 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  mEnterMutex();. 
20560 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
20570 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70  e->nRef>0 );.  p
20580 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b  ShmNode->nRef--;
20590 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
205a0 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
205b0 77 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46  winShmPurge(pDbF
205c0 64 2d 3e 70 56 66 73 2c 20 64 65 6c 65 74 65 46  d->pVfs, deleteF
205d0 6c 61 67 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 53  lag);.  }.  winS
205e0 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  hmLeaveMutex();.
205f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
20600 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
20610 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74  ange the lock st
20620 61 74 65 20 66 6f 72 20 61 20 73 68 61 72 65 64  ate for a shared
20630 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e  -memory segment.
20640 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
20650 69 6e 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c  inShmLock(.  sql
20660 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
20670 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
20680 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67  ase file holding
20690 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
206a0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74  ry */.  int ofst
206b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
206c0 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b     /* First lock
206d0 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72   to acquire or r
206e0 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
206f0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
20700 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
20710 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71   of locks to acq
20720 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20  uire or release 
20730 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
20740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20750 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
20760 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29  th the lock */.)
20770 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62  {.  winFile *pDb
20780 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66  Fd = (winFile*)f
20790 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  d;        /* Con
207a0 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20  nection holding 
207b0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
207c0 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70  .  winShm *p = p
207d0 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20  DbFd->pShm;     
207e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
207f0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65  shared memory be
20800 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20  ing locked */.  
20810 77 69 6e 53 68 6d 20 2a 70 58 3b 20 20 20 20 20  winShm *pX;     
20820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20830 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
20840 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69  ping over all si
20850 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 77 69 6e 53  blings */.  winS
20860 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
20870 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a   = p->pShmNode;.
20880 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
20890 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
208a0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
208b0 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20  t code */.  u16 
208c0 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  mask;           
208d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208e0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63    /* Mask of loc
208f0 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65  ks to take or re
20900 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65  lease */..  asse
20910 72 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f  rt( ofst>=0 && o
20920 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48  fst+n<=SQLITE_SH
20930 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  M_NLOCK );.  ass
20940 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61  ert( n>=1 );.  a
20950 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53  ssert( flags==(S
20960 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c  QLITE_SHM_LOCK |
20970 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
20980 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  ED).       || fl
20990 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
209a0 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  _LOCK | SQLITE_S
209b0 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20  HM_EXCLUSIVE).  
209c0 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
209d0 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
209e0 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53  K | SQLITE_SHM_S
209f0 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c  HARED).       ||
20a00 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
20a10 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c  SHM_UNLOCK | SQL
20a20 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
20a30 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  E) );.  assert( 
20a40 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26  n==1 || (flags &
20a50 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
20a60 55 53 49 56 45 29 21 3d 30 20 29 3b 0a 0a 20 20  USIVE)!=0 );..  
20a70 6d 61 73 6b 20 3d 20 28 75 31 36 29 28 28 31 55  mask = (u16)((1U
20a80 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31  <<(ofst+n)) - (1
20a90 55 3c 3c 6f 66 73 74 29 29 3b 0a 20 20 61 73 73  U<<ofst));.  ass
20aa0 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b  ert( n>1 || mask
20ab0 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20  ==(1<<ofst) );. 
20ac0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
20ad0 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
20ae0 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61  utex);.  if( fla
20af0 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
20b00 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31  UNLOCK ){.    u1
20b10 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f  6 allMask = 0; /
20b20 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20  * Mask of locks 
20b30 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73  held by siblings
20b40 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20   */..    /* See 
20b50 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20  if any siblings 
20b60 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c  hold this same l
20b70 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70  ock */.    for(p
20b80 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
20b90 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
20ba0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
20bb0 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75   pX==p ) continu
20bc0 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
20bd0 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
20be0 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d   (p->exclMask|p-
20bf0 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30  >sharedMask))==0
20c00 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73   );.      allMas
20c10 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d  k |= pX->sharedM
20c20 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ask;.    }..    
20c30 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79  /* Unlock the sy
20c40 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73  stem-level locks
20c50 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73   */.    if( (mas
20c60 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20  k & allMask)==0 
20c70 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  ){.      rc = wi
20c80 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
20c90 53 68 6d 4e 6f 64 65 2c 20 57 49 4e 53 48 4d 5f  ShmNode, WINSHM_
20ca0 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f  UNLCK, ofst+WIN_
20cb0 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20  SHM_BASE, n);.  
20cc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
20cd0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
20ce0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64     }..    /* Und
20cf0 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b  o the local lock
20d00 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  s */.    if( rc=
20d10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20d20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20      p->exclMask 
20d30 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  &= ~mask;.      
20d40 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d  p->sharedMask &=
20d50 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20   ~mask;.    }.  
20d60 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
20d70 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  & SQLITE_SHM_SHA
20d80 52 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61  RED ){.    u16 a
20d90 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f  llShared = 0;  /
20da0 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73  * Union of locks
20db0 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
20dc0 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20  ions other than 
20dd0 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46  "p" */..    /* F
20de0 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73 68  ind out which sh
20df0 61 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61  ared locks are a
20e00 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79 20 73  lready held by s
20e10 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
20e20 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e  ns..    ** If an
20e30 79 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64  y sibling alread
20e40 79 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75  y holds an exclu
20e50 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68  sive lock, go ah
20e60 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  ead and return. 
20e70 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53     ** SQLITE_BUS
20e80 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  Y..    */.    fo
20e90 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  r(pX=pShmNode->p
20ea0 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
20eb0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
20ec0 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  if( (pX->exclMas
20ed0 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a  k & mask)!=0 ){.
20ee0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
20ef0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
20f00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
20f10 0a 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64  .      allShared
20f20 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
20f30 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  sk;.    }..    /
20f40 2a 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63  * Get shared loc
20f50 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d  ks at the system
20f60 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73   level, if neces
20f70 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20  sary */.    if( 
20f80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
20f90 0a 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53  .      if( (allS
20fa0 68 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30  hared & mask)==0
20fb0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
20fc0 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
20fd0 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 57 49 4e 53  k(pShmNode, WINS
20fe0 48 4d 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 57  HM_RDLCK, ofst+W
20ff0 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IN_SHM_BASE, n);
21000 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
21010 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
21020 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
21030 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
21040 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64  the local shared
21050 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
21060 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21070 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  ){.      p->shar
21080 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  edMask |= mask;.
21090 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
210a0 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
210b0 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  no sibling conne
210c0 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b  ctions hold lock
210d0 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63  s that will bloc
210e0 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f  k this.    ** lo
210f0 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20  ck.  If any do, 
21100 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
21110 53 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20  SY right away.. 
21120 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58     */.    for(pX
21130 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  =pShmNode->pFirs
21140 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  t; pX; pX=pX->pN
21150 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
21160 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
21170 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d  mask)!=0 || (pX-
21180 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61  >sharedMask & ma
21190 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
211a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
211b0 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  SY;.        brea
211c0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
211d0 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65  ..    /* Get the
211e0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
211f0 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
21200 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73  evel.  Then if s
21210 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a  uccessful.    **
21220 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c   also mark the l
21230 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ocal connection 
21240 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e  as being locked.
21250 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
21260 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21270 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53  .      rc = winS
21280 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
21290 6d 4e 6f 64 65 2c 20 57 49 4e 53 48 4d 5f 57 52  mNode, WINSHM_WR
212a0 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48  LCK, ofst+WIN_SH
212b0 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
212c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
212d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _OK ){.        a
212e0 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65  ssert( (p->share
212f0 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30  dMask & mask)==0
21300 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65   );.        p->e
21310 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  xclMask |= mask;
21320 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21330 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
21340 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
21350 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54  e->mutex);.  OST
21360 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
21370 70 69 64 3d 25 6c 75 2c 20 69 64 3d 25 64 2c 20  pid=%lu, id=%d, 
21380 73 68 61 72 65 64 4d 61 73 6b 3d 25 30 33 78 2c  sharedMask=%03x,
21390 20 65 78 63 6c 4d 61 73 6b 3d 25 30 33 78 2c 20   exclMask=%03x, 
213a0 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
213b0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
213c0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 2d  tProcessId(), p-
213d0 3e 69 64 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61  >id, p->sharedMa
213e0 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 2c  sk, p->exclMask,
213f0 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  .           sqli
21400 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
21410 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
21420 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
21430 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69  t a memory barri
21440 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e  er or memory fen
21450 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d  ce on shared mem
21460 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c  ory..**.** All l
21470 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20  oads and stores 
21480 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65  begun before the
21490 20 62 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f   barrier must co
214a0 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a  mplete before.**
214b0 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f   any load or sto
214c0 72 65 20 62 65 67 75 6e 20 61 66 74 65 72 20 74  re begun after t
214d0 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73  he barrier..*/.s
214e0 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68  tatic void winSh
214f0 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69  mBarrier(.  sqli
21500 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20  te3_file *fd    
21510 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
21520 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68  e holding the sh
21530 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29  ared memory */.)
21540 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
21550 45 54 45 52 28 66 64 29 3b 0a 20 20 73 71 6c 69  ETER(fd);.  sqli
21560 74 65 33 4d 65 6d 6f 72 79 42 61 72 72 69 65 72  te3MemoryBarrier
21570 28 29 3b 20 20 20 2f 2a 20 63 6f 6d 70 69 6c 65  ();   /* compile
21580 72 2d 64 65 66 69 6e 65 64 20 6d 65 6d 6f 72 79  r-defined memory
21590 20 62 61 72 72 69 65 72 20 2a 2f 0a 20 20 77 69   barrier */.  wi
215a0 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29  nShmEnterMutex()
215b0 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20  ;       /* Also 
215c0 6d 75 74 65 78 2c 20 66 6f 72 20 72 65 64 75 6e  mutex, for redun
215d0 64 61 6e 63 79 20 2a 2f 0a 20 20 77 69 6e 53 68  dancy */.  winSh
215e0 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d  mLeaveMutex();.}
215f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
21600 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
21610 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e  to obtain a poin
21620 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52  ter to region iR
21630 65 67 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  egion of the.** 
21640 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73  shared-memory as
21650 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
21660 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
21670 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72  fd. Shared-memor
21680 79 20 72 65 67 69 6f 6e 73 0a 2a 2a 20 61 72 65  y regions.** are
21690 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69   numbered starti
216a0 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61  ng from zero. Ea
216b0 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ch shared-memory
216c0 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67   region is szReg
216d0 69 6f 6e 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20  ion.** bytes in 
216e0 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  size..**.** If a
216f0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
21700 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
21710 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
21720 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  p is set to NULL
21730 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
21740 65 2c 20 69 66 20 74 68 65 20 69 73 57 72 69 74  e, if the isWrit
21750 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  e parameter is 0
21760 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
21770 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ed shared-memory
21780 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e  .** region has n
21790 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ot been allocate
217a0 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74  d (by any client
217b0 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20  , including one 
217c0 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20  running in a.** 
217d0 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73  separate process
217e0 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73  ), then *pp is s
217f0 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53  et to NULL and S
21800 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
21810 64 2e 20 49 66 0a 2a 2a 20 69 73 57 72 69 74 65  d. If.** isWrite
21820 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64   is non-zero and
21830 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
21840 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
21850 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 0a  ion has not yet.
21860 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ** been allocate
21870 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74  d, it is allocat
21880 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
21890 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ion..**.** If th
218a0 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
218b0 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  region has alrea
218c0 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
218d0 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  d or is allocate
218e0 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c  d by.** this cal
218f0 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61  l as described a
21900 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73  bove, then it is
21910 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69   mapped into thi
21920 73 20 70 72 6f 63 65 73 73 65 73 0a 2a 2a 20 61  s processes.** a
21930 64 64 72 65 73 73 20 73 70 61 63 65 20 28 69 66  ddress space (if
21940 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
21950 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20  dy), *pp is set 
21960 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
21970 6d 61 70 70 65 64 0a 2a 2a 20 6d 65 6d 6f 72 79  mapped.** memory
21980 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
21990 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
219a0 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 61 70  ic int winShmMap
219b0 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
219c0 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20   *fd,           
219d0 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70      /* Handle op
219e0 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66  en on database f
219f0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ile */.  int iRe
21a00 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
21a10 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
21a20 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a  on to retrieve *
21a30 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e  /.  int szRegion
21a40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21a50 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72      /* Size of r
21a60 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  egions */.  int 
21a70 69 73 57 72 69 74 65 2c 20 20 20 20 20 20 20 20  isWrite,        
21a80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
21a90 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69  rue to extend fi
21aa0 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  le if necessary 
21ab0 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69  */.  void volati
21ac0 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20  le **pp         
21ad0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70       /* OUT: Map
21ae0 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b  ped memory */.){
21af0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46  .  winFile *pDbF
21b00 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
21b10 3b 0a 20 20 77 69 6e 53 68 6d 20 2a 70 53 68 6d  ;.  winShm *pShm
21b20 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
21b30 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53    winShmNode *pS
21b40 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63  hmNode;.  int rc
21b50 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
21b60 20 69 66 28 20 21 70 53 68 6d 20 29 7b 0a 20 20   if( !pShm ){.  
21b70 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 53 68    rc = winOpenSh
21b80 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64  aredMemory(pDbFd
21b90 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
21ba0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
21bb0 6e 20 72 63 3b 0a 20 20 20 20 70 53 68 6d 20 3d  n rc;.    pShm =
21bc0 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
21bd0 7d 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  }.  pShmNode = p
21be0 53 68 6d 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a  Shm->pShmNode;..
21bf0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
21c00 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
21c10 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
21c20 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d  ( szRegion==pShm
21c30 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c  Node->szRegion |
21c40 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  | pShmNode->nReg
21c50 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  ion==0 );..  if(
21c60 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
21c70 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20  on<=iRegion ){. 
21c80 20 20 20 73 74 72 75 63 74 20 53 68 6d 52 65 67     struct ShmReg
21c90 69 6f 6e 20 2a 61 70 4e 65 77 3b 20 20 20 20 20  ion *apNew;     
21ca0 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61 52 65        /* New aRe
21cb0 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  gion[] array */.
21cc0 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
21cd0 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65  (iRegion+1)*szRe
21ce0 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  gion;  /* Minimu
21cf0 6d 20 72 65 71 75 69 72 65 64 20 66 69 6c 65 20  m required file 
21d00 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69  size */.    sqli
21d10 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 20 20 20  te3_int64 sz;   
21d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21d30 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  * Current size o
21d40 66 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65  f wal-index file
21d50 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64   */..    pShmNod
21d60 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a  e->szRegion = sz
21d70 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20  Region;..    /* 
21d80 54 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  The requested re
21d90 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70  gion is not mapp
21da0 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  ed into this pro
21db0 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73  cesses address s
21dc0 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 43 68 65  pace..    ** Che
21dd0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  ck to see if it 
21de0 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
21df0 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20  ed (i.e. if the 
21e00 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69  wal-index file i
21e10 73 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65  s.    ** large e
21e20 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e  nough to contain
21e30 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72   the requested r
21e40 65 67 69 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20  egion)..    */. 
21e50 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53     rc = winFileS
21e60 69 7a 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ize((sqlite3_fil
21e70 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  e *)&pShmNode->h
21e80 46 69 6c 65 2c 20 26 73 7a 29 3b 0a 20 20 20 20  File, &sz);.    
21e90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
21ea0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
21eb0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
21ec0 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
21ed0 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
21ee0 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
21ef0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53             "winS
21f00 68 6d 4d 61 70 31 22 2c 20 70 44 62 46 64 2d 3e  hmMap1", pDbFd->
21f10 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 67 6f  zPath);.      go
21f20 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
21f30 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73      }..    if( s
21f40 7a 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  z<nByte ){.     
21f50 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
21f60 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d memory region 
21f70 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20  does not exist. 
21f80 49 66 20 69 73 57 72 69 74 65 20 69 73 20 73 65  If isWrite is se
21f90 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 7a 65  t to.      ** ze
21fa0 72 6f 2c 20 65 78 69 74 20 65 61 72 6c 79 2e 20  ro, exit early. 
21fb0 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65 74 20  *pp will be set 
21fc0 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49  to NULL and SQLI
21fd0 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
21fe0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
21ff0 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c  * Alternatively,
22000 20 69 66 20 69 73 57 72 69 74 65 20 69 73 20 6e   if isWrite is n
22010 6f 6e 2d 7a 65 72 6f 2c 20 75 73 65 20 66 74 72  on-zero, use ftr
22020 75 6e 63 61 74 65 28 29 20 74 6f 20 61 6c 6c 6f  uncate() to allo
22030 63 61 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  cate.      ** th
22040 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f  e requested memo
22050 72 79 20 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20  ry region..     
22060 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69   */.      if( !i
22070 73 57 72 69 74 65 20 29 20 67 6f 74 6f 20 73 68  sWrite ) goto sh
22080 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
22090 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74   rc = winTruncat
220a0 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  e((sqlite3_file 
220b0 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  *)&pShmNode->hFi
220c0 6c 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  le, nByte);.    
220d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
220e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
220f0 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
22100 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
22110 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73 74 45  SIZE, osGetLastE
22120 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
22130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22140 20 22 77 69 6e 53 68 6d 4d 61 70 32 22 2c 20 70   "winShmMap2", p
22150 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
22160 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
22170 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  ge_out;.      }.
22180 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
22190 70 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  p the requested 
221a0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e  memory region in
221b0 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
221c0 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e  s address space.
221d0 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20   */.    apNew = 
221e0 28 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f  (struct ShmRegio
221f0 6e 20 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c  n *)sqlite3_real
22200 6c 6f 63 36 34 28 0a 20 20 20 20 20 20 20 20 70  loc64(.        p
22210 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e  ShmNode->aRegion
22220 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 69  , (iRegion+1)*si
22230 7a 65 6f 66 28 61 70 4e 65 77 5b 30 5d 29 0a 20  zeof(apNew[0]). 
22240 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61     );.    if( !a
22250 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63  pNew ){.      rc
22260 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
22270 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
22280 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
22290 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  ut;.    }.    pS
222a0 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 20  hmNode->aRegion 
222b0 3d 20 61 70 4e 65 77 3b 0a 0a 20 20 20 20 77 68  = apNew;..    wh
222c0 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  ile( pShmNode->n
222d0 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20  Region<=iRegion 
222e0 29 7b 0a 20 20 20 20 20 20 48 41 4e 44 4c 45 20  ){.      HANDLE 
222f0 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 20 20 20 20  hMap = NULL;    
22300 20 20 20 20 20 2f 2a 20 66 69 6c 65 2d 6d 61 70       /* file-map
22310 70 69 6e 67 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  ping handle */. 
22320 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 20       void *pMap 
22330 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
22340 20 2f 2a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72   /* Mapped memor
22350 79 20 72 65 67 69 6f 6e 20 2a 2f 0a 0a 23 69 66  y region */..#if
22360 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
22370 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73  .      hMap = os
22380 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
22390 67 46 72 6f 6d 41 70 70 28 70 53 68 6d 4e 6f 64  gFromApp(pShmNod
223a0 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20  e->hFile.h,.    
223b0 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45        NULL, PAGE
223c0 5f 52 45 41 44 57 52 49 54 45 2c 20 6e 42 79 74  _READWRITE, nByt
223d0 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b  e, NULL.      );
223e0 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
223f0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
22400 57 49 44 45 29 0a 20 20 20 20 20 20 68 4d 61 70  WIDE).      hMap
22410 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d   = osCreateFileM
22420 61 70 70 69 6e 67 57 28 70 53 68 6d 4e 6f 64 65  appingW(pShmNode
22430 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20  ->hFile.h,.     
22440 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f       NULL, PAGE_
22450 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20 6e 42  READWRITE, 0, nB
22460 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20  yte, NULL.      
22470 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  );.#elif defined
22480 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
22490 53 5f 41 4e 53 49 29 20 26 26 20 53 51 4c 49 54  S_ANSI) && SQLIT
224a0 45 5f 57 49 4e 33 32 5f 43 52 45 41 54 45 46 49  E_WIN32_CREATEFI
224b0 4c 45 4d 41 50 50 49 4e 47 41 0a 20 20 20 20 20  LEMAPPINGA.     
224c0 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65   hMap = osCreate
224d0 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 70 53 68  FileMappingA(pSh
224e0 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a  mNode->hFile.h,.
224f0 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20            NULL, 
22500 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20  PAGE_READWRITE, 
22510 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20  0, nByte, NULL. 
22520 20 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20       );.#endif. 
22530 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53       OSTRACE(("S
22540 48 4d 2d 4d 41 50 2d 43 52 45 41 54 45 20 70 69  HM-MAP-CREATE pi
22550 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64  d=%lu, region=%d
22560 2c 20 73 69 7a 65 3d 25 64 2c 20 72 63 3d 25 73  , size=%d, rc=%s
22570 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
22580 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
22590 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68  ProcessId(), pSh
225a0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20  mNode->nRegion, 
225b0 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20  nByte,.         
225c0 20 20 20 20 20 20 68 4d 61 70 20 3f 20 22 6f 6b        hMap ? "ok
225d0 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
225e0 20 20 20 20 20 20 69 66 28 20 68 4d 61 70 20 29        if( hMap )
225f0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f  {.        int iO
22600 66 66 73 65 74 20 3d 20 70 53 68 6d 4e 6f 64 65  ffset = pShmNode
22610 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69  ->nRegion*szRegi
22620 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  on;.        int 
22630 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20 69  iOffsetShift = i
22640 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79 73 49  Offset % winSysI
22650 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e  nfo.dwAllocation
22660 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 23 69 66  Granularity;.#if
22670 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
22680 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d 20  .        pMap = 
22690 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46  osMapViewOfFileF
226a0 72 6f 6d 41 70 70 28 68 4d 61 70 2c 20 46 49 4c  romApp(hMap, FIL
226b0 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20 46 49  E_MAP_WRITE | FI
226c0 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20  LE_MAP_READ,.   
226d0 20 20 20 20 20 20 20 20 20 69 4f 66 66 73 65 74           iOffset
226e0 20 2d 20 69 4f 66 66 73 65 74 53 68 69 66 74 2c   - iOffsetShift,
226f0 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66   szRegion + iOff
22700 73 65 74 53 68 69 66 74 0a 20 20 20 20 20 20 20  setShift.       
22710 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   );.#else.      
22720 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69    pMap = osMapVi
22730 65 77 4f 66 46 69 6c 65 28 68 4d 61 70 2c 20 46  ewOfFile(hMap, F
22740 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20  ILE_MAP_WRITE | 
22750 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20  FILE_MAP_READ,. 
22760 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 69 4f             0, iO
22770 66 66 73 65 74 20 2d 20 69 4f 66 66 73 65 74 53  ffset - iOffsetS
22780 68 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b  hift, szRegion +
22790 20 69 4f 66 66 73 65 74 53 68 69 66 74 0a 20 20   iOffsetShift.  
227a0 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a        );.#endif.
227b0 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
227c0 28 22 53 48 4d 2d 4d 41 50 2d 4d 41 50 20 70 69  ("SHM-MAP-MAP pi
227d0 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64  d=%lu, region=%d
227e0 2c 20 6f 66 66 73 65 74 3d 25 64 2c 20 73 69 7a  , offset=%d, siz
227f0 65 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  e=%d, rc=%s\n",.
22800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22810 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
22820 63 65 73 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f  cessId(), pShmNo
22830 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 69 4f 66  de->nRegion, iOf
22840 66 73 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20  fset,.          
22850 20 20 20 20 20 20 20 73 7a 52 65 67 69 6f 6e 2c         szRegion,
22860 20 70 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22   pMap ? "ok" : "
22870 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20  failed"));.     
22880 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 4d   }.      if( !pM
22890 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53  ap ){.        pS
228a0 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e  hmNode->lastErrn
228b0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
228c0 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 72 63  or();.        rc
228d0 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
228e0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d  QLITE_IOERR_SHMM
228f0 41 50 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61  AP, pShmNode->la
22900 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
22910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22920 20 20 22 77 69 6e 53 68 6d 4d 61 70 33 22 2c 20    "winShmMap3", 
22930 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
22940 20 20 20 20 20 20 20 69 66 28 20 68 4d 61 70 20         if( hMap 
22950 29 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28  ) osCloseHandle(
22960 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 67  hMap);.        g
22970 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
22980 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
22990 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f  pShmNode->aRegio
229a0 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  n[pShmNode->nReg
229b0 69 6f 6e 5d 2e 70 4d 61 70 20 3d 20 70 4d 61 70  ion].pMap = pMap
229c0 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
229d0 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f  ->aRegion[pShmNo
229e0 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 68 4d 61  de->nRegion].hMa
229f0 70 20 3d 20 68 4d 61 70 3b 0a 20 20 20 20 20 20  p = hMap;.      
22a00 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
22a10 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n++;.    }.  }..
22a20 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69  shmpage_out:.  i
22a30 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
22a40 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a  gion>iRegion ){.
22a50 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20      int iOffset 
22a60 3d 20 69 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69  = iRegion*szRegi
22a70 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66  on;.    int iOff
22a80 73 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66 73  setShift = iOffs
22a90 65 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e  et % winSysInfo.
22aa0 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e  dwAllocationGran
22ab0 75 6c 61 72 69 74 79 3b 0a 20 20 20 20 63 68 61  ularity;.    cha
22ac0 72 20 2a 70 20 3d 20 28 63 68 61 72 20 2a 29 70  r *p = (char *)p
22ad0 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e  ShmNode->aRegion
22ae0 5b 69 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 3b 0a  [iRegion].pMap;.
22af0 20 20 20 20 2a 70 70 20 3d 20 28 76 6f 69 64 20      *pp = (void 
22b00 2a 29 26 70 5b 69 4f 66 66 73 65 74 53 68 69 66  *)&p[iOffsetShif
22b10 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t];.  }else{.   
22b20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   *pp = 0;.  }.  
22b30 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
22b40 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
22b50 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
22b60 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 20 64 65  c;.}..#else.# de
22b70 66 69 6e 65 20 77 69 6e 53 68 6d 4d 61 70 20 20  fine winShmMap  
22b80 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69     0.# define wi
22b90 6e 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20  nShmLock    0.# 
22ba0 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 42 61 72  define winShmBar
22bb0 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20  rier 0.# define 
22bc0 77 69 6e 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a  winShmUnmap   0.
22bd0 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
22be0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
22bf0 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  L */../*.** Clea
22c00 6e 73 20 75 70 20 74 68 65 20 6d 61 70 70 65 64  ns up the mapped
22c10 20 72 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 73   region of the s
22c20 70 65 63 69 66 69 65 64 20 66 69 6c 65 2c 20 69  pecified file, i
22c30 66 20 61 6e 79 2e 0a 2a 2f 0a 23 69 66 20 53 51  f any..*/.#if SQ
22c40 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
22c50 5a 45 3e 30 0a 73 74 61 74 69 63 20 69 6e 74 20  ZE>0.static int 
22c60 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 77 69 6e  winUnmapfile(win
22c70 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
22c80 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30  assert( pFile!=0
22c90 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
22ca0 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25  UNMAP-FILE pid=%
22cb0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 68 4d  lu, pFile=%p, hM
22cc0 61 70 3d 25 70 2c 20 70 4d 61 70 52 65 67 69 6f  ap=%p, pMapRegio
22cd0 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20 20 20 20  n=%p, ".        
22ce0 20 20 20 22 6d 6d 61 70 53 69 7a 65 3d 25 6c 6c     "mmapSize=%ll
22cf0 64 2c 20 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  d, mmapSizeActua
22d00 6c 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a 65  l=%lld, mmapSize
22d10 4d 61 78 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20 20  Max=%lld\n",.   
22d20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
22d30 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
22d40 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
22d50 4d 61 70 2c 20 70 46 69 6c 65 2d 3e 70 4d 61 70  Map, pFile->pMap
22d60 52 65 67 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20  Region,.        
22d70 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69     pFile->mmapSi
22d80 7a 65 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  ze, pFile->mmapS
22d90 69 7a 65 41 63 74 75 61 6c 2c 20 70 46 69 6c 65  izeActual, pFile
22da0 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 29 29 3b  ->mmapSizeMax));
22db0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d  .  if( pFile->pM
22dc0 61 70 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  apRegion ){.    
22dd0 69 66 28 20 21 6f 73 55 6e 6d 61 70 56 69 65 77  if( !osUnmapView
22de0 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 70 4d  OfFile(pFile->pM
22df0 61 70 52 65 67 69 6f 6e 29 20 29 7b 0a 20 20 20  apRegion) ){.   
22e00 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
22e10 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
22e20 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53  rror();.      OS
22e30 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49  TRACE(("UNMAP-FI
22e40 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  LE pid=%lu, pFil
22e50 65 3d 25 70 2c 20 70 4d 61 70 52 65 67 69 6f 6e  e=%p, pMapRegion
22e60 3d 25 70 2c 20 22 0a 20 20 20 20 20 20 20 20 20  =%p, ".         
22e70 20 20 20 20 20 20 22 72 63 3d 53 51 4c 49 54 45        "rc=SQLITE
22e80 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c 20  _IOERR_MMAP\n", 
22e90 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
22ea0 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 0a  essId(), pFile,.
22eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
22ec0 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
22ed0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
22ee0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
22ef0 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20  ITE_IOERR_MMAP, 
22f00 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
22f10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22f20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 55             "winU
22f30 6e 6d 61 70 66 69 6c 65 31 22 2c 20 70 46 69 6c  nmapfile1", pFil
22f40 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  e->zPath);.    }
22f50 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70  .    pFile->pMap
22f60 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 20 20  Region = 0;.    
22f70 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
22f80 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  = 0;.    pFile->
22f90 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d  mmapSizeActual =
22fa0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46   0;.  }.  if( pF
22fb0 69 6c 65 2d 3e 68 4d 61 70 21 3d 4e 55 4c 4c 20  ile->hMap!=NULL 
22fc0 29 7b 0a 20 20 20 20 69 66 28 20 21 6f 73 43 6c  ){.    if( !osCl
22fd0 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
22fe0 3e 68 4d 61 70 29 20 29 7b 0a 20 20 20 20 20 20  >hMap) ){.      
22ff0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
23000 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
23010 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  r();.      OSTRA
23020 43 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20  CE(("UNMAP-FILE 
23030 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
23040 70 2c 20 68 4d 61 70 3d 25 70 2c 20 72 63 3d 53  p, hMap=%p, rc=S
23050 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50  QLITE_IOERR_MMAP
23060 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
23070 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
23080 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
23090 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 4d 61 70 29  le, pFile->hMap)
230a0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
230b0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
230c0 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70  TE_IOERR_MMAP, p
230d0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
230e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
230f0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e            "winUn
23100 6d 61 70 66 69 6c 65 32 22 2c 20 70 46 69 6c 65  mapfile2", pFile
23110 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
23120 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 61 70 20      pFile->hMap 
23130 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 53  = NULL;.  }.  OS
23140 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49  TRACE(("UNMAP-FI
23150 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  LE pid=%lu, pFil
23160 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
23170 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  OK\n",.         
23180 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
23190 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
231a0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
231b0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
231c0 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72 20 72   Memory map or r
231d0 65 6d 61 70 20 74 68 65 20 66 69 6c 65 20 6f 70  emap the file op
231e0 65 6e 65 64 20 62 79 20 66 69 6c 65 2d 64 65 73  ened by file-des
231f0 63 72 69 70 74 6f 72 20 70 46 64 20 28 69 66 20  criptor pFd (if 
23200 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61  the file.** is a
23210 6c 72 65 61 64 79 20 6d 61 70 70 65 64 2c 20 74  lready mapped, t
23220 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70  he existing mapp
23230 69 6e 67 20 69 73 20 72 65 70 6c 61 63 65 64 20  ing is replaced 
23240 62 79 20 74 68 65 20 6e 65 77 29 2e 20 4f 72 2c  by the new). Or,
23250 20 69 66 0a 2a 2a 20 74 68 65 72 65 20 61 6c 72   if.** there alr
23260 65 61 64 79 20 65 78 69 73 74 73 20 61 20 6d 61  eady exists a ma
23270 70 70 69 6e 67 20 66 6f 72 20 74 68 69 73 20 66  pping for this f
23280 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61  ile, and there a
23290 72 65 20 73 74 69 6c 6c 0a 2a 2a 20 6f 75 74 73  re still.** outs
232a0 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68 28 29  tanding xFetch()
232b0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 69   references to i
232c0 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  t, this function
232d0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
232e0 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
232f0 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d 6e 65 67  nByte is non-neg
23300 61 74 69 76 65 2c 20 74 68 65 6e 20 69 74 20 69  ative, then it i
23310 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
23320 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6d  size of.** the m
23330 61 70 70 69 6e 67 20 74 6f 20 63 72 65 61 74 65  apping to create
23340 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
23350 6e 42 79 74 65 20 69 73 20 6c 65 73 73 20 74 68  nByte is less th
23360 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
23370 65 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 73  e.** requested s
23380 69 7a 65 20 69 73 20 74 68 65 20 73 69 7a 65 20  ize is the size 
23390 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  of the file on d
233a0 69 73 6b 2e 20 54 68 65 20 61 63 74 75 61 6c 20  isk. The actual 
233b0 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  size of the.** c
233c0 72 65 61 74 65 64 20 6d 61 70 70 69 6e 67 20 69  reated mapping i
233d0 73 20 65 69 74 68 65 72 20 74 68 65 20 72 65 71  s either the req
233e0 75 65 73 74 65 64 20 73 69 7a 65 20 6f 72 20 74  uested size or t
233f0 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75  he value configu
23400 72 65 64 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c  red.** using SQL
23410 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53  ITE_FCNTL_MMAP_S
23420 49 5a 45 2c 20 77 68 69 63 68 65 76 65 72 20 69  IZE, whichever i
23430 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a  s smaller..**.**
23440 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
23450 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
23460 6f 72 20 6f 63 63 75 72 73 20 28 65 76 65 6e 20  or occurs (even 
23470 69 66 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69  if the mapping i
23480 73 20 6e 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74  s not.** recreat
23490 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ed as a result o
234a0 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  f outstanding re
234b0 66 65 72 65 6e 63 65 73 29 20 6f 72 20 61 6e 20  ferences) or an 
234c0 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20  SQLite error.** 
234d0 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
234e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
234f0 6e 4d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65  nMapfile(winFile
23500 20 2a 70 46 64 2c 20 73 71 6c 69 74 65 33 5f 69   *pFd, sqlite3_i
23510 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 73  nt64 nByte){.  s
23520 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4d 61  qlite3_int64 nMa
23530 70 20 3d 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74  p = nByte;.  int
23540 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
23550 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e  nMap>=0 || pFd->
23560 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a  nFetchOut==0 );.
23570 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d    OSTRACE(("MAP-
23580 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  FILE pid=%lu, pF
23590 69 6c 65 3d 25 70 2c 20 73 69 7a 65 3d 25 6c 6c  ile=%p, size=%ll
235a0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
235b0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
235c0 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 6e  cessId(), pFd, n
235d0 42 79 74 65 29 29 3b 0a 0a 20 20 69 66 28 20 70  Byte));..  if( p
235e0 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20  Fd->nFetchOut>0 
235f0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
23600 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c  OK;..  if( nMap<
23610 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69  0 ){.    rc = wi
23620 6e 46 69 6c 65 53 69 7a 65 28 28 73 71 6c 69 74  nFileSize((sqlit
23630 65 33 5f 66 69 6c 65 2a 29 70 46 64 2c 20 26 6e  e3_file*)pFd, &n
23640 4d 61 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Map);.    if( rc
23650 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
23660 45 28 28 22 4d 41 50 2d 46 49 4c 45 20 70 69 64  E(("MAP-FILE pid
23670 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
23680 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
23690 46 53 54 41 54 5c 6e 22 2c 0a 20 20 20 20 20 20  FSTAT\n",.      
236a0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
236b0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
236c0 2c 20 70 46 64 29 29 3b 0a 20 20 20 20 20 20 72  , pFd));.      r
236d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
236e0 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a  RR_FSTAT;.    }.
236f0 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70 3e 70    }.  if( nMap>p
23700 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  Fd->mmapSizeMax 
23710 29 7b 0a 20 20 20 20 6e 4d 61 70 20 3d 20 70 46  ){.    nMap = pF
23720 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a  d->mmapSizeMax;.
23730 20 20 7d 0a 20 20 6e 4d 61 70 20 26 3d 20 7e 28    }.  nMap &= ~(
23740 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 77  sqlite3_int64)(w
23750 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65  inSysInfo.dwPage
23760 53 69 7a 65 20 2d 20 31 29 3b 0a 0a 20 20 69 66  Size - 1);..  if
23770 28 20 6e 4d 61 70 3d 3d 30 20 26 26 20 70 46 64  ( nMap==0 && pFd
23780 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a  ->mmapSize>0 ){.
23790 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65      winUnmapfile
237a0 28 70 46 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28  (pFd);.  }.  if(
237b0 20 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70   nMap!=pFd->mmap
237c0 53 69 7a 65 20 29 7b 0a 20 20 20 20 76 6f 69 64  Size ){.    void
237d0 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20   *pNew = 0;.    
237e0 44 57 4f 52 44 20 70 72 6f 74 65 63 74 20 3d 20  DWORD protect = 
237f0 50 41 47 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  PAGE_READONLY;. 
23800 20 20 20 44 57 4f 52 44 20 66 6c 61 67 73 20 3d     DWORD flags =
23810 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 3b 0a   FILE_MAP_READ;.
23820 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c  .    winUnmapfil
23830 65 28 70 46 64 29 3b 0a 23 69 66 64 65 66 20 53  e(pFd);.#ifdef S
23840 51 4c 49 54 45 5f 4d 4d 41 50 5f 52 45 41 44 57  QLITE_MMAP_READW
23850 52 49 54 45 0a 20 20 20 20 69 66 28 20 28 70 46  RITE.    if( (pF
23860 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57  d->ctrlFlags & W
23870 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d  INFILE_RDONLY)==
23880 30 20 29 7b 0a 20 20 20 20 20 20 70 72 6f 74 65  0 ){.      prote
23890 63 74 20 3d 20 50 41 47 45 5f 52 45 41 44 57 52  ct = PAGE_READWR
238a0 49 54 45 3b 0a 20 20 20 20 20 20 66 6c 61 67 73  ITE;.      flags
238b0 20 7c 3d 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49   |= FILE_MAP_WRI
238c0 54 45 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  TE;.    }.#endif
238d0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
238e0 49 4e 52 54 0a 20 20 20 20 70 46 64 2d 3e 68 4d  INRT.    pFd->hM
238f0 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ap = osCreateFil
23900 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 28  eMappingFromApp(
23910 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72  pFd->h, NULL, pr
23920 6f 74 65 63 74 2c 20 6e 4d 61 70 2c 20 4e 55 4c  otect, nMap, NUL
23930 4c 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  L);.#elif define
23940 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
23950 41 53 5f 57 49 44 45 29 0a 20 20 20 20 70 46 64  AS_WIDE).    pFd
23960 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74  ->hMap = osCreat
23970 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 70 46  eFileMappingW(pF
23980 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74  d->h, NULL, prot
23990 65 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ect,.           
239a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239b0 20 20 20 20 20 28 44 57 4f 52 44 29 28 28 6e 4d       (DWORD)((nM
239c0 61 70 3e 3e 33 32 29 20 26 20 30 78 66 66 66 66  ap>>32) & 0xffff
239d0 66 66 66 66 29 2c 0a 20 20 20 20 20 20 20 20 20  ffff),.         
239e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239f0 20 20 20 20 20 20 20 28 44 57 4f 52 44 29 28 6e         (DWORD)(n
23a00 4d 61 70 20 26 20 30 78 66 66 66 66 66 66 66 66  Map & 0xffffffff
23a10 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66 20  ), NULL);.#elif 
23a20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
23a30 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26  IN32_HAS_ANSI) &
23a40 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 43  & SQLITE_WIN32_C
23a50 52 45 41 54 45 46 49 4c 45 4d 41 50 50 49 4e 47  REATEFILEMAPPING
23a60 41 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20  A.    pFd->hMap 
23a70 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  = osCreateFileMa
23a80 70 70 69 6e 67 41 28 70 46 64 2d 3e 68 2c 20 4e  ppingA(pFd->h, N
23a90 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a 20 20  ULL, protect,.  
23aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 44                (D
23ac0 57 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33 32 29  WORD)((nMap>>32)
23ad0 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c 0a   & 0xffffffff),.
23ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b00 28 44 57 4f 52 44 29 28 6e 4d 61 70 20 26 20 30  (DWORD)(nMap & 0
23b10 78 66 66 66 66 66 66 66 66 29 2c 20 4e 55 4c 4c  xffffffff), NULL
23b20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  );.#endif.    if
23b30 28 20 70 46 64 2d 3e 68 4d 61 70 3d 3d 4e 55 4c  ( pFd->hMap==NUL
23b40 4c 20 29 7b 0a 20 20 20 20 20 20 70 46 64 2d 3e  L ){.      pFd->
23b50 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
23b60 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
23b70 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
23b80 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
23b90 52 5f 4d 4d 41 50 2c 20 70 46 64 2d 3e 6c 61 73  R_MMAP, pFd->las
23ba0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
23bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
23bc0 77 69 6e 4d 61 70 66 69 6c 65 31 22 2c 20 70 46  winMapfile1", pF
23bd0 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
23be0 20 2f 2a 20 4c 6f 67 20 74 68 65 20 65 72 72 6f   /* Log the erro
23bf0 72 2c 20 62 75 74 20 63 6f 6e 74 69 6e 75 65 20  r, but continue 
23c00 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e  normal operation
23c10 20 75 73 69 6e 67 20 78 52 65 61 64 2f 78 57 72   using xRead/xWr
23c20 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54  ite */.      OST
23c30 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 2d  RACE(("MAP-FILE-
23c40 43 52 45 41 54 45 20 70 69 64 3d 25 6c 75 2c 20  CREATE pid=%lu, 
23c50 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c  pFile=%p, rc=%s\
23c60 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
23c70 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
23c80 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c  rocessId(), pFd,
23c90 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
23ca0 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74  rc)));.      ret
23cb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
23cc0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
23cd0 20 28 6e 4d 61 70 20 25 20 77 69 6e 53 79 73 49   (nMap % winSysI
23ce0 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65 29 3d  nfo.dwPageSize)=
23cf0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
23d00 28 20 73 69 7a 65 6f 66 28 53 49 5a 45 5f 54 29  ( sizeof(SIZE_T)
23d10 3d 3d 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  ==sizeof(sqlite3
23d20 5f 69 6e 74 36 34 29 20 7c 7c 20 6e 4d 61 70 3c  _int64) || nMap<
23d30 3d 30 78 66 66 66 66 66 66 66 66 20 29 3b 0a 23  =0xffffffff );.#
23d40 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
23d50 52 54 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73  RT.    pNew = os
23d60 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f  MapViewOfFileFro
23d70 6d 41 70 70 28 70 46 64 2d 3e 68 4d 61 70 2c 20  mApp(pFd->hMap, 
23d80 66 6c 61 67 73 2c 20 30 2c 20 28 53 49 5a 45 5f  flags, 0, (SIZE_
23d90 54 29 6e 4d 61 70 29 3b 0a 23 65 6c 73 65 0a 20  T)nMap);.#else. 
23da0 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 61 70 56     pNew = osMapV
23db0 69 65 77 4f 66 46 69 6c 65 28 70 46 64 2d 3e 68  iewOfFile(pFd->h
23dc0 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30 2c 20 30  Map, flags, 0, 0
23dd0 2c 20 28 53 49 5a 45 5f 54 29 6e 4d 61 70 29 3b  , (SIZE_T)nMap);
23de0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
23df0 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20  pNew==NULL ){.  
23e00 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
23e10 65 28 70 46 64 2d 3e 68 4d 61 70 29 3b 0a 20 20  e(pFd->hMap);.  
23e20 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20      pFd->hMap = 
23e30 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 70 46 64 2d  NULL;.      pFd-
23e40 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
23e50 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
23e60 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
23e70 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
23e80 52 52 5f 4d 4d 41 50 2c 20 70 46 64 2d 3e 6c 61  RR_MMAP, pFd->la
23e90 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
23ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23eb0 22 77 69 6e 4d 61 70 66 69 6c 65 32 22 2c 20 70  "winMapfile2", p
23ec0 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  Fd->zPath);.    
23ed0 20 20 2f 2a 20 4c 6f 67 20 74 68 65 20 65 72 72    /* Log the err
23ee0 6f 72 2c 20 62 75 74 20 63 6f 6e 74 69 6e 75 65  or, but continue
23ef0 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f   normal operatio
23f00 6e 20 75 73 69 6e 67 20 78 52 65 61 64 2f 78 57  n using xRead/xW
23f10 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 4f 53  rite */.      OS
23f20 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45  TRACE(("MAP-FILE
23f30 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 70 46  -MAP pid=%lu, pF
23f40 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22  ile=%p, rc=%s\n"
23f50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23f60 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
23f70 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 73  cessId(), pFd, s
23f80 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
23f90 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )));.      retur
23fa0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
23fb0 20 7d 0a 20 20 20 20 70 46 64 2d 3e 70 4d 61 70   }.    pFd->pMap
23fc0 52 65 67 69 6f 6e 20 3d 20 70 4e 65 77 3b 0a 20  Region = pNew;. 
23fd0 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65     pFd->mmapSize
23fe0 20 3d 20 6e 4d 61 70 3b 0a 20 20 20 20 70 46 64   = nMap;.    pFd
23ff0 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
24000 20 3d 20 6e 4d 61 70 3b 0a 20 20 7d 0a 0a 20 20   = nMap;.  }..  
24010 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49  OSTRACE(("MAP-FI
24020 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  LE pid=%lu, pFil
24030 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
24040 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  OK\n",.         
24050 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
24060 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 29 29  ocessId(), pFd))
24070 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
24080 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
24090 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  * SQLITE_MAX_MMA
240a0 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a  P_SIZE>0 */../*.
240b0 2a 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  ** If possible, 
240c0 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
240d0 20 74 6f 20 61 20 6d 61 70 70 69 6e 67 20 6f 66   to a mapping of
240e0 20 66 69 6c 65 20 66 64 20 73 74 61 72 74 69 6e   file fd startin
240f0 67 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20 69  g at offset.** i
24100 4f 66 66 2e 20 54 68 65 20 6d 61 70 70 69 6e 67  Off. The mapping
24110 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64 20 66   must be valid f
24120 6f 72 20 61 74 20 6c 65 61 73 74 20 6e 41 6d 74  or at least nAmt
24130 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   bytes..**.** If
24140 20 73 75 63 68 20 61 20 70 6f 69 6e 74 65 72 20   such a pointer 
24150 63 61 6e 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  can be obtained,
24160 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 70 70   store it in *pp
24170 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
24180 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66  TE_OK..** Or, if
24190 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 75 74 20   one cannot but 
241a0 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
241b0 20 73 65 74 20 2a 70 70 20 74 6f 20 30 20 61 6e   set *pp to 0 an
241c0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
241d0 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20  OK..** Finally, 
241e0 69 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73  if an error does
241f0 20 6f 63 63 75 72 2c 20 72 65 74 75 72 6e 20 61   occur, return a
24200 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
24210 6f 64 65 2e 20 54 68 65 20 66 69 6e 61 6c 0a 2a  ode. The final.*
24220 2a 20 76 61 6c 75 65 20 6f 66 20 2a 70 70 20 69  * value of *pp i
24230 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74  s undefined in t
24240 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
24250 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  If this function
24260 20 64 6f 65 73 20 72 65 74 75 72 6e 20 61 20 70   does return a p
24270 6f 69 6e 74 65 72 2c 20 74 68 65 20 63 61 6c 6c  ointer, the call
24280 65 72 20 6d 75 73 74 20 65 76 65 6e 74 75 61 6c  er must eventual
24290 6c 79 0a 2a 2a 20 72 65 6c 65 61 73 65 20 74 68  ly.** release th
242a0 65 20 72 65 66 65 72 65 6e 63 65 20 62 79 20 63  e reference by c
242b0 61 6c 6c 69 6e 67 20 77 69 6e 55 6e 66 65 74 63  alling winUnfetc
242c0 68 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  h()..*/.static i
242d0 6e 74 20 77 69 6e 46 65 74 63 68 28 73 71 6c 69  nt winFetch(sqli
242e0 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
242f0 34 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74  4 iOff, int nAmt
24300 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69  , void **pp){.#i
24310 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
24320 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e 46 69  P_SIZE>0.  winFi
24330 6c 65 20 2a 70 46 64 20 3d 20 28 77 69 6e 46 69  le *pFd = (winFi
24340 6c 65 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65  le*)fd;   /* The
24350 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
24360 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e  base file */.#en
24370 64 69 66 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a  dif.  *pp = 0;..
24380 20 20 4f 53 54 52 41 43 45 28 28 22 46 45 54 43    OSTRACE(("FETC
24390 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  H pid=%lu, pFile
243a0 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64  =%p, offset=%lld
243b0 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 70 70 3d  , amount=%d, pp=
243c0 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %p\n",.         
243d0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
243e0 6f 63 65 73 73 49 64 28 29 2c 20 66 64 2c 20 69  ocessId(), fd, i
243f0 4f 66 66 2c 20 6e 41 6d 74 2c 20 70 70 29 29 3b  Off, nAmt, pp));
24400 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
24410 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69  _MMAP_SIZE>0.  i
24420 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  f( pFd->mmapSize
24430 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  Max>0 ){.    if(
24440 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
24450 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
24460 20 72 63 20 3d 20 77 69 6e 4d 61 70 66 69 6c 65   rc = winMapfile
24470 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20  (pFd, -1);.     
24480 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
24490 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 4f 53  OK ){.        OS
244a0 54 52 41 43 45 28 28 22 46 45 54 43 48 20 70 69  TRACE(("FETCH pi
244b0 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
244c0 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
244d0 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
244e0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
244f0 64 28 29 2c 20 70 46 64 2c 20 73 71 6c 69 74 65  d(), pFd, sqlite
24500 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
24510 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
24520 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
24530 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d  .    if( pFd->mm
24540 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66 66 2b 6e  apSize >= iOff+n
24550 41 6d 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  Amt ){.      *pp
24560 20 3d 20 26 28 28 75 38 20 2a 29 70 46 64 2d 3e   = &((u8 *)pFd->
24570 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66  pMapRegion)[iOff
24580 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6e 46  ];.      pFd->nF
24590 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d  etchOut++;.    }
245a0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 4f  .  }.#endif..  O
245b0 53 54 52 41 43 45 28 28 22 46 45 54 43 48 20 70  STRACE(("FETCH p
245c0 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
245d0 2c 20 70 70 3d 25 70 2c 20 2a 70 70 3d 25 70 2c  , pp=%p, *pp=%p,
245e0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
245f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
24600 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
24610 49 64 28 29 2c 20 66 64 2c 20 70 70 2c 20 2a 70  Id(), fd, pp, *p
24620 70 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  p));.  return SQ
24630 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
24640 2a 20 49 66 20 74 68 65 20 74 68 69 72 64 20 61  * If the third a
24650 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e  rgument is non-N
24660 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ULL, then this f
24670 75 6e 63 74 69 6f 6e 20 72 65 6c 65 61 73 65 73  unction releases
24680 20 61 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20   a.** reference 
24690 6f 62 74 61 69 6e 65 64 20 62 79 20 61 6e 20 65  obtained by an e
246a0 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 77  arlier call to w
246b0 69 6e 46 65 74 63 68 28 29 2e 20 54 68 65 20 73  inFetch(). The s
246c0 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  econd.** argumen
246d0 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  t passed to this
246e0 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
246f0 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
24700 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
24710 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 68 61 74  ** argument that
24720 20 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74   was passed to t
24730 68 65 20 77 69 6e 46 65 74 63 68 28 29 20 69 6e  he winFetch() in
24740 76 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  vocation..**.** 
24750 4f 72 2c 20 69 66 20 74 68 65 20 74 68 69 72 64  Or, if the third
24760 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c   argument is NUL
24770 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  L, then this fun
24780 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63  ction is being c
24790 61 6c 6c 65 64 0a 2a 2a 20 74 6f 20 69 6e 66 6f  alled.** to info
247a0 72 6d 20 74 68 65 20 56 46 53 20 6c 61 79 65 72  rm the VFS layer
247b0 20 74 68 61 74 2c 20 61 63 63 6f 72 64 69 6e 67   that, according
247c0 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e 79 20 65   to POSIX, any e
247d0 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 0a  xisting mapping.
247e0 2a 2a 20 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e  ** may now be in
247f0 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64  valid and should
24800 20 62 65 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f   be unmapped..*/
24810 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55  .static int winU
24820 6e 66 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66  nfetch(sqlite3_f
24830 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66  ile *fd, i64 iOf
24840 66 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 23 69 66  f, void *p){.#if
24850 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
24860 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e 46 69 6c  _SIZE>0.  winFil
24870 65 20 2a 70 46 64 20 3d 20 28 77 69 6e 46 69 6c  e *pFd = (winFil
24880 65 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20  e*)fd;   /* The 
24890 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62  underlying datab
248a0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f  ase file */..  /
248b0 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d 61 70  * If p==0 (unmap
248c0 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 6c 65   the entire file
248d0 29 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  ) then there mus
248e0 74 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64  t be no outstand
248f0 69 6e 67 0a 20 20 2a 2a 20 78 46 65 74 63 68 20  ing.  ** xFetch 
24900 72 65 66 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20  references. Or, 
24910 69 66 20 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67  if p!=0 (meaning
24920 20 69 74 20 69 73 20 61 6e 20 78 46 65 74 63 68   it is an xFetch
24930 20 72 65 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a   reference),.  *
24940 2a 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  * then there mus
24950 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  t be at least on
24960 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 2e 20 20  e outstanding.  
24970 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 3d  */.  assert( (p=
24980 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63  =0)==(pFd->nFetc
24990 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f  hOut==0) );..  /
249a0 2a 20 49 66 20 70 21 3d 30 2c 20 69 74 20 6d 75  * If p!=0, it mu
249b0 73 74 20 6d 61 74 63 68 20 74 68 65 20 69 4f 66  st match the iOf
249c0 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73  f value. */.  as
249d0 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d  sert( p==0 || p=
249e0 3d 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d  =&((u8 *)pFd->pM
249f0 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20  apRegion)[iOff] 
24a00 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  );..  OSTRACE(("
24a10 55 4e 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c  UNFETCH pid=%lu,
24a20 20 70 46 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65   pFile=%p, offse
24a30 74 3d 25 6c 6c 64 2c 20 70 3d 25 70 5c 6e 22 2c  t=%lld, p=%p\n",
24a40 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
24a50 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
24a60 64 28 29 2c 20 70 46 64 2c 20 69 4f 66 66 2c 20  d(), pFd, iOff, 
24a70 70 29 29 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b  p));..  if( p ){
24a80 0a 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68  .    pFd->nFetch
24a90 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Out--;.  }else{.
24aa0 20 20 20 20 2f 2a 20 46 49 58 4d 45 3a 20 20 49      /* FIXME:  I
24ab0 66 20 57 69 6e 64 6f 77 73 20 74 72 75 6c 79 20  f Windows truly 
24ac0 61 6c 77 61 79 73 20 70 72 65 76 65 6e 74 73 20  always prevents 
24ad0 74 72 75 6e 63 61 74 69 6e 67 20 6f 72 20 64 65  truncating or de
24ae0 6c 65 74 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20  leting a.    ** 
24af0 66 69 6c 65 20 77 68 69 6c 65 20 61 20 6d 61 70  file while a map
24b00 70 69 6e 67 20 69 73 20 68 65 6c 64 2c 20 74 68  ping is held, th
24b10 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  en the following
24b20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 29 20   winUnmapfile() 
24b30 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 69 73 20 75  call.    ** is u
24b40 6e 6e 65 63 65 73 73 61 72 79 20 63 61 6e 20 62  nnecessary can b
24b50 65 20 6f 6d 69 74 74 65 64 20 2d 20 70 6f 74 65  e omitted - pote
24b60 6e 74 69 61 6c 6c 79 20 69 6d 70 72 6f 76 69 6e  ntially improvin
24b70 67 0a 20 20 20 20 2a 2a 20 70 65 72 66 6f 72 6d  g.    ** perform
24b80 61 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20 77 69  ance.  */.    wi
24b90 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b  nUnmapfile(pFd);
24ba0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
24bb0 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 3d  pFd->nFetchOut>=
24bc0 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f  0 );.#endif..  O
24bd0 53 54 52 41 43 45 28 28 22 55 4e 46 45 54 43 48  STRACE(("UNFETCH
24be0 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
24bf0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
24c00 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
24c10 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
24c20 65 73 73 49 64 28 29 2c 20 66 64 29 29 3b 0a 20  essId(), fd));. 
24c30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
24c40 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65  K;.}../*.** Here
24c50 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d   ends the implem
24c60 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20  entation of all 
24c70 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74  sqlite3_file met
24c80 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  hods..**.*******
24c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
24ca0 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  End sqlite3_file
24cb0 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   Methods *******
24cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24cd0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
24ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24d20 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
24d30 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69  This vector defi
24d40 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68  nes all the meth
24d50 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65  ods that can ope
24d60 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71  rate on an.** sq
24d70 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f 72 20 77  lite3_file for w
24d80 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  in32..*/.static 
24d90 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
24da0 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d 65  _methods winIoMe
24db0 74 68 6f 64 20 3d 20 7b 0a 20 20 33 2c 20 20 20  thod = {.  3,   
24dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24dd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
24de0 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43  ersion */.  winC
24df0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
24e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
24e10 43 6c 6f 73 65 20 2a 2f 0a 20 20 77 69 6e 52 65  Close */.  winRe
24e20 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ad,             
24e30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
24e40 65 61 64 20 2a 2f 0a 20 20 77 69 6e 57 72 69 74  ead */.  winWrit
24e50 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
24e60 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69           /* xWri
24e70 74 65 20 2a 2f 0a 20 20 77 69 6e 54 72 75 6e 63  te */.  winTrunc
24e80 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
24e90 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e          /* xTrun
24ea0 63 61 74 65 20 2a 2f 0a 20 20 77 69 6e 53 79 6e  cate */.  winSyn
24eb0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
24ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79            /* xSy
24ed0 6e 63 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 53  nc */.  winFileS
24ee0 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
24ef0 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
24f00 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63  Size */.  winLoc
24f10 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
24f20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
24f30 63 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63  ck */.  winUnloc
24f40 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
24f50 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
24f60 63 6b 20 2a 2f 0a 20 20 77 69 6e 43 68 65 63 6b  ck */.  winCheck
24f70 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
24f80 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63          /* xChec
24f90 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f  kReservedLock */
24fa0 0a 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f  .  winFileContro
24fb0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
24fc0 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72     /* xFileContr
24fd0 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53 65 63 74 6f  ol */.  winSecto
24fe0 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  rSize,          
24ff0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74          /* xSect
25000 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 44  orSize */.  winD
25010 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
25020 74 69 63 73 2c 20 20 20 20 20 20 20 2f 2a 20 78  tics,       /* x
25030 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
25040 73 74 69 63 73 20 2a 2f 0a 20 20 77 69 6e 53 68  stics */.  winSh
25050 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20  mMap,           
25060 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
25070 68 6d 4d 61 70 20 2a 2f 0a 20 20 77 69 6e 53 68  hmMap */.  winSh
25080 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  mLock,          
25090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
250a0 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 53  hmLock */.  winS
250b0 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20  hmBarrier,      
250c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
250d0 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20 20  ShmBarrier */.  
250e0 77 69 6e 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20  winShmUnmap,    
250f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25100 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a  /* xShmUnmap */.
25110 20 20 77 69 6e 46 65 74 63 68 2c 20 20 20 20 20    winFetch,     
25120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25130 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 0a 20    /* xFetch */. 
25140 20 77 69 6e 55 6e 66 65 74 63 68 20 20 20 20 20   winUnfetch     
25150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25160 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f 0a   /* xUnfetch */.
25170 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  };../*.** This v
25180 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c  ector defines al
25190 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68  l the methods th
251a0 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f  at can operate o
251b0 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  n an.** sqlite3_
251c0 66 69 6c 65 20 66 6f 72 20 77 69 6e 33 32 20 77  file for win32 w
251d0 69 74 68 6f 75 74 20 70 65 72 66 6f 72 6d 69 6e  ithout performin
251e0 67 20 61 6e 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a  g any locking..*
251f0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
25200 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
25210 73 20 77 69 6e 49 6f 4e 6f 6c 6f 63 6b 4d 65 74  s winIoNolockMet
25220 68 6f 64 20 3d 20 7b 0a 20 20 33 2c 20 20 20 20  hod = {.  3,    
25230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
25250 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c  rsion */.  winCl
25260 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
25270 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
25280 6c 6f 73 65 20 2a 2f 0a 20 20 77 69 6e 52 65 61  lose */.  winRea
25290 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
252a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
252b0 61 64 20 2a 2f 0a 20 20 77 69 6e 57 72 69 74 65  ad */.  winWrite
252c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
252d0 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74          /* xWrit
252e0 65 20 2a 2f 0a 20 20 77 69 6e 54 72 75 6e 63 61  e */.  winTrunca
252f0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
25300 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63         /* xTrunc
25310 61 74 65 20 2a 2f 0a 20 20 77 69 6e 53 79 6e 63  ate */.  winSync
25320 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25330 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e           /* xSyn
25340 63 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 53 69  c */.  winFileSi
25350 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
25360 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53         /* xFileS
25370 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 4e 6f 6c 6f  ize */.  winNolo
25380 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ckLock,         
25390 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
253a0 6b 20 2a 2f 0a 20 20 77 69 6e 4e 6f 6c 6f 63 6b  k */.  winNolock
253b0 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
253c0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
253d0 6b 20 2a 2f 0a 20 20 77 69 6e 4e 6f 6c 6f 63 6b  k */.  winNolock
253e0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
253f0 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  k,     /* xCheck
25400 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a  ReservedLock */.
25410 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c    winFileControl
25420 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25430 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f    /* xFileContro
25440 6c 20 2a 2f 0a 20 20 77 69 6e 53 65 63 74 6f 72  l */.  winSector
25450 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
25460 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f         /* xSecto
25470 72 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 44 65  rSize */.  winDe
25480 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
25490 69 63 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 44  ics,       /* xD
254a0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
254b0 74 69 63 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  tics */.  winShm
254c0 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  Map,            
254d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
254e0 6d 4d 61 70 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  mMap */.  winShm
254f0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
25500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
25510 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 53 68  mLock */.  winSh
25520 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20  mBarrier,       
25530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
25540 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20 20 77  hmBarrier */.  w
25550 69 6e 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20  inShmUnmap,     
25560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25570 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20  * xShmUnmap */. 
25580 20 77 69 6e 46 65 74 63 68 2c 20 20 20 20 20 20   winFetch,      
25590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255a0 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 0a 20 20   /* xFetch */.  
255b0 77 69 6e 55 6e 66 65 74 63 68 20 20 20 20 20 20  winUnfetch      
255c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255d0 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f 0a 7d  /* xUnfetch */.}
255e0 3b 0a 0a 73 74 61 74 69 63 20 77 69 6e 56 66 73  ;..static winVfs
255f0 41 70 70 44 61 74 61 20 77 69 6e 41 70 70 44 61  AppData winAppDa
25600 74 61 20 3d 20 7b 0a 20 20 26 77 69 6e 49 6f 4d  ta = {.  &winIoM
25610 65 74 68 6f 64 2c 20 20 20 20 20 20 20 2f 2a 20  ethod,       /* 
25620 70 4d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 2c 20  pMethod */.  0, 
25630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25640 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a   /* pAppData */.
25650 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
25660 20 20 20 20 20 20 2f 2a 20 62 4e 6f 4c 6f 63 6b        /* bNoLock
25670 20 2a 2f 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 77   */.};..static w
25680 69 6e 56 66 73 41 70 70 44 61 74 61 20 77 69 6e  inVfsAppData win
25690 4e 6f 6c 6f 63 6b 41 70 70 44 61 74 61 20 3d 20  NolockAppData = 
256a0 7b 0a 20 20 26 77 69 6e 49 6f 4e 6f 6c 6f 63 6b  {.  &winIoNolock
256b0 4d 65 74 68 6f 64 2c 20 2f 2a 20 70 4d 65 74 68  Method, /* pMeth
256c0 6f 64 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  od */.  0,      
256d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
256e0 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 31 20 20  AppData */.  1  
256f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25700 20 2f 2a 20 62 4e 6f 4c 6f 63 6b 20 2a 2f 0a 7d   /* bNoLock */.}
25710 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;../************
25720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25760 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
25770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71  ************* sq
25780 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64  lite3_vfs method
25790 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
257a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
257b0 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69  *.** This divisi
257c0 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
257d0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
257e0 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65  f methods on the
257f0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  .** sqlite3_vfs 
25800 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 23 69 66 20  object..*/..#if 
25810 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
25820 5f 5f 29 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  __)./*.** Conver
25830 74 20 61 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f  t a filename fro
25840 6d 20 77 68 61 74 65 76 65 72 20 74 68 65 20 75  m whatever the u
25850 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74  nderlying operat
25860 69 6e 67 20 73 79 73 74 65 6d 0a 2a 2a 20 73 75  ing system.** su
25870 70 70 6f 72 74 73 20 66 6f 72 20 66 69 6c 65 6e  pports for filen
25880 61 6d 65 73 20 69 6e 74 6f 20 55 54 46 2d 38 2e  ames into UTF-8.
25890 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
258a0 74 68 65 20 72 65 73 75 6c 74 20 69 73 0a 2a 2a  the result is.**
258b0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
258c0 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62  alloc and must b
258d0 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
258e0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
258f0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
25900 2a 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66  *winConvertToUtf
25910 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20  8Filename(const 
25920 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  void *zFilename)
25930 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 76 65  {.  char *zConve
25940 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20  rted = 0;.  if( 
25950 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
25960 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
25970 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 46  UnicodeToUtf8(zF
25980 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69  ilename);.  }.#i
25990 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
259a0 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
259b0 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65  e{.    zConverte
259c0 64 20 3d 20 77 69 6e 4d 62 63 73 54 6f 55 74 66  d = winMbcsToUtf
259d0 38 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 6f 73 41  8(zFilename, osA
259e0 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29  reFileApisANSI()
259f0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
25a00 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68  /* caller will h
25a10 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d  andle out of mem
25a20 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ory */.  return 
25a30 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 23 65  zConverted;.}.#e
25a40 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  ndif../*.** Conv
25a50 65 72 74 20 61 20 55 54 46 2d 38 20 66 69 6c 65  ert a UTF-8 file
25a60 6e 61 6d 65 20 69 6e 74 6f 20 77 68 61 74 65 76  name into whatev
25a70 65 72 20 66 6f 72 6d 20 74 68 65 20 75 6e 64 65  er form the unde
25a80 72 6c 79 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  rlying.** operat
25a90 69 6e 67 20 73 79 73 74 65 6d 20 77 61 6e 74 73  ing system wants
25aa0 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e 2e 20 20   filenames in.  
25ab0 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
25ac0 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 73 20 6f  e result.** is o
25ad0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
25ae0 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65 20  loc and must be 
25af0 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
25b00 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
25b10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
25b20 20 2a 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d   *winConvertFrom
25b30 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e  Utf8Filename(con
25b40 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
25b50 6d 65 29 7b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  me){.  void *zCo
25b60 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69  nverted = 0;.  i
25b70 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20  f( osIsNT() ){. 
25b80 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20     zConverted = 
25b90 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65  winUtf8ToUnicode
25ba0 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d  (zFilename);.  }
25bb0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
25bc0 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
25bd0 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65  else{.    zConve
25be0 72 74 65 64 20 3d 20 77 69 6e 55 74 66 38 54 6f  rted = winUtf8To
25bf0 4d 62 63 73 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  Mbcs(zFilename, 
25c00 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
25c10 49 28 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  I());.  }.#endif
25c20 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c  .  /* caller wil
25c30 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20  l handle out of 
25c40 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75  memory */.  retu
25c50 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d  rn zConverted;.}
25c60 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
25c70 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f  ction returns no
25c80 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70  n-zero if the sp
25c90 65 63 69 66 69 65 64 20 55 54 46 2d 38 20 73 74  ecified UTF-8 st
25ca0 72 69 6e 67 20 62 75 66 66 65 72 0a 2a 2a 20 65  ring buffer.** e
25cb0 6e 64 73 20 77 69 74 68 20 61 20 64 69 72 65 63  nds with a direc
25cc0 74 6f 72 79 20 73 65 70 61 72 61 74 6f 72 20 63  tory separator c
25cd0 68 61 72 61 63 74 65 72 20 6f 72 20 6f 6e 65 20  haracter or one 
25ce0 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
25cf0 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 69 74 2e  .** added to it.
25d00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
25d10 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 69 72 53 65  inMakeEndInDirSe
25d20 70 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  p(int nBuf, char
25d30 20 2a 7a 42 75 66 29 7b 0a 20 20 69 66 28 20 7a   *zBuf){.  if( z
25d40 42 75 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  Buf ){.    int n
25d50 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Len = sqlite3Str
25d60 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 20  len30(zBuf);.   
25d70 20 69 66 28 20 6e 4c 65 6e 3e 30 20 29 7b 0a 20   if( nLen>0 ){. 
25d80 20 20 20 20 20 69 66 28 20 77 69 6e 49 73 44 69       if( winIsDi
25d90 72 53 65 70 28 7a 42 75 66 5b 6e 4c 65 6e 2d 31  rSep(zBuf[nLen-1
25da0 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ]) ){.        re
25db0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65  turn 1;.      }e
25dc0 6c 73 65 20 69 66 28 20 6e 4c 65 6e 2b 31 3c 6e  lse if( nLen+1<n
25dd0 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  Buf ){.        z
25de0 42 75 66 5b 6e 4c 65 6e 5d 20 3d 20 77 69 6e 47  Buf[nLen] = winG
25df0 65 74 44 69 72 53 65 70 28 29 3b 0a 20 20 20 20  etDirSep();.    
25e00 20 20 20 20 7a 42 75 66 5b 6e 4c 65 6e 2b 31 5d      zBuf[nLen+1]
25e10 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20   = '\0';.       
25e20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
25e30 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
25e40 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
25e50 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f  * Create a tempo
25e60 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 61  rary file name a
25e70 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
25e80 75 6c 74 69 6e 67 20 70 6f 69 6e 74 65 72 20 69  ulting pointer i
25e90 6e 74 6f 20 70 7a 42 75 66 2e 0a 2a 2a 20 54 68  nto pzBuf..** Th
25ea0 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
25eb0 65 64 20 69 6e 20 70 7a 42 75 66 20 6d 75 73 74  ed in pzBuf must
25ec0 20 62 65 20 66 72 65 65 64 20 76 69 61 20 73 71   be freed via sq
25ed0 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f  lite3_free()..*/
25ee0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47  .static int winG
25ef0 65 74 54 65 6d 70 6e 61 6d 65 28 73 71 6c 69 74  etTempname(sqlit
25f00 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 68  e3_vfs *pVfs, ch
25f10 61 72 20 2a 2a 70 7a 42 75 66 29 7b 0a 20 20 73  ar **pzBuf){.  s
25f20 74 61 74 69 63 20 63 68 61 72 20 7a 43 68 61 72  tatic char zChar
25f30 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65  s[] =.    "abcde
25f40 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
25f50 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44  vwxyz".    "ABCD
25f60 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54  EFGHIJKLMNOPQRST
25f70 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32  UVWXYZ".    "012
25f80 33 34 35 36 37 38 39 22 3b 0a 20 20 73 69 7a 65  3456789";.  size
25f90 5f 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e  _t i, j;.  int n
25fa0 50 72 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Pre = sqlite3Str
25fb0 6c 65 6e 33 30 28 53 51 4c 49 54 45 5f 54 45 4d  len30(SQLITE_TEM
25fc0 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 3b 0a  P_FILE_PREFIX);.
25fd0 20 20 69 6e 74 20 6e 4d 61 78 2c 20 6e 42 75 66    int nMax, nBuf
25fe0 2c 20 6e 44 69 72 2c 20 6e 4c 65 6e 3b 0a 20 20  , nDir, nLen;.  
25ff0 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 2f  char *zBuf;..  /
26000 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
26010 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
26020 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
26030 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
26040 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
26050 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
26060 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
26070 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
26080 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
26090 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 0a  nction failing..
260a0 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49    */.  SimulateI
260b0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
260c0 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a  QLITE_IOERR );..
260d0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
260e0 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72  temporary buffer
260f0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 75   to store the fu
26100 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 66 69  lly qualified fi
26110 6c 65 0a 20 20 2a 2a 20 6e 61 6d 65 20 66 6f 72  le.  ** name for
26120 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
26130 69 6c 65 2e 20 20 49 66 20 74 68 69 73 20 66 61  ile.  If this fa
26140 69 6c 73 2c 20 77 65 20 63 61 6e 6e 6f 74 20 63  ils, we cannot c
26150 6f 6e 74 69 6e 75 65 2e 0a 20 20 2a 2f 0a 20 20  ontinue..  */.  
26160 6e 4d 61 78 20 3d 20 70 56 66 73 2d 3e 6d 78 50  nMax = pVfs->mxP
26170 61 74 68 6e 61 6d 65 3b 20 6e 42 75 66 20 3d 20  athname; nBuf = 
26180 6e 4d 61 78 20 2b 20 32 3b 0a 20 20 7a 42 75 66  nMax + 2;.  zBuf
26190 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
261a0 5a 65 72 6f 28 20 6e 42 75 66 20 29 3b 0a 20 20  Zero( nBuf );.  
261b0 69 66 28 20 21 7a 42 75 66 20 29 7b 0a 20 20 20  if( !zBuf ){.   
261c0 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
261d0 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
261e0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e  TE_IOERR_NOMEM\n
261f0 22 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  "));.    return 
26200 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
26210 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  EM_BKPT;.  }..  
26220 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  /* Figure out th
26230 65 20 65 66 66 65 63 74 69 76 65 20 74 65 6d 70  e effective temp
26240 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e  orary directory.
26250 20 20 46 69 72 73 74 2c 20 63 68 65 63 6b 20 69    First, check i
26260 66 20 6f 6e 65 0a 20 20 2a 2a 20 68 61 73 20 62  f one.  ** has b
26270 65 65 6e 20 65 78 70 6c 69 63 69 74 6c 79 20 73  een explicitly s
26280 65 74 20 62 79 20 74 68 65 20 61 70 70 6c 69 63  et by the applic
26290 61 74 69 6f 6e 3b 20 6f 74 68 65 72 77 69 73 65  ation; otherwise
262a0 2c 20 75 73 65 20 74 68 65 20 6f 6e 65 0a 20 20  , use the one.  
262b0 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79  ** configured by
262c0 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
262d0 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 44  ystem..  */.  nD
262e0 69 72 20 3d 20 6e 4d 61 78 20 2d 20 28 6e 50 72  ir = nMax - (nPr
262f0 65 20 2b 20 31 35 29 3b 0a 20 20 61 73 73 65 72  e + 15);.  asser
26300 74 28 20 6e 44 69 72 3e 30 20 29 3b 0a 20 20 69  t( nDir>0 );.  i
26310 66 28 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  f( sqlite3_temp_
26320 64 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20  directory ){.   
26330 20 69 6e 74 20 6e 44 69 72 4c 65 6e 20 3d 20 73   int nDirLen = s
26340 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73  qlite3Strlen30(s
26350 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
26360 63 74 6f 72 79 29 3b 0a 20 20 20 20 69 66 28 20  ctory);.    if( 
26370 6e 44 69 72 4c 65 6e 3e 30 20 29 7b 0a 20 20 20  nDirLen>0 ){.   
26380 20 20 20 69 66 28 20 21 77 69 6e 49 73 44 69 72     if( !winIsDir
26390 53 65 70 28 73 71 6c 69 74 65 33 5f 74 65 6d 70  Sep(sqlite3_temp
263a0 5f 64 69 72 65 63 74 6f 72 79 5b 6e 44 69 72 4c  _directory[nDirL
263b0 65 6e 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20 20  en-1]) ){.      
263c0 20 20 6e 44 69 72 4c 65 6e 2b 2b 3b 0a 20 20 20    nDirLen++;.   
263d0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
263e0 44 69 72 4c 65 6e 3e 6e 44 69 72 20 29 7b 0a 20  DirLen>nDir ){. 
263f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
26400 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ree(zBuf);.     
26410 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
26420 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
26430 4c 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b  LITE_ERROR\n"));
26440 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
26450 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
26460 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77 69  TE_ERROR, 0, "wi
26470 6e 47 65 74 54 65 6d 70 6e 61 6d 65 31 22 2c 20  nGetTempname1", 
26480 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
26490 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
264a0 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22  tf(nMax, zBuf, "
264b0 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d  %s", sqlite3_tem
264c0 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20  p_directory);.  
264d0 20 20 7d 0a 20 20 7d 0a 23 69 66 20 64 65 66 69    }.  }.#if defi
264e0 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a  ned(__CYGWIN__).
264f0 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74    else{.    stat
26500 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
26510 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  zDirs[] = {.    
26520 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28     0, /* getenv(
26530 22 53 51 4c 49 54 45 5f 54 4d 50 44 49 52 22 29  "SQLITE_TMPDIR")
26540 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a   */.       0, /*
26550 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22   getenv("TMPDIR"
26560 29 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f  ) */.       0, /
26570 2a 20 67 65 74 65 6e 76 28 22 54 4d 50 22 29 20  * getenv("TMP") 
26580 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20  */.       0, /* 
26590 67 65 74 65 6e 76 28 22 54 45 4d 50 22 29 20 2a  getenv("TEMP") *
265a0 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67  /.       0, /* g
265b0 65 74 65 6e 76 28 22 55 53 45 52 50 52 4f 46 49  etenv("USERPROFI
265c0 4c 45 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 22  LE") */.       "
265d0 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /var/tmp",.     
265e0 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20    "/usr/tmp",.  
265f0 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20       "/tmp",.   
26600 20 20 20 20 22 2e 22 2c 0a 20 20 20 20 20 20 20      ".",.       
26610 30 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  0        /* List
26620 20 74 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20   terminator */. 
26630 20 20 20 7d 3b 0a 20 20 20 20 75 6e 73 69 67 6e     };.    unsign
26640 65 64 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f  ed int i;.    co
26650 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d  nst char *zDir =
26660 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 21 61 7a   0;..    if( !az
26670 44 69 72 73 5b 30 5d 20 29 20 61 7a 44 69 72 73  Dirs[0] ) azDirs
26680 5b 30 5d 20 3d 20 67 65 74 65 6e 76 28 22 53 51  [0] = getenv("SQ
26690 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 3b 0a 20  LITE_TMPDIR");. 
266a0 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31     if( !azDirs[1
266b0 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20  ] ) azDirs[1] = 
266c0 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29  getenv("TMPDIR")
266d0 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69 72  ;.    if( !azDir
266e0 73 5b 32 5d 20 29 20 61 7a 44 69 72 73 5b 32 5d  s[2] ) azDirs[2]
266f0 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 22 29   = getenv("TMP")
26700 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69 72  ;.    if( !azDir
26710 73 5b 33 5d 20 29 20 61 7a 44 69 72 73 5b 33 5d  s[3] ) azDirs[3]
26720 20 3d 20 67 65 74 65 6e 76 28 22 54 45 4d 50 22   = getenv("TEMP"
26730 29 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69  );.    if( !azDi
26740 72 73 5b 34 5d 20 29 20 61 7a 44 69 72 73 5b 34  rs[4] ) azDirs[4
26750 5d 20 3d 20 67 65 74 65 6e 76 28 22 55 53 45 52  ] = getenv("USER
26760 50 52 4f 46 49 4c 45 22 29 3b 0a 20 20 20 20 66  PROFILE");.    f
26770 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
26780 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28  (azDirs)/sizeof(
26790 61 7a 44 69 72 73 5b 30 5d 29 3b 20 7a 44 69 72  azDirs[0]); zDir
267a0 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20  =azDirs[i++]){. 
267b0 20 20 20 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76       void *zConv
267c0 65 72 74 65 64 3b 0a 20 20 20 20 20 20 69 66 28  erted;.      if(
267d0 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69   zDir==0 ) conti
267e0 6e 75 65 3b 0a 20 20 20 20 20 20 2f 2a 20 49 66  nue;.      /* If
267f0 20 74 68 65 20 70 61 74 68 20 73 74 61 72 74 73   the path starts
26800 20 77 69 74 68 20 61 20 64 72 69 76 65 20 6c 65   with a drive le
26810 74 74 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79  tter followed by
26820 20 74 68 65 20 63 6f 6c 6f 6e 0a 20 20 20 20 20   the colon.     
26830 20 2a 2a 20 63 68 61 72 61 63 74 65 72 2c 20 61   ** character, a
26840 73 73 75 6d 65 20 69 74 20 69 73 20 61 6c 72 65  ssume it is alre
26850 61 64 79 20 61 20 6e 61 74 69 76 65 20 57 69 6e  ady a native Win
26860 33 32 20 70 61 74 68 3b 20 6f 74 68 65 72 77 69  32 path; otherwi
26870 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  se,.      ** it 
26880 6d 75 73 74 20 62 65 20 63 6f 6e 76 65 72 74 65  must be converte
26890 64 20 74 6f 20 61 20 6e 61 74 69 76 65 20 57 69  d to a native Wi
268a0 6e 33 32 20 70 61 74 68 20 76 69 61 20 74 68 65  n32 path via the
268b0 20 43 79 67 77 69 6e 20 41 50 49 0a 20 20 20 20   Cygwin API.    
268c0 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 75 73    ** prior to us
268d0 69 6e 67 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f  ing it..      */
268e0 0a 20 20 20 20 20 20 69 66 28 20 77 69 6e 49 73  .      if( winIs
268f0 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f  DriveLetterAndCo
26900 6c 6f 6e 28 7a 44 69 72 29 20 29 7b 0a 20 20 20  lon(zDir) ){.   
26910 20 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20       zConverted 
26920 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d  = winConvertFrom
26930 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 44 69  Utf8Filename(zDi
26940 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
26950 21 7a 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20  !zConverted ){. 
26960 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
26970 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
26980 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
26990 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
269a0 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
269b0 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20  OMEM\n"));.     
269c0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
269d0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42  TE_IOERR_NOMEM_B
269e0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  KPT;.        }. 
269f0 20 20 20 20 20 20 20 69 66 28 20 77 69 6e 49 73         if( winIs
26a00 44 69 72 28 7a 43 6f 6e 76 65 72 74 65 64 29 20  Dir(zConverted) 
26a10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
26a20 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d  ite3_snprintf(nM
26a30 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20  ax, zBuf, "%s", 
26a40 7a 44 69 72 29 3b 0a 20 20 20 20 20 20 20 20 20  zDir);.         
26a50 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
26a60 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
26a70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26a80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
26a90 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
26aa0 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 7d 65  erted);.      }e
26ab0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  lse{.        zCo
26ac0 6e 76 65 72 74 65 64 20 3d 20 73 71 6c 69 74 65  nverted = sqlite
26ad0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61  3MallocZero( nMa
26ae0 78 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69  x+1 );.        i
26af0 66 28 20 21 7a 43 6f 6e 76 65 72 74 65 64 20 29  f( !zConverted )
26b00 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
26b10 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
26b20 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41 43            OSTRAC
26b30 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
26b40 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
26b50 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20  R_NOMEM\n"));.  
26b60 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
26b70 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
26b80 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  M_BKPT;.        
26b90 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 79  }.        if( cy
26ba0 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 0a  gwin_conv_path(.
26bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bc0 6f 73 49 73 4e 54 28 29 20 3f 20 43 43 50 5f 50  osIsNT() ? CCP_P
26bd0 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20  OSIX_TO_WIN_W : 
26be0 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e  CCP_POSIX_TO_WIN
26bf0 5f 41 2c 20 7a 44 69 72 2c 0a 20 20 20 20 20 20  _A, zDir,.      
26c00 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6e 76 65            zConve
26c10 72 74 65 64 2c 20 6e 4d 61 78 2b 31 29 3c 30 20  rted, nMax+1)<0 
26c20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
26c30 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
26c40 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20  rted);.         
26c50 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
26c60 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 4f  uf);.          O
26c70 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
26c80 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
26c90 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 5c  _IOERR_CONVPATH\
26ca0 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n"));.          
26cb0 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
26cc0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
26cd0 43 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f 52 44  CONVPATH, (DWORD
26ce0 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  )errno,.        
26cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d00 20 20 20 20 20 22 77 69 6e 47 65 74 54 65 6d 70       "winGetTemp
26d10 6e 61 6d 65 32 22 2c 20 7a 44 69 72 29 3b 0a 20  name2", zDir);. 
26d20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26d30 20 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43   if( winIsDir(zC
26d40 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20  onverted) ){.   
26d50 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69         /* At thi
26d60 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77  s point, we know
26d70 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 64   the candidate d
26d80 69 72 65 63 74 6f 72 79 20 65 78 69 73 74 73 20  irectory exists 
26d90 61 6e 64 20 73 68 6f 75 6c 64 0a 20 20 20 20 20  and should.     
26da0 20 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64 2e       ** be used.
26db0 20 20 48 6f 77 65 76 65 72 2c 20 77 65 20 6d 61    However, we ma
26dc0 79 20 6e 65 65 64 20 74 6f 20 63 6f 6e 76 65 72  y need to conver
26dd0 74 20 74 68 65 20 73 74 72 69 6e 67 20 63 6f 6e  t the string con
26de0 74 61 69 6e 69 6e 67 0a 20 20 20 20 20 20 20 20  taining.        
26df0 20 20 2a 2a 20 69 74 73 20 6e 61 6d 65 20 69 6e    ** its name in
26e00 74 6f 20 55 54 46 2d 38 20 28 69 2e 65 2e 20 69  to UTF-8 (i.e. i
26e10 66 20 69 74 20 69 73 20 55 54 46 2d 31 36 20 72  f it is UTF-16 r
26e20 69 67 68 74 20 6e 6f 77 29 2e 0a 20 20 20 20 20  ight now)..     
26e30 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
26e40 20 20 63 68 61 72 20 2a 7a 55 74 66 38 20 3d 20    char *zUtf8 = 
26e50 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38  winConvertToUtf8
26e60 46 69 6c 65 6e 61 6d 65 28 7a 43 6f 6e 76 65 72  Filename(zConver
26e70 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ted);.          
26e80 69 66 28 20 21 7a 55 74 66 38 20 29 7b 0a 20 20  if( !zUtf8 ){.  
26e90 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
26ea0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
26eb0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
26ec0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
26ed0 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  f);.            
26ee0 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
26ef0 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
26f00 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
26f10 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
26f20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
26f30 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
26f40 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26f50 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
26f60 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75  printf(nMax, zBu
26f70 66 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b  f, "%s", zUtf8);
26f80 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
26f90 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a  e3_free(zUtf8);.
26fa0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
26fb0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
26fc0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  d);.          br
26fd0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
26fe0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
26ff0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
27000 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
27010 20 7d 0a 23 65 6c 69 66 20 21 53 51 4c 49 54 45   }.#elif !SQLITE
27020 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65  _OS_WINRT && !de
27030 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
27040 29 0a 20 20 65 6c 73 65 20 69 66 28 20 6f 73 49  ).  else if( osI
27050 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 63 68 61  sNT() ){.    cha
27060 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 4c  r *zMulti;.    L
27070 50 57 53 54 52 20 7a 57 69 64 65 50 61 74 68 20  PWSTR zWidePath 
27080 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
27090 65 72 6f 28 20 6e 4d 61 78 2a 73 69 7a 65 6f 66  ero( nMax*sizeof
270a0 28 57 43 48 41 52 29 20 29 3b 0a 20 20 20 20 69  (WCHAR) );.    i
270b0 66 28 20 21 7a 57 69 64 65 50 61 74 68 20 29 7b  f( !zWidePath ){
270c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
270d0 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ree(zBuf);.     
270e0 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
270f0 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
27100 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e  TE_IOERR_NOMEM\n
27110 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "));.      retur
27120 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
27130 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
27140 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 54 65  .    if( osGetTe
27150 6d 70 50 61 74 68 57 28 6e 4d 61 78 2c 20 7a 57  mpPathW(nMax, zW
27160 69 64 65 50 61 74 68 29 3d 3d 30 20 29 7b 0a 20  idePath)==0 ){. 
27170 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
27180 65 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20  e(zWidePath);.  
27190 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
271a0 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53  (zBuf);.      OS
271b0 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
271c0 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
271d0 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54  IOERR_GETTEMPPAT
271e0 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65  H\n"));.      re
271f0 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
27200 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45  (SQLITE_IOERR_GE
27210 54 54 45 4d 50 50 41 54 48 2c 20 6f 73 47 65 74  TTEMPPATH, osGet
27220 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
27230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27240 20 20 20 20 20 20 22 77 69 6e 47 65 74 54 65 6d        "winGetTem
27250 70 6e 61 6d 65 32 22 2c 20 30 29 3b 0a 20 20 20  pname2", 0);.   
27260 20 7d 0a 20 20 20 20 7a 4d 75 6c 74 69 20 3d 20   }.    zMulti = 
27270 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38  winUnicodeToUtf8
27280 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20  (zWidePath);.   
27290 20 69 66 28 20 7a 4d 75 6c 74 69 20 29 7b 0a 20   if( zMulti ){. 
272a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
272b0 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66  rintf(nMax, zBuf
272c0 2c 20 22 25 73 22 2c 20 7a 4d 75 6c 74 69 29 3b  , "%s", zMulti);
272d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
272e0 72 65 65 28 7a 4d 75 6c 74 69 29 3b 0a 20 20 20  ree(zMulti);.   
272f0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
27300 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20  zWidePath);.    
27310 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
27320 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 50  ite3_free(zWideP
27330 61 74 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ath);.      sqli
27340 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
27350 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
27360 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
27370 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
27380 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  MEM\n"));.      
27390 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
273a0 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
273b0 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66      }.  }.#ifdef
273c0 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
273d0 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
273e0 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 3b 0a     char *zUtf8;.
273f0 20 20 20 20 63 68 61 72 20 2a 7a 4d 62 63 73 50      char *zMbcsP
27400 61 74 68 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ath = sqlite3Mal
27410 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61 78 20 29 3b  locZero( nMax );
27420 0a 20 20 20 20 69 66 28 20 21 7a 4d 62 63 73 50  .    if( !zMbcsP
27430 61 74 68 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ath ){.      sql
27440 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
27450 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
27460 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
27470 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
27480 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20  OMEM\n"));.     
27490 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
274a0 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
274b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
274c0 73 47 65 74 54 65 6d 70 50 61 74 68 41 28 6e 4d  sGetTempPathA(nM
274d0 61 78 2c 20 7a 4d 62 63 73 50 61 74 68 29 3d 3d  ax, zMbcsPath)==
274e0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
274f0 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20  e3_free(zBuf);. 
27500 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
27510 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
27520 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54  SQLITE_IOERR_GET
27530 54 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20  TEMPPATH\n"));. 
27540 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
27550 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
27560 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48  OERR_GETTEMPPATH
27570 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
27580 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
27590 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
275a0 6e 47 65 74 54 65 6d 70 6e 61 6d 65 33 22 2c 20  nGetTempname3", 
275b0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55  0);.    }.    zU
275c0 74 66 38 20 3d 20 77 69 6e 4d 62 63 73 54 6f 55  tf8 = winMbcsToU
275d0 74 66 38 28 7a 4d 62 63 73 50 61 74 68 2c 20 6f  tf8(zMbcsPath, o
275e0 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  sAreFileApisANSI
275f0 28 29 29 3b 0a 20 20 20 20 69 66 28 20 7a 55 74  ());.    if( zUt
27600 66 38 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  f8 ){.      sqli
27610 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61  te3_snprintf(nMa
27620 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a  x, zBuf, "%s", z
27630 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c  Utf8);.      sql
27640 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29  ite3_free(zUtf8)
27650 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
27660 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
27670 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54  zBuf);.      OST
27680 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
27690 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49  NAME rc=SQLITE_I
276a0 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b  OERR_NOMEM\n"));
276b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
276c0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
276d0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
276e0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
276f0 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
27700 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53   */.#endif /* !S
27710 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 2a  QLITE_OS_WINRT *
27720 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 68 65  /..  /*.  ** Che
27730 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
27740 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69  the temporary di
27750 72 65 63 74 6f 72 79 20 65 6e 64 73 20 77 69 74  rectory ends wit
27760 68 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  h an appropriate
27770 0a 20 20 2a 2a 20 73 65 70 61 72 61 74 6f 72 2e  .  ** separator.
27780 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74    If it does not
27790 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
277a0 74 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 6c  t enough space l
277b0 65 66 74 20 74 6f 20 61 64 64 0a 20 20 2a 2a 20  eft to add.  ** 
277c0 6f 6e 65 2c 20 66 61 69 6c 2e 0a 20 20 2a 2f 0a  one, fail..  */.
277d0 20 20 69 66 28 20 21 77 69 6e 4d 61 6b 65 45 6e    if( !winMakeEn
277e0 64 49 6e 44 69 72 53 65 70 28 6e 44 69 72 2b 31  dInDirSep(nDir+1
277f0 2c 20 7a 42 75 66 29 20 29 7b 0a 20 20 20 20 73  , zBuf) ){.    s
27800 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
27810 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
27820 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
27830 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e  c=SQLITE_ERROR\n
27840 22 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  "));.    return 
27850 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
27860 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77 69  TE_ERROR, 0, "wi
27870 6e 47 65 74 54 65 6d 70 6e 61 6d 65 34 22 2c 20  nGetTempname4", 
27880 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  0);.  }..  /*.  
27890 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  ** Check that th
278a0 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
278b0 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  is large enough 
278c0 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72  for the temporar
278d0 79 20 66 69 6c 65 0a 20 20 2a 2a 20 6e 61 6d 65  y file.  ** name
278e0 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
278f0 67 20 66 6f 72 6d 61 74 3a 0a 20 20 2a 2a 0a 20  g format:.  **. 
27900 20 2a 2a 20 20 20 22 3c 74 65 6d 70 6f 72 61 72   **   "<temporar
27910 79 5f 64 69 72 65 63 74 6f 72 79 3e 2f 65 74 69  y_directory>/eti
27920 6c 71 73 5f 58 58 58 58 58 58 58 58 58 58 58 58  lqs_XXXXXXXXXXXX
27930 58 58 58 5c 30 5c 30 22 0a 20 20 2a 2a 0a 20 20  XXX\0\0".  **.  
27940 2a 2a 20 49 66 20 6e 6f 74 2c 20 72 65 74 75 72  ** If not, retur
27950 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20  n SQLITE_ERROR. 
27960 20 54 68 65 20 6e 75 6d 62 65 72 20 31 37 20 69   The number 17 i
27970 73 20 75 73 65 64 20 68 65 72 65 20 69 6e 20 6f  s used here in o
27980 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 61 63 63  rder to.  ** acc
27990 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 73 70 61  ount for the spa
279a0 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 31  ce used by the 1
279b0 35 20 63 68 61 72 61 63 74 65 72 20 72 61 6e 64  5 character rand
279c0 6f 6d 20 73 75 66 66 69 78 20 61 6e 64 20 74 68  om suffix and th
279d0 65 0a 20 20 2a 2a 20 74 77 6f 20 74 72 61 69 6c  e.  ** two trail
279e0 69 6e 67 20 4e 55 4c 20 63 68 61 72 61 63 74 65  ing NUL characte
279f0 72 73 2e 20 20 54 68 65 20 66 69 6e 61 6c 20 64  rs.  The final d
27a00 69 72 65 63 74 6f 72 79 20 73 65 70 61 72 61 74  irectory separat
27a10 6f 72 20 63 68 61 72 61 63 74 65 72 0a 20 20 2a  or character.  *
27a20 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 61 64  * has already ad
27a30 64 65 64 20 69 66 20 69 74 20 77 61 73 20 6e 6f  ded if it was no
27a40 74 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e  t already presen
27a50 74 2e 0a 20 20 2a 2f 0a 20 20 6e 4c 65 6e 20 3d  t..  */.  nLen =
27a60 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
27a70 28 7a 42 75 66 29 3b 0a 20 20 69 66 28 20 28 6e  (zBuf);.  if( (n
27a80 4c 65 6e 20 2b 20 6e 50 72 65 20 2b 20 31 37 29  Len + nPre + 17)
27a90 20 3e 20 6e 42 75 66 20 29 7b 0a 20 20 20 20 73   > nBuf ){.    s
27aa0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
27ab0 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
27ac0 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
27ad0 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e  c=SQLITE_ERROR\n
27ae0 22 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  "));.    return 
27af0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
27b00 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77 69  TE_ERROR, 0, "wi
27b10 6e 47 65 74 54 65 6d 70 6e 61 6d 65 35 22 2c 20  nGetTempname5", 
27b20 30 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  0);.  }..  sqlit
27b30 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
27b40 2d 31 36 2d 6e 4c 65 6e 2c 20 7a 42 75 66 2b 6e  -16-nLen, zBuf+n
27b50 4c 65 6e 2c 20 53 51 4c 49 54 45 5f 54 45 4d 50  Len, SQLITE_TEMP
27b60 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 3b 0a 0a  _FILE_PREFIX);..
27b70 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 53 74 72    j = sqlite3Str
27b80 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 73  len30(zBuf);.  s
27b90 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
27ba0 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b  s(15, &zBuf[j]);
27bb0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35  .  for(i=0; i<15
27bc0 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
27bd0 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72   zBuf[j] = (char
27be0 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67  )zChars[ ((unsig
27bf0 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d  ned char)zBuf[j]
27c00 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73  )%(sizeof(zChars
27c10 29 2d 31 29 20 5d 3b 0a 20 20 7d 0a 20 20 7a 42  )-1) ];.  }.  zB
27c20 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7a 42 75  uf[j] = 0;.  zBu
27c30 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 20 20 2a 70  f[j+1] = 0;.  *p
27c40 7a 42 75 66 20 3d 20 7a 42 75 66 3b 0a 0a 20 20  zBuf = zBuf;..  
27c50 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
27c60 49 4c 45 4e 41 4d 45 20 6e 61 6d 65 3d 25 73 2c  ILENAME name=%s,
27c70 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
27c80 2c 20 7a 42 75 66 29 29 3b 0a 20 20 72 65 74 75  , zBuf));.  retu
27c90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
27ca0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
27cb0 55 45 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  UE if the named 
27cc0 66 69 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61  file is really a
27cd0 20 64 69 72 65 63 74 6f 72 79 2e 20 20 52 65 74   directory.  Ret
27ce0 75 72 6e 20 66 61 6c 73 65 20 69 66 0a 2a 2a 20  urn false if.** 
27cf0 69 74 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  it is something 
27d00 6f 74 68 65 72 20 74 68 61 6e 20 61 20 64 69 72  other than a dir
27d10 65 63 74 6f 72 79 2c 20 6f 72 20 69 66 20 74 68  ectory, or if th
27d20 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20  ere is any kind 
27d30 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c  of memory.** all
27d40 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 2e  ocation failure.
27d50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
27d60 69 6e 49 73 44 69 72 28 63 6f 6e 73 74 20 76 6f  inIsDir(const vo
27d70 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 29 7b  id *zConverted){
27d80 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20  .  DWORD attr;. 
27d90 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 44   int rc = 0;.  D
27da0 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  WORD lastErrno;.
27db0 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
27dc0 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  ){.    int cnt =
27dd0 20 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46 49   0;.    WIN32_FI
27de0 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54  LE_ATTRIBUTE_DAT
27df0 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20  A sAttrData;.   
27e00 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44 61   memset(&sAttrDa
27e10 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41  ta, 0, sizeof(sA
27e20 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20 77  ttrData));.    w
27e30 68 69 6c 65 28 20 21 28 72 63 20 3d 20 6f 73 47  hile( !(rc = osG
27e40 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
27e50 45 78 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  ExW((LPCWSTR)zCo
27e60 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
27e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e80 20 20 20 20 20 20 47 65 74 46 69 6c 65 45 78 49        GetFileExI
27e90 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20 20  nfoStandard,.   
27ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27eb0 20 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72            &sAttr
27ec0 44 61 74 61 29 29 20 26 26 20 77 69 6e 52 65 74  Data)) && winRet
27ed0 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c  ryIoerr(&cnt, &l
27ee0 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20  astErrno) ){}.  
27ef0 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20    if( !rc ){.   
27f00 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
27f10 49 6e 76 61 6c 69 64 20 6e 61 6d 65 3f 20 2a 2f  Invalid name? */
27f20 0a 20 20 20 20 7d 0a 20 20 20 20 61 74 74 72 20  .    }.    attr 
27f30 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77 46 69  = sAttrData.dwFi
27f40 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a 23 69  leAttributes;.#i
27f50 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
27f60 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E==0.  }else{.  
27f70 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69    attr = osGetFi
27f80 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 28 63  leAttributesA((c
27f90 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29  har*)zConverted)
27fa0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72  ;.#endif.  }.  r
27fb0 65 74 75 72 6e 20 28 61 74 74 72 21 3d 49 4e 56  eturn (attr!=INV
27fc0 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
27fd0 55 54 45 53 29 20 26 26 20 28 61 74 74 72 26 46  UTES) && (attr&F
27fe0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49  ILE_ATTRIBUTE_DI
27ff0 52 45 43 54 4f 52 59 29 3b 0a 7d 0a 0a 2f 2a 0a  RECTORY);.}../*.
28000 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 2e 0a  ** Open a file..
28010 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
28020 6e 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  nOpen(.  sqlite3
28030 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
28040 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 67 65     /* Used to ge
28050 74 20 6d 61 78 69 6d 75 6d 20 70 61 74 68 20 6c  t maximum path l
28060 65 6e 67 74 68 20 61 6e 64 20 41 70 70 44 61 74  ength and AppDat
28070 61 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  a */.  const cha
28080 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20  r *zName,       
28090 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
280a0 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a  file (UTF-8) */.
280b0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
280c0 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57  id,         /* W
280d0 72 69 74 65 20 74 68 65 20 53 51 4c 69 74 65 20  rite the SQLite 
280e0 66 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65  file handle here
280f0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
28100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28110 2f 2a 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61  /* Open mode fla
28120 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75  gs */.  int *pOu
28130 74 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  tFlags          
28140 20 20 2f 2a 20 53 74 61 74 75 73 20 72 65 74 75    /* Status retu
28150 72 6e 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  rn flags */.){. 
28160 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f   HANDLE h;.  DWO
28170 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30  RD lastErrno = 0
28180 3b 0a 20 20 44 57 4f 52 44 20 64 77 44 65 73 69  ;.  DWORD dwDesi
28190 72 65 64 41 63 63 65 73 73 3b 0a 20 20 44 57 4f  redAccess;.  DWO
281a0 52 44 20 64 77 53 68 61 72 65 4d 6f 64 65 3b 0a  RD dwShareMode;.
281b0 20 20 44 57 4f 52 44 20 64 77 43 72 65 61 74 69    DWORD dwCreati
281c0 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 3b 0a 20  onDisposition;. 
281d0 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 41 6e   DWORD dwFlagsAn
281e0 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 30 3b  dAttributes = 0;
281f0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
28200 49 4e 43 45 0a 20 20 69 6e 74 20 69 73 54 65 6d  INCE.  int isTem
28210 70 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  p = 0;.#endif.  
28220 77 69 6e 56 66 73 41 70 70 44 61 74 61 20 2a 70  winVfsAppData *p
28230 41 70 70 44 61 74 61 3b 0a 20 20 77 69 6e 46 69  AppData;.  winFi
28240 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
28250 46 69 6c 65 2a 29 69 64 3b 0a 20 20 76 6f 69 64  File*)id;.  void
28260 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 20 20 20   *zConverted;   
28270 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
28280 6c 65 6e 61 6d 65 20 69 6e 20 4f 53 20 65 6e 63  lename in OS enc
28290 6f 64 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74  oding */.  const
282a0 20 63 68 61 72 20 2a 7a 55 74 66 38 4e 61 6d 65   char *zUtf8Name
282b0 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a 20 46 69 6c   = zName; /* Fil
282c0 65 6e 61 6d 65 20 69 6e 20 55 54 46 2d 38 20 65  ename in UTF-8 e
282d0 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  ncoding */.  int
282e0 20 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20   cnt = 0;..  /* 
282f0 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74  If argument zPat
28300 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  h is a NULL poin
28310 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ter, this functi
28320 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74  on is required t
28330 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65  o open.  ** a te
28340 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73  mporary file. Us
28350 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f  e this buffer to
28360 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20   store the file 
28370 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  name in..  */.  
28380 63 68 61 72 20 2a 7a 54 6d 70 6e 61 6d 65 20 3d  char *zTmpname =
28390 20 30 3b 20 2f 2a 20 46 6f 72 20 74 65 6d 70 6f   0; /* For tempo
283a0 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 2c 20 69  rary filename, i
283b0 66 20 6e 65 63 65 73 73 61 72 79 2e 20 2a 2f 0a  f necessary. */.
283c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
283d0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
283e0 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65    /* Function Re
283f0 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 23 69 66  turn Code */.#if
28400 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
28410 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57  ) || SQLITE_OS_W
28420 49 4e 43 45 0a 20 20 69 6e 74 20 65 54 79 70 65  INCE.  int eType
28430 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46   = flags&0xFFFFF
28440 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66  F00;  /* Type of
28450 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
28460 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e 74 20 69  .#endif..  int i
28470 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66  sExclusive  = (f
28480 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
28490 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20  EN_EXCLUSIVE);. 
284a0 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20   int isDelete   
284b0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
284c0 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
284d0 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69  NCLOSE);.  int i
284e0 73 43 72 65 61 74 65 20 20 20 20 20 3d 20 28 66  sCreate     = (f
284f0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
28500 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69 6e  EN_CREATE);.  in
28510 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d  t isReadonly   =
28520 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
28530 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
28540 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57 72 69  .  int isReadWri
28550 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  te  = (flags & S
28560 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
28570 52 49 54 45 29 3b 0a 0a 23 69 66 6e 64 65 66 20  RITE);..#ifndef 
28580 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 69 73 4f  NDEBUG.  int isO
28590 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 69 73  penJournal = (is
285a0 43 72 65 61 74 65 20 26 26 20 28 0a 20 20 20 20  Create && (.    
285b0 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c 49 54      eType==SQLIT
285c0 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
285d0 55 52 4e 41 4c 0a 20 20 20 20 20 7c 7c 20 65 54  URNAL.     || eT
285e0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
285f0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 0a 20 20  _MAIN_JOURNAL.  
28600 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
28610 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29  ITE_OPEN_WAL.  )
28620 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54  );.#endif..  OST
28630 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65  RACE(("OPEN name
28640 3d 25 73 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66  =%s, pFile=%p, f
28650 6c 61 67 73 3d 25 78 2c 20 70 4f 75 74 46 6c 61  lags=%x, pOutFla
28660 67 73 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20  gs=%p\n",.      
28670 20 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 2c 20       zUtf8Name, 
28680 69 64 2c 20 66 6c 61 67 73 2c 20 70 4f 75 74 46  id, flags, pOutF
28690 6c 61 67 73 29 29 3b 0a 0a 20 20 2f 2a 20 43 68  lags));..  /* Ch
286a0 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  eck the followin
286b0 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  g statements are
286c0 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   true:.  **.  **
286d0 20 20 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f     (a) Exactly o
286e0 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44 57 52  ne of the READWR
286f0 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59  ITE and READONLY
28700 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73   flags must be s
28710 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28  et, and.  **   (
28720 62 29 20 69 66 20 43 52 45 41 54 45 20 69 73 20  b) if CREATE is 
28730 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52  set, then READWR
28740 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ITE must also be
28750 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20   set, and.  **  
28760 20 28 63 29 20 69 66 20 45 58 43 4c 55 53 49 56   (c) if EXCLUSIV
28770 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
28780 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
28790 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28  be set..  **   (
287a0 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c  d) if DELETEONCL
287b0 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  OSE is set, then
287c0 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73   CREATE must als
287d0 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  o be set..  */. 
287e0 20 61 73 73 65 72 74 28 28 69 73 52 65 61 64 6f   assert((isReado
287f0 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64  nly==0 || isRead
28800 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73  Write==0) && (is
28810 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52  ReadWrite || isR
28820 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73  eadonly));.  ass
28830 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20  ert(isCreate==0 
28840 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 29 3b  || isReadWrite);
28850 0a 20 20 61 73 73 65 72 74 28 69 73 45 78 63 6c  .  assert(isExcl
28860 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72  usive==0 || isCr
28870 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  eate);.  assert(
28880 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69  isDelete==0 || i
28890 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20  sCreate);..  /* 
288a0 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69  The main DB, mai
288b0 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66  n journal, WAL f
288c0 69 6c 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a  ile and master j
288d0 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72  ournal are never
288e0 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  .  ** automatica
288f0 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72  lly deleted. Nor
28900 20 61 72 65 20 74 68 65 79 20 65 76 65 72 20 74   are they ever t
28910 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20  emporary files. 
28920 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21   */.  assert( (!
28930 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
28940 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
28950 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
28960 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
28970 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
28980 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
28990 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
289a0 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72  URNAL );.  asser
289b0 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
289c0 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
289d0 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
289e0 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  STER_JOURNAL );.
289f0 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
28a00 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
28a10 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
28a20 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f  OPEN_WAL );..  /
28a30 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  * Assert that th
28a40 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61  e upper layer ha
28a50 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65  s set one of the
28a60 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61   "file-type" fla
28a70 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  gs. */.  assert(
28a80 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
28a90 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20  PEN_MAIN_DB     
28aa0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
28ab0 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 0a 20  E_OPEN_TEMP_DB. 
28ac0 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
28ad0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
28ae0 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70  _JOURNAL || eTyp
28af0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
28b00 45 4d 50 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20  EMP_JOURNAL.    
28b10 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
28b20 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
28b30 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  NAL   || eType==
28b40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
28b50 45 52 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20  ER_JOURNAL.     
28b60 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
28b70 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e  TE_OPEN_TRANSIEN
28b80 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53  T_DB || eType==S
28b90 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20  QLITE_OPEN_WAL. 
28ba0 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
28bb0 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 6d 65 6d  File!=0 );.  mem
28bc0 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69  set(pFile, 0, si
28bd0 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 29 3b 0a  zeof(winFile));.
28be0 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 49 4e 56    pFile->h = INV
28bf0 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
28c00 45 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  E;..#if SQLITE_O
28c10 53 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 21 7a  S_WINRT.  if( !z
28c20 55 74 66 38 4e 61 6d 65 20 26 26 20 21 73 71 6c  Utf8Name && !sql
28c30 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
28c40 6f 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ory ){.    sqlit
28c50 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 45 52  e3_log(SQLITE_ER
28c60 52 4f 52 2c 0a 20 20 20 20 20 20 20 20 22 73 71  ROR,.        "sq
28c70 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
28c80 74 6f 72 79 20 76 61 72 69 61 62 6c 65 20 73 68  tory variable sh
28c90 6f 75 6c 64 20 62 65 20 73 65 74 20 66 6f 72 20  ould be set for 
28ca0 57 69 6e 52 54 22 29 3b 0a 20 20 7d 0a 23 65 6e  WinRT");.  }.#en
28cb0 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
28cc0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
28cd0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
28ce0 6e 20 69 73 20 4e 55 4c 4c 2c 20 67 65 6e 65 72  n is NULL, gener
28cf0 61 74 65 20 61 0a 20 20 2a 2a 20 74 65 6d 70 6f  ate a.  ** tempo
28d00 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 74  rary file name t
28d10 6f 20 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28  o use.  */.  if(
28d20 20 21 7a 55 74 66 38 4e 61 6d 65 20 29 7b 0a 20   !zUtf8Name ){. 
28d30 20 20 20 61 73 73 65 72 74 28 20 69 73 44 65 6c     assert( isDel
28d40 65 74 65 20 26 26 20 21 69 73 4f 70 65 6e 4a 6f  ete && !isOpenJo
28d50 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 72 63 20  urnal );.    rc 
28d60 3d 20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65  = winGetTempname
28d70 28 70 56 66 73 2c 20 26 7a 54 6d 70 6e 61 6d 65  (pVfs, &zTmpname
28d80 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
28d90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28da0 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
28db0 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73 22   name=%s, rc=%s"
28dc0 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 20 73 71 6c  , zUtf8Name, sql
28dd0 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
28de0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
28df0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55  rc;.    }.    zU
28e00 74 66 38 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61  tf8Name = zTmpna
28e10 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 61  me;.  }..  /* Da
28e20 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 73  tabase filenames
28e30 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f   are double-zero
28e40 20 74 65 72 6d 69 6e 61 74 65 64 20 69 66 20 74   terminated if t
28e50 68 65 79 20 61 72 65 20 6e 6f 74 0a 20 20 2a 2a  hey are not.  **
28e60 20 55 52 49 73 20 77 69 74 68 20 70 61 72 61 6d   URIs with param
28e70 65 74 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 74  eters.  Hence, t
28e80 68 65 79 20 63 61 6e 20 61 6c 77 61 79 73 20 62  hey can always b
28e90 65 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20  e passed into.  
28ea0 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70  ** sqlite3_uri_p
28eb0 61 72 61 6d 65 74 65 72 28 29 2e 0a 20 20 2a 2f  arameter()..  */
28ec0 0a 20 20 61 73 73 65 72 74 28 20 28 65 54 79 70  .  assert( (eTyp
28ed0 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
28ee0 41 49 4e 5f 44 42 29 20 7c 7c 20 28 66 6c 61 67  AIN_DB) || (flag
28ef0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
28f00 55 52 49 29 20 7c 7c 0a 20 20 20 20 20 20 20 7a  URI) ||.       z
28f10 55 74 66 38 4e 61 6d 65 5b 73 71 6c 69 74 65 33  Utf8Name[sqlite3
28f20 53 74 72 6c 65 6e 33 30 28 7a 55 74 66 38 4e 61  Strlen30(zUtf8Na
28f30 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20  me)+1]==0 );..  
28f40 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 66  /* Convert the f
28f50 69 6c 65 6e 61 6d 65 20 74 6f 20 74 68 65 20 73  ilename to the s
28f60 79 73 74 65 6d 20 65 6e 63 6f 64 69 6e 67 2e 20  ystem encoding. 
28f70 2a 2f 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20  */.  zConverted 
28f80 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d  = winConvertFrom
28f90 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 55 74  Utf8Filename(zUt
28fa0 66 38 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  f8Name);.  if( z
28fb0 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a  Converted==0 ){.
28fc0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
28fd0 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20  (zTmpname);.    
28fe0 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e  OSTRACE(("OPEN n
28ff0 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54  ame=%s, rc=SQLIT
29000 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22 2c 20  E_IOERR_NOMEM", 
29010 7a 55 74 66 38 4e 61 6d 65 29 29 3b 0a 20 20 20  zUtf8Name));.   
29020 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
29030 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
29040 0a 20 20 7d 0a 0a 20 20 69 66 28 20 77 69 6e 49  .  }..  if( winI
29050 73 44 69 72 28 7a 43 6f 6e 76 65 72 74 65 64 29  sDir(zConverted)
29060 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
29070 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
29080 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
29090 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20  ee(zTmpname);.  
290a0 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
290b0 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c   name=%s, rc=SQL
290c0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44  ITE_CANTOPEN_ISD
290d0 49 52 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 29  IR", zUtf8Name))
290e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
290f0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44  ITE_CANTOPEN_ISD
29100 49 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69  IR;.  }..  if( i
29110 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20  sReadWrite ){.  
29120 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
29130 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44  s = GENERIC_READ
29140 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45   | GENERIC_WRITE
29150 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
29160 77 44 65 73 69 72 65 64 41 63 63 65 73 73 20 3d  wDesiredAccess =
29170 20 47 45 4e 45 52 49 43 5f 52 45 41 44 3b 0a 20   GENERIC_READ;. 
29180 20 7d 0a 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f   }..  /* SQLITE_
29190 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 69  OPEN_EXCLUSIVE i
291a0 73 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73  s used to make s
291b0 75 72 65 20 74 68 61 74 20 61 20 6e 65 77 20 66  ure that a new f
291c0 69 6c 65 20 69 73 0a 20 20 2a 2a 20 63 72 65 61  ile is.  ** crea
291d0 74 65 64 2e 20 53 51 4c 69 74 65 20 64 6f 65 73  ted. SQLite does
291e0 6e 27 74 20 75 73 65 20 69 74 20 74 6f 20 69 6e  n't use it to in
291f0 64 69 63 61 74 65 20 22 65 78 63 6c 75 73 69 76  dicate "exclusiv
29200 65 20 61 63 63 65 73 73 22 0a 20 20 2a 2a 20 61  e access".  ** a
29210 73 20 69 74 20 69 73 20 75 73 75 61 6c 6c 79 20  s it is usually 
29220 75 6e 64 65 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f  understood..  */
29230 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75 73 69  .  if( isExclusi
29240 76 65 20 29 7b 0a 20 20 20 20 2f 2a 20 43 72 65  ve ){.    /* Cre
29250 61 74 65 73 20 61 20 6e 65 77 20 66 69 6c 65 2c  ates a new file,
29260 20 6f 6e 6c 79 20 69 66 20 69 74 20 64 6f 65 73   only if it does
29270 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
29280 73 74 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66  st. */.    /* If
29290 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73   the file exists
292a0 2c 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20  , it fails. */. 
292b0 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73     dwCreationDis
292c0 70 6f 73 69 74 69 6f 6e 20 3d 20 43 52 45 41 54  position = CREAT
292d0 45 5f 4e 45 57 3b 0a 20 20 7d 65 6c 73 65 20 69  E_NEW;.  }else i
292e0 66 28 20 69 73 43 72 65 61 74 65 20 29 7b 0a 20  f( isCreate ){. 
292f0 20 20 20 2f 2a 20 4f 70 65 6e 20 65 78 69 73 74     /* Open exist
29300 69 6e 67 20 66 69 6c 65 2c 20 6f 72 20 63 72 65  ing file, or cre
29310 61 74 65 20 69 66 20 69 74 20 64 6f 65 73 6e 27  ate if it doesn'
29320 74 20 65 78 69 73 74 20 2a 2f 0a 20 20 20 20 64  t exist */.    d
29330 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
29340 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41  tion = OPEN_ALWA
29350 59 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  YS;.  }else{.   
29360 20 2f 2a 20 4f 70 65 6e 73 20 61 20 66 69 6c 65   /* Opens a file
29370 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 65 78 69  , only if it exi
29380 73 74 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72  sts. */.    dwCr
29390 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
293a0 6e 20 3d 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e  n = OPEN_EXISTIN
293b0 47 3b 0a 20 20 7d 0a 0a 20 20 64 77 53 68 61 72  G;.  }..  dwShar
293c0 65 4d 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48 41  eMode = FILE_SHA
293d0 52 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f 53  RE_READ | FILE_S
293e0 48 41 52 45 5f 57 52 49 54 45 3b 0a 0a 20 20 69  HARE_WRITE;..  i
293f0 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23  f( isDelete ){.#
29400 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
29410 43 45 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e  CE.    dwFlagsAn
29420 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49  dAttributes = FI
29430 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44  LE_ATTRIBUTE_HID
29440 44 45 4e 3b 0a 20 20 20 20 69 73 54 65 6d 70 20  DEN;.    isTemp 
29450 3d 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64  = 1;.#else.    d
29460 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
29470 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49  tes = FILE_ATTRI
29480 42 55 54 45 5f 54 45 4d 50 4f 52 41 52 59 0a 20  BUTE_TEMPORARY. 
29490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
294a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
294b0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48  FILE_ATTRIBUTE_H
294c0 49 44 44 45 4e 0a 20 20 20 20 20 20 20 20 20 20  IDDEN.          
294d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
294e0 20 20 20 20 20 7c 20 46 49 4c 45 5f 46 4c 41 47       | FILE_FLAG
294f0 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45  _DELETE_ON_CLOSE
29500 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
29510 7b 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64  {.    dwFlagsAnd
29520 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c  Attributes = FIL
29530 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d  E_ATTRIBUTE_NORM
29540 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 70  AL;.  }.  /* Rep
29550 6f 72 74 73 20 66 72 6f 6d 20 74 68 65 20 69 6e  orts from the in
29560 74 65 72 6e 65 74 20 61 72 65 20 74 68 61 74 20  ternet are that 
29570 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 73 20 61  performance is a
29580 6c 77 61 79 73 0a 20 20 2a 2a 20 62 65 74 74 65  lways.  ** bette
29590 72 20 69 66 20 46 49 4c 45 5f 46 4c 41 47 5f 52  r if FILE_FLAG_R
295a0 41 4e 44 4f 4d 5f 41 43 43 45 53 53 20 69 73 20  ANDOM_ACCESS is 
295b0 75 73 65 64 2e 20 20 54 69 63 6b 65 74 20 23 32  used.  Ticket #2
295c0 36 39 39 2e 20 2a 2f 0a 23 69 66 20 53 51 4c 49  699. */.#if SQLI
295d0 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 64 77  TE_OS_WINCE.  dw
295e0 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
295f0 65 73 20 7c 3d 20 46 49 4c 45 5f 46 4c 41 47 5f  es |= FILE_FLAG_
29600 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 23  RANDOM_ACCESS;.#
29610 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6f 73 49  endif..  if( osI
29620 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c  sNT() ){.#if SQL
29630 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
29640 20 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54   CREATEFILE2_EXT
29650 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53  ENDED_PARAMETERS
29660 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
29670 65 72 73 3b 0a 20 20 20 20 65 78 74 65 6e 64 65  ers;.    extende
29680 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53 69  dParameters.dwSi
29690 7a 65 20 3d 20 73 69 7a 65 6f 66 28 43 52 45 41  ze = sizeof(CREA
296a0 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44  TEFILE2_EXTENDED
296b0 5f 50 41 52 41 4d 45 54 45 52 53 29 3b 0a 20 20  _PARAMETERS);.  
296c0 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65    extendedParame
296d0 74 65 72 73 2e 64 77 46 69 6c 65 41 74 74 72 69  ters.dwFileAttri
296e0 62 75 74 65 73 20 3d 0a 20 20 20 20 20 20 20 20  butes =.        
296f0 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74      dwFlagsAndAt
29700 74 72 69 62 75 74 65 73 20 26 20 46 49 4c 45 5f  tributes & FILE_
29710 41 54 54 52 49 42 55 54 45 5f 4d 41 53 4b 3b 0a  ATTRIBUTE_MASK;.
29720 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61      extendedPara
29730 6d 65 74 65 72 73 2e 64 77 46 69 6c 65 46 6c 61  meters.dwFileFla
29740 67 73 20 3d 20 64 77 46 6c 61 67 73 41 6e 64 41  gs = dwFlagsAndA
29750 74 74 72 69 62 75 74 65 73 20 26 20 46 49 4c 45  ttributes & FILE
29760 5f 46 4c 41 47 5f 4d 41 53 4b 3b 0a 20 20 20 20  _FLAG_MASK;.    
29770 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65  extendedParamete
29780 72 73 2e 64 77 53 65 63 75 72 69 74 79 51 6f 73  rs.dwSecurityQos
29790 46 6c 61 67 73 20 3d 20 53 45 43 55 52 49 54 59  Flags = SECURITY
297a0 5f 41 4e 4f 4e 59 4d 4f 55 53 3b 0a 20 20 20 20  _ANONYMOUS;.    
297b0 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65  extendedParamete
297c0 72 73 2e 6c 70 53 65 63 75 72 69 74 79 41 74 74  rs.lpSecurityAtt
297d0 72 69 62 75 74 65 73 20 3d 20 4e 55 4c 4c 3b 0a  ributes = NULL;.
297e0 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61      extendedPara
297f0 6d 65 74 65 72 73 2e 68 54 65 6d 70 6c 61 74 65  meters.hTemplate
29800 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  File = NULL;.   
29810 20 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43   while( (h = osC
29820 72 65 61 74 65 46 69 6c 65 32 28 28 4c 50 43 57  reateFile2((LPCW
29830 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a  STR)zConverted,.
29840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
29860 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20  DesiredAccess,. 
29870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29880 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 53               dwS
29890 68 61 72 65 4d 6f 64 65 2c 0a 20 20 20 20 20 20  hareMode,.      
298a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298b0 20 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69          dwCreati
298c0 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20  onDisposition,. 
298d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298e0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 65 78               &ex
298f0 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73  tendedParameters
29900 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ))==INVALID_HAND
29910 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20  LE_VALUE &&.    
29920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29930 20 20 20 20 20 20 20 20 20 20 77 69 6e 52 65 74            winRet
29940 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c  ryIoerr(&cnt, &l
29950 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20  astErrno) ){.   
29960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
29970 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6c  oop */.    }.#el
29980 73 65 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68  se.    while( (h
29990 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 57   = osCreateFileW
299a0 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
299b0 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
299c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299d0 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63      dwDesiredAcc
299e0 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ess,.           
299f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a00 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 20     dwShareMode, 
29a10 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
29a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a30 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69      dwCreationDi
29a40 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20  sposition,.     
29a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a60 20 20 20 20 20 20 20 20 20 64 77 46 6c 61 67 73           dwFlags
29a70 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a 20  AndAttributes,. 
29a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a90 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c               NUL
29aa0 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  L))==INVALID_HAN
29ab0 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20  DLE_VALUE &&.   
29ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ad0 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 52 65             winRe
29ae0 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
29af0 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20  lastErrno) ){.  
29b00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29b10 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 23 65  Noop */.    }.#e
29b20 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20  ndif.  }.#ifdef 
29b30 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
29b40 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
29b50 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73    while( (h = os
29b60 43 72 65 61 74 65 46 69 6c 65 41 28 28 4c 50 43  CreateFileA((LPC
29b70 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a  STR)zConverted,.
29b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
29ba0 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20  DesiredAccess,. 
29bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 53               dwS
29bd0 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a  hareMode, NULL,.
29be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
29c00 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
29c10 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ion,.           
29c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c30 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
29c40 72 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20  ributes,.       
29c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c60 20 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49         NULL))==I
29c70 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
29c80 4c 55 45 20 26 26 0a 20 20 20 20 20 20 20 20 20  LUE &&.         
29c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ca0 20 20 20 20 20 77 69 6e 52 65 74 72 79 49 6f 65       winRetryIoe
29cb0 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
29cc0 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  rno) ){.        
29cd0 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a         /* Noop *
29ce0 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  /.    }.  }.#end
29cf0 69 66 0a 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72  if.  winLogIoerr
29d00 28 63 6e 74 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  (cnt, __LINE__);
29d10 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50  ..  OSTRACE(("OP
29d20 45 4e 20 66 69 6c 65 3d 25 70 2c 20 6e 61 6d 65  EN file=%p, name
29d30 3d 25 73 2c 20 61 63 63 65 73 73 3d 25 6c 78 2c  =%s, access=%lx,
29d40 20 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55   rc=%s\n", h, zU
29d50 74 66 38 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  tf8Name,.       
29d60 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63      dwDesiredAcc
29d70 65 73 73 2c 20 28 68 3d 3d 49 4e 56 41 4c 49 44  ess, (h==INVALID
29d80 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 3f  _HANDLE_VALUE) ?
29d90 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22   "failed" : "ok"
29da0 29 29 3b 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e  ));..  if( h==IN
29db0 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
29dc0 55 45 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  UE ){.    pFile-
29dd0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
29de0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c  tErrno;.    winL
29df0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
29e00 41 4e 54 4f 50 45 4e 2c 20 70 46 69 6c 65 2d 3e  ANTOPEN, pFile->
29e10 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 4f  lastErrno, "winO
29e20 70 65 6e 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29  pen", zUtf8Name)
29e30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
29e40 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
29e50 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
29e60 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20  (zTmpname);.    
29e70 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
29e80 26 26 20 21 69 73 45 78 63 6c 75 73 69 76 65 20  && !isExclusive 
29e90 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
29ea0 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e  winOpen(pVfs, zN
29eb0 61 6d 65 2c 20 69 64 2c 0a 20 20 20 20 20 20 20  ame, id,.       
29ec0 20 20 28 28 66 6c 61 67 73 7c 53 51 4c 49 54 45    ((flags|SQLITE
29ed0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 20  _OPEN_READONLY) 
29ee0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
29ef0 20 20 20 20 20 20 20 7e 28 53 51 4c 49 54 45 5f         ~(SQLITE_
29f00 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49  OPEN_CREATE|SQLI
29f10 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
29f20 45 29 29 2c 0a 20 20 20 20 20 20 20 20 20 70 4f  E)),.         pO
29f30 75 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65  utFlags);.    }e
29f40 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
29f50 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
29f60 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  N_BKPT;.    }.  
29f70 7d 0a 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61  }..  if( pOutFla
29f80 67 73 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  gs ){.    if( is
29f90 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20  ReadWrite ){.   
29fa0 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20     *pOutFlags = 
29fb0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
29fc0 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65  WRITE;.    }else
29fd0 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61  {.      *pOutFla
29fe0 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs = SQLITE_OPEN
29ff0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d  _READONLY;.    }
2a000 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28  .  }..  OSTRACE(
2a010 28 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c 20  ("OPEN file=%p, 
2a020 6e 61 6d 65 3d 25 73 2c 20 61 63 63 65 73 73 3d  name=%s, access=
2a030 25 6c 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d 25  %lx, pOutFlags=%
2a040 70 2c 20 2a 70 4f 75 74 46 6c 61 67 73 3d 25 64  p, *pOutFlags=%d
2a050 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  , ".           "
2a060 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74  rc=%s\n", h, zUt
2a070 66 38 4e 61 6d 65 2c 20 64 77 44 65 73 69 72 65  f8Name, dwDesire
2a080 64 41 63 63 65 73 73 2c 20 70 4f 75 74 46 6c 61  dAccess, pOutFla
2a090 67 73 2c 20 70 4f 75 74 46 6c 61 67 73 20 3f 0a  gs, pOutFlags ?.
2a0a0 20 20 20 20 20 20 20 20 20 20 20 2a 70 4f 75 74             *pOut
2a0b0 46 6c 61 67 73 20 3a 20 30 2c 20 28 68 3d 3d 49  Flags : 0, (h==I
2a0c0 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
2a0d0 4c 55 45 29 20 3f 20 22 66 61 69 6c 65 64 22 20  LUE) ? "failed" 
2a0e0 3a 20 22 6f 6b 22 29 29 3b 0a 0a 20 20 70 41 70  : "ok"));..  pAp
2a0f0 70 44 61 74 61 20 3d 20 28 77 69 6e 56 66 73 41  pData = (winVfsA
2a100 70 70 44 61 74 61 2a 29 70 56 66 73 2d 3e 70 41  ppData*)pVfs->pA
2a110 70 70 44 61 74 61 3b 0a 0a 23 69 66 20 53 51 4c  ppData;..#if SQL
2a120 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b  ITE_OS_WINCE.  {
2a130 0a 20 20 20 20 69 66 28 20 69 73 52 65 61 64 57  .    if( isReadW
2a140 72 69 74 65 20 26 26 20 65 54 79 70 65 3d 3d 53  rite && eType==S
2a150 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2a160 44 42 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  DB.         && (
2a170 28 70 41 70 70 44 61 74 61 3d 3d 4e 55 4c 4c 29  (pAppData==NULL)
2a180 20 7c 7c 20 21 70 41 70 70 44 61 74 61 2d 3e 62   || !pAppData->b
2a190 4e 6f 4c 6f 63 6b 29 0a 20 20 20 20 20 20 20 20  NoLock).        
2a1a0 20 26 26 20 28 72 63 20 3d 20 77 69 6e 63 65 43   && (rc = winceC
2a1b0 72 65 61 74 65 4c 6f 63 6b 28 7a 4e 61 6d 65 2c  reateLock(zName,
2a1c0 20 70 46 69 6c 65 29 29 21 3d 53 51 4c 49 54 45   pFile))!=SQLITE
2a1d0 5f 4f 4b 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  _OK.    ){.     
2a1e0 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68   osCloseHandle(h
2a1f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2a200 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
2a210 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2a220 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b  _free(zTmpname);
2a230 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
2a240 22 4f 50 45 4e 2d 43 45 2d 4c 4f 43 4b 20 6e 61  "OPEN-CE-LOCK na
2a250 6d 65 3d 25 73 2c 20 72 63 3d 25 73 5c 6e 22 2c  me=%s, rc=%s\n",
2a260 20 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 45   zName, sqlite3E
2a270 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
2a280 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2a290 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69     }.  }.  if( i
2a2a0 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 70 46 69  sTemp ){.    pFi
2a2b0 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  le->zDeleteOnClo
2a2c0 73 65 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64 3b  se = zConverted;
2a2d0 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
2a2e0 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    {.    sqlite3_
2a2f0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
2a300 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
2a310 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b  _free(zTmpname);
2a320 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  .  pFile->pMetho
2a330 64 20 3d 20 70 41 70 70 44 61 74 61 20 3f 20 70  d = pAppData ? p
2a340 41 70 70 44 61 74 61 2d 3e 70 4d 65 74 68 6f 64  AppData->pMethod
2a350 20 3a 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64 3b   : &winIoMethod;
2a360 0a 20 20 70 46 69 6c 65 2d 3e 70 56 66 73 20 3d  .  pFile->pVfs =
2a370 20 70 56 66 73 3b 0a 20 20 70 46 69 6c 65 2d 3e   pVfs;.  pFile->
2a380 68 20 3d 20 68 3b 0a 20 20 69 66 28 20 69 73 52  h = h;.  if( isR
2a390 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 20 20 70  eadonly ){.    p
2a3a0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
2a3b0 7c 3d 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c  |= WINFILE_RDONL
2a3c0 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  Y;.  }.  if( sql
2a3d0 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
2a3e0 28 7a 4e 61 6d 65 2c 20 22 70 73 6f 77 22 2c 20  (zName, "psow", 
2a3f0 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46 45  SQLITE_POWERSAFE
2a400 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a 20  _OVERWRITE) ){. 
2a410 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
2a420 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 50  ags |= WINFILE_P
2a430 53 4f 57 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65  SOW;.  }.  pFile
2a440 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f  ->lastErrno = NO
2a450 5f 45 52 52 4f 52 3b 0a 20 20 70 46 69 6c 65 2d  _ERROR;.  pFile-
2a460 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a  >zPath = zName;.
2a470 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
2a480 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70 46 69  MAP_SIZE>0.  pFi
2a490 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b  le->hMap = NULL;
2a4a0 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  .  pFile->pMapRe
2a4b0 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 70 46 69 6c  gion = 0;.  pFil
2a4c0 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b  e->mmapSize = 0;
2a4d0 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  .  pFile->mmapSi
2a4e0 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20  zeActual = 0;.  
2a4f0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
2a500 61 78 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  ax = sqlite3Glob
2a510 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b  alConfig.szMmap;
2a520 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 70 65 6e 43  .#endif..  OpenC
2a530 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 72 65  ounter(+1);.  re
2a540 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2a550 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6e 61 6d  * Delete the nam
2a560 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e  ed file..**.** N
2a570 6f 74 65 20 74 68 61 74 20 57 69 6e 64 6f 77 73  ote that Windows
2a580 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20   does not allow 
2a590 61 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c  a file to be del
2a5a0 65 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68  eted if some oth
2a5b0 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 68 61  er.** process ha
2a5c0 73 20 69 74 20 6f 70 65 6e 2e 20 20 53 6f 6d 65  s it open.  Some
2a5d0 74 69 6d 65 73 20 61 20 76 69 72 75 73 20 73 63  times a virus sc
2a5e0 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65 78 69 6e  anner or indexin
2a5f0 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 77 69 6c  g program.** wil
2a600 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c  l open a journal
2a610 20 66 69 6c 65 20 73 68 6f 72 74 6c 79 20 61 66   file shortly af
2a620 74 65 72 20 69 74 20 69 73 20 63 72 65 61 74 65  ter it is create
2a630 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f  d in order to do
2a640 0a 2a 2a 20 77 68 61 74 65 76 65 72 20 69 74 20  .** whatever it 
2a650 64 6f 65 73 2e 20 20 57 68 69 6c 65 20 74 68 69  does.  While thi
2a660 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  s other process 
2a670 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 2a  is holding the.*
2a680 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20 77 65 20  * file open, we 
2a690 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c 65 20 74  will be unable t
2a6a0 6f 20 64 65 6c 65 74 65 20 69 74 2e 20 20 54 6f  o delete it.  To
2a6b0 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69   work around thi
2a6c0 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20 77 65  s.** problem, we
2a6d0 20 64 65 6c 61 79 20 31 30 30 20 6d 69 6c 6c 69   delay 100 milli
2a6e0 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20  seconds and try 
2a6f0 74 6f 20 64 65 6c 65 74 65 20 61 67 61 69 6e 2e  to delete again.
2a700 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f 44 45    Up.** to MX_DE
2a710 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 73 20  LETION_ATTEMPTs 
2a720 64 65 6c 65 74 69 6f 6e 20 61 74 74 65 6d 70 74  deletion attempt
2a730 73 20 61 72 65 20 72 75 6e 20 62 65 66 6f 72 65  s are run before
2a740 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70 20 61 6e   giving.** up an
2a750 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  d returning an e
2a760 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
2a770 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 0a 20  int winDelete(. 
2a780 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
2a790 66 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fs,          /* 
2a7a0 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33  Not used on win3
2a7b0 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  2 */.  const cha
2a7c0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
2a7d0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69     /* Name of fi
2a7e0 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a  le to delete */.
2a7f0 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20 20 20    int syncDir   
2a800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a810 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e   Not used on win
2a820 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63  32 */.){.  int c
2a830 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  nt = 0;.  int rc
2a840 3b 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a  ;.  DWORD attr;.
2a850 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
2a860 6f 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20 2a 7a  o = 0;.  void *z
2a870 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55  Converted;.  UNU
2a880 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
2a890 66 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  fs);.  UNUSED_PA
2a8a0 52 41 4d 45 54 45 52 28 73 79 6e 63 44 69 72 29  RAMETER(syncDir)
2a8b0 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
2a8c0 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
2a8d0 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29  TE_IOERR_DELETE)
2a8e0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 45  ;.  OSTRACE(("DE
2a8f0 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 73 79  LETE name=%s, sy
2a900 6e 63 44 69 72 3d 25 64 5c 6e 22 2c 20 7a 46 69  ncDir=%d\n", zFi
2a910 6c 65 6e 61 6d 65 2c 20 73 79 6e 63 44 69 72 29  lename, syncDir)
2a920 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64  );..  zConverted
2a930 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f   = winConvertFro
2a940 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46  mUtf8Filename(zF
2a950 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
2a960 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
2a970 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44  .    OSTRACE(("D
2a980 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 72  ELETE name=%s, r
2a990 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
2a9a0 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61  OMEM\n", zFilena
2a9b0 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  me));.    return
2a9c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
2a9d0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
2a9e0 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
2a9f0 20 20 20 20 64 6f 20 7b 0a 23 69 66 20 53 51 4c      do {.#if SQL
2aa00 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
2aa10 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54     WIN32_FILE_AT
2aa20 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41 74  TRIBUTE_DATA sAt
2aa30 74 72 44 61 74 61 3b 0a 20 20 20 20 20 20 6d 65  trData;.      me
2aa40 6d 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c  mset(&sAttrData,
2aa50 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72   0, sizeof(sAttr
2aa60 44 61 74 61 29 29 3b 0a 20 20 20 20 20 20 69 66  Data));.      if
2aa70 20 28 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   ( osGetFileAttr
2aa80 69 62 75 74 65 73 45 78 57 28 7a 43 6f 6e 76 65  ibutesExW(zConve
2aa90 72 74 65 64 2c 20 47 65 74 46 69 6c 65 45 78 49  rted, GetFileExI
2aaa0 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20 20  nfoStandard,.   
2aab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
2aad0 73 41 74 74 72 44 61 74 61 29 20 29 7b 0a 20 20  sAttrData) ){.  
2aae0 20 20 20 20 20 20 61 74 74 72 20 3d 20 73 41 74        attr = sAt
2aaf0 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74  trData.dwFileAtt
2ab00 72 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d  ributes;.      }
2ab10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6c 61  else{.        la
2ab20 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
2ab30 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
2ab40 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e      if( lastErrn
2ab50 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f  o==ERROR_FILE_NO
2ab60 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20  T_FOUND.        
2ab70 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45   || lastErrno==E
2ab80 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f  RROR_PATH_NOT_FO
2ab90 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UND ){.         
2aba0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
2abb0 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b  RR_DELETE_NOENT;
2abc0 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65   /* Already gone
2abd0 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c  ? */.        }el
2abe0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
2abf0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
2ac00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ac10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2ac20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 61 74  }.#else.      at
2ac30 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74  tr = osGetFileAt
2ac40 74 72 69 62 75 74 65 73 57 28 7a 43 6f 6e 76 65  tributesW(zConve
2ac50 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rted);.#endif.  
2ac60 20 20 20 20 69 66 20 28 20 61 74 74 72 3d 3d 49      if ( attr==I
2ac70 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
2ac80 49 42 55 54 45 53 20 29 7b 0a 20 20 20 20 20 20  IBUTES ){.      
2ac90 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
2aca0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
2acb0 20 20 20 20 20 20 20 20 69 66 28 20 6c 61 73 74          if( last
2acc0 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c  Errno==ERROR_FIL
2acd0 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20  E_NOT_FOUND.    
2ace0 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e       || lastErrn
2acf0 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f  o==ERROR_PATH_NO
2ad00 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20  T_FOUND ){.     
2ad10 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2ad20 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
2ad30 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20  ENT; /* Already 
2ad40 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20  gone? */.       
2ad50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2ad60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
2ad70 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROR;.        }. 
2ad80 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2ad90 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
2ada0 20 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49   attr&FILE_ATTRI
2adb0 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 20 29  BUTE_DIRECTORY )
2adc0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
2add0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20  QLITE_ERROR; /* 
2ade0 46 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20  Files only. */. 
2adf0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2ae00 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
2ae10 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28 7a   osDeleteFileW(z
2ae20 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20  Converted) ){.  
2ae30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2ae40 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64  E_OK; /* Deleted
2ae50 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20   OK. */.        
2ae60 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
2ae70 20 20 20 20 20 69 66 20 28 20 21 77 69 6e 52 65       if ( !winRe
2ae80 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
2ae90 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20  lastErrno) ){.  
2aea0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2aeb0 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d  E_ERROR; /* No m
2aec0 6f 72 65 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a  ore retries. */.
2aed0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2aee0 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 77 68 69       }.    } whi
2aef0 6c 65 28 31 29 3b 0a 20 20 7d 0a 23 69 66 64 65  le(1);.  }.#ifde
2af00 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
2af10 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
2af20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 61      do {.      a
2af30 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41  ttr = osGetFileA
2af40 74 74 72 69 62 75 74 65 73 41 28 7a 43 6f 6e 76  ttributesA(zConv
2af50 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 69 66  erted);.      if
2af60 20 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44   ( attr==INVALID
2af70 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
2af80 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74   ){.        last
2af90 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
2afa0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
2afb0 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d    if( lastErrno=
2afc0 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f  =ERROR_FILE_NOT_
2afd0 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c  FOUND.         |
2afe0 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  | lastErrno==ERR
2aff0 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e  OR_PATH_NOT_FOUN
2b000 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  D ){.          r
2b010 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
2b020 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f  _DELETE_NOENT; /
2b030 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20  * Already gone? 
2b040 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  */.        }else
2b050 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2b060 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2b070 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b080 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2b090 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72 26        if ( attr&
2b0a0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
2b0b0 49 52 45 43 54 4f 52 59 20 29 7b 0a 20 20 20 20  IRECTORY ){.    
2b0c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2b0d0 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20  ERROR; /* Files 
2b0e0 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  only. */.       
2b0f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2b100 20 20 20 20 20 20 69 66 20 28 20 6f 73 44 65 6c        if ( osDel
2b110 65 74 65 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72  eteFileA(zConver
2b120 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ted) ){.        
2b130 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2b140 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a  /* Deleted OK. *
2b150 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
2b160 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2b170 66 20 28 20 21 77 69 6e 52 65 74 72 79 49 6f 65  f ( !winRetryIoe
2b180 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
2b190 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  rno) ){.        
2b1a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
2b1b0 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65  R; /* No more re
2b1c0 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  tries. */.      
2b1d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2b1e0 0a 20 20 20 20 7d 20 77 68 69 6c 65 28 31 29 3b  .    } while(1);
2b1f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
2b200 28 20 72 63 20 26 26 20 72 63 21 3d 53 51 4c 49  ( rc && rc!=SQLI
2b210 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f  TE_IOERR_DELETE_
2b220 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 72 63 20  NOENT ){.    rc 
2b230 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
2b240 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
2b250 45 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77  E, lastErrno, "w
2b260 69 6e 44 65 6c 65 74 65 22 2c 20 7a 46 69 6c 65  inDelete", zFile
2b270 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  name);.  }else{.
2b280 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28      winLogIoerr(
2b290 63 6e 74 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  cnt, __LINE__);.
2b2a0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
2b2b0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
2b2c0 20 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45    OSTRACE(("DELE
2b2d0 54 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 25  TE name=%s, rc=%
2b2e0 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  s\n", zFilename,
2b2f0 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
2b300 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  rc)));.  return 
2b310 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  rc;.}../*.** Che
2b320 63 6b 20 74 68 65 20 65 78 69 73 74 65 6e 63 65  ck the existence
2b330 20 61 6e 64 20 73 74 61 74 75 73 20 6f 66 20 61   and status of a
2b340 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
2b350 20 69 6e 74 20 77 69 6e 41 63 63 65 73 73 28 0a   int winAccess(.
2b360 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
2b370 56 66 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Vfs,         /* 
2b380 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33  Not used on win3
2b390 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  2 */.  const cha
2b3a0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
2b3b0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c    /* Name of fil
2b3c0 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
2b3d0 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
2b3e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
2b3f0 70 65 20 6f 66 20 74 65 73 74 20 74 6f 20 6d 61  pe of test to ma
2b400 6b 65 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20  ke on this file 
2b410 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75  */.  int *pResOu
2b420 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2b430 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 20 2a  /* OUT: Result *
2b440 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74  /.){.  DWORD att
2b450 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  r;.  int rc = 0;
2b460 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
2b470 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20 2a  no = 0;.  void *
2b480 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e  zConverted;.  UN
2b490 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
2b4a0 56 66 73 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  Vfs);..  Simulat
2b4b0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
2b4c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
2b4d0 43 45 53 53 3b 20 29 3b 0a 20 20 4f 53 54 52 41  CESS; );.  OSTRA
2b4e0 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65  CE(("ACCESS name
2b4f0 3d 25 73 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70  =%s, flags=%x, p
2b500 52 65 73 4f 75 74 3d 25 70 5c 6e 22 2c 0a 20 20  ResOut=%p\n",.  
2b510 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61           zFilena
2b520 6d 65 2c 20 66 6c 61 67 73 2c 20 70 52 65 73 4f  me, flags, pResO
2b530 75 74 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72  ut));..  zConver
2b540 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74  ted = winConvert
2b550 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65  FromUtf8Filename
2b560 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
2b570 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
2b580 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
2b590 28 22 41 43 43 45 53 53 20 6e 61 6d 65 3d 25 73  ("ACCESS name=%s
2b5a0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
2b5b0 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c  R_NOMEM\n", zFil
2b5c0 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74  ename));.    ret
2b5d0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2b5e0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
2b5f0 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
2b600 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  ){.    int cnt =
2b610 20 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46 49   0;.    WIN32_FI
2b620 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54  LE_ATTRIBUTE_DAT
2b630 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20  A sAttrData;.   
2b640 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44 61   memset(&sAttrDa
2b650 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41  ta, 0, sizeof(sA
2b660 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20 77  ttrData));.    w
2b670 68 69 6c 65 28 20 21 28 72 63 20 3d 20 6f 73 47  hile( !(rc = osG
2b680 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
2b690 45 78 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  ExW((LPCWSTR)zCo
2b6a0 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
2b6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b6c0 20 20 20 20 20 20 47 65 74 46 69 6c 65 45 78 49        GetFileExI
2b6d0 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20 20  nfoStandard,.   
2b6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b6f0 20 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72            &sAttr
2b700 44 61 74 61 29 29 20 26 26 20 77 69 6e 52 65 74  Data)) && winRet
2b710 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c  ryIoerr(&cnt, &l
2b720 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20  astErrno) ){}.  
2b730 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2b740 20 20 2f 2a 20 46 6f 72 20 61 6e 20 53 51 4c 49    /* For an SQLI
2b750 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
2b760 20 71 75 65 72 79 2c 20 74 72 65 61 74 20 61 20   query, treat a 
2b770 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 69 6c 65  zero-length file
2b780 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20  .      ** as if 
2b790 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
2b7a0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
2b7b0 20 20 69 66 28 20 20 20 20 66 6c 61 67 73 3d 3d    if(    flags==
2b7c0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
2b7d0 49 53 54 53 0a 20 20 20 20 20 20 20 20 20 20 26  ISTS.          &
2b7e0 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c  & sAttrData.nFil
2b7f0 65 53 69 7a 65 48 69 67 68 3d 3d 30 0a 20 20 20  eSizeHigh==0.   
2b800 20 20 20 20 20 20 20 26 26 20 73 41 74 74 72 44         && sAttrD
2b810 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f 77  ata.nFileSizeLow
2b820 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
2b830 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49  ttr = INVALID_FI
2b840 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20  LE_ATTRIBUTES;. 
2b850 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2b860 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72      attr = sAttr
2b870 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69  Data.dwFileAttri
2b880 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 0a 20  butes;.      }. 
2b890 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b8a0 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 2c  winLogIoerr(cnt,
2b8b0 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
2b8c0 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 21    if( lastErrno!
2b8d0 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f  =ERROR_FILE_NOT_
2b8e0 46 4f 55 4e 44 20 26 26 20 6c 61 73 74 45 72 72  FOUND && lastErr
2b8f0 6e 6f 21 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e  no!=ERROR_PATH_N
2b900 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20  OT_FOUND ){.    
2b910 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2b920 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
2b930 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
2b940 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
2b950 49 4f 45 52 52 5f 41 43 43 45 53 53 2c 20 6c 61  IOERR_ACCESS, la
2b960 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 41 63 63  stErrno, "winAcc
2b970 65 73 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ess",.          
2b980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b990 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
2b9a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b9b0 20 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44    attr = INVALID
2b9c0 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
2b9d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2b9e0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
2b9f0 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
2ba00 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 61 74 74  .  else{.    att
2ba10 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74  r = osGetFileAtt
2ba20 72 69 62 75 74 65 73 41 28 28 63 68 61 72 2a 29  ributesA((char*)
2ba30 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d  zConverted);.  }
2ba40 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
2ba50 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
2ba60 64 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c  d);.  switch( fl
2ba70 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ags ){.    case 
2ba80 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
2ba90 41 44 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c  AD:.    case SQL
2baa0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
2bab0 53 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74  S:.      rc = at
2bac0 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45  tr!=INVALID_FILE
2bad0 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20  _ATTRIBUTES;.   
2bae0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
2baf0 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
2bb00 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20  _READWRITE:.    
2bb10 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56    rc = attr!=INV
2bb20 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
2bb30 55 54 45 53 20 26 26 0a 20 20 20 20 20 20 20 20  UTES &&.        
2bb40 20 20 20 20 20 28 61 74 74 72 20 26 20 46 49 4c       (attr & FIL
2bb50 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45 41 44  E_ATTRIBUTE_READ
2bb60 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20 20 20 20  ONLY)==0;.      
2bb70 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
2bb80 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  lt:.      assert
2bb90 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73  (!"Invalid flags
2bba0 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d   argument");.  }
2bbb0 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 63  .  *pResOut = rc
2bbc0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41 43  ;.  OSTRACE(("AC
2bbd0 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20 70 52  CESS name=%s, pR
2bbe0 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65 73 4f  esOut=%p, *pResO
2bbf0 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49 54 45  ut=%d, rc=SQLITE
2bc00 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  _OK\n",.        
2bc10 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 52     zFilename, pR
2bc20 65 73 4f 75 74 2c 20 2a 70 52 65 73 4f 75 74 29  esOut, *pResOut)
2bc30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
2bc40 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2bc50 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  Returns non-zero
2bc60 20 69 66 20 74 68 65 20 73 70 65 63 69 66 69 65   if the specifie
2bc70 64 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61 72  d path name star
2bc80 74 73 20 77 69 74 68 20 61 20 64 72 69 76 65 20  ts with a drive 
2bc90 6c 65 74 74 65 72 0a 2a 2a 20 66 6f 6c 6c 6f 77  letter.** follow
2bca0 65 64 20 62 79 20 61 20 63 6f 6c 6f 6e 20 63 68  ed by a colon ch
2bcb0 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  aracter..*/.stat
2bcc0 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 44 72 69  ic BOOL winIsDri
2bcd0 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e  veLetterAndColon
2bce0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
2bcf0 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20 20 72  zPathname.){.  r
2bd00 65 74 75 72 6e 20 28 20 73 71 6c 69 74 65 33 49  eturn ( sqlite3I
2bd10 73 61 6c 70 68 61 28 7a 50 61 74 68 6e 61 6d 65  salpha(zPathname
2bd20 5b 30 5d 29 20 26 26 20 7a 50 61 74 68 6e 61 6d  [0]) && zPathnam
2bd30 65 5b 31 5d 3d 3d 27 3a 27 20 29 3b 0a 7d 0a 0a  e[1]==':' );.}..
2bd40 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f  /*.** Returns no
2bd50 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70  n-zero if the sp
2bd60 65 63 69 66 69 65 64 20 70 61 74 68 20 6e 61 6d  ecified path nam
2bd70 65 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  e should be used
2bd80 20 76 65 72 62 61 74 69 6d 2e 20 20 49 66 0a 2a   verbatim.  If.*
2bd90 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65  * non-zero is re
2bda0 74 75 72 6e 65 64 20 66 72 6f 6d 20 74 68 69 73  turned from this
2bdb0 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 20 63   function, the c
2bdc0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
2bdd0 6d 75 73 74 20 73 69 6d 70 6c 79 0a 2a 2a 20 75  must simply.** u
2bde0 73 65 20 74 68 65 20 70 72 6f 76 69 64 65 64 20  se the provided 
2bdf0 70 61 74 68 20 6e 61 6d 65 20 76 65 72 62 61 74  path name verbat
2be00 69 6d 20 2d 4f 52 2d 20 72 65 73 6f 6c 76 65 20  im -OR- resolve 
2be10 69 74 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70  it into a full p
2be20 61 74 68 20 6e 61 6d 65 0a 2a 2a 20 75 73 69 6e  ath name.** usin
2be30 67 20 74 68 65 20 47 65 74 46 75 6c 6c 50 61 74  g the GetFullPat
2be40 68 4e 61 6d 65 20 57 69 6e 33 32 20 41 50 49 20  hName Win32 API 
2be50 66 75 6e 63 74 69 6f 6e 20 28 69 66 20 61 76 61  function (if ava
2be60 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74  ilable)..*/.stat
2be70 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 56 65 72  ic BOOL winIsVer
2be80 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 0a 20  batimPathname(. 
2be90 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
2bea0 74 68 6e 61 6d 65 0a 29 7b 0a 20 20 2f 2a 0a 20  thname.){.  /*. 
2beb0 20 2a 2a 20 49 66 20 74 68 65 20 70 61 74 68 20   ** If the path 
2bec0 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69 74 68  name starts with
2bed0 20 61 20 66 6f 72 77 61 72 64 20 73 6c 61 73 68   a forward slash
2bee0 20 6f 72 20 61 20 62 61 63 6b 73 6c 61 73 68 2c   or a backslash,
2bef0 20 69 74 20 69 73 20 65 69 74 68 65 72 0a 20 20   it is either.  
2bf00 2a 2a 20 61 20 6c 65 67 61 6c 20 55 4e 43 20 6e  ** a legal UNC n
2bf10 61 6d 65 2c 20 61 20 76 6f 6c 75 6d 65 20 72 65  ame, a volume re
2bf20 6c 61 74 69 76 65 20 70 61 74 68 2c 20 6f 72 20  lative path, or 
2bf30 61 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68  an absolute path
2bf40 20 6e 61 6d 65 20 69 6e 20 74 68 65 0a 20 20 2a   name in the.  *
2bf50 2a 20 22 55 6e 69 78 22 20 66 6f 72 6d 61 74 20  * "Unix" format 
2bf60 6f 6e 20 57 69 6e 64 6f 77 73 2e 20 20 54 68 65  on Windows.  The
2bf70 72 65 20 69 73 20 6e 6f 20 65 61 73 79 20 77 61  re is no easy wa
2bf80 79 20 74 6f 20 64 69 66 66 65 72 65 6e 74 69 61  y to differentia
2bf90 74 65 20 62 65 74 77 65 65 6e 0a 20 20 2a 2a 20  te between.  ** 
2bfa0 74 68 65 20 66 69 6e 61 6c 20 74 77 6f 20 63 61  the final two ca
2bfb0 73 65 73 3b 20 74 68 65 72 65 66 6f 72 65 2c 20  ses; therefore, 
2bfc0 77 65 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  we return the sa
2bfd0 66 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65  fer return value
2bfe0 20 6f 66 20 54 52 55 45 0a 20 20 2a 2a 20 73 6f   of TRUE.  ** so
2bff0 20 74 68 61 74 20 63 61 6c 6c 65 72 73 20 6f 66   that callers of
2c000 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
2c010 69 6c 6c 20 73 69 6d 70 6c 79 20 75 73 65 20 69  ill simply use i
2c020 74 20 76 65 72 62 61 74 69 6d 2e 0a 20 20 2a 2f  t verbatim..  */
2c030 0a 20 20 69 66 20 28 20 77 69 6e 49 73 44 69 72  .  if ( winIsDir
2c040 53 65 70 28 7a 50 61 74 68 6e 61 6d 65 5b 30 5d  Sep(zPathname[0]
2c050 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2c060 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  TRUE;.  }..  /*.
2c070 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61 74 68    ** If the path
2c080 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69 74   name starts wit
2c090 68 20 61 20 6c 65 74 74 65 72 20 61 6e 64 20 61  h a letter and a
2c0a0 20 63 6f 6c 6f 6e 20 69 74 20 69 73 20 65 69 74   colon it is eit
2c0b0 68 65 72 20 61 20 76 6f 6c 75 6d 65 0a 20 20 2a  her a volume.  *
2c0c0 2a 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  * relative path 
2c0d0 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70  or an absolute p
2c0e0 61 74 68 2e 20 20 43 61 6c 6c 65 72 73 20 6f 66  ath.  Callers of
2c0f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   this function m
2c100 75 73 74 20 6e 6f 74 0a 20 20 2a 2a 20 61 74 74  ust not.  ** att
2c110 65 6d 70 74 20 74 6f 20 74 72 65 61 74 20 69 74  empt to treat it
2c120 20 61 73 20 61 20 72 65 6c 61 74 69 76 65 20 70   as a relative p
2c130 61 74 68 20 6e 61 6d 65 20 28 69 2e 65 2e 20 74  ath name (i.e. t
2c140 68 65 79 20 73 68 6f 75 6c 64 20 73 69 6d 70 6c  hey should simpl
2c150 79 20 75 73 65 0a 20 20 2a 2a 20 69 74 20 76 65  y use.  ** it ve
2c160 72 62 61 74 69 6d 29 2e 0a 20 20 2a 2f 0a 20 20  rbatim)..  */.  
2c170 69 66 20 28 20 77 69 6e 49 73 44 72 69 76 65 4c  if ( winIsDriveL
2c180 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 50  etterAndColon(zP
2c190 61 74 68 6e 61 6d 65 29 20 29 7b 0a 20 20 20 20  athname) ){.    
2c1a0 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d  return TRUE;.  }
2c1b0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 77  ..  /*.  ** If w
2c1c0 65 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f  e get to this po
2c1d0 69 6e 74 2c 20 74 68 65 20 70 61 74 68 20 6e 61  int, the path na
2c1e0 6d 65 20 73 68 6f 75 6c 64 20 61 6c 6d 6f 73 74  me should almost
2c1f0 20 63 65 72 74 61 69 6e 6c 79 20 62 65 20 61 20   certainly be a 
2c200 70 75 72 65 6c 79 0a 20 20 2a 2a 20 72 65 6c 61  purely.  ** rela
2c210 74 69 76 65 20 6f 6e 65 20 28 69 2e 65 2e 20 6e  tive one (i.e. n
2c220 6f 74 20 61 20 55 4e 43 20 6e 61 6d 65 2c 20 6e  ot a UNC name, n
2c230 6f 74 20 61 62 73 6f 6c 75 74 65 2c 20 61 6e 64  ot absolute, and
2c240 20 6e 6f 74 20 76 6f 6c 75 6d 65 20 72 65 6c 61   not volume rela
2c250 74 69 76 65 29 2e 0a 20 20 2a 2f 0a 20 20 72 65  tive)..  */.  re
2c260 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a 0a 2f  turn FALSE;.}../
2c270 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61  *.** Turn a rela
2c280 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e  tive pathname in
2c290 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61  to a full pathna
2c2a0 6d 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 66  me.  Write the f
2c2b0 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d 65 20  ull.** pathname 
2c2c0 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f  into zOut[].  zO
2c2d0 75 74 5b 5d 20 77 69 6c 6c 20 62 65 20 61 74 20  ut[] will be at 
2c2e0 6c 65 61 73 74 20 70 56 66 73 2d 3e 6d 78 50 61  least pVfs->mxPa
2c2f0 74 68 6e 61 6d 65 0a 2a 2a 20 62 79 74 65 73 20  thname.** bytes 
2c300 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  in size..*/.stat
2c310 69 63 20 69 6e 74 20 77 69 6e 46 75 6c 6c 50 61  ic int winFullPa
2c320 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65  thname(.  sqlite
2c330 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
2c340 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
2c350 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74  er to vfs object
2c360 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2c370 20 2a 7a 52 65 6c 61 74 69 76 65 2c 20 20 20 20   *zRelative,    
2c380 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
2c390 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70  relative input p
2c3a0 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 75  ath */.  int nFu
2c3b0 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
2c3c0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
2c3d0 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  f output buffer 
2c3e0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68  in bytes */.  ch
2c3f0 61 72 20 2a 7a 46 75 6c 6c 20 20 20 20 20 20 20  ar *zFull       
2c400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2c410 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a  utput buffer */.
2c420 29 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  ){.#if !SQLITE_O
2c430 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
2c440 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21  TE_OS_WINRT && !
2c450 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
2c460 5f 5f 29 0a 20 20 44 57 4f 52 44 20 6e 42 79 74  __).  DWORD nByt
2c470 65 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  e;.  void *zConv
2c480 65 72 74 65 64 3b 0a 20 20 63 68 61 72 20 2a 7a  erted;.  char *z
2c490 4f 75 74 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  Out;.#endif..  /
2c4a0 2a 20 49 66 20 74 68 69 73 20 70 61 74 68 20 6e  * If this path n
2c4b0 61 6d 65 20 62 65 67 69 6e 73 20 77 69 74 68 20  ame begins with 
2c4c0 22 2f 58 3a 22 2c 20 77 68 65 72 65 20 22 58 22  "/X:", where "X"
2c4d0 20 69 73 20 61 6e 79 20 61 6c 70 68 61 62 65 74   is any alphabet
2c4e0 69 63 0a 20 20 2a 2a 20 63 68 61 72 61 63 74 65  ic.  ** characte
2c4f0 72 2c 20 64 69 73 63 61 72 64 20 74 68 65 20 69  r, discard the i
2c500 6e 69 74 69 61 6c 20 22 2f 22 20 66 72 6f 6d 20  nitial "/" from 
2c510 74 68 65 20 70 61 74 68 6e 61 6d 65 2e 0a 20 20  the pathname..  
2c520 2a 2f 0a 20 20 69 66 28 20 7a 52 65 6c 61 74 69  */.  if( zRelati
2c530 76 65 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 77 69  ve[0]=='/' && wi
2c540 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e  nIsDriveLetterAn
2c550 64 43 6f 6c 6f 6e 28 7a 52 65 6c 61 74 69 76 65  dColon(zRelative
2c560 2b 31 29 20 29 7b 0a 20 20 20 20 7a 52 65 6c 61  +1) ){.    zRela
2c570 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a 0a 23 69 66  tive++;.  }..#if
2c580 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49   defined(__CYGWI
2c590 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49  N__).  SimulateI
2c5a0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
2c5b0 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20  QLITE_ERROR );. 
2c5c0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2c5d0 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 61 73 73 65  R(nFull);.  asse
2c5e0 72 74 28 20 6e 46 75 6c 6c 3e 3d 70 56 66 73 2d  rt( nFull>=pVfs-
2c5f0 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20  >mxPathname );. 
2c600 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61   if ( sqlite3_da
2c610 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20  ta_directory && 
2c620 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61  !winIsVerbatimPa
2c630 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65  thname(zRelative
2c640 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ) ){.    /*.    
2c650 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20  ** NOTE: We are 
2c660 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72  dealing with a r
2c670 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
2c680 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20  e and the data. 
2c690 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65     **       dire
2c6a0 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73  ctory has been s
2c6b0 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20  et.  Therefore, 
2c6c0 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62 61  use it as the ba
2c6d0 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  sis.    **      
2c6e0 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20   for converting 
2c6f0 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74  the relative pat
2c700 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73  h name to an abs
2c710 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20  olute.    **    
2c720 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e     one by prepen
2c730 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64 69  ding the data di
2c740 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 73 6c  rectory and a sl
2c750 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ash..    */.    
2c760 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c  char *zOut = sql
2c770 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
2c780 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2c790 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  +1 );.    if( !z
2c7a0 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74  Out ){.      ret
2c7b0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2c7c0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
2c7d0 20 7d 0a 20 20 20 20 69 66 28 20 63 79 67 77 69   }.    if( cygwi
2c7e0 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20  n_conv_path(.   
2c7f0 20 20 20 20 20 20 20 20 20 28 6f 73 49 73 4e 54           (osIsNT
2c800 28 29 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54  () ? CCP_POSIX_T
2c810 4f 5f 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f  O_WIN_W : CCP_PO
2c820 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 29 20 7c 0a  SIX_TO_WIN_A) |.
2c830 20 20 20 20 20 20 20 20 20 20 20 20 43 43 50 5f              CCP_
2c840 52 45 4c 41 54 49 56 45 2c 20 7a 52 65 6c 61 74  RELATIVE, zRelat
2c850 69 76 65 2c 20 7a 4f 75 74 2c 20 70 56 66 73 2d  ive, zOut, pVfs-
2c860 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30  >mxPathname+1)<0
2c870 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2c880 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20  3_free(zOut);.  
2c890 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
2c8a0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
2c8b0 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c  NTOPEN_CONVPATH,
2c8c0 20 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20   (DWORD)errno,. 
2c8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c8e0 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c          "winFull
2c8f0 50 61 74 68 6e 61 6d 65 31 22 2c 20 7a 52 65 6c  Pathname1", zRel
2c900 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 65 6c 73  ative);.    }els
2c910 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
2c920 55 74 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72  Utf8 = winConver
2c930 74 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  tToUtf8Filename(
2c940 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 66 28  zOut);.      if(
2c950 20 21 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20   !zUtf8 ){.     
2c960 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2c970 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 72  zOut);.        r
2c980 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
2c990 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  RR_NOMEM_BKPT;. 
2c9a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
2c9b0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49  ite3_snprintf(MI
2c9c0 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d  N(nFull, pVfs->m
2c9d0 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c  xPathname), zFul
2c9e0 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20 20 20  l, "%s%c%s",.   
2c9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca00 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61      sqlite3_data
2ca10 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47  _directory, winG
2ca20 65 74 44 69 72 53 65 70 28 29 2c 20 7a 55 74 66  etDirSep(), zUtf
2ca30 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  8);.      sqlite
2ca40 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20  3_free(zUtf8);. 
2ca50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2ca60 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 20  e(zOut);.    }. 
2ca70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
2ca80 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33   *zOut = sqlite3
2ca90 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 56 66 73  MallocZero( pVfs
2caa0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 29  ->mxPathname+1 )
2cab0 3b 0a 20 20 20 20 69 66 28 20 21 7a 4f 75 74 20  ;.    if( !zOut 
2cac0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2cad0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
2cae0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
2caf0 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63 6f     if( cygwin_co
2cb00 6e 76 5f 70 61 74 68 28 0a 20 20 20 20 20 20 20  nv_path(.       
2cb10 20 20 20 20 20 28 6f 73 49 73 4e 54 28 29 20 3f       (osIsNT() ?
2cb20 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49   CCP_POSIX_TO_WI
2cb30 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f  N_W : CCP_POSIX_
2cb40 54 4f 5f 57 49 4e 5f 41 29 2c 0a 20 20 20 20 20  TO_WIN_A),.     
2cb50 20 20 20 20 20 20 20 7a 52 65 6c 61 74 69 76 65         zRelative
2cb60 2c 20 7a 4f 75 74 2c 20 70 56 66 73 2d 3e 6d 78  , zOut, pVfs->mx
2cb70 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30 20 29 7b  Pathname+1)<0 ){
2cb80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
2cb90 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20  ree(zOut);.     
2cba0 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
2cbb0 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
2cbc0 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44  PEN_CONVPATH, (D
2cbd0 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20  WORD)errno,.    
2cbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cbf0 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74       "winFullPat
2cc00 68 6e 61 6d 65 32 22 2c 20 7a 52 65 6c 61 74 69  hname2", zRelati
2cc10 76 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ve);.    }else{.
2cc20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66        char *zUtf
2cc30 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f  8 = winConvertTo
2cc40 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 4f 75  Utf8Filename(zOu
2cc50 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a  t);.      if( !z
2cc60 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 20 20  Utf8 ){.        
2cc70 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75  sqlite3_free(zOu
2cc80 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
2cc90 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
2cca0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
2ccb0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
2ccc0 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e  3_snprintf(MIN(n
2ccd0 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61  Full, pVfs->mxPa
2cce0 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20  thname), zFull, 
2ccf0 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20  "%s", zUtf8);.  
2cd00 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2cd10 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73  (zUtf8);.      s
2cd20 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74  qlite3_free(zOut
2cd30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
2cd40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2cd50 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 28 53 51  .#endif..#if (SQ
2cd60 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c  LITE_OS_WINCE ||
2cd70 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
2cd80 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f  ) && !defined(__
2cd90 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75  CYGWIN__).  Simu
2cda0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
2cdb0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
2cdc0 20 29 3b 0a 20 20 2f 2a 20 57 69 6e 43 45 20 68   );.  /* WinCE h
2cdd0 61 73 20 6e 6f 20 63 6f 6e 63 65 70 74 20 6f 66  as no concept of
2cde0 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
2cdf0 6e 61 6d 65 2c 20 6f 72 20 73 6f 20 49 20 61 6d  name, or so I am
2ce00 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20 2f 2a 20 57   told. */.  /* W
2ce10 69 6e 52 54 20 68 61 73 20 6e 6f 20 77 61 79 20  inRT has no way 
2ce20 74 6f 20 63 6f 6e 76 65 72 74 20 61 20 72 65 6c  to convert a rel
2ce30 61 74 69 76 65 20 70 61 74 68 20 74 6f 20 61 6e  ative path to an
2ce40 20 61 62 73 6f 6c 75 74 65 20 6f 6e 65 2e 20 2a   absolute one. *
2ce50 2f 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65 33  /.  if ( sqlite3
2ce60 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20  _data_directory 
2ce70 26 26 20 21 77 69 6e 49 73 56 65 72 62 61 74 69  && !winIsVerbati
2ce80 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74  mPathname(zRelat
2ce90 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  ive) ){.    /*. 
2cea0 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61     ** NOTE: We a
2ceb0 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
2cec0 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  a relative path 
2ced0 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74  name and the dat
2cee0 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64  a.    **       d
2cef0 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
2cf00 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72  n set.  Therefor
2cf10 65 2c 20 75 73 65 20 69 74 20 61 73 20 74 68 65  e, use it as the
2cf20 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20   basis.    **   
2cf30 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69      for converti
2cf40 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76 65 20  ng the relative 
2cf50 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20  path name to an 
2cf60 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20  absolute.    ** 
2cf70 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65        one by pre
2cf80 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61  pending the data
2cf90 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61   directory and a
2cfa0 20 62 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20   backslash..    
2cfb0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
2cfc0 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c  nprintf(MIN(nFul
2cfd0 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l, pVfs->mxPathn
2cfe0 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  ame), zFull, "%s
2cff0 25 63 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  %c%s",.         
2d000 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2d010 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
2d020 72 79 2c 20 77 69 6e 47 65 74 44 69 72 53 65 70  ry, winGetDirSep
2d030 28 29 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a  (), zRelative);.
2d040 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
2d050 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49  ite3_snprintf(MI
2d060 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d  N(nFull, pVfs->m
2d070 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c  xPathname), zFul
2d080 6c 2c 20 22 25 73 22 2c 20 7a 52 65 6c 61 74 69  l, "%s", zRelati
2d090 76 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ve);.  }.  retur
2d0a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
2d0b0 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  dif..#if !SQLITE
2d0c0 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
2d0d0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
2d0e0 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57   !defined(__CYGW
2d0f0 49 4e 5f 5f 29 0a 20 20 2f 2a 20 49 74 27 73 20  IN__).  /* It's 
2d100 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
2d110 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
2d120 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
2d130 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
2d140 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
2d150 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
2d160 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
2d170 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
2d180 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
2d190 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75  failing. This fu
2d1a0 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69  nction could fai
2d1b0 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c  l if, for exampl
2d1c0 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  e, the.  ** curr
2d1d0 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65  ent working dire
2d1e0 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75  ctory has been u
2d1f0 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20  nlinked..  */.  
2d200 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
2d210 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
2d220 52 52 4f 52 20 29 3b 0a 20 20 69 66 20 28 20 73  RROR );.  if ( s
2d230 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
2d240 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56  ctory && !winIsV
2d250 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28  erbatimPathname(
2d260 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20  zRelative) ){.  
2d270 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45    /*.    ** NOTE
2d280 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67  : We are dealing
2d290 20 77 69 74 68 20 61 20 72 65 6c 61 74 69 76 65   with a relative
2d2a0 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74   path name and t
2d2b0 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20  he data.    **  
2d2c0 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 68       directory h
2d2d0 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68  as been set.  Th
2d2e0 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20  erefore, use it 
2d2f0 61 73 20 74 68 65 20 62 61 73 69 73 0a 20 20 20  as the basis.   
2d300 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f   **       for co
2d310 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c  nverting the rel
2d320 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20  ative path name 
2d330 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20  to an absolute. 
2d340 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20     **       one 
2d350 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68  by prepending th
2d360 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79  e data directory
2d370 20 61 6e 64 20 61 20 62 61 63 6b 73 6c 61 73 68   and a backslash
2d380 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
2d390 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49  ite3_snprintf(MI
2d3a0 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d  N(nFull, pVfs->m
2d3b0 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c  xPathname), zFul
2d3c0 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20 20 20  l, "%s%c%s",.   
2d3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d3e0 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64    sqlite3_data_d
2d3f0 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47 65 74  irectory, winGet
2d400 44 69 72 53 65 70 28 29 2c 20 7a 52 65 6c 61 74  DirSep(), zRelat
2d410 69 76 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ive);.    return
2d420 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2d430 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
2d440 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66  inConvertFromUtf
2d450 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61 74  8Filename(zRelat
2d460 69 76 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e  ive);.  if( zCon
2d470 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
2d480 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2d490 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
2d4a0 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e  .  }.  if( osIsN
2d4b0 54 28 29 20 29 7b 0a 20 20 20 20 4c 50 57 53 54  T() ){.    LPWST
2d4c0 52 20 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79  R zTemp;.    nBy
2d4d0 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61  te = osGetFullPa
2d4e0 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54 52  thNameW((LPCWSTR
2d4f0 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20  )zConverted, 0, 
2d500 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e  0, 0);.    if( n
2d510 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Byte==0 ){.     
2d520 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
2d530 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
2d540 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
2d550 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
2d560 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73  PEN_FULLPATH, os
2d570 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
2d580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d590 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c           "winFul
2d5a0 6c 50 61 74 68 6e 61 6d 65 31 22 2c 20 7a 52 65  lPathname1", zRe
2d5b0 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20  lative);.    }. 
2d5c0 20 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b 0a 20     nByte += 3;. 
2d5d0 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74     zTemp = sqlit
2d5e0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42  e3MallocZero( nB
2d5f0 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70  yte*sizeof(zTemp
2d600 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20  [0]) );.    if( 
2d610 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20  zTemp==0 ){.    
2d620 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2d630 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
2d640 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d650 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  IOERR_NOMEM_BKPT
2d660 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74  ;.    }.    nByt
2d670 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74  e = osGetFullPat
2d680 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54 52 29  hNameW((LPCWSTR)
2d690 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74  zConverted, nByt
2d6a0 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20  e, zTemp, 0);.  
2d6b0 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29    if( nByte==0 )
2d6c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2d6d0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
2d6e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2d6f0 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20  free(zTemp);.   
2d700 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
2d710 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
2d720 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20  TOPEN_FULLPATH, 
2d730 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
2d740 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2d750 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
2d760 75 6c 6c 50 61 74 68 6e 61 6d 65 32 22 2c 20 7a  ullPathname2", z
2d770 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d  Relative);.    }
2d780 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2d790 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
2d7a0 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e 55 6e 69     zOut = winUni
2d7b0 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70  codeToUtf8(zTemp
2d7c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
2d7d0 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a  ree(zTemp);.  }.
2d7e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
2d7f0 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
2d800 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
2d810 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20  Temp;.    nByte 
2d820 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e  = osGetFullPathN
2d830 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  ameA((char*)zCon
2d840 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29  verted, 0, 0, 0)
2d850 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d  ;.    if( nByte=
2d860 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
2d870 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
2d880 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ted);.      retu
2d890 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
2d8a0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46  QLITE_CANTOPEN_F
2d8b0 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61  ULLPATH, osGetLa
2d8c0 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
2d8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d8e0 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68      "winFullPath
2d8f0 6e 61 6d 65 33 22 2c 20 7a 52 65 6c 61 74 69 76  name3", zRelativ
2d900 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42  e);.    }.    nB
2d910 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54  yte += 3;.    zT
2d920 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  emp = sqlite3Mal
2d930 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73  locZero( nByte*s
2d940 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20  izeof(zTemp[0]) 
2d950 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70  );.    if( zTemp
2d960 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
2d970 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
2d980 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74  rted);.      ret
2d990 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2d9a0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
2d9b0 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f   }.    nByte = o
2d9c0 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
2d9d0 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72  A((char*)zConver
2d9e0 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d  ted, nByte, zTem
2d9f0 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e  p, 0);.    if( n
2da00 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Byte==0 ){.     
2da10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
2da20 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
2da30 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
2da40 65 6d 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  emp);.      retu
2da50 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
2da60 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46  QLITE_CANTOPEN_F
2da70 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61  ULLPATH, osGetLa
2da80 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
2da90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2daa0 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68      "winFullPath
2dab0 6e 61 6d 65 34 22 2c 20 7a 52 65 6c 61 74 69 76  name4", zRelativ
2dac0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
2dad0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
2dae0 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74  erted);.    zOut
2daf0 20 3d 20 77 69 6e 4d 62 63 73 54 6f 55 74 66 38   = winMbcsToUtf8
2db00 28 7a 54 65 6d 70 2c 20 6f 73 41 72 65 46 69 6c  (zTemp, osAreFil
2db10 65 41 70 69 73 41 4e 53 49 28 29 29 3b 0a 20 20  eApisANSI());.  
2db20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2db30 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Temp);.  }.#endi
2db40 66 0a 20 20 69 66 28 20 7a 4f 75 74 20 29 7b 0a  f.  if( zOut ){.
2db50 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2db60 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20  intf(MIN(nFull, 
2db70 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2db80 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20  ), zFull, "%s", 
2db90 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  zOut);.    sqlit
2dba0 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20  e3_free(zOut);. 
2dbb0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2dbc0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
2dbd0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2dbe0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  IOERR_NOMEM_BKPT
2dbf0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
2dc00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2dc10 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
2dc20 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61  ON./*.** Interfa
2dc30 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20  ces for opening 
2dc40 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  a shared library
2dc50 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20  , finding entry 
2dc60 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e  points.** within
2dc70 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
2dc80 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67  ary, and closing
2dc90 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
2dca0 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ary..*/.static v
2dcb0 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65 6e 28 73  oid *winDlOpen(s
2dcc0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2dcd0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
2dce0 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48 41 4e 44  ilename){.  HAND
2dcf0 4c 45 20 68 3b 0a 23 69 66 20 64 65 66 69 6e 65  LE h;.#if define
2dd00 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
2dd10 69 6e 74 20 6e 46 75 6c 6c 20 3d 20 70 56 66 73  int nFull = pVfs
2dd20 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
2dd30 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 3d 20    char *zFull = 
2dd40 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
2dd50 6f 28 20 6e 46 75 6c 6c 20 29 3b 0a 20 20 76 6f  o( nFull );.  vo
2dd60 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d  id *zConverted =
2dd70 20 30 3b 0a 20 20 69 66 28 20 7a 46 75 6c 6c 3d   0;.  if( zFull=
2dd80 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  =0 ){.    OSTRAC
2dd90 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d  E(("DLOPEN name=
2dda0 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22  %s, handle=%p\n"
2ddb0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f  , zFilename, (vo
2ddc0 69 64 2a 29 30 29 29 3b 0a 20 20 20 20 72 65 74  id*)0));.    ret
2ddd0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
2dde0 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65   winFullPathname
2ddf0 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
2de00 2c 20 6e 46 75 6c 6c 2c 20 7a 46 75 6c 6c 29 21  , nFull, zFull)!
2de10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2de20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2de30 46 75 6c 6c 29 3b 0a 20 20 20 20 4f 53 54 52 41  Full);.    OSTRA
2de40 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65  CE(("DLOPEN name
2de50 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e  =%s, handle=%p\n
2de60 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76  ", zFilename, (v
2de70 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20 20 72 65  oid*)0));.    re
2de80 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 43  turn 0;.  }.  zC
2de90 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f  onverted = winCo
2dea0 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c  nvertFromUtf8Fil
2deb0 65 6e 61 6d 65 28 7a 46 75 6c 6c 29 3b 0a 20 20  ename(zFull);.  
2dec0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
2ded0 6c 6c 29 3b 0a 23 65 6c 73 65 0a 20 20 76 6f 69  ll);.#else.  voi
2dee0 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  d *zConverted = 
2def0 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74  winConvertFromUt
2df00 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65  f8Filename(zFile
2df10 6e 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f  name);.  UNUSED_
2df20 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
2df30 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 43  .#endif.  if( zC
2df40 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20  onverted==0 ){. 
2df50 20 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c 4f     OSTRACE(("DLO
2df60 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e  PEN name=%s, han
2df70 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65  dle=%p\n", zFile
2df80 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29 30 29 29  name, (void*)0))
2df90 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
2dfa0 20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e 54    }.  if( osIsNT
2dfb0 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  () ){.#if SQLITE
2dfc0 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 68 20  _OS_WINRT.    h 
2dfd0 3d 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65 64  = osLoadPackaged
2dfe0 4c 69 62 72 61 72 79 28 28 4c 50 43 57 53 54 52  Library((LPCWSTR
2dff0 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 29 3b  )zConverted, 0);
2e000 0a 23 65 6c 73 65 0a 20 20 20 20 68 20 3d 20 6f  .#else.    h = o
2e010 73 4c 6f 61 64 4c 69 62 72 61 72 79 57 28 28 4c  sLoadLibraryW((L
2e020 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
2e030 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23  d);.#endif.  }.#
2e040 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
2e050 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
2e060 73 65 7b 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f  se{.    h = osLo
2e070 61 64 4c 69 62 72 61 72 79 41 28 28 63 68 61 72  adLibraryA((char
2e080 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  *)zConverted);. 
2e090 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52   }.#endif.  OSTR
2e0a0 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d  ACE(("DLOPEN nam
2e0b0 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c  e=%s, handle=%p\
2e0c0 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28  n", zFilename, (
2e0d0 76 6f 69 64 2a 29 68 29 29 3b 0a 20 20 73 71 6c  void*)h));.  sql
2e0e0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
2e0f0 72 74 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  rted);.  return 
2e100 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74 61 74  (void*)h;.}.stat
2e110 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 45 72 72  ic void winDlErr
2e120 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
2e130 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20  pVfs, int nBuf, 
2e140 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a  char *zBufOut){.
2e150 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2e160 45 52 28 70 56 66 73 29 3b 0a 20 20 77 69 6e 47  ER(pVfs);.  winG
2e170 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f  etLastErrorMsg(o
2e180 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
2e190 20 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 29 3b   nBuf, zBufOut);
2e1a0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28  .}.static void (
2e1b0 2a 77 69 6e 44 6c 53 79 6d 28 73 71 6c 69 74 65  *winDlSym(sqlite
2e1c0 33 5f 76 66 73 20 2a 70 56 66 73 2c 76 6f 69 64  3_vfs *pVfs,void
2e1d0 20 2a 70 48 2c 63 6f 6e 73 74 20 63 68 61 72 20   *pH,const char 
2e1e0 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20  *zSym))(void){. 
2e1f0 20 46 41 52 50 52 4f 43 20 70 72 6f 63 3b 0a 20   FARPROC proc;. 
2e200 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2e210 52 28 70 56 66 73 29 3b 0a 20 20 70 72 6f 63 20  R(pVfs);.  proc 
2e220 3d 20 6f 73 47 65 74 50 72 6f 63 41 64 64 72 65  = osGetProcAddre
2e230 73 73 41 28 28 48 41 4e 44 4c 45 29 70 48 2c 20  ssA((HANDLE)pH, 
2e240 7a 53 79 6d 29 3b 0a 20 20 4f 53 54 52 41 43 45  zSym);.  OSTRACE
2e250 28 28 22 44 4c 53 59 4d 20 68 61 6e 64 6c 65 3d  (("DLSYM handle=
2e260 25 70 2c 20 73 79 6d 62 6f 6c 3d 25 73 2c 20 61  %p, symbol=%s, a
2e270 64 64 72 65 73 73 3d 25 70 5c 6e 22 2c 0a 20 20  ddress=%p\n",.  
2e280 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
2e290 70 48 2c 20 7a 53 79 6d 2c 20 28 76 6f 69 64 2a  pH, zSym, (void*
2e2a0 29 70 72 6f 63 29 29 3b 0a 20 20 72 65 74 75 72  )proc));.  retur
2e2b0 6e 20 28 76 6f 69 64 28 2a 29 28 76 6f 69 64 29  n (void(*)(void)
2e2c0 29 70 72 6f 63 3b 0a 7d 0a 73 74 61 74 69 63 20  )proc;.}.static 
2e2d0 76 6f 69 64 20 77 69 6e 44 6c 43 6c 6f 73 65 28  void winDlClose(
2e2e0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2e2f0 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65  s, void *pHandle
2e300 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2e310 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 6f  METER(pVfs);.  o
2e320 73 46 72 65 65 4c 69 62 72 61 72 79 28 28 48 41  sFreeLibrary((HA
2e330 4e 44 4c 45 29 70 48 61 6e 64 6c 65 29 3b 0a 20  NDLE)pHandle);. 
2e340 20 4f 53 54 52 41 43 45 28 28 22 44 4c 43 4c 4f   OSTRACE(("DLCLO
2e350 53 45 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c  SE handle=%p\n",
2e360 20 28 76 6f 69 64 2a 29 70 48 61 6e 64 6c 65 29   (void*)pHandle)
2e370 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66  );.}.#else /* if
2e380 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
2e390 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64  D_EXTENSION is d
2e3a0 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65  efined: */.  #de
2e3b0 66 69 6e 65 20 77 69 6e 44 6c 4f 70 65 6e 20 20  fine winDlOpen  
2e3c0 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44  0.  #define winD
2e3d0 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69  lError 0.  #defi
2e3e0 6e 65 20 77 69 6e 44 6c 53 79 6d 20 20 20 30 0a  ne winDlSym   0.
2e3f0 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 43    #define winDlC
2e400 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  lose 0.#endif../
2e410 2a 20 53 74 61 74 65 20 69 6e 66 6f 72 6d 61 74  * State informat
2e420 69 6f 6e 20 66 6f 72 20 74 68 65 20 72 61 6e 64  ion for the rand
2e430 6f 6d 6e 65 73 73 20 67 61 74 68 65 72 65 72 2e  omness gatherer.
2e440 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
2e450 63 74 20 45 6e 74 72 6f 70 79 47 61 74 68 65 72  ct EntropyGather
2e460 65 72 20 45 6e 74 72 6f 70 79 47 61 74 68 65 72  er EntropyGather
2e470 65 72 3b 0a 73 74 72 75 63 74 20 45 6e 74 72 6f  er;.struct Entro
2e480 70 79 47 61 74 68 65 72 65 72 20 7b 0a 20 20 75  pyGatherer {.  u
2e490 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 3b  nsigned char *a;
2e4a0 20 20 20 2f 2a 20 47 61 74 68 65 72 20 65 6e 74     /* Gather ent
2e4b0 72 6f 70 79 20 69 6e 74 6f 20 74 68 69 73 20 62  ropy into this b
2e4c0 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  uffer */.  int n
2e4d0 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  a;             /
2e4e0 2a 20 53 69 7a 65 20 6f 66 20 61 5b 5d 20 69 6e  * Size of a[] in
2e4f0 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
2e500 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
2e510 2f 2a 20 58 4f 52 20 6e 65 78 74 20 69 6e 70 75  /* XOR next inpu
2e520 74 20 69 6e 74 6f 20 61 5b 69 5d 20 2a 2f 0a 20  t into a[i] */. 
2e530 20 69 6e 74 20 6e 58 6f 72 3b 20 20 20 20 20 20   int nXor;      
2e540 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2e550 66 20 58 4f 52 20 6f 70 65 72 61 74 69 6f 6e 73  f XOR operations
2e560 20 64 6f 6e 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66   done */.};..#if
2e570 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2e580 5f 54 45 53 54 29 20 26 26 20 21 64 65 66 69 6e  _TEST) && !defin
2e590 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ed(SQLITE_OMIT_R
2e5a0 41 4e 44 4f 4d 4e 45 53 53 29 0a 2f 2a 20 4d 69  ANDOMNESS)./* Mi
2e5b0 78 20 73 7a 20 62 79 74 65 73 20 6f 66 20 65 6e  x sz bytes of en
2e5c0 74 72 6f 70 79 20 69 6e 74 6f 20 70 2e 20 2a 2f  tropy into p. */
2e5d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 78 6f 72  .static void xor
2e5e0 4d 65 6d 6f 72 79 28 45 6e 74 72 6f 70 79 47 61  Memory(EntropyGa
2e5f0 74 68 65 72 65 72 20 2a 70 2c 20 75 6e 73 69 67  therer *p, unsig
2e600 6e 65 64 20 63 68 61 72 20 2a 78 2c 20 69 6e 74  ned char *x, int
2e610 20 73 7a 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b   sz){.  int j, k
2e620 3b 0a 20 20 66 6f 72 28 6a 3d 30 2c 20 6b 3d 70  ;.  for(j=0, k=p
2e630 2d 3e 69 3b 20 6a 3c 73 7a 3b 20 6a 2b 2b 29 7b  ->i; j<sz; j++){
2e640 0a 20 20 20 20 70 2d 3e 61 5b 6b 2b 2b 5d 20 5e  .    p->a[k++] ^
2e650 3d 20 78 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20  = x[j];.    if( 
2e660 6b 3e 3d 70 2d 3e 6e 61 20 29 20 6b 20 3d 20 30  k>=p->na ) k = 0
2e670 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 20 3d 20 6b  ;.  }.  p->i = k
2e680 3b 0a 20 20 70 2d 3e 6e 58 6f 72 20 2b 3d 20 73  ;.  p->nXor += s
2e690 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  z;.}.#endif /* !
2e6a0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
2e6b0 45 53 54 29 20 26 26 20 21 64 65 66 69 6e 65 64  EST) && !defined
2e6c0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 41 4e  (SQLITE_OMIT_RAN
2e6d0 44 4f 4d 4e 45 53 53 29 20 2a 2f 0a 0a 2f 2a 0a  DOMNESS) */../*.
2e6e0 2a 2a 20 57 72 69 74 65 20 75 70 20 74 6f 20 6e  ** Write up to n
2e6f0 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e  Buf bytes of ran
2e700 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20 7a 42 75  domness into zBu
2e710 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
2e720 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 28 73   winRandomness(s
2e730 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2e740 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
2e750 20 2a 7a 42 75 66 29 7b 0a 23 69 66 20 64 65 66   *zBuf){.#if def
2e760 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
2e770 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
2e780 49 54 45 5f 4f 4d 49 54 5f 52 41 4e 44 4f 4d 4e  ITE_OMIT_RANDOMN
2e790 45 53 53 29 0a 20 20 55 4e 55 53 45 44 5f 50 41  ESS).  UNUSED_PA
2e7a0 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
2e7b0 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c   memset(zBuf, 0,
2e7c0 20 6e 42 75 66 29 3b 0a 20 20 72 65 74 75 72 6e   nBuf);.  return
2e7d0 20 6e 42 75 66 3b 0a 23 65 6c 73 65 0a 20 20 45   nBuf;.#else.  E
2e7e0 6e 74 72 6f 70 79 47 61 74 68 65 72 65 72 20 65  ntropyGatherer e
2e7f0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2e800 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 6d 65  ETER(pVfs);.  me
2e810 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42  mset(zBuf, 0, nB
2e820 75 66 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  uf);.#if defined
2e830 28 5f 4d 53 43 5f 56 45 52 29 20 26 26 20 5f 4d  (_MSC_VER) && _M
2e840 53 43 5f 56 45 52 3e 3d 31 34 30 30 20 26 26 20  SC_VER>=1400 && 
2e850 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
2e860 0a 20 20 72 61 6e 64 5f 73 28 28 75 6e 73 69 67  .  rand_s((unsig
2e870 6e 65 64 20 69 6e 74 2a 29 7a 42 75 66 29 3b 20  ned int*)zBuf); 
2e880 2f 2a 20 72 61 6e 64 5f 73 28 29 20 69 73 20 6e  /* rand_s() is n
2e890 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 77 69 74  ot available wit
2e8a0 68 20 4d 69 6e 47 57 20 2a 2f 0a 23 65 6e 64 69  h MinGW */.#endi
2e8b0 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 4d 53  f /* defined(_MS
2e8c0 43 5f 56 45 52 29 20 26 26 20 5f 4d 53 43 5f 56  C_VER) && _MSC_V
2e8d0 45 52 3e 3d 31 34 30 30 20 2a 2f 0a 20 20 65 2e  ER>=1400 */.  e.
2e8e0 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  a = (unsigned ch
2e8f0 61 72 2a 29 7a 42 75 66 3b 0a 20 20 65 2e 6e 61  ar*)zBuf;.  e.na
2e900 20 3d 20 6e 42 75 66 3b 0a 20 20 65 2e 6e 58 6f   = nBuf;.  e.nXo
2e910 72 20 3d 20 30 3b 0a 20 20 65 2e 69 20 3d 20 30  r = 0;.  e.i = 0
2e920 3b 0a 20 20 7b 0a 20 20 20 20 53 59 53 54 45 4d  ;.  {.    SYSTEM
2e930 54 49 4d 45 20 78 3b 0a 20 20 20 20 6f 73 47 65  TIME x;.    osGe
2e940 74 53 79 73 74 65 6d 54 69 6d 65 28 26 78 29 3b  tSystemTime(&x);
2e950 0a 20 20 20 20 78 6f 72 4d 65 6d 6f 72 79 28 26  .    xorMemory(&
2e960 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  e, (unsigned cha
2e970 72 2a 29 26 78 2c 20 73 69 7a 65 6f 66 28 53 59  r*)&x, sizeof(SY
2e980 53 54 45 4d 54 49 4d 45 29 29 3b 0a 20 20 7d 0a  STEMTIME));.  }.
2e990 20 20 7b 0a 20 20 20 20 44 57 4f 52 44 20 70 69    {.    DWORD pi
2e9a0 64 20 3d 20 6f 73 47 65 74 43 75 72 72 65 6e 74  d = osGetCurrent
2e9b0 50 72 6f 63 65 73 73 49 64 28 29 3b 0a 20 20 20  ProcessId();.   
2e9c0 20 78 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28   xorMemory(&e, (
2e9d0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26  unsigned char*)&
2e9e0 70 69 64 2c 20 73 69 7a 65 6f 66 28 44 57 4f 52  pid, sizeof(DWOR
2e9f0 44 29 29 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c  D));.  }.#if SQL
2ea00 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
2ea10 0a 20 20 20 20 55 4c 4f 4e 47 4c 4f 4e 47 20 63  .    ULONGLONG c
2ea20 6e 74 20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f  nt = osGetTickCo
2ea30 75 6e 74 36 34 28 29 3b 0a 20 20 20 20 78 6f 72  unt64();.    xor
2ea40 4d 65 6d 6f 72 79 28 26 65 2c 20 28 75 6e 73 69  Memory(&e, (unsi
2ea50 67 6e 65 64 20 63 68 61 72 2a 29 26 63 6e 74 2c  gned char*)&cnt,
2ea60 20 73 69 7a 65 6f 66 28 55 4c 4f 4e 47 4c 4f 4e   sizeof(ULONGLON
2ea70 47 29 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  G));.  }.#else. 
2ea80 20 7b 0a 20 20 20 20 44 57 4f 52 44 20 63 6e 74   {.    DWORD cnt
2ea90 20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e   = osGetTickCoun
2eaa0 74 28 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f  t();.    xorMemo
2eab0 72 79 28 26 65 2c 20 28 75 6e 73 69 67 6e 65 64  ry(&e, (unsigned
2eac0 20 63 68 61 72 2a 29 26 63 6e 74 2c 20 73 69 7a   char*)&cnt, siz
2ead0 65 6f 66 28 44 57 4f 52 44 29 29 3b 0a 20 20 7d  eof(DWORD));.  }
2eae0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2eaf0 45 5f 4f 53 5f 57 49 4e 52 54 20 2a 2f 0a 20 20  E_OS_WINRT */.  
2eb00 7b 0a 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45  {.    LARGE_INTE
2eb10 47 45 52 20 69 3b 0a 20 20 20 20 6f 73 51 75 65  GER i;.    osQue
2eb20 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75  ryPerformanceCou
2eb30 6e 74 65 72 28 26 69 29 3b 0a 20 20 20 20 78 6f  nter(&i);.    xo
2eb40 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28 75 6e 73  rMemory(&e, (uns
2eb50 69 67 6e 65 64 20 63 68 61 72 2a 29 26 69 2c 20  igned char*)&i, 
2eb60 73 69 7a 65 6f 66 28 4c 41 52 47 45 5f 49 4e 54  sizeof(LARGE_INT
2eb70 45 47 45 52 29 29 3b 0a 20 20 7d 0a 23 69 66 20  EGER));.  }.#if 
2eb80 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
2eb90 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
2eba0 49 4e 52 54 20 26 26 20 53 51 4c 49 54 45 5f 57  INRT && SQLITE_W
2ebb0 49 4e 33 32 5f 55 53 45 5f 55 55 49 44 0a 20 20  IN32_USE_UUID.  
2ebc0 7b 0a 20 20 20 20 55 55 49 44 20 69 64 3b 0a 20  {.    UUID id;. 
2ebd0 20 20 20 6d 65 6d 73 65 74 28 26 69 64 2c 20 30     memset(&id, 0
2ebe0 2c 20 73 69 7a 65 6f 66 28 55 55 49 44 29 29 3b  , sizeof(UUID));
2ebf0 0a 20 20 20 20 6f 73 55 75 69 64 43 72 65 61 74  .    osUuidCreat
2ec00 65 28 26 69 64 29 3b 0a 20 20 20 20 78 6f 72 4d  e(&id);.    xorM
2ec10 65 6d 6f 72 79 28 26 65 2c 20 28 75 6e 73 69 67  emory(&e, (unsig
2ec20 6e 65 64 20 63 68 61 72 2a 29 26 69 64 2c 20 73  ned char*)&id, s
2ec30 69 7a 65 6f 66 28 55 55 49 44 29 29 3b 0a 20 20  izeof(UUID));.  
2ec40 20 20 6d 65 6d 73 65 74 28 26 69 64 2c 20 30 2c    memset(&id, 0,
2ec50 20 73 69 7a 65 6f 66 28 55 55 49 44 29 29 3b 0a   sizeof(UUID));.
2ec60 20 20 20 20 6f 73 55 75 69 64 43 72 65 61 74 65      osUuidCreate
2ec70 53 65 71 75 65 6e 74 69 61 6c 28 26 69 64 29 3b  Sequential(&id);
2ec80 0a 20 20 20 20 78 6f 72 4d 65 6d 6f 72 79 28 26  .    xorMemory(&
2ec90 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  e, (unsigned cha
2eca0 72 2a 29 26 69 64 2c 20 73 69 7a 65 6f 66 28 55  r*)&id, sizeof(U
2ecb0 55 49 44 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  UID));.  }.#endi
2ecc0 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 53 5f  f /* !SQLITE_OS_
2ecd0 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
2ece0 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 53 51 4c  _OS_WINRT && SQL
2ecf0 49 54 45 5f 57 49 4e 33 32 5f 55 53 45 5f 55 55  ITE_WIN32_USE_UU
2ed00 49 44 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 65  ID */.  return e
2ed10 2e 6e 58 6f 72 3e 6e 42 75 66 20 3f 20 6e 42 75  .nXor>nBuf ? nBu
2ed20 66 20 3a 20 65 2e 6e 58 6f 72 3b 0a 23 65 6e 64  f : e.nXor;.#end
2ed30 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
2ed40 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65  LITE_TEST) || de
2ed50 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
2ed60 54 5f 52 41 4e 44 4f 4d 4e 45 53 53 29 20 2a 2f  T_RANDOMNESS) */
2ed70 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70  .}.../*.** Sleep
2ed80 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68   for a little wh
2ed90 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ile.  Return the
2eda0 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20   amount of time 
2edb0 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  slept..*/.static
2edc0 20 69 6e 74 20 77 69 6e 53 6c 65 65 70 28 73 71   int winSleep(sq
2edd0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2ede0 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 29 7b 0a   int microsec){.
2edf0 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f    sqlite3_win32_
2ee00 73 6c 65 65 70 28 28 6d 69 63 72 6f 73 65 63 2b  sleep((microsec+
2ee10 39 39 39 29 2f 31 30 30 30 29 3b 0a 20 20 55 4e  999)/1000);.  UN
2ee20 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
2ee30 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  Vfs);.  return (
2ee40 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31  (microsec+999)/1
2ee50 30 30 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a  000)*1000;.}../*
2ee60 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
2ee70 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73  g variable, if s
2ee80 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  et to a non-zero
2ee90 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72   value, is inter
2eea0 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65  preted as.** the
2eeb0 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e   number of secon
2eec0 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e  ds since 1970 an
2eed0 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 74  d is used to set
2eee0 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
2eef0 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65  * sqlite3OsCurre
2ef00 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20  ntTime() during 
2ef10 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64  testing..*/.#ifd
2ef20 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
2ef30 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  nt sqlite3_curre
2ef40 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a  nt_time = 0;  /*
2ef50 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d   Fake system tim
2ef60 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e  e in seconds sin
2ef70 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64  ce 1970. */.#end
2ef80 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  if../*.** Find t
2ef90 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
2efa0 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f  (in Universal Co
2efb0 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e  ordinated Time).
2efc0 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69    Write into *pi
2efd0 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65  Now.** the curre
2efe0 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  nt time and date
2eff0 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79   as a Julian Day
2f000 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36   number times 86
2f010 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a  _400_000.  In.**
2f020 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72   other words, wr
2f030 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20  ite into *piNow 
2f040 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
2f050 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  lliseconds since
2f060 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65   the Julian.** e
2f070 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20  poch of noon in 
2f080 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76  Greenwich on Nov
2f090 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20 42  ember 24, 4714 B
2f0a0 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  .C according to 
2f0b0 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63  the.** proleptic
2f0c0 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e   Gregorian calen
2f0d0 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75  dar..**.** On su
2f0e0 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53 51  ccess, return SQ
2f0f0 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e  LITE_OK.  Return
2f100 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66   SQLITE_ERROR if
2f110 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
2f120 74 65 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  te.** cannot be 
2f130 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
2f140 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54   int winCurrentT
2f150 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33  imeInt64(sqlite3
2f160 5f 76 66 73 20 2a 70 56 66 73 2c 20 73 71 6c 69  _vfs *pVfs, sqli
2f170 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77  te3_int64 *piNow
2f180 29 7b 0a 20 20 2f 2a 20 46 49 4c 45 54 49 4d 45  ){.  /* FILETIME
2f190 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 20   structure is a 
2f1a0 36 34 2d 62 69 74 20 76 61 6c 75 65 20 72 65 70  64-bit value rep
2f1b0 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 6e 75  resenting the nu
2f1c0 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 31 30 30  mber of.     100
2f1d0 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65  -nanosecond inte
2f1e0 72 76 61 6c 73 20 73 69 6e 63 65 20 4a 61 6e 75  rvals since Janu
2f1f0 61 72 79 20 31 2c 20 31 36 30 31 20 28 3d 20 4a  ary 1, 1601 (= J
2f200 44 20 32 33 30 35 38 31 33 2e 35 29 2e 0a 20 20  D 2305813.5)..  
2f210 2a 2f 0a 20 20 46 49 4c 45 54 49 4d 45 20 66 74  */.  FILETIME ft
2f220 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
2f230 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 77   sqlite3_int64 w
2f240 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20  inFiletimeEpoch 
2f250 3d 20 32 33 30 35 38 31 33 35 2a 28 73 71 6c 69  = 23058135*(sqli
2f260 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30  te3_int64)864000
2f270 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
2f280 5f 54 45 53 54 0a 20 20 73 74 61 74 69 63 20 63  _TEST.  static c
2f290 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74  onst sqlite3_int
2f2a0 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20 32  64 unixEpoch = 2
2f2b0 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65 33  4405875*(sqlite3
2f2c0 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a  _int64)8640000;.
2f2d0 23 65 6e 64 69 66 0a 20 20 2f 2a 20 32 5e 33 32  #endif.  /* 2^32
2f2e0 20 2d 20 74 6f 20 61 76 6f 69 64 20 75 73 65 20   - to avoid use 
2f2f0 6f 66 20 4c 4c 20 61 6e 64 20 77 61 72 6e 69 6e  of LL and warnin
2f300 67 73 20 69 6e 20 67 63 63 20 2a 2f 0a 20 20 73  gs in gcc */.  s
2f310 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
2f320 74 65 33 5f 69 6e 74 36 34 20 6d 61 78 33 32 42  te3_int64 max32B
2f330 69 74 56 61 6c 75 65 20 3d 0a 20 20 20 20 20 20  itValue =.      
2f340 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32  (sqlite3_int64)2
2f350 30 30 30 30 30 30 30 30 30 20 2b 20 28 73 71 6c  000000000 + (sql
2f360 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30  ite3_int64)20000
2f370 30 30 30 30 30 20 2b 0a 20 20 20 20 20 20 28 73  00000 +.      (s
2f380 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 39 34  qlite3_int64)294
2f390 39 36 37 32 39 36 3b 0a 0a 23 69 66 20 53 51 4c  967296;..#if SQL
2f3a0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 53  ITE_OS_WINCE.  S
2f3b0 59 53 54 45 4d 54 49 4d 45 20 74 69 6d 65 3b 0a  YSTEMTIME time;.
2f3c0 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d    osGetSystemTim
2f3d0 65 28 26 74 69 6d 65 29 3b 0a 20 20 2f 2a 20 69  e(&time);.  /* i
2f3e0 66 20 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69  f SystemTimeToFi
2f3f0 6c 65 54 69 6d 65 28 29 20 66 61 69 6c 73 2c 20  leTime() fails, 
2f400 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e  it returns zero.
2f410 20 2a 2f 0a 20 20 69 66 20 28 21 6f 73 53 79 73   */.  if (!osSys
2f420 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d  temTimeToFileTim
2f430 65 28 26 74 69 6d 65 2c 26 66 74 29 29 7b 0a 20  e(&time,&ft)){. 
2f440 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2f450 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6c 73  _ERROR;.  }.#els
2f460 65 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54  e.  osGetSystemT
2f470 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 28 20 26  imeAsFileTime( &
2f480 66 74 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ft );.#endif..  
2f490 2a 70 69 4e 6f 77 20 3d 20 77 69 6e 46 69 6c 65  *piNow = winFile
2f4a0 74 69 6d 65 45 70 6f 63 68 20 2b 0a 20 20 20 20  timeEpoch +.    
2f4b0 20 20 20 20 20 20 20 20 28 28 28 28 73 71 6c 69          ((((sqli
2f4c0 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 48  te3_int64)ft.dwH
2f4d0 69 67 68 44 61 74 65 54 69 6d 65 29 2a 6d 61 78  ighDateTime)*max
2f4e0 33 32 42 69 74 56 61 6c 75 65 29 20 2b 0a 20 20  32BitValue) +.  
2f4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
2f500 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64  lite3_int64)ft.d
2f510 77 4c 6f 77 44 61 74 65 54 69 6d 65 29 2f 28 73  wLowDateTime)/(s
2f520 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 31 30 30  qlite3_int64)100
2f530 30 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  00;..#ifdef SQLI
2f540 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71  TE_TEST.  if( sq
2f550 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
2f560 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77  me ){.    *piNow
2f570 20 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33   = 1000*(sqlite3
2f580 5f 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63  _int64)sqlite3_c
2f590 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e  urrent_time + un
2f5a0 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e  ixEpoch;.  }.#en
2f5b0 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  dif.  UNUSED_PAR
2f5c0 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
2f5d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2f5e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
2f5f0 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
2f600 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43   (in Universal C
2f610 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29  oordinated Time)
2f620 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20  .  Write the.** 
2f630 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64  current time and
2f640 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61   date as a Julia
2f650 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74  n Day number int
2f660 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20  o *prNow and.** 
2f670 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72  return 0.  Retur
2f680 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 20  n 1 if the time 
2f690 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20  and date cannot 
2f6a0 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  be found..*/.sta
2f6b0 74 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65  tic int winCurre
2f6c0 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76  ntTime(sqlite3_v
2f6d0 66 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65  fs *pVfs, double
2f6e0 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 69 6e 74 20   *prNow){.  int 
2f6f0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  rc;.  sqlite3_in
2f700 74 36 34 20 69 3b 0a 20 20 72 63 20 3d 20 77 69  t64 i;.  rc = wi
2f710 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  nCurrentTimeInt6
2f720 34 28 70 56 66 73 2c 20 26 69 29 3b 0a 20 20 69  4(pVfs, &i);.  i
2f730 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 2a 70  f( !rc ){.    *p
2f740 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30  rNow = i/8640000
2f750 30 2e 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  0.0;.  }.  retur
2f760 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
2f770 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20  he idea is that 
2f780 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f  this function wo
2f790 72 6b 73 20 6c 69 6b 65 20 61 20 63 6f 6d 62 69  rks like a combi
2f7a0 6e 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 47 65 74  nation of.** Get
2f7b0 4c 61 73 74 45 72 72 6f 72 28 29 20 61 6e 64 20  LastError() and 
2f7c0 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 28 29 20  FormatMessage() 
2f7d0 6f 6e 20 57 69 6e 64 6f 77 73 20 28 6f 72 20 65  on Windows (or e
2f7e0 72 72 6e 6f 20 61 6e 64 0a 2a 2a 20 73 74 72 65  rrno and.** stre
2f7f0 72 72 6f 72 5f 72 28 29 20 6f 6e 20 55 6e 69 78  rror_r() on Unix
2f800 29 2e 20 41 66 74 65 72 20 61 6e 20 65 72 72 6f  ). After an erro
2f810 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79  r is returned by
2f820 20 61 6e 20 4f 53 0a 2a 2a 20 66 75 6e 63 74 69   an OS.** functi
2f830 6f 6e 2c 20 53 51 4c 69 74 65 20 63 61 6c 6c 73  on, SQLite calls
2f840 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
2f850 69 74 68 20 7a 42 75 66 20 70 6f 69 6e 74 69 6e  ith zBuf pointin
2f860 67 20 74 6f 0a 2a 2a 20 61 20 62 75 66 66 65 72  g to.** a buffer
2f870 20 6f 66 20 6e 42 75 66 20 62 79 74 65 73 2e 20   of nBuf bytes. 
2f880 54 68 65 20 4f 53 20 6c 61 79 65 72 20 73 68 6f  The OS layer sho
2f890 75 6c 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65  uld populate the
2f8a0 0a 2a 2a 20 62 75 66 66 65 72 20 77 69 74 68 20  .** buffer with 
2f8b0 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  a nul-terminated
2f8c0 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 65   UTF-8 encoded e
2f8d0 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20  rror message.** 
2f8e0 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 6c  describing the l
2f8f0 61 73 74 20 49 4f 20 65 72 72 6f 72 20 74 6f 20  ast IO error to 
2f900 68 61 76 65 20 6f 63 63 75 72 72 65 64 20 77 69  have occurred wi
2f910 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67  thin the calling
2f920 0a 2a 2a 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a  .** thread..**.*
2f930 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6d  * If the error m
2f940 65 73 73 61 67 65 20 69 73 20 74 6f 6f 20 6c 61  essage is too la
2f950 72 67 65 20 66 6f 72 20 74 68 65 20 73 75 70 70  rge for the supp
2f960 6c 69 65 64 20 62 75 66 66 65 72 2c 0a 2a 2a 20  lied buffer,.** 
2f970 69 74 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75  it should be tru
2f980 6e 63 61 74 65 64 2e 20 54 68 65 20 72 65 74 75  ncated. The retu
2f990 72 6e 20 76 61 6c 75 65 20 6f 66 20 78 47 65 74  rn value of xGet
2f9a0 4c 61 73 74 45 72 72 6f 72 0a 2a 2a 20 69 73 20  LastError.** is 
2f9b0 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f  zero if the erro
2f9c0 72 20 6d 65 73 73 61 67 65 20 66 69 74 73 20 69  r message fits i
2f9d0 6e 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f 72  n the buffer, or
2f9e0 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68   non-zero.** oth
2f9f0 65 72 77 69 73 65 20 28 69 66 20 74 68 65 20 6d  erwise (if the m
2fa00 65 73 73 61 67 65 20 77 61 73 20 74 72 75 6e 63  essage was trunc
2fa10 61 74 65 64 29 2e 20 49 66 20 6e 6f 6e 2d 7a 65  ated). If non-ze
2fa20 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a  ro is returned,.
2fa30 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f  ** then it is no
2fa40 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 69  t necessary to i
2fa50 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 2d 74  nclude the nul-t
2fa60 65 72 6d 69 6e 61 74 6f 72 20 63 68 61 72 61 63  erminator charac
2fa70 74 65 72 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 75  ter.** in the ou
2fa80 74 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  tput buffer..**.
2fa90 2a 2a 20 4e 6f 74 20 73 75 70 70 6c 79 69 6e 67  ** Not supplying
2faa0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2fab0 65 20 77 69 6c 6c 20 68 61 76 65 20 6e 6f 20 61  e will have no a
2fac0 64 76 65 72 73 65 20 65 66 66 65 63 74 0a 2a 2a  dverse effect.**
2fad0 20 6f 6e 20 53 51 4c 69 74 65 2e 20 49 74 20 69   on SQLite. It i
2fae0 73 20 66 69 6e 65 20 74 6f 20 68 61 76 65 20 61  s fine to have a
2faf0 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  n implementation
2fb00 20 74 68 61 74 20 6e 65 76 65 72 0a 2a 2a 20 72   that never.** r
2fb10 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
2fb20 6d 65 73 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20  message:.**.**  
2fb30 20 69 6e 74 20 78 47 65 74 4c 61 73 74 45 72 72   int xGetLastErr
2fb40 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
2fb50 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20  pVfs, int nBuf, 
2fb60 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 2a 2a 20  char *zBuf){.** 
2fb70 20 20 20 20 61 73 73 65 72 74 28 7a 42 75 66 5b      assert(zBuf[
2fb80 30 5d 3d 3d 27 5c 30 27 29 3b 0a 2a 2a 20 20 20  0]=='\0');.**   
2fb90 20 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 20 20    return 0;.**  
2fba0 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72   }.**.** However
2fbb0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6d 65 73   if an error mes
2fbc0 73 61 67 65 20 69 73 20 73 75 70 70 6c 69 65 64  sage is supplied
2fbd0 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 69 6e 63  , it will be inc
2fbe0 6f 72 70 6f 72 61 74 65 64 0a 2a 2a 20 62 79 20  orporated.** by 
2fbf0 73 71 6c 69 74 65 20 69 6e 74 6f 20 74 68 65 20  sqlite into the 
2fc00 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 76  error message av
2fc10 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75  ailable to the u
2fc20 73 65 72 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c  ser using.** sql
2fc30 69 74 65 33 5f 65 72 72 6d 73 67 28 29 2c 20 70  ite3_errmsg(), p
2fc40 6f 73 73 69 62 6c 79 20 6d 61 6b 69 6e 67 20 49  ossibly making I
2fc50 4f 20 65 72 72 6f 72 73 20 65 61 73 69 65 72 20  O errors easier 
2fc60 74 6f 20 64 65 62 75 67 2e 0a 2a 2f 0a 73 74 61  to debug..*/.sta
2fc70 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 4c 61  tic int winGetLa
2fc80 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  stError(sqlite3_
2fc90 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e  vfs *pVfs, int n
2fca0 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
2fcb0 7b 0a 20 20 44 57 4f 52 44 20 65 20 3d 20 6f 73  {.  DWORD e = os
2fcc0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
2fcd0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2fce0 45 52 28 70 56 66 73 29 3b 0a 20 20 69 66 28 20  ER(pVfs);.  if( 
2fcf0 6e 42 75 66 3e 30 20 29 20 77 69 6e 47 65 74 4c  nBuf>0 ) winGetL
2fd00 61 73 74 45 72 72 6f 72 4d 73 67 28 65 2c 20 6e  astErrorMsg(e, n
2fd10 42 75 66 2c 20 7a 42 75 66 29 3b 0a 20 20 72 65  Buf, zBuf);.  re
2fd20 74 75 72 6e 20 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn e;.}../*.**
2fd30 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20   Initialize and 
2fd40 64 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  deinitialize the
2fd50 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
2fd60 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  m interface..*/.
2fd70 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69  int sqlite3_os_i
2fd80 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  nit(void){.  sta
2fd90 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20  tic sqlite3_vfs 
2fda0 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20 20 20 33  winVfs = {.    3
2fdb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2fdc0 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
2fdd0 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28  n */.    sizeof(
2fde0 77 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 20 20  winFile),       
2fdf0 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20  /* szOsFile */. 
2fe00 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f     SQLITE_WIN32_
2fe10 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53 2c 20  MAX_PATH_BYTES, 
2fe20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f  /* mxPathname */
2fe30 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
2fe40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
2fe50 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e  Next */.    "win
2fe60 33 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  32",            
2fe70 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20     /* zName */. 
2fe80 20 20 20 26 77 69 6e 41 70 70 44 61 74 61 2c 20     &winAppData, 
2fe90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70            /* pAp
2fea0 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e  pData */.    win
2feb0 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
2fec0 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a      /* xOpen */.
2fed0 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20      winDelete,  
2fee0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
2fef0 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e  elete */.    win
2ff00 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20  Access,         
2ff10 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a      /* xAccess *
2ff20 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74  /.    winFullPat
2ff30 68 6e 61 6d 65 2c 20 20 20 20 20 20 20 2f 2a 20  hname,       /* 
2ff40 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f  xFullPathname */
2ff50 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20  .    winDlOpen, 
2ff60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2ff70 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69  DlOpen */.    wi
2ff80 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20  nDlError,       
2ff90 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72       /* xDlError
2ffa0 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d   */.    winDlSym
2ffb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2ffc0 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20  * xDlSym */.    
2ffd0 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20  winDlClose,     
2ffe0 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f         /* xDlClo
2fff0 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e  se */.    winRan
30000 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 20  domness,        
30010 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20   /* xRandomness 
30020 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65 70 2c  */.    winSleep,
30030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30040 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77   xSleep */.    w
30050 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20  inCurrentTime,  
30060 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e        /* xCurren
30070 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e  tTime */.    win
30080 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20  GetLastError,   
30090 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45      /* xGetLastE
300a0 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43  rror */.    winC
300b0 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c  urrentTimeInt64,
300c0 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69     /* xCurrentTi
300d0 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77  meInt64 */.    w
300e0 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c  inSetSystemCall,
300f0 20 20 20 20 20 20 2f 2a 20 78 53 65 74 53 79 73        /* xSetSys
30100 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77  temCall */.    w
30110 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c  inGetSystemCall,
30120 20 20 20 20 20 20 2f 2a 20 78 47 65 74 53 79 73        /* xGetSys
30130 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77  temCall */.    w
30140 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c  inNextSystemCall
30150 2c 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 53 79  ,     /* xNextSy
30160 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b  stemCall */.  };
30170 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
30180 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
30190 44 45 29 0a 20 20 73 74 61 74 69 63 20 73 71 6c  DE).  static sql
301a0 69 74 65 33 5f 76 66 73 20 77 69 6e 4c 6f 6e 67  ite3_vfs winLong
301b0 50 61 74 68 56 66 73 20 3d 20 7b 0a 20 20 20 20  PathVfs = {.    
301c0 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3,              
301d0 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
301e0 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66  on */.    sizeof
301f0 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 20  (winFile),      
30200 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a   /* szOsFile */.
30210 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54      SQLITE_WINNT
30220 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53 2c  _MAX_PATH_BYTES,
30230 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a   /* mxPathname *
30240 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
30250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30260 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 77 69  pNext */.    "wi
30270 6e 33 32 2d 6c 6f 6e 67 70 61 74 68 22 2c 20 20  n32-longpath",  
30280 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a      /* zName */.
30290 20 20 20 20 26 77 69 6e 41 70 70 44 61 74 61 2c      &winAppData,
302a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41             /* pA
302b0 70 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69  ppData */.    wi
302c0 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  nOpen,          
302d0 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f       /* xOpen */
302e0 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20  .    winDelete, 
302f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
30300 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69  Delete */.    wi
30310 6e 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20  nAccess,        
30320 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20       /* xAccess 
30330 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 61  */.    winFullPa
30340 74 68 6e 61 6d 65 2c 20 20 20 20 20 20 20 2f 2a  thname,       /*
30350 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a   xFullPathname *
30360 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c  /.    winDlOpen,
30370 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30380 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77  xDlOpen */.    w
30390 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20  inDlError,      
303a0 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f        /* xDlErro
303b0 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79  r */.    winDlSy
303c0 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
303d0 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20  /* xDlSym */.   
303e0 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20   winDlClose,    
303f0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c          /* xDlCl
30400 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61  ose */.    winRa
30410 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20  ndomness,       
30420 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73    /* xRandomness
30430 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65 70   */.    winSleep
30440 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
30450 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20  * xSleep */.    
30460 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20  winCurrentTime, 
30470 20 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65         /* xCurre
30480 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69  ntTime */.    wi
30490 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20  nGetLastError,  
304a0 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74       /* xGetLast
304b0 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e  Error */.    win
304c0 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
304d0 2c 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54  ,   /* xCurrentT
304e0 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20  imeInt64 */.    
304f0 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  winSetSystemCall
30500 2c 20 20 20 20 20 20 2f 2a 20 78 53 65 74 53 79  ,      /* xSetSy
30510 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20  stemCall */.    
30520 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c  winGetSystemCall
30530 2c 20 20 20 20 20 20 2f 2a 20 78 47 65 74 53 79  ,      /* xGetSy
30540 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20  stemCall */.    
30550 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  winNextSystemCal
30560 6c 2c 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 53  l,     /* xNextS
30570 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d  ystemCall */.  }
30580 3b 0a 23 65 6e 64 69 66 0a 20 20 73 74 61 74 69  ;.#endif.  stati
30590 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69  c sqlite3_vfs wi
305a0 6e 4e 6f 6c 6f 63 6b 56 66 73 20 3d 20 7b 0a 20  nNolockVfs = {. 
305b0 20 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20     3,           
305c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
305d0 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a  rsion */.    siz
305e0 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20 20  eof(winFile),   
305f0 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20      /* szOsFile 
30600 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f 57 49  */.    SQLITE_WI
30610 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54  N32_MAX_PATH_BYT
30620 45 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d  ES, /* mxPathnam
30630 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
30640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30650 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20  /* pNext */.    
30660 22 77 69 6e 33 32 2d 6e 6f 6e 65 22 2c 20 20 20  "win32-none",   
30670 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20         /* zName 
30680 2a 2f 0a 20 20 20 20 26 77 69 6e 4e 6f 6c 6f 63  */.    &winNoloc
30690 6b 41 70 70 44 61 74 61 2c 20 20 20 20 20 2f 2a  kAppData,     /*
306a0 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20   pAppData */.   
306b0 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20   winOpen,       
306c0 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e          /* xOpen
306d0 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74   */.    winDelet
306e0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
306f0 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20  * xDelete */.   
30700 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20 20   winAccess,     
30710 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65          /* xAcce
30720 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c  ss */.    winFul
30730 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 20  lPathname,      
30740 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d   /* xFullPathnam
30750 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70  e */.    winDlOp
30760 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
30770 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20  /* xDlOpen */.  
30780 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20    winDlError,   
30790 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45           /* xDlE
307a0 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44  rror */.    winD
307b0 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20  lSym,           
307c0 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a     /* xDlSym */.
307d0 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20      winDlClose, 
307e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
307f0 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69  lClose */.    wi
30800 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20  nRandomness,    
30810 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e       /* xRandomn
30820 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c  ess */.    winSl
30830 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eep,            
30840 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20    /* xSleep */. 
30850 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d     winCurrentTim
30860 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 43 75  e,        /* xCu
30870 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20  rrentTime */.   
30880 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
30890 2c 20 20 20 20 20 20 20 2f 2a 20 78 47 65 74 4c  ,       /* xGetL
308a0 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20  astError */.    
308b0 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  winCurrentTimeIn
308c0 74 36 34 2c 20 20 20 2f 2a 20 78 43 75 72 72 65  t64,   /* xCurre
308d0 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20  ntTimeInt64 */. 
308e0 20 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43     winSetSystemC
308f0 61 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 78 53 65  all,      /* xSe
30900 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20  tSystemCall */. 
30910 20 20 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43     winGetSystemC
30920 61 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 78 47 65  all,      /* xGe
30930 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20  tSystemCall */. 
30940 20 20 20 77 69 6e 4e 65 78 74 53 79 73 74 65 6d     winNextSystem
30950 43 61 6c 6c 2c 20 20 20 20 20 2f 2a 20 78 4e 65  Call,     /* xNe
30960 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a  xtSystemCall */.
30970 20 20 7d 3b 0a 23 69 66 20 64 65 66 69 6e 65 64    };.#if defined
30980 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
30990 53 5f 57 49 44 45 29 0a 20 20 73 74 61 74 69 63  S_WIDE).  static
309a0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e   sqlite3_vfs win
309b0 4c 6f 6e 67 50 61 74 68 4e 6f 6c 6f 63 6b 56 66  LongPathNolockVf
309c0 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20 20  s = {.    3,    
309d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
309e0 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
309f0 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46 69      sizeof(winFi
30a00 6c 65 29 2c 20 20 20 20 20 20 20 2f 2a 20 73 7a  le),       /* sz
30a10 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 53 51  OsFile */.    SQ
30a20 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50  LITE_WINNT_MAX_P
30a30 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a 20 6d 78  ATH_BYTES, /* mx
30a40 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  Pathname */.    
30a50 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
30a60 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20         /* pNext 
30a70 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 2d 6c 6f  */.    "win32-lo
30a80 6e 67 70 61 74 68 2d 6e 6f 6e 65 22 2c 20 2f 2a  ngpath-none", /*
30a90 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 26 77   zName */.    &w
30aa0 69 6e 4e 6f 6c 6f 63 6b 41 70 70 44 61 74 61 2c  inNolockAppData,
30ab0 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61       /* pAppData
30ac0 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c   */.    winOpen,
30ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30ae0 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77  * xOpen */.    w
30af0 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20  inDelete,       
30b00 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65        /* xDelete
30b10 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73   */.    winAcces
30b20 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
30b30 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20  * xAccess */.   
30b40 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65   winFullPathname
30b50 2c 20 20 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c  ,       /* xFull
30b60 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  Pathname */.    
30b70 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20  winDlOpen,      
30b80 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65         /* xDlOpe
30b90 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72  n */.    winDlEr
30ba0 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ror,            
30bb0 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20  /* xDlError */. 
30bc0 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20     winDlSym,    
30bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
30be0 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  Sym */.    winDl
30bf0 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
30c00 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f    /* xDlClose */
30c10 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65  .    winRandomne
30c20 73 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ss,         /* x
30c30 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20  Randomness */.  
30c40 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20 20    winSleep,     
30c50 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65           /* xSle
30c60 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72  ep */.    winCur
30c70 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 20  rentTime,       
30c80 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65   /* xCurrentTime
30c90 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61   */.    winGetLa
30ca0 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f  stError,       /
30cb0 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20  * xGetLastError 
30cc0 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e  */.    winCurren
30cd0 74 54 69 6d 65 49 6e 74 36 34 2c 20 20 20 2f 2a  tTimeInt64,   /*
30ce0 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74   xCurrentTimeInt
30cf0 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74  64 */.    winSet
30d00 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 20  SystemCall,     
30d10 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d 43 61   /* xSetSystemCa
30d20 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74  ll */.    winGet
30d30 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 20  SystemCall,     
30d40 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61   /* xGetSystemCa
30d50 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78  ll */.    winNex
30d60 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20  tSystemCall,    
30d70 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43   /* xNextSystemC
30d80 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 65 6e 64  all */.  };.#end
30d90 69 66 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c 65 2d  if..  /* Double-
30da0 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61  check that the a
30db0 53 79 73 63 61 6c 6c 5b 5d 20 61 72 72 61 79 20  Syscall[] array 
30dc0 68 61 73 20 62 65 65 6e 20 63 6f 6e 73 74 72 75  has been constru
30dd0 63 74 65 64 0a 20 20 2a 2a 20 63 6f 72 72 65 63  cted.  ** correc
30de0 74 6c 79 2e 20 20 53 65 65 20 74 69 63 6b 65 74  tly.  See ticket
30df0 20 5b 62 62 33 61 38 36 65 38 39 30 63 38 65 39   [bb3a86e890c8e9
30e00 36 61 62 5d 20 2a 2f 0a 20 20 61 73 73 65 72 74  6ab] */.  assert
30e10 28 20 41 72 72 61 79 53 69 7a 65 28 61 53 79 73  ( ArraySize(aSys
30e20 63 61 6c 6c 29 3d 3d 38 33 20 29 3b 0a 0a 20 20  call)==83 );..  
30e30 2f 2a 20 67 65 74 20 6d 65 6d 6f 72 79 20 6d 61  /* get memory ma
30e40 70 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 67 72 61  p allocation gra
30e50 6e 75 6c 61 72 69 74 79 20 2a 2f 0a 20 20 6d 65  nularity */.  me
30e60 6d 73 65 74 28 26 77 69 6e 53 79 73 49 6e 66 6f  mset(&winSysInfo
30e70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 59 53 54  , 0, sizeof(SYST
30e80 45 4d 5f 49 4e 46 4f 29 29 3b 0a 23 69 66 20 53  EM_INFO));.#if S
30e90 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
30ea0 20 6f 73 47 65 74 4e 61 74 69 76 65 53 79 73 74   osGetNativeSyst
30eb0 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e  emInfo(&winSysIn
30ec0 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 47  fo);.#else.  osG
30ed0 65 74 53 79 73 74 65 6d 49 6e 66 6f 28 26 77 69  etSystemInfo(&wi
30ee0 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 65 6e 64 69  nSysInfo);.#endi
30ef0 66 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e 53  f.  assert( winS
30f00 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74  ysInfo.dwAllocat
30f10 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3e 30  ionGranularity>0
30f20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69   );.  assert( wi
30f30 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53  nSysInfo.dwPageS
30f40 69 7a 65 3e 30 20 29 3b 0a 0a 20 20 73 71 6c 69  ize>0 );..  sqli
30f50 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
30f60 28 26 77 69 6e 56 66 73 2c 20 31 29 3b 0a 0a 23  (&winVfs, 1);..#
30f70 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
30f80 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
30f90 29 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ).  sqlite3_vfs_
30fa0 72 65 67 69 73 74 65 72 28 26 77 69 6e 4c 6f 6e  register(&winLon
30fb0 67 50 61 74 68 56 66 73 2c 20 30 29 3b 0a 23 65  gPathVfs, 0);.#e
30fc0 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ndif..  sqlite3_
30fd0 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 77 69  vfs_register(&wi
30fe0 6e 4e 6f 6c 6f 63 6b 56 66 73 2c 20 30 29 3b 0a  nNolockVfs, 0);.
30ff0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
31000 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
31010 44 45 29 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  DE).  sqlite3_vf
31020 73 5f 72 65 67 69 73 74 65 72 28 26 77 69 6e 4c  s_register(&winL
31030 6f 6e 67 50 61 74 68 4e 6f 6c 6f 63 6b 56 66 73  ongPathNolockVfs
31040 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  , 0);.#endif..  
31050 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
31060 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.}..int sqlite3
31070 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 0a 23  _os_end(void){.#
31080 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
31090 52 54 0a 20 20 69 66 28 20 73 6c 65 65 70 4f 62  RT.  if( sleepOb
310a0 6a 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 6f  j!=NULL ){.    o
310b0 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 73 6c 65  sCloseHandle(sle
310c0 65 70 4f 62 6a 29 3b 0a 20 20 20 20 73 6c 65 65  epObj);.    slee
310d0 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  pObj = NULL;.  }
310e0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
310f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
31100 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
31110 4f 53 5f 57 49 4e 20 2a 2f 0a                    OS_WIN */.