/ Hex Artifact Content
Login

Artifact 9fbb3876ef282302ef6df6471900f283f3e4b13b:


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 23 65 6c 73 65 0a 73 74 61 74 69  = 0;.#else.stati
3960: 63 20 4c 4f 4e 47 20 53 51 4c 49 54 45 5f 57 49  c LONG SQLITE_WI
3970: 4e 33 32 5f 56 4f 4c 41 54 49 4c 45 20 73 71 6c  N32_VOLATILE sql
3980: 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30  ite3_os_type = 0
3990: 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ;.#endif..#ifnde
39a0: 66 20 53 59 53 43 41 4c 4c 0a 23 20 20 64 65 66  f SYSCALL.#  def
39b0: 69 6e 65 20 53 59 53 43 41 4c 4c 20 73 71 6c 69  ine SYSCALL sqli
39c0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 0a  te3_syscall_ptr.
39d0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
39e0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e  is function is n
39f0: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ot available on 
3a00: 57 69 6e 64 6f 77 73 20 43 45 20 6f 72 20 57 69  Windows CE or Wi
3a10: 6e 52 54 2e 0a 20 2a 2f 0a 0a 23 69 66 20 53 51  nRT.. */..#if SQ
3a20: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c  LITE_OS_WINCE ||
3a30: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
3a40: 0a 23 20 20 64 65 66 69 6e 65 20 6f 73 41 72 65  .#  define osAre
3a50: 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 20  FileApisANSI()  
3a60: 20 20 20 20 20 31 0a 23 65 6e 64 69 66 0a 0a 2f       1.#endif../
3a70: 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d  *.** Many system
3a80: 20 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73   calls are acces
3a90: 73 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e  sed through poin
3aa0: 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73  ter-to-functions
3ab0: 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79   so that.** they
3ac0: 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64 64   may be overridd
3ad0: 65 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f  en at runtime to
3ae0: 20 66 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c   facilitate faul
3af0: 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69  t injection duri
3b00: 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  ng.** testing an
3b10: 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54  d sandboxing.  T
3b20: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72  he following arr
3b30: 61 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d  ay holds the nam
3b40: 65 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a  es and pointers.
3b50: 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69  ** to all overri
3b60: 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61  deable system ca
3b70: 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  lls..*/.static s
3b80: 74 72 75 63 74 20 77 69 6e 5f 73 79 73 63 61 6c  truct win_syscal
3b90: 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  l {.  const char
3ba0: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *zName;        
3bb0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
3bc0: 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a  he system call *
3bd0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63  /.  sqlite3_sysc
3be0: 61 6c 6c 5f 70 74 72 20 70 43 75 72 72 65 6e 74  all_ptr pCurrent
3bf0: 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 61 6c  ; /* Current val
3c00: 75 65 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d  ue of the system
3c10: 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74   call */.  sqlit
3c20: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70  e3_syscall_ptr p
3c30: 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61  Default; /* Defa
3c40: 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61  ult value */.} a
3c50: 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 23 69  Syscall[] = {.#i
3c60: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
3c70: 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53  CE && !SQLITE_OS
3c80: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 41 72 65 46  _WINRT.  { "AreF
3c90: 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20 20 20  ileApisANSI",   
3ca0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 41        (SYSCALL)A
3cb0: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 2c 20  reFileApisANSI, 
3cc0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
3cd0: 73 65 0a 20 20 7b 20 22 41 72 65 46 69 6c 65 41  se.  { "AreFileA
3ce0: 70 69 73 41 4e 53 49 22 2c 20 20 20 20 20 20 20  pisANSI",       
3cf0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
3d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d10: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
3d20: 0a 23 69 66 6e 64 65 66 20 6f 73 41 72 65 46 69  .#ifndef osAreFi
3d30: 6c 65 41 70 69 73 41 4e 53 49 0a 23 64 65 66 69  leApisANSI.#defi
3d40: 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73  ne osAreFileApis
3d50: 41 4e 53 49 20 28 28 42 4f 4f 4c 28 57 49 4e 41  ANSI ((BOOL(WINA
3d60: 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63  PI*)(VOID))aSysc
3d70: 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29  all[0].pCurrent)
3d80: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
3d90: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
3da0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
3db0: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
3dc0: 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57 22 2c   { "CharLowerW",
3dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
3de0: 59 53 43 41 4c 4c 29 43 68 61 72 4c 6f 77 65 72  YSCALL)CharLower
3df0: 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  W,              
3e00: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3e10: 43 68 61 72 4c 6f 77 65 72 57 22 2c 20 20 20 20  CharLowerW",    
3e20: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3e30: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3e40: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3e50: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
3e60: 20 6f 73 43 68 61 72 4c 6f 77 65 72 57 20 28 28   osCharLowerW ((
3e70: 4c 50 57 53 54 52 28 57 49 4e 41 50 49 2a 29 28  LPWSTR(WINAPI*)(
3e80: 4c 50 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPWSTR))aSyscall
3e90: 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [1].pCurrent)..#
3ea0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
3eb0: 43 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  CE && defined(SQ
3ec0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
3ed0: 49 44 45 29 0a 20 20 7b 20 22 43 68 61 72 55 70  IDE).  { "CharUp
3ee0: 70 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20  perW",          
3ef0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 68 61      (SYSCALL)Cha
3f00: 72 55 70 70 65 72 57 2c 20 20 20 20 20 20 20 20  rUpperW,        
3f10: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
3f20: 0a 20 20 7b 20 22 43 68 61 72 55 70 70 65 72 57  .  { "CharUpperW
3f30: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
3f40: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
3f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f60: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
3f70: 64 65 66 69 6e 65 20 6f 73 43 68 61 72 55 70 70  define osCharUpp
3f80: 65 72 57 20 28 28 4c 50 57 53 54 52 28 57 49 4e  erW ((LPWSTR(WIN
3f90: 41 50 49 2a 29 28 4c 50 57 53 54 52 29 29 61 53  API*)(LPWSTR))aS
3fa0: 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65  yscall[2].pCurre
3fb0: 6e 74 29 0a 0a 20 20 7b 20 22 43 6c 6f 73 65 48  nt)..  { "CloseH
3fc0: 61 6e 64 6c 65 22 2c 20 20 20 20 20 20 20 20 20  andle",         
3fd0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 6c 6f      (SYSCALL)Clo
3fe0: 73 65 48 61 6e 64 6c 65 2c 20 20 20 20 20 20 20  seHandle,       
3ff0: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
4000: 69 6e 65 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c  ine osCloseHandl
4010: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
4020: 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61  )(HANDLE))aSysca
4030: 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[3].pCurrent).
4040: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
4050: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
4060: 53 49 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46  SI).  { "CreateF
4070: 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20 20  ileA",          
4080: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61     (SYSCALL)Crea
4090: 74 65 46 69 6c 65 41 2c 20 20 20 20 20 20 20 20  teFileA,        
40a0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
40b0: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 41    { "CreateFileA
40c0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
40d0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
40e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40f0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4100: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69  efine osCreateFi
4110: 6c 65 41 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  leA ((HANDLE(WIN
4120: 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f  API*)(LPCSTR,DWO
4130: 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  RD,DWORD, \.    
4140: 20 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41      LPSECURITY_A
4150: 54 54 52 49 42 55 54 45 53 2c 44 57 4f 52 44 2c  TTRIBUTES,DWORD,
4160: 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61 53  DWORD,HANDLE))aS
4170: 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65  yscall[4].pCurre
4180: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
4190: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
41a0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
41b0: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
41c0: 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c 20 20  "CreateFileW",  
41d0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
41e0: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 57 2c  ALL)CreateFileW,
41f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4200: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
4210: 61 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20  ateFileW",      
4220: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4230: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4240: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4250: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
4260: 43 72 65 61 74 65 46 69 6c 65 57 20 28 28 48 41  CreateFileW ((HA
4270: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  NDLE(WINAPI*)(LP
4280: 43 57 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52  CWSTR,DWORD,DWOR
4290: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53  D, \.        LPS
42a0: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
42b0: 45 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48  ES,DWORD,DWORD,H
42c0: 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ANDLE))aSyscall[
42d0: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  5].pCurrent)..#i
42e0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
42f0: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
4300: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
4310: 4e 53 49 29 20 26 26 20 5c 0a 20 20 20 20 20 20  NSI) && \.      
4320: 20 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c 49    (!defined(SQLI
4330: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20  TE_OMIT_WAL) || 
4340: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
4350: 53 49 5a 45 3e 30 29 20 26 26 20 5c 0a 20 20 20  SIZE>0) && \.   
4360: 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33       SQLITE_WIN3
4370: 32 5f 43 52 45 41 54 45 46 49 4c 45 4d 41 50 50  2_CREATEFILEMAPP
4380: 49 4e 47 41 0a 20 20 7b 20 22 43 72 65 61 74 65  INGA.  { "Create
4390: 46 69 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20 20  FileMappingA",  
43a0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
43b0: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 2c  ateFileMappingA,
43c0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
43d0: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
43e0: 4d 61 70 70 69 6e 67 41 22 2c 20 20 20 20 20 20  MappingA",      
43f0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
4400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4410: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
4420: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46  define osCreateF
4430: 69 6c 65 4d 61 70 70 69 6e 67 41 20 28 28 48 41  ileMappingA ((HA
4440: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41  NDLE(WINAPI*)(HA
4450: 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49 54 59 5f  NDLE,LPSECURITY_
4460: 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20  ATTRIBUTES, \.  
4470: 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52        DWORD,DWOR
4480: 44 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52 29 29  D,DWORD,LPCSTR))
4490: 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72  aSyscall[6].pCur
44a0: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
44b0: 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21  E_OS_WINCE || (!
44c0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
44d0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
44e0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
44f0: 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 28  ) && \.        (
4500: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
4510: 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c  OMIT_WAL) || SQL
4520: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
4530: 45 3e 30 29 29 0a 20 20 7b 20 22 43 72 65 61 74  E>0)).  { "Creat
4540: 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20  eFileMappingW", 
4550: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
4560: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
4570: 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  ,      0 },.#els
4580: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  e.  { "CreateFil
4590: 65 4d 61 70 70 69 6e 67 57 22 2c 20 20 20 20 20  eMappingW",     
45a0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
45b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45c0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
45d0: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
45e0: 46 69 6c 65 4d 61 70 70 69 6e 67 57 20 28 28 48  FileMappingW ((H
45f0: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48  ANDLE(WINAPI*)(H
4600: 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49 54 59  ANDLE,LPSECURITY
4610: 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20  _ATTRIBUTES, \. 
4620: 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f         DWORD,DWO
4630: 52 44 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54 52  RD,DWORD,LPCWSTR
4640: 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43  ))aSyscall[7].pC
4650: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
4660: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
4670: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4680: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
4690: 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65 78    { "CreateMutex
46a0: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  W",            (
46b0: 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 4d 75  SYSCALL)CreateMu
46c0: 74 65 78 57 2c 20 20 20 20 20 20 20 20 20 20 20  texW,           
46d0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
46e0: 22 43 72 65 61 74 65 4d 75 74 65 78 57 22 2c 20  "CreateMutexW", 
46f0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4700: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4710: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4720: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4730: 65 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57  e osCreateMutexW
4740: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
4750: 2a 29 28 4c 50 53 45 43 55 52 49 54 59 5f 41 54  *)(LPSECURITY_AT
4760: 54 52 49 42 55 54 45 53 2c 42 4f 4f 4c 2c 20 5c  TRIBUTES,BOOL, \
4770: 0a 20 20 20 20 20 20 20 20 4c 50 43 57 53 54 52  .        LPCWSTR
4780: 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43  ))aSyscall[8].pC
4790: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
47a0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
47b0: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
47c0: 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20 20  "DeleteFileA",  
47d0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
47e0: 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65 41 2c  ALL)DeleteFileA,
47f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4800: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44 65 6c  ,.#else.  { "Del
4810: 65 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20  eteFileA",      
4820: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4830: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4840: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4850: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
4860: 44 65 6c 65 74 65 46 69 6c 65 41 20 28 28 42 4f  DeleteFileA ((BO
4870: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53  OL(WINAPI*)(LPCS
4880: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e  TR))aSyscall[9].
4890: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
48a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
48b0: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
48c0: 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22 2c  { "DeleteFileW",
48d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
48e0: 53 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65  SCALL)DeleteFile
48f0: 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  W,             0
4900: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44   },.#else.  { "D
4910: 65 6c 65 74 65 46 69 6c 65 57 22 2c 20 20 20 20  eleteFileW",    
4920: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4930: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4940: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4950: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4960: 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 20 28 28  osDeleteFileW ((
4970: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50  BOOL(WINAPI*)(LP
4980: 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  CWSTR))aSyscall[
4990: 31 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  10].pCurrent)..#
49a0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
49b0: 43 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65  CE.  { "FileTime
49c0: 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22  ToLocalFileTime"
49d0: 2c 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54  , (SYSCALL)FileT
49e0: 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69  imeToLocalFileTi
49f0: 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20  me, 0 },.#else. 
4a00: 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 4c 6f   { "FileTimeToLo
4a10: 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20 28 53  calFileTime", (S
4a20: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a40: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4a50: 66 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54  fine osFileTimeT
4a60: 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 20 28  oLocalFileTime (
4a70: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43  (BOOL(WINAPI*)(C
4a80: 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20  ONST FILETIME*, 
4a90: 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45  \.        LPFILE
4aa0: 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 31  TIME))aSyscall[1
4ab0: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
4ac0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
4ad0: 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54  E.  { "FileTimeT
4ae0: 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20  oSystemTime",   
4af0: 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54 69   (SYSCALL)FileTi
4b00: 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 2c 20  meToSystemTime, 
4b10: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
4b20: 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 53 79 73  { "FileTimeToSys
4b30: 74 65 6d 54 69 6d 65 22 2c 20 20 20 20 28 53 59  temTime",    (SY
4b40: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4b60: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4b70: 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f  ine osFileTimeTo
4b80: 53 79 73 74 65 6d 54 69 6d 65 20 28 28 42 4f 4f  SystemTime ((BOO
4b90: 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54  L(WINAPI*)(CONST
4ba0: 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20 20   FILETIME*, \.  
4bb0: 20 20 20 20 20 20 4c 50 53 59 53 54 45 4d 54 49        LPSYSTEMTI
4bc0: 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 32 5d  ME))aSyscall[12]
4bd0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
4be0: 22 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72  "FlushFileBuffer
4bf0: 73 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43  s",        (SYSC
4c00: 41 4c 4c 29 46 6c 75 73 68 46 69 6c 65 42 75 66  ALL)FlushFileBuf
4c10: 66 65 72 73 2c 20 20 20 20 20 20 20 20 30 20 7d  fers,        0 }
4c20: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6c 75  ,..#define osFlu
4c30: 73 68 46 69 6c 65 42 75 66 66 65 72 73 20 28 28  shFileBuffers ((
4c40: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
4c50: 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31  NDLE))aSyscall[1
4c60: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  3].pCurrent)..#i
4c70: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
4c80: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
4c90: 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73  .  { "FormatMess
4ca0: 61 67 65 41 22 2c 20 20 20 20 20 20 20 20 20 20  ageA",          
4cb0: 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d  (SYSCALL)FormatM
4cc0: 65 73 73 61 67 65 41 2c 20 20 20 20 20 20 20 20  essageA,        
4cd0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4ce0: 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41   "FormatMessageA
4cf0: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
4d00: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4d20: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4d30: 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61  ne osFormatMessa
4d40: 67 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41  geA ((DWORD(WINA
4d50: 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f  PI*)(DWORD,LPCVO
4d60: 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c  ID,DWORD,DWORD,L
4d70: 50 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  PSTR, \.        
4d80: 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29  DWORD,va_list*))
4d90: 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75  aSyscall[14].pCu
4da0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
4db0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
4dc0: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
4dd0: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c  FormatMessageW",
4de0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4df0: 4c 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  LL)FormatMessage
4e00: 57 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  W,          0 },
4e10: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72 6d  .#else.  { "Form
4e20: 61 74 4d 65 73 73 61 67 65 57 22 2c 20 20 20 20  atMessageW",    
4e30: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4e40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4e50: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4e60: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46  dif..#define osF
4e70: 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 20 28 28  ormatMessageW ((
4e80: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44  DWORD(WINAPI*)(D
4e90: 57 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57 4f  WORD,LPCVOID,DWO
4ea0: 52 44 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52 2c  RD,DWORD,LPWSTR,
4eb0: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
4ec0: 2c 76 61 5f 6c 69 73 74 2a 29 29 61 53 79 73 63  ,va_list*))aSysc
4ed0: 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e 74  all[15].pCurrent
4ee0: 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  )..#if !defined(
4ef0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
4f00: 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20  _EXTENSION).  { 
4f10: 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c 20 20  "FreeLibrary",  
4f20: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4f30: 41 4c 4c 29 46 72 65 65 4c 69 62 72 61 72 79 2c  ALL)FreeLibrary,
4f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4f50: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 72 65  ,.#else.  { "Fre
4f60: 65 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 20  eLibrary",      
4f70: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4f80: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4f90: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4fa0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
4fb0: 46 72 65 65 4c 69 62 72 61 72 79 20 28 28 42 4f  FreeLibrary ((BO
4fc0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44  OL(WINAPI*)(HMOD
4fd0: 55 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 36  ULE))aSyscall[16
4fe0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
4ff0: 20 22 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63   "GetCurrentProc
5000: 65 73 73 49 64 22 2c 20 20 20 20 20 28 53 59 53  essId",     (SYS
5010: 43 41 4c 4c 29 47 65 74 43 75 72 72 65 6e 74 50  CALL)GetCurrentP
5020: 72 6f 63 65 73 73 49 64 2c 20 20 20 20 20 30 20  rocessId,     0 
5030: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  },..#define osGe
5040: 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
5050: 64 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  d ((DWORD(WINAPI
5060: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c  *)(VOID))aSyscal
5070: 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[17].pCurrent).
5080: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
5090: 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64  WINCE && defined
50a0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
50b0: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74  S_ANSI).  { "Get
50c0: 44 69 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c  DiskFreeSpaceA",
50d0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
50e0: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
50f0: 41 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  A,       0 },.#e
5100: 6c 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b  lse.  { "GetDisk
5110: 46 72 65 65 53 70 61 63 65 41 22 2c 20 20 20 20  FreeSpaceA",    
5120: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
5130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5140: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
5150: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44  ..#define osGetD
5160: 69 73 6b 46 72 65 65 53 70 61 63 65 41 20 28 28  iskFreeSpaceA ((
5170: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50  BOOL(WINAPI*)(LP
5180: 43 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44  CSTR,LPDWORD,LPD
5190: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a  WORD,LPDWORD, \.
51a0: 20 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29          LPDWORD)
51b0: 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43  )aSyscall[18].pC
51c0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
51d0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
51e0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
51f0: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
5200: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
5210: 44 45 29 0a 20 20 7b 20 22 47 65 74 44 69 73 6b  DE).  { "GetDisk
5220: 46 72 65 65 53 70 61 63 65 57 22 2c 20 20 20 20  FreeSpaceW",    
5230: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 44     (SYSCALL)GetD
5240: 69 73 6b 46 72 65 65 53 70 61 63 65 57 2c 20 20  iskFreeSpaceW,  
5250: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
5260: 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65    { "GetDiskFree
5270: 53 70 61 63 65 57 22 2c 20 20 20 20 20 20 20 28  SpaceW",       (
5280: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
5290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52a0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
52b0: 65 66 69 6e 65 20 6f 73 47 65 74 44 69 73 6b 46  efine osGetDiskF
52c0: 72 65 65 53 70 61 63 65 57 20 28 28 42 4f 4f 4c  reeSpaceW ((BOOL
52d0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54  (WINAPI*)(LPCWST
52e0: 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52  R,LPDWORD,LPDWOR
52f0: 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20  D,LPDWORD, \.   
5300: 20 20 20 20 20 4c 50 44 57 4f 52 44 29 29 61 53       LPDWORD))aS
5310: 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72  yscall[19].pCurr
5320: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
5330: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
5340: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65  AS_ANSI).  { "Ge
5350: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
5360: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
5370: 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  )GetFileAttribut
5380: 65 73 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23  esA,      0 },.#
5390: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c  else.  { "GetFil
53a0: 65 41 74 74 72 69 62 75 74 65 73 41 22 2c 20 20  eAttributesA",  
53b0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
53c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53d0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
53e0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
53f0: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 20  FileAttributesA 
5400: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
5410: 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c  (LPCSTR))aSyscal
5420: 6c 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[20].pCurrent).
5430: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
5440: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
5450: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
5460: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74  S_WIDE).  { "Get
5470: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 22  FileAttributesW"
5480: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
5490: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
54a0: 73 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  sW,      0 },.#e
54b0: 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  lse.  { "GetFile
54c0: 41 74 74 72 69 62 75 74 65 73 57 22 2c 20 20 20  AttributesW",   
54d0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
54e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54f0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
5500: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46  ..#define osGetF
5510: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 20 28  ileAttributesW (
5520: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
5530: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
5540: 6c 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[21].pCurrent).
5550: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
5560: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
5570: 44 45 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  DE).  { "GetFile
5580: 41 74 74 72 69 62 75 74 65 73 45 78 57 22 2c 20  AttributesExW", 
5590: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
55a0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
55b0: 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  ,    0 },.#else.
55c0: 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72    { "GetFileAttr
55d0: 69 62 75 74 65 73 45 78 57 22 2c 20 20 20 20 28  ibutesExW",    (
55e0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
55f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5600: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
5610: 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41  efine osGetFileA
5620: 74 74 72 69 62 75 74 65 73 45 78 57 20 28 28 42  ttributesExW ((B
5630: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
5640: 57 53 54 52 2c 47 45 54 5f 46 49 4c 45 45 58 5f  WSTR,GET_FILEEX_
5650: 49 4e 46 4f 5f 4c 45 56 45 4c 53 2c 20 5c 0a 20  INFO_LEVELS, \. 
5660: 20 20 20 20 20 20 20 4c 50 56 4f 49 44 29 29 61         LPVOID))a
5670: 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72  Syscall[22].pCur
5680: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
5690: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
56a0: 22 47 65 74 46 69 6c 65 53 69 7a 65 22 2c 20 20  "GetFileSize",  
56b0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
56c0: 41 4c 4c 29 47 65 74 46 69 6c 65 53 69 7a 65 2c  ALL)GetFileSize,
56d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
56e0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
56f0: 46 69 6c 65 53 69 7a 65 22 2c 20 20 20 20 20 20  FileSize",      
5700: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5710: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5720: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5730: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
5740: 47 65 74 46 69 6c 65 53 69 7a 65 20 28 28 44 57  GetFileSize ((DW
5750: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  ORD(WINAPI*)(HAN
5760: 44 4c 45 2c 4c 50 44 57 4f 52 44 29 29 61 53 79  DLE,LPDWORD))aSy
5770: 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75 72 72 65  scall[23].pCurre
5780: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
5790: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66  _OS_WINCE && def
57a0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
57b0: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
57c0: 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  "GetFullPathName
57d0: 41 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43  A",        (SYSC
57e0: 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e  ALL)GetFullPathN
57f0: 61 6d 65 41 2c 20 20 20 20 20 20 20 20 30 20 7d  ameA,        0 }
5800: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
5810: 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 22 2c 20  FullPathNameA", 
5820: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5830: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5840: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5850: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
5860: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
5870: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
5880: 29 28 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c 4c  )(LPCSTR,DWORD,L
5890: 50 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  PSTR, \.        
58a0: 4c 50 53 54 52 2a 29 29 61 53 79 73 63 61 6c 6c  LPSTR*))aSyscall
58b0: 5b 32 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [24].pCurrent)..
58c0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
58d0: 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
58e0: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
58f0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
5900: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
5910: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57  GetFullPathNameW
5920: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
5930: 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  LL)GetFullPathNa
5940: 6d 65 57 2c 20 20 20 20 20 20 20 20 30 20 7d 2c  meW,        0 },
5950: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
5960: 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c 20 20  ullPathNameW",  
5970: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
5980: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5990: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
59a0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
59b0: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 20  etFullPathNameW 
59c0: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
59d0: 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 4c  (LPCWSTR,DWORD,L
59e0: 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20  PWSTR, \.       
59f0: 20 4c 50 57 53 54 52 2a 29 29 61 53 79 73 63 61   LPWSTR*))aSysca
5a00: 6c 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[25].pCurrent)
5a10: 0a 0a 20 20 7b 20 22 47 65 74 4c 61 73 74 45 72  ..  { "GetLastEr
5a20: 72 6f 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  ror",           
5a30: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 4c 61 73   (SYSCALL)GetLas
5a40: 74 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20  tError,         
5a50: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
5a60: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 20   osGetLastError 
5a70: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
5a80: 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  (VOID))aSyscall[
5a90: 32 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  26].pCurrent)..#
5aa0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
5ab0: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
5ac0: 45 4e 53 49 4f 4e 29 0a 23 69 66 20 53 51 4c 49  ENSION).#if SQLI
5ad0: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a  TE_OS_WINCE.  /*
5ae0: 20 54 68 65 20 47 65 74 50 72 6f 63 41 64 64 72   The GetProcAddr
5af0: 65 73 73 41 28 29 20 72 6f 75 74 69 6e 65 20 69  essA() routine i
5b00: 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  s only available
5b10: 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 2e 20   on Windows CE. 
5b20: 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41  */.  { "GetProcA
5b30: 64 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20  ddressA",       
5b40: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50 72    (SYSCALL)GetPr
5b50: 6f 63 41 64 64 72 65 73 73 41 2c 20 20 20 20 20  ocAddressA,     
5b60: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5b70: 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20 57 69   /* All other Wi
5b80: 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73 20  ndows platforms 
5b90: 65 78 70 65 63 74 20 47 65 74 50 72 6f 63 41 64  expect GetProcAd
5ba0: 64 72 65 73 73 28 29 20 74 6f 20 74 61 6b 65 0a  dress() to take.
5bb0: 20 20 2a 2a 20 61 6e 20 41 4e 53 49 20 73 74 72    ** an ANSI str
5bc0: 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20 6f  ing regardless o
5bd0: 66 20 74 68 65 20 5f 55 4e 49 43 4f 44 45 20 73  f the _UNICODE s
5be0: 65 74 74 69 6e 67 20 2a 2f 0a 20 20 7b 20 22 47  etting */.  { "G
5bf0: 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c  etProcAddressA",
5c00: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5c10: 4c 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73  L)GetProcAddress
5c20: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
5c30: 23 65 6e 64 69 66 0a 23 65 6c 73 65 0a 20 20 7b  #endif.#else.  {
5c40: 20 22 47 65 74 50 72 6f 63 41 64 64 72 65 73 73   "GetProcAddress
5c50: 41 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53  A",         (SYS
5c60: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5c80: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5c90: 6e 65 20 6f 73 47 65 74 50 72 6f 63 41 64 64 72  ne osGetProcAddr
5ca0: 65 73 73 41 20 28 28 46 41 52 50 52 4f 43 28 57  essA ((FARPROC(W
5cb0: 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55 4c 45 2c  INAPI*)(HMODULE,
5cc0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 53 54   \.        LPCST
5cd0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 37 5d 2e  R))aSyscall[27].
5ce0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
5cf0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
5d00: 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 49 6e    { "GetSystemIn
5d10: 66 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  fo",           (
5d20: 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65  SYSCALL)GetSyste
5d30: 6d 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  mInfo,          
5d40: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
5d50: 22 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 22 2c  "GetSystemInfo",
5d60: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
5d70: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
5d90: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
5da0: 65 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66  e osGetSystemInf
5db0: 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  o ((VOID(WINAPI*
5dc0: 29 28 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29  )(LPSYSTEM_INFO)
5dd0: 29 61 53 79 73 63 61 6c 6c 5b 32 38 5d 2e 70 43  )aSyscall[28].pC
5de0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65  urrent)..  { "Ge
5df0: 74 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20  tSystemTime",   
5e00: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5e10: 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65 2c 20  )GetSystemTime, 
5e20: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
5e30: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73  #define osGetSys
5e40: 74 65 6d 54 69 6d 65 20 28 28 56 4f 49 44 28 57  temTime ((VOID(W
5e50: 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45 4d  INAPI*)(LPSYSTEM
5e60: 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 32  TIME))aSyscall[2
5e70: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
5e80: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
5e90: 43 45 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65  CE.  { "GetSyste
5ea0: 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 22  mTimeAsFileTime"
5eb0: 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79  , (SYSCALL)GetSy
5ec0: 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69  stemTimeAsFileTi
5ed0: 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20  me, 0 },.#else. 
5ee0: 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d   { "GetSystemTim
5ef0: 65 41 73 46 69 6c 65 54 69 6d 65 22 2c 20 28 53  eAsFileTime", (S
5f00: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
5f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f20: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
5f30: 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d  fine osGetSystem
5f40: 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 20 28  TimeAsFileTime (
5f50: 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 20  (VOID(WINAPI*)( 
5f60: 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45  \.        LPFILE
5f70: 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 33  TIME))aSyscall[3
5f80: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
5f90: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
5fa0: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
5fb0: 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74  .  { "GetTempPat
5fc0: 68 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  hA",            
5fd0: 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70  (SYSCALL)GetTemp
5fe0: 50 61 74 68 41 2c 20 20 20 20 20 20 20 20 20 20  PathA,          
5ff0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
6000: 20 22 47 65 74 54 65 6d 70 50 61 74 68 41 22 2c   "GetTempPathA",
6010: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6020: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
6030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6040: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
6050: 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68  ne osGetTempPath
6060: 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  A ((DWORD(WINAPI
6070: 2a 29 28 44 57 4f 52 44 2c 4c 50 53 54 52 29 29  *)(DWORD,LPSTR))
6080: 61 53 79 73 63 61 6c 6c 5b 33 31 5d 2e 70 43 75  aSyscall[31].pCu
6090: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
60a0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
60b0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
60c0: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
60d0: 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 57   { "GetTempPathW
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 47 65 74 54 65 6d 70 50 61  YSCALL)GetTempPa
6100: 74 68 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  thW,            
6110: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6120: 47 65 74 54 65 6d 70 50 61 74 68 57 22 2c 20 20  GetTempPathW",  
6130: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6140: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6150: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6160: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6170: 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57 20   osGetTempPathW 
6180: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
6190: 28 44 57 4f 52 44 2c 4c 50 57 53 54 52 29 29 61  (DWORD,LPWSTR))a
61a0: 53 79 73 63 61 6c 6c 5b 33 32 5d 2e 70 43 75 72  Syscall[32].pCur
61b0: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
61c0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
61d0: 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20  "GetTickCount", 
61e0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
61f0: 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e 74  ALL)GetTickCount
6200: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
6210: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
6220: 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20 20 20  TickCount",     
6230: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6240: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6250: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6260: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6270: 47 65 74 54 69 63 6b 43 6f 75 6e 74 20 28 28 44  GetTickCount ((D
6280: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 56 4f  WORD(WINAPI*)(VO
6290: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 33 5d  ID))aSyscall[33]
62a0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
62b0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
62c0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26  IN32_HAS_ANSI) &
62d0: 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47  & SQLITE_WIN32_G
62e0: 45 54 56 45 52 53 49 4f 4e 45 58 0a 20 20 7b 20  ETVERSIONEX.  { 
62f0: 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41 22 2c  "GetVersionExA",
6300: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6310: 41 4c 4c 29 47 65 74 56 65 72 73 69 6f 6e 45 78  ALL)GetVersionEx
6320: 41 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  A,           0 }
6330: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
6340: 56 65 72 73 69 6f 6e 45 78 41 22 2c 20 20 20 20  VersionExA",    
6350: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6360: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6370: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6380: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6390: 47 65 74 56 65 72 73 69 6f 6e 45 78 41 20 28 28  GetVersionExA ((
63a0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c  BOOL(WINAPI*)( \
63b0: 0a 20 20 20 20 20 20 20 20 4c 50 4f 53 56 45 52  .        LPOSVER
63c0: 53 49 4f 4e 49 4e 46 4f 41 29 29 61 53 79 73 63  SIONINFOA))aSysc
63d0: 61 6c 6c 5b 33 34 5d 2e 70 43 75 72 72 65 6e 74  all[34].pCurrent
63e0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
63f0: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
6400: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
6410: 48 41 53 5f 57 49 44 45 29 20 26 26 20 5c 0a 20  HAS_WIDE) && \. 
6420: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49         SQLITE_WI
6430: 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58  N32_GETVERSIONEX
6440: 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e  .  { "GetVersion
6450: 45 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  ExW",           
6460: 28 53 59 53 43 41 4c 4c 29 47 65 74 56 65 72 73  (SYSCALL)GetVers
6470: 69 6f 6e 45 78 57 2c 20 20 20 20 20 20 20 20 20  ionExW,         
6480: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
6490: 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 57 22   "GetVersionExW"
64a0: 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ,           (SYS
64b0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
64c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
64d0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
64e0: 6e 65 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45  ne osGetVersionE
64f0: 78 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  xW ((BOOL(WINAPI
6500: 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  *)( \.        LP
6510: 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 57 29 29  OSVERSIONINFOW))
6520: 61 53 79 73 63 61 6c 6c 5b 33 35 5d 2e 70 43 75  aSyscall[35].pCu
6530: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61  rrent)..  { "Hea
6540: 70 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20  pAlloc",        
6550: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6560: 48 65 61 70 41 6c 6c 6f 63 2c 20 20 20 20 20 20  HeapAlloc,      
6570: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
6580: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 41 6c 6c  define osHeapAll
6590: 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41  oc ((LPVOID(WINA
65a0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
65b0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a  D, \.        SIZ
65c0: 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 36  E_T))aSyscall[36
65d0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
65e0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
65f0: 54 0a 20 20 7b 20 22 48 65 61 70 43 72 65 61 74  T.  { "HeapCreat
6600: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
6610: 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 43 72   (SYSCALL)HeapCr
6620: 65 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  eate,           
6630: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
6640: 7b 20 22 48 65 61 70 43 72 65 61 74 65 22 2c 20  { "HeapCreate", 
6650: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6660: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
6670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6680: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
6690: 69 6e 65 20 6f 73 48 65 61 70 43 72 65 61 74 65  ine osHeapCreate
66a0: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
66b0: 2a 29 28 44 57 4f 52 44 2c 53 49 5a 45 5f 54 2c  *)(DWORD,SIZE_T,
66c0: 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f   \.        SIZE_
66d0: 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 37 5d 2e  T))aSyscall[37].
66e0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
66f0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
6700: 20 20 7b 20 22 48 65 61 70 44 65 73 74 72 6f 79    { "HeapDestroy
6710: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
6720: 53 59 53 43 41 4c 4c 29 48 65 61 70 44 65 73 74  SYSCALL)HeapDest
6730: 72 6f 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  roy,            
6740: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
6750: 22 48 65 61 70 44 65 73 74 72 6f 79 22 2c 20 20  "HeapDestroy",  
6760: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6770: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
6780: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6790: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
67a0: 65 20 6f 73 48 65 61 70 44 65 73 74 72 6f 79 20  e osHeapDestroy 
67b0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
67c0: 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c  HANDLE))aSyscall
67d0: 5b 33 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [38].pCurrent)..
67e0: 20 20 7b 20 22 48 65 61 70 46 72 65 65 22 2c 20    { "HeapFree", 
67f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
6800: 53 59 53 43 41 4c 4c 29 48 65 61 70 46 72 65 65  SYSCALL)HeapFree
6810: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6820: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
6830: 73 48 65 61 70 46 72 65 65 20 28 28 42 4f 4f 4c  sHeapFree ((BOOL
6840: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
6850: 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44 29 29 61  ,DWORD,LPVOID))a
6860: 53 79 73 63 61 6c 6c 5b 33 39 5d 2e 70 43 75 72  Syscall[39].pCur
6870: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70  rent)..  { "Heap
6880: 52 65 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20  ReAlloc",       
6890: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
68a0: 65 61 70 52 65 41 6c 6c 6f 63 2c 20 20 20 20 20  eapReAlloc,     
68b0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
68c0: 65 66 69 6e 65 20 6f 73 48 65 61 70 52 65 41 6c  efine osHeapReAl
68d0: 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e  loc ((LPVOID(WIN
68e0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
68f0: 52 44 2c 4c 50 56 4f 49 44 2c 20 5c 0a 20 20 20  RD,LPVOID, \.   
6900: 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79       SIZE_T))aSy
6910: 73 63 61 6c 6c 5b 34 30 5d 2e 70 43 75 72 72 65  scall[40].pCurre
6920: 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 53 69  nt)..  { "HeapSi
6930: 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ze",            
6940: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
6950: 70 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  pSize,          
6960: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
6970: 69 6e 65 20 6f 73 48 65 61 70 53 69 7a 65 20 28  ine osHeapSize (
6980: 28 53 49 5a 45 5f 54 28 57 49 4e 41 50 49 2a 29  (SIZE_T(WINAPI*)
6990: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c  (HANDLE,DWORD, \
69a0: 0a 20 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44  .        LPCVOID
69b0: 29 29 61 53 79 73 63 61 6c 6c 5b 34 31 5d 2e 70  ))aSyscall[41].p
69c0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
69d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
69e0: 20 7b 20 22 48 65 61 70 56 61 6c 69 64 61 74 65   { "HeapValidate
69f0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
6a00: 59 53 43 41 4c 4c 29 48 65 61 70 56 61 6c 69 64  YSCALL)HeapValid
6a10: 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
6a20: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6a30: 48 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20 20  HeapValidate",  
6a40: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6a50: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6a60: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6a70: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6a80: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 20   osHeapValidate 
6a90: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
6aa0: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a  HANDLE,DWORD, \.
6ab0: 20 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29          LPCVOID)
6ac0: 29 61 53 79 73 63 61 6c 6c 5b 34 32 5d 2e 70 43  )aSyscall[42].pC
6ad0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
6ae0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
6af0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
6b00: 54 0a 20 20 7b 20 22 48 65 61 70 43 6f 6d 70 61  T.  { "HeapCompa
6b10: 63 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ct",            
6b20: 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 43 6f   (SYSCALL)HeapCo
6b30: 6d 70 61 63 74 2c 20 20 20 20 20 20 20 20 20 20  mpact,          
6b40: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
6b50: 7b 20 22 48 65 61 70 43 6f 6d 70 61 63 74 22 2c  { "HeapCompact",
6b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6b70: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
6b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6b90: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
6ba0: 69 6e 65 20 6f 73 48 65 61 70 43 6f 6d 70 61 63  ine osHeapCompac
6bb0: 74 20 28 28 55 49 4e 54 28 57 49 4e 41 50 49 2a  t ((UINT(WINAPI*
6bc0: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 29 29  )(HANDLE,DWORD))
6bd0: 61 53 79 73 63 61 6c 6c 5b 34 33 5d 2e 70 43 75  aSyscall[43].pCu
6be0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
6bf0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
6c00: 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20 21 64  _HAS_ANSI) && !d
6c10: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
6c20: 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
6c30: 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72  N).  { "LoadLibr
6c40: 61 72 79 41 22 2c 20 20 20 20 20 20 20 20 20 20  aryA",          
6c50: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c    (SYSCALL)LoadL
6c60: 69 62 72 61 72 79 41 2c 20 20 20 20 20 20 20 20  ibraryA,        
6c70: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
6c80: 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 41   { "LoadLibraryA
6c90: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
6ca0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
6cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cc0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
6cd0: 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61  fine osLoadLibra
6ce0: 72 79 41 20 28 28 48 4d 4f 44 55 4c 45 28 57 49  ryA ((HMODULE(WI
6cf0: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61  NAPI*)(LPCSTR))a
6d00: 53 79 73 63 61 6c 6c 5b 34 34 5d 2e 70 43 75 72  Syscall[44].pCur
6d10: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
6d20: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
6d30: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
6d40: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26 26  N32_HAS_WIDE) &&
6d50: 20 5c 0a 20 20 20 20 20 20 20 20 21 64 65 66 69   \.        !defi
6d60: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
6d70: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a  LOAD_EXTENSION).
6d80: 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79    { "LoadLibrary
6d90: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  W",            (
6da0: 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62 72  SYSCALL)LoadLibr
6db0: 61 72 79 57 2c 20 20 20 20 20 20 20 20 20 20 20  aryW,           
6dc0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
6dd0: 22 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c 20  "LoadLibraryW", 
6de0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6df0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
6e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6e10: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
6e20: 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 57  e osLoadLibraryW
6e30: 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50   ((HMODULE(WINAP
6e40: 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79  I*)(LPCWSTR))aSy
6e50: 73 63 61 6c 6c 5b 34 35 5d 2e 70 43 75 72 72 65  scall[45].pCurre
6e60: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
6e70: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 4c  _OS_WINRT.  { "L
6e80: 6f 63 61 6c 46 72 65 65 22 2c 20 20 20 20 20 20  ocalFree",      
6e90: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6ea0: 4c 29 4c 6f 63 61 6c 46 72 65 65 2c 20 20 20 20  L)LocalFree,    
6eb0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6ec0: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 61 6c  #else.  { "Local
6ed0: 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20 20  Free",          
6ee0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
6ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f00: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6f10: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f  if..#define osLo
6f20: 63 61 6c 46 72 65 65 20 28 28 48 4c 4f 43 41 4c  calFree ((HLOCAL
6f30: 28 57 49 4e 41 50 49 2a 29 28 48 4c 4f 43 41 4c  (WINAPI*)(HLOCAL
6f40: 29 29 61 53 79 73 63 61 6c 6c 5b 34 36 5d 2e 70  ))aSyscall[46].p
6f50: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
6f60: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
6f70: 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
6f80: 52 54 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65  RT.  { "LockFile
6f90: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
6fa0: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46    (SYSCALL)LockF
6fb0: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
6fc0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
6fd0: 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20   { "LockFile",  
6fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
6ff0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
7000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7010: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0 },.#endif..#if
7020: 6e 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 0a  ndef osLockFile.
7030: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69  #define osLockFi
7040: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
7050: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
7060: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
7070: 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53         DWORD))aS
7080: 79 73 63 61 6c 6c 5b 34 37 5d 2e 70 43 75 72 72  yscall[47].pCurr
7090: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ent).#endif..#if
70a0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
70b0: 45 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 45  E.  { "LockFileE
70c0: 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  x",             
70d0: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69   (SYSCALL)LockFi
70e0: 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20 20 20  leEx,           
70f0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
7100: 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 20  { "LockFileEx", 
7110: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
7120: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
7130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7140: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e   },.#endif..#ifn
7150: 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78  def osLockFileEx
7160: 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46  .#define osLockF
7170: 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e  ileEx ((BOOL(WIN
7180: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
7190: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44  RD,DWORD,DWORD,D
71a0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
71b0: 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53  LPOVERLAPPED))aS
71c0: 79 73 63 61 6c 6c 5b 34 38 5d 2e 70 43 75 72 72  yscall[48].pCurr
71d0: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ent).#endif..#if
71e0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
71f0: 20 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f   || (!SQLITE_OS_
7200: 57 49 4e 52 54 20 26 26 20 5c 0a 20 20 20 20 20  WINRT && \.     
7210: 20 20 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c     (!defined(SQL
7220: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c  ITE_OMIT_WAL) ||
7230: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
7240: 5f 53 49 5a 45 3e 30 29 29 0a 20 20 7b 20 22 4d  _SIZE>0)).  { "M
7250: 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20  apViewOfFile",  
7260: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
7270: 4c 29 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c  L)MapViewOfFile,
7280: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7290: 23 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70 56 69  #else.  { "MapVi
72a0: 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ewOfFile",      
72b0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
72c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72d0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
72e0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61  if..#define osMa
72f0: 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28 4c 50  pViewOfFile ((LP
7300: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41  VOID(WINAPI*)(HA
7310: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
7320: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
7330: 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61    SIZE_T))aSysca
7340: 6c 6c 5b 34 39 5d 2e 70 43 75 72 72 65 6e 74 29  ll[49].pCurrent)
7350: 0a 0a 20 20 7b 20 22 4d 75 6c 74 69 42 79 74 65  ..  { "MultiByte
7360: 54 6f 57 69 64 65 43 68 61 72 22 2c 20 20 20 20  ToWideChar",    
7370: 20 28 53 59 53 43 41 4c 4c 29 4d 75 6c 74 69 42   (SYSCALL)MultiB
7380: 79 74 65 54 6f 57 69 64 65 43 68 61 72 2c 20 20  yteToWideChar,  
7390: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
73a0: 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   osMultiByteToWi
73b0: 64 65 43 68 61 72 20 28 28 69 6e 74 28 57 49 4e  deChar ((int(WIN
73c0: 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52 44  API*)(UINT,DWORD
73d0: 2c 4c 50 43 53 54 52 2c 69 6e 74 2c 4c 50 57 53  ,LPCSTR,int,LPWS
73e0: 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 69 6e  TR, \.        in
73f0: 74 29 29 61 53 79 73 63 61 6c 6c 5b 35 30 5d 2e  t))aSyscall[50].
7400: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
7410: 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65  QueryPerformance
7420: 43 6f 75 6e 74 65 72 22 2c 20 28 53 59 53 43 41  Counter", (SYSCA
7430: 4c 4c 29 51 75 65 72 79 50 65 72 66 6f 72 6d 61  LL)QueryPerforma
7440: 6e 63 65 43 6f 75 6e 74 65 72 2c 20 30 20 7d 2c  nceCounter, 0 },
7450: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 51 75 65 72  ..#define osQuer
7460: 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e  yPerformanceCoun
7470: 74 65 72 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ter ((BOOL(WINAP
7480: 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c  I*)( \.        L
7490: 41 52 47 45 5f 49 4e 54 45 47 45 52 2a 29 29 61  ARGE_INTEGER*))a
74a0: 53 79 73 63 61 6c 6c 5b 35 31 5d 2e 70 43 75 72  Syscall[51].pCur
74b0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 52 65 61 64  rent)..  { "Read
74c0: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
74d0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 52        (SYSCALL)R
74e0: 65 61 64 46 69 6c 65 2c 20 20 20 20 20 20 20 20  eadFile,        
74f0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
7500: 65 66 69 6e 65 20 6f 73 52 65 61 64 46 69 6c 65  efine osReadFile
7510: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
7520: 28 48 41 4e 44 4c 45 2c 4c 50 56 4f 49 44 2c 44  (HANDLE,LPVOID,D
7530: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a  WORD,LPDWORD, \.
7540: 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41          LPOVERLA
7550: 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35  PPED))aSyscall[5
7560: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  2].pCurrent)..  
7570: 7b 20 22 53 65 74 45 6e 64 4f 66 46 69 6c 65 22  { "SetEndOfFile"
7580: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
7590: 53 43 41 4c 4c 29 53 65 74 45 6e 64 4f 66 46 69  SCALL)SetEndOfFi
75a0: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  le,            0
75b0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53   },..#define osS
75c0: 65 74 45 6e 64 4f 66 46 69 6c 65 20 28 28 42 4f  etEndOfFile ((BO
75d0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
75e0: 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 33 5d  LE))aSyscall[53]
75f0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
7600: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
7610: 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69  .  { "SetFilePoi
7620: 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20 20 20  nter",          
7630: 28 53 59 53 43 41 4c 4c 29 53 65 74 46 69 6c 65  (SYSCALL)SetFile
7640: 50 6f 69 6e 74 65 72 2c 20 20 20 20 20 20 20 20  Pointer,        
7650: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7660: 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72   "SetFilePointer
7670: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
7680: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
76a0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
76b0: 6e 65 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e  ne osSetFilePoin
76c0: 74 65 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41  ter ((DWORD(WINA
76d0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 4f 4e 47  PI*)(HANDLE,LONG
76e0: 2c 50 4c 4f 4e 47 2c 20 5c 0a 20 20 20 20 20 20  ,PLONG, \.      
76f0: 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c    DWORD))aSyscal
7700: 6c 5b 35 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[54].pCurrent).
7710: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
7720: 57 49 4e 52 54 0a 20 20 7b 20 22 53 6c 65 65 70  WINRT.  { "Sleep
7730: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
7740: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 6c       (SYSCALL)Sl
7750: 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eep,            
7760: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
7770: 65 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c 20 20  e.  { "Sleep",  
7780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7790: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
77a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77b0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
77c0: 23 64 65 66 69 6e 65 20 6f 73 53 6c 65 65 70 20  #define osSleep 
77d0: 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  ((VOID(WINAPI*)(
77e0: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
77f0: 35 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  55].pCurrent).. 
7800: 20 7b 20 22 53 79 73 74 65 6d 54 69 6d 65 54 6f   { "SystemTimeTo
7810: 46 69 6c 65 54 69 6d 65 22 2c 20 20 20 20 28 53  FileTime",    (S
7820: 59 53 43 41 4c 4c 29 53 79 73 74 65 6d 54 69 6d  YSCALL)SystemTim
7830: 65 54 6f 46 69 6c 65 54 69 6d 65 2c 20 20 20 20  eToFileTime,    
7840: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
7850: 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65  SystemTimeToFile
7860: 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  Time ((BOOL(WINA
7870: 50 49 2a 29 28 43 4f 4e 53 54 20 53 59 53 54 45  PI*)(CONST SYSTE
7880: 4d 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20  MTIME*, \.      
7890: 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53    LPFILETIME))aS
78a0: 79 73 63 61 6c 6c 5b 35 36 5d 2e 70 43 75 72 72  yscall[56].pCurr
78b0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
78c0: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
78d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
78e0: 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c   { "UnlockFile",
78f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
7900: 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c  YSCALL)UnlockFil
7910: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
7920: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
7930: 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20  UnlockFile",    
7940: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
7950: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
7960: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7970: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
7980: 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 0a 23 64   osUnlockFile.#d
7990: 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69  efine osUnlockFi
79a0: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
79b0: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
79c0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
79d0: 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53         DWORD))aS
79e0: 79 73 63 61 6c 6c 5b 35 37 5d 2e 70 43 75 72 72  yscall[57].pCurr
79f0: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ent).#endif..#if
7a00: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
7a10: 45 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c  E.  { "UnlockFil
7a20: 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20  eEx",           
7a30: 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b   (SYSCALL)Unlock
7a40: 46 69 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20  FileEx,         
7a50: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
7a60: 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22  { "UnlockFileEx"
7a70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
7a80: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7aa0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
7ab0: 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65  ine osUnlockFile
7ac0: 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  Ex ((BOOL(WINAPI
7ad0: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
7ae0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
7af0: 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50         LPOVERLAP
7b00: 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 38  PED))aSyscall[58
7b10: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
7b20: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
7b30: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
7b40: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c  ITE_OMIT_WAL) ||
7b50: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
7b60: 5f 53 49 5a 45 3e 30 0a 20 20 7b 20 22 55 6e 6d  _SIZE>0.  { "Unm
7b70: 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20  apViewOfFile",  
7b80: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7b90: 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c  UnmapViewOfFile,
7ba0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
7bb0: 6c 73 65 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69  lse.  { "UnmapVi
7bc0: 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ewOfFile",      
7bd0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bf0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
7c00: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6d 61  ..#define osUnma
7c10: 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28 42 4f  pViewOfFile ((BO
7c20: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 56  OL(WINAPI*)(LPCV
7c30: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 39  OID))aSyscall[59
7c40: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
7c50: 20 22 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74   "WideCharToMult
7c60: 69 42 79 74 65 22 2c 20 20 20 20 20 28 53 59 53  iByte",     (SYS
7c70: 43 41 4c 4c 29 57 69 64 65 43 68 61 72 54 6f 4d  CALL)WideCharToM
7c80: 75 6c 74 69 42 79 74 65 2c 20 20 20 20 20 30 20  ultiByte,     0 
7c90: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 69  },..#define osWi
7ca0: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
7cb0: 65 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a 29  e ((int(WINAPI*)
7cc0: 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 57  (UINT,DWORD,LPCW
7cd0: 53 54 52 2c 69 6e 74 2c 4c 50 53 54 52 2c 69 6e  STR,int,LPSTR,in
7ce0: 74 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43  t, \.        LPC
7cf0: 53 54 52 2c 4c 50 42 4f 4f 4c 29 29 61 53 79 73  STR,LPBOOL))aSys
7d00: 63 61 6c 6c 5b 36 30 5d 2e 70 43 75 72 72 65 6e  call[60].pCurren
7d10: 74 29 0a 0a 20 20 7b 20 22 57 72 69 74 65 46 69  t)..  { "WriteFi
7d20: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
7d30: 20 20 20 28 53 59 53 43 41 4c 4c 29 57 72 69 74     (SYSCALL)Writ
7d40: 65 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  eFile,          
7d50: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
7d60: 6e 65 20 6f 73 57 72 69 74 65 46 69 6c 65 20 28  ne osWriteFile (
7d70: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
7d80: 41 4e 44 4c 45 2c 4c 50 43 56 4f 49 44 2c 44 57  ANDLE,LPCVOID,DW
7d90: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20  ORD,LPDWORD, \. 
7da0: 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50         LPOVERLAP
7db0: 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 31  PED))aSyscall[61
7dc0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
7dd0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
7de0: 0a 20 20 7b 20 22 43 72 65 61 74 65 45 76 65 6e  .  { "CreateEven
7df0: 74 45 78 57 22 2c 20 20 20 20 20 20 20 20 20 20  tExW",          
7e00: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 45  (SYSCALL)CreateE
7e10: 76 65 6e 74 45 78 57 2c 20 20 20 20 20 20 20 20  ventExW,        
7e20: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7e30: 20 22 43 72 65 61 74 65 45 76 65 6e 74 45 78 57   "CreateEventExW
7e40: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
7e50: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7e70: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
7e80: 6e 65 20 6f 73 43 72 65 61 74 65 45 76 65 6e 74  ne osCreateEvent
7e90: 45 78 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  ExW ((HANDLE(WIN
7ea0: 41 50 49 2a 29 28 4c 50 53 45 43 55 52 49 54 59  API*)(LPSECURITY
7eb0: 5f 41 54 54 52 49 42 55 54 45 53 2c 4c 50 43 57  _ATTRIBUTES,LPCW
7ec0: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  STR, \.        D
7ed0: 57 4f 52 44 2c 44 57 4f 52 44 29 29 61 53 79 73  WORD,DWORD))aSys
7ee0: 63 61 6c 6c 5b 36 32 5d 2e 70 43 75 72 72 65 6e  call[62].pCurren
7ef0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
7f00: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 57 61  OS_WINRT.  { "Wa
7f10: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
7f20: 74 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c  t",     (SYSCALL
7f30: 29 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  )WaitForSingleOb
7f40: 6a 65 63 74 2c 20 20 20 20 20 30 20 7d 2c 0a 23  ject,     0 },.#
7f50: 65 6c 73 65 0a 20 20 7b 20 22 57 61 69 74 46 6f  else.  { "WaitFo
7f60: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 22 2c 20  rSingleObject", 
7f70: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
7f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f90: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7fa0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 69  f..#define osWai
7fb0: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
7fc0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
7fd0: 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20  )(HANDLE, \.    
7fe0: 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63      DWORD))aSysc
7ff0: 61 6c 6c 5b 36 33 5d 2e 70 43 75 72 72 65 6e 74  all[63].pCurrent
8000: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
8010: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 57 61 69  S_WINCE.  { "Wai
8020: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
8030: 45 78 22 2c 20 20 20 28 53 59 53 43 41 4c 4c 29  Ex",   (SYSCALL)
8040: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
8050: 65 63 74 45 78 2c 20 20 20 30 20 7d 2c 0a 23 65  ectEx,   0 },.#e
8060: 6c 73 65 0a 20 20 7b 20 22 57 61 69 74 46 6f 72  lse.  { "WaitFor
8070: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c  SingleObjectEx",
8080: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
8090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80a0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
80b0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 69 74  ..#define osWait
80c0: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45  ForSingleObjectE
80d0: 78 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  x ((DWORD(WINAPI
80e0: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
80f0: 20 5c 0a 20 20 20 20 20 20 20 20 42 4f 4f 4c 29   \.        BOOL)
8100: 29 61 53 79 73 63 61 6c 6c 5b 36 34 5d 2e 70 43  )aSyscall[64].pC
8110: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
8120: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
8130: 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72   "SetFilePointer
8140: 45 78 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  Ex",        (SYS
8150: 43 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e  CALL)SetFilePoin
8160: 74 65 72 45 78 2c 20 20 20 20 20 20 20 20 30 20  terEx,        0 
8170: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 65  },.#else.  { "Se
8180: 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c  tFilePointerEx",
8190: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
81a0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
81b0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
81c0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
81d0: 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45  sSetFilePointerE
81e0: 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  x ((BOOL(WINAPI*
81f0: 29 28 48 41 4e 44 4c 45 2c 4c 41 52 47 45 5f 49  )(HANDLE,LARGE_I
8200: 4e 54 45 47 45 52 2c 20 5c 0a 20 20 20 20 20 20  NTEGER, \.      
8210: 20 20 50 4c 41 52 47 45 5f 49 4e 54 45 47 45 52    PLARGE_INTEGER
8220: 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  ,DWORD))aSyscall
8230: 5b 36 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [65].pCurrent)..
8240: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
8250: 4e 52 54 20 7c 7c 20 28 64 65 66 69 6e 65 64 28  NRT || (defined(
8260: 5f 57 49 4e 33 32 5f 57 49 4e 4e 54 29 20 26 26  _WIN32_WINNT) &&
8270: 20 5c 0a 20 20 20 20 20 20 20 20 5f 57 49 4e 33   \.        _WIN3
8280: 32 5f 57 49 4e 4e 54 20 3e 3d 20 5f 57 49 4e 33  2_WINNT >= _WIN3
8290: 32 5f 57 49 4e 4e 54 5f 57 49 4e 38 29 0a 20 20  2_WINNT_WIN8).  
82a0: 7b 20 22 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d  { "GetFileInform
82b0: 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 22  ationByHandleEx"
82c0: 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69  , (SYSCALL)GetFi
82d0: 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48  leInformationByH
82e0: 61 6e 64 6c 65 45 78 2c 20 30 20 7d 2c 0a 23 65  andleEx, 0 },.#e
82f0: 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  lse.  { "GetFile
8300: 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e  InformationByHan
8310: 64 6c 65 45 78 22 2c 20 28 53 59 53 43 41 4c 4c  dleEx", (SYSCALL
8320: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
8330: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
8340: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46  ..#define osGetF
8350: 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79  ileInformationBy
8360: 48 61 6e 64 6c 65 45 78 20 28 28 42 4f 4f 4c 28  HandleEx ((BOOL(
8370: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
8380: 20 5c 0a 20 20 20 20 20 20 20 20 46 49 4c 45 5f   \.        FILE_
8390: 49 4e 46 4f 5f 42 59 5f 48 41 4e 44 4c 45 5f 43  INFO_BY_HANDLE_C
83a0: 4c 41 53 53 2c 4c 50 56 4f 49 44 2c 44 57 4f 52  LASS,LPVOID,DWOR
83b0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 36 5d 2e  D))aSyscall[66].
83c0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
83d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
83e0: 26 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c 49  & (!defined(SQLI
83f0: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20  TE_OMIT_WAL) || 
8400: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
8410: 53 49 5a 45 3e 30 29 0a 20 20 7b 20 22 4d 61 70  SIZE>0).  { "Map
8420: 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70  ViewOfFileFromAp
8430: 70 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29  p",    (SYSCALL)
8440: 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f  MapViewOfFileFro
8450: 6d 41 70 70 2c 20 20 20 20 30 20 7d 2c 0a 23 65  mApp,    0 },.#e
8460: 6c 73 65 0a 20 20 7b 20 22 4d 61 70 56 69 65 77  lse.  { "MapView
8470: 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20  OfFileFromApp", 
8480: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
8490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84a0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
84b0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61 70 56  ..#define osMapV
84c0: 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70  iewOfFileFromApp
84d0: 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49   ((LPVOID(WINAPI
84e0: 2a 29 28 48 41 4e 44 4c 45 2c 55 4c 4f 4e 47 2c  *)(HANDLE,ULONG,
84f0: 55 4c 4f 4e 47 36 34 2c 20 5c 0a 20 20 20 20 20  ULONG64, \.     
8500: 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63     SIZE_T))aSysc
8510: 61 6c 6c 5b 36 37 5d 2e 70 43 75 72 72 65 6e 74  all[67].pCurrent
8520: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
8530: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43 72 65 61  _WINRT.  { "Crea
8540: 74 65 46 69 6c 65 32 22 2c 20 20 20 20 20 20 20  teFile2",       
8550: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
8560: 72 65 61 74 65 46 69 6c 65 32 2c 20 20 20 20 20  reateFile2,     
8570: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
8580: 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  se.  { "CreateFi
8590: 6c 65 32 22 2c 20 20 20 20 20 20 20 20 20 20 20  le2",           
85a0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
85b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85c0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
85d0: 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74  .#define osCreat
85e0: 65 46 69 6c 65 32 20 28 28 48 41 4e 44 4c 45 28  eFile2 ((HANDLE(
85f0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
8600: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f  ,DWORD,DWORD,DWO
8610: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
8620: 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45  CREATEFILE2_EXTE
8630: 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53 29  NDED_PARAMETERS)
8640: 29 61 53 79 73 63 61 6c 6c 5b 36 38 5d 2e 70 43  )aSyscall[68].pC
8650: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
8660: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
8670: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
8680: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
8690: 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 50 61  ION).  { "LoadPa
86a0: 63 6b 61 67 65 64 4c 69 62 72 61 72 79 22 2c 20  ckagedLibrary", 
86b0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61      (SYSCALL)Loa
86c0: 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79  dPackagedLibrary
86d0: 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65  ,     0 },.#else
86e0: 0a 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67  .  { "LoadPackag
86f0: 65 64 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20  edLibrary",     
8700: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
8710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8720: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
8730: 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 50 61 63  define osLoadPac
8740: 6b 61 67 65 64 4c 69 62 72 61 72 79 20 28 28 48  kagedLibrary ((H
8750: 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28  MODULE(WINAPI*)(
8760: 4c 50 43 57 53 54 52 2c 20 5c 0a 20 20 20 20 20  LPCWSTR, \.     
8770: 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61     DWORD))aSysca
8780: 6c 6c 5b 36 39 5d 2e 70 43 75 72 72 65 6e 74 29  ll[69].pCurrent)
8790: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
87a0: 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 54 69  WINRT.  { "GetTi
87b0: 63 6b 43 6f 75 6e 74 36 34 22 2c 20 20 20 20 20  ckCount64",     
87c0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
87d0: 74 54 69 63 6b 43 6f 75 6e 74 36 34 2c 20 20 20  tTickCount64,   
87e0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
87f0: 65 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f  e.  { "GetTickCo
8800: 75 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20  unt64",         
8810: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
8820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8830: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
8840: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 69 63  #define osGetTic
8850: 6b 43 6f 75 6e 74 36 34 20 28 28 55 4c 4f 4e 47  kCount64 ((ULONG
8860: 4c 4f 4e 47 28 57 49 4e 41 50 49 2a 29 28 56 4f  LONG(WINAPI*)(VO
8870: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 37 30 5d  ID))aSyscall[70]
8880: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
8890: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
88a0: 20 20 7b 20 22 47 65 74 4e 61 74 69 76 65 53 79    { "GetNativeSy
88b0: 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 28  stemInfo",     (
88c0: 53 59 53 43 41 4c 4c 29 47 65 74 4e 61 74 69 76  SYSCALL)GetNativ
88d0: 65 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20  eSystemInfo,    
88e0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
88f0: 22 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d  "GetNativeSystem
8900: 49 6e 66 6f 22 2c 20 20 20 20 20 28 53 59 53 43  Info",     (SYSC
8910: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
8920: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
8930: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
8940: 65 20 6f 73 47 65 74 4e 61 74 69 76 65 53 79 73  e osGetNativeSys
8950: 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28 57  temInfo ((VOID(W
8960: 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20  INAPI*)( \.     
8970: 20 20 20 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f     LPSYSTEM_INFO
8980: 29 29 61 53 79 73 63 61 6c 6c 5b 37 31 5d 2e 70  ))aSyscall[71].p
8990: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
89a0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
89b0: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
89c0: 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 72   "OutputDebugStr
89d0: 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59 53  ingA",      (SYS
89e0: 43 41 4c 4c 29 4f 75 74 70 75 74 44 65 62 75 67  CALL)OutputDebug
89f0: 53 74 72 69 6e 67 41 2c 20 20 20 20 20 20 30 20  StringA,      0 
8a00: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f 75  },.#else.  { "Ou
8a10: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41  tputDebugStringA
8a20: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
8a30: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
8a40: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
8a50: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
8a60: 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  sOutputDebugStri
8a70: 6e 67 41 20 28 28 56 4f 49 44 28 57 49 4e 41 50  ngA ((VOID(WINAP
8a80: 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73  I*)(LPCSTR))aSys
8a90: 63 61 6c 6c 5b 37 32 5d 2e 70 43 75 72 72 65 6e  call[72].pCurren
8aa0: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
8ab0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
8ac0: 5f 57 49 44 45 29 0a 20 20 7b 20 22 4f 75 74 70  _WIDE).  { "Outp
8ad0: 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 22 2c  utDebugStringW",
8ae0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4f        (SYSCALL)O
8af0: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
8b00: 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  W,      0 },.#el
8b10: 73 65 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65  se.  { "OutputDe
8b20: 62 75 67 53 74 72 69 6e 67 57 22 2c 20 20 20 20  bugStringW",    
8b30: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
8b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b50: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
8b60: 0a 23 64 65 66 69 6e 65 20 6f 73 4f 75 74 70 75  .#define osOutpu
8b70: 74 44 65 62 75 67 53 74 72 69 6e 67 57 20 28 28  tDebugStringW ((
8b80: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50  VOID(WINAPI*)(LP
8b90: 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  CWSTR))aSyscall[
8ba0: 37 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  73].pCurrent).. 
8bb0: 20 7b 20 22 47 65 74 50 72 6f 63 65 73 73 48 65   { "GetProcessHe
8bc0: 61 70 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  ap",          (S
8bd0: 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 65 73  YSCALL)GetProces
8be0: 73 48 65 61 70 2c 20 20 20 20 20 20 20 20 20 20  sHeap,          
8bf0: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
8c00: 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 20 28  GetProcessHeap (
8c10: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
8c20: 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  (VOID))aSyscall[
8c30: 37 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  74].pCurrent)..#
8c40: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
8c50: 52 54 20 26 26 20 28 21 64 65 66 69 6e 65 64 28  RT && (!defined(
8c60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
8c70: 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   || SQLITE_MAX_M
8c80: 4d 41 50 5f 53 49 5a 45 3e 30 29 0a 20 20 7b 20  MAP_SIZE>0).  { 
8c90: 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  "CreateFileMappi
8ca0: 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28 53 59 53  ngFromApp", (SYS
8cb0: 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d  CALL)CreateFileM
8cc0: 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 2c 20 30  appingFromApp, 0
8cd0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
8ce0: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
8cf0: 46 72 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41  FromApp", (SYSCA
8d00: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
8d10: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
8d20: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
8d30: 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
8d40: 69 6e 67 46 72 6f 6d 41 70 70 20 28 28 48 41 4e  ingFromApp ((HAN
8d50: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  DLE(WINAPI*)(HAN
8d60: 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  DLE, \.        L
8d70: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
8d80: 55 54 45 53 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47  UTES,ULONG,ULONG
8d90: 36 34 2c 4c 50 43 57 53 54 52 29 29 61 53 79 73  64,LPCWSTR))aSys
8da0: 63 61 6c 6c 5b 37 35 5d 2e 70 43 75 72 72 65 6e  call[75].pCurren
8db0: 74 29 0a 0a 2f 2a 0a 2a 2a 20 4e 4f 54 45 3a 20  t)../*.** NOTE: 
8dc0: 4f 6e 20 73 6f 6d 65 20 73 75 62 2d 70 6c 61 74  On some sub-plat
8dd0: 66 6f 72 6d 73 2c 20 74 68 65 20 49 6e 74 65 72  forms, the Inter
8de0: 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63  lockedCompareExc
8df0: 68 61 6e 67 65 20 22 66 75 6e 63 74 69 6f 6e 22  hange "function"
8e00: 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 72 65 61  .**       is rea
8e10: 6c 6c 79 20 6a 75 73 74 20 61 20 6d 61 63 72 6f  lly just a macro
8e20: 20 74 68 61 74 20 75 73 65 73 20 61 20 63 6f 6d   that uses a com
8e30: 70 69 6c 65 72 20 69 6e 74 72 69 6e 73 69 63 20  piler intrinsic 
8e40: 28 65 2e 67 2e 20 78 36 34 29 2e 0a 2a 2a 20 20  (e.g. x64)..**  
8e50: 20 20 20 20 20 53 6f 20 64 6f 20 6e 6f 74 20 74       So do not t
8e60: 72 79 20 74 6f 20 6d 61 6b 65 20 74 68 69 73 20  ry to make this 
8e70: 69 73 20 69 6e 74 6f 20 61 20 72 65 64 65 66 69  is into a redefi
8e80: 6e 61 62 6c 65 20 69 6e 74 65 72 66 61 63 65 2e  nable interface.
8e90: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
8ea0: 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61  InterlockedCompa
8eb0: 72 65 45 78 63 68 61 6e 67 65 29 0a 20 20 7b 20  reExchange).  { 
8ec0: 22 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70  "InterlockedComp
8ed0: 61 72 65 45 78 63 68 61 6e 67 65 22 2c 20 28 53  areExchange", (S
8ee0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
8ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
8f00: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 49 6e 74  ,..#define osInt
8f10: 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45  erlockedCompareE
8f20: 78 63 68 61 6e 67 65 20 49 6e 74 65 72 6c 6f 63  xchange Interloc
8f30: 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e  kedCompareExchan
8f40: 67 65 0a 23 65 6c 73 65 0a 20 20 7b 20 22 49 6e  ge.#else.  { "In
8f50: 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65  terlockedCompare
8f60: 45 78 63 68 61 6e 67 65 22 2c 20 28 53 59 53 43  Exchange", (SYSC
8f70: 41 4c 4c 29 49 6e 74 65 72 6c 6f 63 6b 65 64 43  ALL)InterlockedC
8f80: 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 2c 20  ompareExchange, 
8f90: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
8fa0: 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61  InterlockedCompa
8fb0: 72 65 45 78 63 68 61 6e 67 65 20 28 28 4c 4f 4e  reExchange ((LON
8fc0: 47 28 57 49 4e 41 50 49 2a 29 28 4c 4f 4e 47 20  G(WINAPI*)(LONG 
8fd0: 5c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  \.        SQLITE
8fe0: 5f 57 49 4e 33 32 5f 56 4f 4c 41 54 49 4c 45 2a  _WIN32_VOLATILE*
8ff0: 2c 20 4c 4f 4e 47 2c 4c 4f 4e 47 29 29 61 53 79  , LONG,LONG))aSy
9000: 73 63 61 6c 6c 5b 37 36 5d 2e 70 43 75 72 72 65  scall[76].pCurre
9010: 6e 74 29 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  nt).#endif /* de
9020: 66 69 6e 65 64 28 49 6e 74 65 72 6c 6f 63 6b 65  fined(Interlocke
9030: 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65  dCompareExchange
9040: 29 20 2a 2f 0a 0a 23 69 66 20 21 53 51 4c 49 54  ) */..#if !SQLIT
9050: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
9060: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
9070: 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 55  & SQLITE_WIN32_U
9080: 53 45 5f 55 55 49 44 0a 20 20 7b 20 22 55 75 69  SE_UUID.  { "Uui
9090: 64 43 72 65 61 74 65 22 2c 20 20 20 20 20 20 20  dCreate",       
90a0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
90b0: 29 55 75 69 64 43 72 65 61 74 65 2c 20 20 20 20  )UuidCreate,    
90c0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
90d0: 6c 73 65 0a 20 20 7b 20 22 55 75 69 64 43 72 65  lse.  { "UuidCre
90e0: 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ate",           
90f0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
9100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9110: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
9120: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 75 69 64  ..#define osUuid
9130: 43 72 65 61 74 65 20 28 28 52 50 43 5f 53 54 41  Create ((RPC_STA
9140: 54 55 53 28 52 50 43 5f 45 4e 54 52 59 2a 29 28  TUS(RPC_ENTRY*)(
9150: 55 55 49 44 2a 29 29 61 53 79 73 63 61 6c 6c 5b  UUID*))aSyscall[
9160: 37 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  77].pCurrent)..#
9170: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
9180: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
9190: 53 5f 57 49 4e 52 54 20 26 26 20 53 51 4c 49 54  S_WINRT && SQLIT
91a0: 45 5f 57 49 4e 33 32 5f 55 53 45 5f 55 55 49 44  E_WIN32_USE_UUID
91b0: 0a 20 20 7b 20 22 55 75 69 64 43 72 65 61 74 65  .  { "UuidCreate
91c0: 53 65 71 75 65 6e 74 69 61 6c 22 2c 20 20 20 20  Sequential",    
91d0: 20 28 53 59 53 43 41 4c 4c 29 55 75 69 64 43 72   (SYSCALL)UuidCr
91e0: 65 61 74 65 53 65 71 75 65 6e 74 69 61 6c 2c 20  eateSequential, 
91f0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
9200: 20 22 55 75 69 64 43 72 65 61 74 65 53 65 71 75   "UuidCreateSequ
9210: 65 6e 74 69 61 6c 22 2c 20 20 20 20 20 28 53 59  ential",     (SY
9220: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
9230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
9240: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
9250: 6e 65 20 6f 73 55 75 69 64 43 72 65 61 74 65 53  ne osUuidCreateS
9260: 65 71 75 65 6e 74 69 61 6c 20 5c 0a 20 20 20 20  equential \.    
9270: 20 20 20 20 28 28 52 50 43 5f 53 54 41 54 55 53      ((RPC_STATUS
9280: 28 52 50 43 5f 45 4e 54 52 59 2a 29 28 55 55 49  (RPC_ENTRY*)(UUI
9290: 44 2a 29 29 61 53 79 73 63 61 6c 6c 5b 37 38 5d  D*))aSyscall[78]
92a0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
92b0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
92c0: 4e 4f 5f 53 59 4e 43 29 20 26 26 20 53 51 4c 49  NO_SYNC) && SQLI
92d0: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
92e0: 3e 30 0a 20 20 7b 20 22 46 6c 75 73 68 56 69 65  >0.  { "FlushVie
92f0: 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20  wOfFile",       
9300: 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6c 75 73     (SYSCALL)Flus
9310: 68 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20  hViewOfFile,    
9320: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
9330: 20 7b 20 22 46 6c 75 73 68 56 69 65 77 4f 66 46   { "FlushViewOfF
9340: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 28  ile",          (
9350: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
9360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9370: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
9380: 66 69 6e 65 20 6f 73 46 6c 75 73 68 56 69 65 77  fine osFlushView
9390: 4f 66 46 69 6c 65 20 5c 0a 20 20 20 20 20 20 20  OfFile \.       
93a0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
93b0: 28 4c 50 43 56 4f 49 44 2c 53 49 5a 45 5f 54 29  (LPCVOID,SIZE_T)
93c0: 29 61 53 79 73 63 61 6c 6c 5b 37 39 5d 2e 70 43  )aSyscall[79].pC
93d0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
93e0: 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57 49 4e 4e  ined(_WIN32_WINN
93f0: 54 29 20 26 26 20 5f 57 49 4e 33 32 5f 57 49 4e  T) && _WIN32_WIN
9400: 4e 54 20 3e 3d 20 5f 57 49 4e 33 32 5f 57 49 4e  NT >= _WIN32_WIN
9410: 4e 54 5f 56 49 53 54 41 0a 20 20 7b 20 22 44 65  NT_VISTA.  { "De
9420: 76 69 63 65 49 6f 43 6f 6e 74 72 6f 6c 22 2c 20  viceIoControl", 
9430: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
9440: 4c 29 44 65 76 69 63 65 49 6f 43 6f 6e 74 72 6f  L)DeviceIoContro
9450: 6c 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  l,        0 },.#
9460: 65 6c 73 65 0a 20 20 7b 20 22 44 65 76 69 63 65  else.  { "Device
9470: 49 6f 43 6f 6e 74 72 6f 6c 22 2c 20 20 20 20 20  IoControl",     
9480: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
9490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94a0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
94b0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 44 65 76  f..#define osDev
94c0: 69 63 65 49 6f 43 6f 6e 74 72 6f 6c 20 28 28 42  iceIoControl ((B
94d0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a  OOL(WINAPI*)( \.
94e0: 20 20 20 20 20 20 20 20 48 41 4e 44 4c 45 2c 44          HANDLE,D
94f0: 57 4f 52 44 2c 4c 50 56 4f 49 44 2c 44 57 4f 52  WORD,LPVOID,DWOR
9500: 44 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 2c 4c  D,LPVOID,DWORD,L
9510: 50 56 4f 49 44 2c 20 5c 0a 20 20 20 20 20 20 20  PVOID, \.       
9520: 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61   LPOVERLAPPED))a
9530: 53 79 73 63 61 6c 6c 5b 38 30 5d 2e 70 43 75 72  Syscall[80].pCur
9540: 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64  rent)..}; /* End
9550: 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64 65   of the override
9560: 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c  able system call
9570: 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  s */../*.** This
9580: 20 69 73 20 74 68 65 20 78 53 65 74 53 79 73 74   is the xSetSyst
9590: 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20  emCall() method 
95a0: 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66  of sqlite3_vfs f
95b0: 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a  or all of the.**
95c0: 20 22 77 69 6e 33 32 22 20 56 46 53 65 73 2e 20   "win32" VFSes. 
95d0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
95e0: 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75  K opon successfu
95f0: 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68 65  lly updating the
9600: 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  .** system call 
9610: 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49  pointer, or SQLI
9620: 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74  TE_NOTFOUND if t
9630: 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69  here is no confi
9640: 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65  gurable.** syste
9650: 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61  m call named zNa
9660: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  me..*/.static in
9670: 74 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61  t winSetSystemCa
9680: 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ll(.  sqlite3_vf
9690: 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20  s *pNotUsed,    
96a0: 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70      /* The VFS p
96b0: 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65  ointer.  Not use
96c0: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
96d0: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20  r *zName,       
96e0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
96f0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f  system call to o
9700: 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c  verride */.  sql
9710: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
9720: 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f   pNewFunc  /* Po
9730: 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73  inter to new sys
9740: 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a  tem call value *
9750: 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
9760: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20  int i;.  int rc 
9770: 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  = SQLITE_NOTFOUN
9780: 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  D;..  UNUSED_PAR
9790: 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29  AMETER(pNotUsed)
97a0: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
97b0: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f   ){.    /* If no
97c0: 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c   zName is given,
97d0: 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73   restore all sys
97e0: 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65  tem calls to the
97f0: 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a  ir default.    *
9800: 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72  * settings and r
9810: 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a  eturn NULL.    *
9820: 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
9830: 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d  E_OK;.    for(i=
9840: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73  0; i<sizeof(aSys
9850: 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79  call)/sizeof(aSy
9860: 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b  scall[0]); i++){
9870: 0a 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63  .      if( aSysc
9880: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20  all[i].pDefault 
9890: 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63  ){.        aSysc
98a0: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20  all[i].pCurrent 
98b0: 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  = aSyscall[i].pD
98c0: 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a  efault;.      }.
98d0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
98e0: 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69     /* If zName i
98f0: 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65  s specified, ope
9900: 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65  rate on only the
9910: 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   one system call
9920: 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65  .    ** specifie
9930: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
9940: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
9950: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
9960: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
9970: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
9980: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79  trcmp(zName, aSy
9990: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  scall[i].zName)=
99a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
99b0: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  ( aSyscall[i].pD
99c0: 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20  efault==0 ){.   
99d0: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
99e0: 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53  i].pDefault = aS
99f0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
9a00: 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nt;.        }.  
9a10: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
9a20: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66  E_OK;.        if
9a30: 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20  ( pNewFunc==0 ) 
9a40: 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63  pNewFunc = aSysc
9a50: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b  all[i].pDefault;
9a60: 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c  .        aSyscal
9a70: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20  l[i].pCurrent = 
9a80: 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20  pNewFunc;.      
9a90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
9aa0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
9ab0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
9ac0: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
9ad0: 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61  e of a system ca
9ae0: 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ll.  Return NULL
9af0: 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74   if zName is not
9b00: 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64   a.** recognized
9b10: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d   system call nam
9b20: 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f  e.  NULL is also
9b30: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
9b40: 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20   system call.** 
9b50: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  is currently und
9b60: 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
9b70: 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c  c sqlite3_syscal
9b80: 6c 5f 70 74 72 20 77 69 6e 47 65 74 53 79 73 74  l_ptr winGetSyst
9b90: 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65  emCall(.  sqlite
9ba0: 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c  3_vfs *pNotUsed,
9bb0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
9bc0: 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  Name.){.  unsign
9bd0: 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55  ed int i;..  UNU
9be0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
9bf0: 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69  otUsed);.  for(i
9c00: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
9c10: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
9c20: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
9c30: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
9c40: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
9c50: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [i].zName)==0 ) 
9c60: 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b  return aSyscall[
9c70: 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d  i].pCurrent;.  }
9c80: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
9c90: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
9ca0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72   name of the fir
9cb0: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61  st system call a
9cc0: 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20  fter zName.  If 
9cd0: 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74  zName==NULL.** t
9ce0: 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e  hen return the n
9cf0: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  ame of the first
9d00: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52   system call.  R
9d10: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e  eturn NULL if zN
9d20: 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61  ame.** is the la
9d30: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f  st system call o
9d40: 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f  r if zName is no
9d50: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  t the name of a 
9d60: 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20  valid.** system 
9d70: 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  call..*/.static 
9d80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 69 6e 4e  const char *winN
9d90: 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73 71  extSystemCall(sq
9da0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f  lite3_vfs *p, co
9db0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
9dc0: 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a  {.  int i = -1;.
9dd0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
9de0: 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e  TER(p);.  if( zN
9df0: 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ame ){.    for(i
9e00: 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
9e10: 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b  aSyscall)-1; i++
9e20: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
9e30: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
9e40: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
9e50: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
9e60: 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69    }.  for(i++; i
9e70: 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63  <ArraySize(aSysc
9e80: 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  all); i++){.    
9e90: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
9ea0: 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72 65  pCurrent!=0 ) re
9eb0: 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d  turn aSyscall[i]
9ec0: 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65  .zName;.  }.  re
9ed0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65  turn 0;.}..#ifde
9ee0: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  f SQLITE_WIN32_M
9ef0: 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 49 66 20 61  ALLOC./*.** If a
9f00: 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65   Win32 native he
9f10: 61 70 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66  ap has been conf
9f20: 69 67 75 72 65 64 2c 20 74 68 69 73 20 66 75 6e  igured, this fun
9f30: 63 74 69 6f 6e 20 77 69 6c 6c 20 61 74 74 65 6d  ction will attem
9f40: 70 74 20 74 6f 0a 2a 2a 20 63 6f 6d 70 61 63 74  pt to.** compact
9f50: 20 69 74 2e 20 20 55 70 6f 6e 20 73 75 63 63 65   it.  Upon succe
9f60: 73 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 77 69  ss, SQLITE_OK wi
9f70: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  ll be returned. 
9f80: 20 55 70 6f 6e 20 66 61 69 6c 75 72 65 2c 20 6f   Upon failure, o
9f90: 6e 65 0a 2a 2a 20 6f 66 20 53 51 4c 49 54 45 5f  ne.** of SQLITE_
9fa0: 4e 4f 4d 45 4d 2c 20 53 51 4c 49 54 45 5f 45 52  NOMEM, SQLITE_ER
9fb0: 52 4f 52 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e  ROR, or SQLITE_N
9fc0: 4f 54 46 4f 55 4e 44 20 77 69 6c 6c 20 62 65 20  OTFOUND will be 
9fd0: 72 65 74 75 72 6e 65 64 2e 20 20 54 68 65 0a 2a  returned.  The.*
9fe0: 2a 20 22 70 6e 4c 61 72 67 65 73 74 22 20 61 72  * "pnLargest" ar
9ff0: 67 75 6d 65 6e 74 2c 20 69 66 20 6e 6f 6e 2d 7a  gument, if non-z
a000: 65 72 6f 2c 20 77 69 6c 6c 20 62 65 20 75 73 65  ero, will be use
a010: 64 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65 20  d to return the 
a020: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6c  size of the.** l
a030: 61 72 67 65 73 74 20 63 6f 6d 6d 69 74 74 65 64  argest committed
a040: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 6e 20 74   free block in t
a050: 68 65 20 68 65 61 70 2c 20 69 6e 20 62 79 74 65  he heap, in byte
a060: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
a070: 33 5f 77 69 6e 33 32 5f 63 6f 6d 70 61 63 74 5f  3_win32_compact_
a080: 68 65 61 70 28 4c 50 55 49 4e 54 20 70 6e 4c 61  heap(LPUINT pnLa
a090: 72 67 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  rgest){.  int rc
a0a0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
a0b0: 55 49 4e 54 20 6e 4c 61 72 67 65 73 74 20 3d 20  UINT nLargest = 
a0c0: 30 3b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  0;.  HANDLE hHea
a0d0: 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65  p;..  winMemAsse
a0e0: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65  rtMagic();.  hHe
a0f0: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65  ap = winMemGetHe
a100: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ap();.  assert( 
a110: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
a120: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56  sert( hHeap!=INV
a130: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
a140: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
a150: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
a160: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
a170: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
a180: 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48  E).  assert( osH
a190: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
a1a0: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
a1b0: 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c  HEAP_FLAGS, NULL
a1c0: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) );.#endif.#if 
a1d0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
a1e0: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
a1f0: 49 4e 52 54 0a 20 20 69 66 28 20 28 6e 4c 61 72  INRT.  if( (nLar
a200: 67 65 73 74 3d 6f 73 48 65 61 70 43 6f 6d 70 61  gest=osHeapCompa
a210: 63 74 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  ct(hHeap, SQLITE
a220: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
a230: 53 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 44 57  S))==0 ){.    DW
a240: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20  ORD lastErrno = 
a250: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
a260: 3b 0a 20 20 20 20 69 66 28 20 6c 61 73 74 45 72  ;.    if( lastEr
a270: 72 6e 6f 3d 3d 4e 4f 5f 45 52 52 4f 52 20 29 7b  rno==NO_ERROR ){
a280: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  .      sqlite3_l
a290: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
a2a0: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
a2b0: 43 6f 6d 70 61 63 74 20 28 6e 6f 20 73 70 61 63  Compact (no spac
a2c0: 65 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  e), heap=%p",.  
a2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2e0: 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20  (void*)hHeap);. 
a2f0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
a300: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
a310: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
a320: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
a330: 5f 45 52 52 4f 52 2c 20 22 66 61 69 6c 65 64 20  _ERROR, "failed 
a340: 74 6f 20 48 65 61 70 43 6f 6d 70 61 63 74 20 28  to HeapCompact (
a350: 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a  %lu), heap=%p",.
a360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a370: 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72    osGetLastError
a380: 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70  (), (void*)hHeap
a390: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
a3a0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
a3b0: 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 73 71  }.  }.#else.  sq
a3c0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
a3d0: 5f 4e 4f 54 46 4f 55 4e 44 2c 20 22 66 61 69 6c  _NOTFOUND, "fail
a3e0: 65 64 20 74 6f 20 48 65 61 70 43 6f 6d 70 61 63  ed to HeapCompac
a3f0: 74 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  t, heap=%p",.   
a400: 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
a410: 2a 29 68 48 65 61 70 29 3b 0a 20 20 72 63 20 3d  *)hHeap);.  rc =
a420: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
a430: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  ;.#endif.  if( p
a440: 6e 4c 61 72 67 65 73 74 20 29 20 2a 70 6e 4c 61  nLargest ) *pnLa
a450: 72 67 65 73 74 20 3d 20 6e 4c 61 72 67 65 73 74  rgest = nLargest
a460: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
a470: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 57 69 6e  ../*.** If a Win
a480: 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 20 68  32 native heap h
a490: 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72  as been configur
a4a0: 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
a4b0: 6e 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 74  n will attempt t
a4c0: 6f 0a 2a 2a 20 64 65 73 74 72 6f 79 20 61 6e 64  o.** destroy and
a4d0: 20 72 65 63 72 65 61 74 65 20 69 74 2e 20 20 49   recreate it.  I
a4e0: 66 20 74 68 65 20 57 69 6e 33 32 20 6e 61 74 69  f the Win32 nati
a4f0: 76 65 20 68 65 61 70 20 69 73 20 6e 6f 74 20 69  ve heap is not i
a500: 73 6f 6c 61 74 65 64 20 61 6e 64 2f 6f 72 0a 2a  solated and/or.*
a510: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6d 65  * the sqlite3_me
a520: 6d 6f 72 79 5f 75 73 65 64 28 29 20 66 75 6e 63  mory_used() func
a530: 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65  tion does not re
a540: 74 75 72 6e 20 7a 65 72 6f 2c 20 53 51 4c 49 54  turn zero, SQLIT
a550: 45 5f 42 55 53 59 20 77 69 6c 6c 0a 2a 2a 20 62  E_BUSY will.** b
a560: 65 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e  e returned and n
a570: 6f 20 63 68 61 6e 67 65 73 20 77 69 6c 6c 20 62  o changes will b
a580: 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 57 69  e made to the Wi
a590: 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 2e  n32 native heap.
a5a0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
a5b0: 77 69 6e 33 32 5f 72 65 73 65 74 5f 68 65 61 70  win32_reset_heap
a5c0: 28 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  (){.  int rc;.  
a5d0: 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
a5e0: 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73  ite3_mutex *pMas
a5f0: 74 65 72 3b 20 29 20 2f 2a 20 54 68 65 20 6d 61  ter; ) /* The ma
a600: 69 6e 20 73 74 61 74 69 63 20 6d 75 74 65 78 20  in static mutex 
a610: 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43  */.  MUTEX_LOGIC
a620: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  ( sqlite3_mutex 
a630: 2a 70 4d 65 6d 3b 20 29 20 20 20 20 2f 2a 20 54  *pMem; )    /* T
a640: 68 65 20 6d 65 6d 73 79 73 20 73 74 61 74 69 63  he memsys static
a650: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 4d 55 54 45   mutex */.  MUTE
a660: 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72  X_LOGIC( pMaster
a670: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
a680: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
a690: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
a6a0: 3b 20 29 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49  ; ).  MUTEX_LOGI
a6b0: 43 28 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65  C( pMem = sqlite
a6c0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
a6d0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
a6e0: 4d 45 4d 29 3b 20 29 0a 20 20 73 71 6c 69 74 65  MEM); ).  sqlite
a6f0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
a700: 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  aster);.  sqlite
a710: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
a720: 65 6d 29 3b 0a 20 20 77 69 6e 4d 65 6d 41 73 73  em);.  winMemAss
a730: 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 69 66  ertMagic();.  if
a740: 28 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  ( winMemGetHeap(
a750: 29 21 3d 4e 55 4c 4c 20 26 26 20 77 69 6e 4d 65  )!=NULL && winMe
a760: 6d 47 65 74 4f 77 6e 65 64 28 29 20 26 26 20 73  mGetOwned() && s
a770: 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73  qlite3_memory_us
a780: 65 64 28 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  ed()==0 ){.    /
a790: 2a 0a 20 20 20 20 2a 2a 20 41 74 20 74 68 69 73  *.    ** At this
a7a0: 20 70 6f 69 6e 74 2c 20 74 68 65 72 65 20 73 68   point, there sh
a7b0: 6f 75 6c 64 20 62 65 20 6e 6f 20 6f 75 74 73 74  ould be no outst
a7c0: 61 6e 64 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c  anding memory al
a7d0: 6c 6f 63 61 74 69 6f 6e 73 20 6f 6e 0a 20 20 20  locations on.   
a7e0: 20 2a 2a 20 74 68 65 20 68 65 61 70 2e 20 20 41   ** the heap.  A
a7f0: 6c 73 6f 2c 20 73 69 6e 63 65 20 62 6f 74 68 20  lso, since both 
a800: 74 68 65 20 6d 61 73 74 65 72 20 61 6e 64 20 6d  the master and m
a810: 65 6d 73 79 73 20 6c 6f 63 6b 73 20 61 72 65 20  emsys locks are 
a820: 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20 2a 2a  currently.    **
a830: 20 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20 75   being held by u
a840: 73 2c 20 6e 6f 20 6f 74 68 65 72 20 66 75 6e 63  s, no other func
a850: 74 69 6f 6e 20 28 69 2e 65 2e 20 66 72 6f 6d 20  tion (i.e. from 
a860: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 29 20  another thread) 
a870: 73 68 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65  should.    ** be
a880: 20 61 62 6c 65 20 74 6f 20 65 76 65 6e 20 61 63   able to even ac
a890: 63 65 73 73 20 74 68 65 20 68 65 61 70 2e 20 20  cess the heap.  
a8a0: 41 74 74 65 6d 70 74 20 74 6f 20 64 65 73 74 72  Attempt to destr
a8b0: 6f 79 20 61 6e 64 20 72 65 63 72 65 61 74 65 20  oy and recreate 
a8c0: 6f 75 72 0a 20 20 20 20 2a 2a 20 69 73 6f 6c 61  our.    ** isola
a8d0: 74 65 64 20 57 69 6e 33 32 20 6e 61 74 69 76 65  ted Win32 native
a8e0: 20 68 65 61 70 20 6e 6f 77 2e 0a 20 20 20 20 2a   heap now..    *
a8f0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 69  /.    assert( wi
a900: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 21 3d 4e  nMemGetHeap()!=N
a910: 55 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ULL );.    asser
a920: 74 28 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65  t( winMemGetOwne
a930: 64 28 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  d() );.    asser
a940: 74 28 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72  t( sqlite3_memor
a950: 79 5f 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20  y_used()==0 );. 
a960: 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77     winMemShutdow
a970: 6e 28 77 69 6e 4d 65 6d 47 65 74 44 61 74 61 50  n(winMemGetDataP
a980: 74 72 28 29 29 3b 0a 20 20 20 20 61 73 73 65 72  tr());.    asser
a990: 74 28 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70  t( winMemGetHeap
a9a0: 28 29 3d 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  ()==NULL );.    
a9b0: 61 73 73 65 72 74 28 20 21 77 69 6e 4d 65 6d 47  assert( !winMemG
a9c0: 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20 20  etOwned() );.   
a9d0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a9e0: 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d  _memory_used()==
a9f0: 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 69  0 );.    rc = wi
aa00: 6e 4d 65 6d 49 6e 69 74 28 77 69 6e 4d 65 6d 47  nMemInit(winMemG
aa10: 65 74 44 61 74 61 50 74 72 28 29 29 3b 0a 20 20  etDataPtr());.  
aa20: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
aa30: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 77 69 6e 4d 65  LITE_OK || winMe
aa40: 6d 47 65 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c  mGetHeap()!=NULL
aa50: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
aa60: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
aa70: 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28   winMemGetOwned(
aa80: 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
aa90: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
aaa0: 7c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79  | sqlite3_memory
aab0: 5f 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20 20  _used()==0 );.  
aac0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 0a 20 20  }else{.    /*.  
aad0: 20 20 2a 2a 20 54 68 65 20 57 69 6e 33 32 20 6e    ** The Win32 n
aae0: 61 74 69 76 65 20 68 65 61 70 20 63 61 6e 6e 6f  ative heap canno
aaf0: 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20 62 65  t be modified be
ab00: 63 61 75 73 65 20 69 74 20 6d 61 79 20 62 65 20  cause it may be 
ab10: 69 6e 20 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  in use..    */. 
ab20: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
ab30: 55 53 59 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  USY;.  }.  sqlit
ab40: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
ab50: 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Mem);.  sqlite3_
ab60: 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
ab70: 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ter);.  return r
ab80: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
ab90: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
aba0: 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OC */../*.** Thi
abb0: 73 20 66 75 6e 63 74 69 6f 6e 20 6f 75 74 70 75  s function outpu
abc0: 74 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ts the specified
abd0: 20 28 41 4e 53 49 29 20 73 74 72 69 6e 67 20 74   (ANSI) string t
abe0: 6f 20 74 68 65 20 57 69 6e 33 32 20 64 65 62 75  o the Win32 debu
abf0: 67 67 65 72 0a 2a 2a 20 28 69 66 20 61 76 61 69  gger.** (if avai
ac00: 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 0a 76 6f 69 64  lable)..*/..void
ac10: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77   sqlite3_win32_w
ac20: 72 69 74 65 5f 64 65 62 75 67 28 63 6f 6e 73 74  rite_debug(const
ac30: 20 63 68 61 72 20 2a 7a 42 75 66 2c 20 69 6e 74   char *zBuf, int
ac40: 20 6e 42 75 66 29 7b 0a 20 20 63 68 61 72 20 7a   nBuf){.  char z
ac50: 44 62 67 42 75 66 5b 53 51 4c 49 54 45 5f 57 49  DbgBuf[SQLITE_WI
ac60: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
ac70: 5d 3b 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20  ];.  int nMin = 
ac80: 4d 49 4e 28 6e 42 75 66 2c 20 28 53 51 4c 49 54  MIN(nBuf, (SQLIT
ac90: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
aca0: 53 49 5a 45 20 2d 20 31 29 29 3b 20 2f 2a 20 6d  SIZE - 1)); /* m
acb0: 61 79 20 62 65 20 6e 65 67 61 74 69 76 65 2e 20  ay be negative. 
acc0: 2a 2f 0a 20 20 69 66 28 20 6e 4d 69 6e 3c 2d 31  */.  if( nMin<-1
acd0: 20 29 20 6e 4d 69 6e 20 3d 20 2d 31 3b 20 2f 2a   ) nMin = -1; /*
ace0: 20 61 6c 6c 20 6e 65 67 61 74 69 76 65 20 76 61   all negative va
acf0: 6c 75 65 73 20 62 65 63 6f 6d 65 20 2d 31 2e 20  lues become -1. 
ad00: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 69  */.  assert( nMi
ad10: 6e 3d 3d 2d 31 20 7c 7c 20 6e 4d 69 6e 3d 3d 30  n==-1 || nMin==0
ad20: 20 7c 7c 20 6e 4d 69 6e 3c 53 51 4c 49 54 45 5f   || nMin<SQLITE_
ad30: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
ad40: 5a 45 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  ZE );.#ifdef SQL
ad50: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
ad60: 52 4d 4f 52 0a 20 20 69 66 28 20 21 7a 42 75 66  RMOR.  if( !zBuf
ad70: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
ad80: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
ad90: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
ada0: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  }.#endif.#if def
adb0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
adc0: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 69 66  2_HAS_ANSI).  if
add0: 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20  ( nMin>0 ){.    
ade0: 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20  memset(zDbgBuf, 
adf0: 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  0, SQLITE_WIN32_
ae00: 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20  DBG_BUF_SIZE);. 
ae10: 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 67 42 75     memcpy(zDbgBu
ae20: 66 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a  f, zBuf, nMin);.
ae30: 20 20 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75      osOutputDebu
ae40: 67 53 74 72 69 6e 67 41 28 7a 44 62 67 42 75 66  gStringA(zDbgBuf
ae50: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
ae60: 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72  osOutputDebugStr
ae70: 69 6e 67 41 28 7a 42 75 66 29 3b 0a 20 20 7d 0a  ingA(zBuf);.  }.
ae80: 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51  #elif defined(SQ
ae90: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
aea0: 49 44 45 29 0a 20 20 6d 65 6d 73 65 74 28 7a 44  IDE).  memset(zD
aeb0: 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45  bgBuf, 0, SQLITE
aec0: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
aed0: 49 5a 45 29 3b 0a 20 20 69 66 20 28 20 6f 73 4d  IZE);.  if ( osM
aee0: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
aef0: 61 72 28 0a 20 20 20 20 20 20 20 20 20 20 6f 73  ar(.          os
af00: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28  AreFileApisANSI(
af10: 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f  ) ? CP_ACP : CP_
af20: 4f 45 4d 43 50 2c 20 30 2c 20 7a 42 75 66 2c 0a  OEMCP, 0, zBuf,.
af30: 20 20 20 20 20 20 20 20 20 20 6e 4d 69 6e 2c 20            nMin, 
af40: 28 4c 50 57 53 54 52 29 7a 44 62 67 42 75 66 2c  (LPWSTR)zDbgBuf,
af50: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42   SQLITE_WIN32_DB
af60: 47 5f 42 55 46 5f 53 49 5a 45 2f 73 69 7a 65 6f  G_BUF_SIZE/sizeo
af70: 66 28 57 43 48 41 52 29 29 3c 3d 30 20 29 7b 0a  f(WCHAR))<=0 ){.
af80: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
af90: 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53    osOutputDebugS
afa0: 74 72 69 6e 67 57 28 28 4c 50 43 57 53 54 52 29  tringW((LPCWSTR)
afb0: 7a 44 62 67 42 75 66 29 3b 0a 23 65 6c 73 65 0a  zDbgBuf);.#else.
afc0: 20 20 69 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a    if( nMin>0 ){.
afd0: 20 20 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42      memset(zDbgB
afe0: 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49  uf, 0, SQLITE_WI
aff0: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
b000: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44  );.    memcpy(zD
b010: 62 67 42 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69  bgBuf, zBuf, nMi
b020: 6e 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  n);.    fprintf(
b030: 73 74 64 65 72 72 2c 20 22 25 73 22 2c 20 7a 44  stderr, "%s", zD
b040: 62 67 42 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b  bgBuf);.  }else{
b050: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
b060: 65 72 72 2c 20 22 25 73 22 2c 20 7a 42 75 66 29  err, "%s", zBuf)
b070: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
b080: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
b090: 69 6e 67 20 72 6f 75 74 69 6e 65 20 73 75 73 70  ing routine susp
b0a0: 65 6e 64 73 20 74 68 65 20 63 75 72 72 65 6e 74  ends the current
b0b0: 20 74 68 72 65 61 64 20 66 6f 72 20 61 74 20 6c   thread for at l
b0c0: 65 61 73 74 20 6d 73 0a 2a 2a 20 6d 69 6c 6c 69  east ms.** milli
b0d0: 73 65 63 6f 6e 64 73 2e 20 20 54 68 69 73 20 69  seconds.  This i
b0e0: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
b0f0: 74 68 65 20 57 69 6e 33 32 20 53 6c 65 65 70 28  the Win32 Sleep(
b100: 29 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  ) interface..*/.
b110: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
b120: 4e 52 54 0a 73 74 61 74 69 63 20 48 41 4e 44 4c  NRT.static HANDL
b130: 45 20 73 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c  E sleepObj = NUL
b140: 4c 3b 0a 23 65 6e 64 69 66 0a 0a 76 6f 69 64 20  L;.#endif..void 
b150: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c  sqlite3_win32_sl
b160: 65 65 70 28 44 57 4f 52 44 20 6d 69 6c 6c 69 73  eep(DWORD millis
b170: 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 53 51 4c  econds){.#if SQL
b180: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69  ITE_OS_WINRT.  i
b190: 66 20 28 20 73 6c 65 65 70 4f 62 6a 3d 3d 4e 55  f ( sleepObj==NU
b1a0: 4c 4c 20 29 7b 0a 20 20 20 20 73 6c 65 65 70 4f  LL ){.    sleepO
b1b0: 62 6a 20 3d 20 6f 73 43 72 65 61 74 65 45 76 65  bj = osCreateEve
b1c0: 6e 74 45 78 57 28 4e 55 4c 4c 2c 20 4e 55 4c 4c  ntExW(NULL, NULL
b1d0: 2c 20 43 52 45 41 54 45 5f 45 56 45 4e 54 5f 4d  , CREATE_EVENT_M
b1e0: 41 4e 55 41 4c 5f 52 45 53 45 54 2c 0a 20 20 20  ANUAL_RESET,.   
b1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b200: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 59 4e               SYN
b210: 43 48 52 4f 4e 49 5a 45 29 3b 0a 20 20 7d 0a 20  CHRONIZE);.  }. 
b220: 20 61 73 73 65 72 74 28 20 73 6c 65 65 70 4f 62   assert( sleepOb
b230: 6a 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20 6f 73 57  j!=NULL );.  osW
b240: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
b250: 63 74 45 78 28 73 6c 65 65 70 4f 62 6a 2c 20 6d  ctEx(sleepObj, m
b260: 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 46 41 4c  illiseconds, FAL
b270: 53 45 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 53  SE);.#else.  osS
b280: 6c 65 65 70 28 6d 69 6c 6c 69 73 65 63 6f 6e 64  leep(millisecond
b290: 73 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69  s);.#endif.}..#i
b2a0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52  f SQLITE_MAX_WOR
b2b0: 4b 45 52 5f 54 48 52 45 41 44 53 3e 30 20 26 26  KER_THREADS>0 &&
b2c0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
b2d0: 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
b2e0: 57 49 4e 52 54 20 26 26 20 5c 0a 20 20 20 20 20  WINRT && \.     
b2f0: 20 20 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44     SQLITE_THREAD
b300: 53 41 46 45 3e 30 0a 44 57 4f 52 44 20 73 71 6c  SAFE>0.DWORD sql
b310: 69 74 65 33 57 69 6e 33 32 57 61 69 74 28 48 41  ite3Win32Wait(HA
b320: 4e 44 4c 45 20 68 4f 62 6a 65 63 74 29 7b 0a 20  NDLE hObject){. 
b330: 20 44 57 4f 52 44 20 72 63 3b 0a 20 20 77 68 69   DWORD rc;.  whi
b340: 6c 65 28 20 28 72 63 20 3d 20 6f 73 57 61 69 74  le( (rc = osWait
b350: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45  ForSingleObjectE
b360: 78 28 68 4f 62 6a 65 63 74 2c 20 49 4e 46 49 4e  x(hObject, INFIN
b370: 49 54 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ITE,.           
b380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b390: 20 20 20 20 20 20 20 20 20 20 20 20 54 52 55 45              TRUE
b3a0: 29 29 3d 3d 57 41 49 54 5f 49 4f 5f 43 4f 4d 50  ))==WAIT_IO_COMP
b3b0: 4c 45 54 49 4f 4e 20 29 7b 7d 0a 20 20 72 65 74  LETION ){}.  ret
b3c0: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
b3d0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
b3e0: 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69  rue (non-zero) i
b3f0: 66 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67  f we are running
b400: 20 75 6e 64 65 72 20 57 69 6e 4e 54 2c 20 57 69   under WinNT, Wi
b410: 6e 32 4b 2c 20 57 69 6e 58 50 2c 0a 2a 2a 20 6f  n2K, WinXP,.** o
b420: 72 20 57 69 6e 43 45 2e 20 20 52 65 74 75 72 6e  r WinCE.  Return
b430: 20 66 61 6c 73 65 20 28 7a 65 72 6f 29 20 66 6f   false (zero) fo
b440: 72 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20  r Win95, Win98, 
b450: 6f 72 20 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20  or WinME..**.** 
b460: 48 65 72 65 20 69 73 20 61 6e 20 69 6e 74 65 72  Here is an inter
b470: 65 73 74 69 6e 67 20 6f 62 73 65 72 76 61 74 69  esting observati
b480: 6f 6e 3a 20 20 57 69 6e 39 35 2c 20 57 69 6e 39  on:  Win95, Win9
b490: 38 2c 20 61 6e 64 20 57 69 6e 4d 45 20 6c 61 63  8, and WinME lac
b4a0: 6b 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c  k.** the LockFil
b4b0: 65 45 78 28 29 20 41 50 49 2e 20 20 42 75 74 20  eEx() API.  But 
b4c0: 77 65 20 63 61 6e 20 73 74 69 6c 6c 20 73 74 61  we can still sta
b4d0: 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 20 61 67 61  tically link aga
b4e0: 69 6e 73 74 20 74 68 61 74 0a 2a 2a 20 41 50 49  inst that.** API
b4f0: 20 61 73 20 6c 6f 6e 67 20 61 73 20 77 65 20 64   as long as we d
b500: 6f 6e 27 74 20 63 61 6c 6c 20 69 74 20 77 68 65  on't call it whe
b510: 6e 20 72 75 6e 6e 69 6e 67 20 57 69 6e 39 35 2f  n running Win95/
b520: 39 38 2f 4d 45 2e 20 20 41 20 63 61 6c 6c 20 74  98/ME.  A call t
b530: 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  o.** this routin
b540: 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
b550: 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 68 6f  ermine if the ho
b560: 73 74 20 69 73 20 57 69 6e 39 35 2f 39 38 2f 4d  st is Win95/98/M
b570: 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b  E or.** WinNT/2K
b580: 2f 58 50 20 73 6f 20 74 68 61 74 20 77 65 20 77  /XP so that we w
b590: 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 74 68 65 72  ill know whether
b5a0: 20 6f 72 20 6e 6f 74 20 77 65 20 63 61 6e 20 73   or not we can s
b5b0: 61 66 65 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74 68  afely call.** th
b5c0: 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41  e LockFileEx() A
b5d0: 50 49 2e 0a 2a 2f 0a 0a 23 69 66 20 21 53 51 4c  PI..*/..#if !SQL
b5e0: 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52  ITE_WIN32_GETVER
b5f0: 53 49 4f 4e 45 58 0a 23 20 64 65 66 69 6e 65 20  SIONEX.# define 
b600: 6f 73 49 73 4e 54 28 29 20 20 28 31 29 0a 23 65  osIsNT()  (1).#e
b610: 6c 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  lif SQLITE_OS_WI
b620: 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53  NCE || SQLITE_OS
b630: 5f 57 49 4e 52 54 20 7c 7c 20 21 64 65 66 69 6e  _WINRT || !defin
b640: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
b650: 48 41 53 5f 41 4e 53 49 29 0a 23 20 64 65 66 69  HAS_ANSI).# defi
b660: 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28 31 29  ne osIsNT()  (1)
b670: 0a 23 65 6c 69 66 20 21 64 65 66 69 6e 65 64 28  .#elif !defined(
b680: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
b690: 5f 57 49 44 45 29 0a 23 20 64 65 66 69 6e 65 20  _WIDE).# define 
b6a0: 6f 73 49 73 4e 54 28 29 20 20 28 30 29 0a 23 65  osIsNT()  (0).#e
b6b0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 6f 73 49  lse.# define osI
b6c0: 73 4e 54 28 29 20 20 28 28 73 71 6c 69 74 65 33  sNT()  ((sqlite3
b6d0: 5f 6f 73 5f 74 79 70 65 3d 3d 32 29 20 7c 7c 20  _os_type==2) || 
b6e0: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 69 73  sqlite3_win32_is
b6f0: 5f 6e 74 28 29 29 0a 23 65 6e 64 69 66 0a 0a 2f  _nt()).#endif../
b700: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
b710: 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66  on determines if
b720: 20 74 68 65 20 6d 61 63 68 69 6e 65 20 69 73 20   the machine is 
b730: 72 75 6e 6e 69 6e 67 20 61 20 76 65 72 73 69 6f  running a versio
b740: 6e 20 6f 66 20 57 69 6e 64 6f 77 73 0a 2a 2a 20  n of Windows.** 
b750: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 4e 54 20  based on the NT 
b760: 6b 65 72 6e 65 6c 2e 0a 2a 2f 0a 69 6e 74 20 73  kernel..*/.int s
b770: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 69 73 5f  qlite3_win32_is_
b780: 6e 74 28 76 6f 69 64 29 7b 0a 23 69 66 20 53 51  nt(void){.#if SQ
b790: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
b7a0: 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 54 68  /*.  ** NOTE: Th
b7b0: 65 20 57 69 6e 52 54 20 73 75 62 2d 70 6c 61 74  e WinRT sub-plat
b7c0: 66 6f 72 6d 20 69 73 20 61 6c 77 61 79 73 20 61  form is always a
b7d0: 73 73 75 6d 65 64 20 74 6f 20 62 65 20 62 61 73  ssumed to be bas
b7e0: 65 64 20 6f 6e 20 74 68 65 20 4e 54 0a 20 20 2a  ed on the NT.  *
b7f0: 2a 20 20 20 20 20 20 20 6b 65 72 6e 65 6c 2e 0a  *       kernel..
b800: 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b    */.  return 1;
b810: 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 57 49  .#elif SQLITE_WI
b820: 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58  N32_GETVERSIONEX
b830: 0a 20 20 69 66 28 20 6f 73 49 6e 74 65 72 6c 6f  .  if( osInterlo
b840: 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61  ckedCompareExcha
b850: 6e 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f  nge(&sqlite3_os_
b860: 74 79 70 65 2c 20 30 2c 20 30 29 3d 3d 30 20 29  type, 0, 0)==0 )
b870: 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  {.#if defined(SQ
b880: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
b890: 4e 53 49 29 0a 20 20 20 20 4f 53 56 45 52 53 49  NSI).    OSVERSI
b8a0: 4f 4e 49 4e 46 4f 41 20 73 49 6e 66 6f 3b 0a 20  ONINFOA sInfo;. 
b8b0: 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72     sInfo.dwOSVer
b8c0: 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73  sionInfoSize = s
b8d0: 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20  izeof(sInfo);.  
b8e0: 20 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78    osGetVersionEx
b8f0: 41 28 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f  A(&sInfo);.    o
b900: 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70  sInterlockedComp
b910: 61 72 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c  areExchange(&sql
b920: 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 0a 20 20  ite3_os_type,.  
b930: 20 20 20 20 20 20 28 73 49 6e 66 6f 2e 64 77 50        (sInfo.dwP
b940: 6c 61 74 66 6f 72 6d 49 64 20 3d 3d 20 56 45 52  latformId == VER
b950: 5f 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f  _PLATFORM_WIN32_
b960: 4e 54 29 20 3f 20 32 20 3a 20 31 2c 20 30 29 3b  NT) ? 2 : 1, 0);
b970: 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
b980: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
b990: 57 49 44 45 29 0a 20 20 20 20 4f 53 56 45 52 53  WIDE).    OSVERS
b9a0: 49 4f 4e 49 4e 46 4f 57 20 73 49 6e 66 6f 3b 0a  IONINFOW sInfo;.
b9b0: 20 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65      sInfo.dwOSVe
b9c0: 72 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20  rsionInfoSize = 
b9d0: 73 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20  sizeof(sInfo);. 
b9e0: 20 20 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45     osGetVersionE
b9f0: 78 57 28 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20  xW(&sInfo);.    
ba00: 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d  osInterlockedCom
ba10: 70 61 72 65 45 78 63 68 61 6e 67 65 28 26 73 71  pareExchange(&sq
ba20: 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 0a 20  lite3_os_type,. 
ba30: 20 20 20 20 20 20 20 28 73 49 6e 66 6f 2e 64 77         (sInfo.dw
ba40: 50 6c 61 74 66 6f 72 6d 49 64 20 3d 3d 20 56 45  PlatformId == VE
ba50: 52 5f 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32  R_PLATFORM_WIN32
ba60: 5f 4e 54 29 20 3f 20 32 20 3a 20 31 2c 20 30 29  _NT) ? 2 : 1, 0)
ba70: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72  ;.#endif.  }.  r
ba80: 65 74 75 72 6e 20 6f 73 49 6e 74 65 72 6c 6f 63  eturn osInterloc
ba90: 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e  kedCompareExchan
baa0: 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74  ge(&sqlite3_os_t
bab0: 79 70 65 2c 20 32 2c 20 32 29 3d 3d 32 3b 0a 23  ype, 2, 2)==2;.#
bac0: 65 6c 69 66 20 53 51 4c 49 54 45 5f 54 45 53 54  elif SQLITE_TEST
bad0: 0a 20 20 72 65 74 75 72 6e 20 6f 73 49 6e 74 65  .  return osInte
bae0: 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78  rlockedCompareEx
baf0: 63 68 61 6e 67 65 28 26 73 71 6c 69 74 65 33 5f  change(&sqlite3_
bb00: 6f 73 5f 74 79 70 65 2c 20 32 2c 20 32 29 3d 3d  os_type, 2, 2)==
bb10: 32 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 0a 20 20  2;.#else.  /*.  
bb20: 2a 2a 20 4e 4f 54 45 3a 20 41 6c 6c 20 73 75 62  ** NOTE: All sub
bb30: 2d 70 6c 61 74 66 6f 72 6d 73 20 77 68 65 72 65  -platforms where
bb40: 20 74 68 65 20 47 65 74 56 65 72 73 69 6f 6e 45   the GetVersionE
bb50: 78 5b 41 57 5d 20 66 75 6e 63 74 69 6f 6e 73 20  x[AW] functions 
bb60: 61 72 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 64  are.  **       d
bb70: 65 70 72 65 63 61 74 65 64 20 61 72 65 20 61 6c  eprecated are al
bb80: 77 61 79 73 20 61 73 73 75 6d 65 64 20 74 6f 20  ways assumed to 
bb90: 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  be based on the 
bba0: 4e 54 20 6b 65 72 6e 65 6c 2e 0a 20 20 2a 2f 0a  NT kernel..  */.
bbb0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64    return 1;.#end
bbc0: 69 66 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  if.}..#ifdef SQL
bbd0: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
bbe0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
bbf0: 6e 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79  nBytes of memory
bc00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
bc10: 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69   *winMemMalloc(i
bc20: 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41  nt nBytes){.  HA
bc30: 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f  NDLE hHeap;.  vo
bc40: 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d  id *p;..  winMem
bc50: 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20  AssertMagic();. 
bc60: 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47   hHeap = winMemG
bc70: 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65  etHeap();.  asse
bc80: 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a  rt( hHeap!=0 );.
bc90: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
bca0: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
bcb0: 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51  VALUE );.#if !SQ
bcc0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
bcd0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
bce0: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c  WIN32_MALLOC_VAL
bcf0: 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28  IDATE).  assert(
bd00: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28   osHeapValidate(
bd10: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
bd20: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
bd30: 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a  NULL) );.#endif.
bd40: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 73    assert( nBytes
bd50: 3e 3d 30 20 29 3b 0a 20 20 70 20 3d 20 6f 73 48  >=0 );.  p = osH
bd60: 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20  eapAlloc(hHeap, 
bd70: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
bd80: 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54  P_FLAGS, (SIZE_T
bd90: 29 6e 42 79 74 65 73 29 3b 0a 20 20 69 66 28 20  )nBytes);.  if( 
bda0: 21 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  !p ){.    sqlite
bdb0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d  3_log(SQLITE_NOM
bdc0: 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48  EM, "failed to H
bdd0: 65 61 70 41 6c 6c 6f 63 20 25 75 20 62 79 74 65  eapAlloc %u byte
bde0: 73 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70  s (%lu), heap=%p
bdf0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
be00: 20 20 20 6e 42 79 74 65 73 2c 20 6f 73 47 65 74     nBytes, osGet
be10: 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f  LastError(), (vo
be20: 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a  id*)hHeap);.  }.
be30: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
be40: 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79  *.** Free memory
be50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
be60: 20 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64   winMemFree(void
be70: 20 2a 70 50 72 69 6f 72 29 7b 0a 20 20 48 41 4e   *pPrior){.  HAN
be80: 44 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20 77 69  DLE hHeap;..  wi
be90: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
bea0: 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e  );.  hHeap = win
beb0: 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20  MemGetHeap();.  
bec0: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30  assert( hHeap!=0
bed0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48   );.  assert( hH
bee0: 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  eap!=INVALID_HAN
bef0: 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66  DLE_VALUE );.#if
bf00: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
bf10: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
bf20: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
bf30: 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73  _VALIDATE).  ass
bf40: 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64  ert( osHeapValid
bf50: 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54  ate(hHeap, SQLIT
bf60: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
bf70: 47 53 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23  GS, pPrior) );.#
bf80: 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70 50 72  endif.  if( !pPr
bf90: 69 6f 72 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a  ior ) return; /*
bfa0: 20 50 61 73 73 69 6e 67 20 4e 55 4c 4c 20 74 6f   Passing NULL to
bfb0: 20 48 65 61 70 46 72 65 65 20 69 73 20 75 6e 64   HeapFree is und
bfc0: 65 66 69 6e 65 64 2e 20 2a 2f 0a 20 20 69 66 28  efined. */.  if(
bfd0: 20 21 6f 73 48 65 61 70 46 72 65 65 28 68 48 65   !osHeapFree(hHe
bfe0: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
bff0: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72  _HEAP_FLAGS, pPr
c000: 69 6f 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ior) ){.    sqli
c010: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
c020: 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f  OMEM, "failed to
c030: 20 48 65 61 70 46 72 65 65 20 62 6c 6f 63 6b 20   HeapFree block 
c040: 25 70 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25  %p (%lu), heap=%
c050: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
c060: 20 20 20 20 70 50 72 69 6f 72 2c 20 6f 73 47 65      pPrior, osGe
c070: 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76  tLastError(), (v
c080: 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d  oid*)hHeap);.  }
c090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
c0a0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20   the size of an 
c0b0: 65 78 69 73 74 69 6e 67 20 6d 65 6d 6f 72 79 20  existing memory 
c0c0: 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74  allocation.*/.st
c0d0: 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65  atic void *winMe
c0e0: 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70  mRealloc(void *p
c0f0: 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65  Prior, int nByte
c100: 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65  s){.  HANDLE hHe
c110: 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a  ap;.  void *p;..
c120: 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61    winMemAssertMa
c130: 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d  gic();.  hHeap =
c140: 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29   winMemGetHeap()
c150: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
c160: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
c170: 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44  ( hHeap!=INVALID
c180: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b  _HANDLE_VALUE );
c190: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
c1a0: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
c1b0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
c1c0: 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20  LLOC_VALIDATE). 
c1d0: 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56   assert( osHeapV
c1e0: 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53  alidate(hHeap, S
c1f0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
c200: 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20  _FLAGS, pPrior) 
c210: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
c220: 72 74 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b  rt( nBytes>=0 );
c230: 0a 20 20 69 66 28 20 21 70 50 72 69 6f 72 20 29  .  if( !pPrior )
c240: 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70  {.    p = osHeap
c250: 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c  Alloc(hHeap, SQL
c260: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
c270: 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42  LAGS, (SIZE_T)nB
c280: 79 74 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ytes);.  }else{.
c290: 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70 52 65      p = osHeapRe
c2a0: 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c  Alloc(hHeap, SQL
c2b0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
c2c0: 4c 41 47 53 2c 20 70 50 72 69 6f 72 2c 20 28 53  LAGS, pPrior, (S
c2d0: 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20  IZE_T)nBytes);. 
c2e0: 20 7d 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20   }.  if( !p ){. 
c2f0: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
c300: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61  QLITE_NOMEM, "fa
c310: 69 6c 65 64 20 74 6f 20 25 73 20 25 75 20 62 79  iled to %s %u by
c320: 74 65 73 20 28 25 6c 75 29 2c 20 68 65 61 70 3d  tes (%lu), heap=
c330: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
c340: 20 20 20 20 20 70 50 72 69 6f 72 20 3f 20 22 48       pPrior ? "H
c350: 65 61 70 52 65 41 6c 6c 6f 63 22 20 3a 20 22 48  eapReAlloc" : "H
c360: 65 61 70 41 6c 6c 6f 63 22 2c 20 6e 42 79 74 65  eapAlloc", nByte
c370: 73 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  s, osGetLastErro
c380: 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
c390: 20 20 20 20 20 28 76 6f 69 64 2a 29 68 48 65 61       (void*)hHea
c3a0: 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
c3b0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   p;.}../*.** Ret
c3c0: 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
c3d0: 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 61  an outstanding a
c3e0: 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 62 79  llocation, in by
c3f0: 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tes..*/.static i
c400: 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f  nt winMemSize(vo
c410: 69 64 20 2a 70 29 7b 0a 20 20 48 41 4e 44 4c 45  id *p){.  HANDLE
c420: 20 68 48 65 61 70 3b 0a 20 20 53 49 5a 45 5f 54   hHeap;.  SIZE_T
c430: 20 6e 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73   n;..  winMemAss
c440: 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48  ertMagic();.  hH
c450: 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48  eap = winMemGetH
c460: 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28  eap();.  assert(
c470: 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61   hHeap!=0 );.  a
c480: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e  ssert( hHeap!=IN
c490: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
c4a0: 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54  UE );.#if !SQLIT
c4b0: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
c4c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
c4d0: 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41  32_MALLOC_VALIDA
c4e0: 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73  TE).  assert( os
c4f0: 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65  HeapValidate(hHe
c500: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
c510: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 29 20  _HEAP_FLAGS, p) 
c520: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  );.#endif.  if( 
c530: 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  !p ) return 0;. 
c540: 20 6e 20 3d 20 6f 73 48 65 61 70 53 69 7a 65 28   n = osHeapSize(
c550: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
c560: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
c570: 70 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 28 53 49  p);.  if( n==(SI
c580: 5a 45 5f 54 29 2d 31 20 29 7b 0a 20 20 20 20 73  ZE_T)-1 ){.    s
c590: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
c5a0: 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64  E_NOMEM, "failed
c5b0: 20 74 6f 20 48 65 61 70 53 69 7a 65 20 62 6c 6f   to HeapSize blo
c5c0: 63 6b 20 25 70 20 28 25 6c 75 29 2c 20 68 65 61  ck %p (%lu), hea
c5d0: 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20  p=%p",.         
c5e0: 20 20 20 20 20 20 20 70 2c 20 6f 73 47 65 74 4c         p, osGetL
c5f0: 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69  astError(), (voi
c600: 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20 72  d*)hHeap);.    r
c610: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
c620: 65 74 75 72 6e 20 28 69 6e 74 29 6e 3b 0a 7d 0a  eturn (int)n;.}.
c630: 0a 2f 2a 0a 2a 2a 20 52 6f 75 6e 64 20 75 70 20  ./*.** Round up 
c640: 61 20 72 65 71 75 65 73 74 20 73 69 7a 65 20 74  a request size t
c650: 6f 20 74 68 65 20 6e 65 78 74 20 76 61 6c 69 64  o the next valid
c660: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65   allocation size
c670: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c680: 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e  winMemRoundup(in
c690: 74 20 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20 6e  t n){.  return n
c6a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
c6b0: 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c  alize this modul
c6c0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
c6d0: 20 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64   winMemInit(void
c6e0: 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20 77   *pAppData){.  w
c6f0: 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d  inMemData *pWinM
c700: 65 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d  emData = (winMem
c710: 44 61 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b  Data *)pAppData;
c720: 0a 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d  ..  if( !pWinMem
c730: 44 61 74 61 20 29 20 72 65 74 75 72 6e 20 53 51  Data ) return SQ
c740: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 61 73  LITE_ERROR;.  as
c750: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
c760: 61 2d 3e 6d 61 67 69 63 31 3d 3d 57 49 4e 4d 45  a->magic1==WINME
c770: 4d 5f 4d 41 47 49 43 31 20 29 3b 0a 20 20 61 73  M_MAGIC1 );.  as
c780: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
c790: 61 2d 3e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d 45  a->magic2==WINME
c7a0: 4d 5f 4d 41 47 49 43 32 20 29 3b 0a 0a 23 69 66  M_MAGIC2 );..#if
c7b0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
c7c0: 54 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33  T && SQLITE_WIN3
c7d0: 32 5f 48 45 41 50 5f 43 52 45 41 54 45 0a 20 20  2_HEAP_CREATE.  
c7e0: 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  if( !pWinMemData
c7f0: 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 44  ->hHeap ){.    D
c800: 57 4f 52 44 20 64 77 49 6e 69 74 69 61 6c 53 69  WORD dwInitialSi
c810: 7a 65 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33  ze = SQLITE_WIN3
c820: 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45  2_HEAP_INIT_SIZE
c830: 3b 0a 20 20 20 20 44 57 4f 52 44 20 64 77 4d 61  ;.    DWORD dwMa
c840: 78 69 6d 75 6d 53 69 7a 65 20 3d 20 28 44 57 4f  ximumSize = (DWO
c850: 52 44 29 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  RD)sqlite3Global
c860: 43 6f 6e 66 69 67 2e 6e 48 65 61 70 3b 0a 20 20  Config.nHeap;.  
c870: 20 20 69 66 28 20 64 77 4d 61 78 69 6d 75 6d 53    if( dwMaximumS
c880: 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize==0 ){.      
c890: 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 20 3d 20  dwMaximumSize = 
c8a0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
c8b0: 50 5f 4d 41 58 5f 53 49 5a 45 3b 0a 20 20 20 20  P_MAX_SIZE;.    
c8c0: 7d 65 6c 73 65 20 69 66 28 20 64 77 49 6e 69 74  }else if( dwInit
c8d0: 69 61 6c 53 69 7a 65 3e 64 77 4d 61 78 69 6d 75  ialSize>dwMaximu
c8e0: 6d 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 64  mSize ){.      d
c8f0: 77 49 6e 69 74 69 61 6c 53 69 7a 65 20 3d 20 64  wInitialSize = d
c900: 77 4d 61 78 69 6d 75 6d 53 69 7a 65 3b 0a 20 20  wMaximumSize;.  
c910: 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44    }.    pWinMemD
c920: 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73 48  ata->hHeap = osH
c930: 65 61 70 43 72 65 61 74 65 28 53 51 4c 49 54 45  eapCreate(SQLITE
c940: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
c950: 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
c960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c970: 20 20 20 20 20 20 20 20 20 64 77 49 6e 69 74 69           dwIniti
c980: 61 6c 53 69 7a 65 2c 20 64 77 4d 61 78 69 6d 75  alSize, dwMaximu
c990: 6d 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  mSize);.    if( 
c9a0: 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  !pWinMemData->hH
c9b0: 65 61 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  eap ){.      sql
c9c0: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
c9d0: 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20 20  NOMEM,.         
c9e0: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
c9f0: 43 72 65 61 74 65 20 28 25 6c 75 29 2c 20 66 6c  Create (%lu), fl
ca00: 61 67 73 3d 25 75 2c 20 69 6e 69 74 53 69 7a 65  ags=%u, initSize
ca10: 3d 25 6c 75 2c 20 6d 61 78 53 69 7a 65 3d 25 6c  =%lu, maxSize=%l
ca20: 75 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6f 73  u",.          os
ca30: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
ca40: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
ca50: 50 5f 46 4c 41 47 53 2c 20 64 77 49 6e 69 74 69  P_FLAGS, dwIniti
ca60: 61 6c 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  alSize,.        
ca70: 20 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 29    dwMaximumSize)
ca80: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
ca90: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
caa0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e  ;.    }.    pWin
cab0: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
cac0: 3d 20 54 52 55 45 3b 0a 20 20 20 20 61 73 73 65  = TRUE;.    asse
cad0: 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  rt( pWinMemData-
cae0: 3e 62 4f 77 6e 65 64 20 29 3b 0a 20 20 7d 0a 23  >bOwned );.  }.#
caf0: 65 6c 73 65 0a 20 20 70 57 69 6e 4d 65 6d 44 61  else.  pWinMemDa
cb00: 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73 47 65  ta->hHeap = osGe
cb10: 74 50 72 6f 63 65 73 73 48 65 61 70 28 29 3b 0a  tProcessHeap();.
cb20: 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61    if( !pWinMemDa
cb30: 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20  ta->hHeap ){.   
cb40: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
cb50: 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20  ITE_NOMEM,.     
cb60: 20 20 20 22 66 61 69 6c 65 64 20 74 6f 20 47 65     "failed to Ge
cb70: 74 50 72 6f 63 65 73 73 48 65 61 70 20 28 25 6c  tProcessHeap (%l
cb80: 75 29 22 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  u)", osGetLastEr
cb90: 72 6f 72 28 29 29 3b 0a 20 20 20 20 72 65 74 75  ror());.    retu
cba0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
cbb0: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 57 69 6e  BKPT;.  }.  pWin
cbc0: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
cbd0: 3d 20 46 41 4c 53 45 3b 0a 20 20 61 73 73 65 72  = FALSE;.  asser
cbe0: 74 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d  t( !pWinMemData-
cbf0: 3e 62 4f 77 6e 65 64 20 29 3b 0a 23 65 6e 64 69  >bOwned );.#endi
cc00: 66 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e  f.  assert( pWin
cc10: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d  MemData->hHeap!=
cc20: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
cc30: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
cc40: 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  p!=INVALID_HANDL
cc50: 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21  E_VALUE );.#if !
cc60: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
cc70: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
cc80: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
cc90: 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72  ALIDATE).  asser
cca0: 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74  t( osHeapValidat
ccb0: 65 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  e(pWinMemData->h
ccc0: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
ccd0: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e  32_HEAP_FLAGS, N
cce0: 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  ULL) );.#endif. 
ccf0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
cd00: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e  K;.}../*.** Dein
cd10: 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f  itialize this mo
cd20: 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dule..*/.static 
cd30: 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64  void winMemShutd
cd40: 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61  own(void *pAppDa
cd50: 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74  ta){.  winMemDat
cd60: 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d  a *pWinMemData =
cd70: 20 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70   (winMemData *)p
cd80: 41 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20  AppData;..  if( 
cd90: 21 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72  !pWinMemData ) r
cda0: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
cdb0: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61   pWinMemData->ma
cdc0: 67 69 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47  gic1==WINMEM_MAG
cdd0: 49 43 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IC1 );.  assert(
cde0: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61   pWinMemData->ma
cdf0: 67 69 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47  gic2==WINMEM_MAG
ce00: 49 43 32 20 29 3b 0a 0a 20 20 69 66 28 20 70 57  IC2 );..  if( pW
ce10: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
ce20: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
ce30: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
ce40: 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ap!=INVALID_HAND
ce50: 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20  LE_VALUE );.#if 
ce60: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
ce70: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
ce80: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f  TE_WIN32_MALLOC_
ce90: 56 41 4c 49 44 41 54 45 29 0a 20 20 20 20 61 73  VALIDATE).    as
cea0: 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69  sert( osHeapVali
ceb0: 64 61 74 65 28 70 57 69 6e 4d 65 6d 44 61 74 61  date(pWinMemData
cec0: 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  ->hHeap, SQLITE_
ced0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
cee0: 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69  , NULL) );.#endi
cef0: 66 0a 20 20 20 20 69 66 28 20 70 57 69 6e 4d 65  f.    if( pWinMe
cf00: 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 7b  mData->bOwned ){
cf10: 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73 48 65  .      if( !osHe
cf20: 61 70 44 65 73 74 72 6f 79 28 70 57 69 6e 4d 65  apDestroy(pWinMe
cf30: 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 20 29 7b  mData->hHeap) ){
cf40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
cf50: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
cf60: 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  M, "failed to He
cf70: 61 70 44 65 73 74 72 6f 79 20 28 25 6c 75 29 2c  apDestroy (%lu),
cf80: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
cf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
cfa0: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
cfb0: 20 28 76 6f 69 64 2a 29 70 57 69 6e 4d 65 6d 44   (void*)pWinMemD
cfc0: 61 74 61 2d 3e 68 48 65 61 70 29 3b 0a 20 20 20  ata->hHeap);.   
cfd0: 20 20 20 7d 0a 20 20 20 20 20 20 70 57 69 6e 4d     }.      pWinM
cfe0: 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d  emData->bOwned =
cff0: 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20   FALSE;.    }.  
d000: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68    pWinMemData->h
d010: 48 65 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  Heap = NULL;.  }
d020: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61  .}../*.** Popula
d030: 74 65 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65 6c  te the low-level
d040: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
d050: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e  on function poin
d060: 74 65 72 73 20 69 6e 0a 2a 2a 20 73 71 6c 69 74  ters in.** sqlit
d070: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
d080: 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74   with pointers t
d090: 6f 20 74 68 65 20 72 6f 75 74 69 6e 65 73 20 69  o the routines i
d0a0: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 54 68 65  n this file. The
d0b0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 73 70  .** arguments sp
d0c0: 65 63 69 66 79 20 74 68 65 20 62 6c 6f 63 6b 20  ecify the block 
d0d0: 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6d 61 6e  of memory to man
d0e0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  age..**.** This 
d0f0: 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
d100: 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65  called by sqlite
d110: 33 5f 63 6f 6e 66 69 67 28 29 2c 20 61 6e 64 20  3_config(), and 
d120: 74 68 65 72 65 66 6f 72 65 0a 2a 2a 20 69 73 20  therefore.** is 
d130: 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f 20  not required to 
d140: 62 65 20 74 68 72 65 61 64 73 61 66 65 20 28 69  be threadsafe (i
d150: 74 20 69 73 20 6e 6f 74 29 2e 0a 2a 2f 0a 63 6f  t is not)..*/.co
d160: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  nst sqlite3_mem_
d170: 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74 65 33  methods *sqlite3
d180: 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f 69 64  MemGetWin32(void
d190: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
d1a0: 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  t sqlite3_mem_me
d1b0: 74 68 6f 64 73 20 77 69 6e 4d 65 6d 4d 65 74 68  thods winMemMeth
d1c0: 6f 64 73 20 3d 20 7b 0a 20 20 20 20 77 69 6e 4d  ods = {.    winM
d1d0: 65 6d 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69  emMalloc,.    wi
d1e0: 6e 4d 65 6d 46 72 65 65 2c 0a 20 20 20 20 77 69  nMemFree,.    wi
d1f0: 6e 4d 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20 20 20  nMemRealloc,.   
d200: 20 77 69 6e 4d 65 6d 53 69 7a 65 2c 0a 20 20 20   winMemSize,.   
d210: 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 2c 0a   winMemRoundup,.
d220: 20 20 20 20 77 69 6e 4d 65 6d 49 6e 69 74 2c 0a      winMemInit,.
d230: 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f      winMemShutdo
d240: 77 6e 2c 0a 20 20 20 20 26 77 69 6e 5f 6d 65 6d  wn,.    &win_mem
d250: 5f 64 61 74 61 0a 20 20 7d 3b 0a 20 20 72 65 74  _data.  };.  ret
d260: 75 72 6e 20 26 77 69 6e 4d 65 6d 4d 65 74 68 6f  urn &winMemMetho
d270: 64 73 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69  ds;.}..void sqli
d280: 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74  te3MemSetDefault
d290: 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
d2a0: 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
d2b0: 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2c 20 73  CONFIG_MALLOC, s
d2c0: 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33  qlite3MemGetWin3
d2d0: 32 28 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  2());.}.#endif /
d2e0: 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  * SQLITE_WIN32_M
d2f0: 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ALLOC */../*.** 
d300: 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20  Convert a UTF-8 
d310: 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73  string to Micros
d320: 6f 66 74 20 55 6e 69 63 6f 64 65 2e 0a 2a 2a 0a  oft Unicode..**.
d330: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
d340: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
d350: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
d360: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
d370: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  lloc()..*/.stati
d380: 63 20 4c 50 57 53 54 52 20 77 69 6e 55 74 66 38  c LPWSTR winUtf8
d390: 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20  ToUnicode(const 
d3a0: 63 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a 20 20  char *zText){.  
d3b0: 69 6e 74 20 6e 43 68 61 72 3b 0a 20 20 4c 50 57  int nChar;.  LPW
d3c0: 53 54 52 20 7a 57 69 64 65 54 65 78 74 3b 0a 0a  STR zWideText;..
d3d0: 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74    nChar = osMult
d3e0: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
d3f0: 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 54 65 78  CP_UTF8, 0, zTex
d400: 74 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b  t, -1, NULL, 0);
d410: 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30 20  .  if( nChar==0 
d420: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
d430: 0a 20 20 7d 0a 20 20 7a 57 69 64 65 54 65 78 74  .  }.  zWideText
d440: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
d450: 5a 65 72 6f 28 20 6e 43 68 61 72 2a 73 69 7a 65  Zero( nChar*size
d460: 6f 66 28 57 43 48 41 52 29 20 29 3b 0a 20 20 69  of(WCHAR) );.  i
d470: 66 28 20 7a 57 69 64 65 54 65 78 74 3d 3d 30 20  f( zWideText==0 
d480: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
d490: 0a 20 20 7d 0a 20 20 6e 43 68 61 72 20 3d 20 6f  .  }.  nChar = o
d4a0: 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65  sMultiByteToWide
d4b0: 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c  Char(CP_UTF8, 0,
d4c0: 20 7a 54 65 78 74 2c 20 2d 31 2c 20 7a 57 69 64   zText, -1, zWid
d4d0: 65 54 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20  eText,.         
d4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4f0: 20 20 20 20 20 20 20 6e 43 68 61 72 29 3b 0a 20         nChar);. 
d500: 20 69 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b   if( nChar==0 ){
d510: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
d520: 65 28 7a 57 69 64 65 54 65 78 74 29 3b 0a 20 20  e(zWideText);.  
d530: 20 20 7a 57 69 64 65 54 65 78 74 20 3d 20 30 3b    zWideText = 0;
d540: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 57  .  }.  return zW
d550: 69 64 65 54 65 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  ideText;.}../*.*
d560: 2a 20 43 6f 6e 76 65 72 74 20 61 20 4d 69 63 72  * Convert a Micr
d570: 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 73 74  osoft Unicode st
d580: 72 69 6e 67 20 74 6f 20 55 54 46 2d 38 2e 0a 2a  ring to UTF-8..*
d590: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
d5a0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
d5b0: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
d5c0: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
d5d0: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61  malloc()..*/.sta
d5e0: 74 69 63 20 63 68 61 72 20 2a 77 69 6e 55 6e 69  tic char *winUni
d5f0: 63 6f 64 65 54 6f 55 74 66 38 28 4c 50 43 57 53  codeToUtf8(LPCWS
d600: 54 52 20 7a 57 69 64 65 54 65 78 74 29 7b 0a 20  TR zWideText){. 
d610: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68   int nByte;.  ch
d620: 61 72 20 2a 7a 54 65 78 74 3b 0a 0a 20 20 6e 42  ar *zText;..  nB
d630: 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72  yte = osWideChar
d640: 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55  ToMultiByte(CP_U
d650: 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 54 65 78  TF8, 0, zWideTex
d660: 74 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20  t, -1, 0, 0, 0, 
d670: 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20  0);.  if( nByte 
d680: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75  == 0 ){.    retu
d690: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 54 65 78  rn 0;.  }.  zTex
d6a0: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
d6b0: 63 5a 65 72 6f 28 20 6e 42 79 74 65 20 29 3b 0a  cZero( nByte );.
d6c0: 20 20 69 66 28 20 7a 54 65 78 74 3d 3d 30 20 29    if( zText==0 )
d6d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
d6e0: 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73    }.  nByte = os
d6f0: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
d700: 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20  yte(CP_UTF8, 0, 
d710: 7a 57 69 64 65 54 65 78 74 2c 20 2d 31 2c 20 7a  zWideText, -1, z
d720: 54 65 78 74 2c 20 6e 42 79 74 65 2c 0a 20 20 20  Text, nByte,.   
d730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d740: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
d750: 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20  0);.  if( nByte 
d760: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  == 0 ){.    sqli
d770: 74 65 33 5f 66 72 65 65 28 7a 54 65 78 74 29 3b  te3_free(zText);
d780: 0a 20 20 20 20 7a 54 65 78 74 20 3d 20 30 3b 0a  .    zText = 0;.
d790: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 54 65    }.  return zTe
d7a0: 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  xt;.}../*.** Con
d7b0: 76 65 72 74 20 61 6e 20 41 4e 53 49 20 73 74 72  vert an ANSI str
d7c0: 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66 74  ing to Microsoft
d7d0: 20 55 6e 69 63 6f 64 65 2c 20 75 73 69 6e 67 20   Unicode, using 
d7e0: 74 68 65 20 41 4e 53 49 20 6f 72 20 4f 45 4d 0a  the ANSI or OEM.
d7f0: 2a 2a 20 63 6f 64 65 20 70 61 67 65 2e 0a 2a 2a  ** code page..**
d800: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
d810: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
d820: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
d830: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
d840: 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74  alloc()..*/.stat
d850: 69 63 20 4c 50 57 53 54 52 20 77 69 6e 4d 62 63  ic LPWSTR winMbc
d860: 73 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74  sToUnicode(const
d870: 20 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e   char *zText, in
d880: 74 20 75 73 65 41 6e 73 69 29 7b 0a 20 20 69 6e  t useAnsi){.  in
d890: 74 20 6e 42 79 74 65 3b 0a 20 20 4c 50 57 53 54  t nByte;.  LPWST
d8a0: 52 20 7a 4d 62 63 73 54 65 78 74 3b 0a 20 20 69  R zMbcsText;.  i
d8b0: 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20 75 73  nt codepage = us
d8c0: 65 41 6e 73 69 20 3f 20 43 50 5f 41 43 50 20 3a  eAnsi ? CP_ACP :
d8d0: 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42   CP_OEMCP;..  nB
d8e0: 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74  yte = osMultiByt
d8f0: 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65  eToWideChar(code
d900: 70 61 67 65 2c 20 30 2c 20 7a 54 65 78 74 2c 20  page, 0, zText, 
d910: 2d 31 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20  -1, NULL,.      
d920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d930: 20 20 20 20 20 20 20 20 20 20 30 29 2a 73 69 7a            0)*siz
d940: 65 6f 66 28 57 43 48 41 52 29 3b 0a 20 20 69 66  eof(WCHAR);.  if
d950: 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  ( nByte==0 ){.  
d960: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
d970: 20 20 7a 4d 62 63 73 54 65 78 74 20 3d 20 73 71    zMbcsText = sq
d980: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
d990: 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 57 43   nByte*sizeof(WC
d9a0: 48 41 52 29 20 29 3b 0a 20 20 69 66 28 20 7a 4d  HAR) );.  if( zM
d9b0: 62 63 73 54 65 78 74 3d 3d 30 20 29 7b 0a 20 20  bcsText==0 ){.  
d9c0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
d9d0: 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74    nByte = osMult
d9e0: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
d9f0: 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 54 65  codepage, 0, zTe
da00: 78 74 2c 20 2d 31 2c 20 7a 4d 62 63 73 54 65 78  xt, -1, zMbcsTex
da10: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
da20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da30: 20 20 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28     nByte);.  if(
da40: 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
da50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
da60: 62 63 73 54 65 78 74 29 3b 0a 20 20 20 20 7a 4d  bcsText);.    zM
da70: 62 63 73 54 65 78 74 20 3d 20 30 3b 0a 20 20 7d  bcsText = 0;.  }
da80: 0a 20 20 72 65 74 75 72 6e 20 7a 4d 62 63 73 54  .  return zMbcsT
da90: 65 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ext;.}../*.** Co
daa0: 6e 76 65 72 74 20 61 20 4d 69 63 72 6f 73 6f 66  nvert a Microsof
dab0: 74 20 55 6e 69 63 6f 64 65 20 73 74 72 69 6e 67  t Unicode string
dac0: 20 74 6f 20 61 20 6d 75 6c 74 69 2d 62 79 74 65   to a multi-byte
dad0: 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e   character strin
dae0: 67 2c 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  g,.** using the 
daf0: 41 4e 53 49 20 6f 72 20 4f 45 4d 20 63 6f 64 65  ANSI or OEM code
db00: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61   page..**.** Spa
db10: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
db20: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
db30: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
db40: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
db50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
db60: 20 2a 77 69 6e 55 6e 69 63 6f 64 65 54 6f 4d 62   *winUnicodeToMb
db70: 63 73 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65  cs(LPCWSTR zWide
db80: 54 65 78 74 2c 20 69 6e 74 20 75 73 65 41 6e 73  Text, int useAns
db90: 69 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  i){.  int nByte;
dba0: 0a 20 20 63 68 61 72 20 2a 7a 54 65 78 74 3b 0a  .  char *zText;.
dbb0: 20 20 69 6e 74 20 63 6f 64 65 70 61 67 65 20 3d    int codepage =
dbc0: 20 75 73 65 41 6e 73 69 20 3f 20 43 50 5f 41 43   useAnsi ? CP_AC
dbd0: 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20  P : CP_OEMCP;.. 
dbe0: 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43   nByte = osWideC
dbf0: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63  harToMultiByte(c
dc00: 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64  odepage, 0, zWid
dc10: 65 54 65 78 74 2c 20 2d 31 2c 20 30 2c 20 30 2c  eText, -1, 0, 0,
dc20: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42   0, 0);.  if( nB
dc30: 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  yte == 0 ){.    
dc40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
dc50: 7a 54 65 78 74 20 3d 20 73 71 6c 69 74 65 33 4d  zText = sqlite3M
dc60: 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65  allocZero( nByte
dc70: 20 29 3b 0a 20 20 69 66 28 20 7a 54 65 78 74 3d   );.  if( zText=
dc80: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
dc90: 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20   0;.  }.  nByte 
dca0: 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75  = osWideCharToMu
dcb0: 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61 67 65  ltiByte(codepage
dcc0: 2c 20 30 2c 20 7a 57 69 64 65 54 65 78 74 2c 20  , 0, zWideText, 
dcd0: 2d 31 2c 20 7a 54 65 78 74 2c 0a 20 20 20 20 20  -1, zText,.     
dce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcf0: 20 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65             nByte
dd00: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e  , 0, 0);.  if( n
dd10: 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20  Byte == 0 ){.   
dd20: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
dd30: 65 78 74 29 3b 0a 20 20 20 20 7a 54 65 78 74 20  ext);.    zText 
dd40: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
dd50: 6e 20 7a 54 65 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zText;.}../*.*
dd60: 2a 20 43 6f 6e 76 65 72 74 20 61 20 6d 75 6c 74  * Convert a mult
dd70: 69 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 72  i-byte character
dd80: 20 73 74 72 69 6e 67 20 74 6f 20 55 54 46 2d 38   string to UTF-8
dd90: 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
dda0: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
ddb0: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
ddc0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
ddd0: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a  e3_malloc()..*/.
dde0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 77 69 6e  static char *win
ddf0: 4d 62 63 73 54 6f 55 74 66 38 28 63 6f 6e 73 74  MbcsToUtf8(const
de00: 20 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e   char *zText, in
de10: 74 20 75 73 65 41 6e 73 69 29 7b 0a 20 20 63 68  t useAnsi){.  ch
de20: 61 72 20 2a 7a 54 65 78 74 55 74 66 38 3b 0a 20  ar *zTextUtf8;. 
de30: 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64 65   LPWSTR zTmpWide
de40: 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d 20  ;..  zTmpWide = 
de50: 77 69 6e 4d 62 63 73 54 6f 55 6e 69 63 6f 64 65  winMbcsToUnicode
de60: 28 7a 54 65 78 74 2c 20 75 73 65 41 6e 73 69 29  (zText, useAnsi)
de70: 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65  ;.  if( zTmpWide
de80: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
de90: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 54 65 78 74  n 0;.  }.  zText
dea0: 55 74 66 38 20 3d 20 77 69 6e 55 6e 69 63 6f 64  Utf8 = winUnicod
deb0: 65 54 6f 55 74 66 38 28 7a 54 6d 70 57 69 64 65  eToUtf8(zTmpWide
dec0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
ded0: 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72  e(zTmpWide);.  r
dee0: 65 74 75 72 6e 20 7a 54 65 78 74 55 74 66 38 3b  eturn zTextUtf8;
def0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
df00: 74 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67  t a UTF-8 string
df10: 20 74 6f 20 61 20 6d 75 6c 74 69 2d 62 79 74 65   to a multi-byte
df20: 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e   character strin
df30: 67 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  g..**.** Space t
df40: 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72  o hold the retur
df50: 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62  ned string is ob
df60: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
df70: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  te3_malloc()..*/
df80: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 77 69  .static char *wi
df90: 6e 55 74 66 38 54 6f 4d 62 63 73 28 63 6f 6e 73  nUtf8ToMbcs(cons
dfa0: 74 20 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 69  t char *zText, i
dfb0: 6e 74 20 75 73 65 41 6e 73 69 29 7b 0a 20 20 63  nt useAnsi){.  c
dfc0: 68 61 72 20 2a 7a 54 65 78 74 4d 62 63 73 3b 0a  har *zTextMbcs;.
dfd0: 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64    LPWSTR zTmpWid
dfe0: 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d  e;..  zTmpWide =
dff0: 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64   winUtf8ToUnicod
e000: 65 28 7a 54 65 78 74 29 3b 0a 20 20 69 66 28 20  e(zText);.  if( 
e010: 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20  zTmpWide==0 ){. 
e020: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
e030: 0a 20 20 7a 54 65 78 74 4d 62 63 73 20 3d 20 77  .  zTextMbcs = w
e040: 69 6e 55 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28  inUnicodeToMbcs(
e050: 7a 54 6d 70 57 69 64 65 2c 20 75 73 65 41 6e 73  zTmpWide, useAns
e060: 69 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  i);.  sqlite3_fr
e070: 65 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20  ee(zTmpWide);.  
e080: 72 65 74 75 72 6e 20 7a 54 65 78 74 4d 62 63 73  return zTextMbcs
e090: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
e0a0: 69 73 20 61 20 70 75 62 6c 69 63 20 77 72 61 70  is a public wrap
e0b0: 70 65 72 20 66 6f 72 20 74 68 65 20 77 69 6e 55  per for the winU
e0c0: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 29 20 66  tf8ToUnicode() f
e0d0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 4c 50 57 53  unction..*/.LPWS
e0e0: 54 52 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  TR sqlite3_win32
e0f0: 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63 6f 64 65  _utf8_to_unicode
e100: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65  (const char *zTe
e110: 78 74 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  xt){.#ifdef SQLI
e120: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
e130: 4d 4f 52 0a 20 20 69 66 28 20 21 7a 54 65 78 74  MOR.  if( !zText
e140: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
e150: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
e160: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
e170: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64    }.#endif.#ifnd
e180: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
e190: 55 54 4f 49 4e 49 54 0a 20 20 69 66 28 20 73 71  UTOINIT.  if( sq
e1a0: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
e1b0: 28 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  () ) return 0;.#
e1c0: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 77  endif.  return w
e1d0: 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28  inUtf8ToUnicode(
e1e0: 7a 54 65 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  zText);.}../*.**
e1f0: 20 54 68 69 73 20 69 73 20 61 20 70 75 62 6c 69   This is a publi
e200: 63 20 77 72 61 70 70 65 72 20 66 6f 72 20 74 68  c wrapper for th
e210: 65 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74  e winUnicodeToUt
e220: 66 38 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  f8() function..*
e230: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
e240: 77 69 6e 33 32 5f 75 6e 69 63 6f 64 65 5f 74 6f  win32_unicode_to
e250: 5f 75 74 66 38 28 4c 50 43 57 53 54 52 20 7a 57  _utf8(LPCWSTR zW
e260: 69 64 65 54 65 78 74 29 7b 0a 23 69 66 64 65 66  ideText){.#ifdef
e270: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
e280: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
e290: 7a 57 69 64 65 54 65 78 74 20 29 7b 0a 20 20 20  zWideText ){.   
e2a0: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
e2b0: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
e2c0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
e2d0: 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
e2e0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
e2f0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69  .  if( sqlite3_i
e300: 6e 69 74 69 61 6c 69 7a 65 28 29 20 29 20 72 65  nitialize() ) re
e310: 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20  turn 0;.#endif. 
e320: 20 72 65 74 75 72 6e 20 77 69 6e 55 6e 69 63 6f   return winUnico
e330: 64 65 54 6f 55 74 66 38 28 7a 57 69 64 65 54 65  deToUtf8(zWideTe
e340: 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  xt);.}../*.** Th
e350: 69 73 20 69 73 20 61 20 70 75 62 6c 69 63 20 77  is is a public w
e360: 72 61 70 70 65 72 20 66 6f 72 20 74 68 65 20 77  rapper for the w
e370: 69 6e 4d 62 63 73 54 6f 55 74 66 38 28 29 20 66  inMbcsToUtf8() f
e380: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72  unction..*/.char
e390: 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f   *sqlite3_win32_
e3a0: 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 63 6f 6e  mbcs_to_utf8(con
e3b0: 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 29 7b  st char *zText){
e3c0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
e3d0: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
e3e0: 20 20 69 66 28 20 21 7a 54 65 78 74 20 29 7b 0a    if( !zText ){.
e3f0: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
e400: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
e410: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
e420: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
e430: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
e440: 4e 49 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65  NIT.  if( sqlite
e450: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 29  3_initialize() )
e460: 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
e470: 66 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 4d 62  f.  return winMb
e480: 63 73 54 6f 55 74 66 38 28 7a 54 65 78 74 2c 20  csToUtf8(zText, 
e490: 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
e4a0: 49 28 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  I());.}../*.** T
e4b0: 68 69 73 20 69 73 20 61 20 70 75 62 6c 69 63 20  his is a public 
e4c0: 77 72 61 70 70 65 72 20 66 6f 72 20 74 68 65 20  wrapper for the 
e4d0: 77 69 6e 4d 62 63 73 54 6f 55 74 66 38 28 29 20  winMbcsToUtf8() 
e4e0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61  function..*/.cha
e4f0: 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  r *sqlite3_win32
e500: 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 5f 76 32  _mbcs_to_utf8_v2
e510: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65  (const char *zTe
e520: 78 74 2c 20 69 6e 74 20 75 73 65 41 6e 73 69 29  xt, int useAnsi)
e530: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
e540: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
e550: 0a 20 20 69 66 28 20 21 7a 54 65 78 74 20 29 7b  .  if( !zText ){
e560: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
e570: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
e580: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
e590: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
e5a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
e5b0: 49 4e 49 54 0a 20 20 69 66 28 20 73 71 6c 69 74  INIT.  if( sqlit
e5c0: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20  e3_initialize() 
e5d0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64  ) return 0;.#end
e5e0: 69 66 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 4d  if.  return winM
e5f0: 62 63 73 54 6f 55 74 66 38 28 7a 54 65 78 74 2c  bcsToUtf8(zText,
e600: 20 75 73 65 41 6e 73 69 29 3b 0a 7d 0a 0a 2f 2a   useAnsi);.}../*
e610: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 70 75  .** This is a pu
e620: 62 6c 69 63 20 77 72 61 70 70 65 72 20 66 6f 72  blic wrapper for
e630: 20 74 68 65 20 77 69 6e 55 74 66 38 54 6f 4d 62   the winUtf8ToMb
e640: 63 73 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  cs() function..*
e650: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
e660: 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62  win32_utf8_to_mb
e670: 63 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  cs(const char *z
e680: 54 65 78 74 29 7b 0a 23 69 66 64 65 66 20 53 51  Text){.#ifdef SQ
e690: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
e6a0: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 7a 54 65  ARMOR.  if( !zTe
e6b0: 78 74 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  xt ){.    (void)
e6c0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
e6d0: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
e6e0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66  ;.  }.#endif.#if
e6f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e700: 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69 66 28 20  _AUTOINIT.  if( 
e710: 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
e720: 7a 65 28 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ze() ) return 0;
e730: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
e740: 20 77 69 6e 55 74 66 38 54 6f 4d 62 63 73 28 7a   winUtf8ToMbcs(z
e750: 54 65 78 74 2c 20 6f 73 41 72 65 46 69 6c 65 41  Text, osAreFileA
e760: 70 69 73 41 4e 53 49 28 29 29 3b 0a 7d 0a 0a 2f  pisANSI());.}../
e770: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 70  *.** This is a p
e780: 75 62 6c 69 63 20 77 72 61 70 70 65 72 20 66 6f  ublic wrapper fo
e790: 72 20 74 68 65 20 77 69 6e 55 74 66 38 54 6f 4d  r the winUtf8ToM
e7a0: 62 63 73 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  bcs() function..
e7b0: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
e7c0: 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d  _win32_utf8_to_m
e7d0: 62 63 73 5f 76 32 28 63 6f 6e 73 74 20 63 68 61  bcs_v2(const cha
e7e0: 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20 75 73  r *zText, int us
e7f0: 65 41 6e 73 69 29 7b 0a 23 69 66 64 65 66 20 53  eAnsi){.#ifdef S
e800: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
e810: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 7a 54  _ARMOR.  if( !zT
e820: 65 78 74 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  ext ){.    (void
e830: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
e840: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
e850: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  0;.  }.#endif.#i
e860: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e870: 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69 66 28  T_AUTOINIT.  if(
e880: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
e890: 69 7a 65 28 29 20 29 20 72 65 74 75 72 6e 20 30  ize() ) return 0
e8a0: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
e8b0: 6e 20 77 69 6e 55 74 66 38 54 6f 4d 62 63 73 28  n winUtf8ToMbcs(
e8c0: 7a 54 65 78 74 2c 20 75 73 65 41 6e 73 69 29 3b  zText, useAnsi);
e8d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
e8e0: 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65  unction sets the
e8f0: 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20   data directory 
e900: 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  or the temporary
e910: 20 64 69 72 65 63 74 6f 72 79 20 62 61 73 65 64   directory based
e920: 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 72 6f 76 69   on.** the provi
e930: 64 65 64 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ded arguments.  
e940: 54 68 65 20 74 79 70 65 20 61 72 67 75 6d 65 6e  The type argumen
e950: 74 20 6d 75 73 74 20 62 65 20 31 20 69 6e 20 6f  t must be 1 in o
e960: 72 64 65 72 20 74 6f 20 73 65 74 20 74 68 65 0a  rder to set the.
e970: 2a 2a 20 64 61 74 61 20 64 69 72 65 63 74 6f 72  ** data director
e980: 79 20 6f 72 20 32 20 69 6e 20 6f 72 64 65 72 20  y or 2 in order 
e990: 74 6f 20 73 65 74 20 74 68 65 20 74 65 6d 70 6f  to set the tempo
e9a0: 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e 20  rary directory. 
e9b0: 20 54 68 65 20 7a 56 61 6c 75 65 0a 2a 2a 20 61   The zValue.** a
e9c0: 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e  rgument is the n
e9d0: 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65 63  ame of the direc
e9e0: 74 6f 72 79 20 74 6f 20 75 73 65 2e 20 20 54 68  tory to use.  Th
e9f0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 77  e return value w
ea00: 69 6c 6c 20 62 65 0a 2a 2a 20 53 51 4c 49 54 45  ill be.** SQLITE
ea10: 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
ea20: 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
ea30: 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
ea40: 63 74 6f 72 79 28 44 57 4f 52 44 20 74 79 70 65  ctory(DWORD type
ea50: 2c 20 4c 50 43 57 53 54 52 20 7a 56 61 6c 75 65  , LPCWSTR zValue
ea60: 29 7b 0a 20 20 63 68 61 72 20 2a 2a 70 70 44 69  ){.  char **ppDi
ea70: 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 23 69 66  rectory = 0;.#if
ea80: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ea90: 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69 6e 74 20  _AUTOINIT.  int 
eaa0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69  rc = sqlite3_ini
eab0: 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28  tialize();.  if(
eac0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
ead0: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 74 79  .#endif.  if( ty
eae0: 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32  pe==SQLITE_WIN32
eaf0: 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f  _DATA_DIRECTORY_
eb00: 54 59 50 45 20 29 7b 0a 20 20 20 20 70 70 44 69  TYPE ){.    ppDi
eb10: 72 65 63 74 6f 72 79 20 3d 20 26 73 71 6c 69 74  rectory = &sqlit
eb20: 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
eb30: 79 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 74  y;.  }else if( t
eb40: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33  ype==SQLITE_WIN3
eb50: 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59  2_TEMP_DIRECTORY
eb60: 5f 54 59 50 45 20 29 7b 0a 20 20 20 20 70 70 44  _TYPE ){.    ppD
eb70: 69 72 65 63 74 6f 72 79 20 3d 20 26 73 71 6c 69  irectory = &sqli
eb80: 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
eb90: 72 79 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ry;.  }.  assert
eba0: 28 20 21 70 70 44 69 72 65 63 74 6f 72 79 20 7c  ( !ppDirectory |
ebb0: 7c 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57  | type==SQLITE_W
ebc0: 49 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54  IN32_DATA_DIRECT
ebd0: 4f 52 59 5f 54 59 50 45 0a 20 20 20 20 20 20 20  ORY_TYPE.       
ebe0: 20 20 20 7c 7c 20 74 79 70 65 3d 3d 53 51 4c 49     || type==SQLI
ebf0: 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49  TE_WIN32_TEMP_DI
ec00: 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 20 20 29  RECTORY_TYPE.  )
ec10: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 70 44  ;.  assert( !ppD
ec20: 69 72 65 63 74 6f 72 79 20 7c 7c 20 73 71 6c 69  irectory || sqli
ec30: 74 65 33 4d 65 6d 64 65 62 75 67 48 61 73 54 79  te3MemdebugHasTy
ec40: 70 65 28 2a 70 70 44 69 72 65 63 74 6f 72 79 2c  pe(*ppDirectory,
ec50: 20 4d 45 4d 54 59 50 45 5f 48 45 41 50 29 20 29   MEMTYPE_HEAP) )
ec60: 3b 0a 20 20 69 66 28 20 70 70 44 69 72 65 63 74  ;.  if( ppDirect
ec70: 6f 72 79 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ory ){.    char 
ec80: 2a 7a 56 61 6c 75 65 55 74 66 38 20 3d 20 30 3b  *zValueUtf8 = 0;
ec90: 0a 20 20 20 20 69 66 28 20 7a 56 61 6c 75 65 20  .    if( zValue 
eca0: 26 26 20 7a 56 61 6c 75 65 5b 30 5d 20 29 7b 0a  && zValue[0] ){.
ecb0: 20 20 20 20 20 20 7a 56 61 6c 75 65 55 74 66 38        zValueUtf8
ecc0: 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55   = winUnicodeToU
ecd0: 74 66 38 28 7a 56 61 6c 75 65 29 3b 0a 20 20 20  tf8(zValue);.   
ece0: 20 20 20 69 66 20 28 20 7a 56 61 6c 75 65 55 74     if ( zValueUt
ecf0: 66 38 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  f8==0 ){.       
ed00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
ed10: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
ed20: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
ed30: 69 74 65 33 5f 66 72 65 65 28 2a 70 70 44 69 72  ite3_free(*ppDir
ed40: 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 2a 70 70  ectory);.    *pp
ed50: 44 69 72 65 63 74 6f 72 79 20 3d 20 7a 56 61 6c  Directory = zVal
ed60: 75 65 55 74 66 38 3b 0a 20 20 20 20 72 65 74 75  ueUtf8;.    retu
ed70: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
ed80: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
ed90: 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a  E_ERROR;.}../*.*
eda0: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
edb0: 75 65 20 6f 66 20 77 69 6e 47 65 74 4c 61 73 74  ue of winGetLast
edc0: 45 72 72 6f 72 4d 73 67 0a 2a 2a 20 69 73 20 7a  ErrorMsg.** is z
edd0: 65 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72  ero if the error
ede0: 20 6d 65 73 73 61 67 65 20 66 69 74 73 20 69 6e   message fits in
edf0: 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f 72 20   the buffer, or 
ee00: 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65  non-zero.** othe
ee10: 72 77 69 73 65 20 28 69 66 20 74 68 65 20 6d 65  rwise (if the me
ee20: 73 73 61 67 65 20 77 61 73 20 74 72 75 6e 63 61  ssage was trunca
ee30: 74 65 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ted)..*/.static 
ee40: 69 6e 74 20 77 69 6e 47 65 74 4c 61 73 74 45 72  int winGetLastEr
ee50: 72 6f 72 4d 73 67 28 44 57 4f 52 44 20 6c 61 73  rorMsg(DWORD las
ee60: 74 45 72 72 6e 6f 2c 20 69 6e 74 20 6e 42 75 66  tErrno, int nBuf
ee70: 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
ee80: 20 2f 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 67   /* FormatMessag
ee90: 65 20 72 65 74 75 72 6e 73 20 30 20 6f 6e 20 66  e returns 0 on f
eea0: 61 69 6c 75 72 65 2e 20 20 4f 74 68 65 72 77 69  ailure.  Otherwi
eeb0: 73 65 20 69 74 0a 20 20 2a 2a 20 72 65 74 75 72  se it.  ** retur
eec0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
eed0: 20 54 43 48 41 52 73 20 77 72 69 74 74 65 6e 20   TCHARs written 
eee0: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20  to the output.  
eef0: 2a 2a 20 62 75 66 66 65 72 2c 20 65 78 63 6c 75  ** buffer, exclu
ef00: 64 69 6e 67 20 74 68 65 20 74 65 72 6d 69 6e 61  ding the termina
ef10: 74 69 6e 67 20 6e 75 6c 6c 20 63 68 61 72 2e 0a  ting null char..
ef20: 20 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 4c    */.  DWORD dwL
ef30: 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  en = 0;.  char *
ef40: 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28  zOut = 0;..  if(
ef50: 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66   osIsNT() ){.#if
ef60: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
ef70: 0a 20 20 20 20 57 43 48 41 52 20 7a 54 65 6d 70  .    WCHAR zTemp
ef80: 57 69 64 65 5b 53 51 4c 49 54 45 5f 57 49 4e 33  Wide[SQLITE_WIN3
ef90: 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41  2_MAX_ERRMSG_CHA
efa0: 52 53 2b 31 5d 3b 0a 20 20 20 20 64 77 4c 65 6e  RS+1];.    dwLen
efb0: 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61   = osFormatMessa
efc0: 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41  geW(FORMAT_MESSA
efd0: 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c  GE_FROM_SYSTEM |
efe0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
eff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f                FO
f000: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e  RMAT_MESSAGE_IGN
f010: 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20  ORE_INSERTS,.   
f020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f030: 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a            NULL,.
f040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f050: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 73               las
f060: 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
f070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f080: 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20       0,.        
f090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0a0: 20 20 20 20 20 7a 54 65 6d 70 57 69 64 65 2c 0a       zTempWide,.
f0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
f0d0: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52  ITE_WIN32_MAX_ER
f0e0: 52 4d 53 47 5f 43 48 41 52 53 2c 0a 20 20 20 20  RMSG_CHARS,.    
f0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f100: 20 20 20 20 20 20 20 20 20 30 29 3b 0a 23 65 6c           0);.#el
f110: 73 65 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54  se.    LPWSTR zT
f120: 65 6d 70 57 69 64 65 20 3d 20 4e 55 4c 4c 3b 0a  empWide = NULL;.
f130: 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f      dwLen = osFo
f140: 72 6d 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52  rmatMessageW(FOR
f150: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f  MAT_MESSAGE_ALLO
f160: 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20  CATE_BUFFER |.  
f170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f180: 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41             FORMA
f190: 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53  T_MESSAGE_FROM_S
f1a0: 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20  YSTEM |.        
f1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1c0: 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53       FORMAT_MESS
f1d0: 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52  AGE_IGNORE_INSER
f1e0: 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TS,.            
f1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f200: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
f210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f220: 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20      lastErrno,. 
f230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f240: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20              0,. 
f250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f260: 20 20 20 20 20 20 20 20 20 20 20 20 28 4c 50 57              (LPW
f270: 53 54 52 29 20 26 7a 54 65 6d 70 57 69 64 65 2c  STR) &zTempWide,
f280: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
f2a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29                0)
f2c0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
f2d0: 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20   dwLen > 0 ){.  
f2e0: 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20      /* allocate 
f2f0: 61 20 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e  a buffer and con
f300: 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a  vert to UTF8 */.
f310: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
f320: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
f330: 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 77  ;.      zOut = w
f340: 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  inUnicodeToUtf8(
f350: 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20 20 20 20  zTempWide);.    
f360: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
f370: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23 69 66 20  gnMalloc();.#if 
f380: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
f390: 0a 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74  .      /* free t
f3a0: 68 65 20 73 79 73 74 65 6d 20 62 75 66 66 65 72  he system buffer
f3b0: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f   allocated by Fo
f3c0: 72 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20  rmatMessage */. 
f3d0: 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65       osLocalFree
f3e0: 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 23 65 6e  (zTempWide);.#en
f3f0: 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69  dif.    }.  }.#i
f400: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
f410: 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
f420: 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65  e{.    char *zTe
f430: 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64  mp = NULL;.    d
f440: 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d  wLen = osFormatM
f450: 65 73 73 61 67 65 41 28 46 4f 52 4d 41 54 5f 4d  essageA(FORMAT_M
f460: 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f  ESSAGE_ALLOCATE_
f470: 42 55 46 46 45 52 20 7c 0a 20 20 20 20 20 20 20  BUFFER |.       
f480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f490: 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53        FORMAT_MES
f4a0: 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d  SAGE_FROM_SYSTEM
f4b0: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
f4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4d0: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49  FORMAT_MESSAGE_I
f4e0: 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20  GNORE_INSERTS,. 
f4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f500: 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
f510: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
f530: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
f540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f550: 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20         0,.      
f560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f570: 20 20 20 20 20 20 20 28 4c 50 53 54 52 29 20 26         (LPSTR) &
f580: 7a 54 65 6d 70 2c 0a 20 20 20 20 20 20 20 20 20  zTemp,.         
f590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5a0: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
f5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5c0: 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20      0);.    if( 
f5d0: 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20  dwLen > 0 ){.   
f5e0: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61     /* allocate a
f5f0: 20 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e 76   buffer and conv
f600: 65 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20  ert to UTF8 */. 
f610: 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
f620: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
f630: 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 77 69  .      zOut = wi
f640: 6e 4d 62 63 73 54 6f 55 74 66 38 28 7a 54 65 6d  nMbcsToUtf8(zTem
f650: 70 2c 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73  p, osAreFileApis
f660: 41 4e 53 49 28 29 29 3b 0a 20 20 20 20 20 20 73  ANSI());.      s
f670: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
f680: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 2f  alloc();.      /
f690: 2a 20 66 72 65 65 20 74 68 65 20 73 79 73 74 65  * free the syste
f6a0: 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  m buffer allocat
f6b0: 65 64 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73  ed by FormatMess
f6c0: 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c  age */.      osL
f6d0: 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70 29 3b  ocalFree(zTemp);
f6e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
f6f0: 66 0a 20 20 69 66 28 20 30 20 3d 3d 20 64 77 4c  f.  if( 0 == dwL
f700: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
f710: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c  3_snprintf(nBuf,
f720: 20 7a 42 75 66 2c 20 22 4f 73 45 72 72 6f 72 20   zBuf, "OsError 
f730: 30 78 25 6c 78 20 28 25 6c 75 29 22 2c 20 6c 61  0x%lx (%lu)", la
f740: 73 74 45 72 72 6e 6f 2c 20 6c 61 73 74 45 72 72  stErrno, lastErr
f750: 6e 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  no);.  }else{.  
f760: 20 20 2f 2a 20 63 6f 70 79 20 61 20 6d 61 78 69    /* copy a maxi
f770: 6d 75 6d 20 6f 66 20 6e 42 75 66 20 63 68 61 72  mum of nBuf char
f780: 73 20 74 6f 20 6f 75 74 70 75 74 20 62 75 66 66  s to output buff
f790: 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  er */.    sqlite
f7a0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c  3_snprintf(nBuf,
f7b0: 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 4f 75   zBuf, "%s", zOu
f7c0: 74 29 3b 0a 20 20 20 20 2f 2a 20 66 72 65 65 20  t);.    /* free 
f7d0: 74 68 65 20 55 54 46 38 20 62 75 66 66 65 72 20  the UTF8 buffer 
f7e0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  */.    sqlite3_f
f7f0: 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20  ree(zOut);.  }. 
f800: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
f810: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
f820: 74 69 6f 6e 20 2d 20 77 69 6e 4c 6f 67 45 72 72  tion - winLogErr
f830: 6f 72 41 74 4c 69 6e 65 28 29 20 2d 20 69 73 20  orAtLine() - is 
f840: 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64  only ever called
f850: 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a   via the macro.*
f860: 2a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 29 2e  * winLogError().
f870: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
f880: 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 61  ine is invoked a
f890: 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63  fter an error oc
f8a0: 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75  curs in an OS fu
f8b0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 6c 6f  nction..** It lo
f8c0: 67 73 20 61 20 6d 65 73 73 61 67 65 20 75 73 69  gs a message usi
f8d0: 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29  ng sqlite3_log()
f8e0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
f8f0: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
f900: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 61  .** error code a
f910: 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c  nd, if possible,
f920: 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61   the human-reada
f930: 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66  ble equivalent f
f940: 72 6f 6d 0a 2a 2a 20 46 6f 72 6d 61 74 4d 65 73  rom.** FormatMes
f950: 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sage..**.** The 
f960: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70  first argument p
f970: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63  assed to the mac
f980: 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ro should be the
f990: 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74   error code that
f9a0: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75  .** will be retu
f9b0: 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28  rned to SQLite (
f9c0: 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52  e.g. SQLITE_IOER
f9d0: 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45  R_DELETE, SQLITE
f9e0: 5f 43 41 4e 54 4f 50 45 4e 29 2e 0a 2a 2a 20 54  _CANTOPEN)..** T
f9f0: 68 65 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e  he two subsequen
fa00: 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75  t arguments shou
fa10: 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f  ld be the name o
fa20: 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f  f the OS functio
fa30: 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64  n that.** failed
fa40: 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61   and the associa
fa50: 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ted file-system 
fa60: 70 61 74 68 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f  path, if any..*/
fa70: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4c 6f 67 45  .#define winLogE
fa80: 72 72 6f 72 28 61 2c 62 2c 63 2c 64 29 20 20 20  rror(a,b,c,d)   
fa90: 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  winLogErrorAtLin
faa0: 65 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45  e(a,b,c,d,__LINE
fab0: 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20 77  __).static int w
fac0: 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  inLogErrorAtLine
fad0: 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c  (.  int errcode,
fae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
faf0: 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72      /* SQLite er
fb00: 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 44 57  ror code */.  DW
fb10: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 20  ORD lastErrno,  
fb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fb30: 20 57 69 6e 33 32 20 6c 61 73 74 20 65 72 72 6f   Win32 last erro
fb40: 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  r */.  const cha
fb50: 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20  r *zFunc,       
fb60: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
fb70: 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68  f OS function th
fb80: 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63  at failed */.  c
fb90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
fba0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
fbb0: 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f  * File path asso
fbc0: 63 69 61 74 65 64 20 77 69 74 68 20 65 72 72 6f  ciated with erro
fbd0: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65  r */.  int iLine
fbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbf0: 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
fc00: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65   line number whe
fc10: 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  re error occurre
fc20: 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a  d */.){.  char z
fc30: 4d 73 67 5b 35 30 30 5d 3b 20 20 20 20 20 20 20  Msg[500];       
fc40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 75 6d            /* Hum
fc50: 61 6e 20 72 65 61 64 61 62 6c 65 20 65 72 72 6f  an readable erro
fc60: 72 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  r text */.  int 
fc70: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
fc80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
fc90: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
fca0: 20 20 7a 4d 73 67 5b 30 5d 20 3d 20 30 3b 0a 20    zMsg[0] = 0;. 
fcb0: 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
fcc0: 4d 73 67 28 6c 61 73 74 45 72 72 6e 6f 2c 20 73  Msg(lastErrno, s
fcd0: 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73  izeof(zMsg), zMs
fce0: 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 72  g);.  assert( er
fcf0: 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rcode!=SQLITE_OK
fd00: 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 3d   );.  if( zPath=
fd10: 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b  =0 ) zPath = "";
fd20: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d 73 67  .  for(i=0; zMsg
fd30: 5b 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d  [i] && zMsg[i]!=
fd40: 27 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69 5d 21  '\r' && zMsg[i]!
fd50: 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20  ='\n'; i++){}.  
fd60: 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 73  zMsg[i] = 0;.  s
fd70: 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f  qlite3_log(errco
fd80: 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 77 69  de,.      "os_wi
fd90: 6e 2e 63 3a 25 64 3a 20 28 25 6c 75 29 20 25 73  n.c:%d: (%lu) %s
fda0: 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20  (%s) - %s",.    
fdb0: 20 20 69 4c 69 6e 65 2c 20 6c 61 73 74 45 72 72    iLine, lastErr
fdc0: 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68  no, zFunc, zPath
fdd0: 2c 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20 20 72  , zMsg.  );..  r
fde0: 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d  eturn errcode;.}
fdf0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62  ../*.** The numb
fe00: 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74  er of times that
fe10: 20 61 20 52 65 61 64 46 69 6c 65 28 29 2c 20 57   a ReadFile(), W
fe20: 72 69 74 65 46 69 6c 65 28 29 2c 20 61 6e 64 20  riteFile(), and 
fe30: 44 65 6c 65 74 65 46 69 6c 65 28 29 0a 2a 2a 20  DeleteFile().** 
fe40: 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65 64 20  will be retried 
fe50: 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f 63 6b  following a lock
fe60: 69 6e 67 20 65 72 72 6f 72 20 2d 20 70 72 6f 62  ing error - prob
fe70: 61 62 6c 79 20 63 61 75 73 65 64 20 62 79 0a 2a  ably caused by.*
fe80: 2a 20 61 6e 74 69 76 69 72 75 73 20 73 6f 66 74  * antivirus soft
fe90: 77 61 72 65 2e 20 20 41 6c 73 6f 20 74 68 65 20  ware.  Also the 
fea0: 69 6e 69 74 69 61 6c 20 64 65 6c 61 79 20 62 65  initial delay be
feb0: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 72  fore the first r
fec0: 65 74 72 79 2e 0a 2a 2a 20 54 68 65 20 64 65 6c  etry..** The del
fed0: 61 79 20 69 6e 63 72 65 61 73 65 73 20 6c 69 6e  ay increases lin
fee0: 65 61 72 6c 79 20 77 69 74 68 20 65 61 63 68 20  early with each 
fef0: 72 65 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65  retry..*/.#ifnde
ff00: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  f SQLITE_WIN32_I
ff10: 4f 45 52 52 5f 52 45 54 52 59 0a 23 20 64 65 66  OERR_RETRY.# def
ff20: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
ff30: 5f 49 4f 45 52 52 5f 52 45 54 52 59 20 31 30 0a  _IOERR_RETRY 10.
ff40: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
ff50: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
ff60: 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 0a 23 20  R_RETRY_DELAY.# 
ff70: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
ff80: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f  N32_IOERR_RETRY_
ff90: 44 45 4c 41 59 20 32 35 0a 23 65 6e 64 69 66 0a  DELAY 25.#endif.
ffa0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49 6f  static int winIo
ffb0: 65 72 72 52 65 74 72 79 20 3d 20 53 51 4c 49 54  errRetry = SQLIT
ffc0: 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45  E_WIN32_IOERR_RE
ffd0: 54 52 59 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  TRY;.static int 
ffe0: 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c  winIoerrRetryDel
fff0: 61 79 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33  ay = SQLITE_WIN3
10000 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45  2_IOERR_RETRY_DE
10010 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LAY;../*.** The 
10020 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72  "winIoerrCanRetr
10030 79 31 22 20 6d 61 63 72 6f 20 69 73 20 75 73 65  y1" macro is use
10040 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
10050 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 49  f a particular I
10060 2f 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  /O.** error code
10070 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20 47 65   obtained via Ge
10080 74 4c 61 73 74 45 72 72 6f 72 28 29 20 69 73 20  tLastError() is 
10090 65 6c 69 67 69 62 6c 65 20 74 6f 20 62 65 20 72  eligible to be r
100a0 65 74 72 69 65 64 2e 20 20 49 74 0a 2a 2a 20 6d  etried.  It.** m
100b0 75 73 74 20 61 63 63 65 70 74 20 74 68 65 20 65  ust accept the e
100c0 72 72 6f 72 20 63 6f 64 65 20 44 57 4f 52 44 20  rror code DWORD 
100d0 61 73 20 69 74 73 20 6f 6e 6c 79 20 61 72 67 75  as its only argu
100e0 6d 65 6e 74 20 61 6e 64 20 73 68 6f 75 6c 64 20  ment and should 
100f0 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
10100 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72 20  ro if the error 
10110 63 6f 64 65 20 69 73 20 74 72 61 6e 73 69 65 6e  code is transien
10120 74 20 69 6e 20 6e 61 74 75 72 65 20 61 6e 64 20  t in nature and 
10130 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a  the operation.**
10140 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
10150 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20   generating the 
10160 6f 72 69 67 69 6e 61 6c 20 65 72 72 6f 72 20 6d  original error m
10170 69 67 68 74 20 73 75 63 63 65 65 64 20 75 70 6f  ight succeed upo
10180 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 65 74 72 69  n being.** retri
10190 65 64 2e 20 20 54 68 65 20 61 72 67 75 6d 65 6e  ed.  The argumen
101a0 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20  t to this macro 
101b0 73 68 6f 75 6c 64 20 62 65 20 61 20 76 61 72 69  should be a vari
101c0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 64 64 69  able..**.** Addi
101d0 74 69 6f 6e 61 6c 6c 79 2c 20 61 20 6d 61 63 72  tionally, a macr
101e0 6f 20 6e 61 6d 65 64 20 22 77 69 6e 49 6f 65 72  o named "winIoer
101f0 72 43 61 6e 52 65 74 72 79 32 22 20 6d 61 79 20  rCanRetry2" may 
10200 62 65 20 64 65 66 69 6e 65 64 2e 20 20 49 66 20  be defined.  If 
10210 69 74 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  it.** is defined
10220 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e  , it will be con
10230 73 75 6c 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e  sulted only when
10240 20 74 68 65 20 6d 61 63 72 6f 20 22 77 69 6e 49   the macro "winI
10250 6f 65 72 72 43 61 6e 52 65 74 72 79 31 22 0a 2a  oerrCanRetry1".*
10260 2a 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20  * returns zero. 
10270 20 54 68 65 20 22 77 69 6e 49 6f 65 72 72 43 61   The "winIoerrCa
10280 6e 52 65 74 72 79 32 22 20 6d 61 63 72 6f 20 69  nRetry2" macro i
10290 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 70 74  s completely opt
102a0 69 6f 6e 61 6c 20 61 6e 64 0a 2a 2a 20 6d 61 79  ional and.** may
102b0 20 62 65 20 75 73 65 64 20 74 6f 20 69 6e 63 6c   be used to incl
102c0 75 64 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 65  ude additional e
102d0 72 72 6f 72 20 63 6f 64 65 73 20 69 6e 20 74 68  rror codes in th
102e0 65 20 73 65 74 20 74 68 61 74 20 73 68 6f 75 6c  e set that shoul
102f0 64 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 74  d.** result in t
10300 68 65 20 66 61 69 6c 69 6e 67 20 49 2f 4f 20 6f  he failing I/O o
10310 70 65 72 61 74 69 6f 6e 20 62 65 69 6e 67 20 72  peration being r
10320 65 74 72 69 65 64 20 62 79 20 74 68 65 20 63 61  etried by the ca
10330 6c 6c 65 72 2e 20 20 49 66 0a 2a 2a 20 64 65 66  ller.  If.** def
10340 69 6e 65 64 2c 20 74 68 65 20 22 77 69 6e 49 6f  ined, the "winIo
10350 65 72 72 43 61 6e 52 65 74 72 79 32 22 20 6d 61  errCanRetry2" ma
10360 63 72 6f 20 6d 75 73 74 20 65 78 68 69 62 69 74  cro must exhibit
10370 20 65 78 74 65 72 6e 61 6c 20 73 65 6d 61 6e 74   external semant
10380 69 63 73 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c  ics.** identical
10390 20 74 6f 20 74 68 6f 73 65 20 6f 66 20 74 68 65   to those of the
103a0 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74   "winIoerrCanRet
103b0 72 79 31 22 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23  ry1" macro..*/.#
103c0 69 66 20 21 64 65 66 69 6e 65 64 28 77 69 6e 49  if !defined(winI
103d0 6f 65 72 72 43 61 6e 52 65 74 72 79 31 29 0a 23  oerrCanRetry1).#
103e0 64 65 66 69 6e 65 20 77 69 6e 49 6f 65 72 72 43  define winIoerrC
103f0 61 6e 52 65 74 72 79 31 28 61 29 20 28 28 28 61  anRetry1(a) (((a
10400 29 3d 3d 45 52 52 4f 52 5f 41 43 43 45 53 53 5f  )==ERROR_ACCESS_
10410 44 45 4e 49 45 44 29 20 20 20 20 20 20 20 20 7c  DENIED)        |
10420 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  | \.            
10430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10440 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 53 48    ((a)==ERROR_SH
10450 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 29  ARING_VIOLATION)
10460 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20      || \.       
10470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10480 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52 52         ((a)==ERR
10490 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54 49 4f  OR_LOCK_VIOLATIO
104a0 4e 29 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20  N)       || \.  
104b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104c0 20 20 20 20 20 20 20 20 20 20 20 20 28 28 61 29              ((a)
104d0 3d 3d 45 52 52 4f 52 5f 44 45 56 5f 4e 4f 54 5f  ==ERROR_DEV_NOT_
104e0 45 58 49 53 54 29 20 20 20 20 20 20 20 20 7c 7c  EXIST)        ||
104f0 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
10500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10510 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 4e 45 54   ((a)==ERROR_NET
10520 4e 41 4d 45 5f 44 45 4c 45 54 45 44 29 20 20 20  NAME_DELETED)   
10530 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20     || \.        
10540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10550 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52 52 4f        ((a)==ERRO
10560 52 5f 53 45 4d 5f 54 49 4d 45 4f 55 54 29 20 20  R_SEM_TIMEOUT)  
10570 20 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20          || \.   
10580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10590 20 20 20 20 20 20 20 20 20 20 20 28 28 61 29 3d             ((a)=
105a0 3d 45 52 52 4f 52 5f 4e 45 54 57 4f 52 4b 5f 55  =ERROR_NETWORK_U
105b0 4e 52 45 41 43 48 41 42 4c 45 29 29 0a 23 65 6e  NREACHABLE)).#en
105c0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20  dif../*.** If a 
105d0 52 65 61 64 46 69 6c 65 28 29 20 6f 72 20 57 72  ReadFile() or Wr
105e0 69 74 65 46 69 6c 65 28 29 20 65 72 72 6f 72 20  iteFile() error 
105f0 6f 63 63 75 72 73 2c 20 69 6e 76 6f 6b 65 20 74  occurs, invoke t
10600 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74  his routine.** t
10610 6f 20 73 65 65 20 69 66 20 69 74 20 73 68 6f 75  o see if it shou
10620 6c 64 20 62 65 20 72 65 74 72 69 65 64 2e 20 20  ld be retried.  
10630 52 65 74 75 72 6e 20 54 52 55 45 20 74 6f 20 72  Return TRUE to r
10640 65 74 72 79 2e 20 20 52 65 74 75 72 6e 20 46 41  etry.  Return FA
10650 4c 53 45 0a 2a 2a 20 74 6f 20 67 69 76 65 20 75  LSE.** to give u
10660 70 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 2e  p with an error.
10670 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
10680 69 6e 52 65 74 72 79 49 6f 65 72 72 28 69 6e 74  inRetryIoerr(int
10690 20 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f 52 44   *pnRetry, DWORD
106a0 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44 57 4f   *pError){.  DWO
106b0 52 44 20 65 20 3d 20 6f 73 47 65 74 4c 61 73 74  RD e = osGetLast
106c0 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 2a  Error();.  if( *
106d0 70 6e 52 65 74 72 79 3e 3d 77 69 6e 49 6f 65 72  pnRetry>=winIoer
106e0 72 52 65 74 72 79 20 29 7b 0a 20 20 20 20 69 66  rRetry ){.    if
106f0 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  ( pError ){.    
10700 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20    *pError = e;. 
10710 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
10720 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77 69 6e  0;.  }.  if( win
10730 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 28 65  IoerrCanRetry1(e
10740 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
10750 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 77 69 6e  _win32_sleep(win
10760 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a  IoerrRetryDelay*
10770 28 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a 20  (1+*pnRetry));. 
10780 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a 20     ++*pnRetry;. 
10790 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
107a0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 77 69 6e  .#if defined(win
107b0 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32 29 0a  IoerrCanRetry2).
107c0 20 20 65 6c 73 65 20 69 66 28 20 77 69 6e 49 6f    else if( winIo
107d0 65 72 72 43 61 6e 52 65 74 72 79 32 28 65 29 20  errCanRetry2(e) 
107e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77  ){.    sqlite3_w
107f0 69 6e 33 32 5f 73 6c 65 65 70 28 77 69 6e 49 6f  in32_sleep(winIo
10800 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a 28 31  errRetryDelay*(1
10810 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a 20 20 20  +*pnRetry));.   
10820 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a 20 20 20   ++*pnRetry;.   
10830 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23   return 1;.  }.#
10840 65 6e 64 69 66 0a 20 20 69 66 28 20 70 45 72 72  endif.  if( pErr
10850 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45 72 72 6f  or ){.    *pErro
10860 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72 65 74  r = e;.  }.  ret
10870 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
10880 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f 72 20  Log a I/O error 
10890 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e 0a 2a  retry episode..*
108a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
108b0 6e 4c 6f 67 49 6f 65 72 72 28 69 6e 74 20 6e 52  nLogIoerr(int nR
108c0 65 74 72 79 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f  etry, int lineno
108d0 29 7b 0a 20 20 69 66 28 20 6e 52 65 74 72 79 20  ){.  if( nRetry 
108e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
108f0 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  og(SQLITE_NOTICE
10900 2c 0a 20 20 20 20 20 20 22 64 65 6c 61 79 65 64  ,.      "delayed
10910 20 25 64 6d 73 20 66 6f 72 20 6c 6f 63 6b 2f 73   %dms for lock/s
10920 68 61 72 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20  haring conflict 
10930 61 74 20 6c 69 6e 65 20 25 64 22 2c 0a 20 20 20  at line %d",.   
10940 20 20 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79     winIoerrRetry
10950 44 65 6c 61 79 2a 6e 52 65 74 72 79 2a 28 6e 52  Delay*nRetry*(nR
10960 65 74 72 79 2b 31 29 2f 32 2c 20 6c 69 6e 65 6e  etry+1)/2, linen
10970 6f 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  o.    );.  }.}..
10980 2f 2a 0a 2a 2a 20 54 68 69 73 20 23 69 66 20 64  /*.** This #if d
10990 6f 65 73 20 6e 6f 74 20 72 65 6c 79 20 6f 6e 20  oes not rely on 
109a0 74 68 65 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  the SQLITE_OS_WI
109b0 4e 43 45 20 64 65 66 69 6e 65 20 62 65 63 61 75  NCE define becau
109c0 73 65 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73  se the.** corres
109d0 70 6f 6e 64 69 6e 67 20 73 65 63 74 69 6f 6e 20  ponding section 
109e0 69 6e 20 22 64 61 74 65 2e 63 22 20 63 61 6e 6e  in "date.c" cann
109f0 6f 74 20 75 73 65 20 69 74 2e 0a 2a 2f 0a 23 69  ot use it..*/.#i
10a00 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
10a10 45 5f 4f 4d 49 54 5f 4c 4f 43 41 4c 54 49 4d 45  E_OMIT_LOCALTIME
10a20 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 57 49  ) && defined(_WI
10a30 4e 33 32 5f 57 43 45 29 20 26 26 20 5c 0a 20 20  N32_WCE) && \.  
10a40 20 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c 49    (!defined(SQLI
10a50 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54 49 4d  TE_MSVC_LOCALTIM
10a60 45 5f 41 50 49 29 20 7c 7c 20 21 53 51 4c 49 54  E_API) || !SQLIT
10a70 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54 49 4d 45  E_MSVC_LOCALTIME
10a80 5f 41 50 49 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20  _API)./*.** The 
10a90 4d 53 56 43 20 43 52 54 20 6f 6e 20 57 69 6e 64  MSVC CRT on Wind
10aa0 6f 77 73 20 43 45 20 6d 61 79 20 6e 6f 74 20 68  ows CE may not h
10ab0 61 76 65 20 61 20 6c 6f 63 61 6c 74 69 6d 65 28  ave a localtime(
10ac0 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 53  ) function..** S
10ad0 6f 20 64 65 66 69 6e 65 20 61 20 73 75 62 73 74  o define a subst
10ae0 69 74 75 74 65 2e 0a 2a 2f 0a 23 20 20 69 6e 63  itute..*/.#  inc
10af0 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73 74  lude <time.h>.st
10b00 72 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65 63 6c  ruct tm *__cdecl
10b10 20 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e 73 74   localtime(const
10b20 20 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20 20   time_t *t).{.  
10b30 73 74 61 74 69 63 20 73 74 72 75 63 74 20 74 6d  static struct tm
10b40 20 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45 20 75   y;.  FILETIME u
10b50 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53 54 45  Tm, lTm;.  SYSTE
10b60 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 20 73 71 6c  MTIME pTm;.  sql
10b70 69 74 65 33 5f 69 6e 74 36 34 20 74 36 34 3b 0a  ite3_int64 t64;.
10b80 20 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20 74 36    t64 = *t;.  t6
10b90 34 20 3d 20 28 74 36 34 20 2b 20 31 31 36 34 34  4 = (t64 + 11644
10ba0 34 37 33 36 30 30 29 2a 31 30 30 30 30 30 30 30  473600)*10000000
10bb0 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44 61 74  ;.  uTm.dwLowDat
10bc0 65 54 69 6d 65 20 3d 20 28 44 57 4f 52 44 29 28  eTime = (DWORD)(
10bd0 74 36 34 20 26 20 30 78 46 46 46 46 46 46 46 46  t64 & 0xFFFFFFFF
10be0 29 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67 68 44  );.  uTm.dwHighD
10bf0 61 74 65 54 69 6d 65 3d 20 28 44 57 4f 52 44 29  ateTime= (DWORD)
10c00 28 74 36 34 20 3e 3e 20 33 32 29 3b 0a 20 20 6f  (t64 >> 32);.  o
10c10 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c  sFileTimeToLocal
10c20 46 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c 26 6c  FileTime(&uTm,&l
10c30 54 6d 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d  Tm);.  osFileTim
10c40 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28 26 6c  eToSystemTime(&l
10c50 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e 74 6d  Tm,&pTm);.  y.tm
10c60 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59 65 61  _year = pTm.wYea
10c70 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e 74 6d  r - 1900;.  y.tm
10c80 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e 74  _mon = pTm.wMont
10c90 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f 77 64  h - 1;.  y.tm_wd
10ca0 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f 66 57  ay = pTm.wDayOfW
10cb0 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61 79  eek;.  y.tm_mday
10cc0 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20 20 79   = pTm.wDay;.  y
10cd0 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e 77  .tm_hour = pTm.w
10ce0 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69 6e  Hour;.  y.tm_min
10cf0 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b 0a   = pTm.wMinute;.
10d00 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54 6d    y.tm_sec = pTm
10d10 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65 74 75  .wSecond;.  retu
10d20 72 6e 20 26 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn &y;.}.#endif.
10d30 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
10d40 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  INCE./**********
10d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
10d90 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  ** This section 
10da0 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 66 6f  contains code fo
10db0 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f  r WinCE only..*/
10dc0 0a 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45 5f  .#define HANDLE_
10dd0 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28 77  TO_WINFILE(a) (w
10de0 69 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72 2a  inFile*)&((char*
10df0 29 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65 74  )a)[-(int)offset
10e00 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a  of(winFile,h)]..
10e10 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
10e20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e 64  lock on the hand
10e30 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76  le h.*/.static v
10e40 6f 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41 63  oid winceMutexAc
10e50 71 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29 7b  quire(HANDLE h){
10e60 0a 20 20 20 44 57 4f 52 44 20 64 77 45 72 72 3b  .   DWORD dwErr;
10e70 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64 77  .   do {.     dw
10e80 45 72 72 20 3d 20 6f 73 57 61 69 74 46 6f 72 53  Err = osWaitForS
10e90 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c 20 49  ingleObject(h, I
10ea0 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d 20 77  NFINITE);.   } w
10eb0 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d 20 57  hile (dwErr != W
10ec0 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26 26 20  AIT_OBJECT_0 && 
10ed0 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f 41 42  dwErr != WAIT_AB
10ee0 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a  ANDONED);.}./*.*
10ef0 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b  * Release a lock
10f00 20 61 63 71 75 69 72 65 64 20 62 79 20 77 69 6e   acquired by win
10f10 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 29  ceMutexAcquire()
10f20 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 63  .*/.#define winc
10f30 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 68 29  eMutexRelease(h)
10f40 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28 68 29   ReleaseMutex(h)
10f50 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ../*.** Create t
10f60 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73 68 61  he mutex and sha
10f70 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  red memory used 
10f80 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74  for locking in t
10f90 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72  he file.** descr
10fa0 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a 73  iptor pFile.*/.s
10fb0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 63 65 43  tatic int winceC
10fc0 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74 20  reateLock(const 
10fd0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
10fe0 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29   winFile *pFile)
10ff0 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f 6b 3b  {.  LPWSTR zTok;
11000 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d 65 3b  .  LPWSTR zName;
11010 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
11020 6e 6f 3b 0a 20 20 42 4f 4f 4c 20 62 4c 6f 67 67  no;.  BOOL bLogg
11030 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 42 4f  ed = FALSE;.  BO
11040 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52 55 45 3b  OL bInit = TRUE;
11050 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 77 69 6e 55  ..  zName = winU
11060 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  tf8ToUnicode(zFi
11070 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
11080 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Name==0 ){.    /
11090 2a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20  * out of memory 
110a0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
110b0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
110c0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
110d0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
110e0 6c 6f 63 61 6c 20 6c 6f 63 6b 64 61 74 61 20 2a  local lockdata *
110f0 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 46 69 6c  /.  memset(&pFil
11100 65 2d 3e 6c 6f 63 61 6c 2c 20 30 2c 20 73 69 7a  e->local, 0, siz
11110 65 6f 66 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  eof(pFile->local
11120 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63  ));..  /* Replac
11130 65 20 74 68 65 20 62 61 63 6b 73 6c 61 73 68 65  e the backslashe
11140 73 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 6e  s from the filen
11150 61 6d 65 20 61 6e 64 20 6c 6f 77 65 72 63 61 73  ame and lowercas
11160 65 20 69 74 0a 20 20 2a 2a 20 74 6f 20 64 65 72  e it.  ** to der
11170 69 76 65 20 61 20 6d 75 74 65 78 20 6e 61 6d 65  ive a mutex name
11180 2e 20 2a 2f 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73  . */.  zTok = os
11190 43 68 61 72 4c 6f 77 65 72 57 28 7a 4e 61 6d 65  CharLowerW(zName
111a0 29 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b  );.  for (;*zTok
111b0 3b 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69 66  ;zTok++){.    if
111c0 20 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29   (*zTok == '\\')
111d0 20 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20   *zTok = '_';.  
111e0 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 2f 6f  }..  /* Create/o
111f0 70 65 6e 20 74 68 65 20 6e 61 6d 65 64 20 6d 75  pen the named mu
11200 74 65 78 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e  tex */.  pFile->
11210 68 4d 75 74 65 78 20 3d 20 6f 73 43 72 65 61 74  hMutex = osCreat
11220 65 4d 75 74 65 78 57 28 4e 55 4c 4c 2c 20 46 41  eMutexW(NULL, FA
11230 4c 53 45 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69  LSE, zName);.  i
11240 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65  f (!pFile->hMute
11250 78 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  x){.    pFile->l
11260 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
11270 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
11280 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e   sqlite3_free(zN
11290 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
112a0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
112b0 49 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65  ITE_IOERR, pFile
112c0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
112d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112e0 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74 65      "winceCreate
112f0 4c 6f 63 6b 31 22 2c 20 7a 46 69 6c 65 6e 61 6d  Lock1", zFilenam
11300 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63  e);.  }..  /* Ac
11310 71 75 69 72 65 20 74 68 65 20 6d 75 74 65 78 20  quire the mutex 
11320 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e  before continuin
11330 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4d 75 74 65  g */.  winceMute
11340 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e  xAcquire(pFile->
11350 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 53  hMutex);..  /* S
11360 69 6e 63 65 20 74 68 65 20 6e 61 6d 65 73 20 6f  ince the names o
11370 66 20 6e 61 6d 65 64 20 6d 75 74 65 78 65 73 2c  f named mutexes,
11380 20 73 65 6d 61 70 68 6f 72 65 73 2c 20 66 69 6c   semaphores, fil
11390 65 20 6d 61 70 70 69 6e 67 73 20 65 74 63 20 61  e mappings etc a
113a0 72 65 0a 20 20 2a 2a 20 63 61 73 65 2d 73 65 6e  re.  ** case-sen
113b0 73 69 74 69 76 65 2c 20 74 61 6b 65 20 61 64 76  sitive, take adv
113c0 61 6e 74 61 67 65 20 6f 66 20 74 68 61 74 20 62  antage of that b
113d0 79 20 75 70 70 65 72 63 61 73 69 6e 67 20 74 68  y uppercasing th
113e0 65 20 6d 75 74 65 78 20 6e 61 6d 65 0a 20 20 2a  e mutex name.  *
113f0 2a 20 61 6e 64 20 75 73 69 6e 67 20 74 68 61 74  * and using that
11400 20 61 73 20 74 68 65 20 73 68 61 72 65 64 20 66   as the shared f
11410 69 6c 65 6d 61 70 70 69 6e 67 20 6e 61 6d 65 2e  ilemapping name.
11420 0a 20 20 2a 2f 0a 20 20 6f 73 43 68 61 72 55 70  .  */.  osCharUp
11430 70 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 70  perW(zName);.  p
11440 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20  File->hShared = 
11450 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
11460 69 6e 67 57 28 49 4e 56 41 4c 49 44 5f 48 41 4e  ingW(INVALID_HAN
11470 44 4c 45 5f 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c  DLE_VALUE, NULL,
11480 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114a0 20 20 20 20 20 20 20 20 20 50 41 47 45 5f 52 45           PAGE_RE
114b0 41 44 57 52 49 54 45 2c 20 30 2c 20 73 69 7a 65  ADWRITE, 0, size
114c0 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20  of(winceLock),. 
114d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114f0 20 20 20 20 20 20 20 7a 4e 61 6d 65 29 3b 0a 0a         zName);..
11500 20 20 2f 2a 20 53 65 74 20 61 20 66 6c 61 67 20    /* Set a flag 
11510 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 20 77  that indicates w
11520 65 27 72 65 20 74 68 65 20 66 69 72 73 74 20 74  e're the first t
11530 6f 20 63 72 65 61 74 65 20 74 68 65 20 6d 65 6d  o create the mem
11540 6f 72 79 20 73 6f 20 69 74 0a 20 20 2a 2a 20 6d  ory so it.  ** m
11550 75 73 74 20 62 65 20 7a 65 72 6f 2d 69 6e 69 74  ust be zero-init
11560 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 6c 61 73  ialized */.  las
11570 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
11580 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 20  stError();.  if 
11590 28 6c 61 73 74 45 72 72 6e 6f 20 3d 3d 20 45 52  (lastErrno == ER
115a0 52 4f 52 5f 41 4c 52 45 41 44 59 5f 45 58 49 53  ROR_ALREADY_EXIS
115b0 54 53 29 7b 0a 20 20 20 20 62 49 6e 69 74 20 3d  TS){.    bInit =
115c0 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 73   FALSE;.  }..  s
115d0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d  qlite3_free(zNam
115e0 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  e);..  /* If we 
115f0 73 75 63 63 65 65 64 65 64 20 69 6e 20 6d 61 6b  succeeded in mak
11600 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
11610 65 6d 6f 72 79 20 68 61 6e 64 6c 65 2c 20 6d 61  emory handle, ma
11620 70 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  p it. */.  if( p
11630 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 29 7b  File->hShared ){
11640 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72  .    pFile->shar
11650 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f 63 6b 2a  ed = (winceLock*
11660 29 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  )osMapViewOfFile
11670 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 2c  (pFile->hShared,
11680 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 46 49  .             FI
11690 4c 45 5f 4d 41 50 5f 52 45 41 44 7c 46 49 4c 45  LE_MAP_READ|FILE
116a0 5f 4d 41 50 5f 57 52 49 54 45 2c 20 30 2c 20 30  _MAP_WRITE, 0, 0
116b0 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f  , sizeof(winceLo
116c0 63 6b 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20  ck));.    /* If 
116d0 6d 61 70 70 69 6e 67 20 66 61 69 6c 65 64 2c 20  mapping failed, 
116e0 63 6c 6f 73 65 20 74 68 65 20 73 68 61 72 65 64  close the shared
116f0 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 61   memory handle a
11700 6e 64 20 65 72 61 73 65 20 69 74 20 2a 2f 0a 20  nd erase it */. 
11710 20 20 20 69 66 28 20 21 70 46 69 6c 65 2d 3e 73     if( !pFile->s
11720 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20 70  hared ){.      p
11730 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
11740 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
11750 28 29 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67  ();.      winLog
11760 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
11770 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  RR, pFile->lastE
11780 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
11790 20 20 20 20 20 20 20 20 22 77 69 6e 63 65 43 72          "winceCr
117a0 65 61 74 65 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c  eateLock2", zFil
117b0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 4c  ename);.      bL
117c0 6f 67 67 65 64 20 3d 20 54 52 55 45 3b 0a 20 20  ogged = TRUE;.  
117d0 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
117e0 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64  e(pFile->hShared
117f0 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
11800 68 53 68 61 72 65 64 20 3d 20 4e 55 4c 4c 3b 0a  hShared = NULL;.
11810 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
11820 49 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  If shared memory
11830 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 72   could not be cr
11840 65 61 74 65 64 2c 20 74 68 65 6e 20 63 6c 6f 73  eated, then clos
11850 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20  e the mutex and 
11860 66 61 69 6c 20 2a 2f 0a 20 20 69 66 28 20 70 46  fail */.  if( pF
11870 69 6c 65 2d 3e 68 53 68 61 72 65 64 3d 3d 4e 55  ile->hShared==NU
11880 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 62  LL ){.    if( !b
11890 4c 6f 67 67 65 64 20 29 7b 0a 20 20 20 20 20 20  Logged ){.      
118a0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
118b0 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
118c0 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
118d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70 46  SQLITE_IOERR, pF
118e0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
118f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11900 20 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f    "winceCreateLo
11910 63 6b 33 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ck3", zFilename)
11920 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67 65 64 20  ;.      bLogged 
11930 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
11940 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65    winceMutexRele
11950 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ase(pFile->hMute
11960 78 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48  x);.    osCloseH
11970 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75  andle(pFile->hMu
11980 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  tex);.    pFile-
11990 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a  >hMutex = NULL;.
119a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
119b0 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 20 20  E_IOERR;.  }..  
119c0 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
119d0 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
119e0 69 66 20 77 65 27 72 65 20 73 75 70 70 6f 73 65  if we're suppose
119f0 64 20 74 6f 20 2a 2f 0a 20 20 69 66 28 20 62 49  d to */.  if( bI
11a00 6e 69 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  nit ){.    memse
11a10 74 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2c  t(pFile->shared,
11a20 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65   0, sizeof(wince
11a30 4c 6f 63 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20 77  Lock));.  }..  w
11a40 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
11a50 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
11a60 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11a70 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  _OK;.}../*.** De
11a80 73 74 72 6f 79 20 74 68 65 20 70 61 72 74 20 6f  stroy the part o
11a90 66 20 77 69 6e 46 69 6c 65 20 74 68 61 74 20 64  f winFile that d
11aa0 65 61 6c 73 20 77 69 74 68 20 77 69 6e 63 65 20  eals with wince 
11ab0 6c 6f 63 6b 73 0a 2a 2f 0a 73 74 61 74 69 63 20  locks.*/.static 
11ac0 76 6f 69 64 20 77 69 6e 63 65 44 65 73 74 72 6f  void winceDestro
11ad0 79 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70  yLock(winFile *p
11ae0 46 69 6c 65 29 7b 0a 20 20 69 66 20 28 70 46 69  File){.  if (pFi
11af0 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20  le->hMutex){.   
11b00 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65 20   /* Acquire the 
11b10 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e  mutex */.    win
11b20 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70  ceMutexAcquire(p
11b30 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a  File->hMutex);..
11b40 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
11b50 77 69 6e 67 20 62 6c 6f 63 6b 73 20 73 68 6f 75  wing blocks shou
11b60 6c 64 20 70 72 6f 62 61 62 6c 79 20 61 73 73 65  ld probably asse
11b70 72 74 20 69 6e 20 64 65 62 75 67 20 6d 6f 64 65  rt in debug mode
11b80 2c 20 62 75 74 20 74 68 65 79 0a 20 20 20 20 20  , but they.     
11b90 20 20 61 72 65 20 74 6f 20 63 6c 65 61 6e 75 70    are to cleanup
11ba0 20 69 6e 20 63 61 73 65 20 61 6e 79 20 6c 6f 63   in case any loc
11bb0 6b 73 20 72 65 6d 61 69 6e 65 64 20 6f 70 65 6e  ks remained open
11bc0 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c   */.    if (pFil
11bd0 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
11be0 73 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  s){.      pFile-
11bf0 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72  >shared->nReader
11c00 73 20 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  s --;.    }.    
11c10 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
11c20 2e 62 52 65 73 65 72 76 65 64 29 7b 0a 20 20 20  .bReserved){.   
11c30 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
11c40 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46 41  ->bReserved = FA
11c50 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  LSE;.    }.    i
11c60 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
11c70 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20  bPending){.     
11c80 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
11c90 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45  bPending = FALSE
11ca0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
11cb0 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78  pFile->local.bEx
11cc0 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20  clusive){.      
11cd0 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
11ce0 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53  Exclusive = FALS
11cf0 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  E;.    }..    /*
11d00 20 44 65 2d 72 65 66 65 72 65 6e 63 65 20 61 6e   De-reference an
11d10 64 20 63 6c 6f 73 65 20 6f 75 72 20 63 6f 70 79  d close our copy
11d20 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 6d   of the shared m
11d30 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 2a 2f 0a  emory handle */.
11d40 20 20 20 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f      osUnmapViewO
11d50 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 73 68 61  fFile(pFile->sha
11d60 72 65 64 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73  red);.    osClos
11d70 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68  eHandle(pFile->h
11d80 53 68 61 72 65 64 29 3b 0a 0a 20 20 20 20 2f 2a  Shared);..    /*
11d90 20 44 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6d   Done with the m
11da0 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63  utex */.    winc
11db0 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46  eMutexRelease(pF
11dc0 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20  ile->hMutex);.  
11dd0 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28    osCloseHandle(
11de0 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
11df0 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65      pFile->hMute
11e00 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a  x = NULL;.  }.}.
11e10 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d  ./*.** An implem
11e20 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
11e30 4c 6f 63 6b 46 69 6c 65 28 29 20 41 50 49 20 6f  LockFile() API o
11e40 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45  f Windows for CE
11e50 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
11e60 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 0a 20  winceLockFile(. 
11e70 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65   LPHANDLE phFile
11e80 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65  ,.  DWORD dwFile
11e90 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f  OffsetLow,.  DWO
11ea0 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 48  RD dwFileOffsetH
11eb0 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75  igh,.  DWORD nNu
11ec0 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
11ed0 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e  kLow,.  DWORD nN
11ee0 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
11ef0 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46  ckHigh.){.  winF
11f00 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e  ile *pFile = HAN
11f10 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70  DLE_TO_WINFILE(p
11f20 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62  hFile);.  BOOL b
11f30 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a  Return = FALSE;.
11f40 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
11f50 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65 74  TER(dwFileOffset
11f60 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f  High);.  UNUSED_
11f70 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65  PARAMETER(nNumbe
11f80 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69  rOfBytesToLockHi
11f90 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70 46 69  gh);..  if (!pFi
11fa0 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 75  le->hMutex) retu
11fb0 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63 65  rn TRUE;.  wince
11fc0 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69  MutexAcquire(pFi
11fd0 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20  le->hMutex);..  
11fe0 2f 2a 20 57 61 6e 74 69 6e 67 20 61 6e 20 65 78  /* Wanting an ex
11ff0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f  clusive lock? */
12000 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  .  if (dwFileOff
12010 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
12020 29 53 48 41 52 45 44 5f 46 49 52 53 54 0a 20 20  )SHARED_FIRST.  
12030 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f       && nNumberO
12040 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
12050 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
12060 5f 53 49 5a 45 29 7b 0a 20 20 20 20 69 66 20 28  _SIZE){.    if (
12070 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e  pFile->shared->n
12080 52 65 61 64 65 72 73 20 3d 3d 20 30 20 26 26 20  Readers == 0 && 
12090 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
120a0 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b  Exclusive == 0){
120b0 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  .       pFile->s
120c0 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76  hared->bExclusiv
120d0 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  e = TRUE;.      
120e0 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45   pFile->local.bE
120f0 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45 3b  xclusive = TRUE;
12100 0a 20 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  .       bReturn 
12110 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
12120 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 72  }..  /* Want a r
12130 65 61 64 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a  ead-only lock? *
12140 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
12150 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
12160 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49  (DWORD)SHARED_FI
12170 52 53 54 20 26 26 0a 20 20 20 20 20 20 20 20 20  RST &&.         
12180 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73    nNumberOfBytes
12190 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b  ToLockLow == 1){
121a0 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
121b0 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69  shared->bExclusi
121c0 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20  ve == 0){.      
121d0 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
121e0 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20  aders ++;.      
121f0 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
12200 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 31 29 7b  .nReaders == 1){
12210 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
12220 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73  shared->nReaders
12230 20 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   ++;.      }.   
12240 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
12250 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
12260 2f 2a 20 57 61 6e 74 20 61 20 70 65 6e 64 69 6e  /* Want a pendin
12270 67 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73  g lock? */.  els
12280 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
12290 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
122a0 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a 20 20 20  PENDING_BYTE.   
122b0 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62          && nNumb
122c0 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c  erOfBytesToLockL
122d0 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 2f 2a  ow == 1){.    /*
122e0 20 49 66 20 6e 6f 20 70 65 6e 64 69 6e 67 20 6c   If no pending l
122f0 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 61 63 71  ock has been acq
12300 75 69 72 65 64 2c 20 74 68 65 6e 20 61 63 71 75  uired, then acqu
12310 69 72 65 20 69 74 20 2a 2f 0a 20 20 20 20 69 66  ire it */.    if
12320 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d   (pFile->shared-
12330 3e 62 50 65 6e 64 69 6e 67 20 3d 3d 20 30 29 20  >bPending == 0) 
12340 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
12350 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20  hared->bPending 
12360 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46  = TRUE;.      pF
12370 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64  ile->local.bPend
12380 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ing = TRUE;.    
12390 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
123a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
123b0 2a 20 57 61 6e 74 20 61 20 72 65 73 65 72 76 65  * Want a reserve
123c0 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73  d lock? */.  els
123d0 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
123e0 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
123f0 52 45 53 45 52 56 45 44 5f 42 59 54 45 0a 20 20  RESERVED_BYTE.  
12400 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d           && nNum
12410 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
12420 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69  Low == 1){.    i
12430 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  f (pFile->shared
12440 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 3d 20 30  ->bReserved == 0
12450 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
12460 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76  >shared->bReserv
12470 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ed = TRUE;.     
12480 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52   pFile->local.bR
12490 65 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b 0a  eserved = TRUE;.
124a0 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
124b0 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
124c0 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c  .  winceMutexRel
124d0 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
124e0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52  ex);.  return bR
124f0 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
12500 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  An implementatio
12510 6e 20 6f 66 20 74 68 65 20 55 6e 6c 6f 63 6b 46  n of the UnlockF
12520 69 6c 65 20 41 50 49 20 6f 66 20 57 69 6e 64 6f  ile API of Windo
12530 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61  ws for CE.*/.sta
12540 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 55 6e  tic BOOL winceUn
12550 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41  lockFile(.  LPHA
12560 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44  NDLE phFile,.  D
12570 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65  WORD dwFileOffse
12580 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77  tLow,.  DWORD dw
12590 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a  FileOffsetHigh,.
125a0 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
125b0 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f  fBytesToUnlockLo
125c0 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62  w,.  DWORD nNumb
125d0 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63  erOfBytesToUnloc
125e0 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69  kHigh.){.  winFi
125f0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44  le *pFile = HAND
12600 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68  LE_TO_WINFILE(ph
12610 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52  File);.  BOOL bR
12620 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a  eturn = FALSE;..
12630 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
12640 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65 74 48  ER(dwFileOffsetH
12650 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  igh);.  UNUSED_P
12660 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72  ARAMETER(nNumber
12670 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48  OfBytesToUnlockH
12680 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70 46  igh);..  if (!pF
12690 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74  ile->hMutex) ret
126a0 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63  urn TRUE;.  winc
126b0 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46  eMutexAcquire(pF
126c0 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20  ile->hMutex);.. 
126d0 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20   /* Releasing a 
126e0 72 65 61 64 65 72 20 6c 6f 63 6b 20 6f 72 20 61  reader lock or a
126f0 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
12700 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65   */.  if (dwFile
12710 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
12720 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54  ORD)SHARED_FIRST
12730 29 7b 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65  ){.    /* Did we
12740 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69   have an exclusi
12750 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20  ve lock? */.    
12760 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
12770 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20  .bExclusive){.  
12780 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d 62      assert(nNumb
12790 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63  erOfBytesToUnloc
127a0 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53  kLow == (DWORD)S
127b0 48 41 52 45 44 5f 53 49 5a 45 29 3b 0a 20 20 20  HARED_SIZE);.   
127c0 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
127d0 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c  bExclusive = FAL
127e0 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  SE;.      pFile-
127f0 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
12800 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ive = FALSE;.   
12810 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
12820 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  E;.    }..    /*
12830 20 44 69 64 20 77 65 20 6a 75 73 74 20 68 61 76   Did we just hav
12840 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 3f  e a reader lock?
12850 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 20   */.    else if 
12860 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
12870 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20 61  eaders){.      a
12880 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42  ssert(nNumberOfB
12890 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20  ytesToUnlockLow 
128a0 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
128b0 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 20  _SIZE.          
128c0 20 20 20 7c 7c 20 6e 4e 75 6d 62 65 72 4f 66 42     || nNumberOfB
128d0 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20  ytesToUnlockLow 
128e0 3d 3d 20 31 29 3b 0a 20 20 20 20 20 20 70 46 69  == 1);.      pFi
128f0 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
12900 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 69 66 20  rs --;.      if 
12910 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
12920 65 61 64 65 72 73 20 3d 3d 20 30 29 0a 20 20 20  eaders == 0).   
12930 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70 46 69     {.        pFi
12940 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61  le->shared->nRea
12950 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 7d  ders --;.      }
12960 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
12970 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d   TRUE;.    }.  }
12980 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67  ..  /* Releasing
12990 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20   a pending lock 
129a0 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77  */.  else if (dw
129b0 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
129c0 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f   (DWORD)PENDING_
129d0 42 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  BYTE.           
129e0 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
129f0 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20  sToUnlockLow == 
12a00 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  1){.    if (pFil
12a10 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e  e->local.bPendin
12a20 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  g){.      pFile-
12a30 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20  >local.bPending 
12a40 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70  = FALSE;.      p
12a50 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50  File->shared->bP
12a60 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a  ending = FALSE;.
12a70 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
12a80 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
12a90 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61    /* Releasing a
12aa0 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a   reserved lock *
12ab0 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
12ac0 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
12ad0 28 44 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f  (DWORD)RESERVED_
12ae0 42 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  BYTE.           
12af0 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
12b00 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20  sToUnlockLow == 
12b10 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  1){.    if (pFil
12b20 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76  e->local.bReserv
12b30 65 64 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ed) {.      pFil
12b40 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76  e->local.bReserv
12b50 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ed = FALSE;.    
12b60 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
12b70 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c  >bReserved = FAL
12b80 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  SE;.      bRetur
12b90 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
12ba0 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65    }..  winceMute
12bb0 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e  xRelease(pFile->
12bc0 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  hMutex);.  retur
12bd0 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 0a  n bReturn;.}./*.
12be0 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73 70  ** End of the sp
12bf0 65 63 69 61 6c 20 63 6f 64 65 20 66 6f 72 20 77  ecial code for w
12c00 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ince.***********
12c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12c50 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  **/.#endif /* SQ
12c60 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f  LITE_OS_WINCE */
12c70 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61 20 66  ../*.** Lock a f
12c80 69 6c 65 20 72 65 67 69 6f 6e 2e 0a 2a 2f 0a 73  ile region..*/.s
12c90 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 4c 6f  tatic BOOL winLo
12ca0 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44  ckFile(.  LPHAND
12cb0 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f  LE phFile,.  DWO
12cc0 52 44 20 66 6c 61 67 73 2c 0a 20 20 44 57 4f 52  RD flags,.  DWOR
12cd0 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44  D offsetLow,.  D
12ce0 57 4f 52 44 20 6f 66 66 73 65 74 48 69 67 68 2c  WORD offsetHigh,
12cf0 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65  .  DWORD numByte
12d00 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75  sLow,.  DWORD nu
12d10 6d 42 79 74 65 73 48 69 67 68 0a 29 7b 0a 23 69  mBytesHigh.){.#i
12d20 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
12d30 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45  E.  /*.  ** NOTE
12d40 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20  : Windows CE is 
12d50 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e  handled differen
12d60 74 6c 79 20 68 65 72 65 20 64 75 65 20 69 74 73  tly here due its
12d70 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e   lack of the Win
12d80 33 32 0a 20 20 2a 2a 20 20 20 20 20 20 20 41 50  32.  **       AP
12d90 49 20 4c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f  I LockFile..  */
12da0 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65 4c  .  return winceL
12db0 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20  ockFile(phFile, 
12dc0 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65  offsetLow, offse
12dd0 74 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20 20  tHigh,.         
12de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75                nu
12df0 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79  mBytesLow, numBy
12e00 74 65 73 48 69 67 68 29 3b 0a 23 65 6c 73 65 0a  tesHigh);.#else.
12e10 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
12e20 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44  {.    OVERLAPPED
12e30 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65   ovlp;.    memse
12e40 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65  t(&ovlp, 0, size
12e50 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b  of(OVERLAPPED));
12e60 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74  .    ovlp.Offset
12e70 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20   = offsetLow;.  
12e80 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69 67    ovlp.OffsetHig
12e90 68 20 3d 20 6f 66 66 73 65 74 48 69 67 68 3b 0a  h = offsetHigh;.
12ea0 20 20 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63      return osLoc
12eb0 6b 46 69 6c 65 45 78 28 2a 70 68 46 69 6c 65 2c  kFileEx(*phFile,
12ec0 20 66 6c 61 67 73 2c 20 30 2c 20 6e 75 6d 42 79   flags, 0, numBy
12ed0 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73  tesLow, numBytes
12ee0 48 69 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20  High, &ovlp);.  
12ef0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
12f00 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 28 2a 70 68  n osLockFile(*ph
12f10 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c  File, offsetLow,
12f20 20 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d   offsetHigh, num
12f30 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20  BytesLow,.      
12f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f50 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 20  numBytesHigh);. 
12f60 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
12f70 2a 2a 20 55 6e 6c 6f 63 6b 20 61 20 66 69 6c 65  ** Unlock a file
12f80 20 72 65 67 69 6f 6e 2e 0a 20 2a 2f 0a 73 74 61   region.. */.sta
12f90 74 69 63 20 42 4f 4f 4c 20 77 69 6e 55 6e 6c 6f  tic BOOL winUnlo
12fa0 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44  ckFile(.  LPHAND
12fb0 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f  LE phFile,.  DWO
12fc0 52 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20  RD offsetLow,.  
12fd0 44 57 4f 52 44 20 6f 66 66 73 65 74 48 69 67 68  DWORD offsetHigh
12fe0 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74  ,.  DWORD numByt
12ff0 65 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e  esLow,.  DWORD n
13000 75 6d 42 79 74 65 73 48 69 67 68 0a 29 7b 0a 23  umBytesHigh.){.#
13010 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
13020 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54  CE.  /*.  ** NOT
13030 45 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73  E: Windows CE is
13040 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65   handled differe
13050 6e 74 6c 79 20 68 65 72 65 20 64 75 65 20 69 74  ntly here due it
13060 73 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69  s lack of the Wi
13070 6e 33 32 0a 20 20 2a 2a 20 20 20 20 20 20 20 41  n32.  **       A
13080 50 49 20 55 6e 6c 6f 63 6b 46 69 6c 65 2e 0a 20  PI UnlockFile.. 
13090 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 77 69 6e   */.  return win
130a0 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 68 46  ceUnlockFile(phF
130b0 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20  ile, offsetLow, 
130c0 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 20 20  offsetHigh,.    
130d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130e0 20 20 20 20 20 6e 75 6d 42 79 74 65 73 4c 6f 77       numBytesLow
130f0 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b  , numBytesHigh);
13100 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6f 73 49  .#else.  if( osI
13110 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f 56 45  sNT() ){.    OVE
13120 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20  RLAPPED ovlp;.  
13130 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20    memset(&ovlp, 
13140 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41  0, sizeof(OVERLA
13150 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70  PPED));.    ovlp
13160 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74  .Offset = offset
13170 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66  Low;.    ovlp.Of
13180 66 73 65 74 48 69 67 68 20 3d 20 6f 66 66 73 65  fsetHigh = offse
13190 74 48 69 67 68 3b 0a 20 20 20 20 72 65 74 75 72  tHigh;.    retur
131a0 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78  n osUnlockFileEx
131b0 28 2a 70 68 46 69 6c 65 2c 20 30 2c 20 6e 75 6d  (*phFile, 0, num
131c0 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74  BytesLow, numByt
131d0 65 73 48 69 67 68 2c 20 26 6f 76 6c 70 29 3b 0a  esHigh, &ovlp);.
131e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
131f0 75 72 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65  urn osUnlockFile
13200 28 2a 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74  (*phFile, offset
13210 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c  Low, offsetHigh,
13220 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20   numBytesLow,.  
13230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13240 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73 48 69        numBytesHi
13250 67 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  gh);.  }.#endif.
13260 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
13270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
132a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
132b0 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 72  *.** The next gr
132c0 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  oup of routines 
132d0 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 2f  implement the I/
132e0 4f 20 6d 65 74 68 6f 64 73 20 73 70 65 63 69 66  O methods specif
132f0 69 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 71  ied.** by the sq
13300 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
13310 20 6f 62 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a   object..*******
13320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13360 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
13370 53 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20 63  Some Microsoft c
13380 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74 68  ompilers lack th
13390 69 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a  is definition..*
133a0 2f 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c 49  /.#ifndef INVALI
133b0 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54  D_SET_FILE_POINT
133c0 45 52 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41  ER.# define INVA
133d0 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
133e0 4e 54 45 52 20 28 28 44 57 4f 52 44 29 2d 31 29  NTER ((DWORD)-1)
133f0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
13400 6f 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ove the current 
13410 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  position of the 
13420 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 61 73 73  file handle pass
13430 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 0a  ed as the first.
13440 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f  ** argument to o
13450 66 66 73 65 74 20 69 4f 66 66 73 65 74 20 77 69  ffset iOffset wi
13460 74 68 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 49  thin the file. I
13470 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  f successful, re
13480 74 75 72 6e 20 30 2e 0a 2a 2a 20 4f 74 68 65 72  turn 0..** Other
13490 77 69 73 65 2c 20 73 65 74 20 70 46 69 6c 65 2d  wise, set pFile-
134a0 3e 6c 61 73 74 45 72 72 6e 6f 20 61 6e 64 20 72  >lastErrno and r
134b0 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  eturn non-zero..
134c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
134d0 6e 53 65 65 6b 46 69 6c 65 28 77 69 6e 46 69 6c  nSeekFile(winFil
134e0 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65  e *pFile, sqlite
134f0 33 5f 69 6e 74 36 34 20 69 4f 66 66 73 65 74 29  3_int64 iOffset)
13500 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  {.#if !SQLITE_OS
13510 5f 57 49 4e 52 54 0a 20 20 4c 4f 4e 47 20 75 70  _WINRT.  LONG up
13520 70 65 72 42 69 74 73 3b 20 20 20 20 20 20 20 20  perBits;        
13530 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74           /* Most
13540 20 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f 66   sig. 32 bits of
13550 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20   new offset */. 
13560 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73 3b   LONG lowerBits;
13570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13580 20 2f 2a 20 4c 65 61 73 74 20 73 69 67 2e 20 33   /* Least sig. 3
13590 32 20 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66  2 bits of new of
135a0 66 73 65 74 20 2a 2f 0a 20 20 44 57 4f 52 44 20  fset */.  DWORD 
135b0 64 77 52 65 74 3b 20 20 20 20 20 20 20 20 20 20  dwRet;          
135c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
135d0 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 53  ue returned by S
135e0 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 29 20  etFilePointer() 
135f0 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  */.  DWORD lastE
13600 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
13610 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
13620 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61 73  turned by GetLas
13630 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 20 20 4f  tError() */..  O
13640 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69  STRACE(("SEEK fi
13650 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c  le=%p, offset=%l
13660 6c 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  ld\n", pFile->h,
13670 20 69 4f 66 66 73 65 74 29 29 3b 0a 0a 20 20 75   iOffset));..  u
13680 70 70 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47  pperBits = (LONG
13690 29 28 28 69 4f 66 66 73 65 74 3e 3e 33 32 29 20  )((iOffset>>32) 
136a0 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20  & 0x7fffffff);. 
136b0 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 28 4c 4f   lowerBits = (LO
136c0 4e 47 29 28 69 4f 66 66 73 65 74 20 26 20 30 78  NG)(iOffset & 0x
136d0 66 66 66 66 66 66 66 66 29 3b 0a 0a 20 20 2f 2a  ffffffff);..  /*
136e0 20 41 50 49 20 6f 64 64 69 74 79 3a 20 49 66 20   API oddity: If 
136f0 73 75 63 63 65 73 73 66 75 6c 2c 20 53 65 74 46  successful, SetF
13700 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 72 65 74  ilePointer() ret
13710 75 72 6e 73 20 61 20 64 77 6f 72 64 0a 20 20 2a  urns a dword.  *
13720 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
13730 20 6c 6f 77 65 72 20 33 32 2d 62 69 74 73 20 6f   lower 32-bits o
13740 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f  f the new file-o
13750 66 66 73 65 74 2e 20 4f 72 2c 20 69 66 20 69 74  ffset. Or, if it
13760 20 66 61 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20   fails,.  ** it 
13770 72 65 74 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f  returns INVALID_
13780 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
13790 2e 20 48 6f 77 65 76 65 72 20 61 63 63 6f 72 64  . However accord
137a0 69 6e 67 20 74 6f 20 4d 53 44 4e 2c 0a 20 20 2a  ing to MSDN,.  *
137b0 2a 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49  * INVALID_SET_FI
137c0 4c 45 5f 50 4f 49 4e 54 45 52 20 6d 61 79 20 61  LE_POINTER may a
137d0 6c 73 6f 20 62 65 20 61 20 76 61 6c 69 64 20 6e  lso be a valid n
137e0 65 77 20 6f 66 66 73 65 74 2e 20 53 6f 20 74 6f  ew offset. So to
137f0 20 64 65 74 65 72 6d 69 6e 65 0a 20 20 2a 2a 20   determine.  ** 
13800 77 68 65 74 68 65 72 20 61 6e 20 65 72 72 6f 72  whether an error
13810 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 6f 63   has actually oc
13820 63 75 72 72 65 64 2c 20 69 74 20 69 73 20 61 6c  curred, it is al
13830 73 6f 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  so necessary to 
13840 63 61 6c 6c 0a 20 20 2a 2a 20 47 65 74 4c 61 73  call.  ** GetLas
13850 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20  tError()..  */. 
13860 20 64 77 52 65 74 20 3d 20 6f 73 53 65 74 46 69   dwRet = osSetFi
13870 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d  lePointer(pFile-
13880 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 26  >h, lowerBits, &
13890 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f  upperBits, FILE_
138a0 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 20 28  BEGIN);..  if( (
138b0 64 77 52 65 74 3d 3d 49 4e 56 41 4c 49 44 5f 53  dwRet==INVALID_S
138c0 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a  ET_FILE_POINTER.
138d0 20 20 20 20 20 20 26 26 20 28 28 6c 61 73 74 45        && ((lastE
138e0 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
138f0 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52  Error())!=NO_ERR
13900 4f 52 29 29 20 29 7b 0a 20 20 20 20 70 46 69 6c  OR)) ){.    pFil
13910 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
13920 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69  astErrno;.    wi
13930 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
13940 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46 69  _IOERR_SEEK, pFi
13950 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
13960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
13970 77 69 6e 53 65 65 6b 46 69 6c 65 22 2c 20 70 46  winSeekFile", pF
13980 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
13990 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20   OSTRACE(("SEEK 
139a0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
139b0 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22  TE_IOERR_SEEK\n"
139c0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
139d0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
139e0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 45  .  OSTRACE(("SEE
139f0 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  K file=%p, rc=SQ
13a00 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
13a10 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e  e->h));.  return
13a20 20 30 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 0a 20   0;.#else.  /*. 
13a30 20 2a 2a 20 53 61 6d 65 20 61 73 20 61 62 6f 76   ** Same as abov
13a40 65 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 74  e, except that t
13a50 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
13a60 6f 6e 20 77 6f 72 6b 73 20 66 6f 72 20 57 69 6e  on works for Win
13a70 52 54 2e 0a 20 20 2a 2f 0a 0a 20 20 4c 41 52 47  RT..  */..  LARG
13a80 45 5f 49 4e 54 45 47 45 52 20 78 3b 20 20 20 20  E_INTEGER x;    
13a90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13aa0 68 65 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f  he new offset */
13ab0 0a 20 20 42 4f 4f 4c 20 62 52 65 74 3b 20 20 20  .  BOOL bRet;   
13ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ad0 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
13ae0 72 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65 50  rned by SetFileP
13af0 6f 69 6e 74 65 72 45 78 28 29 20 2a 2f 0a 0a 20  ointerEx() */.. 
13b00 20 78 2e 51 75 61 64 50 61 72 74 20 3d 20 69 4f   x.QuadPart = iO
13b10 66 66 73 65 74 3b 0a 20 20 62 52 65 74 20 3d 20  ffset;.  bRet = 
13b20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  osSetFilePointer
13b30 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 78 2c 20  Ex(pFile->h, x, 
13b40 30 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a  0, FILE_BEGIN);.
13b50 0a 20 20 69 66 28 21 62 52 65 74 29 7b 0a 20 20  .  if(!bRet){.  
13b60 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
13b70 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
13b80 72 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f  ror();.    winLo
13b90 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
13ba0 45 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d  ERR_SEEK, pFile-
13bb0 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
13bc0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
13bd0 53 65 65 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65  SeekFile", pFile
13be0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 4f 53  ->zPath);.    OS
13bf0 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c  TRACE(("SEEK fil
13c00 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
13c10 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22 2c 20 70  IOERR_SEEK\n", p
13c20 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
13c30 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
13c40 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66  OSTRACE(("SEEK f
13c50 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
13c60 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
13c70 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  h));.  return 0;
13c80 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 20 53  .#endif.}..#if S
13c90 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
13ca0 49 5a 45 3e 30 0a 2f 2a 20 46 6f 72 77 61 72 64  IZE>0./* Forward
13cb0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56   references to V
13cc0 46 53 20 68 65 6c 70 65 72 20 6d 65 74 68 6f 64  FS helper method
13cd0 73 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 6f 72  s used for memor
13ce0 79 20 6d 61 70 70 65 64 20 66 69 6c 65 73 20 2a  y mapped files *
13cf0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
13d00 4d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 2a  Mapfile(winFile*
13d10 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  , sqlite3_int64)
13d20 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
13d30 55 6e 6d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c  Unmapfile(winFil
13d40 65 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e*);.#endif../*.
13d50 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
13d60 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 72 65 70  .**.** It is rep
13d70 6f 72 74 65 64 20 74 68 61 74 20 61 6e 20 61 74  orted that an at
13d80 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73 65 20 61  tempt to close a
13d90 20 68 61 6e 64 6c 65 20 6d 69 67 68 74 20 73 6f   handle might so
13da0 6d 65 74 69 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e  metimes.** fail.
13db0 20 20 54 68 69 73 20 69 73 20 61 20 76 65 72 79    This is a very
13dc0 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 72 65   unreasonable re
13dd0 73 75 6c 74 2c 20 62 75 74 20 57 69 6e 64 6f 77  sult, but Window
13de0 73 20 69 73 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a  s is notorious.*
13df0 2a 20 66 6f 72 20 62 65 69 6e 67 20 75 6e 72 65  * for being unre
13e00 61 73 6f 6e 61 62 6c 65 20 73 6f 20 49 20 64 6f  asonable so I do
13e10 20 6e 6f 74 20 64 6f 75 62 74 20 74 68 61 74 20   not doubt that 
13e20 69 74 20 6d 69 67 68 74 20 68 61 70 70 65 6e 2e  it might happen.
13e30 20 20 49 66 0a 2a 2a 20 74 68 65 20 63 6c 6f 73    If.** the clos
13e40 65 20 66 61 69 6c 73 2c 20 77 65 20 70 61 75 73  e fails, we paus
13e50 65 20 66 6f 72 20 31 30 30 20 6d 69 6c 6c 69 73  e for 100 millis
13e60 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 61  econds and try a
13e70 67 61 69 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e  gain.  As.** man
13e80 79 20 61 73 20 4d 58 5f 43 4c 4f 53 45 5f 41 54  y as MX_CLOSE_AT
13e90 54 45 4d 50 54 20 61 74 74 65 6d 70 74 73 20 74  TEMPT attempts t
13ea0 6f 20 63 6c 6f 73 65 20 74 68 65 20 68 61 6e 64  o close the hand
13eb0 6c 65 20 61 72 65 20 6d 61 64 65 20 62 65 66 6f  le are made befo
13ec0 72 65 0a 2a 2a 20 67 69 76 69 6e 67 20 75 70 20  re.** giving up 
13ed0 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  and returning an
13ee0 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69   error..*/.#defi
13ef0 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45  ne MX_CLOSE_ATTE
13f00 4d 50 54 20 33 0a 73 74 61 74 69 63 20 69 6e 74  MPT 3.static int
13f10 20 77 69 6e 43 6c 6f 73 65 28 73 71 6c 69 74 65   winClose(sqlite
13f20 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69  3_file *id){.  i
13f30 6e 74 20 72 63 2c 20 63 6e 74 20 3d 20 30 3b 0a  nt rc, cnt = 0;.
13f40 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
13f50 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
13f60 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
13f70 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 );.#ifndef SQL
13f80 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 61  ITE_OMIT_WAL.  a
13f90 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 53  ssert( pFile->pS
13fa0 68 6d 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  hm==0 );.#endif.
13fb0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
13fc0 3e 68 21 3d 4e 55 4c 4c 20 26 26 20 70 46 69 6c  >h!=NULL && pFil
13fd0 65 2d 3e 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41  e->h!=INVALID_HA
13fe0 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 20 20  NDLE_VALUE );.  
13ff0 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  OSTRACE(("CLOSE 
14000 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
14010 70 2c 20 66 69 6c 65 3d 25 70 5c 6e 22 2c 0a 20  p, file=%p\n",. 
14020 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
14030 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
14040 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  ), pFile, pFile-
14050 3e 68 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54  >h));..#if SQLIT
14060 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
14070 30 0a 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65  0.  winUnmapfile
14080 28 70 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a  (pFile);.#endif.
14090 0a 20 20 64 6f 7b 0a 20 20 20 20 72 63 20 3d 20  .  do{.    rc = 
140a0 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
140b0 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 2f 2a 20  ile->h);.    /* 
140c0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
140d0 20 72 63 3d 30 3b 20 63 6e 74 3d 4d 58 5f 43 4c   rc=0; cnt=MX_CL
140e0 4f 53 45 5f 41 54 54 45 4d 50 54 3b 20 29 3b 20  OSE_ATTEMPT; ); 
140f0 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  */.  }while( rc=
14100 3d 30 20 26 26 20 2b 2b 63 6e 74 20 3c 20 4d 58  =0 && ++cnt < MX
14110 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 26  _CLOSE_ATTEMPT &
14120 26 20 28 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  & (sqlite3_win32
14130 5f 73 6c 65 65 70 28 31 30 30 29 2c 20 31 29 20  _sleep(100), 1) 
14140 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  );.#if SQLITE_OS
14150 5f 57 49 4e 43 45 0a 23 64 65 66 69 6e 65 20 57  _WINCE.#define W
14160 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54  INCE_DELETION_AT
14170 54 45 4d 50 54 53 20 33 0a 20 20 7b 0a 20 20 20  TEMPTS 3.  {.   
14180 20 77 69 6e 56 66 73 41 70 70 44 61 74 61 20 2a   winVfsAppData *
14190 70 41 70 70 44 61 74 61 20 3d 20 28 77 69 6e 56  pAppData = (winV
141a0 66 73 41 70 70 44 61 74 61 2a 29 70 46 69 6c 65  fsAppData*)pFile
141b0 2d 3e 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61  ->pVfs->pAppData
141c0 3b 0a 20 20 20 20 69 66 28 20 70 41 70 70 44 61  ;.    if( pAppDa
141d0 74 61 3d 3d 4e 55 4c 4c 20 7c 7c 20 21 70 41 70  ta==NULL || !pAp
141e0 70 44 61 74 61 2d 3e 62 4e 6f 4c 6f 63 6b 20 29  pData->bNoLock )
141f0 7b 0a 20 20 20 20 20 20 77 69 6e 63 65 44 65 73  {.      winceDes
14200 74 72 6f 79 4c 6f 63 6b 28 70 46 69 6c 65 29 3b  troyLock(pFile);
14210 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
14220 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f   pFile->zDeleteO
14230 6e 43 6c 6f 73 65 20 29 7b 0a 20 20 20 20 69 6e  nClose ){.    in
14240 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77  t cnt = 0;.    w
14250 68 69 6c 65 28 0a 20 20 20 20 20 20 20 20 20 20  hile(.          
14260 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28 70   osDeleteFileW(p
14270 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
14280 6c 6f 73 65 29 3d 3d 30 0a 20 20 20 20 20 20 20  lose)==0.       
14290 20 26 26 20 6f 73 47 65 74 46 69 6c 65 41 74 74   && osGetFileAtt
142a0 72 69 62 75 74 65 73 57 28 70 46 69 6c 65 2d 3e  ributesW(pFile->
142b0 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 21  zDeleteOnClose)!
142c0 3d 30 78 66 66 66 66 66 66 66 66 0a 20 20 20 20  =0xffffffff.    
142d0 20 20 20 20 26 26 20 63 6e 74 2b 2b 20 3c 20 57      && cnt++ < W
142e0 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54  INCE_DELETION_AT
142f0 54 45 4d 50 54 53 0a 20 20 20 20 29 7b 0a 20 20  TEMPTS.    ){.  
14300 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e       sqlite3_win
14310 33 32 5f 73 6c 65 65 70 28 31 30 30 29 3b 20 20  32_sleep(100);  
14320 2f 2a 20 57 61 69 74 20 61 20 6c 69 74 74 6c 65  /* Wait a little
14330 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20 61   before trying a
14340 67 61 69 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  gain */.    }.  
14350 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
14360 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
14370 6c 6f 73 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  lose);.  }.#endi
14380 66 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  f.  if( rc ){.  
14390 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 4e 55 4c    pFile->h = NUL
143a0 4c 3b 0a 20 20 7d 0a 20 20 4f 70 65 6e 43 6f 75  L;.  }.  OpenCou
143b0 6e 74 65 72 28 2d 31 29 3b 0a 20 20 4f 53 54 52  nter(-1);.  OSTR
143c0 41 43 45 28 28 22 43 4c 4f 53 45 20 70 69 64 3d  ACE(("CLOSE pid=
143d0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66  %lu, pFile=%p, f
143e0 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22  ile=%p, rc=%s\n"
143f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
14400 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
14410 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69  Id(), pFile, pFi
14420 6c 65 2d 3e 68 2c 20 72 63 20 3f 20 22 6f 6b 22  le->h, rc ? "ok"
14430 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
14440 20 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c   return rc ? SQL
14450 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20  ITE_OK.         
14460 20 20 20 3a 20 77 69 6e 4c 6f 67 45 72 72 6f 72     : winLogError
14470 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c  (SQLITE_IOERR_CL
14480 4f 53 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  OSE, osGetLastEr
14490 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
144a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144b0 20 22 77 69 6e 43 6c 6f 73 65 22 2c 20 70 46 69   "winClose", pFi
144c0 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f  le->zPath);.}../
144d0 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
144e0 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20  rom a file into 
144f0 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72  a buffer.  Retur
14500 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61  n SQLITE_OK if a
14510 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65  ll.** bytes were
14520 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
14530 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f  ly and SQLITE_IO
14540 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ERR if anything 
14550 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a  goes.** wrong..*
14560 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
14570 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  Read(.  sqlite3_
14580 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20  file *id,       
14590 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 72 65     /* File to re
145a0 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69  ad from */.  voi
145b0 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
145c0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
145d0 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 74 68   content into th
145e0 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  is buffer */.  i
145f0 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  nt amt,         
14600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
14610 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
14620 72 65 61 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  read */.  sqlite
14630 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20  3_int64 offset  
14640 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65       /* Begin re
14650 61 64 69 6e 67 20 61 74 20 74 68 69 73 20 6f 66  ading at this of
14660 66 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 21  fset */.){.#if !
14670 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
14680 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
14690 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52  TE_WIN32_NO_OVER
146a0 4c 41 50 50 45 44 29 0a 20 20 4f 56 45 52 4c 41  LAPPED).  OVERLA
146b0 50 50 45 44 20 6f 76 65 72 6c 61 70 70 65 64 3b  PPED overlapped;
146c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
146d0 20 6f 66 66 73 65 74 20 66 6f 72 20 52 65 61 64   offset for Read
146e0 46 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  File. */.#endif.
146f0 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
14700 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
14710 20 20 2f 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65    /* file handle
14720 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6e 52 65 61   */.  DWORD nRea
14730 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
14740 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
14750 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
14760 79 20 72 65 61 64 20 66 72 6f 6d 20 66 69 6c 65  y read from file
14770 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72 79   */.  int nRetry
14780 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
14790 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
147a0 6f 66 20 72 65 74 72 79 73 20 2a 2f 0a 0a 20 20  of retrys */..  
147b0 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
147c0 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30  .  assert( amt>0
147d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
147e0 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 53 69 6d  fset>=0 );.  Sim
147f0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
14800 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
14810 5f 52 45 41 44 29 3b 0a 20 20 4f 53 54 52 41 43  _READ);.  OSTRAC
14820 45 28 28 22 52 45 41 44 20 70 69 64 3d 25 6c 75  E(("READ pid=%lu
14830 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65  , pFile=%p, file
14840 3d 25 70 2c 20 62 75 66 66 65 72 3d 25 70 2c 20  =%p, buffer=%p, 
14850 61 6d 6f 75 6e 74 3d 25 64 2c 20 22 0a 20 20 20  amount=%d, ".   
14860 20 20 20 20 20 20 20 20 22 6f 66 66 73 65 74 3d          "offset=
14870 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22  %lld, lock=%d\n"
14880 2c 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  , osGetCurrentPr
14890 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
148a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
148b0 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74  le->h, pBuf, amt
148c0 2c 20 6f 66 66 73 65 74 2c 20 70 46 69 6c 65 2d  , offset, pFile-
148d0 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69  >locktype));..#i
148e0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
148f0 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65  P_SIZE>0.  /* De
14900 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68 20  al with as much 
14910 6f 66 20 74 68 69 73 20 72 65 61 64 20 72 65 71  of this read req
14920 75 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65  uest as possible
14930 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a   by transfering.
14940 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74    ** data from t
14950 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e  he memory mappin
14960 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29  g using memcpy()
14970 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  .  */.  if( offs
14980 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  et<pFile->mmapSi
14990 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66  ze ){.    if( of
149a0 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c  fset+amt <= pFil
149b0 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
149c0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66       memcpy(pBuf
149d0 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65  , &((u8 *)(pFile
149e0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f  ->pMapRegion))[o
149f0 66 66 73 65 74 5d 2c 20 61 6d 74 29 3b 0a 20 20  ffset], amt);.  
14a00 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 52 45      OSTRACE(("RE
14a10 41 44 2d 4d 4d 41 50 20 70 69 64 3d 25 6c 75 2c  AD-MMAP pid=%lu,
14a20 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d   pFile=%p, file=
14a30 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
14a40 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
14a50 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
14a60 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
14a70 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  le, pFile->h));.
14a80 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
14a90 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
14aa0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  e{.      int nCo
14ab0 70 79 20 3d 20 28 69 6e 74 29 28 70 46 69 6c 65  py = (int)(pFile
14ac0 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66  ->mmapSize - off
14ad0 73 65 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  set);.      memc
14ae0 70 79 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a  py(pBuf, &((u8 *
14af0 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  )(pFile->pMapReg
14b00 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 6e  ion))[offset], n
14b10 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75  Copy);.      pBu
14b20 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66  f = &((u8 *)pBuf
14b30 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20  )[nCopy];.      
14b40 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20  amt -= nCopy;.  
14b50 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43      offset += nC
14b60 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  opy;.    }.  }.#
14b70 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
14b80 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 64 65  E_OS_WINCE || de
14b90 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
14ba0 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44  32_NO_OVERLAPPED
14bb0 29 0a 20 20 69 66 28 20 77 69 6e 53 65 65 6b 46  ).  if( winSeekF
14bc0 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65  ile(pFile, offse
14bd0 74 29 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  t) ){.    OSTRAC
14be0 45 28 28 22 52 45 41 44 20 70 69 64 3d 25 6c 75  E(("READ pid=%lu
14bf0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65  , pFile=%p, file
14c00 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 46  =%p, rc=SQLITE_F
14c10 55 4c 4c 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ULL\n",.        
14c20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
14c30 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
14c40 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  ile, pFile->h));
14c50 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14c60 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 77  TE_FULL;.  }.  w
14c70 68 69 6c 65 28 20 21 6f 73 52 65 61 64 46 69 6c  hile( !osReadFil
14c80 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66  e(pFile->h, pBuf
14c90 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20 30  , amt, &nRead, 0
14ca0 29 20 29 7b 0a 23 65 6c 73 65 0a 20 20 6d 65 6d  ) ){.#else.  mem
14cb0 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65 64 2c  set(&overlapped,
14cc0 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c   0, sizeof(OVERL
14cd0 41 50 50 45 44 29 29 3b 0a 20 20 6f 76 65 72 6c  APPED));.  overl
14ce0 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28  apped.Offset = (
14cf0 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30  LONG)(offset & 0
14d00 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 6f 76  xffffffff);.  ov
14d10 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48  erlapped.OffsetH
14d20 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66  igh = (LONG)((of
14d30 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66  fset>>32) & 0x7f
14d40 66 66 66 66 66 66 29 3b 0a 20 20 77 68 69 6c 65  ffffff);.  while
14d50 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46  ( !osReadFile(pF
14d60 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d  ile->h, pBuf, am
14d70 74 2c 20 26 6e 52 65 61 64 2c 20 26 6f 76 65 72  t, &nRead, &over
14d80 6c 61 70 70 65 64 29 20 26 26 0a 20 20 20 20 20  lapped) &&.     
14d90 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72      osGetLastErr
14da0 6f 72 28 29 21 3d 45 52 52 4f 52 5f 48 41 4e 44  or()!=ERROR_HAND
14db0 4c 45 5f 45 4f 46 20 29 7b 0a 23 65 6e 64 69 66  LE_EOF ){.#endif
14dc0 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45  .    DWORD lastE
14dd0 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 77 69  rrno;.    if( wi
14de0 6e 52 65 74 72 79 49 6f 65 72 72 28 26 6e 52 65  nRetryIoerr(&nRe
14df0 74 72 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  try, &lastErrno)
14e00 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
14e10 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
14e20 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
14e30 20 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41     OSTRACE(("REA
14e40 44 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  D pid=%lu, pFile
14e50 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63  =%p, file=%p, rc
14e60 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45  =SQLITE_IOERR_RE
14e70 41 44 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  AD\n",.         
14e80 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
14e90 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
14ea0 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  le, pFile->h));.
14eb0 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
14ec0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
14ed0 45 52 52 5f 52 45 41 44 2c 20 70 46 69 6c 65 2d  ERR_READ, pFile-
14ee0 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
14ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f00 20 20 20 22 77 69 6e 52 65 61 64 22 2c 20 70 46     "winRead", pF
14f10 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
14f20 0a 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 6e  .  winLogIoerr(n
14f30 52 65 74 72 79 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  Retry, __LINE__)
14f40 3b 0a 20 20 69 66 28 20 6e 52 65 61 64 3c 28 44  ;.  if( nRead<(D
14f50 57 4f 52 44 29 61 6d 74 20 29 7b 0a 20 20 20 20  WORD)amt ){.    
14f60 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73 20  /* Unread parts 
14f70 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6d 75  of the buffer mu
14f80 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  st be zero-fille
14f90 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  d */.    memset(
14fa0 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 6e  &((char*)pBuf)[n
14fb0 52 65 61 64 5d 2c 20 30 2c 20 61 6d 74 2d 6e 52  Read], 0, amt-nR
14fc0 65 61 64 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ead);.    OSTRAC
14fd0 45 28 28 22 52 45 41 44 20 70 69 64 3d 25 6c 75  E(("READ pid=%lu
14fe0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65  , pFile=%p, file
14ff0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%p, rc=SQLITE_I
15000 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 5c  OERR_SHORT_READ\
15010 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
15020 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
15030 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
15040 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
15050 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
15060 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b  OERR_SHORT_READ;
15070 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28  .  }..  OSTRACE(
15080 28 22 52 45 41 44 20 70 69 64 3d 25 6c 75 2c 20  ("READ pid=%lu, 
15090 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25  pFile=%p, file=%
150a0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
150b0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
150c0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
150d0 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70  ssId(), pFile, p
150e0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74  File->h));.  ret
150f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
15100 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61  ../*.** Write da
15110 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
15120 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52   into a file.  R
15130 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
15140 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72  on success.** or
15150 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
15160 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72  r code on failur
15170 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
15180 20 77 69 6e 57 72 69 74 65 28 0a 20 20 73 71 6c   winWrite(.  sql
15190 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20  ite3_file *id,  
151a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
151b0 46 69 6c 65 20 74 6f 20 77 72 69 74 65 20 69 6e  File to write in
151c0 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  to */.  const vo
151d0 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
151e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
151f0 79 74 65 73 20 74 6f 20 62 65 20 77 72 69 74 74  ytes to be writt
15200 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c  en */.  int amt,
15210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15220 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
15230 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 77 72  r of bytes to wr
15240 69 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ite */.  sqlite3
15250 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20  _int64 offset   
15260 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
15270 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  et into the file
15280 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74 69 6e   to begin writin
15290 67 20 61 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  g at */.){.  int
152a0 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20   rc = 0;        
152b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
152c0 54 72 75 65 20 69 66 20 65 72 72 6f 72 20 68 61  True if error ha
152d0 73 20 6f 63 63 75 72 72 65 64 2c 20 65 6c 73 65  s occurred, else
152e0 20 66 61 6c 73 65 20 2a 2f 0a 20 20 77 69 6e 46   false */.  winF
152f0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
15300 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46  nFile*)id;  /* F
15310 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ile handle */.  
15320 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20  int nRetry = 0; 
15330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15340 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74  /* Number of ret
15350 72 69 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ries */..  asser
15360 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73  t( amt>0 );.  as
15370 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
15380 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
15390 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
153a0 4f 45 52 52 5f 57 52 49 54 45 29 3b 0a 20 20 53  OERR_WRITE);.  S
153b0 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
153c0 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
153d0 54 45 5f 46 55 4c 4c 29 3b 0a 0a 20 20 4f 53 54  TE_FULL);..  OST
153e0 52 41 43 45 28 28 22 57 52 49 54 45 20 70 69 64  RACE(("WRITE pid
153f0 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
15400 66 69 6c 65 3d 25 70 2c 20 62 75 66 66 65 72 3d  file=%p, buffer=
15410 25 70 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 22  %p, amount=%d, "
15420 0a 20 20 20 20 20 20 20 20 20 20 20 22 6f 66 66  .           "off
15430 73 65 74 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25  set=%lld, lock=%
15440 64 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72 72 65  d\n", osGetCurre
15450 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
15460 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20  File,.          
15470 20 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c   pFile->h, pBuf,
15480 20 61 6d 74 2c 20 6f 66 66 73 65 74 2c 20 70 46   amt, offset, pF
15490 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b  ile->locktype));
154a0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
154b0 4c 49 54 45 5f 4d 4d 41 50 5f 52 45 41 44 57 52  LITE_MMAP_READWR
154c0 49 54 45 29 20 26 26 20 53 51 4c 49 54 45 5f 4d  ITE) && SQLITE_M
154d0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
154e0 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61 73   /* Deal with as
154f0 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20 77 72   much of this wr
15500 69 74 65 20 72 65 71 75 65 73 74 20 61 73 20 70  ite request as p
15510 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73  ossible by trans
15520 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61  fering.  ** data
15530 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79   from the memory
15540 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d   mapping using m
15550 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69  emcpy().  */.  i
15560 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d  f( offset<pFile-
15570 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
15580 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20   if( offset+amt 
15590 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  <= pFile->mmapSi
155a0 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  ze ){.      memc
155b0 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c  py(&((u8 *)(pFil
155c0 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b  e->pMapRegion))[
155d0 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61  offset], pBuf, a
155e0 6d 74 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  mt);.      OSTRA
155f0 43 45 28 28 22 57 52 49 54 45 2d 4d 4d 41 50 20  CE(("WRITE-MMAP 
15600 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
15610 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  p, file=%p, rc=S
15620 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
15630 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
15640 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
15650 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
15660 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
15670 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15680 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15690 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e   int nCopy = (in
156a0 74 29 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  t)(pFile->mmapSi
156b0 7a 65 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20 20  ze - offset);.  
156c0 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38      memcpy(&((u8
156d0 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52   *)(pFile->pMapR
156e0 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c  egion))[offset],
156f0 20 70 42 75 66 2c 20 6e 43 6f 70 79 29 3b 0a 20   pBuf, nCopy);. 
15700 20 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 75       pBuf = &((u
15710 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d  8 *)pBuf)[nCopy]
15720 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e  ;.      amt -= n
15730 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73  Copy;.      offs
15740 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20  et += nCopy;.   
15750 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23   }.  }.#endif..#
15760 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
15770 43 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  CE || defined(SQ
15780 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56  LITE_WIN32_NO_OV
15790 45 52 4c 41 50 50 45 44 29 0a 20 20 72 63 20 3d  ERLAPPED).  rc =
157a0 20 77 69 6e 53 65 65 6b 46 69 6c 65 28 70 46 69   winSeekFile(pFi
157b0 6c 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69  le, offset);.  i
157c0 66 28 20 72 63 3d 3d 30 20 29 7b 0a 23 65 6c 73  f( rc==0 ){.#els
157d0 65 0a 20 20 7b 0a 23 65 6e 64 69 66 0a 23 69 66  e.  {.#endif.#if
157e0 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
157f0 45 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  E && !defined(SQ
15800 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56  LITE_WIN32_NO_OV
15810 45 52 4c 41 50 50 45 44 29 0a 20 20 20 20 4f 56  ERLAPPED).    OV
15820 45 52 4c 41 50 50 45 44 20 6f 76 65 72 6c 61 70  ERLAPPED overlap
15830 70 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ped;        /* T
15840 68 65 20 6f 66 66 73 65 74 20 66 6f 72 20 57 72  he offset for Wr
15850 69 74 65 46 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64  iteFile. */.#end
15860 69 66 0a 20 20 20 20 75 38 20 2a 61 52 65 6d 20  if.    u8 *aRem 
15870 3d 20 28 75 38 20 2a 29 70 42 75 66 3b 20 20 20  = (u8 *)pBuf;   
15880 20 20 20 20 20 2f 2a 20 44 61 74 61 20 79 65 74       /* Data yet
15890 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a   to be written *
158a0 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d  /.    int nRem =
158b0 20 61 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20   amt;           
158c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
158d0 20 62 79 74 65 73 20 79 65 74 20 74 6f 20 62 65   bytes yet to be
158e0 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20   written */.    
158f0 44 57 4f 52 44 20 6e 57 72 69 74 65 3b 20 20 20  DWORD nWrite;   
15900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15910 20 42 79 74 65 73 20 77 72 69 74 74 65 6e 20 62   Bytes written b
15920 79 20 65 61 63 68 20 57 72 69 74 65 46 69 6c 65  y each WriteFile
15930 28 29 20 63 61 6c 6c 20 2a 2f 0a 20 20 20 20 44  () call */.    D
15940 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d  WORD lastErrno =
15950 20 4e 4f 5f 45 52 52 4f 52 3b 20 20 20 2f 2a 20   NO_ERROR;   /* 
15960 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
15970 79 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  y GetLastError()
15980 20 2a 2f 0a 0a 23 69 66 20 21 53 51 4c 49 54 45   */..#if !SQLITE
15990 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 64 65  _OS_WINCE && !de
159a0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
159b0 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44  32_NO_OVERLAPPED
159c0 29 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76  ).    memset(&ov
159d0 65 72 6c 61 70 70 65 64 2c 20 30 2c 20 73 69 7a  erlapped, 0, siz
159e0 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29  eof(OVERLAPPED))
159f0 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64  ;.    overlapped
15a00 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29  .Offset = (LONG)
15a10 28 6f 66 66 73 65 74 20 26 20 30 78 66 66 66 66  (offset & 0xffff
15a20 66 66 66 66 29 3b 0a 20 20 20 20 6f 76 65 72 6c  ffff);.    overl
15a30 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68  apped.OffsetHigh
15a40 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65   = (LONG)((offse
15a50 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66  t>>32) & 0x7ffff
15a60 66 66 66 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  fff);.#endif..  
15a70 20 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20    while( nRem>0 
15a80 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
15a90 5f 57 49 4e 43 45 20 7c 7c 20 64 65 66 69 6e 65  _WINCE || define
15aa0 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e  d(SQLITE_WIN32_N
15ab0 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a 20 20  O_OVERLAPPED).  
15ac0 20 20 20 20 69 66 28 20 21 6f 73 57 72 69 74 65      if( !osWrite
15ad0 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61  File(pFile->h, a
15ae0 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69  Rem, nRem, &nWri
15af0 74 65 2c 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a  te, 0) ){.#else.
15b00 20 20 20 20 20 20 69 66 28 20 21 6f 73 57 72 69        if( !osWri
15b10 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  teFile(pFile->h,
15b20 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57   aRem, nRem, &nW
15b30 72 69 74 65 2c 20 26 6f 76 65 72 6c 61 70 70 65  rite, &overlappe
15b40 64 29 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20  d) ){.#endif.   
15b50 20 20 20 20 20 69 66 28 20 77 69 6e 52 65 74 72       if( winRetr
15b60 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c 20  yIoerr(&nRetry, 
15b70 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63 6f  &lastErrno) ) co
15b80 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
15b90 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
15ba0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 57 72       assert( nWr
15bb0 69 74 65 3d 3d 30 20 7c 7c 20 6e 57 72 69 74 65  ite==0 || nWrite
15bc0 3c 3d 28 44 57 4f 52 44 29 6e 52 65 6d 20 29 3b  <=(DWORD)nRem );
15bd0 0a 20 20 20 20 20 20 69 66 28 20 6e 57 72 69 74  .      if( nWrit
15be0 65 3d 3d 30 20 7c 7c 20 6e 57 72 69 74 65 3e 28  e==0 || nWrite>(
15bf0 44 57 4f 52 44 29 6e 52 65 6d 20 29 7b 0a 20 20  DWORD)nRem ){.  
15c00 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
15c10 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
15c20 28 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ();.        brea
15c30 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 21  k;.      }.#if !
15c40 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
15c50 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
15c60 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52  TE_WIN32_NO_OVER
15c70 4c 41 50 50 45 44 29 0a 20 20 20 20 20 20 6f 66  LAPPED).      of
15c80 66 73 65 74 20 2b 3d 20 6e 57 72 69 74 65 3b 0a  fset += nWrite;.
15c90 20 20 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64        overlapped
15ca0 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29  .Offset = (LONG)
15cb0 28 6f 66 66 73 65 74 20 26 20 30 78 66 66 66 66  (offset & 0xffff
15cc0 66 66 66 66 29 3b 0a 20 20 20 20 20 20 6f 76 65  ffff);.      ove
15cd0 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69  rlapped.OffsetHi
15ce0 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66  gh = (LONG)((off
15cf0 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66  set>>32) & 0x7ff
15d00 66 66 66 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20  fffff);.#endif. 
15d10 20 20 20 20 20 61 52 65 6d 20 2b 3d 20 6e 57 72       aRem += nWr
15d20 69 74 65 3b 0a 20 20 20 20 20 20 6e 52 65 6d 20  ite;.      nRem 
15d30 2d 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 7d  -= nWrite;.    }
15d40 0a 20 20 20 20 69 66 28 20 6e 52 65 6d 3e 30 20  .    if( nRem>0 
15d50 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
15d60 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
15d70 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  Errno;.      rc 
15d80 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
15d90 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
15da0 69 66 28 20 20 20 28 20 70 46 69 6c 65 2d 3e 6c  if(   ( pFile->l
15db0 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
15dc0 48 41 4e 44 4c 45 5f 44 49 53 4b 5f 46 55 4c 4c  HANDLE_DISK_FULL
15dd0 20 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 20 70   ).       || ( p
15de0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d  File->lastErrno=
15df0 3d 45 52 52 4f 52 5f 44 49 53 4b 5f 46 55 4c 4c  =ERROR_DISK_FULL
15e00 20 29 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41   )){.      OSTRA
15e10 43 45 28 28 22 57 52 49 54 45 20 70 69 64 3d 25  CE(("WRITE pid=%
15e20 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69  lu, pFile=%p, fi
15e30 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
15e40 5f 46 55 4c 4c 5c 6e 22 2c 0a 20 20 20 20 20 20  _FULL\n",.      
15e50 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
15e60 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
15e70 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  , pFile, pFile->
15e80 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
15e90 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
15ea0 4c 49 54 45 5f 46 55 4c 4c 2c 20 70 46 69 6c 65  LITE_FULL, pFile
15eb0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
15ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ed0 20 20 20 20 20 20 22 77 69 6e 57 72 69 74 65 31        "winWrite1
15ee0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
15ef0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 4f 53 54 52  ;.    }.    OSTR
15f00 41 43 45 28 28 22 57 52 49 54 45 20 70 69 64 3d  ACE(("WRITE pid=
15f10 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66  %lu, pFile=%p, f
15f20 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
15f30 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 5c 6e 22  E_IOERR_WRITE\n"
15f40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  ,.             o
15f50 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
15f60 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70  ssId(), pFile, p
15f70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
15f80 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
15f90 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  r(SQLITE_IOERR_W
15fa0 52 49 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  RITE, pFile->las
15fb0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
15fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
15fd0 77 69 6e 57 72 69 74 65 32 22 2c 20 70 46 69 6c  winWrite2", pFil
15fe0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c  e->zPath);.  }el
15ff0 73 65 7b 0a 20 20 20 20 77 69 6e 4c 6f 67 49 6f  se{.    winLogIo
16000 65 72 72 28 6e 52 65 74 72 79 2c 20 5f 5f 4c 49  err(nRetry, __LI
16010 4e 45 5f 5f 29 3b 0a 20 20 7d 0a 20 20 4f 53 54  NE__);.  }.  OST
16020 52 41 43 45 28 28 22 57 52 49 54 45 20 70 69 64  RACE(("WRITE pid
16030 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
16040 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
16050 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
16060 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
16070 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
16080 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  ile, pFile->h));
16090 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
160a0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  _OK;.}../*.** Tr
160b0 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66  uncate an open f
160c0 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69  ile to a specifi
160d0 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69  ed size.*/.stati
160e0 63 20 69 6e 74 20 77 69 6e 54 72 75 6e 63 61 74  c int winTruncat
160f0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
16100 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  id, sqlite3_int6
16110 34 20 6e 42 79 74 65 29 7b 0a 20 20 77 69 6e 46  4 nByte){.  winF
16120 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
16130 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46  nFile*)id;  /* F
16140 69 6c 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63  ile handle objec
16150 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  t */.  int rc = 
16160 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
16170 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
16180 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 66   code for this f
16190 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 57 4f  unction */.  DWO
161a0 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20  RD lastErrno;.. 
161b0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
161c0 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
161d0 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
161e0 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
161f0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54  );.  OSTRACE(("T
16200 52 55 4e 43 41 54 45 20 70 69 64 3d 25 6c 75 2c  RUNCATE pid=%lu,
16210 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d   pFile=%p, file=
16220 25 70 2c 20 73 69 7a 65 3d 25 6c 6c 64 2c 20 6c  %p, size=%lld, l
16230 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ock=%d\n",.     
16240 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
16250 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
16260 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  File, pFile->h, 
16270 6e 42 79 74 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f  nByte, pFile->lo
16280 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20  cktype));..  /* 
16290 49 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20  If the user has 
162a0 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75  configured a chu
162b0 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73  nk-size for this
162c0 20 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20   file, truncate 
162d0 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f  the.  ** file so
162e0 20 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74   that it consist
162f0 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20  s of an integer 
16300 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73  number of chunks
16310 20 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20   (i.e. the.  ** 
16320 61 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65  actual file size
16330 20 61 66 74 65 72 20 74 68 65 20 6f 70 65 72 61   after the opera
16340 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67  tion may be larg
16350 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75  er than the requ
16360 65 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29  ested.  ** size)
16370 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
16380 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b  le->szChunk>0 ){
16390 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e  .    nByte = ((n
163a0 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a  Byte + pFile->sz
163b0 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65  Chunk - 1)/pFile
163c0 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69  ->szChunk) * pFi
163d0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d  le->szChunk;.  }
163e0 0a 0a 20 20 2f 2a 20 53 65 74 45 6e 64 4f 66 46  ..  /* SetEndOfF
163f0 69 6c 65 28 29 20 72 65 74 75 72 6e 73 20 6e 6f  ile() returns no
16400 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 73 75 63 63  n-zero when succ
16410 65 73 73 66 75 6c 2c 20 6f 72 20 7a 65 72 6f 20  essful, or zero 
16420 77 68 65 6e 20 69 74 20 66 61 69 6c 73 2e 20 2a  when it fails. *
16430 2f 0a 20 20 69 66 28 20 77 69 6e 53 65 65 6b 46  /.  if( winSeekF
16440 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42 79 74 65  ile(pFile, nByte
16450 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69  ) ){.    rc = wi
16460 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
16470 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c  _IOERR_TRUNCATE,
16480 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
16490 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
164a0 20 20 20 20 20 20 20 20 22 77 69 6e 54 72 75 6e          "winTrun
164b0 63 61 74 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a  cate1", pFile->z
164c0 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 20 69  Path);.  }else i
164d0 66 28 20 30 3d 3d 6f 73 53 65 74 45 6e 64 4f 66  f( 0==osSetEndOf
164e0 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 29 20 26  File(pFile->h) &
164f0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28  &.            ((
16500 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
16510 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 45  tLastError())!=E
16520 52 52 4f 52 5f 55 53 45 52 5f 4d 41 50 50 45 44  RROR_USER_MAPPED
16530 5f 46 49 4c 45 29 20 29 7b 0a 20 20 20 20 70 46  _FILE) ){.    pF
16540 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
16550 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
16560 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
16570 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  (SQLITE_IOERR_TR
16580 55 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c  UNCATE, pFile->l
16590 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
165a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
165b0 77 69 6e 54 72 75 6e 63 61 74 65 32 22 2c 20 70  winTruncate2", p
165c0 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
165d0 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  }..#if SQLITE_MA
165e0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
165f0 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77  /* If the file w
16600 61 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  as truncated to 
16610 61 20 73 69 7a 65 20 73 6d 61 6c 6c 65 72 20 74  a size smaller t
16620 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c  han the currentl
16630 79 0a 20 20 2a 2a 20 6d 61 70 70 65 64 20 72 65  y.  ** mapped re
16640 67 69 6f 6e 2c 20 72 65 64 75 63 65 20 74 68 65  gion, reduce the
16650 20 65 66 66 65 63 74 69 76 65 20 6d 61 70 70 69   effective mappi
16660 6e 67 20 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e  ng size as well.
16670 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20 2a   SQLite will.  *
16680 2a 20 75 73 65 20 72 65 61 64 28 29 20 61 6e 64  * use read() and
16690 20 77 72 69 74 65 28 29 20 74 6f 20 61 63 63 65   write() to acce
166a0 73 73 20 64 61 74 61 20 62 65 79 6f 6e 64 20 74  ss data beyond t
166b0 68 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e  his point from n
166c0 6f 77 20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  ow on..  */.  if
166d0 28 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  ( pFile->pMapReg
166e0 69 6f 6e 20 26 26 20 6e 42 79 74 65 3c 70 46 69  ion && nByte<pFi
166f0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
16700 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53      pFile->mmapS
16710 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20 7d  ize = nByte;.  }
16720 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41  .#endif..  OSTRA
16730 43 45 28 28 22 54 52 55 4e 43 41 54 45 20 70 69  CE(("TRUNCATE pi
16740 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
16750 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c   file=%p, rc=%s\
16760 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
16770 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
16780 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70  ssId(), pFile, p
16790 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33  File->h, sqlite3
167a0 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
167b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
167c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
167d0 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68  T./*.** Count th
167e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  e number of full
167f0 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c  syncs and normal
16800 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73   syncs.  This is
16810 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a   used to test.**
16820 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20   that syncs and 
16830 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63  fullsyncs are oc
16840 63 75 72 69 6e 67 20 61 74 20 74 68 65 20 72 69  curing at the ri
16850 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e  ght times..*/.in
16860 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63  t sqlite3_sync_c
16870 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71  ount = 0;.int sq
16880 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
16890 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
168a0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
168b0 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20  e all writes to 
168c0 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c  a particular fil
168d0 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20  e are committed 
168e0 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74  to disk..*/.stat
168f0 69 63 20 69 6e 74 20 77 69 6e 53 79 6e 63 28 73  ic int winSync(s
16900 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
16910 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 23 69 66   int flags){.#if
16920 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  ndef SQLITE_NO_S
16930 59 4e 43 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73  YNC.  /*.  ** Us
16940 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 53 51 4c  ed only when SQL
16950 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e  ITE_NO_SYNC is n
16960 6f 74 20 64 65 66 69 6e 65 64 2e 0a 20 20 20 2a  ot defined..   *
16970 2f 0a 20 20 42 4f 4f 4c 20 72 63 3b 0a 23 65 6e  /.  BOOL rc;.#en
16980 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
16990 28 4e 44 45 42 55 47 29 20 7c 7c 20 21 64 65 66  (NDEBUG) || !def
169a0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f 5f 53  ined(SQLITE_NO_S
169b0 59 4e 43 29 20 7c 7c 20 5c 0a 20 20 20 20 64 65  YNC) || \.    de
169c0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56  fined(SQLITE_HAV
169d0 45 5f 4f 53 5f 54 52 41 43 45 29 0a 20 20 2f 2a  E_OS_TRACE).  /*
169e0 0a 20 20 2a 2a 20 55 73 65 64 20 77 68 65 6e 20  .  ** Used when 
169f0 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69  SQLITE_NO_SYNC i
16a00 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 61 6e  s not defined an
16a10 64 20 62 79 20 74 68 65 20 61 73 73 65 72 74 28  d by the assert(
16a20 29 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 4f 53  ) and/or.  ** OS
16a30 54 52 41 43 45 28 29 20 6d 61 63 72 6f 73 2e 0a  TRACE() macros..
16a40 20 20 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20     */.  winFile 
16a50 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
16a60 65 2a 29 69 64 3b 0a 23 65 6c 73 65 0a 20 20 55  e*)id;.#else.  U
16a70 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
16a80 69 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  id);.#endif..  a
16a90 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
16aa0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
16ab0 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59  one of SQLITE_SY
16ac0 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c  NC_NORMAL or FUL
16ad0 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a  L was passed */.
16ae0 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73 26    assert((flags&
16af0 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
16b00 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20  NC_NORMAL.      
16b10 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d  || (flags&0x0F)=
16b20 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
16b30 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69  L.  );..  /* Uni
16b40 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f  x cannot, but so
16b50 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72  me systems may r
16b60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
16b70 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69  L from here. Thi
16b80 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74  s.  ** line is t
16b90 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e  o test that doin
16ba0 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61  g so does not ca
16bb0 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73  use any problems
16bc0 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
16bd0 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20  eDiskfullError( 
16be0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
16bf0 4c 4c 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45  LL );..  OSTRACE
16c00 28 28 22 53 59 4e 43 20 70 69 64 3d 25 6c 75 2c  (("SYNC pid=%lu,
16c10 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d   pFile=%p, file=
16c20 25 70 2c 20 66 6c 61 67 73 3d 25 78 2c 20 6c 6f  %p, flags=%x, lo
16c30 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ck=%d\n",.      
16c40 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
16c50 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
16c60 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 66  ile, pFile->h, f
16c70 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20  lags,.          
16c80 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
16c90 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ));..#ifndef SQL
16ca0 49 54 45 5f 54 45 53 54 0a 20 20 55 4e 55 53 45  ITE_TEST.  UNUSE
16cb0 44 5f 50 41 52 41 4d 45 54 45 52 28 66 6c 61 67  D_PARAMETER(flag
16cc0 73 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  s);.#else.  if( 
16cd0 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
16ce0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 29  LITE_SYNC_FULL )
16cf0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 75  {.    sqlite3_fu
16d00 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  llsync_count++;.
16d10 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 79    }.  sqlite3_sy
16d20 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  nc_count++;.#end
16d30 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63  if..  /* If we c
16d40 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65  ompiled with the
16d50 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
16d60 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69  flag, then synci
16d70 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d  ng is a.  ** no-
16d80 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  op.  */.#ifdef S
16d90 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20  QLITE_NO_SYNC.  
16da0 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 2d 4e  OSTRACE(("SYNC-N
16db0 4f 50 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  OP pid=%lu, pFil
16dc0 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72  e=%p, file=%p, r
16dd0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a  c=SQLITE_OK\n",.
16de0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
16df0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
16e00 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
16e10 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ->h));.  return 
16e20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65  SQLITE_OK;.#else
16e30 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
16e40 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66  MMAP_SIZE>0.  if
16e50 28 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  ( pFile->pMapReg
16e60 69 6f 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 6f  ion ){.    if( o
16e70 73 46 6c 75 73 68 56 69 65 77 4f 66 46 69 6c 65  sFlushViewOfFile
16e80 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
16e90 6f 6e 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  on, 0) ){.      
16ea0 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 2d 4d  OSTRACE(("SYNC-M
16eb0 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  MAP pid=%lu, pFi
16ec0 6c 65 3d 25 70 2c 20 70 4d 61 70 52 65 67 69 6f  le=%p, pMapRegio
16ed0 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20 20 20 20  n=%p, ".        
16ee0 20 20 20 20 20 20 20 22 72 63 3d 53 51 4c 49 54         "rc=SQLIT
16ef0 45 5f 4f 4b 5c 6e 22 2c 20 6f 73 47 65 74 43 75  E_OK\n", osGetCu
16f00 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
16f10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16f20 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 70   pFile, pFile->p
16f30 4d 61 70 52 65 67 69 6f 6e 29 29 3b 0a 20 20 20  MapRegion));.   
16f40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46   }else{.      pF
16f50 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
16f60 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
16f70 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
16f80 28 28 22 53 59 4e 43 2d 4d 4d 41 50 20 70 69 64  (("SYNC-MMAP pid
16f90 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
16fa0 70 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22  pMapRegion=%p, "
16fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16fc0 22 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  "rc=SQLITE_IOERR
16fd0 5f 4d 4d 41 50 5c 6e 22 2c 20 6f 73 47 65 74 43  _MMAP\n", osGetC
16fe0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
16ff0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
17000 20 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e    pFile, pFile->
17010 70 4d 61 70 52 65 67 69 6f 6e 29 29 3b 0a 20 20  pMapRegion));.  
17020 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
17030 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
17040 45 52 52 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d  ERR_MMAP, pFile-
17050 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
17060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17070 20 20 20 20 20 22 77 69 6e 53 79 6e 63 31 22 2c       "winSync1",
17080 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
17090 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
170a0 0a 20 20 72 63 20 3d 20 6f 73 46 6c 75 73 68 46  .  rc = osFlushF
170b0 69 6c 65 42 75 66 66 65 72 73 28 70 46 69 6c 65  ileBuffers(pFile
170c0 2d 3e 68 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  ->h);.  Simulate
170d0 49 4f 45 72 72 6f 72 28 20 72 63 3d 46 41 4c 53  IOError( rc=FALS
170e0 45 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  E );.  if( rc ){
170f0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53  .    OSTRACE(("S
17100 59 4e 43 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  YNC pid=%lu, pFi
17110 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20  le=%p, file=%p, 
17120 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
17130 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73  .             os
17140 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
17150 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
17160 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65  ile->h));.    re
17170 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17180 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
17190 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
171a0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
171b0 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
171c0 53 59 4e 43 20 70 69 64 3d 25 6c 75 2c 20 70 46  SYNC pid=%lu, pF
171d0 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c  ile=%p, file=%p,
171e0 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
171f0 5f 46 53 59 4e 43 5c 6e 22 2c 0a 20 20 20 20 20  _FSYNC\n",.     
17200 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
17210 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
17220 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
17230 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77  ));.    return w
17240 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
17250 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 70  E_IOERR_FSYNC, p
17260 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
17270 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17280 20 20 20 20 20 20 20 20 22 77 69 6e 53 79 6e 63          "winSync
17290 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  2", pFile->zPath
172a0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
172b0 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
172c0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
172d0 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62  e of a file in b
172e0 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ytes.*/.static i
172f0 6e 74 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 73  nt winFileSize(s
17300 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
17310 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a   sqlite3_int64 *
17320 70 53 69 7a 65 29 7b 0a 20 20 77 69 6e 46 69 6c  pSize){.  winFil
17330 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
17340 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72  ile*)id;.  int r
17350 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
17360 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
17370 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 69  );.  assert( pSi
17380 7a 65 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c  ze!=0 );.  Simul
17390 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72  ateIOError(retur
173a0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  n SQLITE_IOERR_F
173b0 53 54 41 54 29 3b 0a 20 20 4f 53 54 52 41 43 45  STAT);.  OSTRACE
173c0 28 28 22 53 49 5a 45 20 66 69 6c 65 3d 25 70 2c  (("SIZE file=%p,
173d0 20 70 53 69 7a 65 3d 25 70 5c 6e 22 2c 20 70 46   pSize=%p\n", pF
173e0 69 6c 65 2d 3e 68 2c 20 70 53 69 7a 65 29 29 3b  ile->h, pSize));
173f0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
17400 57 49 4e 52 54 0a 20 20 7b 0a 20 20 20 20 46 49  WINRT.  {.    FI
17410 4c 45 5f 53 54 41 4e 44 41 52 44 5f 49 4e 46 4f  LE_STANDARD_INFO
17420 20 69 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 6f   info;.    if( o
17430 73 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74  sGetFileInformat
17440 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 28 70 46  ionByHandleEx(pF
17450 69 6c 65 2d 3e 68 2c 20 46 69 6c 65 53 74 61 6e  ile->h, FileStan
17460 64 61 72 64 49 6e 66 6f 2c 0a 20 20 20 20 20 20  dardInfo,.      
17470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
17490 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66  info, sizeof(inf
174a0 6f 29 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 53  o)) ){.      *pS
174b0 69 7a 65 20 3d 20 69 6e 66 6f 2e 45 6e 64 4f 66  ize = info.EndOf
174c0 46 69 6c 65 2e 51 75 61 64 50 61 72 74 3b 0a 20  File.QuadPart;. 
174d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
174e0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
174f0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
17500 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  r();.      rc = 
17510 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
17520 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 2c 20  TE_IOERR_FSTAT, 
17530 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
17540 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17550 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 69 6c           "winFil
17560 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  eSize", pFile->z
17570 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Path);.    }.  }
17580 0a 23 65 6c 73 65 0a 20 20 7b 0a 20 20 20 20 44  .#else.  {.    D
17590 57 4f 52 44 20 75 70 70 65 72 42 69 74 73 3b 0a  WORD upperBits;.
175a0 20 20 20 20 44 57 4f 52 44 20 6c 6f 77 65 72 42      DWORD lowerB
175b0 69 74 73 3b 0a 20 20 20 20 44 57 4f 52 44 20 6c  its;.    DWORD l
175c0 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 20 20 6c  astErrno;..    l
175d0 6f 77 65 72 42 69 74 73 20 3d 20 6f 73 47 65 74  owerBits = osGet
175e0 46 69 6c 65 53 69 7a 65 28 70 46 69 6c 65 2d 3e  FileSize(pFile->
175f0 68 2c 20 26 75 70 70 65 72 42 69 74 73 29 3b 0a  h, &upperBits);.
17600 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 28 28 28      *pSize = (((
17610 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 75 70  sqlite3_int64)up
17620 70 65 72 42 69 74 73 29 3c 3c 33 32 29 20 2b 20  perBits)<<32) + 
17630 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 20 20 69  lowerBits;.    i
17640 66 28 20 20 20 28 6c 6f 77 65 72 42 69 74 73 20  f(   (lowerBits 
17650 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  == INVALID_FILE_
17660 53 49 5a 45 29 0a 20 20 20 20 20 20 20 26 26 20  SIZE).       && 
17670 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ((lastErrno = os
17680 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21  GetLastError())!
17690 3d 4e 4f 5f 45 52 52 4f 52 29 20 29 7b 0a 20 20  =NO_ERROR) ){.  
176a0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
176b0 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
176c0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  ;.      rc = win
176d0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
176e0 49 4f 45 52 52 5f 46 53 54 41 54 2c 20 70 46 69  IOERR_FSTAT, pFi
176f0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
17700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17710 20 20 20 20 20 20 22 77 69 6e 46 69 6c 65 53 69        "winFileSi
17720 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  ze", pFile->zPat
17730 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  h);.    }.  }.#e
17740 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28  ndif.  OSTRACE((
17750 22 53 49 5a 45 20 66 69 6c 65 3d 25 70 2c 20 70  "SIZE file=%p, p
17760 53 69 7a 65 3d 25 70 2c 20 2a 70 53 69 7a 65 3d  Size=%p, *pSize=
17770 25 6c 6c 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  %lld, rc=%s\n",.
17780 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
17790 2d 3e 68 2c 20 70 53 69 7a 65 2c 20 2a 70 53 69  ->h, pSize, *pSi
177a0 7a 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  ze, sqlite3ErrNa
177b0 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75  me(rc)));.  retu
177c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
177d0 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
177e0 4d 45 44 49 41 54 45 4c 59 20 69 73 20 75 6e 64  MEDIATELY is und
177f0 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d 65 20 57  efined on some W
17800 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a  indows systems..
17810 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46  */.#ifndef LOCKF
17820 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
17830 54 45 4c 59 0a 23 20 64 65 66 69 6e 65 20 4c 4f  TELY.# define LO
17840 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
17850 44 49 41 54 45 4c 59 20 31 0a 23 65 6e 64 69 66  DIATELY 1.#endif
17860 0a 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49  ..#ifndef LOCKFI
17870 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  LE_EXCLUSIVE_LOC
17880 4b 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46  K.# define LOCKF
17890 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ILE_EXCLUSIVE_LO
178a0 43 4b 20 32 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  CK 2.#endif../*.
178b0 2a 2a 20 48 69 73 74 6f 72 69 63 61 6c 6c 79 2c  ** Historically,
178c0 20 53 51 4c 69 74 65 20 68 61 73 20 75 73 65 64   SQLite has used
178d0 20 62 6f 74 68 20 74 68 65 20 4c 6f 63 6b 46 69   both the LockFi
178e0 6c 65 20 61 6e 64 20 4c 6f 63 6b 46 69 6c 65 45  le and LockFileE
178f0 78 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20  x functions..** 
17900 57 68 65 6e 20 74 68 65 20 4c 6f 63 6b 46 69 6c  When the LockFil
17910 65 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 75  e function was u
17920 73 65 64 2c 20 69 74 20 77 61 73 20 61 6c 77 61  sed, it was alwa
17930 79 73 20 65 78 70 65 63 74 65 64 20 74 6f 20 66  ys expected to f
17940 61 69 6c 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  ail.** immediate
17950 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 63  ly if the lock c
17960 6f 75 6c 64 20 6e 6f 74 20 62 65 20 6f 62 74 61  ould not be obta
17970 69 6e 65 64 2e 20 20 41 6c 73 6f 2c 20 69 74 20  ined.  Also, it 
17980 61 6c 77 61 79 73 20 65 78 70 65 63 74 65 64 20  always expected 
17990 74 6f 0a 2a 2a 20 6f 62 74 61 69 6e 20 61 6e 20  to.** obtain an 
179a0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20  exclusive lock. 
179b0 20 54 68 65 73 65 20 66 6c 61 67 73 20 61 72 65   These flags are
179c0 20 75 73 65 64 20 77 69 74 68 20 74 68 65 20 4c   used with the L
179d0 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69  ockFileEx functi
179e0 6f 6e 0a 2a 2a 20 61 6e 64 20 72 65 66 6c 65 63  on.** and reflec
179f0 74 20 74 68 6f 73 65 20 65 78 70 65 63 74 61 74  t those expectat
17a00 69 6f 6e 73 3b 20 74 68 65 72 65 66 6f 72 65 2c  ions; therefore,
17a10 20 74 68 65 79 20 73 68 6f 75 6c 64 20 6e 6f 74   they should not
17a20 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a   be changed..*/.
17a30 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c  #ifndef SQLITE_L
17a40 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 0a 23 20  OCKFILE_FLAGS.# 
17a50 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f  define SQLITE_LO
17a60 43 4b 46 49 4c 45 5f 46 4c 41 47 53 20 20 20 28  CKFILE_FLAGS   (
17a70 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
17a80 4d 45 44 49 41 54 45 4c 59 20 7c 20 5c 0a 20 20  MEDIATELY | \.  
17a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ab0 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49  LOCKFILE_EXCLUSI
17ac0 56 45 5f 4c 4f 43 4b 29 0a 23 65 6e 64 69 66 0a  VE_LOCK).#endif.
17ad0 0a 2f 2a 0a 2a 2a 20 43 75 72 72 65 6e 74 6c 79  ./*.** Currently
17ae0 2c 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 63  , SQLite never c
17af0 61 6c 6c 73 20 74 68 65 20 4c 6f 63 6b 46 69 6c  alls the LockFil
17b00 65 45 78 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  eEx function wit
17b10 68 6f 75 74 20 77 61 6e 74 69 6e 67 20 74 68 65  hout wanting the
17b20 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 66 61 69 6c  .** call to fail
17b30 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 66 20   immediately if 
17b40 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20  the lock cannot 
17b50 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a  be obtained..*/.
17b60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c  #ifndef SQLITE_L
17b70 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 0a  OCKFILEEX_FLAGS.
17b80 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
17b90 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53  LOCKFILEEX_FLAGS
17ba0 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f   (LOCKFILE_FAIL_
17bb0 49 4d 4d 45 44 49 41 54 45 4c 59 29 0a 23 65 6e  IMMEDIATELY).#en
17bc0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  dif../*.** Acqui
17bd0 72 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b  re a reader lock
17be0 2e 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 41  ..** Different A
17bf0 50 49 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  PI routines are 
17c00 63 61 6c 6c 65 64 20 64 65 70 65 6e 64 69 6e 67  called depending
17c10 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
17c20 6f 74 20 74 68 69 73 0a 2a 2a 20 69 73 20 57 69  ot this.** is Wi
17c30 6e 39 78 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f  n9x or WinNT..*/
17c40 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47  .static int winG
17c50 65 74 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69  etReadLock(winFi
17c60 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e  le *pFile){.  in
17c70 74 20 72 65 73 3b 0a 20 20 4f 53 54 52 41 43 45  t res;.  OSTRACE
17c80 28 28 22 52 45 41 44 2d 4c 4f 43 4b 20 66 69 6c  (("READ-LOCK fil
17c90 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22  e=%p, lock=%d\n"
17ca0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c  , pFile->h, pFil
17cb0 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20  e->locktype));. 
17cc0 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
17cd0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
17ce0 49 4e 43 45 0a 20 20 20 20 2f 2a 0a 20 20 20 20  INCE.    /*.    
17cf0 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73  ** NOTE: Windows
17d00 20 43 45 20 69 73 20 68 61 6e 64 6c 65 64 20 64   CE is handled d
17d10 69 66 66 65 72 65 6e 74 6c 79 20 68 65 72 65 20  ifferently here 
17d20 64 75 65 20 69 74 73 20 6c 61 63 6b 20 6f 66 20  due its lack of 
17d30 74 68 65 20 57 69 6e 33 32 0a 20 20 20 20 2a 2a  the Win32.    **
17d40 20 20 20 20 20 20 20 41 50 49 20 4c 6f 63 6b 46         API LockF
17d50 69 6c 65 45 78 2e 0a 20 20 20 20 2a 2f 0a 20 20  ileEx..    */.  
17d60 20 20 72 65 73 20 3d 20 77 69 6e 63 65 4c 6f 63    res = winceLoc
17d70 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
17d80 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30   SHARED_FIRST, 0
17d90 2c 20 31 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20  , 1, 0);.#else. 
17da0 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b     res = winLock
17db0 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
17dc0 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45  SQLITE_LOCKFILEE
17dd0 58 5f 46 4c 41 47 53 2c 20 53 48 41 52 45 44 5f  X_FLAGS, SHARED_
17de0 46 49 52 53 54 2c 20 30 2c 0a 20 20 20 20 20 20  FIRST, 0,.      
17df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e00 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
17e10 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64  .#endif.  }.#ifd
17e20 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
17e30 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
17e40 0a 20 20 20 20 69 6e 74 20 6c 6b 3b 0a 20 20 20  .    int lk;.   
17e50 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
17e60 65 73 73 28 73 69 7a 65 6f 66 28 6c 6b 29 2c 20  ess(sizeof(lk), 
17e70 26 6c 6b 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  &lk);.    pFile-
17e80 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20  >sharedLockByte 
17e90 3d 20 28 73 68 6f 72 74 29 28 28 6c 6b 20 26 20  = (short)((lk & 
17ea0 30 78 37 66 66 66 66 66 66 66 29 25 28 53 48 41  0x7fffffff)%(SHA
17eb0 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 29 3b 0a  RED_SIZE - 1));.
17ec0 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63      res = winLoc
17ed0 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
17ee0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
17ef0 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20  _FLAGS,.        
17f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
17f10 41 52 45 44 5f 46 49 52 53 54 2b 70 46 69 6c 65  ARED_FIRST+pFile
17f20 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  ->sharedLockByte
17f30 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 1, 0);.  }.
17f40 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 65 73  #endif.  if( res
17f50 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 70 46 69   == 0 ){.    pFi
17f60 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
17f70 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
17f80 3b 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64  ;.    /* No need
17f90 20 74 6f 20 6c 6f 67 20 61 20 66 61 69 6c 75 72   to log a failur
17fa0 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d  e to lock */.  }
17fb0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
17fc0 44 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  D-LOCK file=%p, 
17fd0 72 65 73 75 6c 74 3d 25 64 5c 6e 22 2c 20 70 46  result=%d\n", pF
17fe0 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20  ile->h, res));. 
17ff0 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
18000 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20 72 65 61  /*.** Undo a rea
18010 64 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20  dlock.*/.static 
18020 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61  int winUnlockRea
18030 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70  dLock(winFile *p
18040 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73  File){.  int res
18050 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
18060 72 6e 6f 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  rno;.  OSTRACE((
18070 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c  "READ-UNLOCK fil
18080 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22  e=%p, lock=%d\n"
18090 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c  , pFile->h, pFil
180a0 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20  e->locktype));. 
180b0 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
180c0 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e  .    res = winUn
180d0 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  lockFile(&pFile-
180e0 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
180f0 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45  , 0, SHARED_SIZE
18100 2c 20 30 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66  , 0);.  }.#ifdef
18110 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
18120 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
18130 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f     res = winUnlo
18140 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
18150 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70  , SHARED_FIRST+p
18160 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  File->sharedLock
18170 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  Byte, 0, 1, 0);.
18180 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
18190 20 72 65 73 3d 3d 30 20 26 26 20 28 28 6c 61 73   res==0 && ((las
181a0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
181b0 73 74 45 72 72 6f 72 28 29 29 21 3d 45 52 52 4f  stError())!=ERRO
181c0 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 29 20 29 7b  R_NOT_LOCKED) ){
181d0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
181e0 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e  Errno = lastErrn
181f0 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  o;.    winLogErr
18200 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
18210 55 4e 4c 4f 43 4b 2c 20 70 46 69 6c 65 2d 3e 6c  UNLOCK, pFile->l
18220 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
18230 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e            "winUn
18240 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 22 2c 20 70  lockReadLock", p
18250 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
18260 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  }.  OSTRACE(("RE
18270 41 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25  AD-UNLOCK file=%
18280 70 2c 20 72 65 73 75 6c 74 3d 25 64 5c 6e 22 2c  p, result=%d\n",
18290 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29   pFile->h, res))
182a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
182b0 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
182c0 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
182d0 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
182e0 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b  y parameter lock
182f0 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  type - one.** of
18300 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
18310 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
18320 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
18330 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
18340 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
18350 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
18360 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
18370 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
18380 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
18390 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
183a0 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
183b0 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
183c0 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
183d0 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
183e0 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
183f0 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
18400 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
18410 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
18420 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
18430 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
18440 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
18450 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
18460 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
18470 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
18480 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
18490 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
184a0 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
184b0 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
184c0 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
184d0 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
184e0 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
184f0 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
18500 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
18510 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
18520 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
18530 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
18540 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
18550 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
18560 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
18570 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
18580 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
18590 6b 2e 20 20 54 68 65 20 77 69 6e 55 6e 6c 6f 63  k.  The winUnloc
185a0 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65  k() routine.** e
185b0 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20  rases all locks 
185c0 61 74 20 6f 6e 63 65 20 61 6e 64 20 72 65 74 75  at once and retu
185d0 72 6e 73 20 75 73 20 69 6d 6d 65 64 69 61 74 65  rns us immediate
185e0 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65  ly to locking le
185f0 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20  vel 0..** It is 
18600 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
18610 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  lower the lockin
18620 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74 65 70  g level one step
18630 20 61 74 20 61 20 74 69 6d 65 2e 20 20 59 6f 75   at a time.  You
18640 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74 72 61  .** must go stra
18650 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20  ight to locking 
18660 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74  level 0..*/.stat
18670 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b 28 73  ic int winLock(s
18680 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
18690 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
186a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
186b0 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 74 75  E_OK;    /* Retu
186c0 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
186d0 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e  routines */.  in
186e0 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20  t res = 1;      
186f0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f       /* Result o
18700 66 20 61 20 57 69 6e 64 6f 77 73 20 6c 6f 63 6b  f a Windows lock
18710 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e   call */.  int n
18720 65 77 4c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20  ewLocktype;     
18730 20 20 2f 2a 20 53 65 74 20 70 46 69 6c 65 2d 3e    /* Set pFile->
18740 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74 68 69 73  locktype to this
18750 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 65 78   value before ex
18760 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 67  iting */.  int g
18770 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20  otPendingLock = 
18780 30 3b 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20  0;/* True if we 
18790 61 63 71 75 69 72 65 64 20 61 20 50 45 4e 44 49  acquired a PENDI
187a0 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20 74 69 6d  NG lock this tim
187b0 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a  e */.  winFile *
187c0 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
187d0 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44 20 6c 61  *)id;.  DWORD la
187e0 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52  stErrno = NO_ERR
187f0 4f 52 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  OR;..  assert( i
18800 64 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43  d!=0 );.  OSTRAC
18810 45 28 28 22 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  E(("LOCK file=%p
18820 2c 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29  , oldLock=%d(%d)
18830 2c 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c  , newLock=%d\n",
18840 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
18850 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  e->h, pFile->loc
18860 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68  ktype, pFile->sh
18870 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f  aredLockByte, lo
18880 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20  cktype));..  /* 
18890 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
188a0 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68  ady a lock of th
188b0 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20  is type or more 
188c0 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74  restrictive on t
188d0 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20  he.  ** OsFile, 
188e0 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27  do nothing. Don'
188f0 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f  t use the end_lo
18900 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61  ck: exit path, a
18910 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73  s.  ** sqlite3Os
18920 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73  EnterMutex() has
18930 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  n't been called 
18940 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  yet..  */.  if( 
18950 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
18960 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20  =locktype ){.   
18970 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d   OSTRACE(("LOCK-
18980 48 45 4c 44 20 66 69 6c 65 3d 25 70 2c 20 72 63  HELD file=%p, rc
18990 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
189a0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
189b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
189c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f  .  }..  /* Do no
189d0 74 20 61 6c 6c 6f 77 20 61 6e 79 20 6b 69 6e 64  t allow any kind
189e0 20 6f 66 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f   of write-lock o
189f0 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  n a read-only da
18a00 74 61 62 61 73 65 0a 20 20 2a 2f 0a 20 20 69 66  tabase.  */.  if
18a10 28 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  ( (pFile->ctrlFl
18a20 61 67 73 20 26 20 57 49 4e 46 49 4c 45 5f 52 44  ags & WINFILE_RD
18a30 4f 4e 4c 59 29 21 3d 30 20 26 26 20 6c 6f 63 6b  ONLY)!=0 && lock
18a40 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c  type>=RESERVED_L
18a50 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  OCK ){.    retur
18a60 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  n SQLITE_IOERR_L
18a70 4f 43 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  OCK;.  }..  /* M
18a80 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
18a90 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
18aa0 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20   correct.  */.  
18ab0 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
18ac0 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b  ocktype!=NO_LOCK
18ad0 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   || locktype==SH
18ae0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
18af0 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
18b00 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
18b10 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
18b20 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype!=RESERVED_LO
18b30 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK || pFile->loc
18b40 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
18b50 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b  CK );..  /* Lock
18b60 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   the PENDING_LOC
18b70 4b 20 62 79 74 65 20 69 66 20 77 65 20 6e 65 65  K byte if we nee
18b80 64 20 74 6f 20 61 63 71 75 69 72 65 20 61 20 50  d to acquire a P
18b90 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20  ENDING lock or. 
18ba0 20 2a 2a 20 61 20 53 48 41 52 45 44 20 6c 6f 63   ** a SHARED loc
18bb0 6b 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 63  k.  If we are ac
18bc0 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44  quiring a SHARED
18bd0 20 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71 75 69   lock, the acqui
18be0 73 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74  sition of.  ** t
18bf0 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  he PENDING_LOCK 
18c00 62 79 74 65 20 69 73 20 74 65 6d 70 6f 72 61 72  byte is temporar
18c10 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63  y..  */.  newLoc
18c20 6b 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c  ktype = pFile->l
18c30 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 70  ocktype;.  if( p
18c40 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
18c50 4e 4f 5f 4c 4f 43 4b 0a 20 20 20 7c 7c 20 28 6c  NO_LOCK.   || (l
18c60 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
18c70 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  VE_LOCK && pFile
18c80 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 52 45 53 45  ->locktype<=RESE
18c90 52 56 45 44 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a  RVED_LOCK).  ){.
18ca0 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b      int cnt = 3;
18cb0 0a 20 20 20 20 77 68 69 6c 65 28 20 63 6e 74 2d  .    while( cnt-
18cc0 2d 3e 30 20 26 26 20 28 72 65 73 20 3d 20 77 69  ->0 && (res = wi
18cd0 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nLockFile(&pFile
18ce0 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ->h, SQLITE_LOCK
18cf0 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20  FILE_FLAGS,.    
18d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54       PENDING_BYT
18d30 45 2c 20 30 2c 20 31 2c 20 30 29 29 3d 3d 30 20  E, 0, 1, 0))==0 
18d40 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20  ){.      /* Try 
18d50 33 20 74 69 6d 65 73 20 74 6f 20 67 65 74 20 74  3 times to get t
18d60 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e  he pending lock.
18d70 20 20 54 68 69 73 20 69 73 20 6e 65 65 64 65 64    This is needed
18d80 20 74 6f 20 77 6f 72 6b 0a 20 20 20 20 20 20 2a   to work.      *
18d90 2a 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d  * around problem
18da0 73 20 63 61 75 73 65 64 20 62 79 20 69 6e 64 65  s caused by inde
18db0 78 69 6e 67 20 61 6e 64 2f 6f 72 20 61 6e 74 69  xing and/or anti
18dc0 2d 76 69 72 75 73 20 73 6f 66 74 77 61 72 65 20  -virus software 
18dd0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 57 69 6e 64  on.      ** Wind
18de0 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a 20 20 20  ows systems..   
18df0 20 20 20 2a 2a 20 49 66 20 79 6f 75 20 61 72 65     ** If you are
18e00 20 75 73 69 6e 67 20 74 68 69 73 20 63 6f 64 65   using this code
18e10 20 61 73 20 61 20 6d 6f 64 65 6c 20 66 6f 72 20   as a model for 
18e20 61 6c 74 65 72 6e 61 74 69 76 65 20 56 46 53 65  alternative VFSe
18e30 73 2c 20 64 6f 20 6e 6f 74 0a 20 20 20 20 20 20  s, do not.      
18e40 2a 2a 20 63 6f 70 79 20 74 68 69 73 20 72 65 74  ** copy this ret
18e50 72 79 20 6c 6f 67 69 63 2e 20 20 49 74 20 69 73  ry logic.  It is
18e60 20 61 20 68 61 63 6b 20 69 6e 74 65 6e 64 65 64   a hack intended
18e70 20 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c   for Windows onl
18e80 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
18e90 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
18ea0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
18eb0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
18ec0 4c 4f 43 4b 2d 50 45 4e 44 49 4e 47 2d 46 41 49  LOCK-PENDING-FAI
18ed0 4c 20 66 69 6c 65 3d 25 70 2c 20 63 6f 75 6e 74  L file=%p, count
18ee0 3d 25 64 2c 20 72 65 73 75 6c 74 3d 25 64 5c 6e  =%d, result=%d\n
18ef0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
18f00 20 20 70 46 69 6c 65 2d 3e 68 2c 20 63 6e 74 2c    pFile->h, cnt,
18f10 20 72 65 73 29 29 3b 0a 20 20 20 20 20 20 69 66   res));.      if
18f20 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  ( lastErrno==ERR
18f30 4f 52 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  OR_INVALID_HANDL
18f40 45 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  E ){.        pFi
18f50 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
18f60 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
18f70 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
18f80 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  OERR_LOCK;.     
18f90 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43     OSTRACE(("LOC
18fa0 4b 2d 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c 20  K-FAIL file=%p, 
18fb0 63 6f 75 6e 74 3d 25 64 2c 20 72 63 3d 25 73 5c  count=%d, rc=%s\
18fc0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
18fd0 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 63       pFile->h, c
18fe0 6e 74 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  nt, sqlite3ErrNa
18ff0 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20  me(rc)));.      
19000 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
19010 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
19020 6e 74 20 29 20 73 71 6c 69 74 65 33 5f 77 69 6e  nt ) sqlite3_win
19030 33 32 5f 73 6c 65 65 70 28 31 29 3b 0a 20 20 20  32_sleep(1);.   
19040 20 7d 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e   }.    gotPendin
19050 67 4c 6f 63 6b 20 3d 20 72 65 73 3b 0a 20 20 20  gLock = res;.   
19060 20 69 66 28 20 21 72 65 73 20 29 7b 0a 20 20 20   if( !res ){.   
19070 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
19080 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
19090 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
190a0 20 41 63 71 75 69 72 65 20 61 20 73 68 61 72 65   Acquire a share
190b0 64 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66  d lock.  */.  if
190c0 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
190d0 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29  ED_LOCK && res )
190e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  {.    assert( pF
190f0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e  ile->locktype==N
19100 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65  O_LOCK );.    re
19110 73 20 3d 20 77 69 6e 47 65 74 52 65 61 64 4c 6f  s = winGetReadLo
19120 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 69  ck(pFile);.    i
19130 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
19140 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 53 48  newLocktype = SH
19150 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  ARED_LOCK;.    }
19160 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74  else{.      last
19170 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
19180 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a  tError();.    }.
19190 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
191a0 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  e a RESERVED loc
191b0 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  k.  */.  if( loc
191c0 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f  ktype==RESERVED_
191d0 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20  LOCK && res ){. 
191e0 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
191f0 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ->locktype==SHAR
19200 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  ED_LOCK );.    r
19210 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  es = winLockFile
19220 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49  (&pFile->h, SQLI
19230 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47  TE_LOCKFILE_FLAG
19240 53 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  S, RESERVED_BYTE
19250 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  , 0, 1, 0);.    
19260 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
19270 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 52   newLocktype = R
19280 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20  ESERVED_LOCK;.  
19290 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c    }else{.      l
192a0 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
192b0 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
192c0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71   }.  }..  /* Acq
192d0 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c  uire a PENDING l
192e0 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ock.  */.  if( l
192f0 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
19300 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29  VE_LOCK && res )
19310 7b 0a 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70  {.    newLocktyp
19320 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  e = PENDING_LOCK
19330 3b 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67  ;.    gotPending
19340 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  Lock = 0;.  }.. 
19350 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45   /* Acquire an E
19360 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 0a 20 20  XCLUSIVE lock.  
19370 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
19380 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
19390 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  K && res ){.    
193a0 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
193b0 6f 63 6b 74 79 70 65 3e 3d 53 48 41 52 45 44 5f  ocktype>=SHARED_
193c0 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20  LOCK );.    res 
193d0 3d 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c  = winUnlockReadL
193e0 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ock(pFile);.    
193f0 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c  res = winLockFil
19400 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c  e(&pFile->h, SQL
19410 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41  ITE_LOCKFILE_FLA
19420 47 53 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  GS, SHARED_FIRST
19430 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
19440 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
19450 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20  D_SIZE, 0);.    
19460 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
19470 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45   newLocktype = E
19480 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20  XCLUSIVE_LOCK;. 
19490 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
194a0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
194b0 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
194c0 20 20 20 20 77 69 6e 47 65 74 52 65 61 64 4c 6f      winGetReadLo
194d0 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d  ck(pFile);.    }
194e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
194f0 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 61 20 50   are holding a P
19500 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74  ENDING lock that
19510 20 6f 75 67 68 74 20 74 6f 20 62 65 20 72 65 6c   ought to be rel
19520 65 61 73 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a  eased, then.  **
19530 20 72 65 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e   release it now.
19540 0a 20 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50  .  */.  if( gotP
19550 65 6e 64 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f  endingLock && lo
19560 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
19570 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e  OCK ){.    winUn
19580 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  lockFile(&pFile-
19590 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  >h, PENDING_BYTE
195a0 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 1, 0);.  }.
195b0 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
195c0 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 6c 6f   state of the lo
195d0 63 6b 20 68 61 73 20 68 65 6c 64 20 69 6e 20 74  ck has held in t
195e0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
195f0 6f 72 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 74  or then.  ** ret
19600 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69  urn the appropri
19610 61 74 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e  ate result code.
19620 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 20  .  */.  if( res 
19630 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
19640 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
19650 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
19660 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
19670 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
19680 45 5f 42 55 53 59 3b 0a 20 20 20 20 4f 53 54 52  E_BUSY;.    OSTR
19690 41 43 45 28 28 22 4c 4f 43 4b 2d 46 41 49 4c 20  ACE(("LOCK-FAIL 
196a0 66 69 6c 65 3d 25 70 2c 20 77 61 6e 74 65 64 3d  file=%p, wanted=
196b0 25 64 2c 20 67 6f 74 3d 25 64 5c 6e 22 2c 0a 20  %d, got=%d\n",. 
196c0 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c              pFil
196d0 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20  e->h, locktype, 
196e0 6e 65 77 4c 6f 63 6b 74 79 70 65 29 29 3b 0a 20  newLocktype));. 
196f0 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   }.  pFile->lock
19700 74 79 70 65 20 3d 20 28 75 38 29 6e 65 77 4c 6f  type = (u8)newLo
19710 63 6b 74 79 70 65 3b 0a 20 20 4f 53 54 52 41 43  cktype;.  OSTRAC
19720 45 28 28 22 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  E(("LOCK file=%p
19730 2c 20 6c 6f 63 6b 3d 25 64 2c 20 72 63 3d 25 73  , lock=%d, rc=%s
19740 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
19750 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d  pFile->h, pFile-
19760 3e 6c 6f 63 6b 74 79 70 65 2c 20 73 71 6c 69 74  >locktype, sqlit
19770 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
19780 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19790 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
197a0 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
197b0 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
197c0 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
197d0 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
197e0 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
197f0 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
19800 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
19810 6b 20 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72  k is held, retur
19820 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f  n.** non-zero, o
19830 74 68 65 72 77 69 73 65 20 7a 65 72 6f 2e 0a 2a  therwise zero..*
19840 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
19850 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
19860 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
19870 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
19880 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  ){.  int res;.  
19890 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
198a0 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a   (winFile*)id;..
198b0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
198c0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
198d0 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
198e0 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 4f  RVEDLOCK; );.  O
198f0 53 54 52 41 43 45 28 28 22 54 45 53 54 2d 57 52  STRACE(("TEST-WR
19900 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 70  -LOCK file=%p, p
19910 52 65 73 4f 75 74 3d 25 70 5c 6e 22 2c 20 70 46  ResOut=%p\n", pF
19920 69 6c 65 2d 3e 68 2c 20 70 52 65 73 4f 75 74 29  ile->h, pResOut)
19930 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  );..  assert( id
19940 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69  !=0 );.  if( pFi
19950 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45  le->locktype>=RE
19960 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SERVED_LOCK ){. 
19970 20 20 20 72 65 73 20 3d 20 31 3b 0a 20 20 20 20     res = 1;.    
19980 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 2d 57  OSTRACE(("TEST-W
19990 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  R-LOCK file=%p, 
199a0 72 65 73 75 6c 74 3d 25 64 20 28 6c 6f 63 61 6c  result=%d (local
199b0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
199c0 72 65 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  res));.  }else{.
199d0 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63      res = winLoc
199e0 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
199f0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
19a00 45 58 5f 46 4c 41 47 53 2c 52 45 53 45 52 56 45  EX_FLAGS,RESERVE
19a10 44 5f 42 59 54 45 2c 30 2c 31 2c 30 29 3b 0a 20  D_BYTE,0,1,0);. 
19a20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20     if( res ){.  
19a30 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c      winUnlockFil
19a40 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53  e(&pFile->h, RES
19a50 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31  ERVED_BYTE, 0, 1
19a60 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
19a70 72 65 73 20 3d 20 21 72 65 73 3b 0a 20 20 20 20  res = !res;.    
19a80 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 2d 57  OSTRACE(("TEST-W
19a90 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  R-LOCK file=%p, 
19aa0 72 65 73 75 6c 74 3d 25 64 20 28 72 65 6d 6f 74  result=%d (remot
19ab0 65 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  e)\n", pFile->h,
19ac0 20 72 65 73 29 29 3b 0a 20 20 7d 0a 20 20 2a 70   res));.  }.  *p
19ad0 52 65 73 4f 75 74 20 3d 20 72 65 73 3b 0a 20 20  ResOut = res;.  
19ae0 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 2d 57  OSTRACE(("TEST-W
19af0 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  R-LOCK file=%p, 
19b00 70 52 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65  pResOut=%p, *pRe
19b10 73 4f 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49  sOut=%d, rc=SQLI
19b20 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
19b30 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70       pFile->h, p
19b40 52 65 73 4f 75 74 2c 20 2a 70 52 65 73 4f 75 74  ResOut, *pResOut
19b50 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
19b60 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
19b70 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
19b80 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
19b90 20 64 65 73 63 72 69 70 74 6f 72 20 69 64 20 74   descriptor id t
19ba0 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63  o locktype.  loc
19bb0 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65  ktype.** must be
19bc0 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
19bd0 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
19be0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
19bf0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
19c00 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
19c10 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
19c20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
19c30 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
19c40 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
19c50 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
19c60 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e 6f  ..**.** It is no
19c70 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  t possible for t
19c80 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 66  his routine to f
19c90 61 69 6c 20 69 66 20 74 68 65 20 73 65 63 6f 6e  ail if the secon
19ca0 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73  d argument.** is
19cb0 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74 68   NO_LOCK.  If th
19cc0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
19cd0 74 20 69 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b  t is SHARED_LOCK
19ce0 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
19cf0 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74 75  ne.** might retu
19d00 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
19d10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
19d20 69 6e 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  inUnlock(sqlite3
19d30 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  _file *id, int l
19d40 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20  ocktype){.  int 
19d50 74 79 70 65 3b 0a 20 20 77 69 6e 46 69 6c 65 20  type;.  winFile 
19d60 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
19d70 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20  e*)id;.  int rc 
19d80 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
19d90 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20  ssert( pFile!=0 
19da0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
19db0 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f  ktype<=SHARED_LO
19dc0 43 4b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  CK );.  OSTRACE(
19dd0 28 22 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  ("UNLOCK file=%p
19de0 2c 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29  , oldLock=%d(%d)
19df0 2c 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c  , newLock=%d\n",
19e00 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
19e10 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  e->h, pFile->loc
19e20 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68  ktype, pFile->sh
19e30 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f  aredLockByte, lo
19e40 63 6b 74 79 70 65 29 29 3b 0a 20 20 74 79 70 65  cktype));.  type
19e50 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79   = pFile->lockty
19e60 70 65 3b 0a 20 20 69 66 28 20 74 79 70 65 3e 3d  pe;.  if( type>=
19e70 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
19e80 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46  {.    winUnlockF
19e90 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53  ile(&pFile->h, S
19ea0 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20  HARED_FIRST, 0, 
19eb0 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
19ec0 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  .    if( locktyp
19ed0 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26  e==SHARED_LOCK &
19ee0 26 20 21 77 69 6e 47 65 74 52 65 61 64 4c 6f 63  & !winGetReadLoc
19ef0 6b 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20  k(pFile) ){.    
19f00 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64    /* This should
19f10 20 6e 65 76 65 72 20 68 61 70 70 65 6e 2e 20 20   never happen.  
19f20 57 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  We should always
19f30 20 62 65 20 61 62 6c 65 20 74 6f 0a 20 20 20 20   be able to.    
19f40 20 20 2a 2a 20 72 65 61 63 71 75 69 72 65 20 74    ** reacquire t
19f50 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a  he read lock */.
19f60 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
19f70 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
19f80 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 6f 73 47 65  ERR_UNLOCK, osGe
19f90 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
19fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fb0 20 20 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 22       "winUnlock"
19fc0 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
19fd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
19fe0 20 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f   type>=RESERVED_
19ff0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55  LOCK ){.    winU
1a000 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
1a010 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ->h, RESERVED_BY
1a020 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
1a030 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  }.  if( locktype
1a040 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74 79 70  ==NO_LOCK && typ
1a050 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e>=SHARED_LOCK )
1a060 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 52  {.    winUnlockR
1a070 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  eadLock(pFile);.
1a080 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d    }.  if( type>=
1a090 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a  PENDING_LOCK ){.
1a0a0 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c      winUnlockFil
1a0b0 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e  e(&pFile->h, PEN
1a0c0 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c  DING_BYTE, 0, 1,
1a0d0 20 30 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65   0);.  }.  pFile
1a0e0 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38  ->locktype = (u8
1a0f0 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 4f 53 54  )locktype;.  OST
1a100 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 66 69  RACE(("UNLOCK fi
1a110 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20  le=%p, lock=%d, 
1a120 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
1a130 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70       pFile->h, p
1a140 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  File->locktype, 
1a150 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
1a160 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  c)));.  return r
1a170 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  c;.}../*********
1a180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a1a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a1b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a1c0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
1a1d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a1e0 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69  **** No-op Locki
1a1f0 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
1a200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a210 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74  *****.**.** Of t
1a220 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69  he various locki
1a230 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ng implementatio
1a240 6e 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68  ns available, th
1a250 69 73 20 69 73 20 62 79 20 66 61 72 20 74 68 65  is is by far the
1a260 0a 2a 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c  .** simplest:  l
1a270 6f 63 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72 65  ocking is ignore
1a280 64 2e 20 20 4e 6f 20 61 74 74 65 6d 70 74 20 69  d.  No attempt i
1a290 73 20 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74  s made to lock t
1a2a0 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
1a2b0 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20  ile for reading 
1a2c0 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a  or writing..**.*
1a2d0 2a 20 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d  * This locking m
1a2e0 6f 64 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ode is appropria
1a2f0 74 65 20 66 6f 72 20 75 73 65 20 6f 6e 20 72 65  te for use on re
1a300 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
1a310 73 0a 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61  s.** (ex: databa
1a320 73 65 73 20 74 68 61 74 20 61 72 65 20 62 75 72  ses that are bur
1a330 6e 65 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c  ned into CD-ROM,
1a340 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20   for example.)  
1a350 49 74 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62  It can.** also b
1a360 65 20 75 73 65 64 20 69 66 20 74 68 65 20 61 70  e used if the ap
1a370 70 6c 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79  plication employ
1a380 73 20 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20  s some external 
1a390 6d 65 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20  mechanism to.** 
1a3a0 70 72 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e  prevent simultan
1a3b0 65 6f 75 73 20 61 63 63 65 73 73 20 6f 66 20 74  eous access of t
1a3c0 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
1a3d0 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a   by two or more.
1a3e0 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
1a3f0 65 63 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68  ections.  But th
1a400 65 72 65 20 69 73 20 61 20 73 65 72 69 6f 75 73  ere is a serious
1a410 20 72 69 73 6b 20 6f 66 20 64 61 74 61 62 61 73   risk of databas
1a420 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20  e.** corruption 
1a430 69 66 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  if this locking 
1a440 6d 6f 64 65 20 69 73 20 75 73 65 64 20 69 6e 20  mode is used in 
1a450 73 69 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65  situations where
1a460 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74   multiple.** dat
1a470 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1a480 73 20 61 72 65 20 61 63 63 65 73 73 69 6e 67 20  s are accessing 
1a490 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
1a4a0 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61  e file at the sa
1a4b0 6d 65 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f  me.** time and o
1a4c0 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
1a4d0 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ose connections 
1a4e0 61 72 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a  are writing..*/.
1a4f0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4e  .static int winN
1a500 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65  olockLock(sqlite
1a510 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
1a520 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 55 4e 55  locktype){.  UNU
1a530 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64  SED_PARAMETER(id
1a540 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1a550 4d 45 54 45 52 28 6c 6f 63 6b 74 79 70 65 29 3b  METER(locktype);
1a560 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1a570 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  _OK;.}..static i
1a580 6e 74 20 77 69 6e 4e 6f 6c 6f 63 6b 43 68 65 63  nt winNolockChec
1a590 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
1a5a0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1a5b0 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
1a5c0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1a5d0 52 28 69 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f  R(id);.  UNUSED_
1a5e0 50 41 52 41 4d 45 54 45 52 28 70 52 65 73 4f 75  PARAMETER(pResOu
1a5f0 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  t);.  return SQL
1a600 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69  ITE_OK;.}..stati
1a610 63 20 69 6e 74 20 77 69 6e 4e 6f 6c 6f 63 6b 55  c int winNolockU
1a620 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
1a630 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
1a640 74 79 70 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  type){.  UNUSED_
1a650 50 41 52 41 4d 45 54 45 52 28 69 64 29 3b 0a 20  PARAMETER(id);. 
1a660 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1a670 52 28 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 72  R(locktype);.  r
1a680 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1a690 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
1a6a0 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
1a6b0 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69  the no-op lock i
1a6c0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
1a6d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a6e0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
1a6f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a730 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70  **/../*.** If *p
1a740 41 72 67 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  Arg is initially
1a750 20 6e 65 67 61 74 69 76 65 20 74 68 65 6e 20 74   negative then t
1a760 68 69 73 20 69 73 20 61 20 71 75 65 72 79 2e 20  his is a query. 
1a770 20 53 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a   Set *pArg to.**
1a780 20 31 20 6f 72 20 30 20 64 65 70 65 6e 64 69 6e   1 or 0 dependin
1a790 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  g on whether or 
1a7a0 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f 66 20  not bit mask of 
1a7b0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1a7c0 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49   is set..**.** I
1a7d0 66 20 2a 70 41 72 67 20 69 73 20 30 20 6f 72 20  f *pArg is 0 or 
1a7e0 31 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 6f 72  1, then clear or
1a7f0 20 73 65 74 20 74 68 65 20 6d 61 73 6b 20 62 69   set the mask bi
1a800 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c  t of pFile->ctrl
1a810 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  Flags..*/.static
1a820 20 76 6f 69 64 20 77 69 6e 4d 6f 64 65 42 69 74   void winModeBit
1a830 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c  (winFile *pFile,
1a840 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d   unsigned char m
1a850 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b  ask, int *pArg){
1a860 0a 20 20 69 66 28 20 2a 70 41 72 67 3c 30 20 29  .  if( *pArg<0 )
1a870 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d 20 28 70  {.    *pArg = (p
1a880 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
1a890 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65  & mask)!=0;.  }e
1a8a0 6c 73 65 20 69 66 28 20 28 2a 70 41 72 67 29 3d  lse if( (*pArg)=
1a8b0 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  =0 ){.    pFile-
1a8c0 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d  >ctrlFlags &= ~m
1a8d0 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ask;.  }else{.  
1a8e0 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
1a8f0 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a  gs |= mask;.  }.
1a900 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  }../* Forward re
1a910 66 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20  ferences to VFS 
1a920 68 65 6c 70 65 72 20 6d 65 74 68 6f 64 73 20 75  helper methods u
1a930 73 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  sed for temporar
1a940 79 20 66 69 6c 65 73 20 2a 2f 0a 73 74 61 74 69  y files */.stati
1a950 63 20 69 6e 74 20 77 69 6e 47 65 74 54 65 6d 70  c int winGetTemp
1a960 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73  name(sqlite3_vfs
1a970 20 2a 2c 20 63 68 61 72 20 2a 2a 29 3b 0a 73 74   *, char **);.st
1a980 61 74 69 63 20 69 6e 74 20 77 69 6e 49 73 44 69  atic int winIsDi
1a990 72 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 29 3b  r(const void *);
1a9a0 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
1a9b0 49 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64  IsDriveLetterAnd
1a9c0 43 6f 6c 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72  Colon(const char
1a9d0 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74   *);../*.** Cont
1a9e0 72 6f 6c 20 61 6e 64 20 71 75 65 72 79 20 6f 66  rol and query of
1a9f0 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 68   the open file h
1aa00 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
1aa10 20 69 6e 74 20 77 69 6e 46 69 6c 65 43 6f 6e 74   int winFileCont
1aa20 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
1aa30 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f   *id, int op, vo
1aa40 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 77 69 6e  id *pArg){.  win
1aa50 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
1aa60 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 4f 53  inFile*)id;.  OS
1aa70 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
1aa80 6c 65 3d 25 70 2c 20 6f 70 3d 25 64 2c 20 70 41  le=%p, op=%d, pA
1aa90 72 67 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d  rg=%p\n", pFile-
1aaa0 3e 68 2c 20 6f 70 2c 20 70 41 72 67 29 29 3b 0a  >h, op, pArg));.
1aab0 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
1aac0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1aad0 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a  FCNTL_LOCKSTATE:
1aae0 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
1aaf0 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f  pArg = pFile->lo
1ab00 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 4f 53  cktype;.      OS
1ab10 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
1ab20 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
1ab30 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
1ab40 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
1ab50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1ab60 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1ab70 45 5f 46 43 4e 54 4c 5f 4c 41 53 54 5f 45 52 52  E_FCNTL_LAST_ERR
1ab80 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e  NO: {.      *(in
1ab90 74 2a 29 70 41 72 67 20 3d 20 28 69 6e 74 29 70  t*)pArg = (int)p
1aba0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  File->lastErrno;
1abb0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1abc0 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
1abd0 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
1abe0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
1abf0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ac00 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1ac10 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1ac20 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20  _CHUNK_SIZE: {. 
1ac30 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68       pFile->szCh
1ac40 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41  unk = *(int *)pA
1ac50 72 67 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  rg;.      OSTRAC
1ac60 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
1ac70 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
1ac80 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
1ac90 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1aca0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1acb0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1acc0 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b  NTL_SIZE_HINT: {
1acd0 0a 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65  .      if( pFile
1ace0 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20  ->szChunk>0 ){. 
1acf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69         sqlite3_i
1ad00 6e 74 36 34 20 6f 6c 64 53 7a 3b 0a 20 20 20 20  nt64 oldSz;.    
1ad10 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e      int rc = win
1ad20 46 69 6c 65 53 69 7a 65 28 69 64 2c 20 26 6f 6c  FileSize(id, &ol
1ad30 64 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  dSz);.        if
1ad40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ad50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
1ad60 69 74 65 33 5f 69 6e 74 36 34 20 6e 65 77 53 7a  ite3_int64 newSz
1ad70 20 3d 20 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74   = *(sqlite3_int
1ad80 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  64*)pArg;.      
1ad90 20 20 20 20 69 66 28 20 6e 65 77 53 7a 3e 6f 6c      if( newSz>ol
1ada0 64 53 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  dSz ){.         
1adb0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1adc0 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
1add0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69           rc = wi
1ade0 6e 54 72 75 6e 63 61 74 65 28 69 64 2c 20 6e 65  nTruncate(id, ne
1adf0 77 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wSz);.          
1ae00 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1ae10 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
1ae20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ae30 7d 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43  }.        OSTRAC
1ae40 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
1ae50 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69  p, rc=%s\n", pFi
1ae60 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72  le->h, sqlite3Er
1ae70 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20  rName(rc)));.   
1ae80 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1ae90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53        }.      OS
1aea0 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
1aeb0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
1aec0 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
1aed0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
1aee0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1aef0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1af00 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f  E_FCNTL_PERSIST_
1af10 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e  WAL: {.      win
1af20 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 57  ModeBit(pFile, W
1af30 49 4e 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57  INFILE_PERSIST_W
1af40 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b  AL, (int*)pArg);
1af50 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1af60 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
1af70 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
1af80 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
1af90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1afa0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1afb0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1afc0 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
1afd0 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 77 69  RITE: {.      wi
1afe0 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20  nModeBit(pFile, 
1aff0 57 49 4e 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69  WINFILE_PSOW, (i
1b000 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20  nt*)pArg);.     
1b010 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
1b020 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
1b030 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
1b040 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
1b050 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1b060 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1b070 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41  LITE_FCNTL_VFSNA
1b080 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63 68  ME: {.      *(ch
1b090 61 72 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69  ar**)pArg = sqli
1b0a0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
1b0b0 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a  , pFile->pVfs->z
1b0c0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 4f 53 54  Name);.      OST
1b0d0 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
1b0e0 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
1b0f0 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
1b100 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1b110 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1b120 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1b130 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41 56 5f  _FCNTL_WIN32_AV_
1b140 52 45 54 52 59 3a 20 7b 0a 20 20 20 20 20 20 69  RETRY: {.      i
1b150 6e 74 20 2a 61 20 3d 20 28 69 6e 74 2a 29 70 41  nt *a = (int*)pA
1b160 72 67 3b 0a 20 20 20 20 20 20 69 66 28 20 61 5b  rg;.      if( a[
1b170 30 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  0]>0 ){.        
1b180 77 69 6e 49 6f 65 72 72 52 65 74 72 79 20 3d 20  winIoerrRetry = 
1b190 61 5b 30 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  a[0];.      }els
1b1a0 65 7b 0a 20 20 20 20 20 20 20 20 61 5b 30 5d 20  e{.        a[0] 
1b1b0 3d 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 3b  = winIoerrRetry;
1b1c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1b1d0 66 28 20 61 5b 31 5d 3e 30 20 29 7b 0a 20 20 20  f( a[1]>0 ){.   
1b1e0 20 20 20 20 20 77 69 6e 49 6f 65 72 72 52 65 74       winIoerrRet
1b1f0 72 79 44 65 6c 61 79 20 3d 20 61 5b 31 5d 3b 0a  ryDelay = a[1];.
1b200 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b210 20 20 20 20 20 61 5b 31 5d 20 3d 20 77 69 6e 49       a[1] = winI
1b220 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 3b 0a  oerrRetryDelay;.
1b230 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53        }.      OS
1b240 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
1b250 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
1b260 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
1b270 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
1b280 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1b290 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1b2a0 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 47 45  E_FCNTL_WIN32_GE
1b2b0 54 5f 48 41 4e 44 4c 45 3a 20 7b 0a 20 20 20 20  T_HANDLE: {.    
1b2c0 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c    LPHANDLE phFil
1b2d0 65 20 3d 20 28 4c 50 48 41 4e 44 4c 45 29 70 41  e = (LPHANDLE)pA
1b2e0 72 67 3b 0a 20 20 20 20 20 20 2a 70 68 46 69 6c  rg;.      *phFil
1b2f0 65 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20  e = pFile->h;.  
1b300 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
1b310 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
1b320 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
1b330 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
1b340 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b350 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
1b360 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 63  QLITE_TEST.    c
1b370 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1b380 5f 57 49 4e 33 32 5f 53 45 54 5f 48 41 4e 44 4c  _WIN32_SET_HANDL
1b390 45 3a 20 7b 0a 20 20 20 20 20 20 4c 50 48 41 4e  E: {.      LPHAN
1b3a0 44 4c 45 20 70 68 46 69 6c 65 20 3d 20 28 4c 50  DLE phFile = (LP
1b3b0 48 41 4e 44 4c 45 29 70 41 72 67 3b 0a 20 20 20  HANDLE)pArg;.   
1b3c0 20 20 20 48 41 4e 44 4c 45 20 68 4f 6c 64 46 69     HANDLE hOldFi
1b3d0 6c 65 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20  le = pFile->h;. 
1b3e0 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20       pFile->h = 
1b3f0 2a 70 68 46 69 6c 65 3b 0a 20 20 20 20 20 20 2a  *phFile;.      *
1b400 70 68 46 69 6c 65 20 3d 20 68 4f 6c 64 46 69 6c  phFile = hOldFil
1b410 65 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  e;.      OSTRACE
1b420 28 28 22 46 43 4e 54 4c 20 6f 6c 64 46 69 6c 65  (("FCNTL oldFile
1b430 3d 25 70 2c 20 6e 65 77 46 69 6c 65 3d 25 70 2c  =%p, newFile=%p,
1b440 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
1b450 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b460 20 68 4f 6c 64 46 69 6c 65 2c 20 70 46 69 6c 65   hOldFile, pFile
1b470 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
1b480 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1b490 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1b4a0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1b4b0 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20  L_TEMPFILENAME: 
1b4c0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54  {.      char *zT
1b4d0 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  File = 0;.      
1b4e0 69 6e 74 20 72 63 20 3d 20 77 69 6e 47 65 74 54  int rc = winGetT
1b4f0 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70  empname(pFile->p
1b500 56 66 73 2c 20 26 7a 54 46 69 6c 65 29 3b 0a 20  Vfs, &zTFile);. 
1b510 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1b520 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1b530 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20    *(char**)pArg 
1b540 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20 20  = zTFile;.      
1b550 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  }.      OSTRACE(
1b560 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
1b570 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65   rc=%s\n", pFile
1b580 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  ->h, sqlite3ErrN
1b590 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20  ame(rc)));.     
1b5a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1b5b0 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  }.#if SQLITE_MAX
1b5c0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20  _MMAP_SIZE>0.   
1b5d0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1b5e0 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a  TL_MMAP_SIZE: {.
1b5f0 20 20 20 20 20 20 69 36 34 20 6e 65 77 4c 69 6d        i64 newLim
1b600 69 74 20 3d 20 2a 28 69 36 34 2a 29 70 41 72 67  it = *(i64*)pArg
1b610 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  ;.      int rc =
1b620 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1b630 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73    if( newLimit>s
1b640 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1b650 69 67 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20  ig.mxMmap ){.   
1b660 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20       newLimit = 
1b670 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1b680 66 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20  fig.mxMmap;.    
1b690 20 20 7d 0a 20 20 20 20 20 20 2a 28 69 36 34 2a    }.      *(i64*
1b6a0 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d  )pArg = pFile->m
1b6b0 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20  mapSizeMax;.    
1b6c0 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d    if( newLimit>=
1b6d0 30 20 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70  0 && newLimit!=p
1b6e0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  File->mmapSizeMa
1b6f0 78 20 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74  x && pFile->nFet
1b700 63 68 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20  chOut==0 ){.    
1b710 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53      pFile->mmapS
1b720 69 7a 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69  izeMax = newLimi
1b730 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  t;.        if( p
1b740 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30  File->mmapSize>0
1b750 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 69   ){.          wi
1b760 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65  nUnmapfile(pFile
1b770 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
1b780 3d 20 77 69 6e 4d 61 70 66 69 6c 65 28 70 46 69  = winMapfile(pFi
1b790 6c 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20  le, -1);.       
1b7a0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1b7b0 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
1b7c0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c   file=%p, rc=%s\
1b7d0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71  n", pFile->h, sq
1b7e0 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
1b7f0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
1b800 20 72 63 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   rc;.    }.#endi
1b810 66 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  f.  }.  OSTRACE(
1b820 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
1b830 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f   rc=SQLITE_NOTFO
1b840 55 4e 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  UND\n", pFile->h
1b850 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
1b860 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a  ITE_NOTFOUND;.}.
1b870 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1b880 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e  e sector size in
1b890 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e   bytes of the un
1b8a0 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64  derlying block d
1b8b0 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65  evice for.** the
1b8c0 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e   specified file.
1b8d0 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20   This is almost 
1b8e0 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73  always 512 bytes
1b8f0 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20  , but may be.** 
1b900 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20  larger for some 
1b910 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53  devices..**.** S
1b920 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d  QLite code assum
1b930 65 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  es this function
1b940 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74   cannot fail. It
1b950 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68   also assumes th
1b960 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c  at.** if two fil
1b970 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20 69  es are created i
1b980 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d  n the same file-
1b990 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79  system directory
1b9a0 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61   (i.e..** a data
1b9b0 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75  base and its jou
1b9c0 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20  rnal file) that 
1b9d0 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
1b9e0 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73  will be the.** s
1b9f0 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f  ame for both..*/
1ba00 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
1ba10 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65  ectorSize(sqlite
1ba20 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 23 69 66  3_file *id){.#if
1ba30 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f   defined(_WIN32_
1ba40 57 49 4e 4e 54 29 20 26 26 20 5f 57 49 4e 33 32  WINNT) && _WIN32
1ba50 5f 57 49 4e 4e 54 20 3e 3d 20 5f 57 49 4e 33 32  _WINNT >= _WIN32
1ba60 5f 57 49 4e 4e 54 5f 57 49 4e 38 0a 20 20 77 69  _WINNT_WIN8.  wi
1ba70 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
1ba80 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 46  winFile*)id;.  F
1ba90 49 4c 45 5f 53 54 4f 52 41 47 45 5f 49 4e 46 4f  ILE_STORAGE_INFO
1baa0 20 69 6e 66 6f 3b 0a 20 20 6d 65 6d 73 65 74 28   info;.  memset(
1bab0 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  &info, 0, sizeof
1bac0 28 46 49 4c 45 5f 53 54 4f 52 41 47 45 5f 49 4e  (FILE_STORAGE_IN
1bad0 46 4f 29 29 3b 0a 20 20 69 66 28 20 6f 73 47 65  FO));.  if( osGe
1bae0 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e  tFileInformation
1baf0 42 79 48 61 6e 64 6c 65 45 78 28 70 46 69 6c 65  ByHandleEx(pFile
1bb00 2d 3e 68 2c 20 46 69 6c 65 53 74 6f 72 61 67 65  ->h, FileStorage
1bb10 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  Info,.          
1bb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb30 20 20 20 20 20 20 20 20 20 26 69 6e 66 6f 2c 20           &info, 
1bb40 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 20 29 7b  sizeof(info)) ){
1bb50 0a 20 20 20 20 55 4c 4f 4e 47 20 73 69 7a 65 20  .    ULONG size 
1bb60 3d 20 69 6e 66 6f 2e 46 69 6c 65 53 79 73 74 65  = info.FileSyste
1bb70 6d 45 66 66 65 63 74 69 76 65 50 68 79 73 69 63  mEffectivePhysic
1bb80 61 6c 42 79 74 65 73 50 65 72 53 65 63 74 6f 72  alBytesPerSector
1bb90 46 6f 72 41 74 6f 6d 69 63 69 74 79 3b 0a 20 20  ForAtomicity;.  
1bba0 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 43 54    OSTRACE(("SECT
1bbb0 4f 52 20 66 69 6c 65 3d 25 70 2c 20 73 69 7a 65  OR file=%p, size
1bbc0 3d 25 6c 75 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  =%lu\n", pFile->
1bbd0 68 2c 20 73 69 7a 65 29 29 3b 0a 20 20 20 20 69  h, size));.    i
1bbe0 66 28 20 73 69 7a 65 3e 30 20 26 26 20 73 69 7a  f( size>0 && siz
1bbf0 65 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b  e<=2147483647 ){
1bc00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 69  .      return (i
1bc10 6e 74 29 73 69 7a 65 3b 0a 20 20 20 20 7d 0a 20  nt)size;.    }. 
1bc20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c   }else{.    pFil
1bc30 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
1bc40 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
1bc50 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72  .    winLogError
1bc60 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  (SQLITE_IOERR_FS
1bc70 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  TAT, pFile->last
1bc80 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
1bc90 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
1bca0 53 65 63 74 6f 72 53 69 7a 65 31 22 2c 20 70 46  SectorSize1", pF
1bcb0 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
1bcc0 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f  .#elif defined(_
1bcd0 57 49 4e 33 32 5f 57 49 4e 4e 54 29 20 26 26 20  WIN32_WINNT) && 
1bce0 5f 57 49 4e 33 32 5f 57 49 4e 4e 54 20 3e 3d 20  _WIN32_WINNT >= 
1bcf0 5f 57 49 4e 33 32 5f 57 49 4e 4e 54 5f 56 49 53  _WIN32_WINNT_VIS
1bd00 54 41 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  TA.  winFile *pF
1bd10 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
1bd20 69 64 3b 0a 20 20 69 66 28 20 77 69 6e 49 73 44  id;.  if( winIsD
1bd30 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c  riveLetterAndCol
1bd40 6f 6e 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  on(pFile->zPath)
1bd50 20 29 7b 0a 20 20 20 20 57 43 48 41 52 20 7a 44   ){.    WCHAR zD
1bd60 69 73 6b 5b 5d 20 3d 20 4c 22 5c 5c 5c 5c 2e 5c  isk[] = L"\\\\.\
1bd70 5c 5f 3a 5c 30 22 3b 20 2f 2a 20 75 6e 64 65 72  \_:\0"; /* under
1bd80 73 63 6f 72 65 20 77 69 6c 6c 20 62 65 20 64 72  score will be dr
1bd90 69 76 65 20 6c 65 74 74 65 72 20 2a 2f 0a 20 20  ive letter */.  
1bda0 20 20 48 41 4e 44 4c 45 20 68 44 69 73 6b 3b 0a    HANDLE hDisk;.
1bdb0 20 20 20 20 7a 44 69 73 6b 5b 34 5d 20 3d 20 28      zDisk[4] = (
1bdc0 57 43 48 41 52 29 70 46 69 6c 65 2d 3e 7a 50 61  WCHAR)pFile->zPa
1bdd0 74 68 5b 30 5d 3b 20 2f 2a 20 27 41 27 20 74 6f  th[0]; /* 'A' to
1bde0 20 27 5a 27 20 6f 6e 6c 79 2c 20 75 70 70 65 72   'Z' only, upper
1bdf0 2f 6c 6f 77 65 72 20 63 61 73 65 20 2a 2f 0a 20  /lower case */. 
1be00 20 20 20 61 73 73 65 72 74 28 20 28 7a 44 69 73     assert( (zDis
1be10 6b 5b 34 5d 3e 3d 4c 27 41 27 20 26 26 20 7a 44  k[4]>=L'A' && zD
1be20 69 73 6b 5b 34 5d 3c 3d 4c 27 5a 27 29 0a 20 20  isk[4]<=L'Z').  
1be30 20 20 20 20 20 20 20 7c 7c 20 28 7a 44 69 73 6b         || (zDisk
1be40 5b 34 5d 3e 3d 4c 27 61 27 20 26 26 20 7a 44 69  [4]>=L'a' && zDi
1be50 73 6b 5b 34 5d 3c 3d 4c 27 7a 27 29 0a 20 20 20  sk[4]<=L'z').   
1be60 20 29 3b 0a 20 20 20 20 68 44 69 73 6b 20 3d 20   );.    hDisk = 
1be70 6f 73 43 72 65 61 74 65 46 69 6c 65 57 28 7a 44  osCreateFileW(zD
1be80 69 73 6b 2c 20 53 54 41 4e 44 41 52 44 5f 52 49  isk, STANDARD_RI
1be90 47 48 54 53 5f 52 45 41 44 2c 0a 20 20 20 20 20  GHTS_READ,.     
1bea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1beb0 20 20 20 20 20 46 49 4c 45 5f 53 48 41 52 45 5f       FILE_SHARE_
1bec0 52 45 41 44 20 7c 20 46 49 4c 45 5f 53 48 41 52  READ | FILE_SHAR
1bed0 45 5f 57 52 49 54 45 2c 20 4e 55 4c 4c 2c 0a 20  E_WRITE, NULL,. 
1bee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bef0 20 20 20 20 20 20 20 20 20 4f 50 45 4e 5f 45 58           OPEN_EX
1bf00 49 53 54 49 4e 47 2c 20 46 49 4c 45 5f 41 54 54  ISTING, FILE_ATT
1bf10 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 2c 20 4e  RIBUTE_NORMAL, N
1bf20 55 4c 4c 29 3b 0a 20 20 20 20 69 66 28 20 68 44  ULL);.    if( hD
1bf30 69 73 6b 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  isk!=NULL ){.   
1bf40 20 20 20 53 54 4f 52 41 47 45 5f 50 52 4f 50 45     STORAGE_PROPE
1bf50 52 54 59 5f 51 55 45 52 59 20 71 75 65 72 79 3b  RTY_QUERY query;
1bf60 0a 20 20 20 20 20 20 53 54 4f 52 41 47 45 5f 41  .      STORAGE_A
1bf70 43 43 45 53 53 5f 41 4c 49 47 4e 4d 45 4e 54 5f  CCESS_ALIGNMENT_
1bf80 44 45 53 43 52 49 50 54 4f 52 20 61 6c 69 67 6e  DESCRIPTOR align
1bf90 6d 65 6e 74 3b 0a 20 20 20 20 20 20 44 57 4f 52  ment;.      DWOR
1bfa0 44 20 62 79 74 65 73 20 3d 20 30 3b 0a 20 20 20  D bytes = 0;.   
1bfb0 20 20 20 6d 65 6d 73 65 74 28 26 71 75 65 72 79     memset(&query
1bfc0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 54 4f 52  , 0, sizeof(STOR
1bfd0 41 47 45 5f 50 52 4f 50 45 52 54 59 5f 51 55 45  AGE_PROPERTY_QUE
1bfe0 52 59 29 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73  RY));.      mems
1bff0 65 74 28 26 61 6c 69 67 6e 6d 65 6e 74 2c 20 30  et(&alignment, 0
1c000 2c 20 73 69 7a 65 6f 66 28 53 54 4f 52 41 47 45  , sizeof(STORAGE
1c010 5f 41 43 43 45 53 53 5f 41 4c 49 47 4e 4d 45 4e  _ACCESS_ALIGNMEN
1c020 54 5f 44 45 53 43 52 49 50 54 4f 52 29 29 3b 0a  T_DESCRIPTOR));.
1c030 20 20 20 20 20 20 71 75 65 72 79 2e 51 75 65 72        query.Quer
1c040 79 54 79 70 65 20 20 3d 20 50 72 6f 70 65 72 74  yType  = Propert
1c050 79 53 74 61 6e 64 61 72 64 51 75 65 72 79 3b 0a  yStandardQuery;.
1c060 20 20 20 20 20 20 71 75 65 72 79 2e 50 72 6f 70        query.Prop
1c070 65 72 74 79 49 64 20 3d 20 53 74 6f 72 61 67 65  ertyId = Storage
1c080 41 63 63 65 73 73 41 6c 69 67 6e 6d 65 6e 74 50  AccessAlignmentP
1c090 72 6f 70 65 72 74 79 3b 0a 20 20 20 20 20 20 69  roperty;.      i
1c0a0 66 28 20 6f 73 44 65 76 69 63 65 49 6f 43 6f 6e  f( osDeviceIoCon
1c0b0 74 72 6f 6c 28 68 44 69 73 6b 2c 20 49 4f 43 54  trol(hDisk, IOCT
1c0c0 4c 5f 53 54 4f 52 41 47 45 5f 51 55 45 52 59 5f  L_STORAGE_QUERY_
1c0d0 50 52 4f 50 45 52 54 59 2c 20 26 71 75 65 72 79  PROPERTY, &query
1c0e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
1c100 7a 65 6f 66 28 53 54 4f 52 41 47 45 5f 50 52 4f  zeof(STORAGE_PRO
1c110 50 45 52 54 59 5f 51 55 45 52 59 29 2c 20 26 61  PERTY_QUERY), &a
1c120 6c 69 67 6e 6d 65 6e 74 2c 0a 20 20 20 20 20 20  lignment,.      
1c130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c140 20 20 20 20 20 20 73 69 7a 65 6f 66 28 53 54 4f        sizeof(STO
1c150 52 41 47 45 5f 41 43 43 45 53 53 5f 41 4c 49 47  RAGE_ACCESS_ALIG
1c160 4e 4d 45 4e 54 5f 44 45 53 43 52 49 50 54 4f 52  NMENT_DESCRIPTOR
1c170 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
1c180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
1c190 62 79 74 65 73 2c 20 4e 55 4c 4c 29 20 29 7b 0a  bytes, NULL) ){.
1c1a0 20 20 20 20 20 20 20 20 44 57 4f 52 44 20 73 69          DWORD si
1c1b0 7a 65 20 3d 20 61 6c 69 67 6e 6d 65 6e 74 2e 42  ze = alignment.B
1c1c0 79 74 65 73 50 65 72 50 68 79 73 69 63 61 6c 53  ytesPerPhysicalS
1c1d0 65 63 74 6f 72 3b 0a 20 20 20 20 20 20 20 20 4f  ector;.        O
1c1e0 53 54 52 41 43 45 28 28 22 53 45 43 54 4f 52 20  STRACE(("SECTOR 
1c1f0 66 69 6c 65 3d 25 70 2c 20 73 69 7a 65 3d 25 6c  file=%p, size=%l
1c200 75 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  u\n", pFile->h, 
1c210 73 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20  size));.        
1c220 69 66 28 20 73 69 7a 65 3e 30 20 26 26 20 73 69  if( size>0 && si
1c230 7a 65 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29  ze<=2147483647 )
1c240 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
1c250 72 6e 20 28 69 6e 74 29 73 69 7a 65 3b 0a 20 20  rn (int)size;.  
1c260 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
1c270 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 69  lse{.        pFi
1c280 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
1c290 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
1c2a0 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 4c 6f 67  ;.        winLog
1c2b0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1c2c0 52 52 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d  RR_FSTAT, pFile-
1c2d0 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
1c2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c2f0 22 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 32 22  "winSectorSize2"
1c300 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
1c310 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6f  .      }.      o
1c320 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 44 69  sCloseHandle(hDi
1c330 73 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  sk);.    }else{.
1c340 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
1c350 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
1c360 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
1c370 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
1c380 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 2c  ITE_IOERR_FSTAT,
1c390 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
1c3a0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
1c3b0 20 20 20 20 20 22 77 69 6e 53 65 63 74 6f 72 53       "winSectorS
1c3c0 69 7a 65 33 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  ize3", pFile->zP
1c3d0 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ath);.    }.  }.
1c3e0 23 65 6c 73 65 0a 20 20 28 76 6f 69 64 29 69 64  #else.  (void)id
1c3f0 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
1c400 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  n SQLITE_DEFAULT
1c410 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a  _SECTOR_SIZE;.}.
1c420 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1c430 76 65 63 74 6f 72 20 6f 66 20 64 65 76 69 63 65  vector of device
1c440 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
1c450 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c460 77 69 6e 44 65 76 69 63 65 43 68 61 72 61 63 74  winDeviceCharact
1c470 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33  eristics(sqlite3
1c480 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 77 69  _file *id){.  wi
1c490 6e 46 69 6c 65 20 2a 70 20 3d 20 28 77 69 6e 46  nFile *p = (winF
1c4a0 69 6c 65 2a 29 69 64 3b 0a 20 20 72 65 74 75 72  ile*)id;.  retur
1c4b0 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55  n SQLITE_IOCAP_U
1c4c0 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
1c4d0 4f 50 45 4e 20 7c 0a 20 20 20 20 20 20 20 20 20  OPEN |.         
1c4e0 28 28 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ((p->ctrlFlags &
1c4f0 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 29 3f 53   WINFILE_PSOW)?S
1c500 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45  QLITE_IOCAP_POWE
1c510 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a  RSAFE_OVERWRITE:
1c520 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e  0);.}../*.** Win
1c530 64 6f 77 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 6c  dows will only l
1c540 65 74 20 79 6f 75 20 63 72 65 61 74 65 20 66 69  et you create fi
1c550 6c 65 20 76 69 65 77 20 6d 61 70 70 69 6e 67 73  le view mappings
1c560 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74 69 6f  .** on allocatio
1c570 6e 20 73 69 7a 65 20 67 72 61 6e 75 6c 61 72 69  n size granulari
1c580 74 79 20 62 6f 75 6e 64 61 72 69 65 73 2e 0a 2a  ty boundaries..*
1c590 2a 20 44 75 72 69 6e 67 20 73 71 6c 69 74 65 33  * During sqlite3
1c5a0 5f 6f 73 5f 69 6e 69 74 28 29 20 77 65 20 64 6f  _os_init() we do
1c5b0 20 61 20 47 65 74 53 79 73 74 65 6d 49 6e 66 6f   a GetSystemInfo
1c5c0 28 29 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65  ().** to get the
1c5d0 20 67 72 61 6e 75 6c 61 72 69 74 79 20 73 69 7a   granularity siz
1c5e0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 59 53  e..*/.static SYS
1c5f0 54 45 4d 5f 49 4e 46 4f 20 77 69 6e 53 79 73 49  TEM_INFO winSysI
1c600 6e 66 6f 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  nfo;..#ifndef SQ
1c610 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f  LITE_OMIT_WAL../
1c620 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
1c630 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20  tions to obtain 
1c640 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74  and relinquish t
1c650 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e  he global mutex.
1c660 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d   The.** global m
1c670 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f 20  utex is used to 
1c680 70 72 6f 74 65 63 74 20 74 68 65 20 77 69 6e 4c  protect the winL
1c690 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20  ockInfo objects 
1c6a0 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20  used by.** this 
1c6b0 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69  file, all of whi
1c6c0 63 68 20 6d 61 79 20 62 65 20 73 68 61 72 65 64  ch may be shared
1c6d0 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 74 68 72   by multiple thr
1c6e0 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63  eads..**.** Func
1c6f0 74 69 6f 6e 20 77 69 6e 53 68 6d 4d 75 74 65 78  tion winShmMutex
1c700 48 65 6c 64 28 29 20 69 73 20 75 73 65 64 20 74  Held() is used t
1c710 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20  o assert() that 
1c720 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
1c730 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68 65 6e  .** is held when
1c740 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20   required. This 
1c750 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
1c760 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66   used as part of
1c770 20 61 73 73 65 72 74 28 29 0a 2a 2a 20 73 74 61   assert().** sta
1c780 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a  tements. e.g..**
1c790 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 45 6e 74 65  .**   winShmEnte
1c7a0 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20 20  rMutex().**     
1c7b0 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75  assert( winShmMu
1c7c0 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20  texHeld() );.** 
1c7d0 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74    winShmLeaveMut
1c7e0 65 78 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ex().*/.static v
1c7f0 6f 69 64 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  oid winShmEnterM
1c800 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71  utex(void){.  sq
1c810 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1c820 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  r(sqlite3MutexAl
1c830 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
1c840 5f 53 54 41 54 49 43 5f 56 46 53 31 29 29 3b 0a  _STATIC_VFS1));.
1c850 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  }.static void wi
1c860 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 76  nShmLeaveMutex(v
1c870 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
1c880 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
1c890 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
1c8a0 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
1c8b0 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 23 69 66 6e  C_VFS1));.}.#ifn
1c8c0 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69  def NDEBUG.stati
1c8d0 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 75 74 65  c int winShmMute
1c8e0 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20  xHeld(void) {.  
1c8f0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d  return sqlite3_m
1c900 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65  utex_held(sqlite
1c910 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
1c920 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
1c930 56 46 53 31 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  VFS1));.}.#endif
1c940 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75  ../*.** Object u
1c950 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sed to represent
1c960 20 61 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 6f   a single file o
1c970 70 65 6e 65 64 20 61 6e 64 20 6d 6d 61 70 70 65  pened and mmappe
1c980 64 20 74 6f 20 70 72 6f 76 69 64 65 0a 2a 2a 20  d to provide.** 
1c990 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20  shared memory.  
1c9a0 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68  When multiple th
1c9b0 72 65 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65  reads all refere
1c9c0 6e 63 65 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20  nce the same.** 
1c9d0 6c 6f 67 2d 73 75 6d 6d 61 72 79 2c 20 65 61 63  log-summary, eac
1c9e0 68 20 74 68 72 65 61 64 20 68 61 73 20 69 74 73  h thread has its
1c9f0 20 6f 77 6e 20 77 69 6e 46 69 6c 65 20 6f 62 6a   own winFile obj
1ca00 65 63 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c  ect, but they al
1ca10 6c 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20  l.** point to a 
1ca20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 20  single instance 
1ca30 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 2e 20  of this object. 
1ca40 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1ca50 20 65 61 63 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d   each.** log-sum
1ca60 6d 61 72 79 20 69 73 20 6f 70 65 6e 65 64 20 6f  mary is opened o
1ca70 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f  nly once per pro
1ca80 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e 53  cess..**.** winS
1ca90 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75  hmMutexHeld() mu
1caa0 73 74 20 62 65 20 74 72 75 65 20 77 68 65 6e 20  st be true when 
1cab0 63 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74  creating or dest
1cac0 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f  roying.** this o
1cad0 62 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72  bject or while r
1cae0 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1caf0 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
1cb00 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  fields:.**.**   
1cb10 20 20 20 6e 52 65 66 0a 2a 2a 20 20 20 20 20 20     nRef.**      
1cb20 70 4e 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20  pNext.**.** The 
1cb30 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
1cb40 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61   are read-only a
1cb50 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20  fter the object 
1cb60 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a  is created:.**.*
1cb70 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20  *      fid.**   
1cb80 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a     zFilename.**.
1cb90 2a 2a 20 45 69 74 68 65 72 20 77 69 6e 53 68 6d  ** Either winShm
1cba0 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20  Node.mutex must 
1cbb0 62 65 20 68 65 6c 64 20 6f 72 20 77 69 6e 53 68  be held or winSh
1cbc0 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e  mNode.nRef==0 an
1cbd0 64 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78  d.** winShmMutex
1cbe0 48 65 6c 64 28 29 20 69 73 20 74 72 75 65 20 77  Held() is true w
1cbf0 68 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77  hen reading or w
1cc00 72 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72  riting any other
1cc10 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69   field.** in thi
1cc20 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  s structure..**.
1cc30 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d  */.struct winShm
1cc40 4e 6f 64 65 20 7b 0a 20 20 73 71 6c 69 74 65 33  Node {.  sqlite3
1cc50 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20  _mutex *mutex;  
1cc60 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20      /* Mutex to 
1cc70 61 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65  access this obje
1cc80 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  ct */.  char *zF
1cc90 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
1cca0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1ccb0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 46  e file */.  winF
1ccc0 69 6c 65 20 68 46 69 6c 65 3b 20 20 20 20 20 20  ile hFile;      
1ccd0 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68         /* File h
1cce0 61 6e 64 6c 65 20 66 72 6f 6d 20 77 69 6e 4f 70  andle from winOp
1ccf0 65 6e 20 2a 2f 0a 0a 20 20 69 6e 74 20 73 7a 52  en */..  int szR
1cd00 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
1cd10 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73      /* Size of s
1cd20 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
1cd30 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ions */.  int nR
1cd40 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
1cd50 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1cd60 61 72 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a  array apRegion *
1cd70 2f 0a 20 20 73 74 72 75 63 74 20 53 68 6d 52 65  /.  struct ShmRe
1cd80 67 69 6f 6e 20 7b 0a 20 20 20 20 48 41 4e 44 4c  gion {.    HANDL
1cd90 45 20 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20  E hMap;         
1cda0 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64      /* File hand
1cdb0 6c 65 20 66 72 6f 6d 20 43 72 65 61 74 65 46 69  le from CreateFi
1cdc0 6c 65 4d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 20  leMapping */.   
1cdd0 20 76 6f 69 64 20 2a 70 4d 61 70 3b 0a 20 20 7d   void *pMap;.  }
1cde0 20 2a 61 52 65 67 69 6f 6e 3b 0a 20 20 44 57 4f   *aRegion;.  DWO
1cdf0 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20  RD lastErrno;   
1ce00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
1ce10 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f  indows errno fro
1ce20 6d 20 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65  m the last I/O e
1ce30 72 72 6f 72 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e  rror */..  int n
1ce40 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
1ce50 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1ce60 6f 66 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74  of winShm object
1ce70 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  s pointing to th
1ce80 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  is */.  winShm *
1ce90 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  pFirst;         
1cea0 20 20 20 2f 2a 20 41 6c 6c 20 77 69 6e 53 68 6d     /* All winShm
1ceb0 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e   objects pointin
1cec0 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77  g to this */.  w
1ced0 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 78 74  inShmNode *pNext
1cee0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78  ;         /* Nex
1cef0 74 20 69 6e 20 6c 69 73 74 20 6f 66 20 61 6c 6c  t in list of all
1cf00 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65   winShmNode obje
1cf10 63 74 73 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  cts */.#if defin
1cf20 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
1cf30 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
1cf40 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45  TE_HAVE_OS_TRACE
1cf50 29 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64  ).  u8 nextShmId
1cf60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1cf70 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65  * Next available
1cf80 20 77 69 6e 53 68 6d 2e 69 64 20 76 61 6c 75 65   winShm.id value
1cf90 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
1cfa0 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 61 72  *.** A global ar
1cfb0 72 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68  ray of all winSh
1cfc0 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e 0a 2a  mNode objects..*
1cfd0 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68 6d 4d  *.** The winShmM
1cfe0 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20  utexHeld() must 
1cff0 62 65 20 74 72 75 65 20 77 68 69 6c 65 20 72 65  be true while re
1d000 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1d010 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a 73   this list..*/.s
1d020 74 61 74 69 63 20 77 69 6e 53 68 6d 4e 6f 64 65  tatic winShmNode
1d030 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74   *winShmNodeList
1d040 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72   = 0;../*.** Str
1d050 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74 65  ucture used inte
1d060 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56  rnally by this V
1d070 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  FS to record the
1d080 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20   state of an.** 
1d090 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  open shared memo
1d0a0 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  ry connection..*
1d0b0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
1d0c0 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e  ng fields are in
1d0d0 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74  itialized when t
1d0e0 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72  his object is cr
1d0f0 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65  eated and.** are
1d100 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65   read-only there
1d110 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  after:.**.**    
1d120 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 0a  winShm.pShmNode.
1d130 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 69 64 0a  **    winShm.id.
1d140 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20  **.** All other 
1d150 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f  fields are read/
1d160 77 72 69 74 65 2e 20 20 54 68 65 20 77 69 6e 53  write.  The winS
1d170 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  hm.pShmNode->mut
1d180 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  ex must be held.
1d190 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69  ** while accessi
1d1a0 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74  ng any read/writ
1d1b0 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72  e fields..*/.str
1d1c0 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a 20 20 77  uct winShm {.  w
1d1d0 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
1d1e0 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  ode;      /* The
1d1f0 20 75 6e 64 65 72 6c 79 69 6e 67 20 77 69 6e 53   underlying winS
1d200 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f  hmNode object */
1d210 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e 65 78 74  .  winShm *pNext
1d220 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1d230 20 4e 65 78 74 20 77 69 6e 53 68 6d 20 77 69 74   Next winShm wit
1d240 68 20 74 68 65 20 73 61 6d 65 20 77 69 6e 53 68  h the same winSh
1d250 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61  mNode */.  u8 ha
1d260 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20  sMutex;         
1d270 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1d280 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 77 69 6e   holding the win
1d290 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f  ShmNode mutex */
1d2a0 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d 61 73  .  u16 sharedMas
1d2b0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k;            /*
1d2c0 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20   Mask of shared 
1d2d0 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
1d2e0 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20  u16 exclMask;   
1d2f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1d300 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
1d310 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23 69  locks held */.#i
1d320 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1d330 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
1d340 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f  ed(SQLITE_HAVE_O
1d350 53 5f 54 52 41 43 45 29 0a 20 20 75 38 20 69 64  S_TRACE).  u8 id
1d360 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d370 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74        /* Id of t
1d380 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
1d390 69 74 68 20 69 74 73 20 77 69 6e 53 68 6d 4e 6f  ith its winShmNo
1d3a0 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  de */.#endif.};.
1d3b0 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73  ./*.** Constants
1d3c0 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
1d3d0 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e  g.*/.#define WIN
1d3e0 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32 32  _SHM_BASE   ((22
1d3f0 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
1d400 4b 29 2a 34 29 20 20 20 20 20 20 20 20 2f 2a 20  K)*4)        /* 
1d410 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20  first lock byte 
1d420 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53  */.#define WIN_S
1d430 48 4d 5f 44 4d 53 20 20 20 20 28 57 49 4e 5f 53  HM_DMS    (WIN_S
1d440 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53  HM_BASE+SQLITE_S
1d450 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65  HM_NLOCK)  /* de
1d460 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a  adman switch */.
1d470 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 64 76  ./*.** Apply adv
1d480 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20  isory locks for 
1d490 61 6c 6c 20 6e 20 62 79 74 65 73 20 62 65 67 69  all n bytes begi
1d4a0 6e 6e 69 6e 67 20 61 74 20 6f 66 73 74 2e 0a 2a  nning at ofst..*
1d4b0 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 53 48 4d  /.#define WINSHM
1d4c0 5f 55 4e 4c 43 4b 20 20 31 0a 23 64 65 66 69 6e  _UNLCK  1.#defin
1d4d0 65 20 57 49 4e 53 48 4d 5f 52 44 4c 43 4b 20 20  e WINSHM_RDLCK  
1d4e0 32 0a 23 64 65 66 69 6e 65 20 57 49 4e 53 48 4d  2.#define WINSHM
1d4f0 5f 57 52 4c 43 4b 20 20 33 0a 73 74 61 74 69 63  _WRLCK  3.static
1d500 20 69 6e 74 20 77 69 6e 53 68 6d 53 79 73 74 65   int winShmSyste
1d510 6d 4c 6f 63 6b 28 0a 20 20 77 69 6e 53 68 6d 4e  mLock(.  winShmN
1d520 6f 64 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 2f  ode *pFile,    /
1d530 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f  * Apply locks to
1d540 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65   this open share
1d550 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d-memory segment
1d560 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79   */.  int lockTy
1d570 70 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57  pe,         /* W
1d580 49 4e 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e  INSHM_UNLCK, WIN
1d590 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20 57 49  SHM_RDLCK, or WI
1d5a0 4e 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20  NSHM_WRLCK */.  
1d5b0 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
1d5c0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1d5d0 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74 6f  to first byte to
1d5e0 20 62 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63   be locked/unloc
1d5f0 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  ked */.  int nBy
1d600 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  te             /
1d610 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1d620 73 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c  s to lock or unl
1d630 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ock */.){.  int 
1d640 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rc = 0;         
1d650 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
1d660 20 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63   form Lock/Unloc
1d670 6b 46 69 6c 65 45 78 28 29 20 2a 2f 0a 0a 20 20  kFileEx() */..  
1d680 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68 65  /* Access to the
1d690 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65   winShmNode obje
1d6a0 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64  ct is serialized
1d6b0 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a   by the caller *
1d6c0 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
1d6d0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1d6e0 46 69 6c 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20  File->mutex) || 
1d6f0 70 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  pFile->nRef==0 )
1d700 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  ;..  OSTRACE(("S
1d710 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  HM-LOCK file=%p,
1d720 20 6c 6f 63 6b 3d 25 64 2c 20 6f 66 66 73 65 74   lock=%d, offset
1d730 3d 25 64 2c 20 73 69 7a 65 3d 25 64 5c 6e 22 2c  =%d, size=%d\n",
1d740 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
1d750 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 6c 6f 63 6b  e->hFile.h, lock
1d760 54 79 70 65 2c 20 6f 66 73 74 2c 20 6e 42 79 74  Type, ofst, nByt
1d770 65 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61  e));..  /* Relea
1d780 73 65 2f 41 63 71 75 69 72 65 20 74 68 65 20 73  se/Acquire the s
1d790 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b  ystem-level lock
1d7a0 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79   */.  if( lockTy
1d7b0 70 65 3d 3d 57 49 4e 53 48 4d 5f 55 4e 4c 43 4b  pe==WINSHM_UNLCK
1d7c0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   ){.    rc = win
1d7d0 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  UnlockFile(&pFil
1d7e0 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 6f 66 73 74  e->hFile.h, ofst
1d7f0 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a  , 0, nByte, 0);.
1d800 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1d810 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c  Initialize the l
1d820 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72  ocking parameter
1d830 73 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 64  s */.    DWORD d
1d840 77 46 6c 61 67 73 20 3d 20 4c 4f 43 4b 46 49 4c  wFlags = LOCKFIL
1d850 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
1d860 4c 59 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b  LY;.    if( lock
1d870 54 79 70 65 20 3d 3d 20 57 49 4e 53 48 4d 5f 57  Type == WINSHM_W
1d880 52 4c 43 4b 20 29 20 64 77 46 6c 61 67 73 20 7c  RLCK ) dwFlags |
1d890 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55  = LOCKFILE_EXCLU
1d8a0 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72  SIVE_LOCK;.    r
1d8b0 63 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28  c = winLockFile(
1d8c0 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c  &pFile->hFile.h,
1d8d0 20 64 77 46 6c 61 67 73 2c 20 6f 66 73 74 2c 20   dwFlags, ofst, 
1d8e0 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20  0, nByte, 0);.  
1d8f0 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 20 30 20  }..  if( rc!= 0 
1d900 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
1d910 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
1d920 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
1d930 72 72 6e 6f 20 3d 20 20 6f 73 47 65 74 4c 61 73  rrno =  osGetLas
1d940 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 63  tError();.    rc
1d950 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
1d960 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28    }..  OSTRACE((
1d970 22 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25  "SHM-LOCK file=%
1d980 70 2c 20 66 75 6e 63 3d 25 73 2c 20 65 72 72 6e  p, func=%s, errn
1d990 6f 3d 25 6c 75 2c 20 72 63 3d 25 73 5c 6e 22 2c  o=%lu, rc=%s\n",
1d9a0 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
1d9b0 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 28 6c 6f 63  e->hFile.h, (loc
1d9c0 6b 54 79 70 65 20 3d 3d 20 57 49 4e 53 48 4d 5f  kType == WINSHM_
1d9d0 55 4e 4c 43 4b 29 20 3f 20 22 77 69 6e 55 6e 6c  UNLCK) ? "winUnl
1d9e0 6f 63 6b 46 69 6c 65 22 20 3a 0a 20 20 20 20 20  ockFile" :.     
1d9f0 20 20 20 20 20 20 22 77 69 6e 4c 6f 63 6b 46 69        "winLockFi
1da00 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  le", pFile->last
1da10 45 72 72 6e 6f 2c 20 73 71 6c 69 74 65 33 45 72  Errno, sqlite3Er
1da20 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 0a 20 20  rName(rc)));..  
1da30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1da40 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
1da50 63 65 73 20 74 6f 20 56 46 53 20 6d 65 74 68 6f  ces to VFS metho
1da60 64 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ds */.static int
1da70 20 77 69 6e 4f 70 65 6e 28 73 71 6c 69 74 65 33   winOpen(sqlite3
1da80 5f 76 66 73 2a 2c 63 6f 6e 73 74 20 63 68 61 72  _vfs*,const char
1da90 2a 2c 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  *,sqlite3_file*,
1daa0 69 6e 74 2c 69 6e 74 2a 29 3b 0a 73 74 61 74 69  int,int*);.stati
1dab0 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28  c int winDelete(
1dac0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 63 6f  sqlite3_vfs *,co
1dad0 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a  nst char*,int);.
1dae0 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65  ./*.** Purge the
1daf0 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20   winShmNodeList 
1db00 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72  list of all entr
1db10 69 65 73 20 77 69 74 68 20 77 69 6e 53 68 6d 4e  ies with winShmN
1db20 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a  ode.nRef==0..**.
1db30 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
1db40 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f   VFS shared-memo
1db50 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73  ry method; it is
1db60 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74   a utility funct
1db70 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79  ion called.** by
1db80 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f   VFS shared-memo
1db90 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73  ry methods..*/.s
1dba0 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68  tatic void winSh
1dbb0 6d 50 75 72 67 65 28 73 71 6c 69 74 65 33 5f 76  mPurge(sqlite3_v
1dbc0 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 64 65  fs *pVfs, int de
1dbd0 6c 65 74 65 46 6c 61 67 29 7b 0a 20 20 77 69 6e  leteFlag){.  win
1dbe0 53 68 6d 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20 20  ShmNode **pp;.  
1dbf0 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20  winShmNode *p;. 
1dc00 20 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d   assert( winShmM
1dc10 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
1dc20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55  OSTRACE(("SHM-PU
1dc30 52 47 45 20 70 69 64 3d 25 6c 75 2c 20 64 65 6c  RGE pid=%lu, del
1dc40 65 74 65 46 6c 61 67 3d 25 64 5c 6e 22 2c 0a 20  eteFlag=%d\n",. 
1dc50 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1dc60 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1dc70 29 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 29 3b  ), deleteFlag));
1dc80 0a 20 20 70 70 20 3d 20 26 77 69 6e 53 68 6d 4e  .  pp = &winShmN
1dc90 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65  odeList;.  while
1dca0 28 20 28 70 20 3d 20 2a 70 70 29 21 3d 30 20 29  ( (p = *pp)!=0 )
1dcb0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65  {.    if( p->nRe
1dcc0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  f==0 ){.      in
1dcd0 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t i;.      if( p
1dce0 2d 3e 6d 75 74 65 78 20 29 7b 20 73 71 6c 69 74  ->mutex ){ sqlit
1dcf0 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d  e3_mutex_free(p-
1dd00 3e 6d 75 74 65 78 29 3b 20 7d 0a 20 20 20 20 20  >mutex); }.     
1dd10 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
1dd20 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Region; i++){.  
1dd30 20 20 20 20 20 20 42 4f 4f 4c 20 62 52 63 20 3d        BOOL bRc =
1dd40 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69   osUnmapViewOfFi
1dd50 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d  le(p->aRegion[i]
1dd60 2e 70 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20  .pMap);.        
1dd70 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55  OSTRACE(("SHM-PU
1dd80 52 47 45 2d 55 4e 4d 41 50 20 70 69 64 3d 25 6c  RGE-UNMAP pid=%l
1dd90 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20 72 63  u, region=%d, rc
1dda0 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
1ddb0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1ddc0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1ddd0 2c 20 69 2c 20 62 52 63 20 3f 20 22 6f 6b 22 20  , i, bRc ? "ok" 
1dde0 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
1ddf0 20 20 20 20 20 20 55 4e 55 53 45 44 5f 56 41 52        UNUSED_VAR
1de00 49 41 42 4c 45 5f 56 41 4c 55 45 28 62 52 63 29  IABLE_VALUE(bRc)
1de10 3b 0a 20 20 20 20 20 20 20 20 62 52 63 20 3d 20  ;.        bRc = 
1de20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d  osCloseHandle(p-
1de30 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70  >aRegion[i].hMap
1de40 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41  );.        OSTRA
1de50 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45 2d 43  CE(("SHM-PURGE-C
1de60 4c 4f 53 45 20 70 69 64 3d 25 6c 75 2c 20 72 65  LOSE pid=%lu, re
1de70 67 69 6f 6e 3d 25 64 2c 20 72 63 3d 25 73 5c 6e  gion=%d, rc=%s\n
1de80 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1de90 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1dea0 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 20  ProcessId(), i, 
1deb0 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  bRc ? "ok" : "fa
1dec0 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20  iled"));.       
1ded0 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42 4c 45   UNUSED_VARIABLE
1dee0 5f 56 41 4c 55 45 28 62 52 63 29 3b 0a 20 20 20  _VALUE(bRc);.   
1def0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
1df00 2d 3e 68 46 69 6c 65 2e 68 21 3d 4e 55 4c 4c 20  ->hFile.h!=NULL 
1df10 26 26 20 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 49  && p->hFile.h!=I
1df20 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
1df30 4c 55 45 20 29 7b 0a 20 20 20 20 20 20 20 20 53  LUE ){.        S
1df40 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1df50 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20  nign(1);.       
1df60 20 77 69 6e 43 6c 6f 73 65 28 28 73 71 6c 69 74   winClose((sqlit
1df70 65 33 5f 66 69 6c 65 20 2a 29 26 70 2d 3e 68 46  e3_file *)&p->hF
1df80 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 53 69  ile);.        Si
1df90 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1dfa0 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ign(0);.      }.
1dfb0 20 20 20 20 20 20 69 66 28 20 64 65 6c 65 74 65        if( delete
1dfc0 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Flag ){.        
1dfd0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1dfe0 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
1dff0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
1e000 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
1e010 20 20 20 20 20 20 77 69 6e 44 65 6c 65 74 65 28        winDelete(
1e020 70 56 66 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61  pVfs, p->zFilena
1e030 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  me, 0);.        
1e040 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
1e050 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
1e060 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1e070 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
1e080 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20    }.      *pp = 
1e090 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  p->pNext;.      
1e0a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
1e0b0 61 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20  aRegion);.      
1e0c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
1e0d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e0e0 20 20 70 70 20 3d 20 26 70 2d 3e 70 4e 65 78 74    pp = &p->pNext
1e0f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
1e100 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 68  *.** Open the sh
1e110 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61  ared-memory area
1e120 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1e130 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   database file p
1e140 44 62 46 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  DbFd..**.** When
1e150 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73   opening a new s
1e160 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
1e170 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69  e, if no other i
1e180 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74  nstances of that
1e190 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72  .** file are cur
1e1a0 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20  rently open, in 
1e1b0 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20  this process or 
1e1c0 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  in other process
1e1d0 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  es, then.** the 
1e1e0 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75  file must be tru
1e1f0 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c  ncated to zero l
1e200 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69 74  ength or have it
1e210 73 20 68 65 61 64 65 72 20 63 6c 65 61 72 65 64  s header cleared
1e220 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e230 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  winOpenSharedMem
1e240 6f 72 79 28 77 69 6e 46 69 6c 65 20 2a 70 44 62  ory(winFile *pDb
1e250 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20 77 69  Fd){.  struct wi
1e260 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20  nShm *p;        
1e270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1e280 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
1e290 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74  e opened */.  st
1e2a0 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ruct winShmNode 
1e2b0 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 20  *pShmNode = 0;  
1e2c0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
1e2d0 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20  ng mmapped file 
1e2e0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
1e2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e300 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
1e310 74 20 63 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75  t code */.  stru
1e320 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  ct winShmNode *p
1e330 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f  New;           /
1e340 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65  * Newly allocate
1e350 64 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a  d winShmNode */.
1e360 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20    int nName;    
1e370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e380 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1e390 7a 4e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a  zName in bytes *
1e3a0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  /..  assert( pDb
1e3b0 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 20 20  Fd->pShm==0 );  
1e3c0 20 20 2f 2a 20 4e 6f 74 20 70 72 65 76 69 6f 75    /* Not previou
1e3d0 73 6c 79 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20  sly opened */.. 
1e3e0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
1e3f0 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73  ce for the new s
1e400 71 6c 69 74 65 33 5f 73 68 6d 20 6f 62 6a 65 63  qlite3_shm objec
1e410 74 2e 20 20 41 6c 73 6f 20 73 70 65 63 75 6c 61  t.  Also specula
1e420 74 69 76 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f  tively.  ** allo
1e430 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 61  cate space for a
1e440 20 6e 65 77 20 77 69 6e 53 68 6d 4e 6f 64 65 20   new winShmNode 
1e450 61 6e 64 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20  and filename..  
1e460 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  */.  p = sqlite3
1e470 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
1e480 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20  of(*p) );.  if( 
1e490 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
1e4a0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1e4b0 5f 42 4b 50 54 3b 0a 20 20 6e 4e 61 6d 65 20 3d  _BKPT;.  nName =
1e4c0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1e4d0 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a  (pDbFd->zPath);.
1e4e0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
1e4f0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
1e500 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20  of(*pShmNode) + 
1e510 6e 4e 61 6d 65 20 2b 20 31 37 20 29 3b 0a 20 20  nName + 17 );.  
1e520 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
1e530 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1e540 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  p);.    return S
1e550 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
1e560 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 4e  M_BKPT;.  }.  pN
1e570 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  ew->zFilename = 
1e580 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b  (char*)&pNew[1];
1e590 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
1e5a0 6e 74 66 28 6e 4e 61 6d 65 2b 31 35 2c 20 70 4e  ntf(nName+15, pN
1e5b0 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 22  ew->zFilename, "
1e5c0 25 73 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e  %s-shm", pDbFd->
1e5d0 7a 50 61 74 68 29 3b 0a 20 20 73 71 6c 69 74 65  zPath);.  sqlite
1e5e0 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 44 62  3FileSuffix3(pDb
1e5f0 46 64 2d 3e 7a 50 61 74 68 2c 20 70 4e 65 77 2d  Fd->zPath, pNew-
1e600 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 0a 20 20  >zFilename);..  
1e610 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73 65 65 20 69  /* Look to see i
1e620 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 78  f there is an ex
1e630 69 73 74 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64  isting winShmNod
1e640 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  e that can be us
1e650 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f 20 6d  ed..  ** If no m
1e660 61 74 63 68 69 6e 67 20 77 69 6e 53 68 6d 4e 6f  atching winShmNo
1e670 64 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69  de currently exi
1e680 73 74 73 2c 20 63 72 65 61 74 65 20 61 20 6e 65  sts, create a ne
1e690 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 69  w one..  */.  wi
1e6a0 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29  nShmEnterMutex()
1e6b0 3b 0a 20 20 66 6f 72 28 70 53 68 6d 4e 6f 64 65  ;.  for(pShmNode
1e6c0 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73   = winShmNodeLis
1e6d0 74 3b 20 70 53 68 6d 4e 6f 64 65 3b 20 70 53 68  t; pShmNode; pSh
1e6e0 6d 4e 6f 64 65 3d 70 53 68 6d 4e 6f 64 65 2d 3e  mNode=pShmNode->
1e6f0 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54  pNext){.    /* T
1e700 42 44 20 6e 65 65 64 20 74 6f 20 63 6f 6d 65 20  BD need to come 
1e710 75 70 20 77 69 74 68 20 62 65 74 74 65 72 20 6d  up with better m
1e720 61 74 63 68 20 68 65 72 65 2e 20 20 50 65 72 68  atch here.  Perh
1e730 61 70 73 0a 20 20 20 20 2a 2a 20 75 73 65 20 46  aps.    ** use F
1e740 49 4c 45 5f 49 44 5f 42 4f 54 48 5f 44 49 52 5f  ILE_ID_BOTH_DIR_
1e750 49 4e 46 4f 20 53 74 72 75 63 74 75 72 65 2e 0a  INFO Structure..
1e760 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
1e770 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 53  qlite3StrICmp(pS
1e780 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
1e790 65 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61  e, pNew->zFilena
1e7a0 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  me)==0 ) break;.
1e7b0 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f    }.  if( pShmNo
1e7c0 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  de ){.    sqlite
1e7d0 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
1e7e0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 68 6d 4e  }else{.    pShmN
1e7f0 6f 64 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ode = pNew;.    
1e800 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 28 28  pNew = 0;.    ((
1e810 77 69 6e 46 69 6c 65 2a 29 28 26 70 53 68 6d 4e  winFile*)(&pShmN
1e820 6f 64 65 2d 3e 68 46 69 6c 65 29 29 2d 3e 68 20  ode->hFile))->h 
1e830 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  = INVALID_HANDLE
1e840 5f 56 41 4c 55 45 3b 0a 20 20 20 20 70 53 68 6d  _VALUE;.    pShm
1e850 4e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 77 69  Node->pNext = wi
1e860 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20  nShmNodeList;.  
1e870 20 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74    winShmNodeList
1e880 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20   = pShmNode;..  
1e890 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
1e8a0 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
1e8b0 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 70 53  utex ){.      pS
1e8c0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20  hmNode->mutex = 
1e8d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
1e8e0 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
1e8f0 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 69 66  _FAST);.      if
1e900 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  ( pShmNode->mute
1e910 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x==0 ){.        
1e920 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
1e930 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  R_NOMEM_BKPT;.  
1e940 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
1e950 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  pen_err;.      }
1e960 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
1e970 20 77 69 6e 4f 70 65 6e 28 70 44 62 46 64 2d 3e   winOpen(pDbFd->
1e980 70 56 66 73 2c 0a 20 20 20 20 20 20 20 20 20 20  pVfs,.          
1e990 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
1e9a0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20  >zFilename,     
1e9b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1e9c0 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55 54 46  of the file (UTF
1e9d0 2d 38 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  -8) */.         
1e9e0 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
1e9f0 5f 66 69 6c 65 2a 29 26 70 53 68 6d 4e 6f 64 65  _file*)&pShmNode
1ea00 2d 3e 68 46 69 6c 65 2c 20 20 2f 2a 20 46 69 6c  ->hFile,  /* Fil
1ea10 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f  e handle here */
1ea20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ea30 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41    SQLITE_OPEN_WA
1ea40 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  L | SQLITE_OPEN_
1ea50 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
1ea60 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 0a  TE_OPEN_CREATE,.
1ea70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea80 20 30 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c   0);.    if( SQL
1ea90 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
1eaa0 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
1eab0 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  n_err;.    }..  
1eac0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
1ead0 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f  e if another pro
1eae0 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
1eaf0 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69  the dead-man swi
1eb00 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e  tch..    ** If n
1eb10 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  ot, truncate the
1eb20 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65   file to zero le
1eb30 6e 67 74 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ngth..    */.   
1eb40 20 69 66 28 20 77 69 6e 53 68 6d 53 79 73 74 65   if( winShmSyste
1eb50 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
1eb60 57 49 4e 53 48 4d 5f 57 52 4c 43 4b 2c 20 57 49  WINSHM_WRLCK, WI
1eb70 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53  N_SHM_DMS, 1)==S
1eb80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1eb90 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61    rc = winTrunca
1eba0 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  te((sqlite3_file
1ebb0 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46   *)&pShmNode->hF
1ebc0 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ile, 0);.      i
1ebd0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ebe0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1ebf0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
1ec00 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45  ITE_IOERR_SHMOPE
1ec10 4e 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  N, osGetLastErro
1ec20 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
1ec30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
1ec40 69 6e 4f 70 65 6e 53 68 6d 22 2c 20 70 44 62 46  inOpenShm", pDbF
1ec50 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
1ec60 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1ec70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1ec80 7b 0a 20 20 20 20 20 20 77 69 6e 53 68 6d 53 79  {.      winShmSy
1ec90 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
1eca0 65 2c 20 57 49 4e 53 48 4d 5f 55 4e 4c 43 4b 2c  e, WINSHM_UNLCK,
1ecb0 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29   WIN_SHM_DMS, 1)
1ecc0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  ;.      rc = win
1ecd0 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
1ece0 68 6d 4e 6f 64 65 2c 20 57 49 4e 53 48 4d 5f 52  hmNode, WINSHM_R
1ecf0 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d  DLCK, WIN_SHM_DM
1ed00 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  S, 1);.    }.   
1ed10 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
1ed20 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d  hm_open_err;.  }
1ed30 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20  ..  /* Make the 
1ed40 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  new connection a
1ed50 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 77 69   child of the wi
1ed60 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d  nShmNode */.  p-
1ed70 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d  >pShmNode = pShm
1ed80 4e 6f 64 65 3b 0a 23 69 66 20 64 65 66 69 6e 65  Node;.#if define
1ed90 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
1eda0 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
1edb0 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45 29  E_HAVE_OS_TRACE)
1edc0 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e  .  p->id = pShmN
1edd0 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b  ode->nextShmId++
1ede0 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e  ;.#endif.  pShmN
1edf0 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70  ode->nRef++;.  p
1ee00 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a  DbFd->pShm = p;.
1ee10 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74    winShmLeaveMut
1ee20 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ex();..  /* The 
1ee30 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
1ee40 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20  on pShmNode has 
1ee50 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63  already been inc
1ee60 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20  remented under. 
1ee70 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66   ** the cover of
1ee80 20 74 68 65 20 77 69 6e 53 68 6d 45 6e 74 65 72   the winShmEnter
1ee90 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e  Mutex() mutex an
1eea0 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72  d the pointer fr
1eeb0 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20  om the.  ** new 
1eec0 28 73 74 72 75 63 74 20 77 69 6e 53 68 6d 29 20  (struct winShm) 
1eed0 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53  object to the pS
1eee0 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20  hmNode has been 
1eef0 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73  set. All that is
1ef00 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f  .  ** left to do
1ef10 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20   is to link the 
1ef20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20  new object into 
1ef30 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
1ef40 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74  starting.  ** at
1ef50 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
1ef60 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20  t. This must be 
1ef70 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69  done while holdi
1ef80 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d  ng the pShmNode-
1ef90 3e 6d 75 74 65 78 0a 20 20 2a 2a 20 6d 75 74 65  >mutex.  ** mute
1efa0 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  x..  */.  sqlite
1efb0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
1efc0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
1efd0 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68    p->pNext = pSh
1efe0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20  mNode->pFirst;. 
1eff0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
1f000 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33  t = p;.  sqlite3
1f010 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
1f020 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
1f030 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f040 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  K;..  /* Jump he
1f050 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20  re on any error 
1f060 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a  */.shm_open_err:
1f070 0a 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c  .  winShmSystemL
1f080 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 57 49  ock(pShmNode, WI
1f090 4e 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f  NSHM_UNLCK, WIN_
1f0a0 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 77  SHM_DMS, 1);.  w
1f0b0 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46 64  inShmPurge(pDbFd
1f0c0 2d 3e 70 56 66 73 2c 20 30 29 3b 20 20 20 20 20  ->pVfs, 0);     
1f0d0 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72   /* This call fr
1f0e0 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20  ees pShmNode if 
1f0f0 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71  required */.  sq
1f100 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
1f110 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
1f120 65 77 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61  ew);.  winShmLea
1f130 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
1f140 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1f150 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74   Close a connect
1f160 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65  ion to shared-me
1f170 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68  mory.  Delete th
1f180 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20  e underlying.** 
1f190 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74  storage if delet
1f1a0 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a  eFlag is true..*
1f1b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1f1c0 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69  ShmUnmap(.  sqli
1f1d0 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
1f1e0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1f1f0 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65  se holding share
1f200 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  d memory */.  in
1f210 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20  t deleteFlag    
1f220 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65           /* Dele
1f230 74 65 20 61 66 74 65 72 20 63 6c 6f 73 69 6e 67  te after closing
1f240 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
1f250 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 3b   winFile *pDbFd;
1f260 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1f270 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65  se holding share
1f280 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69  d-memory */.  wi
1f290 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20  nShm *p;        
1f2a0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65      /* The conne
1f2b0 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73  ction to be clos
1f2c0 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f  ed */.  winShmNo
1f2d0 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a  de *pShmNode; /*
1f2e0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
1f2f0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
1f300 6c 65 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  le */.  winShm *
1f310 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  *pp;          /*
1f320 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
1f330 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  r sibling connec
1f340 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 70 44 62 46  tions */..  pDbF
1f350 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
1f360 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70  ;.  p = pDbFd->p
1f370 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  Shm;.  if( p==0 
1f380 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1f390 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d  OK;.  pShmNode =
1f3a0 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20   p->pShmNode;.. 
1f3b0 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65   /* Remove conne
1f3c0 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65  ction p from the
1f3d0 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69   set of connecti
1f3e0 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20  ons associated. 
1f3f0 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64   ** with pShmNod
1f400 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  e */.  sqlite3_m
1f410 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
1f420 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66  ode->mutex);.  f
1f430 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d  or(pp=&pShmNode-
1f440 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d  >pFirst; (*pp)!=
1f450 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e  p; pp = &(*pp)->
1f460 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d  pNext){}.  *pp =
1f470 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a   p->pNext;..  /*
1f480 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63   Free the connec
1f490 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69  tion p */.  sqli
1f4a0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70  te3_free(p);.  p
1f4b0 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a  DbFd->pShm = 0;.
1f4c0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1f4d0 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
1f4e0 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66  mutex);..  /* If
1f4f0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20   pShmNode->nRef 
1f500 68 61 73 20 72 65 61 63 68 65 64 20 30 2c 20 74  has reached 0, t
1f510 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e  hen close the un
1f520 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68  derlying.  ** sh
1f530 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
1f540 2c 20 74 6f 6f 20 2a 2f 0a 20 20 77 69 6e 53 68  , too */.  winSh
1f550 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  mEnterMutex();. 
1f560 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
1f570 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70  e->nRef>0 );.  p
1f580 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b  ShmNode->nRef--;
1f590 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
1f5a0 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
1f5b0 77 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46  winShmPurge(pDbF
1f5c0 64 2d 3e 70 56 66 73 2c 20 64 65 6c 65 74 65 46  d->pVfs, deleteF
1f5d0 6c 61 67 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 53  lag);.  }.  winS
1f5e0 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  hmLeaveMutex();.
1f5f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1f600 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
1f610 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74  ange the lock st
1f620 61 74 65 20 66 6f 72 20 61 20 73 68 61 72 65 64  ate for a shared
1f630 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e  -memory segment.
1f640 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1f650 69 6e 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c  inShmLock(.  sql
1f660 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
1f670 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1f680 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67  ase file holding
1f690 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
1f6a0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74  ry */.  int ofst
1f6b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f6c0 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b     /* First lock
1f6d0 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72   to acquire or r
1f6e0 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
1f6f0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
1f700 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1f710 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71   of locks to acq
1f720 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20  uire or release 
1f730 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
1f740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f750 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
1f760 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29  th the lock */.)
1f770 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62  {.  winFile *pDb
1f780 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66  Fd = (winFile*)f
1f790 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  d;        /* Con
1f7a0 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20  nection holding 
1f7b0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
1f7c0 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70  .  winShm *p = p
1f7d0 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20  DbFd->pShm;     
1f7e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1f7f0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65  shared memory be
1f800 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20  ing locked */.  
1f810 77 69 6e 53 68 6d 20 2a 70 58 3b 20 20 20 20 20  winShm *pX;     
1f820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f830 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
1f840 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69  ping over all si
1f850 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 77 69 6e 53  blings */.  winS
1f860 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
1f870 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a   = p->pShmNode;.
1f880 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1f890 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
1f8a0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
1f8b0 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20  t code */.  u16 
1f8c0 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  mask;           
1f8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8e0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63    /* Mask of loc
1f8f0 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65  ks to take or re
1f900 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65  lease */..  asse
1f910 72 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f  rt( ofst>=0 && o
1f920 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48  fst+n<=SQLITE_SH
1f930 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  M_NLOCK );.  ass
1f940 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61  ert( n>=1 );.  a
1f950 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53  ssert( flags==(S
1f960 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c  QLITE_SHM_LOCK |
1f970 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
1f980 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  ED).       || fl
1f990 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
1f9a0 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  _LOCK | SQLITE_S
1f9b0 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20  HM_EXCLUSIVE).  
1f9c0 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
1f9d0 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
1f9e0 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53  K | SQLITE_SHM_S
1f9f0 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c  HARED).       ||
1fa00 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
1fa10 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c  SHM_UNLOCK | SQL
1fa20 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
1fa30 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  E) );.  assert( 
1fa40 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26  n==1 || (flags &
1fa50 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
1fa60 55 53 49 56 45 29 21 3d 30 20 29 3b 0a 0a 20 20  USIVE)!=0 );..  
1fa70 6d 61 73 6b 20 3d 20 28 75 31 36 29 28 28 31 55  mask = (u16)((1U
1fa80 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31  <<(ofst+n)) - (1
1fa90 55 3c 3c 6f 66 73 74 29 29 3b 0a 20 20 61 73 73  U<<ofst));.  ass
1faa0 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b  ert( n>1 || mask
1fab0 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20  ==(1<<ofst) );. 
1fac0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1fad0 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
1fae0 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61  utex);.  if( fla
1faf0 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
1fb00 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31  UNLOCK ){.    u1
1fb10 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f  6 allMask = 0; /
1fb20 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20  * Mask of locks 
1fb30 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73  held by siblings
1fb40 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20   */..    /* See 
1fb50 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20  if any siblings 
1fb60 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c  hold this same l
1fb70 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70  ock */.    for(p
1fb80 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
1fb90 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
1fba0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
1fbb0 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75   pX==p ) continu
1fbc0 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
1fbd0 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
1fbe0 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d   (p->exclMask|p-
1fbf0 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30  >sharedMask))==0
1fc00 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73   );.      allMas
1fc10 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d  k |= pX->sharedM
1fc20 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ask;.    }..    
1fc30 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79  /* Unlock the sy
1fc40 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73  stem-level locks
1fc50 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73   */.    if( (mas
1fc60 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20  k & allMask)==0 
1fc70 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  ){.      rc = wi
1fc80 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
1fc90 53 68 6d 4e 6f 64 65 2c 20 57 49 4e 53 48 4d 5f  ShmNode, WINSHM_
1fca0 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f  UNLCK, ofst+WIN_
1fcb0 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20  SHM_BASE, n);.  
1fcc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1fcd0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1fce0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64     }..    /* Und
1fcf0 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b  o the local lock
1fd00 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  s */.    if( rc=
1fd10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1fd20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20      p->exclMask 
1fd30 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  &= ~mask;.      
1fd40 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d  p->sharedMask &=
1fd50 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20   ~mask;.    }.  
1fd60 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
1fd70 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  & SQLITE_SHM_SHA
1fd80 52 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61  RED ){.    u16 a
1fd90 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f  llShared = 0;  /
1fda0 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73  * Union of locks
1fdb0 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
1fdc0 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20  ions other than 
1fdd0 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46  "p" */..    /* F
1fde0 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73 68  ind out which sh
1fdf0 61 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61  ared locks are a
1fe00 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79 20 73  lready held by s
1fe10 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
1fe20 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e  ns..    ** If an
1fe30 79 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64  y sibling alread
1fe40 79 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75  y holds an exclu
1fe50 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68  sive lock, go ah
1fe60 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  ead and return. 
1fe70 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53     ** SQLITE_BUS
1fe80 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  Y..    */.    fo
1fe90 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  r(pX=pShmNode->p
1fea0 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
1feb0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
1fec0 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  if( (pX->exclMas
1fed0 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a  k & mask)!=0 ){.
1fee0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1fef0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
1ff00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1ff10 0a 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64  .      allShared
1ff20 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
1ff30 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  sk;.    }..    /
1ff40 2a 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63  * Get shared loc
1ff50 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d  ks at the system
1ff60 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73   level, if neces
1ff70 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20  sary */.    if( 
1ff80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ff90 0a 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53  .      if( (allS
1ffa0 68 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30  hared & mask)==0
1ffb0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1ffc0 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
1ffd0 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 57 49 4e 53  k(pShmNode, WINS
1ffe0 48 4d 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 57  HM_RDLCK, ofst+W
1fff0 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IN_SHM_BASE, n);
20000 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
20010 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
20020 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
20030 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
20040 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64  the local shared
20050 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
20060 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20070 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  ){.      p->shar
20080 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  edMask |= mask;.
20090 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
200a0 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
200b0 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  no sibling conne
200c0 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b  ctions hold lock
200d0 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63  s that will bloc
200e0 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f  k this.    ** lo
200f0 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20  ck.  If any do, 
20100 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
20110 53 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20  SY right away.. 
20120 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58     */.    for(pX
20130 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  =pShmNode->pFirs
20140 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  t; pX; pX=pX->pN
20150 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
20160 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
20170 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d  mask)!=0 || (pX-
20180 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61  >sharedMask & ma
20190 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
201a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
201b0 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  SY;.        brea
201c0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
201d0 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65  ..    /* Get the
201e0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
201f0 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
20200 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73  evel.  Then if s
20210 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a  uccessful.    **
20220 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c   also mark the l
20230 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ocal connection 
20240 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e  as being locked.
20250 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
20260 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
20270 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53  .      rc = winS
20280 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
20290 6d 4e 6f 64 65 2c 20 57 49 4e 53 48 4d 5f 57 52  mNode, WINSHM_WR
202a0 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48  LCK, ofst+WIN_SH
202b0 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
202c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
202d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _OK ){.        a
202e0 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65  ssert( (p->share
202f0 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30  dMask & mask)==0
20300 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65   );.        p->e
20310 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  xclMask |= mask;
20320 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20330 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
20340 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
20350 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54  e->mutex);.  OST
20360 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
20370 70 69 64 3d 25 6c 75 2c 20 69 64 3d 25 64 2c 20  pid=%lu, id=%d, 
20380 73 68 61 72 65 64 4d 61 73 6b 3d 25 30 33 78 2c  sharedMask=%03x,
20390 20 65 78 63 6c 4d 61 73 6b 3d 25 30 33 78 2c 20   exclMask=%03x, 
203a0 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
203b0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
203c0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 2d  tProcessId(), p-
203d0 3e 69 64 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61  >id, p->sharedMa
203e0 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 2c  sk, p->exclMask,
203f0 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  .           sqli
20400 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
20410 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
20420 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
20430 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69  t a memory barri
20440 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e  er or memory fen
20450 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d  ce on shared mem
20460 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c  ory..**.** All l
20470 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20  oads and stores 
20480 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65  begun before the
20490 20 62 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f   barrier must co
204a0 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a  mplete before.**
204b0 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f   any load or sto
204c0 72 65 20 62 65 67 75 6e 20 61 66 74 65 72 20 74  re begun after t
204d0 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73  he barrier..*/.s
204e0 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68  tatic void winSh
204f0 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69  mBarrier(.  sqli
20500 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20  te3_file *fd    
20510 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
20520 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68  e holding the sh
20530 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29  ared memory */.)
20540 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
20550 45 54 45 52 28 66 64 29 3b 0a 20 20 73 71 6c 69  ETER(fd);.  sqli
20560 74 65 33 4d 65 6d 6f 72 79 42 61 72 72 69 65 72  te3MemoryBarrier
20570 28 29 3b 20 20 20 2f 2a 20 63 6f 6d 70 69 6c 65  ();   /* compile
20580 72 2d 64 65 66 69 6e 65 64 20 6d 65 6d 6f 72 79  r-defined memory
20590 20 62 61 72 72 69 65 72 20 2a 2f 0a 20 20 77 69   barrier */.  wi
205a0 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29  nShmEnterMutex()
205b0 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20  ;       /* Also 
205c0 6d 75 74 65 78 2c 20 66 6f 72 20 72 65 64 75 6e  mutex, for redun
205d0 64 61 6e 63 79 20 2a 2f 0a 20 20 77 69 6e 53 68  dancy */.  winSh
205e0 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d  mLeaveMutex();.}
205f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
20600 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
20610 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e  to obtain a poin
20620 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52  ter to region iR
20630 65 67 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  egion of the.** 
20640 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73  shared-memory as
20650 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
20660 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
20670 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72  fd. Shared-memor
20680 79 20 72 65 67 69 6f 6e 73 0a 2a 2a 20 61 72 65  y regions.** are
20690 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69   numbered starti
206a0 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61  ng from zero. Ea
206b0 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ch shared-memory
206c0 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67   region is szReg
206d0 69 6f 6e 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20  ion.** bytes in 
206e0 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  size..**.** If a
206f0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
20700 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
20710 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
20720 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  p is set to NULL
20730 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
20740 65 2c 20 69 66 20 74 68 65 20 69 73 57 72 69 74  e, if the isWrit
20750 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  e parameter is 0
20760 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
20770 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ed shared-memory
20780 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e  .** region has n
20790 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ot been allocate
207a0 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74  d (by any client
207b0 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20  , including one 
207c0 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20  running in a.** 
207d0 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73  separate process
207e0 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73  ), then *pp is s
207f0 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53  et to NULL and S
20800 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
20810 64 2e 20 49 66 0a 2a 2a 20 69 73 57 72 69 74 65  d. If.** isWrite
20820 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64   is non-zero and
20830 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
20840 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
20850 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 0a  ion has not yet.
20860 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ** been allocate
20870 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74  d, it is allocat
20880 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
20890 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ion..**.** If th
208a0 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
208b0 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  region has alrea
208c0 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
208d0 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  d or is allocate
208e0 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c  d by.** this cal
208f0 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61  l as described a
20900 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73  bove, then it is
20910 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69   mapped into thi
20920 73 20 70 72 6f 63 65 73 73 65 73 0a 2a 2a 20 61  s processes.** a
20930 64 64 72 65 73 73 20 73 70 61 63 65 20 28 69 66  ddress space (if
20940 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
20950 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20  dy), *pp is set 
20960 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
20970 6d 61 70 70 65 64 0a 2a 2a 20 6d 65 6d 6f 72 79  mapped.** memory
20980 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
20990 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
209a0 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 61 70  ic int winShmMap
209b0 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
209c0 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20   *fd,           
209d0 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70      /* Handle op
209e0 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66  en on database f
209f0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ile */.  int iRe
20a00 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
20a10 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
20a20 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a  on to retrieve *
20a30 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e  /.  int szRegion
20a40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20a50 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72      /* Size of r
20a60 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  egions */.  int 
20a70 69 73 57 72 69 74 65 2c 20 20 20 20 20 20 20 20  isWrite,        
20a80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
20a90 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69  rue to extend fi
20aa0 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  le if necessary 
20ab0 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69  */.  void volati
20ac0 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20  le **pp         
20ad0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70       /* OUT: Map
20ae0 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b  ped memory */.){
20af0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46  .  winFile *pDbF
20b00 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
20b10 3b 0a 20 20 77 69 6e 53 68 6d 20 2a 70 53 68 6d  ;.  winShm *pShm
20b20 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
20b30 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53    winShmNode *pS
20b40 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63  hmNode;.  int rc
20b50 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
20b60 20 69 66 28 20 21 70 53 68 6d 20 29 7b 0a 20 20   if( !pShm ){.  
20b70 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 53 68    rc = winOpenSh
20b80 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64  aredMemory(pDbFd
20b90 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
20ba0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
20bb0 6e 20 72 63 3b 0a 20 20 20 20 70 53 68 6d 20 3d  n rc;.    pShm =
20bc0 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
20bd0 7d 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  }.  pShmNode = p
20be0 53 68 6d 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a  Shm->pShmNode;..
20bf0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
20c00 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
20c10 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
20c20 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d  ( szRegion==pShm
20c30 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c  Node->szRegion |
20c40 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  | pShmNode->nReg
20c50 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  ion==0 );..  if(
20c60 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
20c70 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20  on<=iRegion ){. 
20c80 20 20 20 73 74 72 75 63 74 20 53 68 6d 52 65 67     struct ShmReg
20c90 69 6f 6e 20 2a 61 70 4e 65 77 3b 20 20 20 20 20  ion *apNew;     
20ca0 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61 52 65        /* New aRe
20cb0 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  gion[] array */.
20cc0 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
20cd0 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65  (iRegion+1)*szRe
20ce0 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  gion;  /* Minimu
20cf0 6d 20 72 65 71 75 69 72 65 64 20 66 69 6c 65 20  m required file 
20d00 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69  size */.    sqli
20d10 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 20 20 20  te3_int64 sz;   
20d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20d30 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  * Current size o
20d40 66 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65  f wal-index file
20d50 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64   */..    pShmNod
20d60 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a  e->szRegion = sz
20d70 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20  Region;..    /* 
20d80 54 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  The requested re
20d90 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70  gion is not mapp
20da0 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  ed into this pro
20db0 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73  cesses address s
20dc0 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 43 68 65  pace..    ** Che
20dd0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  ck to see if it 
20de0 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
20df0 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20  ed (i.e. if the 
20e00 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69  wal-index file i
20e10 73 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65  s.    ** large e
20e20 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e  nough to contain
20e30 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72   the requested r
20e40 65 67 69 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20  egion)..    */. 
20e50 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53     rc = winFileS
20e60 69 7a 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ize((sqlite3_fil
20e70 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  e *)&pShmNode->h
20e80 46 69 6c 65 2c 20 26 73 7a 29 3b 0a 20 20 20 20  File, &sz);.    
20e90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
20ea0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
20eb0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
20ec0 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
20ed0 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
20ee0 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
20ef0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53             "winS
20f00 68 6d 4d 61 70 31 22 2c 20 70 44 62 46 64 2d 3e  hmMap1", pDbFd->
20f10 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 67 6f  zPath);.      go
20f20 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
20f30 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73      }..    if( s
20f40 7a 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  z<nByte ){.     
20f50 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
20f60 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d memory region 
20f70 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20  does not exist. 
20f80 49 66 20 69 73 57 72 69 74 65 20 69 73 20 73 65  If isWrite is se
20f90 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 7a 65  t to.      ** ze
20fa0 72 6f 2c 20 65 78 69 74 20 65 61 72 6c 79 2e 20  ro, exit early. 
20fb0 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65 74 20  *pp will be set 
20fc0 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49  to NULL and SQLI
20fd0 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
20fe0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
20ff0 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c  * Alternatively,
21000 20 69 66 20 69 73 57 72 69 74 65 20 69 73 20 6e   if isWrite is n
21010 6f 6e 2d 7a 65 72 6f 2c 20 75 73 65 20 66 74 72  on-zero, use ftr
21020 75 6e 63 61 74 65 28 29 20 74 6f 20 61 6c 6c 6f  uncate() to allo
21030 63 61 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  cate.      ** th
21040 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f  e requested memo
21050 72 79 20 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20  ry region..     
21060 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69   */.      if( !i
21070 73 57 72 69 74 65 20 29 20 67 6f 74 6f 20 73 68  sWrite ) goto sh
21080 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
21090 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74   rc = winTruncat
210a0 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  e((sqlite3_file 
210b0 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  *)&pShmNode->hFi
210c0 6c 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  le, nByte);.    
210d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
210e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
210f0 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
21100 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
21110 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73 74 45  SIZE, osGetLastE
21120 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
21130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21140 20 22 77 69 6e 53 68 6d 4d 61 70 32 22 2c 20 70   "winShmMap2", p
21150 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
21160 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
21170 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  ge_out;.      }.
21180 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
21190 70 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  p the requested 
211a0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e  memory region in
211b0 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
211c0 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e  s address space.
211d0 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20   */.    apNew = 
211e0 28 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f  (struct ShmRegio
211f0 6e 20 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c  n *)sqlite3_real
21200 6c 6f 63 36 34 28 0a 20 20 20 20 20 20 20 20 70  loc64(.        p
21210 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e  ShmNode->aRegion
21220 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 69  , (iRegion+1)*si
21230 7a 65 6f 66 28 61 70 4e 65 77 5b 30 5d 29 0a 20  zeof(apNew[0]). 
21240 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61     );.    if( !a
21250 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63  pNew ){.      rc
21260 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
21270 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
21280 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
21290 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  ut;.    }.    pS
212a0 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 20  hmNode->aRegion 
212b0 3d 20 61 70 4e 65 77 3b 0a 0a 20 20 20 20 77 68  = apNew;..    wh
212c0 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  ile( pShmNode->n
212d0 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20  Region<=iRegion 
212e0 29 7b 0a 20 20 20 20 20 20 48 41 4e 44 4c 45 20  ){.      HANDLE 
212f0 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 20 20 20 20  hMap = NULL;    
21300 20 20 20 20 20 2f 2a 20 66 69 6c 65 2d 6d 61 70       /* file-map
21310 70 69 6e 67 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  ping handle */. 
21320 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 20       void *pMap 
21330 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
21340 20 2f 2a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72   /* Mapped memor
21350 79 20 72 65 67 69 6f 6e 20 2a 2f 0a 0a 23 69 66  y region */..#if
21360 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
21370 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73  .      hMap = os
21380 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
21390 67 46 72 6f 6d 41 70 70 28 70 53 68 6d 4e 6f 64  gFromApp(pShmNod
213a0 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20  e->hFile.h,.    
213b0 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45        NULL, PAGE
213c0 5f 52 45 41 44 57 52 49 54 45 2c 20 6e 42 79 74  _READWRITE, nByt
213d0 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b  e, NULL.      );
213e0 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
213f0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
21400 57 49 44 45 29 0a 20 20 20 20 20 20 68 4d 61 70  WIDE).      hMap
21410 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d   = osCreateFileM
21420 61 70 70 69 6e 67 57 28 70 53 68 6d 4e 6f 64 65  appingW(pShmNode
21430 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20  ->hFile.h,.     
21440 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f       NULL, PAGE_
21450 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20 6e 42  READWRITE, 0, nB
21460 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20  yte, NULL.      
21470 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  );.#elif defined
21480 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
21490 53 5f 41 4e 53 49 29 20 26 26 20 53 51 4c 49 54  S_ANSI) && SQLIT
214a0 45 5f 57 49 4e 33 32 5f 43 52 45 41 54 45 46 49  E_WIN32_CREATEFI
214b0 4c 45 4d 41 50 50 49 4e 47 41 0a 20 20 20 20 20  LEMAPPINGA.     
214c0 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65   hMap = osCreate
214d0 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 70 53 68  FileMappingA(pSh
214e0 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a  mNode->hFile.h,.
214f0 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20            NULL, 
21500 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20  PAGE_READWRITE, 
21510 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20  0, nByte, NULL. 
21520 20 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20       );.#endif. 
21530 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53       OSTRACE(("S
21540 48 4d 2d 4d 41 50 2d 43 52 45 41 54 45 20 70 69  HM-MAP-CREATE pi
21550 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64  d=%lu, region=%d
21560 2c 20 73 69 7a 65 3d 25 64 2c 20 72 63 3d 25 73  , size=%d, rc=%s
21570 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
21580 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
21590 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68  ProcessId(), pSh
215a0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20  mNode->nRegion, 
215b0 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20  nByte,.         
215c0 20 20 20 20 20 20 68 4d 61 70 20 3f 20 22 6f 6b        hMap ? "ok
215d0 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
215e0 20 20 20 20 20 20 69 66 28 20 68 4d 61 70 20 29        if( hMap )
215f0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f  {.        int iO
21600 66 66 73 65 74 20 3d 20 70 53 68 6d 4e 6f 64 65  ffset = pShmNode
21610 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69  ->nRegion*szRegi
21620 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  on;.        int 
21630 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20 69  iOffsetShift = i
21640 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79 73 49  Offset % winSysI
21650 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e  nfo.dwAllocation
21660 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 23 69 66  Granularity;.#if
21670 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
21680 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d 20  .        pMap = 
21690 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46  osMapViewOfFileF
216a0 72 6f 6d 41 70 70 28 68 4d 61 70 2c 20 46 49 4c  romApp(hMap, FIL
216b0 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20 46 49  E_MAP_WRITE | FI
216c0 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20  LE_MAP_READ,.   
216d0 20 20 20 20 20 20 20 20 20 69 4f 66 66 73 65 74           iOffset
216e0 20 2d 20 69 4f 66 66 73 65 74 53 68 69 66 74 2c   - iOffsetShift,
216f0 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66   szRegion + iOff
21700 73 65 74 53 68 69 66 74 0a 20 20 20 20 20 20 20  setShift.       
21710 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   );.#else.      
21720 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69    pMap = osMapVi
21730 65 77 4f 66 46 69 6c 65 28 68 4d 61 70 2c 20 46  ewOfFile(hMap, F
21740 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20  ILE_MAP_WRITE | 
21750 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20  FILE_MAP_READ,. 
21760 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 69 4f             0, iO
21770 66 66 73 65 74 20 2d 20 69 4f 66 66 73 65 74 53  ffset - iOffsetS
21780 68 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b  hift, szRegion +
21790 20 69 4f 66 66 73 65 74 53 68 69 66 74 0a 20 20   iOffsetShift.  
217a0 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a        );.#endif.
217b0 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
217c0 28 22 53 48 4d 2d 4d 41 50 2d 4d 41 50 20 70 69  ("SHM-MAP-MAP pi
217d0 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64  d=%lu, region=%d
217e0 2c 20 6f 66 66 73 65 74 3d 25 64 2c 20 73 69 7a  , offset=%d, siz
217f0 65 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  e=%d, rc=%s\n",.
21800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21810 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
21820 63 65 73 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f  cessId(), pShmNo
21830 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 69 4f 66  de->nRegion, iOf
21840 66 73 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20  fset,.          
21850 20 20 20 20 20 20 20 73 7a 52 65 67 69 6f 6e 2c         szRegion,
21860 20 70 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22   pMap ? "ok" : "
21870 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20  failed"));.     
21880 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 4d   }.      if( !pM
21890 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53  ap ){.        pS
218a0 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e  hmNode->lastErrn
218b0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
218c0 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 72 63  or();.        rc
218d0 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
218e0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d  QLITE_IOERR_SHMM
218f0 41 50 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61  AP, pShmNode->la
21900 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
21910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21920 20 20 22 77 69 6e 53 68 6d 4d 61 70 33 22 2c 20    "winShmMap3", 
21930 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
21940 20 20 20 20 20 20 20 69 66 28 20 68 4d 61 70 20         if( hMap 
21950 29 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28  ) osCloseHandle(
21960 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 67  hMap);.        g
21970 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
21980 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
21990 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f  pShmNode->aRegio
219a0 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  n[pShmNode->nReg
219b0 69 6f 6e 5d 2e 70 4d 61 70 20 3d 20 70 4d 61 70  ion].pMap = pMap
219c0 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
219d0 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f  ->aRegion[pShmNo
219e0 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 68 4d 61  de->nRegion].hMa
219f0 70 20 3d 20 68 4d 61 70 3b 0a 20 20 20 20 20 20  p = hMap;.      
21a00 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
21a10 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n++;.    }.  }..
21a20 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69  shmpage_out:.  i
21a30 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
21a40 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a  gion>iRegion ){.
21a50 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20      int iOffset 
21a60 3d 20 69 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69  = iRegion*szRegi
21a70 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66  on;.    int iOff
21a80 73 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66 73  setShift = iOffs
21a90 65 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e  et % winSysInfo.
21aa0 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e  dwAllocationGran
21ab0 75 6c 61 72 69 74 79 3b 0a 20 20 20 20 63 68 61  ularity;.    cha
21ac0 72 20 2a 70 20 3d 20 28 63 68 61 72 20 2a 29 70  r *p = (char *)p
21ad0 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e  ShmNode->aRegion
21ae0 5b 69 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 3b 0a  [iRegion].pMap;.
21af0 20 20 20 20 2a 70 70 20 3d 20 28 76 6f 69 64 20      *pp = (void 
21b00 2a 29 26 70 5b 69 4f 66 66 73 65 74 53 68 69 66  *)&p[iOffsetShif
21b10 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t];.  }else{.   
21b20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   *pp = 0;.  }.  
21b30 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
21b40 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
21b50 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
21b60 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 20 64 65  c;.}..#else.# de
21b70 66 69 6e 65 20 77 69 6e 53 68 6d 4d 61 70 20 20  fine winShmMap  
21b80 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69     0.# define wi
21b90 6e 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20  nShmLock    0.# 
21ba0 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 42 61 72  define winShmBar
21bb0 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20  rier 0.# define 
21bc0 77 69 6e 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a  winShmUnmap   0.
21bd0 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
21be0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
21bf0 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  L */../*.** Clea
21c00 6e 73 20 75 70 20 74 68 65 20 6d 61 70 70 65 64  ns up the mapped
21c10 20 72 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 73   region of the s
21c20 70 65 63 69 66 69 65 64 20 66 69 6c 65 2c 20 69  pecified file, i
21c30 66 20 61 6e 79 2e 0a 2a 2f 0a 23 69 66 20 53 51  f any..*/.#if SQ
21c40 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
21c50 5a 45 3e 30 0a 73 74 61 74 69 63 20 69 6e 74 20  ZE>0.static int 
21c60 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 77 69 6e  winUnmapfile(win
21c70 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
21c80 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30  assert( pFile!=0
21c90 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
21ca0 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25  UNMAP-FILE pid=%
21cb0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 68 4d  lu, pFile=%p, hM
21cc0 61 70 3d 25 70 2c 20 70 4d 61 70 52 65 67 69 6f  ap=%p, pMapRegio
21cd0 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20 20 20 20  n=%p, ".        
21ce0 20 20 20 22 6d 6d 61 70 53 69 7a 65 3d 25 6c 6c     "mmapSize=%ll
21cf0 64 2c 20 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  d, mmapSizeActua
21d00 6c 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a 65  l=%lld, mmapSize
21d10 4d 61 78 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20 20  Max=%lld\n",.   
21d20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
21d30 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
21d40 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
21d50 4d 61 70 2c 20 70 46 69 6c 65 2d 3e 70 4d 61 70  Map, pFile->pMap
21d60 52 65 67 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20  Region,.        
21d70 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69     pFile->mmapSi
21d80 7a 65 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  ze, pFile->mmapS
21d90 69 7a 65 41 63 74 75 61 6c 2c 20 70 46 69 6c 65  izeActual, pFile
21da0 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 29 29 3b  ->mmapSizeMax));
21db0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d  .  if( pFile->pM
21dc0 61 70 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  apRegion ){.    
21dd0 69 66 28 20 21 6f 73 55 6e 6d 61 70 56 69 65 77  if( !osUnmapView
21de0 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 70 4d  OfFile(pFile->pM
21df0 61 70 52 65 67 69 6f 6e 29 20 29 7b 0a 20 20 20  apRegion) ){.   
21e00 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
21e10 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
21e20 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53  rror();.      OS
21e30 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49  TRACE(("UNMAP-FI
21e40 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  LE pid=%lu, pFil
21e50 65 3d 25 70 2c 20 70 4d 61 70 52 65 67 69 6f 6e  e=%p, pMapRegion
21e60 3d 25 70 2c 20 22 0a 20 20 20 20 20 20 20 20 20  =%p, ".         
21e70 20 20 20 20 20 20 22 72 63 3d 53 51 4c 49 54 45        "rc=SQLITE
21e80 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c 20  _IOERR_MMAP\n", 
21e90 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
21ea0 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 0a  essId(), pFile,.
21eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
21ec0 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
21ed0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
21ee0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
21ef0 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20  ITE_IOERR_MMAP, 
21f00 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
21f10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21f20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 55             "winU
21f30 6e 6d 61 70 66 69 6c 65 31 22 2c 20 70 46 69 6c  nmapfile1", pFil
21f40 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  e->zPath);.    }
21f50 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70  .    pFile->pMap
21f60 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 20 20  Region = 0;.    
21f70 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
21f80 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  = 0;.    pFile->
21f90 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d  mmapSizeActual =
21fa0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46   0;.  }.  if( pF
21fb0 69 6c 65 2d 3e 68 4d 61 70 21 3d 4e 55 4c 4c 20  ile->hMap!=NULL 
21fc0 29 7b 0a 20 20 20 20 69 66 28 20 21 6f 73 43 6c  ){.    if( !osCl
21fd0 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
21fe0 3e 68 4d 61 70 29 20 29 7b 0a 20 20 20 20 20 20  >hMap) ){.      
21ff0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
22000 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
22010 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  r();.      OSTRA
22020 43 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20  CE(("UNMAP-FILE 
22030 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
22040 70 2c 20 68 4d 61 70 3d 25 70 2c 20 72 63 3d 53  p, hMap=%p, rc=S
22050 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50  QLITE_IOERR_MMAP
22060 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
22070 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
22080 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
22090 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 4d 61 70 29  le, pFile->hMap)
220a0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
220b0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
220c0 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70  TE_IOERR_MMAP, p
220d0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
220e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
220f0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e            "winUn
22100 6d 61 70 66 69 6c 65 32 22 2c 20 70 46 69 6c 65  mapfile2", pFile
22110 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
22120 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 61 70 20      pFile->hMap 
22130 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 53  = NULL;.  }.  OS
22140 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49  TRACE(("UNMAP-FI
22150 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  LE pid=%lu, pFil
22160 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
22170 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  OK\n",.         
22180 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
22190 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
221a0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
221b0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
221c0 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72 20 72   Memory map or r
221d0 65 6d 61 70 20 74 68 65 20 66 69 6c 65 20 6f 70  emap the file op
221e0 65 6e 65 64 20 62 79 20 66 69 6c 65 2d 64 65 73  ened by file-des
221f0 63 72 69 70 74 6f 72 20 70 46 64 20 28 69 66 20  criptor pFd (if 
22200 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61  the file.** is a
22210 6c 72 65 61 64 79 20 6d 61 70 70 65 64 2c 20 74  lready mapped, t
22220 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70  he existing mapp
22230 69 6e 67 20 69 73 20 72 65 70 6c 61 63 65 64 20  ing is replaced 
22240 62 79 20 74 68 65 20 6e 65 77 29 2e 20 4f 72 2c  by the new). Or,
22250 20 69 66 0a 2a 2a 20 74 68 65 72 65 20 61 6c 72   if.** there alr
22260 65 61 64 79 20 65 78 69 73 74 73 20 61 20 6d 61  eady exists a ma
22270 70 70 69 6e 67 20 66 6f 72 20 74 68 69 73 20 66  pping for this f
22280 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61  ile, and there a
22290 72 65 20 73 74 69 6c 6c 0a 2a 2a 20 6f 75 74 73  re still.** outs
222a0 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68 28 29  tanding xFetch()
222b0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 69   references to i
222c0 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  t, this function
222d0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
222e0 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
222f0 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d 6e 65 67  nByte is non-neg
22300 61 74 69 76 65 2c 20 74 68 65 6e 20 69 74 20 69  ative, then it i
22310 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
22320 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6d  size of.** the m
22330 61 70 70 69 6e 67 20 74 6f 20 63 72 65 61 74 65  apping to create
22340 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
22350 6e 42 79 74 65 20 69 73 20 6c 65 73 73 20 74 68  nByte is less th
22360 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
22370 65 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 73  e.** requested s
22380 69 7a 65 20 69 73 20 74 68 65 20 73 69 7a 65 20  ize is the size 
22390 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  of the file on d
223a0 69 73 6b 2e 20 54 68 65 20 61 63 74 75 61 6c 20  isk. The actual 
223b0 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  size of the.** c
223c0 72 65 61 74 65 64 20 6d 61 70 70 69 6e 67 20 69  reated mapping i
223d0 73 20 65 69 74 68 65 72 20 74 68 65 20 72 65 71  s either the req
223e0 75 65 73 74 65 64 20 73 69 7a 65 20 6f 72 20 74  uested size or t
223f0 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75  he value configu
22400 72 65 64 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c  red.** using SQL
22410 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53  ITE_FCNTL_MMAP_S
22420 49 5a 45 2c 20 77 68 69 63 68 65 76 65 72 20 69  IZE, whichever i
22430 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a  s smaller..**.**
22440 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
22450 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
22460 6f 72 20 6f 63 63 75 72 73 20 28 65 76 65 6e 20  or occurs (even 
22470 69 66 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69  if the mapping i
22480 73 20 6e 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74  s not.** recreat
22490 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ed as a result o
224a0 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  f outstanding re
224b0 66 65 72 65 6e 63 65 73 29 20 6f 72 20 61 6e 20  ferences) or an 
224c0 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20  SQLite error.** 
224d0 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
224e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
224f0 6e 4d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65  nMapfile(winFile
22500 20 2a 70 46 64 2c 20 73 71 6c 69 74 65 33 5f 69   *pFd, sqlite3_i
22510 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 73  nt64 nByte){.  s
22520 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4d 61  qlite3_int64 nMa
22530 70 20 3d 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74  p = nByte;.  int
22540 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
22550 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e  nMap>=0 || pFd->
22560 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a  nFetchOut==0 );.
22570 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d    OSTRACE(("MAP-
22580 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  FILE pid=%lu, pF
22590 69 6c 65 3d 25 70 2c 20 73 69 7a 65 3d 25 6c 6c  ile=%p, size=%ll
225a0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
225b0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
225c0 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 6e  cessId(), pFd, n
225d0 42 79 74 65 29 29 3b 0a 0a 20 20 69 66 28 20 70  Byte));..  if( p
225e0 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20  Fd->nFetchOut>0 
225f0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
22600 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c  OK;..  if( nMap<
22610 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69  0 ){.    rc = wi
22620 6e 46 69 6c 65 53 69 7a 65 28 28 73 71 6c 69 74  nFileSize((sqlit
22630 65 33 5f 66 69 6c 65 2a 29 70 46 64 2c 20 26 6e  e3_file*)pFd, &n
22640 4d 61 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Map);.    if( rc
22650 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
22660 45 28 28 22 4d 41 50 2d 46 49 4c 45 20 70 69 64  E(("MAP-FILE pid
22670 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
22680 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
22690 46 53 54 41 54 5c 6e 22 2c 0a 20 20 20 20 20 20  FSTAT\n",.      
226a0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
226b0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
226c0 2c 20 70 46 64 29 29 3b 0a 20 20 20 20 20 20 72  , pFd));.      r
226d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
226e0 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a  RR_FSTAT;.    }.
226f0 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70 3e 70    }.  if( nMap>p
22700 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  Fd->mmapSizeMax 
22710 29 7b 0a 20 20 20 20 6e 4d 61 70 20 3d 20 70 46  ){.    nMap = pF
22720 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a  d->mmapSizeMax;.
22730 20 20 7d 0a 20 20 6e 4d 61 70 20 26 3d 20 7e 28    }.  nMap &= ~(
22740 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 77  sqlite3_int64)(w
22750 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65  inSysInfo.dwPage
22760 53 69 7a 65 20 2d 20 31 29 3b 0a 0a 20 20 69 66  Size - 1);..  if
22770 28 20 6e 4d 61 70 3d 3d 30 20 26 26 20 70 46 64  ( nMap==0 && pFd
22780 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a  ->mmapSize>0 ){.
22790 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65      winUnmapfile
227a0 28 70 46 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28  (pFd);.  }.  if(
227b0 20 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70   nMap!=pFd->mmap
227c0 53 69 7a 65 20 29 7b 0a 20 20 20 20 76 6f 69 64  Size ){.    void
227d0 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20   *pNew = 0;.    
227e0 44 57 4f 52 44 20 70 72 6f 74 65 63 74 20 3d 20  DWORD protect = 
227f0 50 41 47 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  PAGE_READONLY;. 
22800 20 20 20 44 57 4f 52 44 20 66 6c 61 67 73 20 3d     DWORD flags =
22810 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 3b 0a   FILE_MAP_READ;.
22820 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c  .    winUnmapfil
22830 65 28 70 46 64 29 3b 0a 23 69 66 64 65 66 20 53  e(pFd);.#ifdef S
22840 51 4c 49 54 45 5f 4d 4d 41 50 5f 52 45 41 44 57  QLITE_MMAP_READW
22850 52 49 54 45 0a 20 20 20 20 69 66 28 20 28 70 46  RITE.    if( (pF
22860 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57  d->ctrlFlags & W
22870 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d  INFILE_RDONLY)==
22880 30 20 29 7b 0a 20 20 20 20 20 20 70 72 6f 74 65  0 ){.      prote
22890 63 74 20 3d 20 50 41 47 45 5f 52 45 41 44 57 52  ct = PAGE_READWR
228a0 49 54 45 3b 0a 20 20 20 20 20 20 66 6c 61 67 73  ITE;.      flags
228b0 20 7c 3d 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49   |= FILE_MAP_WRI
228c0 54 45 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  TE;.    }.#endif
228d0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
228e0 49 4e 52 54 0a 20 20 20 20 70 46 64 2d 3e 68 4d  INRT.    pFd->hM
228f0 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ap = osCreateFil
22900 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 28  eMappingFromApp(
22910 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72  pFd->h, NULL, pr
22920 6f 74 65 63 74 2c 20 6e 4d 61 70 2c 20 4e 55 4c  otect, nMap, NUL
22930 4c 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  L);.#elif define
22940 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
22950 41 53 5f 57 49 44 45 29 0a 20 20 20 20 70 46 64  AS_WIDE).    pFd
22960 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74  ->hMap = osCreat
22970 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 70 46  eFileMappingW(pF
22980 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74  d->h, NULL, prot
22990 65 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ect,.           
229a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229b0 20 20 20 20 20 28 44 57 4f 52 44 29 28 28 6e 4d       (DWORD)((nM
229c0 61 70 3e 3e 33 32 29 20 26 20 30 78 66 66 66 66  ap>>32) & 0xffff
229d0 66 66 66 66 29 2c 0a 20 20 20 20 20 20 20 20 20  ffff),.         
229e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229f0 20 20 20 20 20 20 20 28 44 57 4f 52 44 29 28 6e         (DWORD)(n
22a00 4d 61 70 20 26 20 30 78 66 66 66 66 66 66 66 66  Map & 0xffffffff
22a10 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66 20  ), NULL);.#elif 
22a20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
22a30 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26  IN32_HAS_ANSI) &
22a40 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 43  & SQLITE_WIN32_C
22a50 52 45 41 54 45 46 49 4c 45 4d 41 50 50 49 4e 47  REATEFILEMAPPING
22a60 41 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20  A.    pFd->hMap 
22a70 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  = osCreateFileMa
22a80 70 70 69 6e 67 41 28 70 46 64 2d 3e 68 2c 20 4e  ppingA(pFd->h, N
22a90 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a 20 20  ULL, protect,.  
22aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 44                (D
22ac0 57 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33 32 29  WORD)((nMap>>32)
22ad0 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c 0a   & 0xffffffff),.
22ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b00 28 44 57 4f 52 44 29 28 6e 4d 61 70 20 26 20 30  (DWORD)(nMap & 0
22b10 78 66 66 66 66 66 66 66 66 29 2c 20 4e 55 4c 4c  xffffffff), NULL
22b20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  );.#endif.    if
22b30 28 20 70 46 64 2d 3e 68 4d 61 70 3d 3d 4e 55 4c  ( pFd->hMap==NUL
22b40 4c 20 29 7b 0a 20 20 20 20 20 20 70 46 64 2d 3e  L ){.      pFd->
22b50 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
22b60 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
22b70 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
22b80 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
22b90 52 5f 4d 4d 41 50 2c 20 70 46 64 2d 3e 6c 61 73  R_MMAP, pFd->las
22ba0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
22bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
22bc0 77 69 6e 4d 61 70 66 69 6c 65 31 22 2c 20 70 46  winMapfile1", pF
22bd0 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
22be0 20 2f 2a 20 4c 6f 67 20 74 68 65 20 65 72 72 6f   /* Log the erro
22bf0 72 2c 20 62 75 74 20 63 6f 6e 74 69 6e 75 65 20  r, but continue 
22c00 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e  normal operation
22c10 20 75 73 69 6e 67 20 78 52 65 61 64 2f 78 57 72   using xRead/xWr
22c20 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54  ite */.      OST
22c30 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 2d  RACE(("MAP-FILE-
22c40 43 52 45 41 54 45 20 70 69 64 3d 25 6c 75 2c 20  CREATE pid=%lu, 
22c50 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c  pFile=%p, rc=%s\
22c60 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
22c70 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
22c80 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c  rocessId(), pFd,
22c90 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
22ca0 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74  rc)));.      ret
22cb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
22cc0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
22cd0 20 28 6e 4d 61 70 20 25 20 77 69 6e 53 79 73 49   (nMap % winSysI
22ce0 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65 29 3d  nfo.dwPageSize)=
22cf0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
22d00 28 20 73 69 7a 65 6f 66 28 53 49 5a 45 5f 54 29  ( sizeof(SIZE_T)
22d10 3d 3d 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  ==sizeof(sqlite3
22d20 5f 69 6e 74 36 34 29 20 7c 7c 20 6e 4d 61 70 3c  _int64) || nMap<
22d30 3d 30 78 66 66 66 66 66 66 66 66 20 29 3b 0a 23  =0xffffffff );.#
22d40 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
22d50 52 54 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73  RT.    pNew = os
22d60 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f  MapViewOfFileFro
22d70 6d 41 70 70 28 70 46 64 2d 3e 68 4d 61 70 2c 20  mApp(pFd->hMap, 
22d80 66 6c 61 67 73 2c 20 30 2c 20 28 53 49 5a 45 5f  flags, 0, (SIZE_
22d90 54 29 6e 4d 61 70 29 3b 0a 23 65 6c 73 65 0a 20  T)nMap);.#else. 
22da0 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 61 70 56     pNew = osMapV
22db0 69 65 77 4f 66 46 69 6c 65 28 70 46 64 2d 3e 68  iewOfFile(pFd->h
22dc0 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30 2c 20 30  Map, flags, 0, 0
22dd0 2c 20 28 53 49 5a 45 5f 54 29 6e 4d 61 70 29 3b  , (SIZE_T)nMap);
22de0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
22df0 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20  pNew==NULL ){.  
22e00 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
22e10 65 28 70 46 64 2d 3e 68 4d 61 70 29 3b 0a 20 20  e(pFd->hMap);.  
22e20 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20      pFd->hMap = 
22e30 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 70 46 64 2d  NULL;.      pFd-
22e40 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
22e50 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
22e60 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
22e70 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
22e80 52 52 5f 4d 4d 41 50 2c 20 70 46 64 2d 3e 6c 61  RR_MMAP, pFd->la
22e90 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
22ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22eb0 22 77 69 6e 4d 61 70 66 69 6c 65 32 22 2c 20 70  "winMapfile2", p
22ec0 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  Fd->zPath);.    
22ed0 20 20 2f 2a 20 4c 6f 67 20 74 68 65 20 65 72 72    /* Log the err
22ee0 6f 72 2c 20 62 75 74 20 63 6f 6e 74 69 6e 75 65  or, but continue
22ef0 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f   normal operatio
22f00 6e 20 75 73 69 6e 67 20 78 52 65 61 64 2f 78 57  n using xRead/xW
22f10 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 4f 53  rite */.      OS
22f20 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45  TRACE(("MAP-FILE
22f30 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 70 46  -MAP pid=%lu, pF
22f40 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22  ile=%p, rc=%s\n"
22f50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22f60 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
22f70 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 73  cessId(), pFd, s
22f80 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
22f90 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )));.      retur
22fa0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
22fb0 20 7d 0a 20 20 20 20 70 46 64 2d 3e 70 4d 61 70   }.    pFd->pMap
22fc0 52 65 67 69 6f 6e 20 3d 20 70 4e 65 77 3b 0a 20  Region = pNew;. 
22fd0 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65     pFd->mmapSize
22fe0 20 3d 20 6e 4d 61 70 3b 0a 20 20 20 20 70 46 64   = nMap;.    pFd
22ff0 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
23000 20 3d 20 6e 4d 61 70 3b 0a 20 20 7d 0a 0a 20 20   = nMap;.  }..  
23010 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49  OSTRACE(("MAP-FI
23020 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  LE pid=%lu, pFil
23030 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
23040 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  OK\n",.         
23050 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
23060 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 29 29  ocessId(), pFd))
23070 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
23080 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
23090 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  * SQLITE_MAX_MMA
230a0 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a  P_SIZE>0 */../*.
230b0 2a 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  ** If possible, 
230c0 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
230d0 20 74 6f 20 61 20 6d 61 70 70 69 6e 67 20 6f 66   to a mapping of
230e0 20 66 69 6c 65 20 66 64 20 73 74 61 72 74 69 6e   file fd startin
230f0 67 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20 69  g at offset.** i
23100 4f 66 66 2e 20 54 68 65 20 6d 61 70 70 69 6e 67  Off. The mapping
23110 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64 20 66   must be valid f
23120 6f 72 20 61 74 20 6c 65 61 73 74 20 6e 41 6d 74  or at least nAmt
23130 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   bytes..**.** If
23140 20 73 75 63 68 20 61 20 70 6f 69 6e 74 65 72 20   such a pointer 
23150 63 61 6e 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  can be obtained,
23160 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 70 70   store it in *pp
23170 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
23180 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66  TE_OK..** Or, if
23190 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 75 74 20   one cannot but 
231a0 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
231b0 20 73 65 74 20 2a 70 70 20 74 6f 20 30 20 61 6e   set *pp to 0 an
231c0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
231d0 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20  OK..** Finally, 
231e0 69 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73  if an error does
231f0 20 6f 63 63 75 72 2c 20 72 65 74 75 72 6e 20 61   occur, return a
23200 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
23210 6f 64 65 2e 20 54 68 65 20 66 69 6e 61 6c 0a 2a  ode. The final.*
23220 2a 20 76 61 6c 75 65 20 6f 66 20 2a 70 70 20 69  * value of *pp i
23230 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74  s undefined in t
23240 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
23250 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  If this function
23260 20 64 6f 65 73 20 72 65 74 75 72 6e 20 61 20 70   does return a p
23270 6f 69 6e 74 65 72 2c 20 74 68 65 20 63 61 6c 6c  ointer, the call
23280 65 72 20 6d 75 73 74 20 65 76 65 6e 74 75 61 6c  er must eventual
23290 6c 79 0a 2a 2a 20 72 65 6c 65 61 73 65 20 74 68  ly.** release th
232a0 65 20 72 65 66 65 72 65 6e 63 65 20 62 79 20 63  e reference by c
232b0 61 6c 6c 69 6e 67 20 77 69 6e 55 6e 66 65 74 63  alling winUnfetc
232c0 68 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  h()..*/.static i
232d0 6e 74 20 77 69 6e 46 65 74 63 68 28 73 71 6c 69  nt winFetch(sqli
232e0 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
232f0 34 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74  4 iOff, int nAmt
23300 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69  , void **pp){.#i
23310 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
23320 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e 46 69  P_SIZE>0.  winFi
23330 6c 65 20 2a 70 46 64 20 3d 20 28 77 69 6e 46 69  le *pFd = (winFi
23340 6c 65 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65  le*)fd;   /* The
23350 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
23360 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e  base file */.#en
23370 64 69 66 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a  dif.  *pp = 0;..
23380 20 20 4f 53 54 52 41 43 45 28 28 22 46 45 54 43    OSTRACE(("FETC
23390 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  H pid=%lu, pFile
233a0 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64  =%p, offset=%lld
233b0 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 70 70 3d  , amount=%d, pp=
233c0 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %p\n",.         
233d0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
233e0 6f 63 65 73 73 49 64 28 29 2c 20 66 64 2c 20 69  ocessId(), fd, i
233f0 4f 66 66 2c 20 6e 41 6d 74 2c 20 70 70 29 29 3b  Off, nAmt, pp));
23400 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
23410 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69  _MMAP_SIZE>0.  i
23420 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  f( pFd->mmapSize
23430 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  Max>0 ){.    if(
23440 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
23450 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
23460 20 72 63 20 3d 20 77 69 6e 4d 61 70 66 69 6c 65   rc = winMapfile
23470 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20  (pFd, -1);.     
23480 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
23490 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 4f 53  OK ){.        OS
234a0 54 52 41 43 45 28 28 22 46 45 54 43 48 20 70 69  TRACE(("FETCH pi
234b0 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
234c0 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
234d0 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
234e0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
234f0 64 28 29 2c 20 70 46 64 2c 20 73 71 6c 69 74 65  d(), pFd, sqlite
23500 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
23510 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
23520 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
23530 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d  .    if( pFd->mm
23540 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66 66 2b 6e  apSize >= iOff+n
23550 41 6d 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  Amt ){.      *pp
23560 20 3d 20 26 28 28 75 38 20 2a 29 70 46 64 2d 3e   = &((u8 *)pFd->
23570 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66  pMapRegion)[iOff
23580 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6e 46  ];.      pFd->nF
23590 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d  etchOut++;.    }
235a0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 4f  .  }.#endif..  O
235b0 53 54 52 41 43 45 28 28 22 46 45 54 43 48 20 70  STRACE(("FETCH p
235c0 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
235d0 2c 20 70 70 3d 25 70 2c 20 2a 70 70 3d 25 70 2c  , pp=%p, *pp=%p,
235e0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
235f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
23600 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
23610 49 64 28 29 2c 20 66 64 2c 20 70 70 2c 20 2a 70  Id(), fd, pp, *p
23620 70 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  p));.  return SQ
23630 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
23640 2a 20 49 66 20 74 68 65 20 74 68 69 72 64 20 61  * If the third a
23650 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e  rgument is non-N
23660 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ULL, then this f
23670 75 6e 63 74 69 6f 6e 20 72 65 6c 65 61 73 65 73  unction releases
23680 20 61 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20   a.** reference 
23690 6f 62 74 61 69 6e 65 64 20 62 79 20 61 6e 20 65  obtained by an e
236a0 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 77  arlier call to w
236b0 69 6e 46 65 74 63 68 28 29 2e 20 54 68 65 20 73  inFetch(). The s
236c0 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  econd.** argumen
236d0 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  t passed to this
236e0 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
236f0 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
23700 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
23710 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 68 61 74  ** argument that
23720 20 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74   was passed to t
23730 68 65 20 77 69 6e 46 65 74 63 68 28 29 20 69 6e  he winFetch() in
23740 76 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  vocation..**.** 
23750 4f 72 2c 20 69 66 20 74 68 65 20 74 68 69 72 64  Or, if the third
23760 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c   argument is NUL
23770 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  L, then this fun
23780 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63  ction is being c
23790 61 6c 6c 65 64 0a 2a 2a 20 74 6f 20 69 6e 66 6f  alled.** to info
237a0 72 6d 20 74 68 65 20 56 46 53 20 6c 61 79 65 72  rm the VFS layer
237b0 20 74 68 61 74 2c 20 61 63 63 6f 72 64 69 6e 67   that, according
237c0 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e 79 20 65   to POSIX, any e
237d0 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 0a  xisting mapping.
237e0 2a 2a 20 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e  ** may now be in
237f0 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64  valid and should
23800 20 62 65 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f   be unmapped..*/
23810 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55  .static int winU
23820 6e 66 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66  nfetch(sqlite3_f
23830 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66  ile *fd, i64 iOf
23840 66 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 23 69 66  f, void *p){.#if
23850 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
23860 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e 46 69 6c  _SIZE>0.  winFil
23870 65 20 2a 70 46 64 20 3d 20 28 77 69 6e 46 69 6c  e *pFd = (winFil
23880 65 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20  e*)fd;   /* The 
23890 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62  underlying datab
238a0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f  ase file */..  /
238b0 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d 61 70  * If p==0 (unmap
238c0 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 6c 65   the entire file
238d0 29 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  ) then there mus
238e0 74 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64  t be no outstand
238f0 69 6e 67 0a 20 20 2a 2a 20 78 46 65 74 63 68 20  ing.  ** xFetch 
23900 72 65 66 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20  references. Or, 
23910 69 66 20 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67  if p!=0 (meaning
23920 20 69 74 20 69 73 20 61 6e 20 78 46 65 74 63 68   it is an xFetch
23930 20 72 65 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a   reference),.  *
23940 2a 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  * then there mus
23950 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  t be at least on
23960 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 2e 20 20  e outstanding.  
23970 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 3d  */.  assert( (p=
23980 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63  =0)==(pFd->nFetc
23990 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f  hOut==0) );..  /
239a0 2a 20 49 66 20 70 21 3d 30 2c 20 69 74 20 6d 75  * If p!=0, it mu
239b0 73 74 20 6d 61 74 63 68 20 74 68 65 20 69 4f 66  st match the iOf
239c0 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73  f value. */.  as
239d0 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d  sert( p==0 || p=
239e0 3d 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d  =&((u8 *)pFd->pM
239f0 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20  apRegion)[iOff] 
23a00 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  );..  OSTRACE(("
23a10 55 4e 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c  UNFETCH pid=%lu,
23a20 20 70 46 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65   pFile=%p, offse
23a30 74 3d 25 6c 6c 64 2c 20 70 3d 25 70 5c 6e 22 2c  t=%lld, p=%p\n",
23a40 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
23a50 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
23a60 64 28 29 2c 20 70 46 64 2c 20 69 4f 66 66 2c 20  d(), pFd, iOff, 
23a70 70 29 29 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b  p));..  if( p ){
23a80 0a 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68  .    pFd->nFetch
23a90 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Out--;.  }else{.
23aa0 20 20 20 20 2f 2a 20 46 49 58 4d 45 3a 20 20 49      /* FIXME:  I
23ab0 66 20 57 69 6e 64 6f 77 73 20 74 72 75 6c 79 20  f Windows truly 
23ac0 61 6c 77 61 79 73 20 70 72 65 76 65 6e 74 73 20  always prevents 
23ad0 74 72 75 6e 63 61 74 69 6e 67 20 6f 72 20 64 65  truncating or de
23ae0 6c 65 74 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20  leting a.    ** 
23af0 66 69 6c 65 20 77 68 69 6c 65 20 61 20 6d 61 70  file while a map
23b00 70 69 6e 67 20 69 73 20 68 65 6c 64 2c 20 74 68  ping is held, th
23b10 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  en the following
23b20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 29 20   winUnmapfile() 
23b30 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 69 73 20 75  call.    ** is u
23b40 6e 6e 65 63 65 73 73 61 72 79 20 63 61 6e 20 62  nnecessary can b
23b50 65 20 6f 6d 69 74 74 65 64 20 2d 20 70 6f 74 65  e omitted - pote
23b60 6e 74 69 61 6c 6c 79 20 69 6d 70 72 6f 76 69 6e  ntially improvin
23b70 67 0a 20 20 20 20 2a 2a 20 70 65 72 66 6f 72 6d  g.    ** perform
23b80 61 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20 77 69  ance.  */.    wi
23b90 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b  nUnmapfile(pFd);
23ba0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
23bb0 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 3d  pFd->nFetchOut>=
23bc0 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f  0 );.#endif..  O
23bd0 53 54 52 41 43 45 28 28 22 55 4e 46 45 54 43 48  STRACE(("UNFETCH
23be0 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
23bf0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
23c00 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
23c10 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
23c20 65 73 73 49 64 28 29 2c 20 66 64 29 29 3b 0a 20  essId(), fd));. 
23c30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
23c40 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65  K;.}../*.** Here
23c50 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d   ends the implem
23c60 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20  entation of all 
23c70 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74  sqlite3_file met
23c80 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  hods..**.*******
23c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
23ca0 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  End sqlite3_file
23cb0 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   Methods *******
23cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23cd0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
23ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23d20 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
23d30 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69  This vector defi
23d40 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68  nes all the meth
23d50 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65  ods that can ope
23d60 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71  rate on an.** sq
23d70 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f 72 20 77  lite3_file for w
23d80 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  in32..*/.static 
23d90 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
23da0 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d 65  _methods winIoMe
23db0 74 68 6f 64 20 3d 20 7b 0a 20 20 33 2c 20 20 20  thod = {.  3,   
23dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23dd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
23de0 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43  ersion */.  winC
23df0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
23e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
23e10 43 6c 6f 73 65 20 2a 2f 0a 20 20 77 69 6e 52 65  Close */.  winRe
23e20 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ad,             
23e30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
23e40 65 61 64 20 2a 2f 0a 20 20 77 69 6e 57 72 69 74  ead */.  winWrit
23e50 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
23e60 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69           /* xWri
23e70 74 65 20 2a 2f 0a 20 20 77 69 6e 54 72 75 6e 63  te */.  winTrunc
23e80 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
23e90 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e          /* xTrun
23ea0 63 61 74 65 20 2a 2f 0a 20 20 77 69 6e 53 79 6e  cate */.  winSyn
23eb0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
23ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79            /* xSy
23ed0 6e 63 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 53  nc */.  winFileS
23ee0 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
23ef0 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
23f00 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63  Size */.  winLoc
23f10 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
23f20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
23f30 63 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63  ck */.  winUnloc
23f40 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
23f50 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
23f60 63 6b 20 2a 2f 0a 20 20 77 69 6e 43 68 65 63 6b  ck */.  winCheck
23f70 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
23f80 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63          /* xChec
23f90 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f  kReservedLock */
23fa0 0a 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f  .  winFileContro
23fb0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
23fc0 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72     /* xFileContr
23fd0 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53 65 63 74 6f  ol */.  winSecto
23fe0 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  rSize,          
23ff0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74          /* xSect
24000 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 44  orSize */.  winD
24010 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
24020 74 69 63 73 2c 20 20 20 20 20 20 20 2f 2a 20 78  tics,       /* x
24030 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
24040 73 74 69 63 73 20 2a 2f 0a 20 20 77 69 6e 53 68  stics */.  winSh
24050 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20  mMap,           
24060 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
24070 68 6d 4d 61 70 20 2a 2f 0a 20 20 77 69 6e 53 68  hmMap */.  winSh
24080 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  mLock,          
24090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
240a0 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 53  hmLock */.  winS
240b0 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20  hmBarrier,      
240c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
240d0 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20 20  ShmBarrier */.  
240e0 77 69 6e 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20  winShmUnmap,    
240f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24100 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a  /* xShmUnmap */.
24110 20 20 77 69 6e 46 65 74 63 68 2c 20 20 20 20 20    winFetch,     
24120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24130 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 0a 20    /* xFetch */. 
24140 20 77 69 6e 55 6e 66 65 74 63 68 20 20 20 20 20   winUnfetch     
24150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24160 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f 0a   /* xUnfetch */.
24170 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  };../*.** This v
24180 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c  ector defines al
24190 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68  l the methods th
241a0 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f  at can operate o
241b0 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  n an.** sqlite3_
241c0 66 69 6c 65 20 66 6f 72 20 77 69 6e 33 32 20 77  file for win32 w
241d0 69 74 68 6f 75 74 20 70 65 72 66 6f 72 6d 69 6e  ithout performin
241e0 67 20 61 6e 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a  g any locking..*
241f0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
24200 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
24210 73 20 77 69 6e 49 6f 4e 6f 6c 6f 63 6b 4d 65 74  s winIoNolockMet
24220 68 6f 64 20 3d 20 7b 0a 20 20 33 2c 20 20 20 20  hod = {.  3,    
24230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
24250 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c  rsion */.  winCl
24260 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
24270 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
24280 6c 6f 73 65 20 2a 2f 0a 20 20 77 69 6e 52 65 61  lose */.  winRea
24290 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
242a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
242b0 61 64 20 2a 2f 0a 20 20 77 69 6e 57 72 69 74 65  ad */.  winWrite
242c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
242d0 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74          /* xWrit
242e0 65 20 2a 2f 0a 20 20 77 69 6e 54 72 75 6e 63 61  e */.  winTrunca
242f0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
24300 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63         /* xTrunc
24310 61 74 65 20 2a 2f 0a 20 20 77 69 6e 53 79 6e 63  ate */.  winSync
24320 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24330 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e           /* xSyn
24340 63 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 53 69  c */.  winFileSi
24350 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
24360 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53         /* xFileS
24370 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 4e 6f 6c 6f  ize */.  winNolo
24380 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ckLock,         
24390 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
243a0 6b 20 2a 2f 0a 20 20 77 69 6e 4e 6f 6c 6f 63 6b  k */.  winNolock
243b0 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
243c0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
243d0 6b 20 2a 2f 0a 20 20 77 69 6e 4e 6f 6c 6f 63 6b  k */.  winNolock
243e0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
243f0 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  k,     /* xCheck
24400 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a  ReservedLock */.
24410 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c    winFileControl
24420 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24430 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f    /* xFileContro
24440 6c 20 2a 2f 0a 20 20 77 69 6e 53 65 63 74 6f 72  l */.  winSector
24450 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
24460 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f         /* xSecto
24470 72 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 44 65  rSize */.  winDe
24480 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
24490 69 63 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 44  ics,       /* xD
244a0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
244b0 74 69 63 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  tics */.  winShm
244c0 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  Map,            
244d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
244e0 6d 4d 61 70 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  mMap */.  winShm
244f0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
24500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
24510 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 53 68  mLock */.  winSh
24520 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20  mBarrier,       
24530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
24540 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20 20 77  hmBarrier */.  w
24550 69 6e 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20  inShmUnmap,     
24560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24570 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20  * xShmUnmap */. 
24580 20 77 69 6e 46 65 74 63 68 2c 20 20 20 20 20 20   winFetch,      
24590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245a0 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 0a 20 20   /* xFetch */.  
245b0 77 69 6e 55 6e 66 65 74 63 68 20 20 20 20 20 20  winUnfetch      
245c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245d0 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f 0a 7d  /* xUnfetch */.}
245e0 3b 0a 0a 73 74 61 74 69 63 20 77 69 6e 56 66 73  ;..static winVfs
245f0 41 70 70 44 61 74 61 20 77 69 6e 41 70 70 44 61  AppData winAppDa
24600 74 61 20 3d 20 7b 0a 20 20 26 77 69 6e 49 6f 4d  ta = {.  &winIoM
24610 65 74 68 6f 64 2c 20 20 20 20 20 20 20 2f 2a 20  ethod,       /* 
24620 70 4d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 2c 20  pMethod */.  0, 
24630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24640 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a   /* pAppData */.
24650 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
24660 20 20 20 20 20 20 2f 2a 20 62 4e 6f 4c 6f 63 6b        /* bNoLock
24670 20 2a 2f 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 77   */.};..static w
24680 69 6e 56 66 73 41 70 70 44 61 74 61 20 77 69 6e  inVfsAppData win
24690 4e 6f 6c 6f 63 6b 41 70 70 44 61 74 61 20 3d 20  NolockAppData = 
246a0 7b 0a 20 20 26 77 69 6e 49 6f 4e 6f 6c 6f 63 6b  {.  &winIoNolock
246b0 4d 65 74 68 6f 64 2c 20 2f 2a 20 70 4d 65 74 68  Method, /* pMeth
246c0 6f 64 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  od */.  0,      
246d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
246e0 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 31 20 20  AppData */.  1  
246f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24700 20 2f 2a 20 62 4e 6f 4c 6f 63 6b 20 2a 2f 0a 7d   /* bNoLock */.}
24710 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;../************
24720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24760 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
24770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71  ************* sq
24780 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64  lite3_vfs method
24790 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
247a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
247b0 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69  *.** This divisi
247c0 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
247d0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
247e0 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65  f methods on the
247f0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  .** sqlite3_vfs 
24800 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 23 69 66 20  object..*/..#if 
24810 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
24820 5f 5f 29 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  __)./*.** Conver
24830 74 20 61 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f  t a filename fro
24840 6d 20 77 68 61 74 65 76 65 72 20 74 68 65 20 75  m whatever the u
24850 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74  nderlying operat
24860 69 6e 67 20 73 79 73 74 65 6d 0a 2a 2a 20 73 75  ing system.** su
24870 70 70 6f 72 74 73 20 66 6f 72 20 66 69 6c 65 6e  pports for filen
24880 61 6d 65 73 20 69 6e 74 6f 20 55 54 46 2d 38 2e  ames into UTF-8.
24890 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
248a0 74 68 65 20 72 65 73 75 6c 74 20 69 73 0a 2a 2a  the result is.**
248b0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
248c0 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62  alloc and must b
248d0 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
248e0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
248f0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
24900 2a 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66  *winConvertToUtf
24910 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20  8Filename(const 
24920 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  void *zFilename)
24930 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 76 65  {.  char *zConve
24940 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20  rted = 0;.  if( 
24950 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
24960 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
24970 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 46  UnicodeToUtf8(zF
24980 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69  ilename);.  }.#i
24990 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
249a0 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
249b0 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65  e{.    zConverte
249c0 64 20 3d 20 77 69 6e 4d 62 63 73 54 6f 55 74 66  d = winMbcsToUtf
249d0 38 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 6f 73 41  8(zFilename, osA
249e0 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29  reFileApisANSI()
249f0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
24a00 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68  /* caller will h
24a10 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d  andle out of mem
24a20 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ory */.  return 
24a30 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 23 65  zConverted;.}.#e
24a40 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  ndif../*.** Conv
24a50 65 72 74 20 61 20 55 54 46 2d 38 20 66 69 6c 65  ert a UTF-8 file
24a60 6e 61 6d 65 20 69 6e 74 6f 20 77 68 61 74 65 76  name into whatev
24a70 65 72 20 66 6f 72 6d 20 74 68 65 20 75 6e 64 65  er form the unde
24a80 72 6c 79 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  rlying.** operat
24a90 69 6e 67 20 73 79 73 74 65 6d 20 77 61 6e 74 73  ing system wants
24aa0 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e 2e 20 20   filenames in.  
24ab0 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
24ac0 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 73 20 6f  e result.** is o
24ad0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
24ae0 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65 20  loc and must be 
24af0 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
24b00 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
24b10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
24b20 20 2a 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d   *winConvertFrom
24b30 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e  Utf8Filename(con
24b40 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
24b50 6d 65 29 7b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  me){.  void *zCo
24b60 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69  nverted = 0;.  i
24b70 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20  f( osIsNT() ){. 
24b80 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20     zConverted = 
24b90 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65  winUtf8ToUnicode
24ba0 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d  (zFilename);.  }
24bb0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
24bc0 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
24bd0 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65  else{.    zConve
24be0 72 74 65 64 20 3d 20 77 69 6e 55 74 66 38 54 6f  rted = winUtf8To
24bf0 4d 62 63 73 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  Mbcs(zFilename, 
24c00 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
24c10 49 28 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  I());.  }.#endif
24c20 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c  .  /* caller wil
24c30 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20  l handle out of 
24c40 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75  memory */.  retu
24c50 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d  rn zConverted;.}
24c60 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
24c70 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f  ction returns no
24c80 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70  n-zero if the sp
24c90 65 63 69 66 69 65 64 20 55 54 46 2d 38 20 73 74  ecified UTF-8 st
24ca0 72 69 6e 67 20 62 75 66 66 65 72 0a 2a 2a 20 65  ring buffer.** e
24cb0 6e 64 73 20 77 69 74 68 20 61 20 64 69 72 65 63  nds with a direc
24cc0 74 6f 72 79 20 73 65 70 61 72 61 74 6f 72 20 63  tory separator c
24cd0 68 61 72 61 63 74 65 72 20 6f 72 20 6f 6e 65 20  haracter or one 
24ce0 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
24cf0 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 69 74 2e  .** added to it.
24d00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
24d10 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 69 72 53 65  inMakeEndInDirSe
24d20 70 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  p(int nBuf, char
24d30 20 2a 7a 42 75 66 29 7b 0a 20 20 69 66 28 20 7a   *zBuf){.  if( z
24d40 42 75 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  Buf ){.    int n
24d50 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Len = sqlite3Str
24d60 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 20  len30(zBuf);.   
24d70 20 69 66 28 20 6e 4c 65 6e 3e 30 20 29 7b 0a 20   if( nLen>0 ){. 
24d80 20 20 20 20 20 69 66 28 20 77 69 6e 49 73 44 69       if( winIsDi
24d90 72 53 65 70 28 7a 42 75 66 5b 6e 4c 65 6e 2d 31  rSep(zBuf[nLen-1
24da0 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ]) ){.        re
24db0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65  turn 1;.      }e
24dc0 6c 73 65 20 69 66 28 20 6e 4c 65 6e 2b 31 3c 6e  lse if( nLen+1<n
24dd0 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  Buf ){.        z
24de0 42 75 66 5b 6e 4c 65 6e 5d 20 3d 20 77 69 6e 47  Buf[nLen] = winG
24df0 65 74 44 69 72 53 65 70 28 29 3b 0a 20 20 20 20  etDirSep();.    
24e00 20 20 20 20 7a 42 75 66 5b 6e 4c 65 6e 2b 31 5d      zBuf[nLen+1]
24e10 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20   = '\0';.       
24e20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
24e30 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
24e40 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
24e50 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f  * Create a tempo
24e60 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 61  rary file name a
24e70 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
24e80 75 6c 74 69 6e 67 20 70 6f 69 6e 74 65 72 20 69  ulting pointer i
24e90 6e 74 6f 20 70 7a 42 75 66 2e 0a 2a 2a 20 54 68  nto pzBuf..** Th
24ea0 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
24eb0 65 64 20 69 6e 20 70 7a 42 75 66 20 6d 75 73 74  ed in pzBuf must
24ec0 20 62 65 20 66 72 65 65 64 20 76 69 61 20 73 71   be freed via sq
24ed0 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f  lite3_free()..*/
24ee0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47  .static int winG
24ef0 65 74 54 65 6d 70 6e 61 6d 65 28 73 71 6c 69 74  etTempname(sqlit
24f00 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 68  e3_vfs *pVfs, ch
24f10 61 72 20 2a 2a 70 7a 42 75 66 29 7b 0a 20 20 73  ar **pzBuf){.  s
24f20 74 61 74 69 63 20 63 68 61 72 20 7a 43 68 61 72  tatic char zChar
24f30 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65  s[] =.    "abcde
24f40 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
24f50 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44  vwxyz".    "ABCD
24f60 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54  EFGHIJKLMNOPQRST
24f70 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32  UVWXYZ".    "012
24f80 33 34 35 36 37 38 39 22 3b 0a 20 20 73 69 7a 65  3456789";.  size
24f90 5f 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e  _t i, j;.  int n
24fa0 50 72 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Pre = sqlite3Str
24fb0 6c 65 6e 33 30 28 53 51 4c 49 54 45 5f 54 45 4d  len30(SQLITE_TEM
24fc0 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 3b 0a  P_FILE_PREFIX);.
24fd0 20 20 69 6e 74 20 6e 4d 61 78 2c 20 6e 42 75 66    int nMax, nBuf
24fe0 2c 20 6e 44 69 72 2c 20 6e 4c 65 6e 3b 0a 20 20  , nDir, nLen;.  
24ff0 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 2f  char *zBuf;..  /
25000 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
25010 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
25020 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
25030 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
25040 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
25050 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
25060 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
25070 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
25080 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
25090 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 0a  nction failing..
250a0 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49    */.  SimulateI
250b0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
250c0 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a  QLITE_IOERR );..
250d0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
250e0 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72  temporary buffer
250f0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 75   to store the fu
25100 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 66 69  lly qualified fi
25110 6c 65 0a 20 20 2a 2a 20 6e 61 6d 65 20 66 6f 72  le.  ** name for
25120 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
25130 69 6c 65 2e 20 20 49 66 20 74 68 69 73 20 66 61  ile.  If this fa
25140 69 6c 73 2c 20 77 65 20 63 61 6e 6e 6f 74 20 63  ils, we cannot c
25150 6f 6e 74 69 6e 75 65 2e 0a 20 20 2a 2f 0a 20 20  ontinue..  */.  
25160 6e 4d 61 78 20 3d 20 70 56 66 73 2d 3e 6d 78 50  nMax = pVfs->mxP
25170 61 74 68 6e 61 6d 65 3b 20 6e 42 75 66 20 3d 20  athname; nBuf = 
25180 6e 4d 61 78 20 2b 20 32 3b 0a 20 20 7a 42 75 66  nMax + 2;.  zBuf
25190 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
251a0 5a 65 72 6f 28 20 6e 42 75 66 20 29 3b 0a 20 20  Zero( nBuf );.  
251b0 69 66 28 20 21 7a 42 75 66 20 29 7b 0a 20 20 20  if( !zBuf ){.   
251c0 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
251d0 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
251e0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e  TE_IOERR_NOMEM\n
251f0 22 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  "));.    return 
25200 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
25210 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  EM_BKPT;.  }..  
25220 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  /* Figure out th
25230 65 20 65 66 66 65 63 74 69 76 65 20 74 65 6d 70  e effective temp
25240 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e  orary directory.
25250 20 20 46 69 72 73 74 2c 20 63 68 65 63 6b 20 69    First, check i
25260 66 20 6f 6e 65 0a 20 20 2a 2a 20 68 61 73 20 62  f one.  ** has b
25270 65 65 6e 20 65 78 70 6c 69 63 69 74 6c 79 20 73  een explicitly s
25280 65 74 20 62 79 20 74 68 65 20 61 70 70 6c 69 63  et by the applic
25290 61 74 69 6f 6e 3b 20 6f 74 68 65 72 77 69 73 65  ation; otherwise
252a0 2c 20 75 73 65 20 74 68 65 20 6f 6e 65 0a 20 20  , use the one.  
252b0 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79  ** configured by
252c0 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
252d0 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 44  ystem..  */.  nD
252e0 69 72 20 3d 20 6e 4d 61 78 20 2d 20 28 6e 50 72  ir = nMax - (nPr
252f0 65 20 2b 20 31 35 29 3b 0a 20 20 61 73 73 65 72  e + 15);.  asser
25300 74 28 20 6e 44 69 72 3e 30 20 29 3b 0a 20 20 69  t( nDir>0 );.  i
25310 66 28 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  f( sqlite3_temp_
25320 64 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20  directory ){.   
25330 20 69 6e 74 20 6e 44 69 72 4c 65 6e 20 3d 20 73   int nDirLen = s
25340 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73  qlite3Strlen30(s
25350 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
25360 63 74 6f 72 79 29 3b 0a 20 20 20 20 69 66 28 20  ctory);.    if( 
25370 6e 44 69 72 4c 65 6e 3e 30 20 29 7b 0a 20 20 20  nDirLen>0 ){.   
25380 20 20 20 69 66 28 20 21 77 69 6e 49 73 44 69 72     if( !winIsDir
25390 53 65 70 28 73 71 6c 69 74 65 33 5f 74 65 6d 70  Sep(sqlite3_temp
253a0 5f 64 69 72 65 63 74 6f 72 79 5b 6e 44 69 72 4c  _directory[nDirL
253b0 65 6e 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20 20  en-1]) ){.      
253c0 20 20 6e 44 69 72 4c 65 6e 2b 2b 3b 0a 20 20 20    nDirLen++;.   
253d0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
253e0 44 69 72 4c 65 6e 3e 6e 44 69 72 20 29 7b 0a 20  DirLen>nDir ){. 
253f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
25400 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ree(zBuf);.     
25410 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
25420 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
25430 4c 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b  LITE_ERROR\n"));
25440 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
25450 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
25460 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77 69  TE_ERROR, 0, "wi
25470 6e 47 65 74 54 65 6d 70 6e 61 6d 65 31 22 2c 20  nGetTempname1", 
25480 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
25490 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
254a0 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22  tf(nMax, zBuf, "
254b0 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d  %s", sqlite3_tem
254c0 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20  p_directory);.  
254d0 20 20 7d 0a 20 20 7d 0a 23 69 66 20 64 65 66 69    }.  }.#if defi
254e0 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a  ned(__CYGWIN__).
254f0 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74    else{.    stat
25500 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
25510 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  zDirs[] = {.    
25520 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28     0, /* getenv(
25530 22 53 51 4c 49 54 45 5f 54 4d 50 44 49 52 22 29  "SQLITE_TMPDIR")
25540 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a   */.       0, /*
25550 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22   getenv("TMPDIR"
25560 29 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f  ) */.       0, /
25570 2a 20 67 65 74 65 6e 76 28 22 54 4d 50 22 29 20  * getenv("TMP") 
25580 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20  */.       0, /* 
25590 67 65 74 65 6e 76 28 22 54 45 4d 50 22 29 20 2a  getenv("TEMP") *
255a0 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67  /.       0, /* g
255b0 65 74 65 6e 76 28 22 55 53 45 52 50 52 4f 46 49  etenv("USERPROFI
255c0 4c 45 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 22  LE") */.       "
255d0 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /var/tmp",.     
255e0 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20    "/usr/tmp",.  
255f0 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20       "/tmp",.   
25600 20 20 20 20 22 2e 22 2c 0a 20 20 20 20 20 20 20      ".",.       
25610 30 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  0        /* List
25620 20 74 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20   terminator */. 
25630 20 20 20 7d 3b 0a 20 20 20 20 75 6e 73 69 67 6e     };.    unsign
25640 65 64 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f  ed int i;.    co
25650 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d  nst char *zDir =
25660 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 21 61 7a   0;..    if( !az
25670 44 69 72 73 5b 30 5d 20 29 20 61 7a 44 69 72 73  Dirs[0] ) azDirs
25680 5b 30 5d 20 3d 20 67 65 74 65 6e 76 28 22 53 51  [0] = getenv("SQ
25690 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 3b 0a 20  LITE_TMPDIR");. 
256a0 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31     if( !azDirs[1
256b0 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20  ] ) azDirs[1] = 
256c0 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29  getenv("TMPDIR")
256d0 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69 72  ;.    if( !azDir
256e0 73 5b 32 5d 20 29 20 61 7a 44 69 72 73 5b 32 5d  s[2] ) azDirs[2]
256f0 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 22 29   = getenv("TMP")
25700 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69 72  ;.    if( !azDir
25710 73 5b 33 5d 20 29 20 61 7a 44 69 72 73 5b 33 5d  s[3] ) azDirs[3]
25720 20 3d 20 67 65 74 65 6e 76 28 22 54 45 4d 50 22   = getenv("TEMP"
25730 29 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69  );.    if( !azDi
25740 72 73 5b 34 5d 20 29 20 61 7a 44 69 72 73 5b 34  rs[4] ) azDirs[4
25750 5d 20 3d 20 67 65 74 65 6e 76 28 22 55 53 45 52  ] = getenv("USER
25760 50 52 4f 46 49 4c 45 22 29 3b 0a 20 20 20 20 66  PROFILE");.    f
25770 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
25780 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28  (azDirs)/sizeof(
25790 61 7a 44 69 72 73 5b 30 5d 29 3b 20 7a 44 69 72  azDirs[0]); zDir
257a0 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20  =azDirs[i++]){. 
257b0 20 20 20 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76       void *zConv
257c0 65 72 74 65 64 3b 0a 20 20 20 20 20 20 69 66 28  erted;.      if(
257d0 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69   zDir==0 ) conti
257e0 6e 75 65 3b 0a 20 20 20 20 20 20 2f 2a 20 49 66  nue;.      /* If
257f0 20 74 68 65 20 70 61 74 68 20 73 74 61 72 74 73   the path starts
25800 20 77 69 74 68 20 61 20 64 72 69 76 65 20 6c 65   with a drive le
25810 74 74 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79  tter followed by
25820 20 74 68 65 20 63 6f 6c 6f 6e 0a 20 20 20 20 20   the colon.     
25830 20 2a 2a 20 63 68 61 72 61 63 74 65 72 2c 20 61   ** character, a
25840 73 73 75 6d 65 20 69 74 20 69 73 20 61 6c 72 65  ssume it is alre
25850 61 64 79 20 61 20 6e 61 74 69 76 65 20 57 69 6e  ady a native Win
25860 33 32 20 70 61 74 68 3b 20 6f 74 68 65 72 77 69  32 path; otherwi
25870 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  se,.      ** it 
25880 6d 75 73 74 20 62 65 20 63 6f 6e 76 65 72 74 65  must be converte
25890 64 20 74 6f 20 61 20 6e 61 74 69 76 65 20 57 69  d to a native Wi
258a0 6e 33 32 20 70 61 74 68 20 76 69 61 20 74 68 65  n32 path via the
258b0 20 43 79 67 77 69 6e 20 41 50 49 0a 20 20 20 20   Cygwin API.    
258c0 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 75 73    ** prior to us
258d0 69 6e 67 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f  ing it..      */
258e0 0a 20 20 20 20 20 20 69 66 28 20 77 69 6e 49 73  .      if( winIs
258f0 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f  DriveLetterAndCo
25900 6c 6f 6e 28 7a 44 69 72 29 20 29 7b 0a 20 20 20  lon(zDir) ){.   
25910 20 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20       zConverted 
25920 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d  = winConvertFrom
25930 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 44 69  Utf8Filename(zDi
25940 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
25950 21 7a 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20  !zConverted ){. 
25960 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
25970 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
25980 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
25990 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
259a0 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
259b0 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20  OMEM\n"));.     
259c0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
259d0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42  TE_IOERR_NOMEM_B
259e0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  KPT;.        }. 
259f0 20 20 20 20 20 20 20 69 66 28 20 77 69 6e 49 73         if( winIs
25a00 44 69 72 28 7a 43 6f 6e 76 65 72 74 65 64 29 20  Dir(zConverted) 
25a10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
25a20 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d  ite3_snprintf(nM
25a30 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20  ax, zBuf, "%s", 
25a40 7a 44 69 72 29 3b 0a 20 20 20 20 20 20 20 20 20  zDir);.         
25a50 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
25a60 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
25a70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
25a80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
25a90 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
25aa0 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 7d 65  erted);.      }e
25ab0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  lse{.        zCo
25ac0 6e 76 65 72 74 65 64 20 3d 20 73 71 6c 69 74 65  nverted = sqlite
25ad0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61  3MallocZero( nMa
25ae0 78 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69  x+1 );.        i
25af0 66 28 20 21 7a 43 6f 6e 76 65 72 74 65 64 20 29  f( !zConverted )
25b00 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
25b10 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
25b20 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41 43            OSTRAC
25b30 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
25b40 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
25b50 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20  R_NOMEM\n"));.  
25b60 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
25b70 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
25b80 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  M_BKPT;.        
25b90 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 79  }.        if( cy
25ba0 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 0a  gwin_conv_path(.
25bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25bc0 6f 73 49 73 4e 54 28 29 20 3f 20 43 43 50 5f 50  osIsNT() ? CCP_P
25bd0 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20  OSIX_TO_WIN_W : 
25be0 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e  CCP_POSIX_TO_WIN
25bf0 5f 41 2c 20 7a 44 69 72 2c 0a 20 20 20 20 20 20  _A, zDir,.      
25c00 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6e 76 65            zConve
25c10 72 74 65 64 2c 20 6e 4d 61 78 2b 31 29 3c 30 20  rted, nMax+1)<0 
25c20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
25c30 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
25c40 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20  rted);.         
25c50 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
25c60 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 4f  uf);.          O
25c70 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
25c80 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
25c90 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 5c  _IOERR_CONVPATH\
25ca0 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n"));.          
25cb0 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
25cc0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
25cd0 43 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f 52 44  CONVPATH, (DWORD
25ce0 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  )errno,.        
25cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d00 20 20 20 20 20 22 77 69 6e 47 65 74 54 65 6d 70       "winGetTemp
25d10 6e 61 6d 65 32 22 2c 20 7a 44 69 72 29 3b 0a 20  name2", zDir);. 
25d20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25d30 20 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43   if( winIsDir(zC
25d40 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20  onverted) ){.   
25d50 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69         /* At thi
25d60 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77  s point, we know
25d70 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 64   the candidate d
25d80 69 72 65 63 74 6f 72 79 20 65 78 69 73 74 73 20  irectory exists 
25d90 61 6e 64 20 73 68 6f 75 6c 64 0a 20 20 20 20 20  and should.     
25da0 20 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64 2e       ** be used.
25db0 20 20 48 6f 77 65 76 65 72 2c 20 77 65 20 6d 61    However, we ma
25dc0 79 20 6e 65 65 64 20 74 6f 20 63 6f 6e 76 65 72  y need to conver
25dd0 74 20 74 68 65 20 73 74 72 69 6e 67 20 63 6f 6e  t the string con
25de0 74 61 69 6e 69 6e 67 0a 20 20 20 20 20 20 20 20  taining.        
25df0 20 20 2a 2a 20 69 74 73 20 6e 61 6d 65 20 69 6e    ** its name in
25e00 74 6f 20 55 54 46 2d 38 20 28 69 2e 65 2e 20 69  to UTF-8 (i.e. i
25e10 66 20 69 74 20 69 73 20 55 54 46 2d 31 36 20 72  f it is UTF-16 r
25e20 69 67 68 74 20 6e 6f 77 29 2e 0a 20 20 20 20 20  ight now)..     
25e30 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
25e40 20 20 63 68 61 72 20 2a 7a 55 74 66 38 20 3d 20    char *zUtf8 = 
25e50 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38  winConvertToUtf8
25e60 46 69 6c 65 6e 61 6d 65 28 7a 43 6f 6e 76 65 72  Filename(zConver
25e70 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ted);.          
25e80 69 66 28 20 21 7a 55 74 66 38 20 29 7b 0a 20 20  if( !zUtf8 ){.  
25e90 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
25ea0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
25eb0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
25ec0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
25ed0 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  f);.            
25ee0 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
25ef0 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
25f00 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
25f10 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
25f20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
25f30 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
25f40 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
25f50 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
25f60 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75  printf(nMax, zBu
25f70 66 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b  f, "%s", zUtf8);
25f80 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
25f90 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a  e3_free(zUtf8);.
25fa0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
25fb0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
25fc0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  d);.          br
25fd0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
25fe0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
25ff0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
26000 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
26010 20 7d 0a 23 65 6c 69 66 20 21 53 51 4c 49 54 45   }.#elif !SQLITE
26020 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65  _OS_WINRT && !de
26030 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
26040 29 0a 20 20 65 6c 73 65 20 69 66 28 20 6f 73 49  ).  else if( osI
26050 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 63 68 61  sNT() ){.    cha
26060 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 4c  r *zMulti;.    L
26070 50 57 53 54 52 20 7a 57 69 64 65 50 61 74 68 20  PWSTR zWidePath 
26080 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
26090 65 72 6f 28 20 6e 4d 61 78 2a 73 69 7a 65 6f 66  ero( nMax*sizeof
260a0 28 57 43 48 41 52 29 20 29 3b 0a 20 20 20 20 69  (WCHAR) );.    i
260b0 66 28 20 21 7a 57 69 64 65 50 61 74 68 20 29 7b  f( !zWidePath ){
260c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
260d0 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ree(zBuf);.     
260e0 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
260f0 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
26100 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e  TE_IOERR_NOMEM\n
26110 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "));.      retur
26120 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
26130 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
26140 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 54 65  .    if( osGetTe
26150 6d 70 50 61 74 68 57 28 6e 4d 61 78 2c 20 7a 57  mpPathW(nMax, zW
26160 69 64 65 50 61 74 68 29 3d 3d 30 20 29 7b 0a 20  idePath)==0 ){. 
26170 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
26180 65 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20  e(zWidePath);.  
26190 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
261a0 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53  (zBuf);.      OS
261b0 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
261c0 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
261d0 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54  IOERR_GETTEMPPAT
261e0 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65  H\n"));.      re
261f0 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
26200 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45  (SQLITE_IOERR_GE
26210 54 54 45 4d 50 50 41 54 48 2c 20 6f 73 47 65 74  TTEMPPATH, osGet
26220 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
26230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26240 20 20 20 20 20 20 22 77 69 6e 47 65 74 54 65 6d        "winGetTem
26250 70 6e 61 6d 65 32 22 2c 20 30 29 3b 0a 20 20 20  pname2", 0);.   
26260 20 7d 0a 20 20 20 20 7a 4d 75 6c 74 69 20 3d 20   }.    zMulti = 
26270 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38  winUnicodeToUtf8
26280 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20  (zWidePath);.   
26290 20 69 66 28 20 7a 4d 75 6c 74 69 20 29 7b 0a 20   if( zMulti ){. 
262a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
262b0 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66  rintf(nMax, zBuf
262c0 2c 20 22 25 73 22 2c 20 7a 4d 75 6c 74 69 29 3b  , "%s", zMulti);
262d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
262e0 72 65 65 28 7a 4d 75 6c 74 69 29 3b 0a 20 20 20  ree(zMulti);.   
262f0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
26300 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20  zWidePath);.    
26310 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
26320 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 50  ite3_free(zWideP
26330 61 74 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ath);.      sqli
26340 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
26350 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
26360 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
26370 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
26380 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  MEM\n"));.      
26390 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
263a0 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
263b0 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66      }.  }.#ifdef
263c0 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
263d0 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
263e0 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 3b 0a     char *zUtf8;.
263f0 20 20 20 20 63 68 61 72 20 2a 7a 4d 62 63 73 50      char *zMbcsP
26400 61 74 68 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ath = sqlite3Mal
26410 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61 78 20 29 3b  locZero( nMax );
26420 0a 20 20 20 20 69 66 28 20 21 7a 4d 62 63 73 50  .    if( !zMbcsP
26430 61 74 68 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ath ){.      sql
26440 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
26450 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
26460 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
26470 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
26480 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20  OMEM\n"));.     
26490 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
264a0 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
264b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
264c0 73 47 65 74 54 65 6d 70 50 61 74 68 41 28 6e 4d  sGetTempPathA(nM
264d0 61 78 2c 20 7a 4d 62 63 73 50 61 74 68 29 3d 3d  ax, zMbcsPath)==
264e0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
264f0 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20  e3_free(zBuf);. 
26500 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
26510 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
26520 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54  SQLITE_IOERR_GET
26530 54 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20  TEMPPATH\n"));. 
26540 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
26550 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
26560 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48  OERR_GETTEMPPATH
26570 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
26580 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
26590 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
265a0 6e 47 65 74 54 65 6d 70 6e 61 6d 65 33 22 2c 20  nGetTempname3", 
265b0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55  0);.    }.    zU
265c0 74 66 38 20 3d 20 77 69 6e 4d 62 63 73 54 6f 55  tf8 = winMbcsToU
265d0 74 66 38 28 7a 4d 62 63 73 50 61 74 68 2c 20 6f  tf8(zMbcsPath, o
265e0 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  sAreFileApisANSI
265f0 28 29 29 3b 0a 20 20 20 20 69 66 28 20 7a 55 74  ());.    if( zUt
26600 66 38 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  f8 ){.      sqli
26610 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61  te3_snprintf(nMa
26620 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a  x, zBuf, "%s", z
26630 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c  Utf8);.      sql
26640 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29  ite3_free(zUtf8)
26650 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
26660 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
26670 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54  zBuf);.      OST
26680 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
26690 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49  NAME rc=SQLITE_I
266a0 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b  OERR_NOMEM\n"));
266b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
266c0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
266d0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
266e0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
266f0 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
26700 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53   */.#endif /* !S
26710 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 2a  QLITE_OS_WINRT *
26720 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 68 65  /..  /*.  ** Che
26730 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
26740 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69  the temporary di
26750 72 65 63 74 6f 72 79 20 65 6e 64 73 20 77 69 74  rectory ends wit
26760 68 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  h an appropriate
26770 0a 20 20 2a 2a 20 73 65 70 61 72 61 74 6f 72 2e  .  ** separator.
26780 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74    If it does not
26790 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
267a0 74 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 6c  t enough space l
267b0 65 66 74 20 74 6f 20 61 64 64 0a 20 20 2a 2a 20  eft to add.  ** 
267c0 6f 6e 65 2c 20 66 61 69 6c 2e 0a 20 20 2a 2f 0a  one, fail..  */.
267d0 20 20 69 66 28 20 21 77 69 6e 4d 61 6b 65 45 6e    if( !winMakeEn
267e0 64 49 6e 44 69 72 53 65 70 28 6e 44 69 72 2b 31  dInDirSep(nDir+1
267f0 2c 20 7a 42 75 66 29 20 29 7b 0a 20 20 20 20 73  , zBuf) ){.    s
26800 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
26810 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
26820 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
26830 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e  c=SQLITE_ERROR\n
26840 22 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  "));.    return 
26850 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
26860 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77 69  TE_ERROR, 0, "wi
26870 6e 47 65 74 54 65 6d 70 6e 61 6d 65 34 22 2c 20  nGetTempname4", 
26880 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  0);.  }..  /*.  
26890 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  ** Check that th
268a0 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
268b0 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  is large enough 
268c0 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72  for the temporar
268d0 79 20 66 69 6c 65 0a 20 20 2a 2a 20 6e 61 6d 65  y file.  ** name
268e0 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
268f0 67 20 66 6f 72 6d 61 74 3a 0a 20 20 2a 2a 0a 20  g format:.  **. 
26900 20 2a 2a 20 20 20 22 3c 74 65 6d 70 6f 72 61 72   **   "<temporar
26910 79 5f 64 69 72 65 63 74 6f 72 79 3e 2f 65 74 69  y_directory>/eti
26920 6c 71 73 5f 58 58 58 58 58 58 58 58 58 58 58 58  lqs_XXXXXXXXXXXX
26930 58 58 58 5c 30 5c 30 22 0a 20 20 2a 2a 0a 20 20  XXX\0\0".  **.  
26940 2a 2a 20 49 66 20 6e 6f 74 2c 20 72 65 74 75 72  ** If not, retur
26950 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20  n SQLITE_ERROR. 
26960 20 54 68 65 20 6e 75 6d 62 65 72 20 31 37 20 69   The number 17 i
26970 73 20 75 73 65 64 20 68 65 72 65 20 69 6e 20 6f  s used here in o
26980 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 61 63 63  rder to.  ** acc
26990 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 73 70 61  ount for the spa
269a0 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 31  ce used by the 1
269b0 35 20 63 68 61 72 61 63 74 65 72 20 72 61 6e 64  5 character rand
269c0 6f 6d 20 73 75 66 66 69 78 20 61 6e 64 20 74 68  om suffix and th
269d0 65 0a 20 20 2a 2a 20 74 77 6f 20 74 72 61 69 6c  e.  ** two trail
269e0 69 6e 67 20 4e 55 4c 20 63 68 61 72 61 63 74 65  ing NUL characte
269f0 72 73 2e 20 20 54 68 65 20 66 69 6e 61 6c 20 64  rs.  The final d
26a00 69 72 65 63 74 6f 72 79 20 73 65 70 61 72 61 74  irectory separat
26a10 6f 72 20 63 68 61 72 61 63 74 65 72 0a 20 20 2a  or character.  *
26a20 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 61 64  * has already ad
26a30 64 65 64 20 69 66 20 69 74 20 77 61 73 20 6e 6f  ded if it was no
26a40 74 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e  t already presen
26a50 74 2e 0a 20 20 2a 2f 0a 20 20 6e 4c 65 6e 20 3d  t..  */.  nLen =
26a60 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
26a70 28 7a 42 75 66 29 3b 0a 20 20 69 66 28 20 28 6e  (zBuf);.  if( (n
26a80 4c 65 6e 20 2b 20 6e 50 72 65 20 2b 20 31 37 29  Len + nPre + 17)
26a90 20 3e 20 6e 42 75 66 20 29 7b 0a 20 20 20 20 73   > nBuf ){.    s
26aa0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
26ab0 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
26ac0 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
26ad0 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e  c=SQLITE_ERROR\n
26ae0 22 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  "));.    return 
26af0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
26b00 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77 69  TE_ERROR, 0, "wi
26b10 6e 47 65 74 54 65 6d 70 6e 61 6d 65 35 22 2c 20  nGetTempname5", 
26b20 30 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  0);.  }..  sqlit
26b30 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
26b40 2d 31 36 2d 6e 4c 65 6e 2c 20 7a 42 75 66 2b 6e  -16-nLen, zBuf+n
26b50 4c 65 6e 2c 20 53 51 4c 49 54 45 5f 54 45 4d 50  Len, SQLITE_TEMP
26b60 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 3b 0a 0a  _FILE_PREFIX);..
26b70 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 53 74 72    j = sqlite3Str
26b80 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 73  len30(zBuf);.  s
26b90 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
26ba0 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b  s(15, &zBuf[j]);
26bb0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35  .  for(i=0; i<15
26bc0 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
26bd0 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72   zBuf[j] = (char
26be0 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67  )zChars[ ((unsig
26bf0 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d  ned char)zBuf[j]
26c00 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73  )%(sizeof(zChars
26c10 29 2d 31 29 20 5d 3b 0a 20 20 7d 0a 20 20 7a 42  )-1) ];.  }.  zB
26c20 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7a 42 75  uf[j] = 0;.  zBu
26c30 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 20 20 2a 70  f[j+1] = 0;.  *p
26c40 7a 42 75 66 20 3d 20 7a 42 75 66 3b 0a 0a 20 20  zBuf = zBuf;..  
26c50 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
26c60 49 4c 45 4e 41 4d 45 20 6e 61 6d 65 3d 25 73 2c  ILENAME name=%s,
26c70 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
26c80 2c 20 7a 42 75 66 29 29 3b 0a 20 20 72 65 74 75  , zBuf));.  retu
26c90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
26ca0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
26cb0 55 45 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  UE if the named 
26cc0 66 69 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61  file is really a
26cd0 20 64 69 72 65 63 74 6f 72 79 2e 20 20 52 65 74   directory.  Ret
26ce0 75 72 6e 20 66 61 6c 73 65 20 69 66 0a 2a 2a 20  urn false if.** 
26cf0 69 74 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  it is something 
26d00 6f 74 68 65 72 20 74 68 61 6e 20 61 20 64 69 72  other than a dir
26d10 65 63 74 6f 72 79 2c 20 6f 72 20 69 66 20 74 68  ectory, or if th
26d20 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20  ere is any kind 
26d30 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c  of memory.** all
26d40 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 2e  ocation failure.
26d50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
26d60 69 6e 49 73 44 69 72 28 63 6f 6e 73 74 20 76 6f  inIsDir(const vo
26d70 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 29 7b  id *zConverted){
26d80 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20  .  DWORD attr;. 
26d90 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 44   int rc = 0;.  D
26da0 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  WORD lastErrno;.
26db0 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
26dc0 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  ){.    int cnt =
26dd0 20 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46 49   0;.    WIN32_FI
26de0 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54  LE_ATTRIBUTE_DAT
26df0 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20  A sAttrData;.   
26e00 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44 61   memset(&sAttrDa
26e10 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41  ta, 0, sizeof(sA
26e20 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20 77  ttrData));.    w
26e30 68 69 6c 65 28 20 21 28 72 63 20 3d 20 6f 73 47  hile( !(rc = osG
26e40 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
26e50 45 78 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  ExW((LPCWSTR)zCo
26e60 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
26e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e80 20 20 20 20 20 20 47 65 74 46 69 6c 65 45 78 49        GetFileExI
26e90 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20 20  nfoStandard,.   
26ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26eb0 20 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72            &sAttr
26ec0 44 61 74 61 29 29 20 26 26 20 77 69 6e 52 65 74  Data)) && winRet
26ed0 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c  ryIoerr(&cnt, &l
26ee0 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20  astErrno) ){}.  
26ef0 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20    if( !rc ){.   
26f00 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
26f10 49 6e 76 61 6c 69 64 20 6e 61 6d 65 3f 20 2a 2f  Invalid name? */
26f20 0a 20 20 20 20 7d 0a 20 20 20 20 61 74 74 72 20  .    }.    attr 
26f30 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77 46 69  = sAttrData.dwFi
26f40 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a 23 69  leAttributes;.#i
26f50 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
26f60 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E==0.  }else{.  
26f70 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69    attr = osGetFi
26f80 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 28 63  leAttributesA((c
26f90 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29  har*)zConverted)
26fa0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72  ;.#endif.  }.  r
26fb0 65 74 75 72 6e 20 28 61 74 74 72 21 3d 49 4e 56  eturn (attr!=INV
26fc0 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
26fd0 55 54 45 53 29 20 26 26 20 28 61 74 74 72 26 46  UTES) && (attr&F
26fe0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49  ILE_ATTRIBUTE_DI
26ff0 52 45 43 54 4f 52 59 29 3b 0a 7d 0a 0a 2f 2a 0a  RECTORY);.}../*.
27000 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 2e 0a  ** Open a file..
27010 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
27020 6e 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  nOpen(.  sqlite3
27030 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
27040 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 67 65     /* Used to ge
27050 74 20 6d 61 78 69 6d 75 6d 20 70 61 74 68 20 6c  t maximum path l
27060 65 6e 67 74 68 20 61 6e 64 20 41 70 70 44 61 74  ength and AppDat
27070 61 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  a */.  const cha
27080 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20  r *zName,       
27090 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
270a0 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a  file (UTF-8) */.
270b0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
270c0 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57  id,         /* W
270d0 72 69 74 65 20 74 68 65 20 53 51 4c 69 74 65 20  rite the SQLite 
270e0 66 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65  file handle here
270f0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
27100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27110 2f 2a 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61  /* Open mode fla
27120 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75  gs */.  int *pOu
27130 74 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  tFlags          
27140 20 20 2f 2a 20 53 74 61 74 75 73 20 72 65 74 75    /* Status retu
27150 72 6e 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  rn flags */.){. 
27160 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f   HANDLE h;.  DWO
27170 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30  RD lastErrno = 0
27180 3b 0a 20 20 44 57 4f 52 44 20 64 77 44 65 73 69  ;.  DWORD dwDesi
27190 72 65 64 41 63 63 65 73 73 3b 0a 20 20 44 57 4f  redAccess;.  DWO
271a0 52 44 20 64 77 53 68 61 72 65 4d 6f 64 65 3b 0a  RD dwShareMode;.
271b0 20 20 44 57 4f 52 44 20 64 77 43 72 65 61 74 69    DWORD dwCreati
271c0 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 3b 0a 20  onDisposition;. 
271d0 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 41 6e   DWORD dwFlagsAn
271e0 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 30 3b  dAttributes = 0;
271f0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
27200 49 4e 43 45 0a 20 20 69 6e 74 20 69 73 54 65 6d  INCE.  int isTem
27210 70 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  p = 0;.#endif.  
27220 77 69 6e 56 66 73 41 70 70 44 61 74 61 20 2a 70  winVfsAppData *p
27230 41 70 70 44 61 74 61 3b 0a 20 20 77 69 6e 46 69  AppData;.  winFi
27240 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
27250 46 69 6c 65 2a 29 69 64 3b 0a 20 20 76 6f 69 64  File*)id;.  void
27260 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 20 20 20   *zConverted;   
27270 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
27280 6c 65 6e 61 6d 65 20 69 6e 20 4f 53 20 65 6e 63  lename in OS enc
27290 6f 64 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74  oding */.  const
272a0 20 63 68 61 72 20 2a 7a 55 74 66 38 4e 61 6d 65   char *zUtf8Name
272b0 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a 20 46 69 6c   = zName; /* Fil
272c0 65 6e 61 6d 65 20 69 6e 20 55 54 46 2d 38 20 65  ename in UTF-8 e
272d0 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  ncoding */.  int
272e0 20 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20   cnt = 0;..  /* 
272f0 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74  If argument zPat
27300 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  h is a NULL poin
27310 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ter, this functi
27320 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74  on is required t
27330 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65  o open.  ** a te
27340 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73  mporary file. Us
27350 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f  e this buffer to
27360 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20   store the file 
27370 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  name in..  */.  
27380 63 68 61 72 20 2a 7a 54 6d 70 6e 61 6d 65 20 3d  char *zTmpname =
27390 20 30 3b 20 2f 2a 20 46 6f 72 20 74 65 6d 70 6f   0; /* For tempo
273a0 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 2c 20 69  rary filename, i
273b0 66 20 6e 65 63 65 73 73 61 72 79 2e 20 2a 2f 0a  f necessary. */.
273c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
273d0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
273e0 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65    /* Function Re
273f0 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 23 69 66  turn Code */.#if
27400 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
27410 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57  ) || SQLITE_OS_W
27420 49 4e 43 45 0a 20 20 69 6e 74 20 65 54 79 70 65  INCE.  int eType
27430 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46   = flags&0xFFFFF
27440 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66  F00;  /* Type of
27450 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
27460 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e 74 20 69  .#endif..  int i
27470 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66  sExclusive  = (f
27480 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
27490 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20  EN_EXCLUSIVE);. 
274a0 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20   int isDelete   
274b0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
274c0 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
274d0 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69  NCLOSE);.  int i
274e0 73 43 72 65 61 74 65 20 20 20 20 20 3d 20 28 66  sCreate     = (f
274f0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
27500 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69 6e  EN_CREATE);.  in
27510 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d  t isReadonly   =
27520 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
27530 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
27540 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57 72 69  .  int isReadWri
27550 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  te  = (flags & S
27560 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
27570 52 49 54 45 29 3b 0a 0a 23 69 66 6e 64 65 66 20  RITE);..#ifndef 
27580 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 69 73 4f  NDEBUG.  int isO
27590 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 69 73  penJournal = (is
275a0 43 72 65 61 74 65 20 26 26 20 28 0a 20 20 20 20  Create && (.    
275b0 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c 49 54      eType==SQLIT
275c0 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
275d0 55 52 4e 41 4c 0a 20 20 20 20 20 7c 7c 20 65 54  URNAL.     || eT
275e0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
275f0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 0a 20 20  _MAIN_JOURNAL.  
27600 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
27610 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29  ITE_OPEN_WAL.  )
27620 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54  );.#endif..  OST
27630 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65  RACE(("OPEN name
27640 3d 25 73 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66  =%s, pFile=%p, f
27650 6c 61 67 73 3d 25 78 2c 20 70 4f 75 74 46 6c 61  lags=%x, pOutFla
27660 67 73 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20  gs=%p\n",.      
27670 20 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 2c 20       zUtf8Name, 
27680 69 64 2c 20 66 6c 61 67 73 2c 20 70 4f 75 74 46  id, flags, pOutF
27690 6c 61 67 73 29 29 3b 0a 0a 20 20 2f 2a 20 43 68  lags));..  /* Ch
276a0 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  eck the followin
276b0 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  g statements are
276c0 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   true:.  **.  **
276d0 20 20 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f     (a) Exactly o
276e0 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44 57 52  ne of the READWR
276f0 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59  ITE and READONLY
27700 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73   flags must be s
27710 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28  et, and.  **   (
27720 62 29 20 69 66 20 43 52 45 41 54 45 20 69 73 20  b) if CREATE is 
27730 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52  set, then READWR
27740 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ITE must also be
27750 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20   set, and.  **  
27760 20 28 63 29 20 69 66 20 45 58 43 4c 55 53 49 56   (c) if EXCLUSIV
27770 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
27780 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
27790 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28  be set..  **   (
277a0 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c  d) if DELETEONCL
277b0 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  OSE is set, then
277c0 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73   CREATE must als
277d0 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  o be set..  */. 
277e0 20 61 73 73 65 72 74 28 28 69 73 52 65 61 64 6f   assert((isReado
277f0 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64  nly==0 || isRead
27800 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73  Write==0) && (is
27810 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52  ReadWrite || isR
27820 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73  eadonly));.  ass
27830 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20  ert(isCreate==0 
27840 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 29 3b  || isReadWrite);
27850 0a 20 20 61 73 73 65 72 74 28 69 73 45 78 63 6c  .  assert(isExcl
27860 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72  usive==0 || isCr
27870 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  eate);.  assert(
27880 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69  isDelete==0 || i
27890 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20  sCreate);..  /* 
278a0 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69  The main DB, mai
278b0 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66  n journal, WAL f
278c0 69 6c 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a  ile and master j
278d0 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72  ournal are never
278e0 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  .  ** automatica
278f0 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72  lly deleted. Nor
27900 20 61 72 65 20 74 68 65 79 20 65 76 65 72 20 74   are they ever t
27910 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20  emporary files. 
27920 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21   */.  assert( (!
27930 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
27940 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
27950 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
27960 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
27970 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
27980 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
27990 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
279a0 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72  URNAL );.  asser
279b0 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
279c0 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
279d0 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
279e0 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  STER_JOURNAL );.
279f0 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
27a00 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
27a10 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
27a20 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f  OPEN_WAL );..  /
27a30 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  * Assert that th
27a40 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61  e upper layer ha
27a50 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65  s set one of the
27a60 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61   "file-type" fla
27a70 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  gs. */.  assert(
27a80 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
27a90 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20  PEN_MAIN_DB     
27aa0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
27ab0 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 0a 20  E_OPEN_TEMP_DB. 
27ac0 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
27ad0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
27ae0 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70  _JOURNAL || eTyp
27af0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
27b00 45 4d 50 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20  EMP_JOURNAL.    
27b10 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
27b20 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
27b30 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  NAL   || eType==
27b40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
27b50 45 52 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20  ER_JOURNAL.     
27b60 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
27b70 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e  TE_OPEN_TRANSIEN
27b80 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53  T_DB || eType==S
27b90 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20  QLITE_OPEN_WAL. 
27ba0 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
27bb0 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 6d 65 6d  File!=0 );.  mem
27bc0 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69  set(pFile, 0, si
27bd0 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 29 3b 0a  zeof(winFile));.
27be0 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 49 4e 56    pFile->h = INV
27bf0 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
27c00 45 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  E;..#if SQLITE_O
27c10 53 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 21 7a  S_WINRT.  if( !z
27c20 55 74 66 38 4e 61 6d 65 20 26 26 20 21 73 71 6c  Utf8Name && !sql
27c30 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
27c40 6f 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ory ){.    sqlit
27c50 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 45 52  e3_log(SQLITE_ER
27c60 52 4f 52 2c 0a 20 20 20 20 20 20 20 20 22 73 71  ROR,.        "sq
27c70 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
27c80 74 6f 72 79 20 76 61 72 69 61 62 6c 65 20 73 68  tory variable sh
27c90 6f 75 6c 64 20 62 65 20 73 65 74 20 66 6f 72 20  ould be set for 
27ca0 57 69 6e 52 54 22 29 3b 0a 20 20 7d 0a 23 65 6e  WinRT");.  }.#en
27cb0 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
27cc0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
27cd0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
27ce0 6e 20 69 73 20 4e 55 4c 4c 2c 20 67 65 6e 65 72  n is NULL, gener
27cf0 61 74 65 20 61 0a 20 20 2a 2a 20 74 65 6d 70 6f  ate a.  ** tempo
27d00 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 74  rary file name t
27d10 6f 20 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28  o use.  */.  if(
27d20 20 21 7a 55 74 66 38 4e 61 6d 65 20 29 7b 0a 20   !zUtf8Name ){. 
27d30 20 20 20 61 73 73 65 72 74 28 20 69 73 44 65 6c     assert( isDel
27d40 65 74 65 20 26 26 20 21 69 73 4f 70 65 6e 4a 6f  ete && !isOpenJo
27d50 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 72 63 20  urnal );.    rc 
27d60 3d 20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65  = winGetTempname
27d70 28 70 56 66 73 2c 20 26 7a 54 6d 70 6e 61 6d 65  (pVfs, &zTmpname
27d80 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
27d90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27da0 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
27db0 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73 22   name=%s, rc=%s"
27dc0 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 20 73 71 6c  , zUtf8Name, sql
27dd0 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
27de0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
27df0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55  rc;.    }.    zU
27e00 74 66 38 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61  tf8Name = zTmpna
27e10 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 61  me;.  }..  /* Da
27e20 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 73  tabase filenames
27e30 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f   are double-zero
27e40 20 74 65 72 6d 69 6e 61 74 65 64 20 69 66 20 74   terminated if t
27e50 68 65 79 20 61 72 65 20 6e 6f 74 0a 20 20 2a 2a  hey are not.  **
27e60 20 55 52 49 73 20 77 69 74 68 20 70 61 72 61 6d   URIs with param
27e70 65 74 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 74  eters.  Hence, t
27e80 68 65 79 20 63 61 6e 20 61 6c 77 61 79 73 20 62  hey can always b
27e90 65 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20  e passed into.  
27ea0 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70  ** sqlite3_uri_p
27eb0 61 72 61 6d 65 74 65 72 28 29 2e 0a 20 20 2a 2f  arameter()..  */
27ec0 0a 20 20 61 73 73 65 72 74 28 20 28 65 54 79 70  .  assert( (eTyp
27ed0 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
27ee0 41 49 4e 5f 44 42 29 20 7c 7c 20 28 66 6c 61 67  AIN_DB) || (flag
27ef0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
27f00 55 52 49 29 20 7c 7c 0a 20 20 20 20 20 20 20 7a  URI) ||.       z
27f10 55 74 66 38 4e 61 6d 65 5b 73 71 6c 69 74 65 33  Utf8Name[sqlite3
27f20 53 74 72 6c 65 6e 33 30 28 7a 55 74 66 38 4e 61  Strlen30(zUtf8Na
27f30 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20  me)+1]==0 );..  
27f40 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 66  /* Convert the f
27f50 69 6c 65 6e 61 6d 65 20 74 6f 20 74 68 65 20 73  ilename to the s
27f60 79 73 74 65 6d 20 65 6e 63 6f 64 69 6e 67 2e 20  ystem encoding. 
27f70 2a 2f 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20  */.  zConverted 
27f80 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d  = winConvertFrom
27f90 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 55 74  Utf8Filename(zUt
27fa0 66 38 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  f8Name);.  if( z
27fb0 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a  Converted==0 ){.
27fc0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
27fd0 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20  (zTmpname);.    
27fe0 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e  OSTRACE(("OPEN n
27ff0 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54  ame=%s, rc=SQLIT
28000 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22 2c 20  E_IOERR_NOMEM", 
28010 7a 55 74 66 38 4e 61 6d 65 29 29 3b 0a 20 20 20  zUtf8Name));.   
28020 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
28030 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
28040 0a 20 20 7d 0a 0a 20 20 69 66 28 20 77 69 6e 49  .  }..  if( winI
28050 73 44 69 72 28 7a 43 6f 6e 76 65 72 74 65 64 29  sDir(zConverted)
28060 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
28070 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
28080 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
28090 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20  ee(zTmpname);.  
280a0 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
280b0 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c   name=%s, rc=SQL
280c0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44  ITE_CANTOPEN_ISD
280d0 49 52 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 29  IR", zUtf8Name))
280e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
280f0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44  ITE_CANTOPEN_ISD
28100 49 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69  IR;.  }..  if( i
28110 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20  sReadWrite ){.  
28120 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
28130 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44  s = GENERIC_READ
28140 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45   | GENERIC_WRITE
28150 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
28160 77 44 65 73 69 72 65 64 41 63 63 65 73 73 20 3d  wDesiredAccess =
28170 20 47 45 4e 45 52 49 43 5f 52 45 41 44 3b 0a 20   GENERIC_READ;. 
28180 20 7d 0a 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f   }..  /* SQLITE_
28190 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 69  OPEN_EXCLUSIVE i
281a0 73 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73  s used to make s
281b0 75 72 65 20 74 68 61 74 20 61 20 6e 65 77 20 66  ure that a new f
281c0 69 6c 65 20 69 73 0a 20 20 2a 2a 20 63 72 65 61  ile is.  ** crea
281d0 74 65 64 2e 20 53 51 4c 69 74 65 20 64 6f 65 73  ted. SQLite does
281e0 6e 27 74 20 75 73 65 20 69 74 20 74 6f 20 69 6e  n't use it to in
281f0 64 69 63 61 74 65 20 22 65 78 63 6c 75 73 69 76  dicate "exclusiv
28200 65 20 61 63 63 65 73 73 22 0a 20 20 2a 2a 20 61  e access".  ** a
28210 73 20 69 74 20 69 73 20 75 73 75 61 6c 6c 79 20  s it is usually 
28220 75 6e 64 65 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f  understood..  */
28230 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75 73 69  .  if( isExclusi
28240 76 65 20 29 7b 0a 20 20 20 20 2f 2a 20 43 72 65  ve ){.    /* Cre
28250 61 74 65 73 20 61 20 6e 65 77 20 66 69 6c 65 2c  ates a new file,
28260 20 6f 6e 6c 79 20 69 66 20 69 74 20 64 6f 65 73   only if it does
28270 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
28280 73 74 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66  st. */.    /* If
28290 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73   the file exists
282a0 2c 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20  , it fails. */. 
282b0 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73     dwCreationDis
282c0 70 6f 73 69 74 69 6f 6e 20 3d 20 43 52 45 41 54  position = CREAT
282d0 45 5f 4e 45 57 3b 0a 20 20 7d 65 6c 73 65 20 69  E_NEW;.  }else i
282e0 66 28 20 69 73 43 72 65 61 74 65 20 29 7b 0a 20  f( isCreate ){. 
282f0 20 20 20 2f 2a 20 4f 70 65 6e 20 65 78 69 73 74     /* Open exist
28300 69 6e 67 20 66 69 6c 65 2c 20 6f 72 20 63 72 65  ing file, or cre
28310 61 74 65 20 69 66 20 69 74 20 64 6f 65 73 6e 27  ate if it doesn'
28320 74 20 65 78 69 73 74 20 2a 2f 0a 20 20 20 20 64  t exist */.    d
28330 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
28340 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41  tion = OPEN_ALWA
28350 59 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  YS;.  }else{.   
28360 20 2f 2a 20 4f 70 65 6e 73 20 61 20 66 69 6c 65   /* Opens a file
28370 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 65 78 69  , only if it exi
28380 73 74 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72  sts. */.    dwCr
28390 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
283a0 6e 20 3d 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e  n = OPEN_EXISTIN
283b0 47 3b 0a 20 20 7d 0a 0a 20 20 64 77 53 68 61 72  G;.  }..  dwShar
283c0 65 4d 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48 41  eMode = FILE_SHA
283d0 52 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f 53  RE_READ | FILE_S
283e0 48 41 52 45 5f 57 52 49 54 45 3b 0a 0a 20 20 69  HARE_WRITE;..  i
283f0 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23  f( isDelete ){.#
28400 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
28410 43 45 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e  CE.    dwFlagsAn
28420 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49  dAttributes = FI
28430 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44  LE_ATTRIBUTE_HID
28440 44 45 4e 3b 0a 20 20 20 20 69 73 54 65 6d 70 20  DEN;.    isTemp 
28450 3d 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64  = 1;.#else.    d
28460 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
28470 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49  tes = FILE_ATTRI
28480 42 55 54 45 5f 54 45 4d 50 4f 52 41 52 59 0a 20  BUTE_TEMPORARY. 
28490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
284b0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48  FILE_ATTRIBUTE_H
284c0 49 44 44 45 4e 0a 20 20 20 20 20 20 20 20 20 20  IDDEN.          
284d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284e0 20 20 20 20 20 7c 20 46 49 4c 45 5f 46 4c 41 47       | FILE_FLAG
284f0 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45  _DELETE_ON_CLOSE
28500 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
28510 7b 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64  {.    dwFlagsAnd
28520 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c  Attributes = FIL
28530 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d  E_ATTRIBUTE_NORM
28540 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 70  AL;.  }.  /* Rep
28550 6f 72 74 73 20 66 72 6f 6d 20 74 68 65 20 69 6e  orts from the in
28560 74 65 72 6e 65 74 20 61 72 65 20 74 68 61 74 20  ternet are that 
28570 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 73 20 61  performance is a
28580 6c 77 61 79 73 0a 20 20 2a 2a 20 62 65 74 74 65  lways.  ** bette
28590 72 20 69 66 20 46 49 4c 45 5f 46 4c 41 47 5f 52  r if FILE_FLAG_R
285a0 41 4e 44 4f 4d 5f 41 43 43 45 53 53 20 69 73 20  ANDOM_ACCESS is 
285b0 75 73 65 64 2e 20 20 54 69 63 6b 65 74 20 23 32  used.  Ticket #2
285c0 36 39 39 2e 20 2a 2f 0a 23 69 66 20 53 51 4c 49  699. */.#if SQLI
285d0 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 64 77  TE_OS_WINCE.  dw
285e0 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
285f0 65 73 20 7c 3d 20 46 49 4c 45 5f 46 4c 41 47 5f  es |= FILE_FLAG_
28600 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 23  RANDOM_ACCESS;.#
28610 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6f 73 49  endif..  if( osI
28620 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c  sNT() ){.#if SQL
28630 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
28640 20 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54   CREATEFILE2_EXT
28650 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53  ENDED_PARAMETERS
28660 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
28670 65 72 73 3b 0a 20 20 20 20 65 78 74 65 6e 64 65  ers;.    extende
28680 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53 69  dParameters.dwSi
28690 7a 65 20 3d 20 73 69 7a 65 6f 66 28 43 52 45 41  ze = sizeof(CREA
286a0 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44  TEFILE2_EXTENDED
286b0 5f 50 41 52 41 4d 45 54 45 52 53 29 3b 0a 20 20  _PARAMETERS);.  
286c0 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65    extendedParame
286d0 74 65 72 73 2e 64 77 46 69 6c 65 41 74 74 72 69  ters.dwFileAttri
286e0 62 75 74 65 73 20 3d 0a 20 20 20 20 20 20 20 20  butes =.        
286f0 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74      dwFlagsAndAt
28700 74 72 69 62 75 74 65 73 20 26 20 46 49 4c 45 5f  tributes & FILE_
28710 41 54 54 52 49 42 55 54 45 5f 4d 41 53 4b 3b 0a  ATTRIBUTE_MASK;.
28720 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61      extendedPara
28730 6d 65 74 65 72 73 2e 64 77 46 69 6c 65 46 6c 61  meters.dwFileFla
28740 67 73 20 3d 20 64 77 46 6c 61 67 73 41 6e 64 41  gs = dwFlagsAndA
28750 74 74 72 69 62 75 74 65 73 20 26 20 46 49 4c 45  ttributes & FILE
28760 5f 46 4c 41 47 5f 4d 41 53 4b 3b 0a 20 20 20 20  _FLAG_MASK;.    
28770 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65  extendedParamete
28780 72 73 2e 64 77 53 65 63 75 72 69 74 79 51 6f 73  rs.dwSecurityQos
28790 46 6c 61 67 73 20 3d 20 53 45 43 55 52 49 54 59  Flags = SECURITY
287a0 5f 41 4e 4f 4e 59 4d 4f 55 53 3b 0a 20 20 20 20  _ANONYMOUS;.    
287b0 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65  extendedParamete
287c0 72 73 2e 6c 70 53 65 63 75 72 69 74 79 41 74 74  rs.lpSecurityAtt
287d0 72 69 62 75 74 65 73 20 3d 20 4e 55 4c 4c 3b 0a  ributes = NULL;.
287e0 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61      extendedPara
287f0 6d 65 74 65 72 73 2e 68 54 65 6d 70 6c 61 74 65  meters.hTemplate
28800 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  File = NULL;.   
28810 20 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43   while( (h = osC
28820 72 65 61 74 65 46 69 6c 65 32 28 28 4c 50 43 57  reateFile2((LPCW
28830 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a  STR)zConverted,.
28840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
28860 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20  DesiredAccess,. 
28870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28880 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 53               dwS
28890 68 61 72 65 4d 6f 64 65 2c 0a 20 20 20 20 20 20  hareMode,.      
288a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288b0 20 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69          dwCreati
288c0 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20  onDisposition,. 
288d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288e0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 65 78               &ex
288f0 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73  tendedParameters
28900 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ))==INVALID_HAND
28910 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20  LE_VALUE &&.    
28920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28930 20 20 20 20 20 20 20 20 20 20 77 69 6e 52 65 74            winRet
28940 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c  ryIoerr(&cnt, &l
28950 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20  astErrno) ){.   
28960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
28970 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6c  oop */.    }.#el
28980 73 65 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68  se.    while( (h
28990 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 57   = osCreateFileW
289a0 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
289b0 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
289c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289d0 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63      dwDesiredAcc
289e0 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ess,.           
289f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a00 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 20     dwShareMode, 
28a10 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
28a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a30 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69      dwCreationDi
28a40 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20  sposition,.     
28a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a60 20 20 20 20 20 20 20 20 20 64 77 46 6c 61 67 73           dwFlags
28a70 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a 20  AndAttributes,. 
28a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a90 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c               NUL
28aa0 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  L))==INVALID_HAN
28ab0 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20  DLE_VALUE &&.   
28ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ad0 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 52 65             winRe
28ae0 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
28af0 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20  lastErrno) ){.  
28b00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28b10 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 23 65  Noop */.    }.#e
28b20 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20  ndif.  }.#ifdef 
28b30 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
28b40 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
28b50 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73    while( (h = os
28b60 43 72 65 61 74 65 46 69 6c 65 41 28 28 4c 50 43  CreateFileA((LPC
28b70 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a  STR)zConverted,.
28b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
28ba0 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20  DesiredAccess,. 
28bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 53               dwS
28bd0 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a  hareMode, NULL,.
28be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
28c00 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
28c10 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ion,.           
28c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c30 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
28c40 72 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20  ributes,.       
28c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c60 20 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49         NULL))==I
28c70 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
28c80 4c 55 45 20 26 26 0a 20 20 20 20 20 20 20 20 20  LUE &&.         
28c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ca0 20 20 20 20 20 77 69 6e 52 65 74 72 79 49 6f 65       winRetryIoe
28cb0 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
28cc0 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  rno) ){.        
28cd0 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a         /* Noop *
28ce0 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  /.    }.  }.#end
28cf0 69 66 0a 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72  if.  winLogIoerr
28d00 28 63 6e 74 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  (cnt, __LINE__);
28d10 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50  ..  OSTRACE(("OP
28d20 45 4e 20 66 69 6c 65 3d 25 70 2c 20 6e 61 6d 65  EN file=%p, name
28d30 3d 25 73 2c 20 61 63 63 65 73 73 3d 25 6c 78 2c  =%s, access=%lx,
28d40 20 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55   rc=%s\n", h, zU
28d50 74 66 38 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  tf8Name,.       
28d60 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63      dwDesiredAcc
28d70 65 73 73 2c 20 28 68 3d 3d 49 4e 56 41 4c 49 44  ess, (h==INVALID
28d80 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 3f  _HANDLE_VALUE) ?
28d90 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22   "failed" : "ok"
28da0 29 29 3b 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e  ));..  if( h==IN
28db0 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
28dc0 55 45 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  UE ){.    pFile-
28dd0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
28de0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c  tErrno;.    winL
28df0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
28e00 41 4e 54 4f 50 45 4e 2c 20 70 46 69 6c 65 2d 3e  ANTOPEN, pFile->
28e10 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 4f  lastErrno, "winO
28e20 70 65 6e 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29  pen", zUtf8Name)
28e30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
28e40 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
28e50 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
28e60 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20  (zTmpname);.    
28e70 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
28e80 26 26 20 21 69 73 45 78 63 6c 75 73 69 76 65 20  && !isExclusive 
28e90 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
28ea0 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e  winOpen(pVfs, zN
28eb0 61 6d 65 2c 20 69 64 2c 0a 20 20 20 20 20 20 20  ame, id,.       
28ec0 20 20 28 28 66 6c 61 67 73 7c 53 51 4c 49 54 45    ((flags|SQLITE
28ed0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 20  _OPEN_READONLY) 
28ee0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
28ef0 20 20 20 20 20 20 20 7e 28 53 51 4c 49 54 45 5f         ~(SQLITE_
28f00 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49  OPEN_CREATE|SQLI
28f10 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
28f20 45 29 29 2c 0a 20 20 20 20 20 20 20 20 20 70 4f  E)),.         pO
28f30 75 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65  utFlags);.    }e
28f40 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
28f50 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
28f60 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  N_BKPT;.    }.  
28f70 7d 0a 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61  }..  if( pOutFla
28f80 67 73 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  gs ){.    if( is
28f90 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20  ReadWrite ){.   
28fa0 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20     *pOutFlags = 
28fb0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
28fc0 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65  WRITE;.    }else
28fd0 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61  {.      *pOutFla
28fe0 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs = SQLITE_OPEN
28ff0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d  _READONLY;.    }
29000 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28  .  }..  OSTRACE(
29010 28 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c 20  ("OPEN file=%p, 
29020 6e 61 6d 65 3d 25 73 2c 20 61 63 63 65 73 73 3d  name=%s, access=
29030 25 6c 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d 25  %lx, pOutFlags=%
29040 70 2c 20 2a 70 4f 75 74 46 6c 61 67 73 3d 25 64  p, *pOutFlags=%d
29050 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  , ".           "
29060 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74  rc=%s\n", h, zUt
29070 66 38 4e 61 6d 65 2c 20 64 77 44 65 73 69 72 65  f8Name, dwDesire
29080 64 41 63 63 65 73 73 2c 20 70 4f 75 74 46 6c 61  dAccess, pOutFla
29090 67 73 2c 20 70 4f 75 74 46 6c 61 67 73 20 3f 0a  gs, pOutFlags ?.
290a0 20 20 20 20 20 20 20 20 20 20 20 2a 70 4f 75 74             *pOut
290b0 46 6c 61 67 73 20 3a 20 30 2c 20 28 68 3d 3d 49  Flags : 0, (h==I
290c0 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
290d0 4c 55 45 29 20 3f 20 22 66 61 69 6c 65 64 22 20  LUE) ? "failed" 
290e0 3a 20 22 6f 6b 22 29 29 3b 0a 0a 20 20 70 41 70  : "ok"));..  pAp
290f0 70 44 61 74 61 20 3d 20 28 77 69 6e 56 66 73 41  pData = (winVfsA
29100 70 70 44 61 74 61 2a 29 70 56 66 73 2d 3e 70 41  ppData*)pVfs->pA
29110 70 70 44 61 74 61 3b 0a 0a 23 69 66 20 53 51 4c  ppData;..#if SQL
29120 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b  ITE_OS_WINCE.  {
29130 0a 20 20 20 20 69 66 28 20 69 73 52 65 61 64 57  .    if( isReadW
29140 72 69 74 65 20 26 26 20 65 54 79 70 65 3d 3d 53  rite && eType==S
29150 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
29160 44 42 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  DB.         && (
29170 28 70 41 70 70 44 61 74 61 3d 3d 4e 55 4c 4c 29  (pAppData==NULL)
29180 20 7c 7c 20 21 70 41 70 70 44 61 74 61 2d 3e 62   || !pAppData->b
29190 4e 6f 4c 6f 63 6b 29 0a 20 20 20 20 20 20 20 20  NoLock).        
291a0 20 26 26 20 28 72 63 20 3d 20 77 69 6e 63 65 43   && (rc = winceC
291b0 72 65 61 74 65 4c 6f 63 6b 28 7a 4e 61 6d 65 2c  reateLock(zName,
291c0 20 70 46 69 6c 65 29 29 21 3d 53 51 4c 49 54 45   pFile))!=SQLITE
291d0 5f 4f 4b 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  _OK.    ){.     
291e0 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68   osCloseHandle(h
291f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
29200 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
29210 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
29220 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b  _free(zTmpname);
29230 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
29240 22 4f 50 45 4e 2d 43 45 2d 4c 4f 43 4b 20 6e 61  "OPEN-CE-LOCK na
29250 6d 65 3d 25 73 2c 20 72 63 3d 25 73 5c 6e 22 2c  me=%s, rc=%s\n",
29260 20 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 45   zName, sqlite3E
29270 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
29280 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
29290 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69     }.  }.  if( i
292a0 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 70 46 69  sTemp ){.    pFi
292b0 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  le->zDeleteOnClo
292c0 73 65 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64 3b  se = zConverted;
292d0 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
292e0 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    {.    sqlite3_
292f0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
29300 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
29310 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b  _free(zTmpname);
29320 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  .  pFile->pMetho
29330 64 20 3d 20 70 41 70 70 44 61 74 61 20 3f 20 70  d = pAppData ? p
29340 41 70 70 44 61 74 61 2d 3e 70 4d 65 74 68 6f 64  AppData->pMethod
29350 20 3a 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64 3b   : &winIoMethod;
29360 0a 20 20 70 46 69 6c 65 2d 3e 70 56 66 73 20 3d  .  pFile->pVfs =
29370 20 70 56 66 73 3b 0a 20 20 70 46 69 6c 65 2d 3e   pVfs;.  pFile->
29380 68 20 3d 20 68 3b 0a 20 20 69 66 28 20 69 73 52  h = h;.  if( isR
29390 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 20 20 70  eadonly ){.    p
293a0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
293b0 7c 3d 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c  |= WINFILE_RDONL
293c0 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  Y;.  }.  if( sql
293d0 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
293e0 28 7a 4e 61 6d 65 2c 20 22 70 73 6f 77 22 2c 20  (zName, "psow", 
293f0 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46 45  SQLITE_POWERSAFE
29400 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a 20  _OVERWRITE) ){. 
29410 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
29420 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 50  ags |= WINFILE_P
29430 53 4f 57 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65  SOW;.  }.  pFile
29440 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f  ->lastErrno = NO
29450 5f 45 52 52 4f 52 3b 0a 20 20 70 46 69 6c 65 2d  _ERROR;.  pFile-
29460 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a  >zPath = zName;.
29470 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
29480 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70 46 69  MAP_SIZE>0.  pFi
29490 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b  le->hMap = NULL;
294a0 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  .  pFile->pMapRe
294b0 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 70 46 69 6c  gion = 0;.  pFil
294c0 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b  e->mmapSize = 0;
294d0 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  .  pFile->mmapSi
294e0 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20  zeActual = 0;.  
294f0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
29500 61 78 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  ax = sqlite3Glob
29510 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b  alConfig.szMmap;
29520 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 70 65 6e 43  .#endif..  OpenC
29530 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 72 65  ounter(+1);.  re
29540 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
29550 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6e 61 6d  * Delete the nam
29560 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e  ed file..**.** N
29570 6f 74 65 20 74 68 61 74 20 57 69 6e 64 6f 77 73  ote that Windows
29580 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20   does not allow 
29590 61 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c  a file to be del
295a0 65 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68  eted if some oth
295b0 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 68 61  er.** process ha
295c0 73 20 69 74 20 6f 70 65 6e 2e 20 20 53 6f 6d 65  s it open.  Some
295d0 74 69 6d 65 73 20 61 20 76 69 72 75 73 20 73 63  times a virus sc
295e0 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65 78 69 6e  anner or indexin
295f0 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 77 69 6c  g program.** wil
29600 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c  l open a journal
29610 20 66 69 6c 65 20 73 68 6f 72 74 6c 79 20 61 66   file shortly af
29620 74 65 72 20 69 74 20 69 73 20 63 72 65 61 74 65  ter it is create
29630 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f  d in order to do
29640 0a 2a 2a 20 77 68 61 74 65 76 65 72 20 69 74 20  .** whatever it 
29650 64 6f 65 73 2e 20 20 57 68 69 6c 65 20 74 68 69  does.  While thi
29660 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  s other process 
29670 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 2a  is holding the.*
29680 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20 77 65 20  * file open, we 
29690 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c 65 20 74  will be unable t
296a0 6f 20 64 65 6c 65 74 65 20 69 74 2e 20 20 54 6f  o delete it.  To
296b0 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69   work around thi
296c0 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20 77 65  s.** problem, we
296d0 20 64 65 6c 61 79 20 31 30 30 20 6d 69 6c 6c 69   delay 100 milli
296e0 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20  seconds and try 
296f0 74 6f 20 64 65 6c 65 74 65 20 61 67 61 69 6e 2e  to delete again.
29700 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f 44 45    Up.** to MX_DE
29710 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 73 20  LETION_ATTEMPTs 
29720 64 65 6c 65 74 69 6f 6e 20 61 74 74 65 6d 70 74  deletion attempt
29730 73 20 61 72 65 20 72 75 6e 20 62 65 66 6f 72 65  s are run before
29740 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70 20 61 6e   giving.** up an
29750 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  d returning an e
29760 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
29770 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 0a 20  int winDelete(. 
29780 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
29790 66 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fs,          /* 
297a0 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33  Not used on win3
297b0 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  2 */.  const cha
297c0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
297d0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69     /* Name of fi
297e0 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a  le to delete */.
297f0 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20 20 20    int syncDir   
29800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29810 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e   Not used on win
29820 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63  32 */.){.  int c
29830 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  nt = 0;.  int rc
29840 3b 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a  ;.  DWORD attr;.
29850 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
29860 6f 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20 2a 7a  o = 0;.  void *z
29870 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55  Converted;.  UNU
29880 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
29890 66 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  fs);.  UNUSED_PA
298a0 52 41 4d 45 54 45 52 28 73 79 6e 63 44 69 72 29  RAMETER(syncDir)
298b0 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
298c0 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
298d0 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29  TE_IOERR_DELETE)
298e0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 45  ;.  OSTRACE(("DE
298f0 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 73 79  LETE name=%s, sy
29900 6e 63 44 69 72 3d 25 64 5c 6e 22 2c 20 7a 46 69  ncDir=%d\n", zFi
29910 6c 65 6e 61 6d 65 2c 20 73 79 6e 63 44 69 72 29  lename, syncDir)
29920 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64  );..  zConverted
29930 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f   = winConvertFro
29940 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46  mUtf8Filename(zF
29950 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
29960 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
29970 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44  .    OSTRACE(("D
29980 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 72  ELETE name=%s, r
29990 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
299a0 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61  OMEM\n", zFilena
299b0 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  me));.    return
299c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
299d0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
299e0 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
299f0 20 20 20 20 64 6f 20 7b 0a 23 69 66 20 53 51 4c      do {.#if SQL
29a00 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
29a10 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54     WIN32_FILE_AT
29a20 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41 74  TRIBUTE_DATA sAt
29a30 74 72 44 61 74 61 3b 0a 20 20 20 20 20 20 6d 65  trData;.      me
29a40 6d 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c  mset(&sAttrData,
29a50 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72   0, sizeof(sAttr
29a60 44 61 74 61 29 29 3b 0a 20 20 20 20 20 20 69 66  Data));.      if
29a70 20 28 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   ( osGetFileAttr
29a80 69 62 75 74 65 73 45 78 57 28 7a 43 6f 6e 76 65  ibutesExW(zConve
29a90 72 74 65 64 2c 20 47 65 74 46 69 6c 65 45 78 49  rted, GetFileExI
29aa0 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20 20  nfoStandard,.   
29ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
29ad0 73 41 74 74 72 44 61 74 61 29 20 29 7b 0a 20 20  sAttrData) ){.  
29ae0 20 20 20 20 20 20 61 74 74 72 20 3d 20 73 41 74        attr = sAt
29af0 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74  trData.dwFileAtt
29b00 72 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d  ributes;.      }
29b10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6c 61  else{.        la
29b20 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
29b30 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
29b40 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e      if( lastErrn
29b50 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f  o==ERROR_FILE_NO
29b60 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20  T_FOUND.        
29b70 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45   || lastErrno==E
29b80 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f  RROR_PATH_NOT_FO
29b90 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UND ){.         
29ba0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
29bb0 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b  RR_DELETE_NOENT;
29bc0 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65   /* Already gone
29bd0 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c  ? */.        }el
29be0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
29bf0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
29c00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29c10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
29c20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 61 74  }.#else.      at
29c30 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74  tr = osGetFileAt
29c40 74 72 69 62 75 74 65 73 57 28 7a 43 6f 6e 76 65  tributesW(zConve
29c50 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rted);.#endif.  
29c60 20 20 20 20 69 66 20 28 20 61 74 74 72 3d 3d 49      if ( attr==I
29c70 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
29c80 49 42 55 54 45 53 20 29 7b 0a 20 20 20 20 20 20  IBUTES ){.      
29c90 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
29ca0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
29cb0 20 20 20 20 20 20 20 20 69 66 28 20 6c 61 73 74          if( last
29cc0 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c  Errno==ERROR_FIL
29cd0 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20  E_NOT_FOUND.    
29ce0 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e       || lastErrn
29cf0 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f  o==ERROR_PATH_NO
29d00 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20  T_FOUND ){.     
29d10 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
29d20 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
29d30 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20  ENT; /* Already 
29d40 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20  gone? */.       
29d50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
29d60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
29d70 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROR;.        }. 
29d80 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
29d90 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
29da0 20 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49   attr&FILE_ATTRI
29db0 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 20 29  BUTE_DIRECTORY )
29dc0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
29dd0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20  QLITE_ERROR; /* 
29de0 46 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20  Files only. */. 
29df0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
29e00 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
29e10 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28 7a   osDeleteFileW(z
29e20 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20  Converted) ){.  
29e30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
29e40 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64  E_OK; /* Deleted
29e50 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20   OK. */.        
29e60 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
29e70 20 20 20 20 20 69 66 20 28 20 21 77 69 6e 52 65       if ( !winRe
29e80 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
29e90 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20  lastErrno) ){.  
29ea0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
29eb0 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d  E_ERROR; /* No m
29ec0 6f 72 65 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a  ore retries. */.
29ed0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
29ee0 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 77 68 69       }.    } whi
29ef0 6c 65 28 31 29 3b 0a 20 20 7d 0a 23 69 66 64 65  le(1);.  }.#ifde
29f00 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
29f10 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
29f20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 61      do {.      a
29f30 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41  ttr = osGetFileA
29f40 74 74 72 69 62 75 74 65 73 41 28 7a 43 6f 6e 76  ttributesA(zConv
29f50 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 69 66  erted);.      if
29f60 20 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44   ( attr==INVALID
29f70 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
29f80 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74   ){.        last
29f90 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
29fa0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
29fb0 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d    if( lastErrno=
29fc0 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f  =ERROR_FILE_NOT_
29fd0 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c  FOUND.         |
29fe0 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  | lastErrno==ERR
29ff0 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e  OR_PATH_NOT_FOUN
2a000 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  D ){.          r
2a010 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
2a020 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f  _DELETE_NOENT; /
2a030 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20  * Already gone? 
2a040 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  */.        }else
2a050 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2a060 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2a070 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a080 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2a090 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72 26        if ( attr&
2a0a0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
2a0b0 49 52 45 43 54 4f 52 59 20 29 7b 0a 20 20 20 20  IRECTORY ){.    
2a0c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2a0d0 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20  ERROR; /* Files 
2a0e0 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  only. */.       
2a0f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2a100 20 20 20 20 20 20 69 66 20 28 20 6f 73 44 65 6c        if ( osDel
2a110 65 74 65 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72  eteFileA(zConver
2a120 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ted) ){.        
2a130 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2a140 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a  /* Deleted OK. *
2a150 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
2a160 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2a170 66 20 28 20 21 77 69 6e 52 65 74 72 79 49 6f 65  f ( !winRetryIoe
2a180 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
2a190 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  rno) ){.        
2a1a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
2a1b0 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65  R; /* No more re
2a1c0 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  tries. */.      
2a1d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2a1e0 0a 20 20 20 20 7d 20 77 68 69 6c 65 28 31 29 3b  .    } while(1);
2a1f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
2a200 28 20 72 63 20 26 26 20 72 63 21 3d 53 51 4c 49  ( rc && rc!=SQLI
2a210 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f  TE_IOERR_DELETE_
2a220 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 72 63 20  NOENT ){.    rc 
2a230 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
2a240 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
2a250 45 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77  E, lastErrno, "w
2a260 69 6e 44 65 6c 65 74 65 22 2c 20 7a 46 69 6c 65  inDelete", zFile
2a270 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  name);.  }else{.
2a280 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28      winLogIoerr(
2a290 63 6e 74 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  cnt, __LINE__);.
2a2a0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
2a2b0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
2a2c0 20 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45    OSTRACE(("DELE
2a2d0 54 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 25  TE name=%s, rc=%
2a2e0 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  s\n", zFilename,
2a2f0 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
2a300 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  rc)));.  return 
2a310 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  rc;.}../*.** Che
2a320 63 6b 20 74 68 65 20 65 78 69 73 74 65 6e 63 65  ck the existence
2a330 20 61 6e 64 20 73 74 61 74 75 73 20 6f 66 20 61   and status of a
2a340 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
2a350 20 69 6e 74 20 77 69 6e 41 63 63 65 73 73 28 0a   int winAccess(.
2a360 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
2a370 56 66 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Vfs,         /* 
2a380 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33  Not used on win3
2a390 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  2 */.  const cha
2a3a0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
2a3b0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c    /* Name of fil
2a3c0 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
2a3d0 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
2a3e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
2a3f0 70 65 20 6f 66 20 74 65 73 74 20 74 6f 20 6d 61  pe of test to ma
2a400 6b 65 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20  ke on this file 
2a410 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75  */.  int *pResOu
2a420 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2a430 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 20 2a  /* OUT: Result *
2a440 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74  /.){.  DWORD att
2a450 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  r;.  int rc = 0;
2a460 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
2a470 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20 2a  no = 0;.  void *
2a480 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e  zConverted;.  UN
2a490 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
2a4a0 56 66 73 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  Vfs);..  Simulat
2a4b0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
2a4c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
2a4d0 43 45 53 53 3b 20 29 3b 0a 20 20 4f 53 54 52 41  CESS; );.  OSTRA
2a4e0 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65  CE(("ACCESS name
2a4f0 3d 25 73 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70  =%s, flags=%x, p
2a500 52 65 73 4f 75 74 3d 25 70 5c 6e 22 2c 0a 20 20  ResOut=%p\n",.  
2a510 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61           zFilena
2a520 6d 65 2c 20 66 6c 61 67 73 2c 20 70 52 65 73 4f  me, flags, pResO
2a530 75 74 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72  ut));..  zConver
2a540 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74  ted = winConvert
2a550 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65  FromUtf8Filename
2a560 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
2a570 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
2a580 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
2a590 28 22 41 43 43 45 53 53 20 6e 61 6d 65 3d 25 73  ("ACCESS name=%s
2a5a0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
2a5b0 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c  R_NOMEM\n", zFil
2a5c0 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74  ename));.    ret
2a5d0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2a5e0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
2a5f0 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
2a600 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  ){.    int cnt =
2a610 20 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46 49   0;.    WIN32_FI
2a620 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54  LE_ATTRIBUTE_DAT
2a630 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20  A sAttrData;.   
2a640 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44 61   memset(&sAttrDa
2a650 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41  ta, 0, sizeof(sA
2a660 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20 77  ttrData));.    w
2a670 68 69 6c 65 28 20 21 28 72 63 20 3d 20 6f 73 47  hile( !(rc = osG
2a680 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
2a690 45 78 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  ExW((LPCWSTR)zCo
2a6a0 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
2a6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6c0 20 20 20 20 20 20 47 65 74 46 69 6c 65 45 78 49        GetFileExI
2a6d0 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20 20  nfoStandard,.   
2a6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6f0 20 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72            &sAttr
2a700 44 61 74 61 29 29 20 26 26 20 77 69 6e 52 65 74  Data)) && winRet
2a710 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c  ryIoerr(&cnt, &l
2a720 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20  astErrno) ){}.  
2a730 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2a740 20 20 2f 2a 20 46 6f 72 20 61 6e 20 53 51 4c 49    /* For an SQLI
2a750 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
2a760 20 71 75 65 72 79 2c 20 74 72 65 61 74 20 61 20   query, treat a 
2a770 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 69 6c 65  zero-length file
2a780 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20  .      ** as if 
2a790 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
2a7a0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
2a7b0 20 20 69 66 28 20 20 20 20 66 6c 61 67 73 3d 3d    if(    flags==
2a7c0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
2a7d0 49 53 54 53 0a 20 20 20 20 20 20 20 20 20 20 26  ISTS.          &
2a7e0 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c  & sAttrData.nFil
2a7f0 65 53 69 7a 65 48 69 67 68 3d 3d 30 0a 20 20 20  eSizeHigh==0.   
2a800 20 20 20 20 20 20 20 26 26 20 73 41 74 74 72 44         && sAttrD
2a810 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f 77  ata.nFileSizeLow
2a820 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
2a830 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49  ttr = INVALID_FI
2a840 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20  LE_ATTRIBUTES;. 
2a850 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2a860 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72      attr = sAttr
2a870 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69  Data.dwFileAttri
2a880 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 0a 20  butes;.      }. 
2a890 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a8a0 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 2c  winLogIoerr(cnt,
2a8b0 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
2a8c0 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 21    if( lastErrno!
2a8d0 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f  =ERROR_FILE_NOT_
2a8e0 46 4f 55 4e 44 20 26 26 20 6c 61 73 74 45 72 72  FOUND && lastErr
2a8f0 6e 6f 21 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e  no!=ERROR_PATH_N
2a900 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20  OT_FOUND ){.    
2a910 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2a920 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
2a930 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
2a940 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
2a950 49 4f 45 52 52 5f 41 43 43 45 53 53 2c 20 6c 61  IOERR_ACCESS, la
2a960 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 41 63 63  stErrno, "winAcc
2a970 65 73 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ess",.          
2a980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a990 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
2a9a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a9b0 20 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44    attr = INVALID
2a9c0 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
2a9d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2a9e0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
2a9f0 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
2aa00 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 61 74 74  .  else{.    att
2aa10 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74  r = osGetFileAtt
2aa20 72 69 62 75 74 65 73 41 28 28 63 68 61 72 2a 29  ributesA((char*)
2aa30 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d  zConverted);.  }
2aa40 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
2aa50 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
2aa60 64 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c  d);.  switch( fl
2aa70 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ags ){.    case 
2aa80 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
2aa90 41 44 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c  AD:.    case SQL
2aaa0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
2aab0 53 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74  S:.      rc = at
2aac0 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45  tr!=INVALID_FILE
2aad0 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20  _ATTRIBUTES;.   
2aae0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
2aaf0 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
2ab00 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20  _READWRITE:.    
2ab10 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56    rc = attr!=INV
2ab20 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
2ab30 55 54 45 53 20 26 26 0a 20 20 20 20 20 20 20 20  UTES &&.        
2ab40 20 20 20 20 20 28 61 74 74 72 20 26 20 46 49 4c       (attr & FIL
2ab50 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45 41 44  E_ATTRIBUTE_READ
2ab60 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20 20 20 20  ONLY)==0;.      
2ab70 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
2ab80 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  lt:.      assert
2ab90 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73  (!"Invalid flags
2aba0 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d   argument");.  }
2abb0 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 63  .  *pResOut = rc
2abc0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41 43  ;.  OSTRACE(("AC
2abd0 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20 70 52  CESS name=%s, pR
2abe0 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65 73 4f  esOut=%p, *pResO
2abf0 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49 54 45  ut=%d, rc=SQLITE
2ac00 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  _OK\n",.        
2ac10 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 52     zFilename, pR
2ac20 65 73 4f 75 74 2c 20 2a 70 52 65 73 4f 75 74 29  esOut, *pResOut)
2ac30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
2ac40 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2ac50 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  Returns non-zero
2ac60 20 69 66 20 74 68 65 20 73 70 65 63 69 66 69 65   if the specifie
2ac70 64 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61 72  d path name star
2ac80 74 73 20 77 69 74 68 20 61 20 64 72 69 76 65 20  ts with a drive 
2ac90 6c 65 74 74 65 72 0a 2a 2a 20 66 6f 6c 6c 6f 77  letter.** follow
2aca0 65 64 20 62 79 20 61 20 63 6f 6c 6f 6e 20 63 68  ed by a colon ch
2acb0 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  aracter..*/.stat
2acc0 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 44 72 69  ic BOOL winIsDri
2acd0 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e  veLetterAndColon
2ace0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
2acf0 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20 20 72  zPathname.){.  r
2ad00 65 74 75 72 6e 20 28 20 73 71 6c 69 74 65 33 49  eturn ( sqlite3I
2ad10 73 61 6c 70 68 61 28 7a 50 61 74 68 6e 61 6d 65  salpha(zPathname
2ad20 5b 30 5d 29 20 26 26 20 7a 50 61 74 68 6e 61 6d  [0]) && zPathnam
2ad30 65 5b 31 5d 3d 3d 27 3a 27 20 29 3b 0a 7d 0a 0a  e[1]==':' );.}..
2ad40 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f  /*.** Returns no
2ad50 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70  n-zero if the sp
2ad60 65 63 69 66 69 65 64 20 70 61 74 68 20 6e 61 6d  ecified path nam
2ad70 65 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  e should be used
2ad80 20 76 65 72 62 61 74 69 6d 2e 20 20 49 66 0a 2a   verbatim.  If.*
2ad90 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65  * non-zero is re
2ada0 74 75 72 6e 65 64 20 66 72 6f 6d 20 74 68 69 73  turned from this
2adb0 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 20 63   function, the c
2adc0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
2add0 6d 75 73 74 20 73 69 6d 70 6c 79 0a 2a 2a 20 75  must simply.** u
2ade0 73 65 20 74 68 65 20 70 72 6f 76 69 64 65 64 20  se the provided 
2adf0 70 61 74 68 20 6e 61 6d 65 20 76 65 72 62 61 74  path name verbat
2ae00 69 6d 20 2d 4f 52 2d 20 72 65 73 6f 6c 76 65 20  im -OR- resolve 
2ae10 69 74 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70  it into a full p
2ae20 61 74 68 20 6e 61 6d 65 0a 2a 2a 20 75 73 69 6e  ath name.** usin
2ae30 67 20 74 68 65 20 47 65 74 46 75 6c 6c 50 61 74  g the GetFullPat
2ae40 68 4e 61 6d 65 20 57 69 6e 33 32 20 41 50 49 20  hName Win32 API 
2ae50 66 75 6e 63 74 69 6f 6e 20 28 69 66 20 61 76 61  function (if ava
2ae60 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74  ilable)..*/.stat
2ae70 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 56 65 72  ic BOOL winIsVer
2ae80 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 0a 20  batimPathname(. 
2ae90 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
2aea0 74 68 6e 61 6d 65 0a 29 7b 0a 20 20 2f 2a 0a 20  thname.){.  /*. 
2aeb0 20 2a 2a 20 49 66 20 74 68 65 20 70 61 74 68 20   ** If the path 
2aec0 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69 74 68  name starts with
2aed0 20 61 20 66 6f 72 77 61 72 64 20 73 6c 61 73 68   a forward slash
2aee0 20 6f 72 20 61 20 62 61 63 6b 73 6c 61 73 68 2c   or a backslash,
2aef0 20 69 74 20 69 73 20 65 69 74 68 65 72 0a 20 20   it is either.  
2af00 2a 2a 20 61 20 6c 65 67 61 6c 20 55 4e 43 20 6e  ** a legal UNC n
2af10 61 6d 65 2c 20 61 20 76 6f 6c 75 6d 65 20 72 65  ame, a volume re
2af20 6c 61 74 69 76 65 20 70 61 74 68 2c 20 6f 72 20  lative path, or 
2af30 61 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68  an absolute path
2af40 20 6e 61 6d 65 20 69 6e 20 74 68 65 0a 20 20 2a   name in the.  *
2af50 2a 20 22 55 6e 69 78 22 20 66 6f 72 6d 61 74 20  * "Unix" format 
2af60 6f 6e 20 57 69 6e 64 6f 77 73 2e 20 20 54 68 65  on Windows.  The
2af70 72 65 20 69 73 20 6e 6f 20 65 61 73 79 20 77 61  re is no easy wa
2af80 79 20 74 6f 20 64 69 66 66 65 72 65 6e 74 69 61  y to differentia
2af90 74 65 20 62 65 74 77 65 65 6e 0a 20 20 2a 2a 20  te between.  ** 
2afa0 74 68 65 20 66 69 6e 61 6c 20 74 77 6f 20 63 61  the final two ca
2afb0 73 65 73 3b 20 74 68 65 72 65 66 6f 72 65 2c 20  ses; therefore, 
2afc0 77 65 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  we return the sa
2afd0 66 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65  fer return value
2afe0 20 6f 66 20 54 52 55 45 0a 20 20 2a 2a 20 73 6f   of TRUE.  ** so
2aff0 20 74 68 61 74 20 63 61 6c 6c 65 72 73 20 6f 66   that callers of
2b000 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
2b010 69 6c 6c 20 73 69 6d 70 6c 79 20 75 73 65 20 69  ill simply use i
2b020 74 20 76 65 72 62 61 74 69 6d 2e 0a 20 20 2a 2f  t verbatim..  */
2b030 0a 20 20 69 66 20 28 20 77 69 6e 49 73 44 69 72  .  if ( winIsDir
2b040 53 65 70 28 7a 50 61 74 68 6e 61 6d 65 5b 30 5d  Sep(zPathname[0]
2b050 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2b060 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  TRUE;.  }..  /*.
2b070 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61 74 68    ** If the path
2b080 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69 74   name starts wit
2b090 68 20 61 20 6c 65 74 74 65 72 20 61 6e 64 20 61  h a letter and a
2b0a0 20 63 6f 6c 6f 6e 20 69 74 20 69 73 20 65 69 74   colon it is eit
2b0b0 68 65 72 20 61 20 76 6f 6c 75 6d 65 0a 20 20 2a  her a volume.  *
2b0c0 2a 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  * relative path 
2b0d0 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70  or an absolute p
2b0e0 61 74 68 2e 20 20 43 61 6c 6c 65 72 73 20 6f 66  ath.  Callers of
2b0f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   this function m
2b100 75 73 74 20 6e 6f 74 0a 20 20 2a 2a 20 61 74 74  ust not.  ** att
2b110 65 6d 70 74 20 74 6f 20 74 72 65 61 74 20 69 74  empt to treat it
2b120 20 61 73 20 61 20 72 65 6c 61 74 69 76 65 20 70   as a relative p
2b130 61 74 68 20 6e 61 6d 65 20 28 69 2e 65 2e 20 74  ath name (i.e. t
2b140 68 65 79 20 73 68 6f 75 6c 64 20 73 69 6d 70 6c  hey should simpl
2b150 79 20 75 73 65 0a 20 20 2a 2a 20 69 74 20 76 65  y use.  ** it ve
2b160 72 62 61 74 69 6d 29 2e 0a 20 20 2a 2f 0a 20 20  rbatim)..  */.  
2b170 69 66 20 28 20 77 69 6e 49 73 44 72 69 76 65 4c  if ( winIsDriveL
2b180 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 50  etterAndColon(zP
2b190 61 74 68 6e 61 6d 65 29 20 29 7b 0a 20 20 20 20  athname) ){.    
2b1a0 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d  return TRUE;.  }
2b1b0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 77  ..  /*.  ** If w
2b1c0 65 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f  e get to this po
2b1d0 69 6e 74 2c 20 74 68 65 20 70 61 74 68 20 6e 61  int, the path na
2b1e0 6d 65 20 73 68 6f 75 6c 64 20 61 6c 6d 6f 73 74  me should almost
2b1f0 20 63 65 72 74 61 69 6e 6c 79 20 62 65 20 61 20   certainly be a 
2b200 70 75 72 65 6c 79 0a 20 20 2a 2a 20 72 65 6c 61  purely.  ** rela
2b210 74 69 76 65 20 6f 6e 65 20 28 69 2e 65 2e 20 6e  tive one (i.e. n
2b220 6f 74 20 61 20 55 4e 43 20 6e 61 6d 65 2c 20 6e  ot a UNC name, n
2b230 6f 74 20 61 62 73 6f 6c 75 74 65 2c 20 61 6e 64  ot absolute, and
2b240 20 6e 6f 74 20 76 6f 6c 75 6d 65 20 72 65 6c 61   not volume rela
2b250 74 69 76 65 29 2e 0a 20 20 2a 2f 0a 20 20 72 65  tive)..  */.  re
2b260 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a 0a 2f  turn FALSE;.}../
2b270 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61  *.** Turn a rela
2b280 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e  tive pathname in
2b290 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61  to a full pathna
2b2a0 6d 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 66  me.  Write the f
2b2b0 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d 65 20  ull.** pathname 
2b2c0 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f  into zOut[].  zO
2b2d0 75 74 5b 5d 20 77 69 6c 6c 20 62 65 20 61 74 20  ut[] will be at 
2b2e0 6c 65 61 73 74 20 70 56 66 73 2d 3e 6d 78 50 61  least pVfs->mxPa
2b2f0 74 68 6e 61 6d 65 0a 2a 2a 20 62 79 74 65 73 20  thname.** bytes 
2b300 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  in size..*/.stat
2b310 69 63 20 69 6e 74 20 77 69 6e 46 75 6c 6c 50 61  ic int winFullPa
2b320 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65  thname(.  sqlite
2b330 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
2b340 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
2b350 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74  er to vfs object
2b360 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2b370 20 2a 7a 52 65 6c 61 74 69 76 65 2c 20 20 20 20   *zRelative,    
2b380 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
2b390 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70  relative input p
2b3a0 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 75  ath */.  int nFu
2b3b0 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
2b3c0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
2b3d0 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  f output buffer 
2b3e0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68  in bytes */.  ch
2b3f0 61 72 20 2a 7a 46 75 6c 6c 20 20 20 20 20 20 20  ar *zFull       
2b400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2b410 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a  utput buffer */.
2b420 29 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  ){.#if !SQLITE_O
2b430 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
2b440 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21  TE_OS_WINRT && !
2b450 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
2b460 5f 5f 29 0a 20 20 44 57 4f 52 44 20 6e 42 79 74  __).  DWORD nByt
2b470 65 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  e;.  void *zConv
2b480 65 72 74 65 64 3b 0a 20 20 63 68 61 72 20 2a 7a  erted;.  char *z
2b490 4f 75 74 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  Out;.#endif..  /
2b4a0 2a 20 49 66 20 74 68 69 73 20 70 61 74 68 20 6e  * If this path n
2b4b0 61 6d 65 20 62 65 67 69 6e 73 20 77 69 74 68 20  ame begins with 
2b4c0 22 2f 58 3a 22 2c 20 77 68 65 72 65 20 22 58 22  "/X:", where "X"
2b4d0 20 69 73 20 61 6e 79 20 61 6c 70 68 61 62 65 74   is any alphabet
2b4e0 69 63 0a 20 20 2a 2a 20 63 68 61 72 61 63 74 65  ic.  ** characte
2b4f0 72 2c 20 64 69 73 63 61 72 64 20 74 68 65 20 69  r, discard the i
2b500 6e 69 74 69 61 6c 20 22 2f 22 20 66 72 6f 6d 20  nitial "/" from 
2b510 74 68 65 20 70 61 74 68 6e 61 6d 65 2e 0a 20 20  the pathname..  
2b520 2a 2f 0a 20 20 69 66 28 20 7a 52 65 6c 61 74 69  */.  if( zRelati
2b530 76 65 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 77 69  ve[0]=='/' && wi
2b540 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e  nIsDriveLetterAn
2b550 64 43 6f 6c 6f 6e 28 7a 52 65 6c 61 74 69 76 65  dColon(zRelative
2b560 2b 31 29 20 29 7b 0a 20 20 20 20 7a 52 65 6c 61  +1) ){.    zRela
2b570 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a 0a 23 69 66  tive++;.  }..#if
2b580 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49   defined(__CYGWI
2b590 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49  N__).  SimulateI
2b5a0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
2b5b0 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20  QLITE_ERROR );. 
2b5c0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2b5d0 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 61 73 73 65  R(nFull);.  asse
2b5e0 72 74 28 20 6e 46 75 6c 6c 3e 3d 70 56 66 73 2d  rt( nFull>=pVfs-
2b5f0 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20  >mxPathname );. 
2b600 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61   if ( sqlite3_da
2b610 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20  ta_directory && 
2b620 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61  !winIsVerbatimPa
2b630 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65  thname(zRelative
2b640 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ) ){.    /*.    
2b650 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20  ** NOTE: We are 
2b660 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72  dealing with a r
2b670 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
2b680 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20  e and the data. 
2b690 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65     **       dire
2b6a0 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73  ctory has been s
2b6b0 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20  et.  Therefore, 
2b6c0 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62 61  use it as the ba
2b6d0 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  sis.    **      
2b6e0 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20   for converting 
2b6f0 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74  the relative pat
2b700 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73  h name to an abs
2b710 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20  olute.    **    
2b720 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e     one by prepen
2b730 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64 69  ding the data di
2b740 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 73 6c  rectory and a sl
2b750 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ash..    */.    
2b760 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c  char *zOut = sql
2b770 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
2b780 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2b790 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  +1 );.    if( !z
2b7a0 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74  Out ){.      ret
2b7b0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2b7c0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
2b7d0 20 7d 0a 20 20 20 20 69 66 28 20 63 79 67 77 69   }.    if( cygwi
2b7e0 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20  n_conv_path(.   
2b7f0 20 20 20 20 20 20 20 20 20 28 6f 73 49 73 4e 54           (osIsNT
2b800 28 29 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54  () ? CCP_POSIX_T
2b810 4f 5f 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f  O_WIN_W : CCP_PO
2b820 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 29 20 7c 0a  SIX_TO_WIN_A) |.
2b830 20 20 20 20 20 20 20 20 20 20 20 20 43 43 50 5f              CCP_
2b840 52 45 4c 41 54 49 56 45 2c 20 7a 52 65 6c 61 74  RELATIVE, zRelat
2b850 69 76 65 2c 20 7a 4f 75 74 2c 20 70 56 66 73 2d  ive, zOut, pVfs-
2b860 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30  >mxPathname+1)<0
2b870 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2b880 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20  3_free(zOut);.  
2b890 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
2b8a0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
2b8b0 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c  NTOPEN_CONVPATH,
2b8c0 20 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20   (DWORD)errno,. 
2b8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b8e0 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c          "winFull
2b8f0 50 61 74 68 6e 61 6d 65 31 22 2c 20 7a 52 65 6c  Pathname1", zRel
2b900 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 65 6c 73  ative);.    }els
2b910 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
2b920 55 74 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72  Utf8 = winConver
2b930 74 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  tToUtf8Filename(
2b940 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 66 28  zOut);.      if(
2b950 20 21 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20   !zUtf8 ){.     
2b960 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2b970 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 72  zOut);.        r
2b980 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
2b990 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  RR_NOMEM_BKPT;. 
2b9a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
2b9b0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49  ite3_snprintf(MI
2b9c0 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d  N(nFull, pVfs->m
2b9d0 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c  xPathname), zFul
2b9e0 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20 20 20  l, "%s%c%s",.   
2b9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba00 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61      sqlite3_data
2ba10 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47  _directory, winG
2ba20 65 74 44 69 72 53 65 70 28 29 2c 20 7a 55 74 66  etDirSep(), zUtf
2ba30 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  8);.      sqlite
2ba40 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20  3_free(zUtf8);. 
2ba50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2ba60 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 20  e(zOut);.    }. 
2ba70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
2ba80 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33   *zOut = sqlite3
2ba90 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 56 66 73  MallocZero( pVfs
2baa0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 29  ->mxPathname+1 )
2bab0 3b 0a 20 20 20 20 69 66 28 20 21 7a 4f 75 74 20  ;.    if( !zOut 
2bac0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2bad0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
2bae0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
2baf0 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63 6f     if( cygwin_co
2bb00 6e 76 5f 70 61 74 68 28 0a 20 20 20 20 20 20 20  nv_path(.       
2bb10 20 20 20 20 20 28 6f 73 49 73 4e 54 28 29 20 3f       (osIsNT() ?
2bb20 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49   CCP_POSIX_TO_WI
2bb30 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f  N_W : CCP_POSIX_
2bb40 54 4f 5f 57 49 4e 5f 41 29 2c 0a 20 20 20 20 20  TO_WIN_A),.     
2bb50 20 20 20 20 20 20 20 7a 52 65 6c 61 74 69 76 65         zRelative
2bb60 2c 20 7a 4f 75 74 2c 20 70 56 66 73 2d 3e 6d 78  , zOut, pVfs->mx
2bb70 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30 20 29 7b  Pathname+1)<0 ){
2bb80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
2bb90 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20  ree(zOut);.     
2bba0 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
2bbb0 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
2bbc0 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44  PEN_CONVPATH, (D
2bbd0 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20  WORD)errno,.    
2bbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bbf0 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74       "winFullPat
2bc00 68 6e 61 6d 65 32 22 2c 20 7a 52 65 6c 61 74 69  hname2", zRelati
2bc10 76 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ve);.    }else{.
2bc20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66        char *zUtf
2bc30 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f  8 = winConvertTo
2bc40 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 4f 75  Utf8Filename(zOu
2bc50 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a  t);.      if( !z
2bc60 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 20 20  Utf8 ){.        
2bc70 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75  sqlite3_free(zOu
2bc80 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
2bc90 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
2bca0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
2bcb0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
2bcc0 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e  3_snprintf(MIN(n
2bcd0 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61  Full, pVfs->mxPa
2bce0 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20  thname), zFull, 
2bcf0 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20  "%s", zUtf8);.  
2bd00 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2bd10 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73  (zUtf8);.      s
2bd20 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74  qlite3_free(zOut
2bd30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
2bd40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2bd50 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 28 53 51  .#endif..#if (SQ
2bd60 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c  LITE_OS_WINCE ||
2bd70 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
2bd80 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f  ) && !defined(__
2bd90 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75  CYGWIN__).  Simu
2bda0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
2bdb0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
2bdc0 20 29 3b 0a 20 20 2f 2a 20 57 69 6e 43 45 20 68   );.  /* WinCE h
2bdd0 61 73 20 6e 6f 20 63 6f 6e 63 65 70 74 20 6f 66  as no concept of
2bde0 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
2bdf0 6e 61 6d 65 2c 20 6f 72 20 73 6f 20 49 20 61 6d  name, or so I am
2be00 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20 2f 2a 20 57   told. */.  /* W
2be10 69 6e 52 54 20 68 61 73 20 6e 6f 20 77 61 79 20  inRT has no way 
2be20 74 6f 20 63 6f 6e 76 65 72 74 20 61 20 72 65 6c  to convert a rel
2be30 61 74 69 76 65 20 70 61 74 68 20 74 6f 20 61 6e  ative path to an
2be40 20 61 62 73 6f 6c 75 74 65 20 6f 6e 65 2e 20 2a   absolute one. *
2be50 2f 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65 33  /.  if ( sqlite3
2be60 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20  _data_directory 
2be70 26 26 20 21 77 69 6e 49 73 56 65 72 62 61 74 69  && !winIsVerbati
2be80 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74  mPathname(zRelat
2be90 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  ive) ){.    /*. 
2bea0 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61     ** NOTE: We a
2beb0 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
2bec0 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  a relative path 
2bed0 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74  name and the dat
2bee0 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64  a.    **       d
2bef0 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
2bf00 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72  n set.  Therefor
2bf10 65 2c 20 75 73 65 20 69 74 20 61 73 20 74 68 65  e, use it as the
2bf20 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20   basis.    **   
2bf30 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69      for converti
2bf40 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76 65 20  ng the relative 
2bf50 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20  path name to an 
2bf60 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20  absolute.    ** 
2bf70 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65        one by pre
2bf80 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61  pending the data
2bf90 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61   directory and a
2bfa0 20 62 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20   backslash..    
2bfb0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
2bfc0 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c  nprintf(MIN(nFul
2bfd0 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l, pVfs->mxPathn
2bfe0 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  ame), zFull, "%s
2bff0 25 63 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  %c%s",.         
2c000 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2c010 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
2c020 72 79 2c 20 77 69 6e 47 65 74 44 69 72 53 65 70  ry, winGetDirSep
2c030 28 29 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a  (), zRelative);.
2c040 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
2c050 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49  ite3_snprintf(MI
2c060 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d  N(nFull, pVfs->m
2c070 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c  xPathname), zFul
2c080 6c 2c 20 22 25 73 22 2c 20 7a 52 65 6c 61 74 69  l, "%s", zRelati
2c090 76 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ve);.  }.  retur
2c0a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
2c0b0 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  dif..#if !SQLITE
2c0c0 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
2c0d0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
2c0e0 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57   !defined(__CYGW
2c0f0 49 4e 5f 5f 29 0a 20 20 2f 2a 20 49 74 27 73 20  IN__).  /* It's 
2c100 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
2c110 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
2c120 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
2c130 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
2c140 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
2c150 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
2c160 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
2c170 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
2c180 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
2c190 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75  failing. This fu
2c1a0 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69  nction could fai
2c1b0 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c  l if, for exampl
2c1c0 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  e, the.  ** curr
2c1d0 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65  ent working dire
2c1e0 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75  ctory has been u
2c1f0 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20  nlinked..  */.  
2c200 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
2c210 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
2c220 52 52 4f 52 20 29 3b 0a 20 20 69 66 20 28 20 73  RROR );.  if ( s
2c230 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
2c240 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56  ctory && !winIsV
2c250 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28  erbatimPathname(
2c260 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20  zRelative) ){.  
2c270 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45    /*.    ** NOTE
2c280 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67  : We are dealing
2c290 20 77 69 74 68 20 61 20 72 65 6c 61 74 69 76 65   with a relative
2c2a0 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74   path name and t
2c2b0 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20  he data.    **  
2c2c0 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 68       directory h
2c2d0 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68  as been set.  Th
2c2e0 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20  erefore, use it 
2c2f0 61 73 20 74 68 65 20 62 61 73 69 73 0a 20 20 20  as the basis.   
2c300 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f   **       for co
2c310 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c  nverting the rel
2c320 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20  ative path name 
2c330 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20  to an absolute. 
2c340 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20     **       one 
2c350 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68  by prepending th
2c360 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79  e data directory
2c370 20 61 6e 64 20 61 20 62 61 63 6b 73 6c 61 73 68   and a backslash
2c380 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
2c390 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49  ite3_snprintf(MI
2c3a0 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d  N(nFull, pVfs->m
2c3b0 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c  xPathname), zFul
2c3c0 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20 20 20  l, "%s%c%s",.   
2c3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c3e0 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64    sqlite3_data_d
2c3f0 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47 65 74  irectory, winGet
2c400 44 69 72 53 65 70 28 29 2c 20 7a 52 65 6c 61 74  DirSep(), zRelat
2c410 69 76 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ive);.    return
2c420 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2c430 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
2c440 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66  inConvertFromUtf
2c450 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61 74  8Filename(zRelat
2c460 69 76 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e  ive);.  if( zCon
2c470 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
2c480 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2c490 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
2c4a0 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e  .  }.  if( osIsN
2c4b0 54 28 29 20 29 7b 0a 20 20 20 20 4c 50 57 53 54  T() ){.    LPWST
2c4c0 52 20 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79  R zTemp;.    nBy
2c4d0 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61  te = osGetFullPa
2c4e0 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54 52  thNameW((LPCWSTR
2c4f0 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20  )zConverted, 0, 
2c500 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e  0, 0);.    if( n
2c510 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Byte==0 ){.     
2c520 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
2c530 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
2c540 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
2c550 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
2c560 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73  PEN_FULLPATH, os
2c570 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
2c580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c590 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c           "winFul
2c5a0 6c 50 61 74 68 6e 61 6d 65 31 22 2c 20 7a 52 65  lPathname1", zRe
2c5b0 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20  lative);.    }. 
2c5c0 20 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b 0a 20     nByte += 3;. 
2c5d0 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74     zTemp = sqlit
2c5e0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42  e3MallocZero( nB
2c5f0 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70  yte*sizeof(zTemp
2c600 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20  [0]) );.    if( 
2c610 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20  zTemp==0 ){.    
2c620 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2c630 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
2c640 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c650 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  IOERR_NOMEM_BKPT
2c660 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74  ;.    }.    nByt
2c670 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74  e = osGetFullPat
2c680 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54 52 29  hNameW((LPCWSTR)
2c690 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74  zConverted, nByt
2c6a0 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20  e, zTemp, 0);.  
2c6b0 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29    if( nByte==0 )
2c6c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2c6d0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
2c6e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2c6f0 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20  free(zTemp);.   
2c700 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
2c710 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
2c720 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20  TOPEN_FULLPATH, 
2c730 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
2c740 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2c750 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
2c760 75 6c 6c 50 61 74 68 6e 61 6d 65 32 22 2c 20 7a  ullPathname2", z
2c770 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d  Relative);.    }
2c780 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2c790 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
2c7a0 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e 55 6e 69     zOut = winUni
2c7b0 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70  codeToUtf8(zTemp
2c7c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
2c7d0 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a  ree(zTemp);.  }.
2c7e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
2c7f0 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
2c800 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
2c810 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20  Temp;.    nByte 
2c820 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e  = osGetFullPathN
2c830 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  ameA((char*)zCon
2c840 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29  verted, 0, 0, 0)
2c850 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d  ;.    if( nByte=
2c860 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
2c870 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
2c880 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ted);.      retu
2c890 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
2c8a0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46  QLITE_CANTOPEN_F
2c8b0 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61  ULLPATH, osGetLa
2c8c0 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
2c8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c8e0 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68      "winFullPath
2c8f0 6e 61 6d 65 33 22 2c 20 7a 52 65 6c 61 74 69 76  name3", zRelativ
2c900 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42  e);.    }.    nB
2c910 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54  yte += 3;.    zT
2c920 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  emp = sqlite3Mal
2c930 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73  locZero( nByte*s
2c940 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20  izeof(zTemp[0]) 
2c950 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70  );.    if( zTemp
2c960 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
2c970 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
2c980 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74  rted);.      ret
2c990 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2c9a0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
2c9b0 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f   }.    nByte = o
2c9c0 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
2c9d0 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72  A((char*)zConver
2c9e0 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d  ted, nByte, zTem
2c9f0 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e  p, 0);.    if( n
2ca00 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Byte==0 ){.     
2ca10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
2ca20 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
2ca30 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
2ca40 65 6d 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  emp);.      retu
2ca50 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
2ca60 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46  QLITE_CANTOPEN_F
2ca70 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61  ULLPATH, osGetLa
2ca80 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
2ca90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2caa0 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68      "winFullPath
2cab0 6e 61 6d 65 34 22 2c 20 7a 52 65 6c 61 74 69 76  name4", zRelativ
2cac0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
2cad0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
2cae0 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74  erted);.    zOut
2caf0 20 3d 20 77 69 6e 4d 62 63 73 54 6f 55 74 66 38   = winMbcsToUtf8
2cb00 28 7a 54 65 6d 70 2c 20 6f 73 41 72 65 46 69 6c  (zTemp, osAreFil
2cb10 65 41 70 69 73 41 4e 53 49 28 29 29 3b 0a 20 20  eApisANSI());.  
2cb20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2cb30 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Temp);.  }.#endi
2cb40 66 0a 20 20 69 66 28 20 7a 4f 75 74 20 29 7b 0a  f.  if( zOut ){.
2cb50 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2cb60 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20  intf(MIN(nFull, 
2cb70 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2cb80 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20  ), zFull, "%s", 
2cb90 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  zOut);.    sqlit
2cba0 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20  e3_free(zOut);. 
2cbb0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2cbc0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
2cbd0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2cbe0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  IOERR_NOMEM_BKPT
2cbf0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
2cc00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2cc10 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
2cc20 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61  ON./*.** Interfa
2cc30 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20  ces for opening 
2cc40 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  a shared library
2cc50 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20  , finding entry 
2cc60 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e  points.** within
2cc70 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
2cc80 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67  ary, and closing
2cc90 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
2cca0 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ary..*/.static v
2ccb0 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65 6e 28 73  oid *winDlOpen(s
2ccc0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2ccd0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
2cce0 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48 41 4e 44  ilename){.  HAND
2ccf0 4c 45 20 68 3b 0a 23 69 66 20 64 65 66 69 6e 65  LE h;.#if define
2cd00 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
2cd10 69 6e 74 20 6e 46 75 6c 6c 20 3d 20 70 56 66 73  int nFull = pVfs
2cd20 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
2cd30 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 3d 20    char *zFull = 
2cd40 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
2cd50 6f 28 20 6e 46 75 6c 6c 20 29 3b 0a 20 20 76 6f  o( nFull );.  vo
2cd60 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d  id *zConverted =
2cd70 20 30 3b 0a 20 20 69 66 28 20 7a 46 75 6c 6c 3d   0;.  if( zFull=
2cd80 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  =0 ){.    OSTRAC
2cd90 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d  E(("DLOPEN name=
2cda0 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22  %s, handle=%p\n"
2cdb0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f  , zFilename, (vo
2cdc0 69 64 2a 29 30 29 29 3b 0a 20 20 20 20 72 65 74  id*)0));.    ret
2cdd0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
2cde0 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65   winFullPathname
2cdf0 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
2ce00 2c 20 6e 46 75 6c 6c 2c 20 7a 46 75 6c 6c 29 21  , nFull, zFull)!
2ce10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ce20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2ce30 46 75 6c 6c 29 3b 0a 20 20 20 20 4f 53 54 52 41  Full);.    OSTRA
2ce40 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65  CE(("DLOPEN name
2ce50 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e  =%s, handle=%p\n
2ce60 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76  ", zFilename, (v
2ce70 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20 20 72 65  oid*)0));.    re
2ce80 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 43  turn 0;.  }.  zC
2ce90 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f  onverted = winCo
2cea0 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c  nvertFromUtf8Fil
2ceb0 65 6e 61 6d 65 28 7a 46 75 6c 6c 29 3b 0a 20 20  ename(zFull);.  
2cec0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
2ced0 6c 6c 29 3b 0a 23 65 6c 73 65 0a 20 20 76 6f 69  ll);.#else.  voi
2cee0 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  d *zConverted = 
2cef0 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74  winConvertFromUt
2cf00 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65  f8Filename(zFile
2cf10 6e 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f  name);.  UNUSED_
2cf20 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
2cf30 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 43  .#endif.  if( zC
2cf40 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20  onverted==0 ){. 
2cf50 20 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c 4f     OSTRACE(("DLO
2cf60 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e  PEN name=%s, han
2cf70 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65  dle=%p\n", zFile
2cf80 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29 30 29 29  name, (void*)0))
2cf90 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
2cfa0 20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e 54    }.  if( osIsNT
2cfb0 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  () ){.#if SQLITE
2cfc0 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 68 20  _OS_WINRT.    h 
2cfd0 3d 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65 64  = osLoadPackaged
2cfe0 4c 69 62 72 61 72 79 28 28 4c 50 43 57 53 54 52  Library((LPCWSTR
2cff0 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 29 3b  )zConverted, 0);
2d000 0a 23 65 6c 73 65 0a 20 20 20 20 68 20 3d 20 6f  .#else.    h = o
2d010 73 4c 6f 61 64 4c 69 62 72 61 72 79 57 28 28 4c  sLoadLibraryW((L
2d020 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
2d030 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23  d);.#endif.  }.#
2d040 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
2d050 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
2d060 73 65 7b 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f  se{.    h = osLo
2d070 61 64 4c 69 62 72 61 72 79 41 28 28 63 68 61 72  adLibraryA((char
2d080 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  *)zConverted);. 
2d090 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52   }.#endif.  OSTR
2d0a0 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d  ACE(("DLOPEN nam
2d0b0 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c  e=%s, handle=%p\
2d0c0 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28  n", zFilename, (
2d0d0 76 6f 69 64 2a 29 68 29 29 3b 0a 20 20 73 71 6c  void*)h));.  sql
2d0e0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
2d0f0 72 74 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  rted);.  return 
2d100 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74 61 74  (void*)h;.}.stat
2d110 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 45 72 72  ic void winDlErr
2d120 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
2d130 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20  pVfs, int nBuf, 
2d140 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a  char *zBufOut){.
2d150 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2d160 45 52 28 70 56 66 73 29 3b 0a 20 20 77 69 6e 47  ER(pVfs);.  winG
2d170 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f  etLastErrorMsg(o
2d180 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
2d190 20 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 29 3b   nBuf, zBufOut);
2d1a0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28  .}.static void (
2d1b0 2a 77 69 6e 44 6c 53 79 6d 28 73 71 6c 69 74 65  *winDlSym(sqlite
2d1c0 33 5f 76 66 73 20 2a 70 56 66 73 2c 76 6f 69 64  3_vfs *pVfs,void
2d1d0 20 2a 70 48 2c 63 6f 6e 73 74 20 63 68 61 72 20   *pH,const char 
2d1e0 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20  *zSym))(void){. 
2d1f0 20 46 41 52 50 52 4f 43 20 70 72 6f 63 3b 0a 20   FARPROC proc;. 
2d200 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2d210 52 28 70 56 66 73 29 3b 0a 20 20 70 72 6f 63 20  R(pVfs);.  proc 
2d220 3d 20 6f 73 47 65 74 50 72 6f 63 41 64 64 72 65  = osGetProcAddre
2d230 73 73 41 28 28 48 41 4e 44 4c 45 29 70 48 2c 20  ssA((HANDLE)pH, 
2d240 7a 53 79 6d 29 3b 0a 20 20 4f 53 54 52 41 43 45  zSym);.  OSTRACE
2d250 28 28 22 44 4c 53 59 4d 20 68 61 6e 64 6c 65 3d  (("DLSYM handle=
2d260 25 70 2c 20 73 79 6d 62 6f 6c 3d 25 73 2c 20 61  %p, symbol=%s, a
2d270 64 64 72 65 73 73 3d 25 70 5c 6e 22 2c 0a 20 20  ddress=%p\n",.  
2d280 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
2d290 70 48 2c 20 7a 53 79 6d 2c 20 28 76 6f 69 64 2a  pH, zSym, (void*
2d2a0 29 70 72 6f 63 29 29 3b 0a 20 20 72 65 74 75 72  )proc));.  retur
2d2b0 6e 20 28 76 6f 69 64 28 2a 29 28 76 6f 69 64 29  n (void(*)(void)
2d2c0 29 70 72 6f 63 3b 0a 7d 0a 73 74 61 74 69 63 20  )proc;.}.static 
2d2d0 76 6f 69 64 20 77 69 6e 44 6c 43 6c 6f 73 65 28  void winDlClose(
2d2e0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2d2f0 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65  s, void *pHandle
2d300 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2d310 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 6f  METER(pVfs);.  o
2d320 73 46 72 65 65 4c 69 62 72 61 72 79 28 28 48 41  sFreeLibrary((HA
2d330 4e 44 4c 45 29 70 48 61 6e 64 6c 65 29 3b 0a 20  NDLE)pHandle);. 
2d340 20 4f 53 54 52 41 43 45 28 28 22 44 4c 43 4c 4f   OSTRACE(("DLCLO
2d350 53 45 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c  SE handle=%p\n",
2d360 20 28 76 6f 69 64 2a 29 70 48 61 6e 64 6c 65 29   (void*)pHandle)
2d370 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66  );.}.#else /* if
2d380 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
2d390 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64  D_EXTENSION is d
2d3a0 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65  efined: */.  #de
2d3b0 66 69 6e 65 20 77 69 6e 44 6c 4f 70 65 6e 20 20  fine winDlOpen  
2d3c0 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44  0.  #define winD
2d3d0 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69  lError 0.  #defi
2d3e0 6e 65 20 77 69 6e 44 6c 53 79 6d 20 20 20 30 0a  ne winDlSym   0.
2d3f0 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 43    #define winDlC
2d400 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  lose 0.#endif../
2d410 2a 20 53 74 61 74 65 20 69 6e 66 6f 72 6d 61 74  * State informat
2d420 69 6f 6e 20 66 6f 72 20 74 68 65 20 72 61 6e 64  ion for the rand
2d430 6f 6d 6e 65 73 73 20 67 61 74 68 65 72 65 72 2e  omness gatherer.
2d440 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
2d450 63 74 20 45 6e 74 72 6f 70 79 47 61 74 68 65 72  ct EntropyGather
2d460 65 72 20 45 6e 74 72 6f 70 79 47 61 74 68 65 72  er EntropyGather
2d470 65 72 3b 0a 73 74 72 75 63 74 20 45 6e 74 72 6f  er;.struct Entro
2d480 70 79 47 61 74 68 65 72 65 72 20 7b 0a 20 20 75  pyGatherer {.  u
2d490 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 3b  nsigned char *a;
2d4a0 20 20 20 2f 2a 20 47 61 74 68 65 72 20 65 6e 74     /* Gather ent
2d4b0 72 6f 70 79 20 69 6e 74 6f 20 74 68 69 73 20 62  ropy into this b
2d4c0 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  uffer */.  int n
2d4d0 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  a;             /
2d4e0 2a 20 53 69 7a 65 20 6f 66 20 61 5b 5d 20 69 6e  * Size of a[] in
2d4f0 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
2d500 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
2d510 2f 2a 20 58 4f 52 20 6e 65 78 74 20 69 6e 70 75  /* XOR next inpu
2d520 74 20 69 6e 74 6f 20 61 5b 69 5d 20 2a 2f 0a 20  t into a[i] */. 
2d530 20 69 6e 74 20 6e 58 6f 72 3b 20 20 20 20 20 20   int nXor;      
2d540 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2d550 66 20 58 4f 52 20 6f 70 65 72 61 74 69 6f 6e 73  f XOR operations
2d560 20 64 6f 6e 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66   done */.};..#if
2d570 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2d580 5f 54 45 53 54 29 20 26 26 20 21 64 65 66 69 6e  _TEST) && !defin
2d590 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ed(SQLITE_OMIT_R
2d5a0 41 4e 44 4f 4d 4e 45 53 53 29 0a 2f 2a 20 4d 69  ANDOMNESS)./* Mi
2d5b0 78 20 73 7a 20 62 79 74 65 73 20 6f 66 20 65 6e  x sz bytes of en
2d5c0 74 72 6f 70 79 20 69 6e 74 6f 20 70 2e 20 2a 2f  tropy into p. */
2d5d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 78 6f 72  .static void xor
2d5e0 4d 65 6d 6f 72 79 28 45 6e 74 72 6f 70 79 47 61  Memory(EntropyGa
2d5f0 74 68 65 72 65 72 20 2a 70 2c 20 75 6e 73 69 67  therer *p, unsig
2d600 6e 65 64 20 63 68 61 72 20 2a 78 2c 20 69 6e 74  ned char *x, int
2d610 20 73 7a 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b   sz){.  int j, k
2d620 3b 0a 20 20 66 6f 72 28 6a 3d 30 2c 20 6b 3d 70  ;.  for(j=0, k=p
2d630 2d 3e 69 3b 20 6a 3c 73 7a 3b 20 6a 2b 2b 29 7b  ->i; j<sz; j++){
2d640 0a 20 20 20 20 70 2d 3e 61 5b 6b 2b 2b 5d 20 5e  .    p->a[k++] ^
2d650 3d 20 78 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20  = x[j];.    if( 
2d660 6b 3e 3d 70 2d 3e 6e 61 20 29 20 6b 20 3d 20 30  k>=p->na ) k = 0
2d670 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 20 3d 20 6b  ;.  }.  p->i = k
2d680 3b 0a 20 20 70 2d 3e 6e 58 6f 72 20 2b 3d 20 73  ;.  p->nXor += s
2d690 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  z;.}.#endif /* !
2d6a0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
2d6b0 45 53 54 29 20 26 26 20 21 64 65 66 69 6e 65 64  EST) && !defined
2d6c0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 41 4e  (SQLITE_OMIT_RAN
2d6d0 44 4f 4d 4e 45 53 53 29 20 2a 2f 0a 0a 2f 2a 0a  DOMNESS) */../*.
2d6e0 2a 2a 20 57 72 69 74 65 20 75 70 20 74 6f 20 6e  ** Write up to n
2d6f0 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e  Buf bytes of ran
2d700 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20 7a 42 75  domness into zBu
2d710 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
2d720 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 28 73   winRandomness(s
2d730 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2d740 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
2d750 20 2a 7a 42 75 66 29 7b 0a 23 69 66 20 64 65 66   *zBuf){.#if def
2d760 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
2d770 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
2d780 49 54 45 5f 4f 4d 49 54 5f 52 41 4e 44 4f 4d 4e  ITE_OMIT_RANDOMN
2d790 45 53 53 29 0a 20 20 55 4e 55 53 45 44 5f 50 41  ESS).  UNUSED_PA
2d7a0 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
2d7b0 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c   memset(zBuf, 0,
2d7c0 20 6e 42 75 66 29 3b 0a 20 20 72 65 74 75 72 6e   nBuf);.  return
2d7d0 20 6e 42 75 66 3b 0a 23 65 6c 73 65 0a 20 20 45   nBuf;.#else.  E
2d7e0 6e 74 72 6f 70 79 47 61 74 68 65 72 65 72 20 65  ntropyGatherer e
2d7f0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2d800 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 6d 65  ETER(pVfs);.  me
2d810 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42  mset(zBuf, 0, nB
2d820 75 66 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  uf);.#if defined
2d830 28 5f 4d 53 43 5f 56 45 52 29 20 26 26 20 5f 4d  (_MSC_VER) && _M
2d840 53 43 5f 56 45 52 3e 3d 31 34 30 30 20 26 26 20  SC_VER>=1400 && 
2d850 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
2d860 0a 20 20 72 61 6e 64 5f 73 28 28 75 6e 73 69 67  .  rand_s((unsig
2d870 6e 65 64 20 69 6e 74 2a 29 7a 42 75 66 29 3b 20  ned int*)zBuf); 
2d880 2f 2a 20 72 61 6e 64 5f 73 28 29 20 69 73 20 6e  /* rand_s() is n
2d890 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 77 69 74  ot available wit
2d8a0 68 20 4d 69 6e 47 57 20 2a 2f 0a 23 65 6e 64 69  h MinGW */.#endi
2d8b0 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 4d 53  f /* defined(_MS
2d8c0 43 5f 56 45 52 29 20 26 26 20 5f 4d 53 43 5f 56  C_VER) && _MSC_V
2d8d0 45 52 3e 3d 31 34 30 30 20 2a 2f 0a 20 20 65 2e  ER>=1400 */.  e.
2d8e0 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  a = (unsigned ch
2d8f0 61 72 2a 29 7a 42 75 66 3b 0a 20 20 65 2e 6e 61  ar*)zBuf;.  e.na
2d900 20 3d 20 6e 42 75 66 3b 0a 20 20 65 2e 6e 58 6f   = nBuf;.  e.nXo
2d910 72 20 3d 20 30 3b 0a 20 20 65 2e 69 20 3d 20 30  r = 0;.  e.i = 0
2d920 3b 0a 20 20 7b 0a 20 20 20 20 53 59 53 54 45 4d  ;.  {.    SYSTEM
2d930 54 49 4d 45 20 78 3b 0a 20 20 20 20 6f 73 47 65  TIME x;.    osGe
2d940 74 53 79 73 74 65 6d 54 69 6d 65 28 26 78 29 3b  tSystemTime(&x);
2d950 0a 20 20 20 20 78 6f 72 4d 65 6d 6f 72 79 28 26  .    xorMemory(&
2d960 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  e, (unsigned cha
2d970 72 2a 29 26 78 2c 20 73 69 7a 65 6f 66 28 53 59  r*)&x, sizeof(SY
2d980 53 54 45 4d 54 49 4d 45 29 29 3b 0a 20 20 7d 0a  STEMTIME));.  }.
2d990 20 20 7b 0a 20 20 20 20 44 57 4f 52 44 20 70 69    {.    DWORD pi
2d9a0 64 20 3d 20 6f 73 47 65 74 43 75 72 72 65 6e 74  d = osGetCurrent
2d9b0 50 72 6f 63 65 73 73 49 64 28 29 3b 0a 20 20 20  ProcessId();.   
2d9c0 20 78 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28   xorMemory(&e, (
2d9d0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26  unsigned char*)&
2d9e0 70 69 64 2c 20 73 69 7a 65 6f 66 28 44 57 4f 52  pid, sizeof(DWOR
2d9f0 44 29 29 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c  D));.  }.#if SQL
2da00 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
2da10 0a 20 20 20 20 55 4c 4f 4e 47 4c 4f 4e 47 20 63  .    ULONGLONG c
2da20 6e 74 20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f  nt = osGetTickCo
2da30 75 6e 74 36 34 28 29 3b 0a 20 20 20 20 78 6f 72  unt64();.    xor
2da40 4d 65 6d 6f 72 79 28 26 65 2c 20 28 75 6e 73 69  Memory(&e, (unsi
2da50 67 6e 65 64 20 63 68 61 72 2a 29 26 63 6e 74 2c  gned char*)&cnt,
2da60 20 73 69 7a 65 6f 66 28 55 4c 4f 4e 47 4c 4f 4e   sizeof(ULONGLON
2da70 47 29 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  G));.  }.#else. 
2da80 20 7b 0a 20 20 20 20 44 57 4f 52 44 20 63 6e 74   {.    DWORD cnt
2da90 20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e   = osGetTickCoun
2daa0 74 28 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f  t();.    xorMemo
2dab0 72 79 28 26 65 2c 20 28 75 6e 73 69 67 6e 65 64  ry(&e, (unsigned
2dac0 20 63 68 61 72 2a 29 26 63 6e 74 2c 20 73 69 7a   char*)&cnt, siz
2dad0 65 6f 66 28 44 57 4f 52 44 29 29 3b 0a 20 20 7d  eof(DWORD));.  }
2dae0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2daf0 45 5f 4f 53 5f 57 49 4e 52 54 20 2a 2f 0a 20 20  E_OS_WINRT */.  
2db00 7b 0a 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45  {.    LARGE_INTE
2db10 47 45 52 20 69 3b 0a 20 20 20 20 6f 73 51 75 65  GER i;.    osQue
2db20 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75  ryPerformanceCou
2db30 6e 74 65 72 28 26 69 29 3b 0a 20 20 20 20 78 6f  nter(&i);.    xo
2db40 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28 75 6e 73  rMemory(&e, (uns
2db50 69 67 6e 65 64 20 63 68 61 72 2a 29 26 69 2c 20  igned char*)&i, 
2db60 73 69 7a 65 6f 66 28 4c 41 52 47 45 5f 49 4e 54  sizeof(LARGE_INT
2db70 45 47 45 52 29 29 3b 0a 20 20 7d 0a 23 69 66 20  EGER));.  }.#if 
2db80 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
2db90 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
2dba0 49 4e 52 54 20 26 26 20 53 51 4c 49 54 45 5f 57  INRT && SQLITE_W
2dbb0 49 4e 33 32 5f 55 53 45 5f 55 55 49 44 0a 20 20  IN32_USE_UUID.  
2dbc0 7b 0a 20 20 20 20 55 55 49 44 20 69 64 3b 0a 20  {.    UUID id;. 
2dbd0 20 20 20 6d 65 6d 73 65 74 28 26 69 64 2c 20 30     memset(&id, 0
2dbe0 2c 20 73 69 7a 65 6f 66 28 55 55 49 44 29 29 3b  , sizeof(UUID));
2dbf0 0a 20 20 20 20 6f 73 55 75 69 64 43 72 65 61 74  .    osUuidCreat
2dc00 65 28 26 69 64 29 3b 0a 20 20 20 20 78 6f 72 4d  e(&id);.    xorM
2dc10 65 6d 6f 72 79 28 26 65 2c 20 28 75 6e 73 69 67  emory(&e, (unsig
2dc20 6e 65 64 20 63 68 61 72 2a 29 26 69 64 2c 20 73  ned char*)&id, s
2dc30 69 7a 65 6f 66 28 55 55 49 44 29 29 3b 0a 20 20  izeof(UUID));.  
2dc40 20 20 6d 65 6d 73 65 74 28 26 69 64 2c 20 30 2c    memset(&id, 0,
2dc50 20 73 69 7a 65 6f 66 28 55 55 49 44 29 29 3b 0a   sizeof(UUID));.
2dc60 20 20 20 20 6f 73 55 75 69 64 43 72 65 61 74 65      osUuidCreate
2dc70 53 65 71 75 65 6e 74 69 61 6c 28 26 69 64 29 3b  Sequential(&id);
2dc80 0a 20 20 20 20 78 6f 72 4d 65 6d 6f 72 79 28 26  .    xorMemory(&
2dc90 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  e, (unsigned cha
2dca0 72 2a 29 26 69 64 2c 20 73 69 7a 65 6f 66 28 55  r*)&id, sizeof(U
2dcb0 55 49 44 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  UID));.  }.#endi
2dcc0 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 53 5f  f /* !SQLITE_OS_
2dcd0 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
2dce0 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 53 51 4c  _OS_WINRT && SQL
2dcf0 49 54 45 5f 57 49 4e 33 32 5f 55 53 45 5f 55 55  ITE_WIN32_USE_UU
2dd00 49 44 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 65  ID */.  return e
2dd10 2e 6e 58 6f 72 3e 6e 42 75 66 20 3f 20 6e 42 75  .nXor>nBuf ? nBu
2dd20 66 20 3a 20 65 2e 6e 58 6f 72 3b 0a 23 65 6e 64  f : e.nXor;.#end
2dd30 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
2dd40 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65  LITE_TEST) || de
2dd50 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
2dd60 54 5f 52 41 4e 44 4f 4d 4e 45 53 53 29 20 2a 2f  T_RANDOMNESS) */
2dd70 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70  .}.../*.** Sleep
2dd80 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68   for a little wh
2dd90 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ile.  Return the
2dda0 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20   amount of time 
2ddb0 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  slept..*/.static
2ddc0 20 69 6e 74 20 77 69 6e 53 6c 65 65 70 28 73 71   int winSleep(sq
2ddd0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2dde0 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 29 7b 0a   int microsec){.
2ddf0 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f    sqlite3_win32_
2de00 73 6c 65 65 70 28 28 6d 69 63 72 6f 73 65 63 2b  sleep((microsec+
2de10 39 39 39 29 2f 31 30 30 30 29 3b 0a 20 20 55 4e  999)/1000);.  UN
2de20 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
2de30 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  Vfs);.  return (
2de40 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31  (microsec+999)/1
2de50 30 30 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a  000)*1000;.}../*
2de60 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
2de70 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73  g variable, if s
2de80 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  et to a non-zero
2de90 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72   value, is inter
2dea0 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65  preted as.** the
2deb0 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e   number of secon
2dec0 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e  ds since 1970 an
2ded0 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 74  d is used to set
2dee0 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
2def0 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65  * sqlite3OsCurre
2df00 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20  ntTime() during 
2df10 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64  testing..*/.#ifd
2df20 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
2df30 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  nt sqlite3_curre
2df40 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a  nt_time = 0;  /*
2df50 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d   Fake system tim
2df60 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e  e in seconds sin
2df70 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64  ce 1970. */.#end
2df80 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  if../*.** Find t
2df90 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
2dfa0 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f  (in Universal Co
2dfb0 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e  ordinated Time).
2dfc0 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69    Write into *pi
2dfd0 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65  Now.** the curre
2dfe0 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  nt time and date
2dff0 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79   as a Julian Day
2e000 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36   number times 86
2e010 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a  _400_000.  In.**
2e020 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72   other words, wr
2e030 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20  ite into *piNow 
2e040 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
2e050 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  lliseconds since
2e060 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65   the Julian.** e
2e070 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20  poch of noon in 
2e080 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76  Greenwich on Nov
2e090 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20 42  ember 24, 4714 B
2e0a0 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  .C according to 
2e0b0 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63  the.** proleptic
2e0c0 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e   Gregorian calen
2e0d0 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75  dar..**.** On su
2e0e0 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53 51  ccess, return SQ
2e0f0 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e  LITE_OK.  Return
2e100 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66   SQLITE_ERROR if
2e110 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
2e120 74 65 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  te.** cannot be 
2e130 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
2e140 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54   int winCurrentT
2e150 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33  imeInt64(sqlite3
2e160 5f 76 66 73 20 2a 70 56 66 73 2c 20 73 71 6c 69  _vfs *pVfs, sqli
2e170 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77  te3_int64 *piNow
2e180 29 7b 0a 20 20 2f 2a 20 46 49 4c 45 54 49 4d 45  ){.  /* FILETIME
2e190 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 20   structure is a 
2e1a0 36 34 2d 62 69 74 20 76 61 6c 75 65 20 72 65 70  64-bit value rep
2e1b0 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 6e 75  resenting the nu
2e1c0 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 31 30 30  mber of.     100
2e1d0 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65  -nanosecond inte
2e1e0 72 76 61 6c 73 20 73 69 6e 63 65 20 4a 61 6e 75  rvals since Janu
2e1f0 61 72 79 20 31 2c 20 31 36 30 31 20 28 3d 20 4a  ary 1, 1601 (= J
2e200 44 20 32 33 30 35 38 31 33 2e 35 29 2e 0a 20 20  D 2305813.5)..  
2e210 2a 2f 0a 20 20 46 49 4c 45 54 49 4d 45 20 66 74  */.  FILETIME ft
2e220 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
2e230 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 77   sqlite3_int64 w
2e240 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20  inFiletimeEpoch 
2e250 3d 20 32 33 30 35 38 31 33 35 2a 28 73 71 6c 69  = 23058135*(sqli
2e260 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30  te3_int64)864000
2e270 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
2e280 5f 54 45 53 54 0a 20 20 73 74 61 74 69 63 20 63  _TEST.  static c
2e290 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74  onst sqlite3_int
2e2a0 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20 32  64 unixEpoch = 2
2e2b0 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65 33  4405875*(sqlite3
2e2c0 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a  _int64)8640000;.
2e2d0 23 65 6e 64 69 66 0a 20 20 2f 2a 20 32 5e 33 32  #endif.  /* 2^32
2e2e0 20 2d 20 74 6f 20 61 76 6f 69 64 20 75 73 65 20   - to avoid use 
2e2f0 6f 66 20 4c 4c 20 61 6e 64 20 77 61 72 6e 69 6e  of LL and warnin
2e300 67 73 20 69 6e 20 67 63 63 20 2a 2f 0a 20 20 73  gs in gcc */.  s
2e310 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
2e320 74 65 33 5f 69 6e 74 36 34 20 6d 61 78 33 32 42  te3_int64 max32B
2e330 69 74 56 61 6c 75 65 20 3d 0a 20 20 20 20 20 20  itValue =.      
2e340 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32  (sqlite3_int64)2
2e350 30 30 30 30 30 30 30 30 30 20 2b 20 28 73 71 6c  000000000 + (sql
2e360 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30  ite3_int64)20000
2e370 30 30 30 30 30 20 2b 0a 20 20 20 20 20 20 28 73  00000 +.      (s
2e380 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 39 34  qlite3_int64)294
2e390 39 36 37 32 39 36 3b 0a 0a 23 69 66 20 53 51 4c  967296;..#if SQL
2e3a0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 53  ITE_OS_WINCE.  S
2e3b0 59 53 54 45 4d 54 49 4d 45 20 74 69 6d 65 3b 0a  YSTEMTIME time;.
2e3c0 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d    osGetSystemTim
2e3d0 65 28 26 74 69 6d 65 29 3b 0a 20 20 2f 2a 20 69  e(&time);.  /* i
2e3e0 66 20 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69  f SystemTimeToFi
2e3f0 6c 65 54 69 6d 65 28 29 20 66 61 69 6c 73 2c 20  leTime() fails, 
2e400 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e  it returns zero.
2e410 20 2a 2f 0a 20 20 69 66 20 28 21 6f 73 53 79 73   */.  if (!osSys
2e420 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d  temTimeToFileTim
2e430 65 28 26 74 69 6d 65 2c 26 66 74 29 29 7b 0a 20  e(&time,&ft)){. 
2e440 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2e450 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6c 73  _ERROR;.  }.#els
2e460 65 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54  e.  osGetSystemT
2e470 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 28 20 26  imeAsFileTime( &
2e480 66 74 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ft );.#endif..  
2e490 2a 70 69 4e 6f 77 20 3d 20 77 69 6e 46 69 6c 65  *piNow = winFile
2e4a0 74 69 6d 65 45 70 6f 63 68 20 2b 0a 20 20 20 20  timeEpoch +.    
2e4b0 20 20 20 20 20 20 20 20 28 28 28 28 73 71 6c 69          ((((sqli
2e4c0 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 48  te3_int64)ft.dwH
2e4d0 69 67 68 44 61 74 65 54 69 6d 65 29 2a 6d 61 78  ighDateTime)*max
2e4e0 33 32 42 69 74 56 61 6c 75 65 29 20 2b 0a 20 20  32BitValue) +.  
2e4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
2e500 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64  lite3_int64)ft.d
2e510 77 4c 6f 77 44 61 74 65 54 69 6d 65 29 2f 28 73  wLowDateTime)/(s
2e520 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 31 30 30  qlite3_int64)100
2e530 30 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  00;..#ifdef SQLI
2e540 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71  TE_TEST.  if( sq
2e550 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
2e560 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77  me ){.    *piNow
2e570 20 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33   = 1000*(sqlite3
2e580 5f 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63  _int64)sqlite3_c
2e590 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e  urrent_time + un
2e5a0 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e  ixEpoch;.  }.#en
2e5b0 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  dif.  UNUSED_PAR
2e5c0 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
2e5d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2e5e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
2e5f0 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
2e600 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43   (in Universal C
2e610 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29  oordinated Time)
2e620 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20  .  Write the.** 
2e630 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64  current time and
2e640 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61   date as a Julia
2e650 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74  n Day number int
2e660 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20  o *prNow and.** 
2e670 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72  return 0.  Retur
2e680 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 20  n 1 if the time 
2e690 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20  and date cannot 
2e6a0 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  be found..*/.sta
2e6b0 74 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65  tic int winCurre
2e6c0 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76  ntTime(sqlite3_v
2e6d0 66 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65  fs *pVfs, double
2e6e0 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 69 6e 74 20   *prNow){.  int 
2e6f0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  rc;.  sqlite3_in
2e700 74 36 34 20 69 3b 0a 20 20 72 63 20 3d 20 77 69  t64 i;.  rc = wi
2e710 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  nCurrentTimeInt6
2e720 34 28 70 56 66 73 2c 20 26 69 29 3b 0a 20 20 69  4(pVfs, &i);.  i
2e730 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 2a 70  f( !rc ){.    *p
2e740 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30  rNow = i/8640000
2e750 30 2e 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  0.0;.  }.  retur
2e760 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
2e770 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20  he idea is that 
2e780 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f  this function wo
2e790 72 6b 73 20 6c 69 6b 65 20 61 20 63 6f 6d 62 69  rks like a combi
2e7a0 6e 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 47 65 74  nation of.** Get
2e7b0 4c 61 73 74 45 72 72 6f 72 28 29 20 61 6e 64 20  LastError() and 
2e7c0 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 28 29 20  FormatMessage() 
2e7d0 6f 6e 20 57 69 6e 64 6f 77 73 20 28 6f 72 20 65  on Windows (or e
2e7e0 72 72 6e 6f 20 61 6e 64 0a 2a 2a 20 73 74 72 65  rrno and.** stre
2e7f0 72 72 6f 72 5f 72 28 29 20 6f 6e 20 55 6e 69 78  rror_r() on Unix
2e800 29 2e 20 41 66 74 65 72 20 61 6e 20 65 72 72 6f  ). After an erro
2e810 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79  r is returned by
2e820 20 61 6e 20 4f 53 0a 2a 2a 20 66 75 6e 63 74 69   an OS.** functi
2e830 6f 6e 2c 20 53 51 4c 69 74 65 20 63 61 6c 6c 73  on, SQLite calls
2e840 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
2e850 69 74 68 20 7a 42 75 66 20 70 6f 69 6e 74 69 6e  ith zBuf pointin
2e860 67 20 74 6f 0a 2a 2a 20 61 20 62 75 66 66 65 72  g to.** a buffer
2e870 20 6f 66 20 6e 42 75 66 20 62 79 74 65 73 2e 20   of nBuf bytes. 
2e880 54 68 65 20 4f 53 20 6c 61 79 65 72 20 73 68 6f  The OS layer sho
2e890 75 6c 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65  uld populate the
2e8a0 0a 2a 2a 20 62 75 66 66 65 72 20 77 69 74 68 20  .** buffer with 
2e8b0 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  a nul-terminated
2e8c0 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 65   UTF-8 encoded e
2e8d0 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20  rror message.** 
2e8e0 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 6c  describing the l
2e8f0 61 73 74 20 49 4f 20 65 72 72 6f 72 20 74 6f 20  ast IO error to 
2e900 68 61 76 65 20 6f 63 63 75 72 72 65 64 20 77 69  have occurred wi
2e910 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67  thin the calling
2e920 0a 2a 2a 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a  .** thread..**.*
2e930 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6d  * If the error m
2e940 65 73 73 61 67 65 20 69 73 20 74 6f 6f 20 6c 61  essage is too la
2e950 72 67 65 20 66 6f 72 20 74 68 65 20 73 75 70 70  rge for the supp
2e960 6c 69 65 64 20 62 75 66 66 65 72 2c 0a 2a 2a 20  lied buffer,.** 
2e970 69 74 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75  it should be tru
2e980 6e 63 61 74 65 64 2e 20 54 68 65 20 72 65 74 75  ncated. The retu
2e990 72 6e 20 76 61 6c 75 65 20 6f 66 20 78 47 65 74  rn value of xGet
2e9a0 4c 61 73 74 45 72 72 6f 72 0a 2a 2a 20 69 73 20  LastError.** is 
2e9b0 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f  zero if the erro
2e9c0 72 20 6d 65 73 73 61 67 65 20 66 69 74 73 20 69  r message fits i
2e9d0 6e 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f 72  n the buffer, or
2e9e0 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68   non-zero.** oth
2e9f0 65 72 77 69 73 65 20 28 69 66 20 74 68 65 20 6d  erwise (if the m
2ea00 65 73 73 61 67 65 20 77 61 73 20 74 72 75 6e 63  essage was trunc
2ea10 61 74 65 64 29 2e 20 49 66 20 6e 6f 6e 2d 7a 65  ated). If non-ze
2ea20 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a  ro is returned,.
2ea30 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f  ** then it is no
2ea40 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 69  t necessary to i
2ea50 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 2d 74  nclude the nul-t
2ea60 65 72 6d 69 6e 61 74 6f 72 20 63 68 61 72 61 63  erminator charac
2ea70 74 65 72 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 75  ter.** in the ou
2ea80 74 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  tput buffer..**.
2ea90 2a 2a 20 4e 6f 74 20 73 75 70 70 6c 79 69 6e 67  ** Not supplying
2eaa0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2eab0 65 20 77 69 6c 6c 20 68 61 76 65 20 6e 6f 20 61  e will have no a
2eac0 64 76 65 72 73 65 20 65 66 66 65 63 74 0a 2a 2a  dverse effect.**
2ead0 20 6f 6e 20 53 51 4c 69 74 65 2e 20 49 74 20 69   on SQLite. It i
2eae0 73 20 66 69 6e 65 20 74 6f 20 68 61 76 65 20 61  s fine to have a
2eaf0 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  n implementation
2eb00 20 74 68 61 74 20 6e 65 76 65 72 0a 2a 2a 20 72   that never.** r
2eb10 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
2eb20 6d 65 73 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20  message:.**.**  
2eb30 20 69 6e 74 20 78 47 65 74 4c 61 73 74 45 72 72   int xGetLastErr
2eb40 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
2eb50 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20  pVfs, int nBuf, 
2eb60 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 2a 2a 20  char *zBuf){.** 
2eb70 20 20 20 20 61 73 73 65 72 74 28 7a 42 75 66 5b      assert(zBuf[
2eb80 30 5d 3d 3d 27 5c 30 27 29 3b 0a 2a 2a 20 20 20  0]=='\0');.**   
2eb90 20 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 20 20    return 0;.**  
2eba0 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72   }.**.** However
2ebb0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6d 65 73   if an error mes
2ebc0 73 61 67 65 20 69 73 20 73 75 70 70 6c 69 65 64  sage is supplied
2ebd0 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 69 6e 63  , it will be inc
2ebe0 6f 72 70 6f 72 61 74 65 64 0a 2a 2a 20 62 79 20  orporated.** by 
2ebf0 73 71 6c 69 74 65 20 69 6e 74 6f 20 74 68 65 20  sqlite into the 
2ec00 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 76  error message av
2ec10 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75  ailable to the u
2ec20 73 65 72 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c  ser using.** sql
2ec30 69 74 65 33 5f 65 72 72 6d 73 67 28 29 2c 20 70  ite3_errmsg(), p
2ec40 6f 73 73 69 62 6c 79 20 6d 61 6b 69 6e 67 20 49  ossibly making I
2ec50 4f 20 65 72 72 6f 72 73 20 65 61 73 69 65 72 20  O errors easier 
2ec60 74 6f 20 64 65 62 75 67 2e 0a 2a 2f 0a 73 74 61  to debug..*/.sta
2ec70 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 4c 61  tic int winGetLa
2ec80 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  stError(sqlite3_
2ec90 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e  vfs *pVfs, int n
2eca0 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
2ecb0 7b 0a 20 20 44 57 4f 52 44 20 65 20 3d 20 6f 73  {.  DWORD e = os
2ecc0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
2ecd0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2ece0 45 52 28 70 56 66 73 29 3b 0a 20 20 69 66 28 20  ER(pVfs);.  if( 
2ecf0 6e 42 75 66 3e 30 20 29 20 77 69 6e 47 65 74 4c  nBuf>0 ) winGetL
2ed00 61 73 74 45 72 72 6f 72 4d 73 67 28 65 2c 20 6e  astErrorMsg(e, n
2ed10 42 75 66 2c 20 7a 42 75 66 29 3b 0a 20 20 72 65  Buf, zBuf);.  re
2ed20 74 75 72 6e 20 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn e;.}../*.**
2ed30 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20   Initialize and 
2ed40 64 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  deinitialize the
2ed50 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
2ed60 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  m interface..*/.
2ed70 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69  int sqlite3_os_i
2ed80 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  nit(void){.  sta
2ed90 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20  tic sqlite3_vfs 
2eda0 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20 20 20 33  winVfs = {.    3
2edb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2edc0 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
2edd0 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28  n */.    sizeof(
2ede0 77 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 20 20  winFile),       
2edf0 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20  /* szOsFile */. 
2ee00 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f     SQLITE_WIN32_
2ee10 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53 2c 20  MAX_PATH_BYTES, 
2ee20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f  /* mxPathname */
2ee30 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
2ee40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
2ee50 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e  Next */.    "win
2ee60 33 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  32",            
2ee70 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20     /* zName */. 
2ee80 20 20 20 26 77 69 6e 41 70 70 44 61 74 61 2c 20     &winAppData, 
2ee90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70            /* pAp
2eea0 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e  pData */.    win
2eeb0 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
2eec0 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a      /* xOpen */.
2eed0 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20      winDelete,  
2eee0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
2eef0 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e  elete */.    win
2ef00 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20  Access,         
2ef10 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a      /* xAccess *
2ef20 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74  /.    winFullPat
2ef30 68 6e 61 6d 65 2c 20 20 20 20 20 20 20 2f 2a 20  hname,       /* 
2ef40 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f  xFullPathname */
2ef50 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20  .    winDlOpen, 
2ef60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2ef70 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69  DlOpen */.    wi
2ef80 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20  nDlError,       
2ef90 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72       /* xDlError
2efa0 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d   */.    winDlSym
2efb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2efc0 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20  * xDlSym */.    
2efd0 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20  winDlClose,     
2efe0 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f         /* xDlClo
2eff0 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e  se */.    winRan
2f000 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 20  domness,        
2f010 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20   /* xRandomness 
2f020 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65 70 2c  */.    winSleep,
2f030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f040 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77   xSleep */.    w
2f050 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20  inCurrentTime,  
2f060 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e        /* xCurren
2f070 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e  tTime */.    win
2f080 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20  GetLastError,   
2f090 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45      /* xGetLastE
2f0a0 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43  rror */.    winC
2f0b0 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c  urrentTimeInt64,
2f0c0 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69     /* xCurrentTi
2f0d0 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77  meInt64 */.    w
2f0e0 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c  inSetSystemCall,
2f0f0 20 20 20 20 20 20 2f 2a 20 78 53 65 74 53 79 73        /* xSetSys
2f100 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77  temCall */.    w
2f110 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c  inGetSystemCall,
2f120 20 20 20 20 20 20 2f 2a 20 78 47 65 74 53 79 73        /* xGetSys
2f130 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77  temCall */.    w
2f140 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c  inNextSystemCall
2f150 2c 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 53 79  ,     /* xNextSy
2f160 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b  stemCall */.  };
2f170 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
2f180 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
2f190 44 45 29 0a 20 20 73 74 61 74 69 63 20 73 71 6c  DE).  static sql
2f1a0 69 74 65 33 5f 76 66 73 20 77 69 6e 4c 6f 6e 67  ite3_vfs winLong
2f1b0 50 61 74 68 56 66 73 20 3d 20 7b 0a 20 20 20 20  PathVfs = {.    
2f1c0 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3,              
2f1d0 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
2f1e0 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66  on */.    sizeof
2f1f0 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 20  (winFile),      
2f200 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a   /* szOsFile */.
2f210 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54      SQLITE_WINNT
2f220 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53 2c  _MAX_PATH_BYTES,
2f230 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a   /* mxPathname *
2f240 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
2f250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f260 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 77 69  pNext */.    "wi
2f270 6e 33 32 2d 6c 6f 6e 67 70 61 74 68 22 2c 20 20  n32-longpath",  
2f280 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a      /* zName */.
2f290 20 20 20 20 26 77 69 6e 41 70 70 44 61 74 61 2c      &winAppData,
2f2a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41             /* pA
2f2b0 70 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69  ppData */.    wi
2f2c0 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  nOpen,          
2f2d0 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f       /* xOpen */
2f2e0 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20  .    winDelete, 
2f2f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2f300 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69  Delete */.    wi
2f310 6e 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20  nAccess,        
2f320 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20       /* xAccess 
2f330 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 61  */.    winFullPa
2f340 74 68 6e 61 6d 65 2c 20 20 20 20 20 20 20 2f 2a  thname,       /*
2f350 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a   xFullPathname *
2f360 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c  /.    winDlOpen,
2f370 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f380 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77  xDlOpen */.    w
2f390 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20  inDlError,      
2f3a0 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f        /* xDlErro
2f3b0 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79  r */.    winDlSy
2f3c0 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
2f3d0 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20  /* xDlSym */.   
2f3e0 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20   winDlClose,    
2f3f0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c          /* xDlCl
2f400 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61  ose */.    winRa
2f410 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20  ndomness,       
2f420 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73    /* xRandomness
2f430 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65 70   */.    winSleep
2f440 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2f450 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20  * xSleep */.    
2f460 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20  winCurrentTime, 
2f470 20 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65         /* xCurre
2f480 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69  ntTime */.    wi
2f490 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20  nGetLastError,  
2f4a0 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74       /* xGetLast
2f4b0 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e  Error */.    win
2f4c0 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
2f4d0 2c 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54  ,   /* xCurrentT
2f4e0 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20  imeInt64 */.    
2f4f0 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  winSetSystemCall
2f500 2c 20 20 20 20 20 20 2f 2a 20 78 53 65 74 53 79  ,      /* xSetSy
2f510 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20  stemCall */.    
2f520 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c  winGetSystemCall
2f530 2c 20 20 20 20 20 20 2f 2a 20 78 47 65 74 53 79  ,      /* xGetSy
2f540 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20  stemCall */.    
2f550 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  winNextSystemCal
2f560 6c 2c 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 53  l,     /* xNextS
2f570 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d  ystemCall */.  }
2f580 3b 0a 23 65 6e 64 69 66 0a 20 20 73 74 61 74 69  ;.#endif.  stati
2f590 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69  c sqlite3_vfs wi
2f5a0 6e 4e 6f 6c 6f 63 6b 56 66 73 20 3d 20 7b 0a 20  nNolockVfs = {. 
2f5b0 20 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20     3,           
2f5c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
2f5d0 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a  rsion */.    siz
2f5e0 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20 20  eof(winFile),   
2f5f0 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20      /* szOsFile 
2f600 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f 57 49  */.    SQLITE_WI
2f610 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54  N32_MAX_PATH_BYT
2f620 45 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d  ES, /* mxPathnam
2f630 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
2f640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f650 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20  /* pNext */.    
2f660 22 77 69 6e 33 32 2d 6e 6f 6e 65 22 2c 20 20 20  "win32-none",   
2f670 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20         /* zName 
2f680 2a 2f 0a 20 20 20 20 26 77 69 6e 4e 6f 6c 6f 63  */.    &winNoloc
2f690 6b 41 70 70 44 61 74 61 2c 20 20 20 20 20 2f 2a  kAppData,     /*
2f6a0 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20   pAppData */.   
2f6b0 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20   winOpen,       
2f6c0 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e          /* xOpen
2f6d0 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74   */.    winDelet
2f6e0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
2f6f0 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20  * xDelete */.   
2f700 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20 20   winAccess,     
2f710 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65          /* xAcce
2f720 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c  ss */.    winFul
2f730 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 20  lPathname,      
2f740 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d   /* xFullPathnam
2f750 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70  e */.    winDlOp
2f760 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
2f770 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20  /* xDlOpen */.  
2f780 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20    winDlError,   
2f790 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45           /* xDlE
2f7a0 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44  rror */.    winD
2f7b0 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20  lSym,           
2f7c0 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a     /* xDlSym */.
2f7d0 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20      winDlClose, 
2f7e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
2f7f0 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69  lClose */.    wi
2f800 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20  nRandomness,    
2f810 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e       /* xRandomn
2f820 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c  ess */.    winSl
2f830 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eep,            
2f840 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20    /* xSleep */. 
2f850 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d     winCurrentTim
2f860 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 43 75  e,        /* xCu
2f870 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20  rrentTime */.   
2f880 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
2f890 2c 20 20 20 20 20 20 20 2f 2a 20 78 47 65 74 4c  ,       /* xGetL
2f8a0 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20  astError */.    
2f8b0 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  winCurrentTimeIn
2f8c0 74 36 34 2c 20 20 20 2f 2a 20 78 43 75 72 72 65  t64,   /* xCurre
2f8d0 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20  ntTimeInt64 */. 
2f8e0 20 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43     winSetSystemC
2f8f0 61 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 78 53 65  all,      /* xSe
2f900 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20  tSystemCall */. 
2f910 20 20 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43     winGetSystemC
2f920 61 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 78 47 65  all,      /* xGe
2f930 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20  tSystemCall */. 
2f940 20 20 20 77 69 6e 4e 65 78 74 53 79 73 74 65 6d     winNextSystem
2f950 43 61 6c 6c 2c 20 20 20 20 20 2f 2a 20 78 4e 65  Call,     /* xNe
2f960 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a  xtSystemCall */.
2f970 20 20 7d 3b 0a 23 69 66 20 64 65 66 69 6e 65 64    };.#if defined
2f980 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
2f990 53 5f 57 49 44 45 29 0a 20 20 73 74 61 74 69 63  S_WIDE).  static
2f9a0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e   sqlite3_vfs win
2f9b0 4c 6f 6e 67 50 61 74 68 4e 6f 6c 6f 63 6b 56 66  LongPathNolockVf
2f9c0 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20 20  s = {.    3,    
2f9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f9e0 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
2f9f0 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46 69      sizeof(winFi
2fa00 6c 65 29 2c 20 20 20 20 20 20 20 2f 2a 20 73 7a  le),       /* sz
2fa10 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 53 51  OsFile */.    SQ
2fa20 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50  LITE_WINNT_MAX_P
2fa30 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a 20 6d 78  ATH_BYTES, /* mx
2fa40 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  Pathname */.    
2fa50 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2fa60 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20         /* pNext 
2fa70 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 2d 6c 6f  */.    "win32-lo
2fa80 6e 67 70 61 74 68 2d 6e 6f 6e 65 22 2c 20 2f 2a  ngpath-none", /*
2fa90 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 26 77   zName */.    &w
2faa0 69 6e 4e 6f 6c 6f 63 6b 41 70 70 44 61 74 61 2c  inNolockAppData,
2fab0 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61       /* pAppData
2fac0 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c   */.    winOpen,
2fad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2fae0 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77  * xOpen */.    w
2faf0 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20  inDelete,       
2fb00 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65        /* xDelete
2fb10 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73   */.    winAcces
2fb20 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
2fb30 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20  * xAccess */.   
2fb40 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65   winFullPathname
2fb50 2c 20 20 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c  ,       /* xFull
2fb60 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  Pathname */.    
2fb70 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20  winDlOpen,      
2fb80 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65         /* xDlOpe
2fb90 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72  n */.    winDlEr
2fba0 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ror,            
2fbb0 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20  /* xDlError */. 
2fbc0 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20     winDlSym,    
2fbd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
2fbe0 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  Sym */.    winDl
2fbf0 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
2fc00 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f    /* xDlClose */
2fc10 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65  .    winRandomne
2fc20 73 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ss,         /* x
2fc30 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20  Randomness */.  
2fc40 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20 20    winSleep,     
2fc50 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65           /* xSle
2fc60 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72  ep */.    winCur
2fc70 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 20  rentTime,       
2fc80 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65   /* xCurrentTime
2fc90 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61   */.    winGetLa
2fca0 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f  stError,       /
2fcb0 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20  * xGetLastError 
2fcc0 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e  */.    winCurren
2fcd0 74 54 69 6d 65 49 6e 74 36 34 2c 20 20 20 2f 2a  tTimeInt64,   /*
2fce0 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74   xCurrentTimeInt
2fcf0 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74  64 */.    winSet
2fd00 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 20  SystemCall,     
2fd10 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d 43 61   /* xSetSystemCa
2fd20 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74  ll */.    winGet
2fd30 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 20  SystemCall,     
2fd40 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61   /* xGetSystemCa
2fd50 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78  ll */.    winNex
2fd60 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20  tSystemCall,    
2fd70 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43   /* xNextSystemC
2fd80 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 65 6e 64  all */.  };.#end
2fd90 69 66 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c 65 2d  if..  /* Double-
2fda0 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61  check that the a
2fdb0 53 79 73 63 61 6c 6c 5b 5d 20 61 72 72 61 79 20  Syscall[] array 
2fdc0 68 61 73 20 62 65 65 6e 20 63 6f 6e 73 74 72 75  has been constru
2fdd0 63 74 65 64 0a 20 20 2a 2a 20 63 6f 72 72 65 63  cted.  ** correc
2fde0 74 6c 79 2e 20 20 53 65 65 20 74 69 63 6b 65 74  tly.  See ticket
2fdf0 20 5b 62 62 33 61 38 36 65 38 39 30 63 38 65 39   [bb3a86e890c8e9
2fe00 36 61 62 5d 20 2a 2f 0a 20 20 61 73 73 65 72 74  6ab] */.  assert
2fe10 28 20 41 72 72 61 79 53 69 7a 65 28 61 53 79 73  ( ArraySize(aSys
2fe20 63 61 6c 6c 29 3d 3d 38 31 20 29 3b 0a 0a 20 20  call)==81 );..  
2fe30 2f 2a 20 67 65 74 20 6d 65 6d 6f 72 79 20 6d 61  /* get memory ma
2fe40 70 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 67 72 61  p allocation gra
2fe50 6e 75 6c 61 72 69 74 79 20 2a 2f 0a 20 20 6d 65  nularity */.  me
2fe60 6d 73 65 74 28 26 77 69 6e 53 79 73 49 6e 66 6f  mset(&winSysInfo
2fe70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 59 53 54  , 0, sizeof(SYST
2fe80 45 4d 5f 49 4e 46 4f 29 29 3b 0a 23 69 66 20 53  EM_INFO));.#if S
2fe90 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
2fea0 20 6f 73 47 65 74 4e 61 74 69 76 65 53 79 73 74   osGetNativeSyst
2feb0 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e  emInfo(&winSysIn
2fec0 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 47  fo);.#else.  osG
2fed0 65 74 53 79 73 74 65 6d 49 6e 66 6f 28 26 77 69  etSystemInfo(&wi
2fee0 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 65 6e 64 69  nSysInfo);.#endi
2fef0 66 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e 53  f.  assert( winS
2ff00 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74  ysInfo.dwAllocat
2ff10 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3e 30  ionGranularity>0
2ff20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69   );.  assert( wi
2ff30 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53  nSysInfo.dwPageS
2ff40 69 7a 65 3e 30 20 29 3b 0a 0a 20 20 73 71 6c 69  ize>0 );..  sqli
2ff50 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
2ff60 28 26 77 69 6e 56 66 73 2c 20 31 29 3b 0a 0a 23  (&winVfs, 1);..#
2ff70 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
2ff80 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
2ff90 29 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ).  sqlite3_vfs_
2ffa0 72 65 67 69 73 74 65 72 28 26 77 69 6e 4c 6f 6e  register(&winLon
2ffb0 67 50 61 74 68 56 66 73 2c 20 30 29 3b 0a 23 65  gPathVfs, 0);.#e
2ffc0 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ndif..  sqlite3_
2ffd0 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 77 69  vfs_register(&wi
2ffe0 6e 4e 6f 6c 6f 63 6b 56 66 73 2c 20 30 29 3b 0a  nNolockVfs, 0);.
2fff0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
30000 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
30010 44 45 29 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  DE).  sqlite3_vf
30020 73 5f 72 65 67 69 73 74 65 72 28 26 77 69 6e 4c  s_register(&winL
30030 6f 6e 67 50 61 74 68 4e 6f 6c 6f 63 6b 56 66 73  ongPathNolockVfs
30040 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  , 0);.#endif..  
30050 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
30060 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.}..int sqlite3
30070 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 0a 23  _os_end(void){.#
30080 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
30090 52 54 0a 20 20 69 66 28 20 73 6c 65 65 70 4f 62  RT.  if( sleepOb
300a0 6a 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 6f  j!=NULL ){.    o
300b0 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 73 6c 65  sCloseHandle(sle
300c0 65 70 4f 62 6a 29 3b 0a 20 20 20 20 73 6c 65 65  epObj);.    slee
300d0 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  pObj = NULL;.  }
300e0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
300f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
30100 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
30110 4f 53 5f 57 49 4e 20 2a 2f 0a                    OS_WIN */.