0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32 /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 ource code. In
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 **.** May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 evil..** May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 thers..** May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 y, never taking
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63 ode that is spec
01a0: 69 66 69 63 20 74 6f 20 57 69 6e 64 6f 77 73 2e ific to Windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53 liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20 QLITE_OS_WIN
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20 is file is used
0200: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79 for Windows only
0210: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 */../*.** Inclu
0220: 64 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 de code that is
0230: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 common to all os
0240: 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 _*.c files.*/.#i
0250: 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f nclude "os_commo
0260: 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c n.h"../*.** Incl
0270: 75 64 65 20 74 68 65 20 68 65 61 64 65 72 20 66 ude the header f
0280: 69 6c 65 20 66 6f 72 20 74 68 65 20 57 69 6e 64 ile for the Wind
0290: 6f 77 73 20 56 46 53 2e 0a 2a 2f 0a 23 69 6e 63 ows VFS..*/.#inc
02a0: 6c 75 64 65 20 22 6f 73 5f 77 69 6e 2e 68 22 0a lude "os_win.h".
02b0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 69 6e 67 ./*.** Compiling
02c0: 20 61 6e 64 20 75 73 69 6e 67 20 57 41 4c 20 6d and using WAL m
02d0: 6f 64 65 20 72 65 71 75 69 72 65 73 20 73 65 76 ode requires sev
02e0: 65 72 61 6c 20 41 50 49 73 20 74 68 61 74 20 61 eral APIs that a
02f0: 72 65 20 6f 6e 6c 79 0a 2a 2a 20 61 76 61 69 6c re only.** avail
0300: 61 62 6c 65 20 69 6e 20 57 69 6e 64 6f 77 73 20 able in Windows
0310: 70 6c 61 74 66 6f 72 6d 73 20 62 61 73 65 64 20 platforms based
0320: 6f 6e 20 74 68 65 20 4e 54 20 6b 65 72 6e 65 6c on the NT kernel
0330: 2e 0a 2a 2f 0a 23 69 66 20 21 53 51 4c 49 54 45 ..*/.#if !SQLITE
0340: 5f 4f 53 5f 57 49 4e 4e 54 20 26 26 20 21 64 65 _OS_WINNT && !de
0350: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 fined(SQLITE_OMI
0360: 54 5f 57 41 4c 29 0a 23 20 20 65 72 72 6f 72 20 T_WAL).# error
0370: 22 57 41 4c 20 6d 6f 64 65 20 72 65 71 75 69 72 "WAL mode requir
0380: 65 73 20 73 75 70 70 6f 72 74 20 66 72 6f 6d 20 es support from
0390: 74 68 65 20 57 69 6e 64 6f 77 73 20 4e 54 20 6b the Windows NT k
03a0: 65 72 6e 65 6c 2c 20 63 6f 6d 70 69 6c 65 5c 0a ernel, compile\.
03b0: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 4d 49 with SQLITE_OMI
03c0: 54 5f 57 41 4c 2e 22 0a 23 65 6e 64 69 66 0a 0a T_WAL.".#endif..
03d0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 #if !SQLITE_OS_W
03e0: 49 4e 4e 54 20 26 26 20 53 51 4c 49 54 45 5f 4d INNT && SQLITE_M
03f0: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 AX_MMAP_SIZE>0.#
0400: 20 20 65 72 72 6f 72 20 22 4d 65 6d 6f 72 79 20 error "Memory
0410: 6d 61 70 70 65 64 20 66 69 6c 65 73 20 72 65 71 mapped files req
0420: 75 69 72 65 20 73 75 70 70 6f 72 74 20 66 72 6f uire support fro
0430: 6d 20 74 68 65 20 57 69 6e 64 6f 77 73 20 4e 54 m the Windows NT
0440: 20 6b 65 72 6e 65 6c 2c 5c 0a 20 63 6f 6d 70 69 kernel,\. compi
0450: 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4d le with SQLITE_M
0460: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3d 30 2e 22 AX_MMAP_SIZE=0."
0470: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 .#endif../*.** A
0480: 72 65 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 57 re most of the W
0490: 69 6e 33 32 20 41 4e 53 49 20 41 50 49 73 20 61 in32 ANSI APIs a
04a0: 76 61 69 6c 61 62 6c 65 20 28 69 2e 65 2e 20 77 vailable (i.e. w
04b0: 69 74 68 20 63 65 72 74 61 69 6e 20 65 78 63 65 ith certain exce
04c0: 70 74 69 6f 6e 73 0a 2a 2a 20 62 61 73 65 64 20 ptions.** based
04d0: 6f 6e 20 74 68 65 20 73 75 62 2d 70 6c 61 74 66 on the sub-platf
04e0: 6f 72 6d 29 3f 0a 2a 2f 0a 23 69 66 20 21 53 51 orm)?.*/.#if !SQ
04f0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 LITE_OS_WINCE &&
0500: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 !SQLITE_OS_WINR
0510: 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 T && !defined(SQ
0520: 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 41 4e LITE_WIN32_NO_AN
0530: 53 49 29 0a 23 20 20 64 65 66 69 6e 65 20 53 51 SI).# define SQ
0540: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 LITE_WIN32_HAS_A
0550: 4e 53 49 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a NSI.#endif../*.*
0560: 2a 20 41 72 65 20 6d 6f 73 74 20 6f 66 20 74 68 * Are most of th
0570: 65 20 57 69 6e 33 32 20 55 6e 69 63 6f 64 65 20 e Win32 Unicode
0580: 41 50 49 73 20 61 76 61 69 6c 61 62 6c 65 20 28 APIs available (
0590: 69 2e 65 2e 20 77 69 74 68 20 63 65 72 74 61 69 i.e. with certai
05a0: 6e 20 65 78 63 65 70 74 69 6f 6e 73 0a 2a 2a 20 n exceptions.**
05b0: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 75 62 based on the sub
05c0: 2d 70 6c 61 74 66 6f 72 6d 29 3f 0a 2a 2f 0a 23 -platform)?.*/.#
05d0: 69 66 20 28 53 51 4c 49 54 45 5f 4f 53 5f 57 49 if (SQLITE_OS_WI
05e0: 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 NCE || SQLITE_OS
05f0: 5f 57 49 4e 4e 54 20 7c 7c 20 53 51 4c 49 54 45 _WINNT || SQLITE
0600: 5f 4f 53 5f 57 49 4e 52 54 29 20 26 26 20 5c 0a _OS_WINRT) && \.
0610: 20 20 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c !defined(SQL
0620: 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 57 49 44 ITE_WIN32_NO_WID
0630: 45 29 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c E).# define SQL
0640: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 ITE_WIN32_HAS_WI
0650: 44 45 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a DE.#endif../*.**
0660: 20 4d 61 6b 65 20 73 75 72 65 20 61 74 20 6c 65 Make sure at le
0670: 61 73 74 20 6f 6e 65 20 73 65 74 20 6f 66 20 57 ast one set of W
0680: 69 6e 33 32 20 41 50 49 73 20 69 73 20 61 76 61 in32 APIs is ava
0690: 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 20 21 ilable..*/.#if !
06a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 defined(SQLITE_W
06b0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 IN32_HAS_ANSI) &
06c0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 & !defined(SQLIT
06d0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 E_WIN32_HAS_WIDE
06e0: 29 0a 23 20 20 65 72 72 6f 72 20 22 41 74 20 6c ).# error "At l
06f0: 65 61 73 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 east one of SQLI
0700: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 TE_WIN32_HAS_ANS
0710: 49 20 61 6e 64 20 53 51 4c 49 54 45 5f 57 49 4e I and SQLITE_WIN
0720: 33 32 5f 48 41 53 5f 57 49 44 45 5c 0a 20 6d 75 32_HAS_WIDE\. mu
0730: 73 74 20 62 65 20 64 65 66 69 6e 65 64 2e 22 0a st be defined.".
0740: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 #endif../*.** De
0750: 66 69 6e 65 20 74 68 65 20 72 65 71 75 69 72 65 fine the require
0760: 64 20 57 69 6e 64 6f 77 73 20 53 44 4b 20 76 65 d Windows SDK ve
0770: 72 73 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 20 rsion constants
0780: 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a if they are not.
0790: 2a 2a 20 61 6c 72 65 61 64 79 20 61 76 61 69 6c ** already avail
07a0: 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 able..*/.#ifndef
07b0: 20 4e 54 44 44 49 5f 57 49 4e 38 0a 23 20 20 64 NTDDI_WIN8.# d
07c0: 65 66 69 6e 65 20 4e 54 44 44 49 5f 57 49 4e 38 efine NTDDI_WIN8
07d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
07e0: 20 20 20 20 20 20 20 20 30 78 30 36 30 32 30 30 0x060200
07f0: 30 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 00.#endif..#ifnd
0800: 65 66 20 4e 54 44 44 49 5f 57 49 4e 42 4c 55 45 ef NTDDI_WINBLUE
0810: 0a 23 20 20 64 65 66 69 6e 65 20 4e 54 44 44 49 .# define NTDDI
0820: 5f 57 49 4e 42 4c 55 45 20 20 20 20 20 20 20 20 _WINBLUE
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30 0x0
0840: 36 30 33 30 30 30 30 0a 23 65 6e 64 69 66 0a 0a 6030000.#endif..
0850: 23 69 66 6e 64 65 66 20 4e 54 44 44 49 5f 57 49 #ifndef NTDDI_WI
0860: 4e 54 48 52 45 53 48 4f 4c 44 0a 23 20 20 64 65 NTHRESHOLD.# de
0870: 66 69 6e 65 20 4e 54 44 44 49 5f 57 49 4e 54 48 fine NTDDI_WINTH
0880: 52 45 53 48 4f 4c 44 20 20 20 20 20 20 20 20 20 RESHOLD
0890: 20 20 20 20 20 20 20 30 78 30 36 30 34 30 30 30 0x0604000
08a0: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 0.#endif../*.**
08b0: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 Check to see if
08c0: 74 68 65 20 47 65 74 56 65 72 73 69 6f 6e 45 78 the GetVersionEx
08d0: 5b 41 57 5d 20 66 75 6e 63 74 69 6f 6e 73 20 61 [AW] functions a
08e0: 72 65 20 64 65 70 72 65 63 61 74 65 64 20 6f 6e re deprecated on
08f0: 20 74 68 65 0a 2a 2a 20 74 61 72 67 65 74 20 73 the.** target s
0900: 79 73 74 65 6d 2e 20 20 47 65 74 56 65 72 73 69 ystem. GetVersi
0910: 6f 6e 45 78 20 77 61 73 20 66 69 72 73 74 20 64 onEx was first d
0920: 65 70 72 65 63 61 74 65 64 20 69 6e 20 57 69 6e eprecated in Win
0930: 38 2e 31 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 8.1..*/.#ifndef
0940: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 SQLITE_WIN32_GET
0950: 56 45 52 53 49 4f 4e 45 58 0a 23 20 20 69 66 20 VERSIONEX.# if
0960: 64 65 66 69 6e 65 64 28 4e 54 44 44 49 5f 56 45 defined(NTDDI_VE
0970: 52 53 49 4f 4e 29 20 26 26 20 4e 54 44 44 49 5f RSION) && NTDDI_
0980: 56 45 52 53 49 4f 4e 20 3e 3d 20 4e 54 44 44 49 VERSION >= NTDDI
0990: 5f 57 49 4e 42 4c 55 45 0a 23 20 20 20 20 64 65 _WINBLUE.# de
09a0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 fine SQLITE_WIN3
09b0: 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 20 20 2_GETVERSIONEX
09c0: 20 30 20 20 20 2f 2a 20 47 65 74 56 65 72 73 69 0 /* GetVersi
09d0: 6f 6e 45 78 28 29 20 69 73 20 64 65 70 72 65 63 onEx() is deprec
09e0: 61 74 65 64 20 2a 2f 0a 23 20 20 65 6c 73 65 0a ated */.# else.
09f0: 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 # define SQLI
0a00: 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53 TE_WIN32_GETVERS
0a10: 49 4f 4e 45 58 20 20 20 31 20 20 20 2f 2a 20 47 IONEX 1 /* G
0a20: 65 74 56 65 72 73 69 6f 6e 45 78 28 29 20 69 73 etVersionEx() is
0a30: 20 63 75 72 72 65 6e 74 20 2a 2f 0a 23 20 20 65 current */.# e
0a40: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a ndif.#endif../*.
0a50: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 ** Check to see
0a60: 69 66 20 74 68 65 20 43 72 65 61 74 65 46 69 6c if the CreateFil
0a70: 65 4d 61 70 70 69 6e 67 41 20 66 75 6e 63 74 69 eMappingA functi
0a80: 6f 6e 20 69 73 20 73 75 70 70 6f 72 74 65 64 20 on is supported
0a90: 6f 6e 20 74 68 65 0a 2a 2a 20 74 61 72 67 65 74 on the.** target
0aa0: 20 73 79 73 74 65 6d 2e 20 20 49 74 20 69 73 20 system. It is
0ab0: 75 6e 61 76 61 69 6c 61 62 6c 65 20 77 68 65 6e unavailable when
0ac0: 20 75 73 69 6e 67 20 22 6d 69 6e 63 6f 72 65 2e using "mincore.
0ad0: 6c 69 62 22 20 6f 6e 20 57 69 6e 31 30 2e 0a 2a lib" on Win10..*
0ae0: 2a 20 57 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 * When compiling
0af0: 20 66 6f 72 20 57 69 6e 64 6f 77 73 20 31 30 2c for Windows 10,
0b00: 20 61 6c 77 61 79 73 20 61 73 73 75 6d 65 20 22 always assume "
0b10: 6d 69 6e 63 6f 72 65 2e 6c 69 62 22 20 69 73 20 mincore.lib" is
0b20: 69 6e 20 75 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 in use..*/.#ifnd
0b30: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f ef SQLITE_WIN32_
0b40: 43 52 45 41 54 45 46 49 4c 45 4d 41 50 50 49 4e CREATEFILEMAPPIN
0b50: 47 41 0a 23 20 20 69 66 20 64 65 66 69 6e 65 64 GA.# if defined
0b60: 28 4e 54 44 44 49 5f 56 45 52 53 49 4f 4e 29 20 (NTDDI_VERSION)
0b70: 26 26 20 4e 54 44 44 49 5f 56 45 52 53 49 4f 4e && NTDDI_VERSION
0b80: 20 3e 3d 20 4e 54 44 44 49 5f 57 49 4e 54 48 52 >= NTDDI_WINTHR
0b90: 45 53 48 4f 4c 44 0a 23 20 20 20 20 64 65 66 69 ESHOLD.# defi
0ba0: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f ne SQLITE_WIN32_
0bb0: 43 52 45 41 54 45 46 49 4c 45 4d 41 50 50 49 4e CREATEFILEMAPPIN
0bc0: 47 41 20 20 20 30 0a 23 20 20 65 6c 73 65 0a 23 GA 0.# else.#
0bd0: 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 define SQLIT
0be0: 45 5f 57 49 4e 33 32 5f 43 52 45 41 54 45 46 49 E_WIN32_CREATEFI
0bf0: 4c 45 4d 41 50 50 49 4e 47 41 20 20 20 31 0a 23 LEMAPPINGA 1.#
0c00: 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a endif.#endif..
0c10: 2f 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6e 73 74 /*.** This const
0c20: 61 6e 74 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 ant should alrea
0c30: 64 79 20 62 65 20 64 65 66 69 6e 65 64 20 28 69 dy be defined (i
0c40: 6e 20 74 68 65 20 22 57 69 6e 44 65 66 2e 68 22 n the "WinDef.h"
0c50: 20 53 44 4b 20 66 69 6c 65 29 2e 0a 2a 2f 0a 23 SDK file)..*/.#
0c60: 69 66 6e 64 65 66 20 4d 41 58 5f 50 41 54 48 0a ifndef MAX_PATH.
0c70: 23 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 # define MAX_PA
0c80: 54 48 20 20 20 20 20 20 20 20 20 20 20 20 20 20 TH
0c90: 20 20 20 20 20 20 20 20 28 32 36 30 29 0a 23 65 (260).#e
0ca0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 ndif../*.** Maxi
0cb0: 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e mum pathname len
0cc0: 67 74 68 20 28 69 6e 20 63 68 61 72 73 29 20 66 gth (in chars) f
0cd0: 6f 72 20 57 69 6e 33 32 2e 20 20 54 68 69 73 20 or Win32. This
0ce0: 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 should normally
0cf0: 62 65 0a 2a 2a 20 4d 41 58 5f 50 41 54 48 2e 0a be.** MAX_PATH..
0d00: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 */.#ifndef SQLIT
0d10: 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48 E_WIN32_MAX_PATH
0d20: 5f 43 48 41 52 53 0a 23 20 20 64 65 66 69 6e 65 _CHARS.# define
0d30: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 SQLITE_WIN32_MA
0d40: 58 5f 50 41 54 48 5f 43 48 41 52 53 20 20 20 28 X_PATH_CHARS (
0d50: 4d 41 58 5f 50 41 54 48 29 0a 23 65 6e 64 69 66 MAX_PATH).#endif
0d60: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6e ../*.** This con
0d70: 73 74 61 6e 74 20 73 68 6f 75 6c 64 20 61 6c 72 stant should alr
0d80: 65 61 64 79 20 62 65 20 64 65 66 69 6e 65 64 20 eady be defined
0d90: 28 69 6e 20 74 68 65 20 22 57 69 6e 4e 54 2e 68 (in the "WinNT.h
0da0: 22 20 53 44 4b 20 66 69 6c 65 29 2e 0a 2a 2f 0a " SDK file)..*/.
0db0: 23 69 66 6e 64 65 66 20 55 4e 49 43 4f 44 45 5f #ifndef UNICODE_
0dc0: 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52 53 STRING_MAX_CHARS
0dd0: 0a 23 20 20 64 65 66 69 6e 65 20 55 4e 49 43 4f .# define UNICO
0de0: 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48 DE_STRING_MAX_CH
0df0: 41 52 53 20 20 20 20 20 20 28 33 32 37 36 37 29 ARS (32767)
0e00: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d .#endif../*.** M
0e10: 61 78 69 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20 aximum pathname
0e20: 6c 65 6e 67 74 68 20 28 69 6e 20 63 68 61 72 73 length (in chars
0e30: 29 20 66 6f 72 20 57 69 6e 4e 54 2e 20 20 54 68 ) for WinNT. Th
0e40: 69 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c is should normal
0e50: 6c 79 20 62 65 0a 2a 2a 20 55 4e 49 43 4f 44 45 ly be.** UNICODE
0e60: 5f 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52 _STRING_MAX_CHAR
0e70: 53 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 S..*/.#ifndef SQ
0e80: 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 LITE_WINNT_MAX_P
0e90: 41 54 48 5f 43 48 41 52 53 0a 23 20 20 64 65 66 ATH_CHARS.# def
0ea0: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 ine SQLITE_WINNT
0eb0: 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41 52 53 20 _MAX_PATH_CHARS
0ec0: 20 20 28 55 4e 49 43 4f 44 45 5f 53 54 52 49 4e (UNICODE_STRIN
0ed0: 47 5f 4d 41 58 5f 43 48 41 52 53 29 0a 23 65 6e G_MAX_CHARS).#en
0ee0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d dif../*.** Maxim
0ef0: 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67 um pathname leng
0f00: 74 68 20 28 69 6e 20 62 79 74 65 73 29 20 66 6f th (in bytes) fo
0f10: 72 20 57 69 6e 33 32 2e 20 20 54 68 65 20 4d 41 r Win32. The MA
0f20: 58 5f 50 41 54 48 20 6d 61 63 72 6f 20 69 73 20 X_PATH macro is
0f30: 69 6e 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 in.** characters
0f40: 2c 20 73 6f 20 77 65 20 61 6c 6c 6f 63 61 74 65 , so we allocate
0f50: 20 34 20 62 79 74 65 73 20 70 65 72 20 63 68 61 4 bytes per cha
0f60: 72 61 63 74 65 72 20 61 73 73 75 6d 69 6e 67 20 racter assuming
0f70: 77 6f 72 73 74 2d 63 61 73 65 20 6f 66 0a 2a 2a worst-case of.**
0f80: 20 34 2d 62 79 74 65 73 2d 70 65 72 2d 63 68 61 4-bytes-per-cha
0f90: 72 61 63 74 65 72 20 66 6f 72 20 55 54 46 38 2e racter for UTF8.
0fa0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 .*/.#ifndef SQLI
0fb0: 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 TE_WIN32_MAX_PAT
0fc0: 48 5f 42 59 54 45 53 0a 23 20 20 64 65 66 69 6e H_BYTES.# defin
0fd0: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d e SQLITE_WIN32_M
0fe0: 41 58 5f 50 41 54 48 5f 42 59 54 45 53 20 20 20 AX_PATH_BYTES
0ff0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 (SQLITE_WIN32_MA
1000: 58 5f 50 41 54 48 5f 43 48 41 52 53 2a 34 29 0a X_PATH_CHARS*4).
1010: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 #endif../*.** Ma
1020: 78 69 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c ximum pathname l
1030: 65 6e 67 74 68 20 28 69 6e 20 62 79 74 65 73 29 ength (in bytes)
1040: 20 66 6f 72 20 57 69 6e 4e 54 2e 20 20 54 68 69 for WinNT. Thi
1050: 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c s should normall
1060: 79 20 62 65 0a 2a 2a 20 55 4e 49 43 4f 44 45 5f y be.** UNICODE_
1070: 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52 53 STRING_MAX_CHARS
1080: 20 2a 20 73 69 7a 65 6f 66 28 57 43 48 41 52 29 * sizeof(WCHAR)
1090: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c ..*/.#ifndef SQL
10a0: 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 ITE_WINNT_MAX_PA
10b0: 54 48 5f 42 59 54 45 53 0a 23 20 20 64 65 66 69 TH_BYTES.# defi
10c0: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f ne SQLITE_WINNT_
10d0: 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53 20 20 MAX_PATH_BYTES
10e0: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 \.
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 (
1100: 73 69 7a 65 6f 66 28 57 43 48 41 52 29 20 2a 20 sizeof(WCHAR) *
1110: 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 SQLITE_WINNT_MAX
1120: 5f 50 41 54 48 5f 43 48 41 52 53 29 0a 23 65 6e _PATH_CHARS).#en
1130: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d dif../*.** Maxim
1140: 75 6d 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 um error message
1150: 20 6c 65 6e 67 74 68 20 28 69 6e 20 63 68 61 72 length (in char
1160: 73 29 20 66 6f 72 20 57 69 6e 52 54 2e 0a 2a 2f s) for WinRT..*/
1170: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f .#ifndef SQLITE_
1180: 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47 WIN32_MAX_ERRMSG
1190: 5f 43 48 41 52 53 0a 23 20 20 64 65 66 69 6e 65 _CHARS.# define
11a0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 SQLITE_WIN32_MA
11b0: 58 5f 45 52 52 4d 53 47 5f 43 48 41 52 53 20 28 X_ERRMSG_CHARS (
11c0: 31 30 32 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 1024).#endif../*
11d0: 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d .** Returns non-
11e0: 7a 65 72 6f 20 69 66 20 74 68 65 20 63 68 61 72 zero if the char
11f0: 61 63 74 65 72 20 73 68 6f 75 6c 64 20 62 65 20 acter should be
1200: 74 72 65 61 74 65 64 20 61 73 20 61 20 64 69 72 treated as a dir
1210: 65 63 74 6f 72 79 0a 2a 2a 20 73 65 70 61 72 61 ectory.** separa
1220: 74 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 tor..*/.#ifndef
1230: 77 69 6e 49 73 44 69 72 53 65 70 0a 23 20 20 64 winIsDirSep.# d
1240: 65 66 69 6e 65 20 77 69 6e 49 73 44 69 72 53 65 efine winIsDirSe
1250: 70 28 61 29 20 20 20 20 20 20 20 20 20 20 20 20 p(a)
1260: 20 20 20 20 28 28 28 61 29 20 3d 3d 20 27 2f 27 (((a) == '/'
1270: 29 20 7c 7c 20 28 28 61 29 20 3d 3d 20 27 5c 5c ) || ((a) == '\\
1280: 27 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a ')).#endif../*.*
1290: 2a 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20 * This macro is
12a0: 75 73 65 64 20 77 68 65 6e 20 61 20 6c 6f 63 61 used when a loca
12b0: 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65 l variable is se
12c0: 74 20 74 6f 20 61 20 76 61 6c 75 65 20 74 68 61 t to a value tha
12d0: 74 20 69 73 0a 2a 2a 20 5b 73 6f 6d 65 74 69 6d t is.** [sometim
12e0: 65 73 5d 20 6e 6f 74 20 75 73 65 64 20 62 79 20 es] not used by
12f0: 74 68 65 20 63 6f 64 65 20 28 65 2e 67 2e 20 76 the code (e.g. v
1300: 69 61 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 63 ia conditional c
1310: 6f 6d 70 69 6c 61 74 69 6f 6e 29 2e 0a 2a 2f 0a ompilation)..*/.
1320: 23 69 66 6e 64 65 66 20 55 4e 55 53 45 44 5f 56 #ifndef UNUSED_V
1330: 41 52 49 41 42 4c 45 5f 56 41 4c 55 45 0a 23 20 ARIABLE_VALUE.#
1340: 20 64 65 66 69 6e 65 20 55 4e 55 53 45 44 5f 56 define UNUSED_V
1350: 41 52 49 41 42 4c 45 5f 56 41 4c 55 45 28 78 29 ARIABLE_VALUE(x)
1360: 20 20 20 20 20 20 28 76 6f 69 64 29 28 78 29 0a (void)(x).
1370: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 #endif../*.** Re
1380: 74 75 72 6e 73 20 74 68 65 20 63 68 61 72 61 63 turns the charac
1390: 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64 20 ter that should
13a0: 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20 64 be used as the d
13b0: 69 72 65 63 74 6f 72 79 20 73 65 70 61 72 61 74 irectory separat
13c0: 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 77 or..*/.#ifndef w
13d0: 69 6e 47 65 74 44 69 72 53 65 70 0a 23 20 20 64 inGetDirSep.# d
13e0: 65 66 69 6e 65 20 77 69 6e 47 65 74 44 69 72 53 efine winGetDirS
13f0: 65 70 28 29 20 20 20 20 20 20 20 20 20 20 20 20 ep()
1400: 20 20 20 20 27 5c 5c 27 0a 23 65 6e 64 69 66 0a '\\'.#endif.
1410: 0a 2f 2a 0a 2a 2a 20 44 6f 20 77 65 20 6e 65 65 ./*.** Do we nee
1420: 64 20 74 6f 20 6d 61 6e 75 61 6c 6c 79 20 64 65 d to manually de
1430: 66 69 6e 65 20 74 68 65 20 57 69 6e 33 32 20 66 fine the Win32 f
1440: 69 6c 65 20 6d 61 70 70 69 6e 67 20 41 50 49 73 ile mapping APIs
1450: 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 57 41 for use with WA
1460: 4c 0a 2a 2a 20 6d 6f 64 65 20 6f 72 20 6d 65 6d L.** mode or mem
1470: 6f 72 79 20 6d 61 70 70 65 64 20 66 69 6c 65 73 ory mapped files
1480: 20 28 65 2e 67 2e 20 74 68 65 73 65 20 41 50 49 (e.g. these API
1490: 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 s are available
14a0: 69 6e 20 74 68 65 20 57 69 6e 64 6f 77 73 0a 2a in the Windows.*
14b0: 2a 20 43 45 20 53 44 4b 3b 20 68 6f 77 65 76 65 * CE SDK; howeve
14c0: 72 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 r, they are not
14d0: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 68 present in the h
14e0: 65 61 64 65 72 20 66 69 6c 65 29 3f 0a 2a 2f 0a eader file)?.*/.
14f0: 23 69 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 #if SQLITE_WIN32
1500: 5f 46 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50 49 _FILEMAPPING_API
1510: 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 28 21 && \. (!
1520: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f defined(SQLITE_O
1530: 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 MIT_WAL) || SQLI
1540: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 TE_MAX_MMAP_SIZE
1550: 3e 30 29 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 6f 66 >0)./*.** Two of
1560: 20 74 68 65 20 66 69 6c 65 20 6d 61 70 70 69 6e the file mappin
1570: 67 20 41 50 49 73 20 61 72 65 20 64 69 66 66 65 g APIs are diffe
1580: 72 65 6e 74 20 75 6e 64 65 72 20 57 69 6e 52 54 rent under WinRT
1590: 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 . Figure out wh
15a0: 69 63 68 0a 2a 2a 20 73 65 74 20 77 65 20 6e 65 ich.** set we ne
15b0: 65 64 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 ed..*/.#if SQLIT
15c0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 57 49 4e 42 41 E_OS_WINRT.WINBA
15d0: 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e SEAPI HANDLE WIN
15e0: 41 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61 API CreateFileMa
15f0: 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 48 41 4e ppingFromApp(HAN
1600: 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c DLE, \. L
1610: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 PSECURITY_ATTRIB
1620: 55 54 45 53 2c 20 55 4c 4f 4e 47 2c 20 55 4c 4f UTES, ULONG, ULO
1630: 4e 47 36 34 2c 20 4c 50 43 57 53 54 52 29 3b 0a NG64, LPCWSTR);.
1640: 0a 57 49 4e 42 41 53 45 41 50 49 20 4c 50 56 4f .WINBASEAPI LPVO
1650: 49 44 20 57 49 4e 41 50 49 20 4d 61 70 56 69 65 ID WINAPI MapVie
1660: 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 48 wOfFileFromApp(H
1670: 41 4e 44 4c 45 2c 20 55 4c 4f 4e 47 2c 20 55 4c ANDLE, ULONG, UL
1680: 4f 4e 47 36 34 2c 20 53 49 5a 45 5f 54 29 3b 0a ONG64, SIZE_T);.
1690: 23 65 6c 73 65 0a 23 69 66 20 64 65 66 69 6e 65 #else.#if define
16a0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 d(SQLITE_WIN32_H
16b0: 41 53 5f 41 4e 53 49 29 0a 57 49 4e 42 41 53 45 AS_ANSI).WINBASE
16c0: 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e 41 50 API HANDLE WINAP
16d0: 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 I CreateFileMapp
16e0: 69 6e 67 41 28 48 41 4e 44 4c 45 2c 20 4c 50 53 ingA(HANDLE, LPS
16f0: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 ECURITY_ATTRIBUT
1700: 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 ES, \. DW
1710: 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 ORD, DWORD, DWOR
1720: 44 2c 20 4c 50 43 53 54 52 29 3b 0a 23 65 6e 64 D, LPCSTR);.#end
1730: 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 if /* defined(SQ
1740: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 LITE_WIN32_HAS_A
1750: 4e 53 49 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66 NSI) */..#if def
1760: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 ined(SQLITE_WIN3
1770: 32 5f 48 41 53 5f 57 49 44 45 29 0a 57 49 4e 42 2_HAS_WIDE).WINB
1780: 41 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49 ASEAPI HANDLE WI
1790: 4e 41 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d NAPI CreateFileM
17a0: 61 70 70 69 6e 67 57 28 48 41 4e 44 4c 45 2c 20 appingW(HANDLE,
17b0: 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 LPSECURITY_ATTRI
17c0: 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 BUTES, \.
17d0: 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44 DWORD, DWORD, D
17e0: 57 4f 52 44 2c 20 4c 50 43 57 53 54 52 29 3b 0a WORD, LPCWSTR);.
17f0: 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 #endif /* define
1800: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 d(SQLITE_WIN32_H
1810: 41 53 5f 57 49 44 45 29 20 2a 2f 0a 0a 57 49 4e AS_WIDE) */..WIN
1820: 42 41 53 45 41 50 49 20 4c 50 56 4f 49 44 20 57 BASEAPI LPVOID W
1830: 49 4e 41 50 49 20 4d 61 70 56 69 65 77 4f 66 46 INAPI MapViewOfF
1840: 69 6c 65 28 48 41 4e 44 4c 45 2c 20 44 57 4f 52 ile(HANDLE, DWOR
1850: 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c D, DWORD, DWORD,
1860: 20 53 49 5a 45 5f 54 29 3b 0a 23 65 6e 64 69 66 SIZE_T);.#endif
1870: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 /* SQLITE_OS_WI
1880: 4e 52 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 NRT */../*.** Th
1890: 65 73 65 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 ese file mapping
18a0: 20 41 50 49 73 20 61 72 65 20 63 6f 6d 6d 6f 6e APIs are common
18b0: 20 74 6f 20 62 6f 74 68 20 57 69 6e 33 32 20 61 to both Win32 a
18c0: 6e 64 20 57 69 6e 52 54 2e 0a 2a 2f 0a 0a 57 49 nd WinRT..*/..WI
18d0: 4e 42 41 53 45 41 50 49 20 42 4f 4f 4c 20 57 49 NBASEAPI BOOL WI
18e0: 4e 41 50 49 20 46 6c 75 73 68 56 69 65 77 4f 66 NAPI FlushViewOf
18f0: 46 69 6c 65 28 4c 50 43 56 4f 49 44 2c 20 53 49 File(LPCVOID, SI
1900: 5a 45 5f 54 29 3b 0a 57 49 4e 42 41 53 45 41 50 ZE_T);.WINBASEAP
1910: 49 20 42 4f 4f 4c 20 57 49 4e 41 50 49 20 55 6e I BOOL WINAPI Un
1920: 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 4c 50 mapViewOfFile(LP
1930: 43 56 4f 49 44 29 3b 0a 23 65 6e 64 69 66 20 2f CVOID);.#endif /
1940: 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 46 * SQLITE_WIN32_F
1950: 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50 49 20 2a ILEMAPPING_API *
1960: 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d 69 /../*.** Some Mi
1970: 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72 crosoft compiler
1980: 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66 69 s lack this defi
1990: 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 nition..*/.#ifnd
19a0: 65 66 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f ef INVALID_FILE_
19b0: 41 54 54 52 49 42 55 54 45 53 0a 23 20 64 65 66 ATTRIBUTES.# def
19c0: 69 6e 65 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 ine INVALID_FILE
19d0: 5f 41 54 54 52 49 42 55 54 45 53 20 28 28 44 57 _ATTRIBUTES ((DW
19e0: 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a ORD)-1).#endif..
19f0: 23 69 66 6e 64 65 66 20 46 49 4c 45 5f 46 4c 41 #ifndef FILE_FLA
1a00: 47 5f 4d 41 53 4b 0a 23 20 64 65 66 69 6e 65 20 G_MASK.# define
1a10: 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 20 20 FILE_FLAG_MASK
1a20: 20 20 20 20 20 20 20 20 28 30 78 46 46 33 43 30 (0xFF3C0
1a30: 30 30 30 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 000).#endif..#if
1a40: 6e 64 65 66 20 46 49 4c 45 5f 41 54 54 52 49 42 ndef FILE_ATTRIB
1a50: 55 54 45 5f 4d 41 53 4b 0a 23 20 64 65 66 69 6e UTE_MASK.# defin
1a60: 65 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 e FILE_ATTRIBUTE
1a70: 5f 4d 41 53 4b 20 20 20 20 20 28 30 78 30 30 30 _MASK (0x000
1a80: 33 46 46 46 37 29 0a 23 65 6e 64 69 66 0a 0a 23 3FFF7).#endif..#
1a90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d ifndef SQLITE_OM
1aa0: 49 54 5f 57 41 4c 0a 2f 2a 20 46 6f 72 77 61 72 IT_WAL./* Forwar
1ab0: 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 d references to
1ac0: 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20 structures used
1ad0: 66 6f 72 20 57 41 4c 20 2a 2f 0a 74 79 70 65 64 for WAL */.typed
1ae0: 65 66 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d ef struct winShm
1af0: 20 77 69 6e 53 68 6d 3b 20 20 20 20 20 20 20 20 winShm;
1b00: 20 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 /* A connecti
1b10: 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d on to shared-mem
1b20: 6f 72 79 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 ory */.typedef s
1b30: 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 truct winShmNode
1b40: 20 77 69 6e 53 68 6d 4e 6f 64 65 3b 20 20 20 2f winShmNode; /
1b50: 2a 20 41 20 72 65 67 69 6f 6e 20 6f 66 20 73 68 * A region of sh
1b60: 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 23 ared-memory */.#
1b70: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e endif../*.** Win
1b80: 43 45 20 6c 61 63 6b 73 20 6e 61 74 69 76 65 20 CE lacks native
1b90: 73 75 70 70 6f 72 74 20 66 6f 72 20 66 69 6c 65 support for file
1ba0: 20 6c 6f 63 6b 69 6e 67 20 73 6f 20 77 65 20 68 locking so we h
1bb0: 61 76 65 20 74 6f 20 66 61 6b 65 20 69 74 0a 2a ave to fake it.*
1bc0: 2a 20 77 69 74 68 20 73 6f 6d 65 20 63 6f 64 65 * with some code
1bd0: 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 2a 2f 0a of our own..*/.
1be0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 #if SQLITE_OS_WI
1bf0: 4e 43 45 0a 74 79 70 65 64 65 66 20 73 74 72 75 NCE.typedef stru
1c00: 63 74 20 77 69 6e 63 65 4c 6f 63 6b 20 7b 0a 20 ct winceLock {.
1c10: 20 69 6e 74 20 6e 52 65 61 64 65 72 73 3b 20 20 int nReaders;
1c20: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f /* Number o
1c30: 66 20 72 65 61 64 65 72 20 6c 6f 63 6b 73 20 6f f reader locks o
1c40: 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f btained */. BOO
1c50: 4c 20 62 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 L bPending;
1c60: 20 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20 /* Indicates a
1c70: 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 pending lock has
1c80: 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a been obtained *
1c90: 2f 0a 20 20 42 4f 4f 4c 20 62 52 65 73 65 72 76 /. BOOL bReserv
1ca0: 65 64 3b 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 ed; /* Indic
1cb0: 61 74 65 73 20 61 20 72 65 73 65 72 76 65 64 20 ates a reserved
1cc0: 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 lock has been ob
1cd0: 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c tained */. BOOL
1ce0: 20 62 45 78 63 6c 75 73 69 76 65 3b 20 20 20 20 bExclusive;
1cf0: 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61 6e 20 /* Indicates an
1d00: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 68 exclusive lock h
1d10: 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 as been obtained
1d20: 20 2a 2f 0a 7d 20 77 69 6e 63 65 4c 6f 63 6b 3b */.} winceLock;
1d30: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 .#endif../*.** T
1d40: 68 65 20 77 69 6e 46 69 6c 65 20 73 74 72 75 63 he winFile struc
1d50: 74 75 72 65 20 69 73 20 61 20 73 75 62 63 6c 61 ture is a subcla
1d60: 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 ss of sqlite3_fi
1d70: 6c 65 2a 20 73 70 65 63 69 66 69 63 20 74 6f 20 le* specific to
1d80: 74 68 65 20 77 69 6e 33 32 0a 2a 2a 20 70 6f 72 the win32.** por
1d90: 74 61 62 69 6c 69 74 79 20 6c 61 79 65 72 2e 0a tability layer..
1da0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 */.typedef struc
1db0: 74 20 77 69 6e 46 69 6c 65 20 77 69 6e 46 69 6c t winFile winFil
1dc0: 65 3b 0a 73 74 72 75 63 74 20 77 69 6e 46 69 6c e;.struct winFil
1dd0: 65 20 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 e {. const sqli
1de0: 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a te3_io_methods *
1df0: 70 4d 65 74 68 6f 64 3b 20 2f 2a 2a 2a 20 4d 75 pMethod; /*** Mu
1e00: 73 74 20 62 65 20 66 69 72 73 74 20 2a 2a 2a 2f st be first ***/
1e10: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a . sqlite3_vfs *
1e20: 70 56 66 73 3b 20 20 20 20 20 20 2f 2a 20 54 68 pVfs; /* Th
1e30: 65 20 56 46 53 20 75 73 65 64 20 74 6f 20 6f 70 e VFS used to op
1e40: 65 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a en this file */.
1e50: 20 20 48 41 4e 44 4c 45 20 68 3b 20 20 20 20 20 HANDLE h;
1e60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e /* Han
1e70: 64 6c 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e dle for accessin
1e80: 67 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 g the file */.
1e90: 75 38 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20 u8 locktype;
1ea0: 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 /* Type
1eb0: 6f 66 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c of lock currentl
1ec0: 79 20 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 y held on this f
1ed0: 69 6c 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 73 ile */. short s
1ee0: 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 3b 20 20 haredLockByte;
1ef0: 20 2f 2a 20 52 61 6e 64 6f 6d 6c 79 20 63 68 6f /* Randomly cho
1f00: 73 65 6e 20 62 79 74 65 20 75 73 65 64 20 61 73 sen byte used as
1f10: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a a shared lock *
1f20: 2f 0a 20 20 75 38 20 63 74 72 6c 46 6c 61 67 73 /. u8 ctrlFlags
1f30: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 ; /* F
1f40: 6c 61 67 73 2e 20 20 53 65 65 20 57 49 4e 46 49 lags. See WINFI
1f50: 4c 45 5f 2a 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 LE_* below */.
1f60: 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b DWORD lastErrno;
1f70: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 /* The W
1f80: 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f indows errno fro
1f90: 6d 20 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 m the last I/O e
1fa0: 72 72 6f 72 20 2a 2f 0a 23 69 66 6e 64 65 66 20 rror */.#ifndef
1fb0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a SQLITE_OMIT_WAL.
1fc0: 20 20 77 69 6e 53 68 6d 20 2a 70 53 68 6d 3b 20 winShm *pShm;
1fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 /* Ins
1fe0: 74 61 6e 63 65 20 6f 66 20 73 68 61 72 65 64 20 tance of shared
1ff0: 6d 65 6d 6f 72 79 20 6f 6e 20 74 68 69 73 20 66 memory on this f
2000: 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 ile */.#endif.
2010: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 const char *zPat
2020: 68 3b 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 h; /* Full
2030: 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 69 73 pathname of this
2040: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 file */. int s
2050: 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 zChunk;
2060: 20 20 20 2f 2a 20 43 68 75 6e 6b 20 73 69 7a 65 /* Chunk size
2070: 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46 configured by F
2080: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20 CNTL_CHUNK_SIZE
2090: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 */.#if SQLITE_OS
20a0: 5f 57 49 4e 43 45 0a 20 20 4c 50 57 53 54 52 20 _WINCE. LPWSTR
20b0: 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 3b 20 zDeleteOnClose;
20c0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 /* Name of file
20d0: 20 74 6f 20 64 65 6c 65 74 65 20 77 68 65 6e 20 to delete when
20e0: 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20 20 48 41 4e closing */. HAN
20f0: 44 4c 45 20 68 4d 75 74 65 78 3b 20 20 20 20 20 DLE hMutex;
2100: 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 75 73 /* Mutex us
2110: 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 ed to control ac
2120: 63 65 73 73 20 74 6f 20 73 68 61 72 65 64 20 6c cess to shared l
2130: 6f 63 6b 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 ock */. HANDLE
2140: 68 53 68 61 72 65 64 3b 20 20 20 20 20 20 20 20 hShared;
2150: 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 /* Shared memor
2160: 79 20 73 65 67 6d 65 6e 74 20 75 73 65 64 20 66 y segment used f
2170: 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 or locking */.
2180: 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f 63 61 6c 3b winceLock local;
2190: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 73 /* Locks
21a0: 20 6f 62 74 61 69 6e 65 64 20 62 79 20 74 68 69 obtained by thi
21b0: 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 77 69 s instance of wi
21c0: 6e 46 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 63 65 nFile */. wince
21d0: 4c 6f 63 6b 20 2a 73 68 61 72 65 64 3b 20 20 20 Lock *shared;
21e0: 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 68 61 /* Global sha
21f0: 72 65 64 20 6c 6f 63 6b 20 6d 65 6d 6f 72 79 20 red lock memory
2200: 66 6f 72 20 74 68 65 20 66 69 6c 65 20 20 2a 2f for the file */
2210: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 .#endif.#if SQLI
2220: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 TE_MAX_MMAP_SIZE
2230: 3e 30 0a 20 20 69 6e 74 20 6e 46 65 74 63 68 4f >0. int nFetchO
2240: 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 ut;
2250: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 /* Number of
2260: 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74 outstanding xFet
2270: 63 68 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f ch references */
2280: 0a 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20 . HANDLE hMap;
2290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
22a0: 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 61 /* Handle for a
22b0: 63 63 65 73 73 69 6e 67 20 6d 65 6d 6f 72 79 20 ccessing memory
22c0: 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 76 6f 69 mapping */. voi
22d0: 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20 d *pMapRegion;
22e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 /* Ar
22f0: 65 61 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 ea memory mapped
2300: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e */. sqlite3_in
2310: 74 36 34 20 6d 6d 61 70 53 69 7a 65 3b 20 20 20 t64 mmapSize;
2320: 20 20 20 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 /* Usable si
2330: 7a 65 20 6f 66 20 6d 61 70 70 65 64 20 72 65 67 ze of mapped reg
2340: 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 ion */. sqlite3
2350: 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 41 _int64 mmapSizeA
2360: 63 74 75 61 6c 3b 20 2f 2a 20 41 63 74 75 61 6c ctual; /* Actual
2370: 20 73 69 7a 65 20 6f 66 20 6d 61 70 70 65 64 20 size of mapped
2380: 72 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 region */. sqli
2390: 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 te3_int64 mmapSi
23a0: 7a 65 4d 61 78 3b 20 20 20 20 2f 2a 20 43 6f 6e zeMax; /* Con
23b0: 66 69 67 75 72 65 64 20 46 43 4e 54 4c 5f 4d 4d figured FCNTL_MM
23c0: 41 50 5f 53 49 5a 45 20 76 61 6c 75 65 20 2a 2f AP_SIZE value */
23d0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a .#endif.};../*.*
23e0: 2a 20 54 68 65 20 77 69 6e 56 66 73 41 70 70 44 * The winVfsAppD
23f0: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 69 73 ata structure is
2400: 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 70 41 used for the pA
2410: 70 70 44 61 74 61 20 6d 65 6d 62 65 72 20 66 6f ppData member fo
2420: 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 r all of the.**
2430: 57 69 6e 33 32 20 56 46 53 20 76 61 72 69 61 6e Win32 VFS varian
2440: 74 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 ts..*/.typedef s
2450: 74 72 75 63 74 20 77 69 6e 56 66 73 41 70 70 44 truct winVfsAppD
2460: 61 74 61 20 77 69 6e 56 66 73 41 70 70 44 61 74 ata winVfsAppDat
2470: 61 3b 0a 73 74 72 75 63 74 20 77 69 6e 56 66 73 a;.struct winVfs
2480: 41 70 70 44 61 74 61 20 7b 0a 20 20 63 6f 6e 73 AppData {. cons
2490: 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 t sqlite3_io_met
24a0: 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 3b 20 2f hods *pMethod; /
24b0: 2a 20 54 68 65 20 66 69 6c 65 20 49 2f 4f 20 6d * The file I/O m
24c0: 65 74 68 6f 64 73 20 74 6f 20 75 73 65 2e 20 2a ethods to use. *
24d0: 2f 0a 20 20 76 6f 69 64 20 2a 70 41 70 70 44 61 /. void *pAppDa
24e0: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 ta;
24f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 /* The ex
2500: 74 72 61 20 70 41 70 70 44 61 74 61 2c 20 69 66 tra pAppData, if
2510: 20 61 6e 79 2e 20 2a 2f 0a 20 20 42 4f 4f 4c 20 any. */. BOOL
2520: 62 4e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 bNoLock;
2530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
2540: 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6c 6f 63 Non-zero if loc
2550: 6b 69 6e 67 20 69 73 20 64 69 73 61 62 6c 65 64 king is disabled
2560: 2e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 . */.};../*.** A
2570: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f llowed values fo
2580: 72 20 77 69 6e 46 69 6c 65 2e 63 74 72 6c 46 6c r winFile.ctrlFl
2590: 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 ags.*/.#define W
25a0: 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 INFILE_RDONLY
25b0: 20 20 20 20 20 20 20 30 78 30 32 20 20 20 2f 2a 0x02 /*
25c0: 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72 Connection is r
25d0: 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 ead only */.#def
25e0: 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50 45 52 53 ine WINFILE_PERS
25f0: 49 53 54 5f 57 41 4c 20 20 20 20 20 30 78 30 34 IST_WAL 0x04
2600: 20 20 20 2f 2a 20 50 65 72 73 69 73 74 65 6e 74 /* Persistent
2610: 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23 64 65 WAL mode */.#de
2620: 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50 53 4f fine WINFILE_PSO
2630: 57 20 20 20 20 20 20 20 20 20 20 20 20 30 78 31 W 0x1
2640: 30 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 0 /* SQLITE_IO
2650: 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 CAP_POWERSAFE_OV
2660: 45 52 57 52 49 54 45 20 2a 2f 0a 0a 2f 2a 0a 20 ERWRITE */../*.
2670: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 * The size of th
2680: 65 20 62 75 66 66 65 72 20 75 73 65 64 20 62 79 e buffer used by
2690: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77 sqlite3_win32_w
26a0: 72 69 74 65 5f 64 65 62 75 67 28 29 2e 0a 20 2a rite_debug().. *
26b0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 /.#ifndef SQLITE
26c0: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 _WIN32_DBG_BUF_S
26d0: 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 IZE.# define SQ
26e0: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 LITE_WIN32_DBG_B
26f0: 55 46 5f 53 49 5a 45 20 20 20 28 28 69 6e 74 29 UF_SIZE ((int)
2700: 28 34 30 39 36 2d 73 69 7a 65 6f 66 28 44 57 4f (4096-sizeof(DWO
2710: 52 44 29 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a RD))).#endif../*
2720: 0a 20 2a 20 54 68 65 20 76 61 6c 75 65 20 75 73 . * The value us
2730: 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 5f ed with sqlite3_
2740: 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 win32_set_direct
2750: 6f 72 79 28 29 20 74 6f 20 73 70 65 63 69 66 79 ory() to specify
2760: 20 74 68 61 74 0a 20 2a 20 74 68 65 20 64 61 74 that. * the dat
2770: 61 20 64 69 72 65 63 74 6f 72 79 20 73 68 6f 75 a directory shou
2780: 6c 64 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 ld be changed..
2790: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 */.#ifndef SQLIT
27a0: 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52 E_WIN32_DATA_DIR
27b0: 45 43 54 4f 52 59 5f 54 59 50 45 0a 23 20 20 64 ECTORY_TYPE.# d
27c0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e efine SQLITE_WIN
27d0: 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52 32_DATA_DIRECTOR
27e0: 59 5f 54 59 50 45 20 28 31 29 0a 23 65 6e 64 69 Y_TYPE (1).#endi
27f0: 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 76 61 6c f../*. * The val
2800: 75 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c ue used with sql
2810: 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 ite3_win32_set_d
2820: 69 72 65 63 74 6f 72 79 28 29 20 74 6f 20 73 70 irectory() to sp
2830: 65 63 69 66 79 20 74 68 61 74 0a 20 2a 20 74 68 ecify that. * th
2840: 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 e temporary dire
2850: 63 74 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20 ctory should be
2860: 63 68 61 6e 67 65 64 2e 0a 20 2a 2f 0a 23 69 66 changed.. */.#if
2870: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 ndef SQLITE_WIN3
2880: 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 2_TEMP_DIRECTORY
2890: 5f 54 59 50 45 0a 23 20 20 64 65 66 69 6e 65 20 _TYPE.# define
28a0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d SQLITE_WIN32_TEM
28b0: 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 P_DIRECTORY_TYPE
28c0: 20 28 32 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a (2).#endif../*.
28d0: 20 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 77 * If compiled w
28e0: 69 74 68 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 ith SQLITE_WIN32
28f0: 5f 4d 41 4c 4c 4f 43 20 6f 6e 20 57 69 6e 64 6f _MALLOC on Windo
2900: 77 73 2c 20 77 65 20 77 69 6c 6c 20 75 73 65 20 ws, we will use
2910: 74 68 65 0a 20 2a 20 76 61 72 69 6f 75 73 20 57 the. * various W
2920: 69 6e 33 32 20 41 50 49 20 68 65 61 70 20 66 75 in32 API heap fu
2930: 6e 63 74 69 6f 6e 73 20 69 6e 73 74 65 61 64 20 nctions instead
2940: 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 20 2a 2f 0a of our own.. */.
2950: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 #ifdef SQLITE_WI
2960: 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 0a 2f 2a 0a 20 N32_MALLOC../*.
2970: 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 6e * If this is non
2980: 2d 7a 65 72 6f 2c 20 61 6e 20 69 73 6f 6c 61 74 -zero, an isolat
2990: 65 64 20 68 65 61 70 20 77 69 6c 6c 20 62 65 20 ed heap will be
29a0: 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20 6e created by the n
29b0: 61 74 69 76 65 20 57 69 6e 33 32 0a 20 2a 20 61 ative Win32. * a
29c0: 6c 6c 6f 63 61 74 6f 72 20 73 75 62 73 79 73 74 llocator subsyst
29d0: 65 6d 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 74 em; otherwise, t
29e0: 68 65 20 64 65 66 61 75 6c 74 20 70 72 6f 63 65 he default proce
29f0: 73 73 20 68 65 61 70 20 77 69 6c 6c 20 62 65 20 ss heap will be
2a00: 75 73 65 64 2e 20 20 54 68 69 73 0a 20 2a 20 73 used. This. * s
2a10: 65 74 74 69 6e 67 20 68 61 73 20 6e 6f 20 65 66 etting has no ef
2a20: 66 65 63 74 20 77 68 65 6e 20 63 6f 6d 70 69 6c fect when compil
2a30: 69 6e 67 20 66 6f 72 20 57 69 6e 52 54 2e 20 20 ing for WinRT.
2a40: 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73 By default, this
2a50: 20 69 73 20 65 6e 61 62 6c 65 64 0a 20 2a 20 61 is enabled. * a
2a60: 6e 64 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 68 nd an isolated h
2a70: 65 61 70 20 77 69 6c 6c 20 62 65 20 63 72 65 61 eap will be crea
2a80: 74 65 64 20 74 6f 20 73 74 6f 72 65 20 61 6c 6c ted to store all
2a90: 20 61 6c 6c 6f 63 61 74 65 64 20 64 61 74 61 2e allocated data.
2aa0: 0a 20 2a 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a . *. ***********
2ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
2ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
2ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
2ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
2af0: 2a 2a 2a 0a 20 2a 20 57 41 52 4e 49 4e 47 3a 20 ***. * WARNING:
2b00: 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 It is important
2b10: 74 6f 20 6e 6f 74 65 20 74 68 61 74 20 77 68 65 to note that whe
2b20: 6e 20 74 68 69 73 20 73 65 74 74 69 6e 67 20 69 n this setting i
2b30: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 s non-zero and t
2b40: 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20 20 77 he. * w
2b50: 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 20 66 75 inMemShutdown fu
2b60: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 nction is called
2b70: 20 28 65 2e 67 2e 20 62 79 20 74 68 65 20 73 71 (e.g. by the sq
2b80: 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 0a 20 lite3_shutdown.
2b90: 2a 20 20 20 20 20 20 20 20 20 20 66 75 6e 63 74 * funct
2ba0: 69 6f 6e 29 2c 20 61 6c 6c 20 64 61 74 61 20 74 ion), all data t
2bb0: 68 61 74 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 hat was allocate
2bc0: 64 20 75 73 69 6e 67 20 74 68 65 20 69 73 6f 6c d using the isol
2bd0: 61 74 65 64 20 68 65 61 70 20 77 69 6c 6c 0a 20 ated heap will.
2be0: 2a 20 20 20 20 20 20 20 20 20 20 62 65 20 66 72 * be fr
2bf0: 65 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 eed immediately
2c00: 61 6e 64 20 61 6e 79 20 61 74 74 65 6d 70 74 20 and any attempt
2c10: 74 6f 20 61 63 63 65 73 73 20 61 6e 79 20 6f 66 to access any of
2c20: 20 74 68 61 74 20 66 72 65 65 64 0a 20 2a 20 20 that freed. *
2c30: 20 20 20 20 20 20 20 20 64 61 74 61 20 77 69 6c data wil
2c40: 6c 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e l almost certain
2c50: 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 ly result in an
2c60: 69 6d 6d 65 64 69 61 74 65 20 61 63 63 65 73 73 immediate access
2c70: 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 20 2a 2a 2a violation.. ***
2c80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
2c90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
2ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
2cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
2cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 2f 0a ***********. */.
2cd0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 #ifndef SQLITE_W
2ce0: 49 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54 45 IN32_HEAP_CREATE
2cf0: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 .# define SQLIT
2d00: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 45 E_WIN32_HEAP_CRE
2d10: 41 54 45 20 20 20 20 20 20 20 20 28 54 52 55 45 ATE (TRUE
2d20: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 ).#endif../*. *
2d30: 54 68 69 73 20 69 73 20 74 68 65 20 6d 61 78 69 This is the maxi
2d40: 6d 75 6d 20 70 6f 73 73 69 62 6c 65 20 69 6e 69 mum possible ini
2d50: 74 69 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 tial size of the
2d60: 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63 20 Win32-specific
2d70: 68 65 61 70 2c 20 69 6e 0a 20 2a 20 62 79 74 65 heap, in. * byte
2d80: 73 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 s.. */.#ifndef S
2d90: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 QLITE_WIN32_HEAP
2da0: 5f 4d 41 58 5f 49 4e 49 54 5f 53 49 5a 45 0a 23 _MAX_INIT_SIZE.#
2db0: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f define SQLITE_
2dc0: 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 49 WIN32_HEAP_MAX_I
2dd0: 4e 49 54 5f 53 49 5a 45 20 28 34 32 39 34 39 36 NIT_SIZE (429496
2de0: 37 32 39 35 55 29 0a 23 65 6e 64 69 66 0a 0a 2f 7295U).#endif../
2df0: 2a 0a 20 2a 20 54 68 69 73 20 69 73 20 74 68 65 *. * This is the
2e00: 20 65 78 74 72 61 20 73 70 61 63 65 20 66 6f 72 extra space for
2e10: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 73 69 7a the initial siz
2e20: 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73 e of the Win32-s
2e30: 70 65 63 69 66 69 63 20 68 65 61 70 2c 0a 20 2a pecific heap,. *
2e40: 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68 69 73 in bytes. This
2e50: 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 value may be ze
2e60: 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 ro.. */.#ifndef
2e70: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 SQLITE_WIN32_HEA
2e80: 50 5f 49 4e 49 54 5f 45 58 54 52 41 0a 23 20 20 P_INIT_EXTRA.#
2e90: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 define SQLITE_WI
2ea0: 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 45 58 N32_HEAP_INIT_EX
2eb0: 54 52 41 20 20 28 34 31 39 34 33 30 34 29 0a 23 TRA (4194304).#
2ec0: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 43 61 6c endif../*. * Cal
2ed0: 63 75 6c 61 74 65 20 74 68 65 20 6d 61 78 69 6d culate the maxim
2ee0: 75 6d 20 6c 65 67 61 6c 20 63 61 63 68 65 20 73 um legal cache s
2ef0: 69 7a 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 62 ize, in pages, b
2f00: 61 73 65 64 20 6f 6e 20 74 68 65 20 6d 61 78 69 ased on the maxi
2f10: 6d 75 6d 0a 20 2a 20 70 6f 73 73 69 62 6c 65 20 mum. * possible
2f20: 69 6e 69 74 69 61 6c 20 68 65 61 70 20 73 69 7a initial heap siz
2f30: 65 20 61 6e 64 20 74 68 65 20 64 65 66 61 75 6c e and the defaul
2f40: 74 20 70 61 67 65 20 73 69 7a 65 2c 20 73 65 74 t page size, set
2f50: 74 69 6e 67 20 61 73 69 64 65 20 74 68 65 0a 20 ting aside the.
2f60: 2a 20 6e 65 65 64 65 64 20 65 78 74 72 61 20 73 * needed extra s
2f70: 70 61 63 65 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 pace.. */.#ifnde
2f80: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d f SQLITE_WIN32_M
2f90: 41 58 5f 43 41 43 48 45 5f 53 49 5a 45 0a 23 20 AX_CACHE_SIZE.#
2fa0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 define SQLITE_W
2fb0: 49 4e 33 32 5f 4d 41 58 5f 43 41 43 48 45 5f 53 IN32_MAX_CACHE_S
2fc0: 49 5a 45 20 20 20 28 28 28 53 51 4c 49 54 45 5f IZE (((SQLITE_
2fd0: 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 49 WIN32_HEAP_MAX_I
2fe0: 4e 49 54 5f 53 49 5a 45 29 20 2d 20 5c 0a 20 20 NIT_SIZE) - \.
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: 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f (SQLITE_
3020: 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f WIN32_HEAP_INIT_
3030: 45 58 54 52 41 29 29 20 2f 20 5c 0a 20 20 20 20 EXTRA)) / \.
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3060: 20 20 20 20 20 28 53 51 4c 49 54 45 5f 44 45 46 (SQLITE_DEF
3070: 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 29 AULT_PAGE_SIZE))
3080: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 .#endif../*. * T
3090: 68 69 73 20 69 73 20 63 61 63 68 65 20 73 69 7a his is cache siz
30a0: 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 63 61 e used in the ca
30b0: 6c 63 75 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 lculation of the
30c0: 20 69 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f 66 initial size of
30d0: 20 74 68 65 0a 20 2a 20 57 69 6e 33 32 2d 73 70 the. * Win32-sp
30e0: 65 63 69 66 69 63 20 68 65 61 70 2e 20 20 49 74 ecific heap. It
30f0: 20 63 61 6e 6e 6f 74 20 62 65 20 6e 65 67 61 74 cannot be negat
3100: 69 76 65 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 ive.. */.#ifndef
3110: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 43 41 SQLITE_WIN32_CA
3120: 43 48 45 5f 53 49 5a 45 0a 23 20 20 69 66 20 53 CHE_SIZE.# if S
3130: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 QLITE_DEFAULT_CA
3140: 43 48 45 5f 53 49 5a 45 3e 3d 30 0a 23 20 20 20 CHE_SIZE>=0.#
3150: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 define SQLITE_W
3160: 49 4e 33 32 5f 43 41 43 48 45 5f 53 49 5a 45 20 IN32_CACHE_SIZE
3170: 20 20 20 20 28 53 51 4c 49 54 45 5f 44 45 46 41 (SQLITE_DEFA
3180: 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 0a ULT_CACHE_SIZE).
3190: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66 # else.# def
31a0: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 ine SQLITE_WIN32
31b0: 5f 43 41 43 48 45 5f 53 49 5a 45 20 20 20 20 20 _CACHE_SIZE
31c0: 28 2d 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c (-(SQLITE_DEFAUL
31d0: 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 29 0a 23 T_CACHE_SIZE)).#
31e0: 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a endif.#endif..
31f0: 2f 2a 0a 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 /*. * Make sure
3200: 74 68 61 74 20 74 68 65 20 63 61 6c 63 75 6c 61 that the calcula
3210: 74 65 64 20 63 61 63 68 65 20 73 69 7a 65 2c 20 ted cache size,
3220: 69 6e 20 70 61 67 65 73 2c 20 63 61 6e 6e 6f 74 in pages, cannot
3230: 20 63 61 75 73 65 20 74 68 65 0a 20 2a 20 69 6e cause the. * in
3240: 69 74 69 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 itial size of th
3250: 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63 e Win32-specific
3260: 20 68 65 61 70 20 74 6f 20 65 78 63 65 65 64 20 heap to exceed
3270: 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 the maximum amou
3280: 6e 74 0a 20 2a 20 6f 66 20 6d 65 6d 6f 72 79 20 nt. * of memory
3290: 74 68 61 74 20 63 61 6e 20 62 65 20 73 70 65 63 that can be spec
32a0: 69 66 69 65 64 20 69 6e 20 74 68 65 20 63 61 6c ified in the cal
32b0: 6c 20 74 6f 20 48 65 61 70 43 72 65 61 74 65 2e l to HeapCreate.
32c0: 0a 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f . */.#if SQLITE_
32d0: 57 49 4e 33 32 5f 43 41 43 48 45 5f 53 49 5a 45 WIN32_CACHE_SIZE
32e0: 3e 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 >SQLITE_WIN32_MA
32f0: 58 5f 43 41 43 48 45 5f 53 49 5a 45 0a 23 20 20 X_CACHE_SIZE.#
3300: 75 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e undef SQLITE_WIN
3310: 33 32 5f 43 41 43 48 45 5f 53 49 5a 45 0a 23 20 32_CACHE_SIZE.#
3320: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 define SQLITE_W
3330: 49 4e 33 32 5f 43 41 43 48 45 5f 53 49 5a 45 20 IN32_CACHE_SIZE
3340: 20 20 20 20 20 20 28 32 30 30 30 29 0a 23 65 6e (2000).#en
3350: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 69 dif../*. * The i
3360: 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f 66 20 74 nitial size of t
3370: 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69 he Win32-specifi
3380: 63 20 68 65 61 70 2e 20 20 54 68 69 73 20 76 61 c heap. This va
3390: 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 2e lue may be zero.
33a0: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c . */.#ifndef SQL
33b0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 ITE_WIN32_HEAP_I
33c0: 4e 49 54 5f 53 49 5a 45 0a 23 20 20 64 65 66 69 NIT_SIZE.# defi
33d0: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f ne SQLITE_WIN32_
33e0: 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 20 20 HEAP_INIT_SIZE
33f0: 20 28 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f ((SQLITE_WIN32_
3400: 43 41 43 48 45 5f 53 49 5a 45 29 20 2a 20 5c 0a CACHE_SIZE) * \.
3410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3430: 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 (SQLITE
3440: 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 _DEFAULT_PAGE_SI
3450: 5a 45 29 20 2b 20 5c 0a 20 20 20 20 20 20 20 20 ZE) + \.
3460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3480: 20 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 (SQLITE_WIN32_H
3490: 45 41 50 5f 49 4e 49 54 5f 45 58 54 52 41 29 29 EAP_INIT_EXTRA))
34a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 .#endif../*. * T
34b0: 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 he maximum size
34c0: 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65 of the Win32-spe
34d0: 63 69 66 69 63 20 68 65 61 70 2e 20 20 54 68 69 cific heap. Thi
34e0: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a s value may be z
34f0: 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 ero.. */.#ifndef
3500: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 SQLITE_WIN32_HE
3510: 41 50 5f 4d 41 58 5f 53 49 5a 45 0a 23 20 20 64 AP_MAX_SIZE.# d
3520: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e efine SQLITE_WIN
3530: 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 32_HEAP_MAX_SIZE
3540: 20 20 20 20 28 30 29 0a 23 65 6e 64 69 66 0a 0a (0).#endif..
3550: 2f 2a 0a 20 2a 20 54 68 65 20 65 78 74 72 61 20 /*. * The extra
3560: 66 6c 61 67 73 20 74 6f 20 75 73 65 20 69 6e 20 flags to use in
3570: 63 61 6c 6c 73 20 74 6f 20 74 68 65 20 57 69 6e calls to the Win
3580: 33 32 20 68 65 61 70 20 41 50 49 73 2e 20 20 54 32 heap APIs. T
3590: 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 his value may be
35a0: 0a 20 2a 20 7a 65 72 6f 20 66 6f 72 20 74 68 65 . * zero for the
35b0: 20 64 65 66 61 75 6c 74 20 62 65 68 61 76 69 6f default behavio
35c0: 72 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 r.. */.#ifndef S
35d0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 QLITE_WIN32_HEAP
35e0: 5f 46 4c 41 47 53 0a 23 20 20 64 65 66 69 6e 65 _FLAGS.# define
35f0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 SQLITE_WIN32_HE
3600: 41 50 5f 46 4c 41 47 53 20 20 20 20 20 20 20 28 AP_FLAGS (
3610: 30 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 0).#endif.../*.*
3620: 2a 20 54 68 65 20 77 69 6e 4d 65 6d 44 61 74 61 * The winMemData
3630: 20 73 74 72 75 63 74 75 72 65 20 73 74 6f 72 65 structure store
3640: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 72 65 s information re
3650: 71 75 69 72 65 64 20 62 79 20 74 68 65 20 57 69 quired by the Wi
3660: 6e 33 32 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 n32-specific.**
3670: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 sqlite3_mem_meth
3680: 6f 64 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 ods implementati
3690: 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 on..*/.typedef s
36a0: 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 truct winMemData
36b0: 20 77 69 6e 4d 65 6d 44 61 74 61 3b 0a 73 74 72 winMemData;.str
36c0: 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 7b uct winMemData {
36d0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a .#ifndef NDEBUG.
36e0: 20 20 75 33 32 20 6d 61 67 69 63 31 3b 20 20 20 u32 magic1;
36f0: 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20 /* Magic number
3700: 74 6f 20 64 65 74 65 63 74 20 73 74 72 75 63 74 to detect struct
3710: 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 ure corruption.
3720: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 48 41 4e 44 */.#endif. HAND
3730: 4c 45 20 68 48 65 61 70 3b 20 2f 2a 20 54 68 65 LE hHeap; /* The
3740: 20 68 61 6e 64 6c 65 20 74 6f 20 6f 75 72 20 68 handle to our h
3750: 65 61 70 2e 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 eap. */. BOOL b
3760: 4f 77 6e 65 64 3b 20 20 2f 2a 20 44 6f 20 77 65 Owned; /* Do we
3770: 20 6f 77 6e 20 74 68 65 20 68 65 61 70 20 28 69 own the heap (i
3780: 2e 65 2e 20 64 65 73 74 72 6f 79 20 69 74 20 6f .e. destroy it o
3790: 6e 20 73 68 75 74 64 6f 77 6e 29 3f 20 2a 2f 0a n shutdown)? */.
37a0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 #ifndef NDEBUG.
37b0: 20 75 33 32 20 6d 61 67 69 63 32 3b 20 20 20 2f u32 magic2; /
37c0: 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20 74 * Magic number t
37d0: 6f 20 64 65 74 65 63 74 20 73 74 72 75 63 74 75 o detect structu
37e0: 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 2a re corruption. *
37f0: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 23 69 66 /.#endif.};..#if
3800: 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 64 65 66 ndef NDEBUG.#def
3810: 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 ine WINMEM_MAGIC
3820: 31 20 20 20 20 20 30 78 34 32 62 32 38 33 30 62 1 0x42b2830b
3830: 0a 23 64 65 66 69 6e 65 20 57 49 4e 4d 45 4d 5f .#define WINMEM_
3840: 4d 41 47 49 43 32 20 20 20 20 20 30 78 62 64 34 MAGIC2 0xbd4
3850: 64 37 63 66 34 0a 23 65 6e 64 69 66 0a 0a 73 74 d7cf4.#endif..st
3860: 61 74 69 63 20 73 74 72 75 63 74 20 77 69 6e 4d atic struct winM
3870: 65 6d 44 61 74 61 20 77 69 6e 5f 6d 65 6d 5f 64 emData win_mem_d
3880: 61 74 61 20 3d 20 7b 0a 23 69 66 6e 64 65 66 20 ata = {.#ifndef
3890: 4e 44 45 42 55 47 0a 20 20 57 49 4e 4d 45 4d 5f NDEBUG. WINMEM_
38a0: 4d 41 47 49 43 31 2c 0a 23 65 6e 64 69 66 0a 20 MAGIC1,.#endif.
38b0: 20 4e 55 4c 4c 2c 20 46 41 4c 53 45 0a 23 69 66 NULL, FALSE.#if
38c0: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2c 57 ndef NDEBUG. ,W
38d0: 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 0a 23 65 6e INMEM_MAGIC2.#en
38e0: 64 69 66 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 dif.};..#ifndef
38f0: 4e 44 45 42 55 47 0a 23 64 65 66 69 6e 65 20 77 NDEBUG.#define w
3900: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 inMemAssertMagic
3910: 31 28 29 20 61 73 73 65 72 74 28 20 77 69 6e 5f 1() assert( win_
3920: 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69 63 31 3d mem_data.magic1=
3930: 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20 29 =WINMEM_MAGIC1 )
3940: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 .#define winMemA
3950: 73 73 65 72 74 4d 61 67 69 63 32 28 29 20 61 73 ssertMagic2() as
3960: 73 65 72 74 28 20 77 69 6e 5f 6d 65 6d 5f 64 61 sert( win_mem_da
3970: 74 61 2e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d 45 ta.magic2==WINME
3980: 4d 5f 4d 41 47 49 43 32 20 29 0a 23 64 65 66 69 M_MAGIC2 ).#defi
3990: 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d ne winMemAssertM
39a0: 61 67 69 63 28 29 20 20 77 69 6e 4d 65 6d 41 73 agic() winMemAs
39b0: 73 65 72 74 4d 61 67 69 63 31 28 29 3b 20 77 69 sertMagic1(); wi
39c0: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 32 nMemAssertMagic2
39d0: 28 29 3b 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e ();.#else.#defin
39e0: 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 e winMemAssertMa
39f0: 67 69 63 28 29 0a 23 65 6e 64 69 66 0a 0a 23 64 gic().#endif..#d
3a00: 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74 44 efine winMemGetD
3a10: 61 74 61 50 74 72 28 29 20 20 26 77 69 6e 5f 6d ataPtr() &win_m
3a20: 65 6d 5f 64 61 74 61 0a 23 64 65 66 69 6e 65 20 em_data.#define
3a30: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 20 winMemGetHeap()
3a40: 20 20 20 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 win_mem_data
3a50: 2e 68 48 65 61 70 0a 23 64 65 66 69 6e 65 20 77 .hHeap.#define w
3a60: 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20 inMemGetOwned()
3a70: 20 20 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e win_mem_data.
3a80: 62 4f 77 6e 65 64 0a 0a 73 74 61 74 69 63 20 76 bOwned..static v
3a90: 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f oid *winMemMallo
3aa0: 63 28 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73 c(int nBytes);.s
3ab0: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 tatic void winMe
3ac0: 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69 mFree(void *pPri
3ad0: 6f 72 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 or);.static void
3ae0: 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28 *winMemRealloc(
3af0: 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e void *pPrior, in
3b00: 74 20 6e 42 79 74 65 73 29 3b 0a 73 74 61 74 69 t nBytes);.stati
3b10: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65 c int winMemSize
3b20: 28 76 6f 69 64 20 2a 70 29 3b 0a 73 74 61 74 69 (void *p);.stati
3b30: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e c int winMemRoun
3b40: 64 75 70 28 69 6e 74 20 6e 29 3b 0a 73 74 61 74 dup(int n);.stat
3b50: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69 ic int winMemIni
3b60: 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 t(void *pAppData
3b70: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 );.static void w
3b80: 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f inMemShutdown(vo
3b90: 69 64 20 2a 70 41 70 70 44 61 74 61 29 3b 0a 0a id *pAppData);..
3ba0: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 const sqlite3_me
3bb0: 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74 m_methods *sqlit
3bc0: 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f e3MemGetWin32(vo
3bd0: 69 64 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 id);.#endif /* S
3be0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c QLITE_WIN32_MALL
3bf0: 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 OC */../*.** The
3c00: 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 following varia
3c10: 62 6c 65 20 69 73 20 28 6e 6f 72 6d 61 6c 6c 79 ble is (normally
3c20: 29 20 73 65 74 20 6f 6e 63 65 20 61 6e 64 20 6e ) set once and n
3c30: 65 76 65 72 20 63 68 61 6e 67 65 73 0a 2a 2a 20 ever changes.**
3c40: 74 68 65 72 65 61 66 74 65 72 2e 20 20 49 74 20 thereafter. It
3c50: 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72 20 records whether
3c60: 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 the operating sy
3c70: 73 74 65 6d 20 69 73 20 57 69 6e 39 78 0a 2a 2a stem is Win9x.**
3c80: 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a or WinNT..**.**
3c90: 20 30 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 0: Operating
3ca0: 73 79 73 74 65 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a system unknown..
3cb0: 2a 2a 20 31 3a 20 20 20 4f 70 65 72 61 74 69 6e ** 1: Operatin
3cc0: 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39 g system is Win9
3cd0: 78 2e 0a 2a 2a 20 32 3a 20 20 20 4f 70 65 72 61 x..** 2: Opera
3ce0: 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57 ting system is W
3cf0: 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f inNT..**.** In o
3d00: 72 64 65 72 20 74 6f 20 66 61 63 69 6c 69 74 61 rder to facilita
3d10: 74 65 20 74 65 73 74 69 6e 67 20 6f 6e 20 61 20 te testing on a
3d20: 57 69 6e 4e 54 20 73 79 73 74 65 6d 2c 20 74 68 WinNT system, th
3d30: 65 20 74 65 73 74 20 66 69 78 74 75 72 65 0a 2a e test fixture.*
3d40: 2a 20 63 61 6e 20 6d 61 6e 75 61 6c 6c 79 20 73 * can manually s
3d50: 65 74 20 74 68 69 73 20 76 61 6c 75 65 20 74 6f et this value to
3d60: 20 31 20 74 6f 20 65 6d 75 6c 61 74 65 20 57 69 1 to emulate Wi
3d70: 6e 39 38 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f n98 behavior..*/
3d80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 .#ifdef SQLITE_T
3d90: 45 53 54 0a 4c 4f 4e 47 20 53 51 4c 49 54 45 5f EST.LONG SQLITE_
3da0: 57 49 4e 33 32 5f 56 4f 4c 41 54 49 4c 45 20 73 WIN32_VOLATILE s
3db0: 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d qlite3_os_type =
3dc0: 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 0;.#else.static
3dd0: 20 4c 4f 4e 47 20 53 51 4c 49 54 45 5f 57 49 4e LONG SQLITE_WIN
3de0: 33 32 5f 56 4f 4c 41 54 49 4c 45 20 73 71 6c 69 32_VOLATILE sqli
3df0: 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b te3_os_type = 0;
3e00: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 .#endif..#ifndef
3e10: 20 53 59 53 43 41 4c 4c 0a 23 20 20 64 65 66 69 SYSCALL.# defi
3e20: 6e 65 20 53 59 53 43 41 4c 4c 20 73 71 6c 69 74 ne SYSCALL sqlit
3e30: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 0a 23 e3_syscall_ptr.#
3e40: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 endif../*.** Thi
3e50: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f s function is no
3e60: 74 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 57 t available on W
3e70: 69 6e 64 6f 77 73 20 43 45 20 6f 72 20 57 69 6e indows CE or Win
3e80: 52 54 2e 0a 20 2a 2f 0a 0a 23 69 66 20 53 51 4c RT.. */..#if SQL
3e90: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 ITE_OS_WINCE ||
3ea0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a SQLITE_OS_WINRT.
3eb0: 23 20 20 64 65 66 69 6e 65 20 6f 73 41 72 65 46 # define osAreF
3ec0: 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 20 20 ileApisANSI()
3ed0: 20 20 20 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 1.#endif../*
3ee0: 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 .** Many system
3ef0: 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73 calls are access
3f00: 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 ed through point
3f10: 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 er-to-functions
3f20: 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 so that.** they
3f30: 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65 may be overridde
3f40: 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 n at runtime to
3f50: 66 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74 facilitate fault
3f60: 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e injection durin
3f70: 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 g.** testing and
3f80: 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 sandboxing. Th
3f90: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 e following arra
3fa0: 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 y holds the name
3fb0: 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a s and pointers.*
3fc0: 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 * to all overrid
3fd0: 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c eable system cal
3fe0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 ls..*/.static st
3ff0: 72 75 63 74 20 77 69 6e 5f 73 79 73 63 61 6c 6c ruct win_syscall
4000: 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 {. const char
4010: 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 *zName;
4020: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 /* Name of th
4030: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f e system call */
4040: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 . sqlite3_sysca
4050: 6c 6c 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b ll_ptr pCurrent;
4060: 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75 /* Current valu
4070: 65 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 e of the system
4080: 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 call */. sqlite
4090: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44 3_syscall_ptr pD
40a0: 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75 efault; /* Defau
40b0: 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 lt value */.} aS
40c0: 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 23 69 66 yscall[] = {.#if
40d0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 !SQLITE_OS_WINC
40e0: 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f E && !SQLITE_OS_
40f0: 57 49 4e 52 54 0a 20 20 7b 20 22 41 72 65 46 69 WINRT. { "AreFi
4100: 6c 65 41 70 69 73 41 4e 53 49 22 2c 20 20 20 20 leApisANSI",
4110: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 41 72 (SYSCALL)Ar
4120: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 2c 20 20 eFileApisANSI,
4130: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 0 },.#els
4140: 65 0a 20 20 7b 20 22 41 72 65 46 69 6c 65 41 70 e. { "AreFileAp
4150: 69 73 41 4e 53 49 22 2c 20 20 20 20 20 20 20 20 isANSI",
4160: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 (SYSCALL)0,
4170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4180: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 0 },.#endif..
4190: 23 69 66 6e 64 65 66 20 6f 73 41 72 65 46 69 6c #ifndef osAreFil
41a0: 65 41 70 69 73 41 4e 53 49 0a 23 64 65 66 69 6e eApisANSI.#defin
41b0: 65 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 e osAreFileApisA
41c0: 4e 53 49 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 NSI ((BOOL(WINAP
41d0: 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 I*)(VOID))aSysca
41e0: 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a ll[0].pCurrent).
41f0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 #endif..#if SQLI
4200: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 TE_OS_WINCE && d
4210: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 efined(SQLITE_WI
4220: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 N32_HAS_WIDE).
4230: 7b 20 22 43 68 61 72 4c 6f 77 65 72 57 22 2c 20 { "CharLowerW",
4240: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 (SY
4250: 53 43 41 4c 4c 29 43 68 61 72 4c 6f 77 65 72 57 SCALL)CharLowerW
4260: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 , 0
4270: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 },.#else. { "C
4280: 68 61 72 4c 6f 77 65 72 57 22 2c 20 20 20 20 20 harLowerW",
4290: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c (SYSCAL
42a0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 L)0,
42b0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0 },.
42c0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 #endif..#define
42d0: 6f 73 43 68 61 72 4c 6f 77 65 72 57 20 28 28 4c osCharLowerW ((L
42e0: 50 57 53 54 52 28 57 49 4e 41 50 49 2a 29 28 4c PWSTR(WINAPI*)(L
42f0: 50 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b PWSTR))aSyscall[
4300: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 1].pCurrent)..#i
4310: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 f SQLITE_OS_WINC
4320: 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c E && defined(SQL
4330: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 ITE_WIN32_HAS_WI
4340: 44 45 29 0a 20 20 7b 20 22 43 68 61 72 55 70 70 DE). { "CharUpp
4350: 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 erW",
4360: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 68 61 72 (SYSCALL)Char
4370: 55 70 70 65 72 57 2c 20 20 20 20 20 20 20 20 20 UpperW,
4380: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 0 },.#else.
4390: 20 20 7b 20 22 43 68 61 72 55 70 70 65 72 57 22 { "CharUpperW"
43a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 , (
43b0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 SYSCALL)0,
43c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
43d0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 0 },.#endif..#d
43e0: 65 66 69 6e 65 20 6f 73 43 68 61 72 55 70 70 65 efine osCharUppe
43f0: 72 57 20 28 28 4c 50 57 53 54 52 28 57 49 4e 41 rW ((LPWSTR(WINA
4400: 50 49 2a 29 28 4c 50 57 53 54 52 29 29 61 53 79 PI*)(LPWSTR))aSy
4410: 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e scall[2].pCurren
4420: 74 29 0a 0a 20 20 7b 20 22 43 6c 6f 73 65 48 61 t).. { "CloseHa
4430: 6e 64 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 ndle",
4440: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 6c 6f 73 (SYSCALL)Clos
4450: 65 48 61 6e 64 6c 65 2c 20 20 20 20 20 20 20 20 eHandle,
4460: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 0 },..#defi
4470: 6e 65 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 ne osCloseHandle
4480: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 ((BOOL(WINAPI*)
4490: 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c (HANDLE))aSyscal
44a0: 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a l[3].pCurrent)..
44b0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 #if defined(SQLI
44c0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 TE_WIN32_HAS_ANS
44d0: 49 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 I). { "CreateFi
44e0: 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 leA",
44f0: 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 (SYSCALL)Creat
4500: 65 46 69 6c 65 41 2c 20 20 20 20 20 20 20 20 20 eFileA,
4510: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 0 },.#else.
4520: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 41 22 { "CreateFileA"
4530: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 , (S
4540: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 YSCALL)0,
4550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4560: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 0 },.#endif..#de
4570: 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c fine osCreateFil
4580: 65 41 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 eA ((HANDLE(WINA
4590: 50 49 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52 PI*)(LPCSTR,DWOR
45a0: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 D,DWORD, \.
45b0: 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 LPSECURITY_AT
45c0: 54 52 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44 TRIBUTES,DWORD,D
45d0: 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79 WORD,HANDLE))aSy
45e0: 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e scall[4].pCurren
45f0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f t)..#if !SQLITE_
4600: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 OS_WINRT && defi
4610: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 ned(SQLITE_WIN32
4620: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 _HAS_WIDE). { "
4630: 43 72 65 61 74 65 46 69 6c 65 57 22 2c 20 20 20 CreateFileW",
4640: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 (SYSCA
4650: 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 57 2c 20 LL)CreateFileW,
4660: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0 },
4670: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 .#else. { "Crea
4680: 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 teFileW",
4690: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 (SYSCALL)0
46a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
46b0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 0 },.#en
46c0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 dif..#define osC
46d0: 72 65 61 74 65 46 69 6c 65 57 20 28 28 48 41 4e reateFileW ((HAN
46e0: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 DLE(WINAPI*)(LPC
46f0: 57 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44 WSTR,DWORD,DWORD
4700: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45 , \. LPSE
4710: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 CURITY_ATTRIBUTE
4720: 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41 S,DWORD,DWORD,HA
4730: 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 NDLE))aSyscall[5
4740: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 ].pCurrent)..#if
4750: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 !SQLITE_OS_WINR
4760: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c T && defined(SQL
4770: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e ITE_WIN32_HAS_AN
4780: 53 49 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20 SI) && \.
4790: 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 (!defined(SQLIT
47a0: 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 E_OMIT_WAL) || S
47b0: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 QLITE_MAX_MMAP_S
47c0: 49 5a 45 3e 30 29 20 26 26 20 5c 0a 20 20 20 20 IZE>0) && \.
47d0: 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 SQLITE_WIN32
47e0: 5f 43 52 45 41 54 45 46 49 4c 45 4d 41 50 50 49 _CREATEFILEMAPPI
47f0: 4e 47 41 0a 20 20 7b 20 22 43 72 65 61 74 65 46 NGA. { "CreateF
4800: 69 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20 20 20 ileMappingA",
4810: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 (SYSCALL)Crea
4820: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 2c 20 teFileMappingA,
4830: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 0 },.#else.
4840: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d { "CreateFileM
4850: 61 70 70 69 6e 67 41 22 2c 20 20 20 20 20 20 28 appingA", (
4860: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 SYSCALL)0,
4870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4880: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 0 },.#endif..#d
4890: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 efine osCreateFi
48a0: 6c 65 4d 61 70 70 69 6e 67 41 20 28 28 48 41 4e leMappingA ((HAN
48b0: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e DLE(WINAPI*)(HAN
48c0: 44 4c 45 2c 4c 50 53 45 43 55 52 49 54 59 5f 41 DLE,LPSECURITY_A
48d0: 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20 20 TTRIBUTES, \.
48e0: 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44 DWORD,DWORD
48f0: 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52 29 29 61 ,DWORD,LPCSTR))a
4900: 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 Syscall[6].pCurr
4910: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 ent)..#if SQLITE
4920: 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53 _OS_WINCE || (!S
4930: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 QLITE_OS_WINRT &
4940: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 & defined(SQLITE
4950: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 _WIN32_HAS_WIDE)
4960: 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 28 21 && \. (!
4970: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f defined(SQLITE_O
4980: 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 MIT_WAL) || SQLI
4990: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 TE_MAX_MMAP_SIZE
49a0: 3e 30 29 29 0a 20 20 7b 20 22 43 72 65 61 74 65 >0)). { "Create
49b0: 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20 20 FileMappingW",
49c0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 (SYSCALL)Cre
49d0: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 2c ateFileMappingW,
49e0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0 },.#else
49f0: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 . { "CreateFile
4a00: 4d 61 70 70 69 6e 67 57 22 2c 20 20 20 20 20 20 MappingW",
4a10: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 (SYSCALL)0,
4a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4a30: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 0 },.#endif..#
4a40: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 define osCreateF
4a50: 69 6c 65 4d 61 70 70 69 6e 67 57 20 28 28 48 41 ileMappingW ((HA
4a60: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41 NDLE(WINAPI*)(HA
4a70: 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49 54 59 5f NDLE,LPSECURITY_
4a80: 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20 ATTRIBUTES, \.
4a90: 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 DWORD,DWOR
4aa0: 44 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54 52 29 D,DWORD,LPCWSTR)
4ab0: 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75 )aSyscall[7].pCu
4ac0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c rrent)..#if !SQL
4ad0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 ITE_OS_WINRT &&
4ae0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 defined(SQLITE_W
4af0: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 IN32_HAS_WIDE).
4b00: 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65 78 57 { "CreateMutexW
4b10: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 ", (S
4b20: 59 53 43 41 4c 4c 29 43 72 65 61 74 65 4d 75 74 YSCALL)CreateMut
4b30: 65 78 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 exW,
4b40: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 0 },.#else. { "
4b50: 43 72 65 61 74 65 4d 75 74 65 78 57 22 2c 20 20 CreateMutexW",
4b60: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 (SYSCA
4b70: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 LL)0,
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0 },
4b90: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 .#endif..#define
4ba0: 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57 20 osCreateMutexW
4bb0: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a ((HANDLE(WINAPI*
4bc0: 29 28 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 )(LPSECURITY_ATT
4bd0: 52 49 42 55 54 45 53 2c 42 4f 4f 4c 2c 20 5c 0a RIBUTES,BOOL, \.
4be0: 20 20 20 20 20 20 20 20 4c 50 43 57 53 54 52 29 LPCWSTR)
4bf0: 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75 )aSyscall[8].pCu
4c00: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 rrent)..#if defi
4c10: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 ned(SQLITE_WIN32
4c20: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 _HAS_ANSI). { "
4c30: 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20 20 20 DeleteFileA",
4c40: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 (SYSCA
4c50: 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65 41 2c 20 LL)DeleteFileA,
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0 },
4c70: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44 65 6c 65 .#else. { "Dele
4c80: 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 teFileA",
4c90: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 (SYSCALL)0
4ca0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
4cb0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 0 },.#en
4cc0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 44 dif..#define osD
4cd0: 65 6c 65 74 65 46 69 6c 65 41 20 28 28 42 4f 4f eleteFileA ((BOO
4ce0: 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 L(WINAPI*)(LPCST
4cf0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70 R))aSyscall[9].p
4d00: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 Current)..#if de
4d10: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e fined(SQLITE_WIN
4d20: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 32_HAS_WIDE). {
4d30: 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22 2c 20 "DeleteFileW",
4d40: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 (SYS
4d50: 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65 57 CALL)DeleteFileW
4d60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 , 0
4d70: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44 65 },.#else. { "De
4d80: 6c 65 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20 leteFileW",
4d90: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c (SYSCALL
4da0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 )0,
4db0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 0 },.#
4dc0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f endif..#define o
4dd0: 73 44 65 6c 65 74 65 46 69 6c 65 57 20 28 28 42 sDeleteFileW ((B
4de0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 OOL(WINAPI*)(LPC
4df0: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 31 WSTR))aSyscall[1
4e00: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 0].pCurrent)..#i
4e10: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 f SQLITE_OS_WINC
4e20: 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 E. { "FileTimeT
4e30: 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c oLocalFileTime",
4e40: 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54 69 (SYSCALL)FileTi
4e50: 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d meToLocalFileTim
4e60: 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 e, 0 },.#else.
4e70: 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 { "FileTimeToLoc
4e80: 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59 alFileTime", (SY
4e90: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 SCALL)0,
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0
4eb0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 },.#endif..#def
4ec0: 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f ine osFileTimeTo
4ed0: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 20 28 28 LocalFileTime ((
4ee0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f BOOL(WINAPI*)(CO
4ef0: 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c NST FILETIME*, \
4f00: 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54 . LPFILET
4f10: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 31 IME))aSyscall[11
4f20: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 ].pCurrent)..#if
4f30: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 SQLITE_OS_WINCE
4f40: 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f . { "FileTimeTo
4f50: 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20 SystemTime",
4f60: 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54 69 6d (SYSCALL)FileTim
4f70: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 2c 20 20 eToSystemTime,
4f80: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 0 },.#else. {
4f90: 20 22 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 "FileTimeToSyst
4fa0: 65 6d 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53 emTime", (SYS
4fb0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 CALL)0,
4fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 0
4fd0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 },.#endif..#defi
4fe0: 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 53 ne osFileTimeToS
4ff0: 79 73 74 65 6d 54 69 6d 65 20 28 28 42 4f 4f 4c ystemTime ((BOOL
5000: 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20 (WINAPI*)(CONST
5010: 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 FILETIME*, \.
5020: 20 20 20 20 20 4c 50 53 59 53 54 45 4d 54 49 4d LPSYSTEMTIM
5030: 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e E))aSyscall[12].
5040: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 pCurrent).. { "
5050: 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 FlushFileBuffers
5060: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 ", (SYSCA
5070: 4c 4c 29 46 6c 75 73 68 46 69 6c 65 42 75 66 66 LL)FlushFileBuff
5080: 65 72 73 2c 20 20 20 20 20 20 20 20 30 20 7d 2c ers, 0 },
5090: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6c 75 73 ..#define osFlus
50a0: 68 46 69 6c 65 42 75 66 66 65 72 73 20 28 28 42 hFileBuffers ((B
50b0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e OOL(WINAPI*)(HAN
50c0: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 33 DLE))aSyscall[13
50d0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 ].pCurrent)..#if
50e0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f defined(SQLITE_
50f0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a WIN32_HAS_ANSI).
5100: 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 { "FormatMessa
5110: 67 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 28 geA", (
5120: 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65 SYSCALL)FormatMe
5130: 73 73 61 67 65 41 2c 20 20 20 20 20 20 20 20 20 ssageA,
5140: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 0 },.#else. {
5150: 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 22 "FormatMessageA"
5160: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 , (SYSC
5170: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 ALL)0,
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 0 }
5190: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e ,.#endif..#defin
51a0: 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 e osFormatMessag
51b0: 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 eA ((DWORD(WINAP
51c0: 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49 I*)(DWORD,LPCVOI
51d0: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 D,DWORD,DWORD,LP
51e0: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 STR, \. D
51f0: 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61 WORD,va_list*))a
5200: 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75 72 Syscall[14].pCur
5210: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e rent)..#if defin
5220: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f ed(SQLITE_WIN32_
5230: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 46 HAS_WIDE). { "F
5240: 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c 20 ormatMessageW",
5250: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c (SYSCAL
5260: 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 L)FormatMessageW
5270: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a , 0 },.
5280: 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61 #else. { "Forma
5290: 74 4d 65 73 73 61 67 65 57 22 2c 20 20 20 20 20 tMessageW",
52a0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c (SYSCALL)0,
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
52c0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 0 },.#end
52d0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f if..#define osFo
52e0: 72 6d 61 74 4d 65 73 73 61 67 65 57 20 28 28 44 rmatMessageW ((D
52f0: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57 WORD(WINAPI*)(DW
5300: 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 ORD,LPCVOID,DWOR
5310: 44 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20 D,DWORD,LPWSTR,
5320: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c \. DWORD,
5330: 76 61 5f 6c 69 73 74 2a 29 29 61 53 79 73 63 61 va_list*))aSysca
5340: 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e 74 29 ll[15].pCurrent)
5350: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 ..#if !defined(S
5360: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f QLITE_OMIT_LOAD_
5370: 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 EXTENSION). { "
5380: 46 72 65 65 4c 69 62 72 61 72 79 22 2c 20 20 20 FreeLibrary",
5390: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 (SYSCA
53a0: 4c 4c 29 46 72 65 65 4c 69 62 72 61 72 79 2c 20 LL)FreeLibrary,
53b0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0 },
53c0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 72 65 65 .#else. { "Free
53d0: 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 20 20 Library",
53e0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 (SYSCALL)0
53f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
5400: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 0 },.#en
5410: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 dif..#define osF
5420: 72 65 65 4c 69 62 72 61 72 79 20 28 28 42 4f 4f reeLibrary ((BOO
5430: 4c 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55 L(WINAPI*)(HMODU
5440: 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d LE))aSyscall[16]
5450: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 .pCurrent).. {
5460: 22 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 "GetCurrentProce
5470: 73 73 49 64 22 2c 20 20 20 20 20 28 53 59 53 43 ssId", (SYSC
5480: 41 4c 4c 29 47 65 74 43 75 72 72 65 6e 74 50 72 ALL)GetCurrentPr
5490: 6f 63 65 73 73 49 64 2c 20 20 20 20 20 30 20 7d ocessId, 0 }
54a0: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 ,..#define osGet
54b0: 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 CurrentProcessId
54c0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a ((DWORD(WINAPI*
54d0: 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c )(VOID))aSyscall
54e0: 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a [17].pCurrent)..
54f0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 #if !SQLITE_OS_W
5500: 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28 INCE && defined(
5510: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 SQLITE_WIN32_HAS
5520: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 44 _ANSI). { "GetD
5530: 69 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20 iskFreeSpaceA",
5540: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 (SYSCALL)G
5550: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41 etDiskFreeSpaceA
5560: 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c , 0 },.#el
5570: 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46 se. { "GetDiskF
5580: 72 65 65 53 70 61 63 65 41 22 2c 20 20 20 20 20 reeSpaceA",
5590: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 (SYSCALL)0,
55a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
55b0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0 },.#endif.
55c0: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44 69 .#define osGetDi
55d0: 73 6b 46 72 65 65 53 70 61 63 65 41 20 28 28 42 skFreeSpaceA ((B
55e0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 OOL(WINAPI*)(LPC
55f0: 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 STR,LPDWORD,LPDW
5600: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 ORD,LPDWORD, \.
5610: 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29 29 LPDWORD))
5620: 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75 aSyscall[18].pCu
5630: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c rrent)..#if !SQL
5640: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 ITE_OS_WINCE &&
5650: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 !SQLITE_OS_WINRT
5660: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 && defined(SQLI
5670: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 TE_WIN32_HAS_WID
5680: 45 29 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46 E). { "GetDiskF
5690: 72 65 65 53 70 61 63 65 57 22 2c 20 20 20 20 20 reeSpaceW",
56a0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 44 69 (SYSCALL)GetDi
56b0: 73 6b 46 72 65 65 53 70 61 63 65 57 2c 20 20 20 skFreeSpaceW,
56c0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 0 },.#else.
56d0: 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53 { "GetDiskFreeS
56e0: 70 61 63 65 57 22 2c 20 20 20 20 20 20 20 28 53 paceW", (S
56f0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 YSCALL)0,
5700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5710: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 0 },.#endif..#de
5720: 66 69 6e 65 20 6f 73 47 65 74 44 69 73 6b 46 72 fine osGetDiskFr
5730: 65 65 53 70 61 63 65 57 20 28 28 42 4f 4f 4c 28 eeSpaceW ((BOOL(
5740: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 WINAPI*)(LPCWSTR
5750: 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 ,LPDWORD,LPDWORD
5760: 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 ,LPDWORD, \.
5770: 20 20 20 20 4c 50 44 57 4f 52 44 29 29 61 53 79 LPDWORD))aSy
5780: 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72 65 scall[19].pCurre
5790: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 nt)..#if defined
57a0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 (SQLITE_WIN32_HA
57b0: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 S_ANSI). { "Get
57c0: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 22 FileAttributesA"
57d0: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 , (SYSCALL)
57e0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 GetFileAttribute
57f0: 73 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 sA, 0 },.#e
5800: 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 lse. { "GetFile
5810: 41 74 74 72 69 62 75 74 65 73 41 22 2c 20 20 20 AttributesA",
5820: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 (SYSCALL)0,
5830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5840: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0 },.#endif
5850: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 ..#define osGetF
5860: 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 20 28 ileAttributesA (
5870: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 (DWORD(WINAPI*)(
5880: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c LPCSTR))aSyscall
5890: 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a [20].pCurrent)..
58a0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 #if !SQLITE_OS_W
58b0: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 INRT && defined(
58c0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 SQLITE_WIN32_HAS
58d0: 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46 _WIDE). { "GetF
58e0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 22 2c ileAttributesW",
58f0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 (SYSCALL)G
5900: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 etFileAttributes
5910: 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c W, 0 },.#el
5920: 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 se. { "GetFileA
5930: 74 74 72 69 62 75 74 65 73 57 22 2c 20 20 20 20 ttributesW",
5940: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 (SYSCALL)0,
5950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5960: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0 },.#endif.
5970: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 .#define osGetFi
5980: 6c 65 41 74 74 72 69 62 75 74 65 73 57 20 28 28 leAttributesW ((
5990: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 4c DWORD(WINAPI*)(L
59a0: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c PCWSTR))aSyscall
59b0: 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a [21].pCurrent)..
59c0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 #if defined(SQLI
59d0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 TE_WIN32_HAS_WID
59e0: 45 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 E). { "GetFileA
59f0: 74 74 72 69 62 75 74 65 73 45 78 57 22 2c 20 20 ttributesExW",
5a00: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 (SYSCALL)GetFi
5a10: 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 2c leAttributesExW,
5a20: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 0 },.#else.
5a30: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 { "GetFileAttri
5a40: 62 75 74 65 73 45 78 57 22 2c 20 20 20 20 28 53 butesExW", (S
5a50: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 YSCALL)0,
5a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5a70: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 0 },.#endif..#de
5a80: 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41 74 fine osGetFileAt
5a90: 74 72 69 62 75 74 65 73 45 78 57 20 28 28 42 4f tributesExW ((BO
5aa0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 OL(WINAPI*)(LPCW
5ab0: 53 54 52 2c 47 45 54 5f 46 49 4c 45 45 58 5f 49 STR,GET_FILEEX_I
5ac0: 4e 46 4f 5f 4c 45 56 45 4c 53 2c 20 5c 0a 20 20 NFO_LEVELS, \.
5ad0: 20 20 20 20 20 20 4c 50 56 4f 49 44 29 29 61 53 LPVOID))aS
5ae0: 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72 72 yscall[22].pCurr
5af0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 ent)..#if !SQLIT
5b00: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 E_OS_WINRT. { "
5b10: 47 65 74 46 69 6c 65 53 69 7a 65 22 2c 20 20 20 GetFileSize",
5b20: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 (SYSCA
5b30: 4c 4c 29 47 65 74 46 69 6c 65 53 69 7a 65 2c 20 LL)GetFileSize,
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0 },
5b50: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 .#else. { "GetF
5b60: 69 6c 65 53 69 7a 65 22 2c 20 20 20 20 20 20 20 ileSize",
5b70: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 (SYSCALL)0
5b80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
5b90: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 0 },.#en
5ba0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 dif..#define osG
5bb0: 65 74 46 69 6c 65 53 69 7a 65 20 28 28 44 57 4f etFileSize ((DWO
5bc0: 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 RD(WINAPI*)(HAND
5bd0: 4c 45 2c 4c 50 44 57 4f 52 44 29 29 61 53 79 73 LE,LPDWORD))aSys
5be0: 63 61 6c 6c 5b 32 33 5d 2e 70 43 75 72 72 65 6e call[23].pCurren
5bf0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f t)..#if !SQLITE_
5c00: 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 OS_WINCE && defi
5c10: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 ned(SQLITE_WIN32
5c20: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 _HAS_ANSI). { "
5c30: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 GetFullPathNameA
5c40: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 ", (SYSCA
5c50: 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 LL)GetFullPathNa
5c60: 6d 65 41 2c 20 20 20 20 20 20 20 20 30 20 7d 2c meA, 0 },
5c70: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 .#else. { "GetF
5c80: 75 6c 6c 50 61 74 68 4e 61 6d 65 41 22 2c 20 20 ullPathNameA",
5c90: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 (SYSCALL)0
5ca0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
5cb0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 0 },.#en
5cc0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 dif..#define osG
5cd0: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 20 etFullPathNameA
5ce0: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 ((DWORD(WINAPI*)
5cf0: 28 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c 4c 50 (LPCSTR,DWORD,LP
5d00: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c STR, \. L
5d10: 50 53 54 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b PSTR*))aSyscall[
5d20: 32 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 24].pCurrent)..#
5d30: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 if !SQLITE_OS_WI
5d40: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f NCE && !SQLITE_O
5d50: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e S_WINRT && defin
5d60: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f ed(SQLITE_WIN32_
5d70: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 HAS_WIDE). { "G
5d80: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22 etFullPathNameW"
5d90: 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c , (SYSCAL
5da0: 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d L)GetFullPathNam
5db0: 65 57 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a eW, 0 },.
5dc0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 75 #else. { "GetFu
5dd0: 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c 20 20 20 llPathNameW",
5de0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c (SYSCALL)0,
5df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5e00: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 0 },.#end
5e10: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 if..#define osGe
5e20: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 20 28 tFullPathNameW (
5e30: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 (DWORD(WINAPI*)(
5e40: 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 4c 50 LPCWSTR,DWORD,LP
5e50: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 WSTR, \.
5e60: 4c 50 57 53 54 52 2a 29 29 61 53 79 73 63 61 6c LPWSTR*))aSyscal
5e70: 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a l[25].pCurrent).
5e80: 0a 20 20 7b 20 22 47 65 74 4c 61 73 74 45 72 72 . { "GetLastErr
5e90: 6f 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 or",
5ea0: 28 53 59 53 43 41 4c 4c 29 47 65 74 4c 61 73 74 (SYSCALL)GetLast
5eb0: 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 Error,
5ec0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 0 },..#define
5ed0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 20 28 osGetLastError (
5ee0: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 (DWORD(WINAPI*)(
5ef0: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 VOID))aSyscall[2
5f00: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 6].pCurrent)..#i
5f10: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 f !defined(SQLIT
5f20: 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 E_OMIT_LOAD_EXTE
5f30: 4e 53 49 4f 4e 29 0a 23 69 66 20 53 51 4c 49 54 NSION).#if SQLIT
5f40: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 20 E_OS_WINCE. /*
5f50: 54 68 65 20 47 65 74 50 72 6f 63 41 64 64 72 65 The GetProcAddre
5f60: 73 73 41 28 29 20 72 6f 75 74 69 6e 65 20 69 73 ssA() routine is
5f70: 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 only available
5f80: 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 2e 20 2a on Windows CE. *
5f90: 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64 /. { "GetProcAd
5fa0: 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20 20 dressA",
5fb0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f (SYSCALL)GetPro
5fc0: 63 41 64 64 72 65 73 73 41 2c 20 20 20 20 20 20 cAddressA,
5fd0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 0 },.#else.
5fe0: 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20 57 69 6e /* All other Win
5ff0: 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73 20 65 dows platforms e
6000: 78 70 65 63 74 20 47 65 74 50 72 6f 63 41 64 64 xpect GetProcAdd
6010: 72 65 73 73 28 29 20 74 6f 20 74 61 6b 65 0a 20 ress() to take.
6020: 20 2a 2a 20 61 6e 20 41 4e 53 49 20 73 74 72 69 ** an ANSI stri
6030: 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 ng regardless of
6040: 20 74 68 65 20 5f 55 4e 49 43 4f 44 45 20 73 65 the _UNICODE se
6050: 74 74 69 6e 67 20 2a 2f 0a 20 20 7b 20 22 47 65 tting */. { "Ge
6060: 74 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20 tProcAddressA",
6070: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c (SYSCALL
6080: 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 2c )GetProcAddress,
6090: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 0 },.#
60a0: 65 6e 64 69 66 0a 23 65 6c 73 65 0a 20 20 7b 20 endif.#else. {
60b0: 22 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 "GetProcAddressA
60c0: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 ", (SYSC
60d0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 ALL)0,
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 0 }
60f0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e ,.#endif..#defin
6100: 65 20 6f 73 47 65 74 50 72 6f 63 41 64 64 72 65 e osGetProcAddre
6110: 73 73 41 20 28 28 46 41 52 50 52 4f 43 28 57 49 ssA ((FARPROC(WI
6120: 4e 41 50 49 2a 29 28 48 4d 4f 44 55 4c 45 2c 20 NAPI*)(HMODULE,
6130: 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 53 54 52 \. LPCSTR
6140: 29 29 61 53 79 73 63 61 6c 6c 5b 32 37 5d 2e 70 ))aSyscall[27].p
6150: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 Current)..#if !S
6160: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 QLITE_OS_WINRT.
6170: 20 7b 20 22 47 65 74 53 79 73 74 65 6d 49 6e 66 { "GetSystemInf
6180: 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 o", (S
6190: 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d YSCALL)GetSystem
61a0: 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 Info,
61b0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 0 },.#else. { "
61c0: 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20 GetSystemInfo",
61d0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 (SYSCA
61e0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 LL)0,
61f0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0 },
6200: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 .#endif..#define
6210: 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66 6f osGetSystemInfo
6220: 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 ((VOID(WINAPI*)
6230: 28 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 (LPSYSTEM_INFO))
6240: 61 53 79 73 63 61 6c 6c 5b 32 38 5d 2e 70 43 75 aSyscall[28].pCu
6250: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 rrent).. { "Get
6260: 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20 SystemTime",
6270: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 (SYSCALL)
6280: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 2c 20 20 GetSystemTime,
6290: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 0 },..#
62a0: 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74 define osGetSyst
62b0: 65 6d 54 69 6d 65 20 28 28 56 4f 49 44 28 57 49 emTime ((VOID(WI
62c0: 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45 4d 54 NAPI*)(LPSYSTEMT
62d0: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 32 39 IME))aSyscall[29
62e0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 ].pCurrent)..#if
62f0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 !SQLITE_OS_WINC
6300: 45 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d E. { "GetSystem
6310: 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 22 2c TimeAsFileTime",
6320: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73 (SYSCALL)GetSys
6330: 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d temTimeAsFileTim
6340: 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 e, 0 },.#else.
6350: 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d 65 { "GetSystemTime
6360: 41 73 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59 AsFileTime", (SY
6370: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 SCALL)0,
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0
6390: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 },.#endif..#def
63a0: 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 54 ine osGetSystemT
63b0: 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 20 28 28 imeAsFileTime ((
63c0: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 20 5c VOID(WINAPI*)( \
63d0: 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54 . LPFILET
63e0: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 30 IME))aSyscall[30
63f0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 ].pCurrent)..#if
6400: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f defined(SQLITE_
6410: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a WIN32_HAS_ANSI).
6420: 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 { "GetTempPath
6430: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 A", (
6440: 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70 50 SYSCALL)GetTempP
6450: 61 74 68 41 2c 20 20 20 20 20 20 20 20 20 20 20 athA,
6460: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 0 },.#else. {
6470: 22 47 65 74 54 65 6d 70 50 61 74 68 41 22 2c 20 "GetTempPathA",
6480: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 (SYSC
6490: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 ALL)0,
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 0 }
64b0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e ,.#endif..#defin
64c0: 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 41 e osGetTempPathA
64d0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a ((DWORD(WINAPI*
64e0: 29 28 44 57 4f 52 44 2c 4c 50 53 54 52 29 29 61 )(DWORD,LPSTR))a
64f0: 53 79 73 63 61 6c 6c 5b 33 31 5d 2e 70 43 75 72 Syscall[31].pCur
6500: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 rent)..#if !SQLI
6510: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 TE_OS_WINRT && d
6520: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 efined(SQLITE_WI
6530: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 N32_HAS_WIDE).
6540: 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 57 22 { "GetTempPathW"
6550: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 , (SY
6560: 53 43 41 4c 4c 29 47 65 74 54 65 6d 70 50 61 74 SCALL)GetTempPat
6570: 68 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 hW, 0
6580: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 },.#else. { "G
6590: 65 74 54 65 6d 70 50 61 74 68 57 22 2c 20 20 20 etTempPathW",
65a0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c (SYSCAL
65b0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 L)0,
65c0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0 },.
65d0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 #endif..#define
65e0: 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57 20 28 osGetTempPathW (
65f0: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 (DWORD(WINAPI*)(
6600: 44 57 4f 52 44 2c 4c 50 57 53 54 52 29 29 61 53 DWORD,LPWSTR))aS
6610: 79 73 63 61 6c 6c 5b 33 32 5d 2e 70 43 75 72 72 yscall[32].pCurr
6620: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 ent)..#if !SQLIT
6630: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 E_OS_WINRT. { "
6640: 47 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20 GetTickCount",
6650: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 (SYSCA
6660: 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e 74 2c LL)GetTickCount,
6670: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0 },
6680: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54 .#else. { "GetT
6690: 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20 20 20 20 ickCount",
66a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 (SYSCALL)0
66b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
66c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 0 },.#en
66d0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 dif..#define osG
66e0: 65 74 54 69 63 6b 43 6f 75 6e 74 20 28 28 44 57 etTickCount ((DW
66f0: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 ORD(WINAPI*)(VOI
6700: 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 33 5d 2e D))aSyscall[33].
6710: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 pCurrent)..#if d
6720: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 efined(SQLITE_WI
6730: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 N32_HAS_ANSI) &&
6740: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 SQLITE_WIN32_GE
6750: 54 56 45 52 53 49 4f 4e 45 58 0a 20 20 7b 20 22 TVERSIONEX. { "
6760: 47 65 74 56 65 72 73 69 6f 6e 45 78 41 22 2c 20 GetVersionExA",
6770: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 (SYSCA
6780: 4c 4c 29 47 65 74 56 65 72 73 69 6f 6e 45 78 41 LL)GetVersionExA
6790: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c , 0 },
67a0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 56 .#else. { "GetV
67b0: 65 72 73 69 6f 6e 45 78 41 22 2c 20 20 20 20 20 ersionExA",
67c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 (SYSCALL)0
67d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
67e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 0 },.#en
67f0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 dif..#define osG
6800: 65 74 56 65 72 73 69 6f 6e 45 78 41 20 28 28 42 etVersionExA ((B
6810: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a OOL(WINAPI*)( \.
6820: 20 20 20 20 20 20 20 20 4c 50 4f 53 56 45 52 53 LPOSVERS
6830: 49 4f 4e 49 4e 46 4f 41 29 29 61 53 79 73 63 61 IONINFOA))aSysca
6840: 6c 6c 5b 33 34 5d 2e 70 43 75 72 72 65 6e 74 29 ll[34].pCurrent)
6850: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 ..#if !SQLITE_OS
6860: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 _WINRT && define
6870: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 d(SQLITE_WIN32_H
6880: 41 53 5f 57 49 44 45 29 20 26 26 20 5c 0a 20 20 AS_WIDE) && \.
6890: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e SQLITE_WIN
68a0: 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a 32_GETVERSIONEX.
68b0: 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 { "GetVersionE
68c0: 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 xW", (
68d0: 53 59 53 43 41 4c 4c 29 47 65 74 56 65 72 73 69 SYSCALL)GetVersi
68e0: 6f 6e 45 78 57 2c 20 20 20 20 20 20 20 20 20 20 onExW,
68f0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 0 },.#else. {
6900: 22 47 65 74 56 65 72 73 69 6f 6e 45 78 57 22 2c "GetVersionExW",
6910: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 (SYSC
6920: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 ALL)0,
6930: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 0 }
6940: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e ,.#endif..#defin
6950: 65 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78 e osGetVersionEx
6960: 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a W ((BOOL(WINAPI*
6970: 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f )( \. LPO
6980: 53 56 45 52 53 49 4f 4e 49 4e 46 4f 57 29 29 61 SVERSIONINFOW))a
6990: 53 79 73 63 61 6c 6c 5b 33 35 5d 2e 70 43 75 72 Syscall[35].pCur
69a0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 rent).. { "Heap
69b0: 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 20 Alloc",
69c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 (SYSCALL)H
69d0: 65 61 70 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20 eapAlloc,
69e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 0 },..#d
69f0: 65 66 69 6e 65 20 6f 73 48 65 61 70 41 6c 6c 6f efine osHeapAllo
6a00: 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 c ((LPVOID(WINAP
6a10: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 I*)(HANDLE,DWORD
6a20: 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 , \. SIZE
6a30: 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 36 5d _T))aSyscall[36]
6a40: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 .pCurrent)..#if
6a50: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 !SQLITE_OS_WINRT
6a60: 0a 20 20 7b 20 22 48 65 61 70 43 72 65 61 74 65 . { "HeapCreate
6a70: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ",
6a80: 28 53 59 53 43 41 4c 4c 29 48 65 61 70 43 72 65 (SYSCALL)HeapCre
6a90: 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 ate,
6aa0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 0 },.#else. {
6ab0: 20 22 48 65 61 70 43 72 65 61 74 65 22 2c 20 20 "HeapCreate",
6ac0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 (SYS
6ad0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 CALL)0,
6ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 0
6af0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 },.#endif..#defi
6b00: 6e 65 20 6f 73 48 65 61 70 43 72 65 61 74 65 20 ne osHeapCreate
6b10: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a ((HANDLE(WINAPI*
6b20: 29 28 44 57 4f 52 44 2c 53 49 5a 45 5f 54 2c 20 )(DWORD,SIZE_T,
6b30: 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 \. SIZE_T
6b40: 29 29 61 53 79 73 63 61 6c 6c 5b 33 37 5d 2e 70 ))aSyscall[37].p
6b50: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 Current)..#if !S
6b60: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 QLITE_OS_WINRT.
6b70: 20 7b 20 22 48 65 61 70 44 65 73 74 72 6f 79 22 { "HeapDestroy"
6b80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 , (S
6b90: 59 53 43 41 4c 4c 29 48 65 61 70 44 65 73 74 72 YSCALL)HeapDestr
6ba0: 6f 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 oy,
6bb0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 0 },.#else. { "
6bc0: 48 65 61 70 44 65 73 74 72 6f 79 22 2c 20 20 20 HeapDestroy",
6bd0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 (SYSCA
6be0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 LL)0,
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0 },
6c00: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 .#endif..#define
6c10: 20 6f 73 48 65 61 70 44 65 73 74 72 6f 79 20 28 osHeapDestroy (
6c20: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 (BOOL(WINAPI*)(H
6c30: 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b ANDLE))aSyscall[
6c40: 33 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 38].pCurrent)..
6c50: 20 7b 20 22 48 65 61 70 46 72 65 65 22 2c 20 20 { "HeapFree",
6c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 (S
6c70: 59 53 43 41 4c 4c 29 48 65 61 70 46 72 65 65 2c YSCALL)HeapFree,
6c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6c90: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 0 },..#define os
6ca0: 48 65 61 70 46 72 65 65 20 28 28 42 4f 4f 4c 28 HeapFree ((BOOL(
6cb0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c WINAPI*)(HANDLE,
6cc0: 44 57 4f 52 44 2c 4c 50 56 4f 49 44 29 29 61 53 DWORD,LPVOID))aS
6cd0: 79 73 63 61 6c 6c 5b 33 39 5d 2e 70 43 75 72 72 yscall[39].pCurr
6ce0: 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 52 ent).. { "HeapR
6cf0: 65 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 eAlloc",
6d00: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 (SYSCALL)He
6d10: 61 70 52 65 41 6c 6c 6f 63 2c 20 20 20 20 20 20 apReAlloc,
6d20: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 0 },..#de
6d30: 66 69 6e 65 20 6f 73 48 65 61 70 52 65 41 6c 6c fine osHeapReAll
6d40: 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 oc ((LPVOID(WINA
6d50: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 PI*)(HANDLE,DWOR
6d60: 44 2c 4c 50 56 4f 49 44 2c 20 5c 0a 20 20 20 20 D,LPVOID, \.
6d70: 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 SIZE_T))aSys
6d80: 63 61 6c 6c 5b 34 30 5d 2e 70 43 75 72 72 65 6e call[40].pCurren
6d90: 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 53 69 7a t).. { "HeapSiz
6da0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 e",
6db0: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 (SYSCALL)Heap
6dc0: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 Size,
6dd0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 0 },..#defi
6de0: 6e 65 20 6f 73 48 65 61 70 53 69 7a 65 20 28 28 ne osHeapSize ((
6df0: 53 49 5a 45 5f 54 28 57 49 4e 41 50 49 2a 29 28 SIZE_T(WINAPI*)(
6e00: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a HANDLE,DWORD, \.
6e10: 20 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29 LPCVOID)
6e20: 29 61 53 79 73 63 61 6c 6c 5b 34 31 5d 2e 70 43 )aSyscall[41].pC
6e30: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 urrent)..#if !SQ
6e40: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 LITE_OS_WINRT.
6e50: 7b 20 22 48 65 61 70 56 61 6c 69 64 61 74 65 22 { "HeapValidate"
6e60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 , (SY
6e70: 53 43 41 4c 4c 29 48 65 61 70 56 61 6c 69 64 61 SCALL)HeapValida
6e80: 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 te, 0
6e90: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 },.#else. { "H
6ea0: 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20 20 20 eapValidate",
6eb0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c (SYSCAL
6ec0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 L)0,
6ed0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0 },.
6ee0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 #endif..#define
6ef0: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 20 28 osHeapValidate (
6f00: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 (BOOL(WINAPI*)(H
6f10: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 ANDLE,DWORD, \.
6f20: 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29 29 LPCVOID))
6f30: 61 53 79 73 63 61 6c 6c 5b 34 32 5d 2e 70 43 75 aSyscall[42].pCu
6f40: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c rrent)..#if !SQL
6f50: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 ITE_OS_WINCE &&
6f60: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 !SQLITE_OS_WINRT
6f70: 0a 20 20 7b 20 22 48 65 61 70 43 6f 6d 70 61 63 . { "HeapCompac
6f80: 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 t",
6f90: 28 53 59 53 43 41 4c 4c 29 48 65 61 70 43 6f 6d (SYSCALL)HeapCom
6fa0: 70 61 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 pact,
6fb0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 0 },.#else. {
6fc0: 20 22 48 65 61 70 43 6f 6d 70 61 63 74 22 2c 20 "HeapCompact",
6fd0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 (SYS
6fe0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 CALL)0,
6ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 0
7000: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 },.#endif..#defi
7010: 6e 65 20 6f 73 48 65 61 70 43 6f 6d 70 61 63 74 ne osHeapCompact
7020: 20 28 28 55 49 4e 54 28 57 49 4e 41 50 49 2a 29 ((UINT(WINAPI*)
7030: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 29 29 61 (HANDLE,DWORD))a
7040: 53 79 73 63 61 6c 6c 5b 34 33 5d 2e 70 43 75 72 Syscall[43].pCur
7050: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e rent)..#if defin
7060: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f ed(SQLITE_WIN32_
7070: 48 41 53 5f 41 4e 53 49 29 20 26 26 20 21 64 65 HAS_ANSI) && !de
7080: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 fined(SQLITE_OMI
7090: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e T_LOAD_EXTENSION
70a0: 29 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 ). { "LoadLibra
70b0: 72 79 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 ryA",
70c0: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 (SYSCALL)LoadLi
70d0: 62 72 61 72 79 41 2c 20 20 20 20 20 20 20 20 20 braryA,
70e0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 0 },.#else.
70f0: 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 41 22 { "LoadLibraryA"
7100: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 , (SY
7110: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 SCALL)0,
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0
7130: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 },.#endif..#def
7140: 69 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 ine osLoadLibrar
7150: 79 41 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e yA ((HMODULE(WIN
7160: 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 API*)(LPCSTR))aS
7170: 79 73 63 61 6c 6c 5b 34 34 5d 2e 70 43 75 72 72 yscall[44].pCurr
7180: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 ent)..#if !SQLIT
7190: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 E_OS_WINRT && de
71a0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e fined(SQLITE_WIN
71b0: 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26 26 20 32_HAS_WIDE) &&
71c0: 5c 0a 20 20 20 20 20 20 20 20 21 64 65 66 69 6e \. !defin
71d0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c ed(SQLITE_OMIT_L
71e0: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 OAD_EXTENSION).
71f0: 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 57 { "LoadLibraryW
7200: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 ", (S
7210: 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 YSCALL)LoadLibra
7220: 72 79 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 ryW,
7230: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 0 },.#else. { "
7240: 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c 20 20 LoadLibraryW",
7250: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 (SYSCA
7260: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 LL)0,
7270: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0 },
7280: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 .#endif..#define
7290: 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 57 20 osLoadLibraryW
72a0: 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 ((HMODULE(WINAPI
72b0: 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73 *)(LPCWSTR))aSys
72c0: 63 61 6c 6c 5b 34 35 5d 2e 70 43 75 72 72 65 6e call[45].pCurren
72d0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f t)..#if !SQLITE_
72e0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 4c 6f OS_WINRT. { "Lo
72f0: 63 61 6c 46 72 65 65 22 2c 20 20 20 20 20 20 20 calFree",
7300: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c (SYSCALL
7310: 29 4c 6f 63 61 6c 46 72 65 65 2c 20 20 20 20 20 )LocalFree,
7320: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 0 },.#
7330: 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 else. { "LocalF
7340: 72 65 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 ree",
7350: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 (SYSCALL)0,
7360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7370: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 0 },.#endi
7380: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 f..#define osLoc
7390: 61 6c 46 72 65 65 20 28 28 48 4c 4f 43 41 4c 28 alFree ((HLOCAL(
73a0: 57 49 4e 41 50 49 2a 29 28 48 4c 4f 43 41 4c 29 WINAPI*)(HLOCAL)
73b0: 29 61 53 79 73 63 61 6c 6c 5b 34 36 5d 2e 70 43 )aSyscall[46].pC
73c0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 urrent)..#if !SQ
73d0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 LITE_OS_WINCE &&
73e0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 !SQLITE_OS_WINR
73f0: 54 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 T. { "LockFile"
7400: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
7410: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 (SYSCALL)LockFi
7420: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 le,
7430: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 0 },.#else.
7440: 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 { "LockFile",
7450: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 (SY
7460: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 SCALL)0,
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0
7480: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e },.#endif..#ifn
7490: 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 0a 23 def osLockFile.#
74a0: 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c define osLockFil
74b0: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a e ((BOOL(WINAPI*
74c0: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 )(HANDLE,DWORD,D
74d0: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 WORD,DWORD, \.
74e0: 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 DWORD))aSy
74f0: 73 63 61 6c 6c 5b 34 37 5d 2e 70 43 75 72 72 65 scall[47].pCurre
7500: 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 nt).#endif..#if
7510: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 !SQLITE_OS_WINCE
7520: 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78 . { "LockFileEx
7530: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ",
7540: 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c (SYSCALL)LockFil
7550: 65 45 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 eEx,
7560: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 0 },.#else. {
7570: 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 "LockFileEx",
7580: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 (SYS
7590: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 CALL)0,
75a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 0
75b0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 },.#endif..#ifnd
75c0: 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 0a ef osLockFileEx.
75d0: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 #define osLockFi
75e0: 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 leEx ((BOOL(WINA
75f0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 PI*)(HANDLE,DWOR
7600: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 D,DWORD,DWORD,DW
7610: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c ORD, \. L
7620: 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 POVERLAPPED))aSy
7630: 73 63 61 6c 6c 5b 34 38 5d 2e 70 43 75 72 72 65 scall[48].pCurre
7640: 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 nt).#endif..#if
7650: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 SQLITE_OS_WINCE
7660: 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57 || (!SQLITE_OS_W
7670: 49 4e 52 54 20 26 26 20 5c 0a 20 20 20 20 20 20 INRT && \.
7680: 20 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c 49 (!defined(SQLI
7690: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 TE_OMIT_WAL) ||
76a0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f SQLITE_MAX_MMAP_
76b0: 53 49 5a 45 3e 30 29 29 0a 20 20 7b 20 22 4d 61 SIZE>0)). { "Ma
76c0: 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 pViewOfFile",
76d0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c (SYSCALL
76e0: 29 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c 20 )MapViewOfFile,
76f0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 0 },.#
7700: 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70 56 69 65 else. { "MapVie
7710: 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 wOfFile",
7720: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 (SYSCALL)0,
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7740: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 0 },.#endi
7750: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61 70 f..#define osMap
7760: 56 69 65 77 4f 66 46 69 6c 65 20 28 28 4c 50 56 ViewOfFile ((LPV
7770: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e OID(WINAPI*)(HAN
7780: 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c DLE,DWORD,DWORD,
7790: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 DWORD, \.
77a0: 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c SIZE_T))aSyscal
77b0: 6c 5b 34 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a l[49].pCurrent).
77c0: 0a 20 20 7b 20 22 4d 75 6c 74 69 42 79 74 65 54 . { "MultiByteT
77d0: 6f 57 69 64 65 43 68 61 72 22 2c 20 20 20 20 20 oWideChar",
77e0: 28 53 59 53 43 41 4c 4c 29 4d 75 6c 74 69 42 79 (SYSCALL)MultiBy
77f0: 74 65 54 6f 57 69 64 65 43 68 61 72 2c 20 20 20 teToWideChar,
7800: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 0 },..#define
7810: 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 osMultiByteToWid
7820: 65 43 68 61 72 20 28 28 69 6e 74 28 57 49 4e 41 eChar ((int(WINA
7830: 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52 44 2c PI*)(UINT,DWORD,
7840: 4c 50 43 53 54 52 2c 69 6e 74 2c 4c 50 57 53 54 LPCSTR,int,LPWST
7850: 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 69 6e 74 R, \. int
7860: 29 29 61 53 79 73 63 61 6c 6c 5b 35 30 5d 2e 70 ))aSyscall[50].p
7870: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 51 Current).. { "Q
7880: 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 ueryPerformanceC
7890: 6f 75 6e 74 65 72 22 2c 20 28 53 59 53 43 41 4c ounter", (SYSCAL
78a0: 4c 29 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e L)QueryPerforman
78b0: 63 65 43 6f 75 6e 74 65 72 2c 20 30 20 7d 2c 0a ceCounter, 0 },.
78c0: 0a 23 64 65 66 69 6e 65 20 6f 73 51 75 65 72 79 .#define osQuery
78d0: 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 PerformanceCount
78e0: 65 72 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 er ((BOOL(WINAPI
78f0: 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 41 *)( \. LA
7900: 52 47 45 5f 49 4e 54 45 47 45 52 2a 29 29 61 53 RGE_INTEGER*))aS
7910: 79 73 63 61 6c 6c 5b 35 31 5d 2e 70 43 75 72 72 yscall[51].pCurr
7920: 65 6e 74 29 0a 0a 20 20 7b 20 22 52 65 61 64 46 ent).. { "ReadF
7930: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 ile",
7940: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 52 65 (SYSCALL)Re
7950: 61 64 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 adFile,
7960: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 0 },..#de
7970: 66 69 6e 65 20 6f 73 52 65 61 64 46 69 6c 65 20 fine osReadFile
7980: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 ((BOOL(WINAPI*)(
7990: 48 41 4e 44 4c 45 2c 4c 50 56 4f 49 44 2c 44 57 HANDLE,LPVOID,DW
79a0: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 ORD,LPDWORD, \.
79b0: 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 LPOVERLAP
79c0: 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 32 PED))aSyscall[52
79d0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b ].pCurrent).. {
79e0: 20 22 53 65 74 45 6e 64 4f 66 46 69 6c 65 22 2c "SetEndOfFile",
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 (SYS
7a00: 43 41 4c 4c 29 53 65 74 45 6e 64 4f 66 46 69 6c CALL)SetEndOfFil
7a10: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 e, 0
7a20: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65 },..#define osSe
7a30: 74 45 6e 64 4f 66 46 69 6c 65 20 28 28 42 4f 4f tEndOfFile ((BOO
7a40: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c L(WINAPI*)(HANDL
7a50: 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 33 5d 2e E))aSyscall[53].
7a60: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 pCurrent)..#if !
7a70: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a SQLITE_OS_WINRT.
7a80: 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e { "SetFilePoin
7a90: 74 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 28 ter", (
7aa0: 53 59 53 43 41 4c 4c 29 53 65 74 46 69 6c 65 50 SYSCALL)SetFileP
7ab0: 6f 69 6e 74 65 72 2c 20 20 20 20 20 20 20 20 20 ointer,
7ac0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 0 },.#else. {
7ad0: 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 22 "SetFilePointer"
7ae0: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 , (SYSC
7af0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 ALL)0,
7b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 0 }
7b10: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e ,.#endif..#defin
7b20: 65 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 e osSetFilePoint
7b30: 65 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 er ((DWORD(WINAP
7b40: 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 4f 4e 47 2c I*)(HANDLE,LONG,
7b50: 50 4c 4f 4e 47 2c 20 5c 0a 20 20 20 20 20 20 20 PLONG, \.
7b60: 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c DWORD))aSyscall
7b70: 5b 35 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a [54].pCurrent)..
7b80: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 #if !SQLITE_OS_W
7b90: 49 4e 52 54 0a 20 20 7b 20 22 53 6c 65 65 70 22 INRT. { "Sleep"
7ba0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
7bb0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 6c 65 (SYSCALL)Sle
7bc0: 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 ep,
7bd0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0 },.#else
7be0: 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c 20 20 20 . { "Sleep",
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7c00: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 (SYSCALL)0,
7c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7c20: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 0 },.#endif..#
7c30: 64 65 66 69 6e 65 20 6f 73 53 6c 65 65 70 20 28 define osSleep (
7c40: 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 44 (VOID(WINAPI*)(D
7c50: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 WORD))aSyscall[5
7c60: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 5].pCurrent)..
7c70: 7b 20 22 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 { "SystemTimeToF
7c80: 69 6c 65 54 69 6d 65 22 2c 20 20 20 20 28 53 59 ileTime", (SY
7c90: 53 43 41 4c 4c 29 53 79 73 74 65 6d 54 69 6d 65 SCALL)SystemTime
7ca0: 54 6f 46 69 6c 65 54 69 6d 65 2c 20 20 20 20 30 ToFileTime, 0
7cb0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 },..#define osS
7cc0: 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 ystemTimeToFileT
7cd0: 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 ime ((BOOL(WINAP
7ce0: 49 2a 29 28 43 4f 4e 53 54 20 53 59 53 54 45 4d I*)(CONST SYSTEM
7cf0: 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 TIME*, \.
7d00: 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79 LPFILETIME))aSy
7d10: 73 63 61 6c 6c 5b 35 36 5d 2e 70 43 75 72 72 65 scall[56].pCurre
7d20: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 nt)..#if !SQLITE
7d30: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 _OS_WINCE && !SQ
7d40: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 LITE_OS_WINRT.
7d50: 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 { "UnlockFile",
7d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 (SY
7d70: 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 SCALL)UnlockFile
7d80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 , 0
7d90: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 },.#else. { "U
7da0: 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 nlockFile",
7db0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c (SYSCAL
7dc0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 L)0,
7dd0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0 },.
7de0: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 #endif..#ifndef
7df0: 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 0a 23 64 65 osUnlockFile.#de
7e00: 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c fine osUnlockFil
7e10: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a e ((BOOL(WINAPI*
7e20: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 )(HANDLE,DWORD,D
7e30: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 WORD,DWORD, \.
7e40: 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 DWORD))aSy
7e50: 73 63 61 6c 6c 5b 35 37 5d 2e 70 43 75 72 72 65 scall[57].pCurre
7e60: 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 nt).#endif..#if
7e70: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 !SQLITE_OS_WINCE
7e80: 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 . { "UnlockFile
7e90: 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 Ex",
7ea0: 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 (SYSCALL)UnlockF
7eb0: 69 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20 20 ileEx,
7ec0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 0 },.#else. {
7ed0: 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c "UnlockFileEx",
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 (SYS
7ef0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 CALL)0,
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 0
7f10: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 },.#endif..#defi
7f20: 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 ne osUnlockFileE
7f30: 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a x ((BOOL(WINAPI*
7f40: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 )(HANDLE,DWORD,D
7f50: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 WORD,DWORD, \.
7f60: 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 LPOVERLAPP
7f70: 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 38 5d ED))aSyscall[58]
7f80: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 .pCurrent)..#if
7f90: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 SQLITE_OS_WINCE
7fa0: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 || !defined(SQLI
7fb0: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 TE_OMIT_WAL) ||
7fc0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f SQLITE_MAX_MMAP_
7fd0: 53 49 5a 45 3e 30 0a 20 20 7b 20 22 55 6e 6d 61 SIZE>0. { "Unma
7fe0: 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 pViewOfFile",
7ff0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55 (SYSCALL)U
8000: 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c 20 nmapViewOfFile,
8010: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 0 },.#el
8020: 73 65 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69 65 se. { "UnmapVie
8030: 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 wOfFile",
8040: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 (SYSCALL)0,
8050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8060: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0 },.#endif.
8070: 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6d 61 70 .#define osUnmap
8080: 56 69 65 77 4f 66 46 69 6c 65 20 28 28 42 4f 4f ViewOfFile ((BOO
8090: 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 56 4f L(WINAPI*)(LPCVO
80a0: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 39 5d ID))aSyscall[59]
80b0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 .pCurrent).. {
80c0: 22 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 "WideCharToMulti
80d0: 42 79 74 65 22 2c 20 20 20 20 20 28 53 59 53 43 Byte", (SYSC
80e0: 41 4c 4c 29 57 69 64 65 43 68 61 72 54 6f 4d 75 ALL)WideCharToMu
80f0: 6c 74 69 42 79 74 65 2c 20 20 20 20 20 30 20 7d ltiByte, 0 }
8100: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 69 64 ,..#define osWid
8110: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 eCharToMultiByte
8120: 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a 29 28 ((int(WINAPI*)(
8130: 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 57 53 UINT,DWORD,LPCWS
8140: 54 52 2c 69 6e 74 2c 4c 50 53 54 52 2c 69 6e 74 TR,int,LPSTR,int
8150: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 53 , \. LPCS
8160: 54 52 2c 4c 50 42 4f 4f 4c 29 29 61 53 79 73 63 TR,LPBOOL))aSysc
8170: 61 6c 6c 5b 36 30 5d 2e 70 43 75 72 72 65 6e 74 all[60].pCurrent
8180: 29 0a 0a 20 20 7b 20 22 57 72 69 74 65 46 69 6c ).. { "WriteFil
8190: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 e",
81a0: 20 20 28 53 59 53 43 41 4c 4c 29 57 72 69 74 65 (SYSCALL)Write
81b0: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 File,
81c0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 0 },..#defin
81d0: 65 20 6f 73 57 72 69 74 65 46 69 6c 65 20 28 28 e osWriteFile ((
81e0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 BOOL(WINAPI*)(HA
81f0: 4e 44 4c 45 2c 4c 50 43 56 4f 49 44 2c 44 57 4f NDLE,LPCVOID,DWO
8200: 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 RD,LPDWORD, \.
8210: 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 LPOVERLAPP
8220: 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 31 5d ED))aSyscall[61]
8230: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 .pCurrent)..#if
8240: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a SQLITE_OS_WINRT.
8250: 20 20 7b 20 22 43 72 65 61 74 65 45 76 65 6e 74 { "CreateEvent
8260: 45 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 28 ExW", (
8270: 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 45 76 SYSCALL)CreateEv
8280: 65 6e 74 45 78 57 2c 20 20 20 20 20 20 20 20 20 entExW,
8290: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 0 },.#else. {
82a0: 22 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 22 "CreateEventExW"
82b0: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 , (SYSC
82c0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 ALL)0,
82d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 0 }
82e0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e ,.#endif..#defin
82f0: 65 20 6f 73 43 72 65 61 74 65 45 76 65 6e 74 45 e osCreateEventE
8300: 78 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 xW ((HANDLE(WINA
8310: 50 49 2a 29 28 4c 50 53 45 43 55 52 49 54 59 5f PI*)(LPSECURITY_
8320: 41 54 54 52 49 42 55 54 45 53 2c 4c 50 43 57 53 ATTRIBUTES,LPCWS
8330: 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 TR, \. DW
8340: 4f 52 44 2c 44 57 4f 52 44 29 29 61 53 79 73 63 ORD,DWORD))aSysc
8350: 61 6c 6c 5b 36 32 5d 2e 70 43 75 72 72 65 6e 74 all[62].pCurrent
8360: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f )..#if !SQLITE_O
8370: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 57 61 69 S_WINRT. { "Wai
8380: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 tForSingleObject
8390: 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 ", (SYSCALL)
83a0: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a WaitForSingleObj
83b0: 65 63 74 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 ect, 0 },.#e
83c0: 6c 73 65 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 lse. { "WaitFor
83d0: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 22 2c 20 20 SingleObject",
83e0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 (SYSCALL)0,
83f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8400: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0 },.#endif
8410: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 69 74 ..#define osWait
8420: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 20 ForSingleObject
8430: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 ((DWORD(WINAPI*)
8440: 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 (HANDLE, \.
8450: 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 DWORD))aSysca
8460: 6c 6c 5b 36 33 5d 2e 70 43 75 72 72 65 6e 74 29 ll[63].pCurrent)
8470: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 ..#if !SQLITE_OS
8480: 5f 57 49 4e 43 45 0a 20 20 7b 20 22 57 61 69 74 _WINCE. { "Wait
8490: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 ForSingleObjectE
84a0: 78 22 2c 20 20 20 28 53 59 53 43 41 4c 4c 29 57 x", (SYSCALL)W
84b0: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 aitForSingleObje
84c0: 63 74 45 78 2c 20 20 20 30 20 7d 2c 0a 23 65 6c ctEx, 0 },.#el
84d0: 73 65 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53 se. { "WaitForS
84e0: 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c 20 ingleObjectEx",
84f0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 (SYSCALL)0,
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8510: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0 },.#endif.
8520: 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 69 74 46 .#define osWaitF
8530: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 orSingleObjectEx
8540: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a ((DWORD(WINAPI*
8550: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 )(HANDLE,DWORD,
8560: 5c 0a 20 20 20 20 20 20 20 20 42 4f 4f 4c 29 29 \. BOOL))
8570: 61 53 79 73 63 61 6c 6c 5b 36 34 5d 2e 70 43 75 aSyscall[64].pCu
8580: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 rrent)..#if SQLI
8590: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 TE_OS_WINRT. {
85a0: 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 "SetFilePointerE
85b0: 78 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 x", (SYSC
85c0: 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e 74 ALL)SetFilePoint
85d0: 65 72 45 78 2c 20 20 20 20 20 20 20 20 30 20 7d erEx, 0 }
85e0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 65 74 ,.#else. { "Set
85f0: 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c 20 FilePointerEx",
8600: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 (SYSCALL)
8610: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0,
8620: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 0 },.#e
8630: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 ndif..#define os
8640: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 SetFilePointerEx
8650: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 ((BOOL(WINAPI*)
8660: 28 48 41 4e 44 4c 45 2c 4c 41 52 47 45 5f 49 4e (HANDLE,LARGE_IN
8670: 54 45 47 45 52 2c 20 5c 0a 20 20 20 20 20 20 20 TEGER, \.
8680: 20 50 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2c PLARGE_INTEGER,
8690: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b DWORD))aSyscall[
86a0: 36 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 65].pCurrent)..#
86b0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e if SQLITE_OS_WIN
86c0: 52 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 49 RT. { "GetFileI
86d0: 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 nformationByHand
86e0: 6c 65 45 78 22 2c 20 28 53 59 53 43 41 4c 4c 29 leEx", (SYSCALL)
86f0: 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 GetFileInformati
8700: 6f 6e 42 79 48 61 6e 64 6c 65 45 78 2c 20 30 20 onByHandleEx, 0
8710: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 },.#else. { "Ge
8720: 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e tFileInformation
8730: 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28 53 59 ByHandleEx", (SY
8740: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 SCALL)0,
8750: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 0 },.#
8760: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f endif..#define o
8770: 73 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 sGetFileInformat
8780: 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 20 28 28 ionByHandleEx ((
8790: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 BOOL(WINAPI*)(HA
87a0: 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 NDLE, \.
87b0: 46 49 4c 45 5f 49 4e 46 4f 5f 42 59 5f 48 41 4e FILE_INFO_BY_HAN
87c0: 44 4c 45 5f 43 4c 41 53 53 2c 4c 50 56 4f 49 44 DLE_CLASS,LPVOID
87d0: 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c ,DWORD))aSyscall
87e0: 5b 36 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a [66].pCurrent)..
87f0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 #if SQLITE_OS_WI
8800: 4e 52 54 20 26 26 20 28 21 64 65 66 69 6e 65 64 NRT && (!defined
8810: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c (SQLITE_OMIT_WAL
8820: 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f ) || SQLITE_MAX_
8830: 4d 4d 41 50 5f 53 49 5a 45 3e 30 29 0a 20 20 7b MMAP_SIZE>0). {
8840: 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 "MapViewOfFileF
8850: 72 6f 6d 41 70 70 22 2c 20 20 20 20 28 53 59 53 romApp", (SYS
8860: 43 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46 69 CALL)MapViewOfFi
8870: 6c 65 46 72 6f 6d 41 70 70 2c 20 20 20 20 30 20 leFromApp, 0
8880: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4d 61 },.#else. { "Ma
8890: 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 pViewOfFileFromA
88a0: 70 70 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c pp", (SYSCALL
88b0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 )0,
88c0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 0 },.#
88d0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f endif..#define o
88e0: 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72 sMapViewOfFileFr
88f0: 6f 6d 41 70 70 20 28 28 4c 50 56 4f 49 44 28 57 omApp ((LPVOID(W
8900: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 55 INAPI*)(HANDLE,U
8910: 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c 20 5c 0a LONG,ULONG64, \.
8920: 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 SIZE_T))
8930: 61 53 79 73 63 61 6c 6c 5b 36 37 5d 2e 70 43 75 aSyscall[67].pCu
8940: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 rrent)..#if SQLI
8950: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 TE_OS_WINRT. {
8960: 22 43 72 65 61 74 65 46 69 6c 65 32 22 2c 20 20 "CreateFile2",
8970: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 (SYSC
8980: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 32 2c ALL)CreateFile2,
8990: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 0 }
89a0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 ,.#else. { "Cre
89b0: 61 74 65 46 69 6c 65 32 22 2c 20 20 20 20 20 20 ateFile2",
89c0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 (SYSCALL)
89d0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0,
89e0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 0 },.#e
89f0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 ndif..#define os
8a00: 43 72 65 61 74 65 46 69 6c 65 32 20 28 28 48 41 CreateFile2 ((HA
8a10: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 NDLE(WINAPI*)(LP
8a20: 43 57 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 CWSTR,DWORD,DWOR
8a30: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 D,DWORD, \.
8a40: 20 20 20 4c 50 43 52 45 41 54 45 46 49 4c 45 32 LPCREATEFILE2
8a50: 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 _EXTENDED_PARAME
8a60: 54 45 52 53 29 29 61 53 79 73 63 61 6c 6c 5b 36 TERS))aSyscall[6
8a70: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 8].pCurrent)..#i
8a80: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 f SQLITE_OS_WINR
8a90: 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 T && !defined(SQ
8aa0: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 LITE_OMIT_LOAD_E
8ab0: 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c XTENSION). { "L
8ac0: 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61 oadPackagedLibra
8ad0: 72 79 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c ry", (SYSCAL
8ae0: 4c 29 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 L)LoadPackagedLi
8af0: 62 72 61 72 79 2c 20 20 20 20 20 30 20 7d 2c 0a brary, 0 },.
8b00: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 50 #else. { "LoadP
8b10: 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 22 2c ackagedLibrary",
8b20: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c (SYSCALL)0,
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8b40: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 0 },.#end
8b50: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f if..#define osLo
8b60: 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 adPackagedLibrar
8b70: 79 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41 y ((HMODULE(WINA
8b80: 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 20 5c 0a PI*)(LPCWSTR, \.
8b90: 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 DWORD))a
8ba0: 53 79 73 63 61 6c 6c 5b 36 39 5d 2e 70 43 75 72 Syscall[69].pCur
8bb0: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 rent)..#if SQLIT
8bc0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 E_OS_WINRT. { "
8bd0: 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 22 2c GetTickCount64",
8be0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 (SYSCA
8bf0: 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 LL)GetTickCount6
8c00: 34 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 4, 0 },
8c10: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54 .#else. { "GetT
8c20: 69 63 6b 43 6f 75 6e 74 36 34 22 2c 20 20 20 20 ickCount64",
8c30: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 (SYSCALL)0
8c40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
8c50: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 0 },.#en
8c60: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 dif..#define osG
8c70: 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 20 28 28 etTickCount64 ((
8c80: 55 4c 4f 4e 47 4c 4f 4e 47 28 57 49 4e 41 50 49 ULONGLONG(WINAPI
8c90: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c *)(VOID))aSyscal
8ca0: 6c 5b 37 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a l[70].pCurrent).
8cb0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 .#if SQLITE_OS_W
8cc0: 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 4e 61 74 INRT. { "GetNat
8cd0: 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20 iveSystemInfo",
8ce0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 (SYSCALL)Get
8cf0: 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f NativeSystemInfo
8d00: 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 , 0 },.#else
8d10: 0a 20 20 7b 20 22 47 65 74 4e 61 74 69 76 65 53 . { "GetNativeS
8d20: 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 ystemInfo",
8d30: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 (SYSCALL)0,
8d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8d50: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 0 },.#endif..#
8d60: 64 65 66 69 6e 65 20 6f 73 47 65 74 4e 61 74 69 define osGetNati
8d70: 76 65 53 79 73 74 65 6d 49 6e 66 6f 20 28 28 56 veSystemInfo ((V
8d80: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a OID(WINAPI*)( \.
8d90: 20 20 20 20 20 20 20 20 4c 50 53 59 53 54 45 4d LPSYSTEM
8da0: 5f 49 4e 46 4f 29 29 61 53 79 73 63 61 6c 6c 5b _INFO))aSyscall[
8db0: 37 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 71].pCurrent)..#
8dc0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 if defined(SQLIT
8dd0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 E_WIN32_HAS_ANSI
8de0: 29 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62 ). { "OutputDeb
8df0: 75 67 53 74 72 69 6e 67 41 22 2c 20 20 20 20 20 ugStringA",
8e00: 20 28 53 59 53 43 41 4c 4c 29 4f 75 74 70 75 74 (SYSCALL)Output
8e10: 44 65 62 75 67 53 74 72 69 6e 67 41 2c 20 20 20 DebugStringA,
8e20: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 0 },.#else.
8e30: 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 { "OutputDebugSt
8e40: 72 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59 ringA", (SY
8e50: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 SCALL)0,
8e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0
8e70: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 },.#endif..#def
8e80: 69 6e 65 20 6f 73 4f 75 74 70 75 74 44 65 62 75 ine osOutputDebu
8e90: 67 53 74 72 69 6e 67 41 20 28 28 56 4f 49 44 28 gStringA ((VOID(
8ea0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 WINAPI*)(LPCSTR)
8eb0: 29 61 53 79 73 63 61 6c 6c 5b 37 32 5d 2e 70 43 )aSyscall[72].pC
8ec0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 urrent)..#if def
8ed0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 ined(SQLITE_WIN3
8ee0: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 2_HAS_WIDE). {
8ef0: 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 "OutputDebugStri
8f00: 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 ngW", (SYSC
8f10: 41 4c 4c 29 4f 75 74 70 75 74 44 65 62 75 67 53 ALL)OutputDebugS
8f20: 74 72 69 6e 67 57 2c 20 20 20 20 20 20 30 20 7d tringW, 0 }
8f30: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f 75 74 ,.#else. { "Out
8f40: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 22 putDebugStringW"
8f50: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 , (SYSCALL)
8f60: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0,
8f70: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 0 },.#e
8f80: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 ndif..#define os
8f90: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e OutputDebugStrin
8fa0: 67 57 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 gW ((VOID(WINAPI
8fb0: 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73 *)(LPCWSTR))aSys
8fc0: 63 61 6c 6c 5b 37 33 5d 2e 70 43 75 72 72 65 6e call[73].pCurren
8fd0: 74 29 0a 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 t).. { "GetProc
8fe0: 65 73 73 48 65 61 70 22 2c 20 20 20 20 20 20 20 essHeap",
8ff0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50 (SYSCALL)GetP
9000: 72 6f 63 65 73 73 48 65 61 70 2c 20 20 20 20 20 rocessHeap,
9010: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 0 },..#defi
9020: 6e 65 20 6f 73 47 65 74 50 72 6f 63 65 73 73 48 ne osGetProcessH
9030: 65 61 70 20 28 28 48 41 4e 44 4c 45 28 57 49 4e eap ((HANDLE(WIN
9040: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 API*)(VOID))aSys
9050: 63 61 6c 6c 5b 37 34 5d 2e 70 43 75 72 72 65 6e call[74].pCurren
9060: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f t)..#if SQLITE_O
9070: 53 5f 57 49 4e 52 54 20 26 26 20 28 21 64 65 66 S_WINRT && (!def
9080: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 ined(SQLITE_OMIT
9090: 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f _WAL) || SQLITE_
90a0: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 29 MAX_MMAP_SIZE>0)
90b0: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 . { "CreateFile
90c0: 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 22 2c MappingFromApp",
90d0: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 (SYSCALL)Create
90e0: 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 FileMappingFromA
90f0: 70 70 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 pp, 0 },.#else.
9100: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 { "CreateFileMa
9110: 70 70 69 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28 ppingFromApp", (
9120: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 SYSCALL)0,
9130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9140: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 0 },.#endif..#de
9150: 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c fine osCreateFil
9160: 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 20 eMappingFromApp
9170: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a ((HANDLE(WINAPI*
9180: 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 )(HANDLE, \.
9190: 20 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 LPSECURITY_A
91a0: 54 54 52 49 42 55 54 45 53 2c 55 4c 4f 4e 47 2c TTRIBUTES,ULONG,
91b0: 55 4c 4f 4e 47 36 34 2c 4c 50 43 57 53 54 52 29 ULONG64,LPCWSTR)
91c0: 29 61 53 79 73 63 61 6c 6c 5b 37 35 5d 2e 70 43 )aSyscall[75].pC
91d0: 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 4e urrent)../*.** N
91e0: 4f 54 45 3a 20 4f 6e 20 73 6f 6d 65 20 73 75 62 OTE: On some sub
91f0: 2d 70 6c 61 74 66 6f 72 6d 73 2c 20 74 68 65 20 -platforms, the
9200: 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 InterlockedCompa
9210: 72 65 45 78 63 68 61 6e 67 65 20 22 66 75 6e 63 reExchange "func
9220: 74 69 6f 6e 22 0a 2a 2a 20 20 20 20 20 20 20 69 tion".** i
9230: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 s really just a
9240: 6d 61 63 72 6f 20 74 68 61 74 20 75 73 65 73 20 macro that uses
9250: 61 20 63 6f 6d 70 69 6c 65 72 20 69 6e 74 72 69 a compiler intri
9260: 6e 73 69 63 20 28 65 2e 67 2e 20 78 36 34 29 2e nsic (e.g. x64).
9270: 0a 2a 2a 20 20 20 20 20 20 20 53 6f 20 64 6f 20 .** So do
9280: 6e 6f 74 20 74 72 79 20 74 6f 20 6d 61 6b 65 20 not try to make
9290: 74 68 69 73 20 69 73 20 69 6e 74 6f 20 61 20 72 this is into a r
92a0: 65 64 65 66 69 6e 61 62 6c 65 20 69 6e 74 65 72 edefinable inter
92b0: 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 face..*/.#if def
92c0: 69 6e 65 64 28 49 6e 74 65 72 6c 6f 63 6b 65 64 ined(Interlocked
92d0: 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 29 CompareExchange)
92e0: 0a 20 20 7b 20 22 49 6e 74 65 72 6c 6f 63 6b 65 . { "Interlocke
92f0: 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 dCompareExchange
9300: 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 ", (SYSCALL)0,
9310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9320: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 0 },..#define
9330: 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d osInterlockedCom
9340: 70 61 72 65 45 78 63 68 61 6e 67 65 20 49 6e 74 pareExchange Int
9350: 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 erlockedCompareE
9360: 78 63 68 61 6e 67 65 0a 23 65 6c 73 65 0a 20 20 xchange.#else.
9370: 7b 20 22 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f { "InterlockedCo
9380: 6d 70 61 72 65 45 78 63 68 61 6e 67 65 22 2c 20 mpareExchange",
9390: 28 53 59 53 43 41 4c 4c 29 49 6e 74 65 72 6c 6f (SYSCALL)Interlo
93a0: 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 ckedCompareExcha
93b0: 6e 67 65 2c 20 30 20 7d 2c 0a 0a 23 64 65 66 69 nge, 0 },..#defi
93c0: 6e 65 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 ne osInterlocked
93d0: 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 20 CompareExchange
93e0: 28 28 4c 4f 4e 47 28 57 49 4e 41 50 49 2a 29 28 ((LONG(WINAPI*)(
93f0: 4c 4f 4e 47 20 5c 0a 20 20 20 20 20 20 20 20 53 LONG \. S
9400: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 56 4f 4c 41 QLITE_WIN32_VOLA
9410: 54 49 4c 45 2a 2c 20 4c 4f 4e 47 2c 4c 4f 4e 47 TILE*, LONG,LONG
9420: 29 29 61 53 79 73 63 61 6c 6c 5b 37 36 5d 2e 70 ))aSyscall[76].p
9430: 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 20 Current).#endif
9440: 2f 2a 20 64 65 66 69 6e 65 64 28 49 6e 74 65 72 /* defined(Inter
9450: 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 lockedCompareExc
9460: 68 61 6e 67 65 29 20 2a 2f 0a 0a 23 69 66 20 21 hange) */..#if !
9470: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 SQLITE_OS_WINCE
9480: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 && !SQLITE_OS_WI
9490: 4e 52 54 20 26 26 20 53 51 4c 49 54 45 5f 57 49 NRT && SQLITE_WI
94a0: 4e 33 32 5f 55 53 45 5f 55 55 49 44 0a 20 20 7b N32_USE_UUID. {
94b0: 20 22 55 75 69 64 43 72 65 61 74 65 22 2c 20 20 "UuidCreate",
94c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 (SY
94d0: 53 43 41 4c 4c 29 55 75 69 64 43 72 65 61 74 65 SCALL)UuidCreate
94e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 , 0
94f0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 75 },.#else. { "Uu
9500: 69 64 43 72 65 61 74 65 22 2c 20 20 20 20 20 20 idCreate",
9510: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c (SYSCAL
9520: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 L)0,
9530: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 0 },.#
9540: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f endif..#define o
9550: 73 55 75 69 64 43 72 65 61 74 65 20 28 28 52 50 sUuidCreate ((RP
9560: 43 5f 53 54 41 54 55 53 28 52 50 43 5f 45 4e 54 C_STATUS(RPC_ENT
9570: 52 59 2a 29 28 55 55 49 44 2a 29 29 61 53 79 73 RY*)(UUID*))aSys
9580: 63 61 6c 6c 5b 37 37 5d 2e 70 43 75 72 72 65 6e call[77].pCurren
9590: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f t)..#if !SQLITE_
95a0: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c OS_WINCE && !SQL
95b0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 ITE_OS_WINRT &&
95c0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 55 53 45 SQLITE_WIN32_USE
95d0: 5f 55 55 49 44 0a 20 20 7b 20 22 55 75 69 64 43 _UUID. { "UuidC
95e0: 72 65 61 74 65 53 65 71 75 65 6e 74 69 61 6c 22 reateSequential"
95f0: 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55 , (SYSCALL)U
9600: 75 69 64 43 72 65 61 74 65 53 65 71 75 65 6e 74 uidCreateSequent
9610: 69 61 6c 2c 20 20 20 30 20 7d 2c 0a 23 65 6c 73 ial, 0 },.#els
9620: 65 0a 20 20 7b 20 22 55 75 69 64 43 72 65 61 74 e. { "UuidCreat
9630: 65 53 65 71 75 65 6e 74 69 61 6c 22 2c 20 20 20 eSequential",
9640: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 (SYSCALL)0,
9650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9660: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 0 },.#endif..
9670: 23 64 65 66 69 6e 65 20 6f 73 55 75 69 64 43 72 #define osUuidCr
9680: 65 61 74 65 53 65 71 75 65 6e 74 69 61 6c 20 5c eateSequential \
9690: 0a 20 20 20 20 20 20 20 20 28 28 52 50 43 5f 53 . ((RPC_S
96a0: 54 41 54 55 53 28 52 50 43 5f 45 4e 54 52 59 2a TATUS(RPC_ENTRY*
96b0: 29 28 55 55 49 44 2a 29 29 61 53 79 73 63 61 6c )(UUID*))aSyscal
96c0: 6c 5b 37 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a l[78].pCurrent).
96d0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 .#if !defined(SQ
96e0: 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 26 26 LITE_NO_SYNC) &&
96f0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 SQLITE_MAX_MMAP
9700: 5f 53 49 5a 45 3e 30 0a 20 20 7b 20 22 46 6c 75 _SIZE>0. { "Flu
9710: 73 68 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 shViewOfFile",
9720: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c (SYSCALL
9730: 29 46 6c 75 73 68 56 69 65 77 4f 66 46 69 6c 65 )FlushViewOfFile
9740: 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 , 0 },.#e
9750: 6c 73 65 0a 20 20 7b 20 22 46 6c 75 73 68 56 69 lse. { "FlushVi
9760: 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 ewOfFile",
9770: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 (SYSCALL)0,
9780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9790: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0 },.#endif
97a0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6c 75 73 ..#define osFlus
97b0: 68 56 69 65 77 4f 66 46 69 6c 65 20 5c 0a 20 20 hViewOfFile \.
97c0: 20 20 20 20 20 20 28 28 42 4f 4f 4c 28 57 49 4e ((BOOL(WIN
97d0: 41 50 49 2a 29 28 4c 50 43 56 4f 49 44 2c 53 49 API*)(LPCVOID,SI
97e0: 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 37 ZE_T))aSyscall[7
97f0: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 7d 3b 9].pCurrent)..};
9800: 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6f /* End of the o
9810: 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74 verrideable syst
9820: 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a em calls */../*.
9830: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78 ** This is the x
9840: 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29 20 SetSystemCall()
9850: 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74 65 method of sqlite
9860: 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66 3_vfs for all of
9870: 20 74 68 65 0a 2a 2a 20 22 77 69 6e 33 32 22 20 the.** "win32"
9880: 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53 VFSes. Return S
9890: 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 QLITE_OK opon su
98a0: 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74 ccessfully updat
98b0: 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65 ing the.** syste
98c0: 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 m call pointer,
98d0: 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 or SQLITE_NOTFOU
98e0: 4e 44 20 69 66 20 74 68 65 72 65 20 69 73 20 6e ND if there is n
98f0: 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a o configurable.*
9900: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 * system call na
9910: 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 med zName..*/.st
9920: 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 74 53 atic int winSetS
9930: 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c ystemCall(. sql
9940: 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 ite3_vfs *pNotUs
9950: 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 ed, /* Th
9960: 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20 20 e VFS pointer.
9970: 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f Not used */. co
9980: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c nst char *zName,
9990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e /* N
99a0: 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61 ame of system ca
99b0: 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a ll to override *
99c0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 /. sqlite3_sysc
99d0: 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e 63 all_ptr pNewFunc
99e0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 /* Pointer to
99f0: 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 new system call
9a00: 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e value */.){. un
9a10: 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 signed int i;.
9a20: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f int rc = SQLITE_
9a30: 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 NOTFOUND;.. UNU
9a40: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e SED_PARAMETER(pN
9a50: 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 7a otUsed);. if( z
9a60: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f Name==0 ){. /
9a70: 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 * If no zName is
9a80: 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65 20 given, restore
9a90: 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 all system calls
9aa0: 20 74 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c to their defaul
9ab0: 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 t. ** setting
9ac0: 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c s and return NUL
9ad0: 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 L. */. rc
9ae0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 = SQLITE_OK;.
9af0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 for(i=0; i<size
9b00: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a of(aSyscall)/siz
9b10: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 eof(aSyscall[0])
9b20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 ; i++){. if
9b30: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 ( aSyscall[i].pD
9b40: 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 efault ){.
9b50: 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 aSyscall[i].pC
9b60: 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c urrent = aSyscal
9b70: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 l[i].pDefault;.
9b80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d }. }. }
9b90: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 else{. /* If
9ba0: 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 zName is specifi
9bb0: 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f ed, operate on o
9bc0: 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73 74 nly the one syst
9bd0: 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 em call. ** s
9be0: 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f pecified.. */
9bf0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c . for(i=0; i<
9c00: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 sizeof(aSyscall)
9c10: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c /sizeof(aSyscall
9c20: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 [0]); i++){.
9c30: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 if( strcmp(zNa
9c40: 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e me, aSyscall[i].
9c50: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 zName)==0 ){.
9c60: 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c if( aSyscal
9c70: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30 l[i].pDefault==0
9c80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53 ){. aS
9c90: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 yscall[i].pDefau
9ca0: 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d lt = aSyscall[i]
9cb0: 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 20 .pCurrent;.
9cc0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 }. rc
9cd0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 = SQLITE_OK;.
9ce0: 20 20 20 20 20 69 66 28 20 70 4e 65 77 46 75 6e if( pNewFun
9cf0: 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63 20 c==0 ) pNewFunc
9d00: 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 = aSyscall[i].pD
9d10: 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20 efault;.
9d20: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 aSyscall[i].pCur
9d30: 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b rent = pNewFunc;
9d40: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a . break;.
9d50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 }. }.
9d60: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d }. return rc;.}
9d70: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 ../*.** Return t
9d80: 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 79 he value of a sy
9d90: 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 stem call. Retu
9da0: 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 rn NULL if zName
9db0: 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 is not a.** rec
9dc0: 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20 63 ognized system c
9dd0: 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 all name. NULL
9de0: 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 is also returned
9df0: 20 69 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 if the system c
9e00: 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e all.** is curren
9e10: 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a tly undefined..*
9e20: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 /.static sqlite3
9e30: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 77 69 6e _syscall_ptr win
9e40: 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 GetSystemCall(.
9e50: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e sqlite3_vfs *pN
9e60: 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20 otUsed,. const
9e70: 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 char *zName.){.
9e80: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b unsigned int i;
9e90: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d .. UNUSED_PARAM
9ea0: 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a ETER(pNotUsed);.
9eb0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a for(i=0; i<siz
9ec0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 eof(aSyscall)/si
9ed0: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d zeof(aSyscall[0]
9ee0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 ); i++){. if(
9ef0: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 strcmp(zName, a
9f00: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 Syscall[i].zName
9f10: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 )==0 ) return aS
9f20: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 yscall[i].pCurre
9f30: 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e nt;. }. return
9f40: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 0;.}../*.** Ret
9f50: 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 urn the name of
9f60: 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d the first system
9f70: 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d call after zNam
9f80: 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 e. If zName==NU
9f90: 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 LL.** then retur
9fa0: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 n the name of th
9fb0: 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 e first system c
9fc0: 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c all. Return NUL
9fd0: 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 L if zName.** is
9fe0: 20 74 68 65 20 6c 61 73 74 20 73 79 73 74 65 6d the last system
9ff0: 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d call or if zNam
a000: 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d e is not the nam
a010: 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20 e of a valid.**
a020: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a system call..*/.
a030: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 static const cha
a040: 72 20 2a 77 69 6e 4e 65 78 74 53 79 73 74 65 6d r *winNextSystem
a050: 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 Call(sqlite3_vfs
a060: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 *p, const char
a070: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 *zName){. int i
a080: 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44 = -1;.. UNUSED
a090: 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 _PARAMETER(p);.
a0a0: 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 if( zName ){.
a0b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 for(i=0; i<Arr
a0c0: 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 aySize(aSyscall)
a0d0: 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 -1; i++){.
a0e0: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 if( strcmp(zName
a0f0: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e , aSyscall[i].zN
a100: 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b ame)==0 ) break;
a110: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 . }. }. for
a120: 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a (i++; i<ArraySiz
a130: 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b e(aSyscall); i++
a140: 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73 63 ){. if( aSysc
a150: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21 all[i].pCurrent!
a160: 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 =0 ) return aSys
a170: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 call[i].zName;.
a180: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d }. return 0;.}
a190: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ..#ifdef SQLITE_
a1a0: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a WIN32_MALLOC./*.
a1b0: 2a 2a 20 49 66 20 61 20 57 69 6e 33 32 20 6e 61 ** If a Win32 na
a1c0: 74 69 76 65 20 68 65 61 70 20 68 61 73 20 62 65 tive heap has be
a1d0: 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 74 en configured, t
a1e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c his function wil
a1f0: 6c 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 l attempt to.**
a200: 63 6f 6d 70 61 63 74 20 69 74 2e 20 20 55 70 6f compact it. Upo
a210: 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c 49 54 n success, SQLIT
a220: 45 5f 4f 4b 20 77 69 6c 6c 20 62 65 20 72 65 74 E_OK will be ret
a230: 75 72 6e 65 64 2e 20 20 55 70 6f 6e 20 66 61 69 urned. Upon fai
a240: 6c 75 72 65 2c 20 6f 6e 65 0a 2a 2a 20 6f 66 20 lure, one.** of
a250: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 53 51 SQLITE_NOMEM, SQ
a260: 4c 49 54 45 5f 45 52 52 4f 52 2c 20 6f 72 20 53 LITE_ERROR, or S
a270: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 77 QLITE_NOTFOUND w
a280: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e ill be returned.
a290: 20 20 54 68 65 0a 2a 2a 20 22 70 6e 4c 61 72 67 The.** "pnLarg
a2a0: 65 73 74 22 20 61 72 67 75 6d 65 6e 74 2c 20 69 est" argument, i
a2b0: 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 69 6c 6c f non-zero, will
a2c0: 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 74 75 be used to retu
a2d0: 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 rn the size of t
a2e0: 68 65 0a 2a 2a 20 6c 61 72 67 65 73 74 20 63 6f he.** largest co
a2f0: 6d 6d 69 74 74 65 64 20 66 72 65 65 20 62 6c 6f mmitted free blo
a300: 63 6b 20 69 6e 20 74 68 65 20 68 65 61 70 2c 20 ck in the heap,
a310: 69 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a 69 6e 74 in bytes..*/.int
a320: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 63 sqlite3_win32_c
a330: 6f 6d 70 61 63 74 5f 68 65 61 70 28 4c 50 55 49 ompact_heap(LPUI
a340: 4e 54 20 70 6e 4c 61 72 67 65 73 74 29 7b 0a 20 NT pnLargest){.
a350: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 int rc = SQLITE
a360: 5f 4f 4b 3b 0a 20 20 55 49 4e 54 20 6e 4c 61 72 _OK;. UINT nLar
a370: 67 65 73 74 20 3d 20 30 3b 0a 20 20 48 41 4e 44 gest = 0;. HAND
a380: 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20 77 69 6e LE hHeap;.. win
a390: 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 MemAssertMagic()
a3a0: 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d ;. hHeap = winM
a3b0: 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 emGetHeap();. a
a3c0: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 ssert( hHeap!=0
a3d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 );. assert( hHe
a3e0: 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 ap!=INVALID_HAND
a3f0: 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 LE_VALUE );.#if
a400: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 !SQLITE_OS_WINRT
a410: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 && defined(SQLI
a420: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f TE_WIN32_MALLOC_
a430: 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 VALIDATE). asse
a440: 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 rt( osHeapValida
a450: 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 te(hHeap, SQLITE
a460: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 _WIN32_HEAP_FLAG
a470: 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 S, NULL) );.#end
a480: 69 66 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f if.#if !SQLITE_O
a490: 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 S_WINCE && !SQLI
a4a0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 TE_OS_WINRT. if
a4b0: 28 20 28 6e 4c 61 72 67 65 73 74 3d 6f 73 48 65 ( (nLargest=osHe
a4c0: 61 70 43 6f 6d 70 61 63 74 28 68 48 65 61 70 2c apCompact(hHeap,
a4d0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 SQLITE_WIN32_HE
a4e0: 41 50 5f 46 4c 41 47 53 29 29 3d 3d 30 20 29 7b AP_FLAGS))==0 ){
a4f0: 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45 . DWORD lastE
a500: 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 rrno = osGetLast
a510: 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 69 66 28 Error();. if(
a520: 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 4e 4f 5f 45 lastErrno==NO_E
a530: 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 73 71 RROR ){. sq
a540: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 lite3_log(SQLITE
a550: 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 _NOMEM, "failed
a560: 74 6f 20 48 65 61 70 43 6f 6d 70 61 63 74 20 28 to HeapCompact (
a570: 6e 6f 20 73 70 61 63 65 29 2c 20 68 65 61 70 3d no space), heap=
a580: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 %p",.
a590: 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68 48 (void*)hH
a5a0: 65 61 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d eap);. rc =
a5b0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b SQLITE_NOMEM_BK
a5c0: 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 PT;. }else{.
a5d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 sqlite3_log
a5e0: 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22 (SQLITE_ERROR, "
a5f0: 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 43 6f failed to HeapCo
a600: 6d 70 61 63 74 20 28 25 6c 75 29 2c 20 68 65 61 mpact (%lu), hea
a610: 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 p=%p",.
a620: 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61 osGetLa
a630: 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 stError(), (void
a640: 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20 20 20 *)hHeap);.
a650: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f rc = SQLITE_ERRO
a660: 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c R;. }. }.#el
a670: 73 65 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 se. sqlite3_log
a680: 28 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 (SQLITE_NOTFOUND
a690: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 , "failed to Hea
a6a0: 70 43 6f 6d 70 61 63 74 2c 20 68 65 61 70 3d 25 pCompact, heap=%
a6b0: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 p",.
a6c0: 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b (void*)hHeap);
a6d0: 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e . rc = SQLITE_N
a6e0: 4f 54 46 4f 55 4e 44 3b 0a 23 65 6e 64 69 66 0a OTFOUND;.#endif.
a6f0: 20 20 69 66 28 20 70 6e 4c 61 72 67 65 73 74 20 if( pnLargest
a700: 29 20 2a 70 6e 4c 61 72 67 65 73 74 20 3d 20 6e ) *pnLargest = n
a710: 4c 61 72 67 65 73 74 3b 0a 20 20 72 65 74 75 72 Largest;. retur
a720: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 n rc;.}../*.** I
a730: 66 20 61 20 57 69 6e 33 32 20 6e 61 74 69 76 65 f a Win32 native
a740: 20 68 65 61 70 20 68 61 73 20 62 65 65 6e 20 63 heap has been c
a750: 6f 6e 66 69 67 75 72 65 64 2c 20 74 68 69 73 20 onfigured, this
a760: 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 61 74 function will at
a770: 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 64 65 73 74 tempt to.** dest
a780: 72 6f 79 20 61 6e 64 20 72 65 63 72 65 61 74 65 roy and recreate
a790: 20 69 74 2e 20 20 49 66 20 74 68 65 20 57 69 6e it. If the Win
a7a0: 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 20 69 32 native heap i
a7b0: 73 20 6e 6f 74 20 69 73 6f 6c 61 74 65 64 20 61 s not isolated a
a7c0: 6e 64 2f 6f 72 0a 2a 2a 20 74 68 65 20 73 71 6c nd/or.** the sql
a7d0: 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 ite3_memory_used
a7e0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 () function does
a7f0: 20 6e 6f 74 20 72 65 74 75 72 6e 20 7a 65 72 6f not return zero
a800: 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 69 , SQLITE_BUSY wi
a810: 6c 6c 0a 2a 2a 20 62 65 20 72 65 74 75 72 6e 65 ll.** be returne
a820: 64 20 61 6e 64 20 6e 6f 20 63 68 61 6e 67 65 73 d and no changes
a830: 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f will be made to
a840: 20 74 68 65 20 57 69 6e 33 32 20 6e 61 74 69 76 the Win32 nativ
a850: 65 20 68 65 61 70 2e 0a 2a 2f 0a 69 6e 74 20 73 e heap..*/.int s
a860: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 72 65 73 qlite3_win32_res
a870: 65 74 5f 68 65 61 70 28 29 7b 0a 20 20 69 6e 74 et_heap(){. int
a880: 20 72 63 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 rc;. MUTEX_LOG
a890: 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 IC( sqlite3_mute
a8a0: 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 20 2f 2a x *pMaster; ) /*
a8b0: 20 54 68 65 20 6d 61 69 6e 20 73 74 61 74 69 63 The main static
a8c0: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 4d 55 54 45 mutex */. MUTE
a8d0: 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 X_LOGIC( sqlite3
a8e0: 5f 6d 75 74 65 78 20 2a 70 4d 65 6d 3b 20 29 20 _mutex *pMem; )
a8f0: 20 20 20 2f 2a 20 54 68 65 20 6d 65 6d 73 79 73 /* The memsys
a900: 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a 2f static mutex */
a910: 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 . MUTEX_LOGIC(
a920: 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 pMaster = sqlite
a930: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 3MutexAlloc(SQLI
a940: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f TE_MUTEX_STATIC_
a950: 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 4d 55 54 MASTER); ). MUT
a960: 45 58 5f 4c 4f 47 49 43 28 20 70 4d 65 6d 20 3d EX_LOGIC( pMem =
a970: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c sqlite3MutexAll
a980: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f oc(SQLITE_MUTEX_
a990: 53 54 41 54 49 43 5f 4d 45 4d 29 3b 20 29 0a 20 STATIC_MEM); ).
a9a0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 sqlite3_mutex_e
a9b0: 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 nter(pMaster);.
a9c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 sqlite3_mutex_e
a9d0: 6e 74 65 72 28 70 4d 65 6d 29 3b 0a 20 20 77 69 nter(pMem);. wi
a9e0: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 nMemAssertMagic(
a9f0: 29 3b 0a 20 20 69 66 28 20 77 69 6e 4d 65 6d 47 );. if( winMemG
aa00: 65 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c 20 26 etHeap()!=NULL &
aa10: 26 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 & winMemGetOwned
aa20: 28 29 20 26 26 20 73 71 6c 69 74 65 33 5f 6d 65 () && sqlite3_me
aa30: 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d 30 20 29 mory_used()==0 )
aa40: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 {. /*. **
aa50: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 At this point, t
aa60: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 6e here should be n
aa70: 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6d 65 o outstanding me
aa80: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 mory allocations
aa90: 20 6f 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 68 on. ** the h
aaa0: 65 61 70 2e 20 20 41 6c 73 6f 2c 20 73 69 6e 63 eap. Also, sinc
aab0: 65 20 62 6f 74 68 20 74 68 65 20 6d 61 73 74 65 e both the maste
aac0: 72 20 61 6e 64 20 6d 65 6d 73 79 73 20 6c 6f 63 r and memsys loc
aad0: 6b 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 ks are currently
aae0: 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 68 65 . ** being he
aaf0: 6c 64 20 62 79 20 75 73 2c 20 6e 6f 20 6f 74 68 ld by us, no oth
ab00: 65 72 20 66 75 6e 63 74 69 6f 6e 20 28 69 2e 65 er function (i.e
ab10: 2e 20 66 72 6f 6d 20 61 6e 6f 74 68 65 72 20 74 . from another t
ab20: 68 72 65 61 64 29 20 73 68 6f 75 6c 64 0a 20 20 hread) should.
ab30: 20 20 2a 2a 20 62 65 20 61 62 6c 65 20 74 6f 20 ** be able to
ab40: 65 76 65 6e 20 61 63 63 65 73 73 20 74 68 65 20 even access the
ab50: 68 65 61 70 2e 20 20 41 74 74 65 6d 70 74 20 74 heap. Attempt t
ab60: 6f 20 64 65 73 74 72 6f 79 20 61 6e 64 20 72 65 o destroy and re
ab70: 63 72 65 61 74 65 20 6f 75 72 0a 20 20 20 20 2a create our. *
ab80: 2a 20 69 73 6f 6c 61 74 65 64 20 57 69 6e 33 32 * isolated Win32
ab90: 20 6e 61 74 69 76 65 20 68 65 61 70 20 6e 6f 77 native heap now
aba0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 .. */. ass
abb0: 65 72 74 28 20 77 69 6e 4d 65 6d 47 65 74 48 65 ert( winMemGetHe
abc0: 61 70 28 29 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20 ap()!=NULL );.
abd0: 20 20 61 73 73 65 72 74 28 20 77 69 6e 4d 65 6d assert( winMem
abe0: 47 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20 GetOwned() );.
abf0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 assert( sqlite
ac00: 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3_memory_used()=
ac10: 3d 30 20 29 3b 0a 20 20 20 20 77 69 6e 4d 65 6d =0 );. winMem
ac20: 53 68 75 74 64 6f 77 6e 28 77 69 6e 4d 65 6d 47 Shutdown(winMemG
ac30: 65 74 44 61 74 61 50 74 72 28 29 29 3b 0a 20 20 etDataPtr());.
ac40: 20 20 61 73 73 65 72 74 28 20 77 69 6e 4d 65 6d assert( winMem
ac50: 47 65 74 48 65 61 70 28 29 3d 3d 4e 55 4c 4c 20 GetHeap()==NULL
ac60: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 );. assert( !
ac70: 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 winMemGetOwned()
ac80: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 );. assert(
ac90: 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 sqlite3_memory_u
aca0: 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20 20 20 20 sed()==0 );.
acb0: 72 63 20 3d 20 77 69 6e 4d 65 6d 49 6e 69 74 28 rc = winMemInit(
acc0: 77 69 6e 4d 65 6d 47 65 74 44 61 74 61 50 74 72 winMemGetDataPtr
acd0: 28 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 ());. assert(
ace0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c rc!=SQLITE_OK |
acf0: 7c 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 | winMemGetHeap(
ad00: 29 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 61 )!=NULL );. a
ad10: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 ssert( rc!=SQLIT
ad20: 45 5f 4f 4b 20 7c 7c 20 77 69 6e 4d 65 6d 47 65 E_OK || winMemGe
ad30: 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20 20 20 tOwned() );.
ad40: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 assert( rc!=SQLI
ad50: 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 TE_OK || sqlite3
ad60: 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d _memory_used()==
ad70: 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0 );. }else{.
ad80: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 /*. ** The
ad90: 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61 Win32 native hea
ada0: 70 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69 p cannot be modi
adb0: 66 69 65 64 20 62 65 63 61 75 73 65 20 69 74 20 fied because it
adc0: 6d 61 79 20 62 65 20 69 6e 20 75 73 65 2e 0a 20 may be in use..
add0: 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 */. rc = S
ade0: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a QLITE_BUSY;. }.
adf0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f sqlite3_mutex_
ae00: 6c 65 61 76 65 28 70 4d 65 6d 29 3b 0a 20 20 73 leave(pMem);. s
ae10: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 qlite3_mutex_lea
ae20: 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 ve(pMaster);. r
ae30: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 eturn rc;.}.#end
ae40: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e if /* SQLITE_WIN
ae50: 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 32_MALLOC */../*
ae60: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f .** This functio
ae70: 6e 20 6f 75 74 70 75 74 73 20 74 68 65 20 73 70 n outputs the sp
ae80: 65 63 69 66 69 65 64 20 28 41 4e 53 49 29 20 73 ecified (ANSI) s
ae90: 74 72 69 6e 67 20 74 6f 20 74 68 65 20 57 69 6e tring to the Win
aea0: 33 32 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 28 32 debugger.** (
aeb0: 69 66 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a if available)..*
aec0: 2f 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f /..void sqlite3_
aed0: 77 69 6e 33 32 5f 77 72 69 74 65 5f 64 65 62 75 win32_write_debu
aee0: 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 g(const char *zB
aef0: 75 66 2c 20 69 6e 74 20 6e 42 75 66 29 7b 0a 20 uf, int nBuf){.
af00: 20 63 68 61 72 20 7a 44 62 67 42 75 66 5b 53 51 char zDbgBuf[SQ
af10: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 LITE_WIN32_DBG_B
af20: 55 46 5f 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 UF_SIZE];. int
af30: 6e 4d 69 6e 20 3d 20 4d 49 4e 28 6e 42 75 66 2c nMin = MIN(nBuf,
af40: 20 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 (SQLITE_WIN32_D
af50: 42 47 5f 42 55 46 5f 53 49 5a 45 20 2d 20 31 29 BG_BUF_SIZE - 1)
af60: 29 3b 20 2f 2a 20 6d 61 79 20 62 65 20 6e 65 67 ); /* may be neg
af70: 61 74 69 76 65 2e 20 2a 2f 0a 20 20 69 66 28 20 ative. */. if(
af80: 6e 4d 69 6e 3c 2d 31 20 29 20 6e 4d 69 6e 20 3d nMin<-1 ) nMin =
af90: 20 2d 31 3b 20 2f 2a 20 61 6c 6c 20 6e 65 67 61 -1; /* all nega
afa0: 74 69 76 65 20 76 61 6c 75 65 73 20 62 65 63 6f tive values beco
afb0: 6d 65 20 2d 31 2e 20 2a 2f 0a 20 20 61 73 73 65 me -1. */. asse
afc0: 72 74 28 20 6e 4d 69 6e 3d 3d 2d 31 20 7c 7c 20 rt( nMin==-1 ||
afd0: 6e 4d 69 6e 3d 3d 30 20 7c 7c 20 6e 4d 69 6e 3c nMin==0 || nMin<
afe0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 SQLITE_WIN32_DBG
aff0: 5f 42 55 46 5f 53 49 5a 45 20 29 3b 0a 23 69 66 _BUF_SIZE );.#if
b000: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c def SQLITE_ENABL
b010: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 E_API_ARMOR. if
b020: 28 20 21 7a 42 75 66 20 29 7b 0a 20 20 20 20 28 ( !zBuf ){. (
b030: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 void)SQLITE_MISU
b040: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 SE_BKPT;. ret
b050: 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a urn;. }.#endif.
b060: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 #if defined(SQLI
b070: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 TE_WIN32_HAS_ANS
b080: 49 29 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30 20 I). if( nMin>0
b090: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 44 ){. memset(zD
b0a0: 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 bgBuf, 0, SQLITE
b0b0: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 _WIN32_DBG_BUF_S
b0c0: 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 IZE);. memcpy
b0d0: 28 7a 44 62 67 42 75 66 2c 20 7a 42 75 66 2c 20 (zDbgBuf, zBuf,
b0e0: 6e 4d 69 6e 29 3b 0a 20 20 20 20 6f 73 4f 75 74 nMin);. osOut
b0f0: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 28 putDebugStringA(
b100: 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d 65 6c 73 zDbgBuf);. }els
b110: 65 7b 0a 20 20 20 20 6f 73 4f 75 74 70 75 74 44 e{. osOutputD
b120: 65 62 75 67 53 74 72 69 6e 67 41 28 7a 42 75 66 ebugStringA(zBuf
b130: 29 3b 0a 20 20 7d 0a 23 65 6c 69 66 20 64 65 66 );. }.#elif def
b140: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 ined(SQLITE_WIN3
b150: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 6d 65 2_HAS_WIDE). me
b160: 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c mset(zDbgBuf, 0,
b170: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 SQLITE_WIN32_DB
b180: 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 69 G_BUF_SIZE);. i
b190: 66 20 28 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 f ( osMultiByteT
b1a0: 6f 57 69 64 65 43 68 61 72 28 0a 20 20 20 20 20 oWideChar(.
b1b0: 20 20 20 20 20 6f 73 41 72 65 46 69 6c 65 41 70 osAreFileAp
b1c0: 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 isANSI() ? CP_AC
b1d0: 50 20 3a 20 43 50 5f 4f 45 4d 43 50 2c 20 30 2c P : CP_OEMCP, 0,
b1e0: 20 7a 42 75 66 2c 0a 20 20 20 20 20 20 20 20 20 zBuf,.
b1f0: 20 6e 4d 69 6e 2c 20 28 4c 50 57 53 54 52 29 7a nMin, (LPWSTR)z
b200: 44 62 67 42 75 66 2c 20 53 51 4c 49 54 45 5f 57 DbgBuf, SQLITE_W
b210: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a IN32_DBG_BUF_SIZ
b220: 45 2f 73 69 7a 65 6f 66 28 57 43 48 41 52 29 29 E/sizeof(WCHAR))
b230: 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 <=0 ){. retur
b240: 6e 3b 0a 20 20 7d 0a 20 20 6f 73 4f 75 74 70 75 n;. }. osOutpu
b250: 74 44 65 62 75 67 53 74 72 69 6e 67 57 28 28 4c tDebugStringW((L
b260: 50 43 57 53 54 52 29 7a 44 62 67 42 75 66 29 3b PCWSTR)zDbgBuf);
b270: 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6e 4d 69 .#else. if( nMi
b280: 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 n>0 ){. memse
b290: 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51 t(zDbgBuf, 0, SQ
b2a0: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 LITE_WIN32_DBG_B
b2b0: 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65 UF_SIZE);. me
b2c0: 6d 63 70 79 28 7a 44 62 67 42 75 66 2c 20 7a 42 mcpy(zDbgBuf, zB
b2d0: 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 66 uf, nMin);. f
b2e0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 printf(stderr, "
b2f0: 25 73 22 2c 20 7a 44 62 67 42 75 66 29 3b 0a 20 %s", zDbgBuf);.
b300: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 }else{. fpri
b310: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 22 ntf(stderr, "%s"
b320: 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6e , zBuf);. }.#en
b330: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 dif.}../*.** The
b340: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 following routi
b350: 6e 65 20 73 75 73 70 65 6e 64 73 20 74 68 65 20 ne suspends the
b360: 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20 66 current thread f
b370: 6f 72 20 61 74 20 6c 65 61 73 74 20 6d 73 0a 2a or at least ms.*
b380: 2a 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2e 20 * milliseconds.
b390: 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c This is equival
b3a0: 65 6e 74 20 74 6f 20 74 68 65 20 57 69 6e 33 32 ent to the Win32
b3b0: 20 53 6c 65 65 70 28 29 20 69 6e 74 65 72 66 61 Sleep() interfa
b3c0: 63 65 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 ce..*/.#if SQLIT
b3d0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 73 74 61 74 69 E_OS_WINRT.stati
b3e0: 63 20 48 41 4e 44 4c 45 20 73 6c 65 65 70 4f 62 c HANDLE sleepOb
b3f0: 6a 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 j = NULL;.#endif
b400: 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 77 ..void sqlite3_w
b410: 69 6e 33 32 5f 73 6c 65 65 70 28 44 57 4f 52 44 in32_sleep(DWORD
b420: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 7b 0a milliseconds){.
b430: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 #if SQLITE_OS_WI
b440: 4e 52 54 0a 20 20 69 66 20 28 20 73 6c 65 65 70 NRT. if ( sleep
b450: 4f 62 6a 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 Obj==NULL ){.
b460: 20 73 6c 65 65 70 4f 62 6a 20 3d 20 6f 73 43 72 sleepObj = osCr
b470: 65 61 74 65 45 76 65 6e 74 45 78 57 28 4e 55 4c eateEventExW(NUL
b480: 4c 2c 20 4e 55 4c 4c 2c 20 43 52 45 41 54 45 5f L, NULL, CREATE_
b490: 45 56 45 4e 54 5f 4d 41 4e 55 41 4c 5f 52 45 53 EVENT_MANUAL_RES
b4a0: 45 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 ET,.
b4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
b4c0: 20 20 20 20 53 59 4e 43 48 52 4f 4e 49 5a 45 29 SYNCHRONIZE)
b4d0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 ;. }. assert(
b4e0: 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29 sleepObj!=NULL )
b4f0: 3b 0a 20 20 6f 73 57 61 69 74 46 6f 72 53 69 6e ;. osWaitForSin
b500: 67 6c 65 4f 62 6a 65 63 74 45 78 28 73 6c 65 65 gleObjectEx(slee
b510: 70 4f 62 6a 2c 20 6d 69 6c 6c 69 73 65 63 6f 6e pObj, millisecon
b520: 64 73 2c 20 46 41 4c 53 45 29 3b 0a 23 65 6c 73 ds, FALSE);.#els
b530: 65 0a 20 20 6f 73 53 6c 65 65 70 28 6d 69 6c 6c e. osSleep(mill
b540: 69 73 65 63 6f 6e 64 73 29 3b 0a 23 65 6e 64 69 iseconds);.#endi
b550: 66 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f f.}..#if SQLITE_
b560: 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 MAX_WORKER_THREA
b570: 44 53 3e 30 20 26 26 20 21 53 51 4c 49 54 45 5f DS>0 && !SQLITE_
b580: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c OS_WINCE && !SQL
b590: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 ITE_OS_WINRT &&
b5a0: 5c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 \. SQLITE
b5b0: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a 44 57 _THREADSAFE>0.DW
b5c0: 4f 52 44 20 73 71 6c 69 74 65 33 57 69 6e 33 32 ORD sqlite3Win32
b5d0: 57 61 69 74 28 48 41 4e 44 4c 45 20 68 4f 62 6a Wait(HANDLE hObj
b5e0: 65 63 74 29 7b 0a 20 20 44 57 4f 52 44 20 72 63 ect){. DWORD rc
b5f0: 3b 0a 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d ;. while( (rc =
b600: 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 osWaitForSingle
b610: 4f 62 6a 65 63 74 45 78 28 68 4f 62 6a 65 63 74 ObjectEx(hObject
b620: 2c 20 49 4e 46 49 4e 49 54 45 2c 0a 20 20 20 20 , INFINITE,.
b630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
b640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
b650: 20 20 20 54 52 55 45 29 29 3d 3d 57 41 49 54 5f TRUE))==WAIT_
b660: 49 4f 5f 43 4f 4d 50 4c 45 54 49 4f 4e 20 29 7b IO_COMPLETION ){
b670: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d }. return rc;.}
b680: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 .#endif../*.** R
b690: 65 74 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d eturn true (non-
b6a0: 7a 65 72 6f 29 20 69 66 20 77 65 20 61 72 65 20 zero) if we are
b6b0: 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57 69 running under Wi
b6c0: 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20 57 69 6e 58 nNT, Win2K, WinX
b6d0: 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43 45 2e 20 P,.** or WinCE.
b6e0: 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 28 7a Return false (z
b6f0: 65 72 6f 29 20 66 6f 72 20 57 69 6e 39 35 2c 20 ero) for Win95,
b700: 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e Win98, or WinME.
b710: 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 61 .**.** Here is a
b720: 6e 20 69 6e 74 65 72 65 73 74 69 6e 67 20 6f 62 n interesting ob
b730: 73 65 72 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39 servation: Win9
b740: 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64 20 57 69 5, Win98, and Wi
b750: 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20 nME lack.** the
b760: 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 LockFileEx() API
b770: 2e 20 20 42 75 74 20 77 65 20 63 61 6e 20 73 74 . But we can st
b780: 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c 79 20 6c ill statically l
b790: 69 6e 6b 20 61 67 61 69 6e 73 74 20 74 68 61 74 ink against that
b7a0: 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f 6e 67 20 .** API as long
b7b0: 61 73 20 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c as we don't call
b7c0: 20 69 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 it when running
b7d0: 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 41 Win95/98/ME. A
b7e0: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69 73 call to.** this
b7f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 routine is used
b800: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 to determine if
b810: 20 74 68 65 20 68 6f 73 74 20 69 73 20 57 69 6e the host is Win
b820: 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57 95/98/ME or.** W
b830: 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f 20 74 68 inNT/2K/XP so th
b840: 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 at we will know
b850: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 77 whether or not w
b860: 65 20 63 61 6e 20 73 61 66 65 6c 79 20 63 61 6c e can safely cal
b870: 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c l.** the LockFil
b880: 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f 0a 0a 23 eEx() API..*/..#
b890: 69 66 20 21 53 51 4c 49 54 45 5f 57 49 4e 33 32 if !SQLITE_WIN32
b8a0: 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a 23 20 _GETVERSIONEX.#
b8b0: 64 65 66 69 6e 65 20 6f 73 49 73 4e 54 28 29 20 define osIsNT()
b8c0: 20 28 31 29 0a 23 65 6c 69 66 20 53 51 4c 49 54 (1).#elif SQLIT
b8d0: 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 E_OS_WINCE || SQ
b8e0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 7c 7c LITE_OS_WINRT ||
b8f0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 !defined(SQLITE
b900: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 _WIN32_HAS_ANSI)
b910: 0a 23 20 64 65 66 69 6e 65 20 6f 73 49 73 4e 54 .# define osIsNT
b920: 28 29 20 20 28 31 29 0a 23 65 6c 69 66 20 21 64 () (1).#elif !d
b930: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 efined(SQLITE_WI
b940: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 23 20 N32_HAS_WIDE).#
b950: 64 65 66 69 6e 65 20 6f 73 49 73 4e 54 28 29 20 define osIsNT()
b960: 20 28 30 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 (0).#else.# def
b970: 69 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28 28 ine osIsNT() ((
b980: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d sqlite3_os_type=
b990: 3d 32 29 20 7c 7c 20 73 71 6c 69 74 65 33 5f 77 =2) || sqlite3_w
b9a0: 69 6e 33 32 5f 69 73 5f 6e 74 28 29 29 0a 23 65 in32_is_nt()).#e
b9b0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 ndif../*.** This
b9c0: 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d function determ
b9d0: 69 6e 65 73 20 69 66 20 74 68 65 20 6d 61 63 68 ines if the mach
b9e0: 69 6e 65 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 ine is running a
b9f0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 57 69 6e 64 version of Wind
ba00: 6f 77 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20 ows.** based on
ba10: 74 68 65 20 4e 54 20 6b 65 72 6e 65 6c 2e 0a 2a the NT kernel..*
ba20: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 /.int sqlite3_wi
ba30: 6e 33 32 5f 69 73 5f 6e 74 28 76 6f 69 64 29 7b n32_is_nt(void){
ba40: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 .#if SQLITE_OS_W
ba50: 49 4e 52 54 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e INRT. /*. ** N
ba60: 4f 54 45 3a 20 54 68 65 20 57 69 6e 52 54 20 73 OTE: The WinRT s
ba70: 75 62 2d 70 6c 61 74 66 6f 72 6d 20 69 73 20 61 ub-platform is a
ba80: 6c 77 61 79 73 20 61 73 73 75 6d 65 64 20 74 6f lways assumed to
ba90: 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 be based on the
baa0: 20 4e 54 0a 20 20 2a 2a 20 20 20 20 20 20 20 6b NT. ** k
bab0: 65 72 6e 65 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65 ernel.. */. re
bac0: 74 75 72 6e 20 31 3b 0a 23 65 6c 69 66 20 53 51 turn 1;.#elif SQ
bad0: 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 LITE_WIN32_GETVE
bae0: 52 53 49 4f 4e 45 58 0a 20 20 69 66 28 20 6f 73 RSIONEX. if( os
baf0: 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 InterlockedCompa
bb00: 72 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c 69 reExchange(&sqli
bb10: 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20 30 2c 20 te3_os_type, 0,
bb20: 30 29 3d 3d 30 20 29 7b 0a 23 69 66 20 64 65 66 0)==0 ){.#if def
bb30: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 ined(SQLITE_WIN3
bb40: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 20 20 2_HAS_ANSI).
bb50: 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 20 73 OSVERSIONINFOA s
bb60: 49 6e 66 6f 3b 0a 20 20 20 20 73 49 6e 66 6f 2e Info;. sInfo.
bb70: 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53 dwOSVersionInfoS
bb80: 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e ize = sizeof(sIn
bb90: 66 6f 29 3b 0a 20 20 20 20 6f 73 47 65 74 56 65 fo);. osGetVe
bba0: 72 73 69 6f 6e 45 78 41 28 26 73 49 6e 66 6f 29 rsionExA(&sInfo)
bbb0: 3b 0a 20 20 20 20 6f 73 49 6e 74 65 72 6c 6f 63 ;. osInterloc
bbc0: 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e kedCompareExchan
bbd0: 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 ge(&sqlite3_os_t
bbe0: 79 70 65 2c 0a 20 20 20 20 20 20 20 20 28 73 49 ype,. (sI
bbf0: 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49 64 nfo.dwPlatformId
bc00: 20 3d 3d 20 56 45 52 5f 50 4c 41 54 46 4f 52 4d == VER_PLATFORM
bc10: 5f 57 49 4e 33 32 5f 4e 54 29 20 3f 20 32 20 3a _WIN32_NT) ? 2 :
bc20: 20 31 2c 20 30 29 3b 0a 23 65 6c 69 66 20 64 65 1, 0);.#elif de
bc30: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e fined(SQLITE_WIN
bc40: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 20 32_HAS_WIDE).
bc50: 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 57 20 OSVERSIONINFOW
bc60: 73 49 6e 66 6f 3b 0a 20 20 20 20 73 49 6e 66 6f sInfo;. sInfo
bc70: 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f .dwOSVersionInfo
bc80: 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 Size = sizeof(sI
bc90: 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 47 65 74 56 nfo);. osGetV
bca0: 65 72 73 69 6f 6e 45 78 57 28 26 73 49 6e 66 6f ersionExW(&sInfo
bcb0: 29 3b 0a 20 20 20 20 6f 73 49 6e 74 65 72 6c 6f );. osInterlo
bcc0: 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 ckedCompareExcha
bcd0: 6e 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f nge(&sqlite3_os_
bce0: 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20 28 73 type,. (s
bcf0: 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49 Info.dwPlatformI
bd00: 64 20 3d 3d 20 56 45 52 5f 50 4c 41 54 46 4f 52 d == VER_PLATFOR
bd10: 4d 5f 57 49 4e 33 32 5f 4e 54 29 20 3f 20 32 20 M_WIN32_NT) ? 2
bd20: 3a 20 31 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a : 1, 0);.#endif.
bd30: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f 73 49 }. return osI
bd40: 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 nterlockedCompar
bd50: 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c 69 74 eExchange(&sqlit
bd60: 65 33 5f 6f 73 5f 74 79 70 65 2c 20 32 2c 20 32 e3_os_type, 2, 2
bd70: 29 3d 3d 32 3b 0a 23 65 6c 69 66 20 53 51 4c 49 )==2;.#elif SQLI
bd80: 54 45 5f 54 45 53 54 0a 20 20 72 65 74 75 72 6e TE_TEST. return
bd90: 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f osInterlockedCo
bda0: 6d 70 61 72 65 45 78 63 68 61 6e 67 65 28 26 73 mpareExchange(&s
bdb0: 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20 qlite3_os_type,
bdc0: 32 2c 20 32 29 3d 3d 32 3b 0a 23 65 6c 73 65 0a 2, 2)==2;.#else.
bdd0: 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 /*. ** NOTE:
bde0: 41 6c 6c 20 73 75 62 2d 70 6c 61 74 66 6f 72 6d All sub-platform
bdf0: 73 20 77 68 65 72 65 20 74 68 65 20 47 65 74 56 s where the GetV
be00: 65 72 73 69 6f 6e 45 78 5b 41 57 5d 20 66 75 6e ersionEx[AW] fun
be10: 63 74 69 6f 6e 73 20 61 72 65 0a 20 20 2a 2a 20 ctions are. **
be20: 20 20 20 20 20 20 64 65 70 72 65 63 61 74 65 64 deprecated
be30: 20 61 72 65 20 61 6c 77 61 79 73 20 61 73 73 75 are always assu
be40: 6d 65 64 20 74 6f 20 62 65 20 62 61 73 65 64 20 med to be based
be50: 6f 6e 20 74 68 65 20 4e 54 20 6b 65 72 6e 65 6c on the NT kernel
be60: 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 .. */. return
be70: 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 1;.#endif.}..#if
be80: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 def SQLITE_WIN32
be90: 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 41 6c _MALLOC./*.** Al
bea0: 6c 6f 63 61 74 65 20 6e 42 79 74 65 73 20 6f 66 locate nBytes of
beb0: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 memory..*/.stat
bec0: 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d ic void *winMemM
bed0: 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 73 alloc(int nBytes
bee0: 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 ){. HANDLE hHea
bef0: 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 p;. void *p;..
bf00: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 winMemAssertMag
bf10: 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 ic();. hHeap =
bf20: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b winMemGetHeap();
bf30: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 . assert( hHeap
bf40: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 !=0 );. assert(
bf50: 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f hHeap!=INVALID_
bf60: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a HANDLE_VALUE );.
bf70: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 #if !SQLITE_OS_W
bf80: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 INRT && defined(
bf90: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c SQLITE_WIN32_MAL
bfa0: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 LOC_VALIDATE).
bfb0: 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 assert( osHeapVa
bfc0: 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 lidate(hHeap, SQ
bfd0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f LITE_WIN32_HEAP_
bfe0: 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a FLAGS, NULL) );.
bff0: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 #endif. assert(
c000: 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20 nBytes>=0 );.
c010: 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28 p = osHeapAlloc(
c020: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 hHeap, SQLITE_WI
c030: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 N32_HEAP_FLAGS,
c040: 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b (SIZE_T)nBytes);
c050: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 . if( !p ){.
c060: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c sqlite3_log(SQL
c070: 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c ITE_NOMEM, "fail
c080: 65 64 20 74 6f 20 48 65 61 70 41 6c 6c 6f 63 20 ed to HeapAlloc
c090: 25 75 20 62 79 74 65 73 20 28 25 6c 75 29 2c 20 %u bytes (%lu),
c0a0: 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 heap=%p",.
c0b0: 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 73 nBytes
c0c0: 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 , osGetLastError
c0d0: 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 (), (void*)hHeap
c0e0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 );. }. return
c0f0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 p;.}../*.** Free
c100: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 memory..*/.stat
c110: 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46 72 ic void winMemFr
c120: 65 65 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 29 ee(void *pPrior)
c130: 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 {. HANDLE hHeap
c140: 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 ;.. winMemAsser
c150: 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 tMagic();. hHea
c160: 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 p = winMemGetHea
c170: 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 p();. assert( h
c180: 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 Heap!=0 );. ass
c190: 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 ert( hHeap!=INVA
c1a0: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 LID_HANDLE_VALUE
c1b0: 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f );.#if !SQLITE_
c1c0: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 OS_WINRT && defi
c1d0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 ned(SQLITE_WIN32
c1e0: 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 _MALLOC_VALIDATE
c1f0: 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 ). assert( osHe
c200: 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 apValidate(hHeap
c210: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 , SQLITE_WIN32_H
c220: 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f EAP_FLAGS, pPrio
c230: 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 r) );.#endif. i
c240: 66 28 20 21 70 50 72 69 6f 72 20 29 20 72 65 74 f( !pPrior ) ret
c250: 75 72 6e 3b 20 2f 2a 20 50 61 73 73 69 6e 67 20 urn; /* Passing
c260: 4e 55 4c 4c 20 74 6f 20 48 65 61 70 46 72 65 65 NULL to HeapFree
c270: 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 2a is undefined. *
c280: 2f 0a 20 20 69 66 28 20 21 6f 73 48 65 61 70 46 /. if( !osHeapF
c290: 72 65 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 ree(hHeap, SQLIT
c2a0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 E_WIN32_HEAP_FLA
c2b0: 47 53 2c 20 70 50 72 69 6f 72 29 20 29 7b 0a 20 GS, pPrior) ){.
c2c0: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 sqlite3_log(S
c2d0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 QLITE_NOMEM, "fa
c2e0: 69 6c 65 64 20 74 6f 20 48 65 61 70 46 72 65 65 iled to HeapFree
c2f0: 20 62 6c 6f 63 6b 20 25 70 20 28 25 6c 75 29 2c block %p (%lu),
c300: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 heap=%p",.
c310: 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69 6f pPrio
c320: 72 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f r, osGetLastErro
c330: 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 r(), (void*)hHea
c340: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a p);. }.}../*.**
c350: 20 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a 65 Change the size
c360: 20 6f 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 of an existing
c370: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f memory allocatio
c380: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 n.*/.static void
c390: 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28 *winMemRealloc(
c3a0: 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e void *pPrior, in
c3b0: 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41 4e t nBytes){. HAN
c3c0: 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f 69 DLE hHeap;. voi
c3d0: 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 d *p;.. winMemA
c3e0: 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 ssertMagic();.
c3f0: 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 hHeap = winMemGe
c400: 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 tHeap();. asser
c410: 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 t( hHeap!=0 );.
c420: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d assert( hHeap!=
c430: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 INVALID_HANDLE_V
c440: 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c ALUE );.#if !SQL
c450: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 ITE_OS_WINRT &&
c460: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 defined(SQLITE_W
c470: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 IN32_MALLOC_VALI
c480: 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 DATE). assert(
c490: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 osHeapValidate(h
c4a0: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e Heap, SQLITE_WIN
c4b0: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 32_HEAP_FLAGS, p
c4c0: 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 Prior) );.#endif
c4d0: 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 . assert( nByte
c4e0: 73 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 s>=0 );. if( !p
c4f0: 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 20 3d Prior ){. p =
c500: 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 osHeapAlloc(hHe
c510: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 ap, SQLITE_WIN32
c520: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 _HEAP_FLAGS, (SI
c530: 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 ZE_T)nBytes);.
c540: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 6f }else{. p = o
c550: 73 48 65 61 70 52 65 41 6c 6c 6f 63 28 68 48 65 sHeapReAlloc(hHe
c560: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 ap, SQLITE_WIN32
c570: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 _HEAP_FLAGS, pPr
c580: 69 6f 72 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 ior, (SIZE_T)nBy
c590: 74 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 tes);. }. if(
c5a0: 21 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 !p ){. sqlite
c5b0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 3_log(SQLITE_NOM
c5c0: 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 25 EM, "failed to %
c5d0: 73 20 25 75 20 62 79 74 65 73 20 28 25 6c 75 29 s %u bytes (%lu)
c5e0: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 , heap=%p",.
c5f0: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69 pPri
c600: 6f 72 20 3f 20 22 48 65 61 70 52 65 41 6c 6c 6f or ? "HeapReAllo
c610: 63 22 20 3a 20 22 48 65 61 70 41 6c 6c 6f 63 22 c" : "HeapAlloc"
c620: 2c 20 6e 42 79 74 65 73 2c 20 6f 73 47 65 74 4c , nBytes, osGetL
c630: 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 astError(),.
c640: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 (voi
c650: 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20 d*)hHeap);. }.
c660: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a return p;.}../*
c670: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 .** Return the s
c680: 69 7a 65 20 6f 66 20 61 6e 20 6f 75 74 73 74 61 ize of an outsta
c690: 6e 64 69 6e 67 20 61 6c 6c 6f 63 61 74 69 6f 6e nding allocation
c6a0: 2c 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 , in bytes..*/.s
c6b0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d tatic int winMem
c6c0: 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20 Size(void *p){.
c6d0: 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 HANDLE hHeap;.
c6e0: 20 53 49 5a 45 5f 54 20 6e 3b 0a 0a 20 20 77 69 SIZE_T n;.. wi
c6f0: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 nMemAssertMagic(
c700: 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e );. hHeap = win
c710: 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 MemGetHeap();.
c720: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 assert( hHeap!=0
c730: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 );. assert( hH
c740: 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e eap!=INVALID_HAN
c750: 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 DLE_VALUE );.#if
c760: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 !SQLITE_OS_WINR
c770: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c T && defined(SQL
c780: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 ITE_WIN32_MALLOC
c790: 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 _VALIDATE). ass
c7a0: 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 ert( osHeapValid
c7b0: 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 ate(hHeap, SQLIT
c7c0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 E_WIN32_HEAP_FLA
c7d0: 47 53 2c 20 70 29 20 29 3b 0a 23 65 6e 64 69 66 GS, p) );.#endif
c7e0: 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 . if( !p ) retu
c7f0: 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 6f 73 48 65 rn 0;. n = osHe
c800: 61 70 53 69 7a 65 28 68 48 65 61 70 2c 20 53 51 apSize(hHeap, SQ
c810: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f LITE_WIN32_HEAP_
c820: 46 4c 41 47 53 2c 20 70 29 3b 0a 20 20 69 66 28 FLAGS, p);. if(
c830: 20 6e 3d 3d 28 53 49 5a 45 5f 54 29 2d 31 20 29 n==(SIZE_T)-1 )
c840: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f {. sqlite3_lo
c850: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 g(SQLITE_NOMEM,
c860: 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 53 "failed to HeapS
c870: 69 7a 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 6c ize block %p (%l
c880: 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 u), heap=%p",.
c890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c p,
c8a0: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 osGetLastError(
c8b0: 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 ), (void*)hHeap)
c8c0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a ;. return 0;.
c8d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e }. return (in
c8e0: 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f t)n;.}../*.** Ro
c8f0: 75 6e 64 20 75 70 20 61 20 72 65 71 75 65 73 74 und up a request
c900: 20 73 69 7a 65 20 74 6f 20 74 68 65 20 6e 65 78 size to the nex
c910: 74 20 76 61 6c 69 64 20 61 6c 6c 6f 63 61 74 69 t valid allocati
c920: 6f 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 on size..*/.stat
c930: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 ic int winMemRou
c940: 6e 64 75 70 28 69 6e 74 20 6e 29 7b 0a 20 20 72 ndup(int n){. r
c950: 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a eturn n;.}../*.*
c960: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 * Initialize thi
c970: 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 s module..*/.sta
c980: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e tic int winMemIn
c990: 69 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 it(void *pAppDat
c9a0: 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 a){. winMemData
c9b0: 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 *pWinMemData =
c9c0: 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 (winMemData *)pA
c9d0: 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 ppData;.. if( !
c9e0: 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 pWinMemData ) re
c9f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f turn SQLITE_ERRO
ca00: 52 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 R;. assert( pWi
ca10: 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63 31 nMemData->magic1
ca20: 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20 ==WINMEM_MAGIC1
ca30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 );. assert( pWi
ca40: 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63 32 nMemData->magic2
ca50: 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20 ==WINMEM_MAGIC2
ca60: 29 3b 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f );..#if !SQLITE_
ca70: 4f 53 5f 57 49 4e 52 54 20 26 26 20 53 51 4c 49 OS_WINRT && SQLI
ca80: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 TE_WIN32_HEAP_CR
ca90: 45 41 54 45 0a 20 20 69 66 28 20 21 70 57 69 6e EATE. if( !pWin
caa0: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 MemData->hHeap )
cab0: 7b 0a 20 20 20 20 44 57 4f 52 44 20 64 77 49 6e {. DWORD dwIn
cac0: 69 74 69 61 6c 53 69 7a 65 20 3d 20 53 51 4c 49 itialSize = SQLI
cad0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e TE_WIN32_HEAP_IN
cae0: 49 54 5f 53 49 5a 45 3b 0a 20 20 20 20 44 57 4f IT_SIZE;. DWO
caf0: 52 44 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 RD dwMaximumSize
cb00: 20 3d 20 28 44 57 4f 52 44 29 73 71 6c 69 74 65 = (DWORD)sqlite
cb10: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 3GlobalConfig.nH
cb20: 65 61 70 3b 0a 20 20 20 20 69 66 28 20 64 77 4d eap;. if( dwM
cb30: 61 78 69 6d 75 6d 53 69 7a 65 3d 3d 30 20 29 7b aximumSize==0 ){
cb40: 0a 20 20 20 20 20 20 64 77 4d 61 78 69 6d 75 6d . dwMaximum
cb50: 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 57 49 Size = SQLITE_WI
cb60: 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a N32_HEAP_MAX_SIZ
cb70: 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 E;. }else if(
cb80: 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 3e 64 dwInitialSize>d
cb90: 77 4d 61 78 69 6d 75 6d 53 69 7a 65 20 29 7b 0a wMaximumSize ){.
cba0: 20 20 20 20 20 20 64 77 49 6e 69 74 69 61 6c 53 dwInitialS
cbb0: 69 7a 65 20 3d 20 64 77 4d 61 78 69 6d 75 6d 53 ize = dwMaximumS
cbc0: 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 ize;. }. p
cbd0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 WinMemData->hHea
cbe0: 70 20 3d 20 6f 73 48 65 61 70 43 72 65 61 74 65 p = osHeapCreate
cbf0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 (SQLITE_WIN32_HE
cc00: 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 AP_FLAGS,.
cc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cc30: 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 2c 20 64 dwInitialSize, d
cc40: 77 4d 61 78 69 6d 75 6d 53 69 7a 65 29 3b 0a 20 wMaximumSize);.
cc50: 20 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 if( !pWinMemD
cc60: 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 ata->hHeap ){.
cc70: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 sqlite3_log(
cc80: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 SQLITE_NOMEM,.
cc90: 20 20 20 20 20 20 20 20 22 66 61 69 6c 65 64 20 "failed
cca0: 74 6f 20 48 65 61 70 43 72 65 61 74 65 20 28 25 to HeapCreate (%
ccb0: 6c 75 29 2c 20 66 6c 61 67 73 3d 25 75 2c 20 69 lu), flags=%u, i
ccc0: 6e 69 74 53 69 7a 65 3d 25 6c 75 2c 20 6d 61 78 nitSize=%lu, max
ccd0: 53 69 7a 65 3d 25 6c 75 22 2c 0a 20 20 20 20 20 Size=%lu",.
cce0: 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72 osGetLastEr
ccf0: 72 6f 72 28 29 2c 20 53 51 4c 49 54 45 5f 57 49 ror(), SQLITE_WI
cd00: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 N32_HEAP_FLAGS,
cd10: 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 2c 0a 20 dwInitialSize,.
cd20: 20 20 20 20 20 20 20 20 20 64 77 4d 61 78 69 6d dwMaxim
cd30: 75 6d 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 umSize);. r
cd40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d eturn SQLITE_NOM
cd50: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 EM_BKPT;. }.
cd60: 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e pWinMemData->
cd70: 62 4f 77 6e 65 64 20 3d 20 54 52 55 45 3b 0a 20 bOwned = TRUE;.
cd80: 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d assert( pWinM
cd90: 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 emData->bOwned )
cda0: 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 70 57 ;. }.#else. pW
cdb0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 inMemData->hHeap
cdc0: 20 3d 20 6f 73 47 65 74 50 72 6f 63 65 73 73 48 = osGetProcessH
cdd0: 65 61 70 28 29 3b 0a 20 20 69 66 28 20 21 70 57 eap();. if( !pW
cde0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 inMemData->hHeap
cdf0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f ){. sqlite3_
ce00: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d log(SQLITE_NOMEM
ce10: 2c 0a 20 20 20 20 20 20 20 20 22 66 61 69 6c 65 ,. "faile
ce20: 64 20 74 6f 20 47 65 74 50 72 6f 63 65 73 73 48 d to GetProcessH
ce30: 65 61 70 20 28 25 6c 75 29 22 2c 20 6f 73 47 65 eap (%lu)", osGe
ce40: 74 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 20 tLastError());.
ce50: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 return SQLITE
ce60: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d _NOMEM_BKPT;. }
ce70: 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e . pWinMemData->
ce80: 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a bOwned = FALSE;.
ce90: 20 20 61 73 73 65 72 74 28 20 21 70 57 69 6e 4d assert( !pWinM
cea0: 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 emData->bOwned )
ceb0: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 ;.#endif. asser
cec0: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e t( pWinMemData->
ced0: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 hHeap!=0 );. as
cee0: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 sert( pWinMemDat
cef0: 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 a->hHeap!=INVALI
cf00: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 D_HANDLE_VALUE )
cf10: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 ;.#if !SQLITE_OS
cf20: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 _WINRT && define
cf30: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d d(SQLITE_WIN32_M
cf40: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a ALLOC_VALIDATE).
cf50: 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 assert( osHeap
cf60: 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d Validate(pWinMem
cf70: 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c Data->hHeap, SQL
cf80: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 ITE_WIN32_HEAP_F
cf90: 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 LAGS, NULL) );.#
cfa0: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 endif. return S
cfb0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a QLITE_OK;.}../*.
cfc0: 2a 2a 20 44 65 69 6e 69 74 69 61 6c 69 7a 65 20 ** Deinitialize
cfd0: 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a this module..*/.
cfe0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d static void winM
cff0: 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 64 20 emShutdown(void
d000: 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20 77 69 *pAppData){. wi
d010: 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65 nMemData *pWinMe
d020: 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44 mData = (winMemD
d030: 61 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b 0a ata *)pAppData;.
d040: 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 . if( !pWinMemD
d050: 61 74 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 ata ) return;.
d060: 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 assert( pWinMemD
d070: 61 74 61 2d 3e 6d 61 67 69 63 31 3d 3d 57 49 4e ata->magic1==WIN
d080: 4d 45 4d 5f 4d 41 47 49 43 31 20 29 3b 0a 20 20 MEM_MAGIC1 );.
d090: 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 assert( pWinMemD
d0a0: 61 74 61 2d 3e 6d 61 67 69 63 32 3d 3d 57 49 4e ata->magic2==WIN
d0b0: 4d 45 4d 5f 4d 41 47 49 43 32 20 29 3b 0a 0a 20 MEM_MAGIC2 );..
d0c0: 20 69 66 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 if( pWinMemData
d0d0: 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 61 ->hHeap ){. a
d0e0: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 ssert( pWinMemDa
d0f0: 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c ta->hHeap!=INVAL
d100: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 ID_HANDLE_VALUE
d110: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f );.#if !SQLITE_O
d120: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e S_WINRT && defin
d130: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f ed(SQLITE_WIN32_
d140: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 MALLOC_VALIDATE)
d150: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 73 48 . assert( osH
d160: 65 61 70 56 61 6c 69 64 61 74 65 28 70 57 69 6e eapValidate(pWin
d170: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 MemData->hHeap,
d180: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 SQLITE_WIN32_HEA
d190: 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 P_FLAGS, NULL) )
d1a0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 ;.#endif. if(
d1b0: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f pWinMemData->bO
d1c0: 77 6e 65 64 20 29 7b 0a 20 20 20 20 20 20 69 66 wned ){. if
d1d0: 28 20 21 6f 73 48 65 61 70 44 65 73 74 72 6f 79 ( !osHeapDestroy
d1e0: 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 (pWinMemData->hH
d1f0: 65 61 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 eap) ){.
d200: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 sqlite3_log(SQLI
d210: 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 TE_NOMEM, "faile
d220: 64 20 74 6f 20 48 65 61 70 44 65 73 74 72 6f 79 d to HeapDestroy
d230: 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 (%lu), heap=%p"
d240: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
d250: 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 osGetLastE
d260: 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 70 rror(), (void*)p
d270: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 WinMemData->hHea
d280: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 p);. }.
d290: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 pWinMemData->b
d2a0: 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 Owned = FALSE;.
d2b0: 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d }. pWinMem
d2c0: 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 4e 55 Data->hHeap = NU
d2d0: 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a LL;. }.}../*.**
d2e0: 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6c 6f Populate the lo
d2f0: 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61 w-level memory a
d300: 6c 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 llocation functi
d310: 6f 6e 20 70 6f 69 6e 74 65 72 73 20 69 6e 0a 2a on pointers in.*
d320: 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 * sqlite3GlobalC
d330: 6f 6e 66 69 67 2e 6d 20 77 69 74 68 20 70 6f 69 onfig.m with poi
d340: 6e 74 65 72 73 20 74 6f 20 74 68 65 20 72 6f 75 nters to the rou
d350: 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69 tines in this fi
d360: 6c 65 2e 20 54 68 65 0a 2a 2a 20 61 72 67 75 6d le. The.** argum
d370: 65 6e 74 73 20 73 70 65 63 69 66 79 20 74 68 65 ents specify the
d380: 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 block of memory
d390: 20 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a 0a 2a to manage..**.*
d3a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 * This routine i
d3b0: 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 s only called by
d3c0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 sqlite3_config(
d3d0: 29 2c 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 ), and therefore
d3e0: 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71 75 69 .** is not requi
d3f0: 72 65 64 20 74 6f 20 62 65 20 74 68 72 65 61 64 red to be thread
d400: 73 61 66 65 20 28 69 74 20 69 73 20 6e 6f 74 29 safe (it is not)
d410: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 ..*/.const sqlit
d420: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a e3_mem_methods *
d430: 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e sqlite3MemGetWin
d440: 33 32 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 32(void){. stat
d450: 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 ic const sqlite3
d460: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 77 69 6e _mem_methods win
d470: 4d 65 6d 4d 65 74 68 6f 64 73 20 3d 20 7b 0a 20 MemMethods = {.
d480: 20 20 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c winMemMalloc,
d490: 0a 20 20 20 20 77 69 6e 4d 65 6d 46 72 65 65 2c . winMemFree,
d4a0: 0a 20 20 20 20 77 69 6e 4d 65 6d 52 65 61 6c 6c . winMemReall
d4b0: 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 69 oc,. winMemSi
d4c0: 7a 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 6f ze,. winMemRo
d4d0: 75 6e 64 75 70 2c 0a 20 20 20 20 77 69 6e 4d 65 undup,. winMe
d4e0: 6d 49 6e 69 74 2c 0a 20 20 20 20 77 69 6e 4d 65 mInit,. winMe
d4f0: 6d 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20 20 26 mShutdown,. &
d500: 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20 20 7d win_mem_data. }
d510: 3b 0a 20 20 72 65 74 75 72 6e 20 26 77 69 6e 4d ;. return &winM
d520: 65 6d 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a 76 6f emMethods;.}..vo
d530: 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74 id sqlite3MemSet
d540: 44 65 66 61 75 6c 74 28 76 6f 69 64 29 7b 0a 20 Default(void){.
d550: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 sqlite3_config(
d560: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 SQLITE_CONFIG_MA
d570: 4c 4c 4f 43 2c 20 73 71 6c 69 74 65 33 4d 65 6d LLOC, sqlite3Mem
d580: 47 65 74 57 69 6e 33 32 28 29 29 3b 0a 7d 0a 23 GetWin32());.}.#
d590: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f endif /* SQLITE_
d5a0: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a WIN32_MALLOC */.
d5b0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 ./*.** Convert a
d5c0: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74 6f UTF-8 string to
d5d0: 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f Microsoft Unico
d5e0: 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 de..**.** Space
d5f0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 to hold the retu
d600: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f rned string is o
d610: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c btained from sql
d620: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a ite3_malloc()..*
d630: 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52 20 /.static LPWSTR
d640: 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 winUtf8ToUnicode
d650: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 (const char *zTe
d660: 78 74 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 xt){. int nChar
d670: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65 ;. LPWSTR zWide
d680: 54 65 78 74 3b 0a 0a 20 20 6e 43 68 61 72 20 3d Text;.. nChar =
d690: 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 osMultiByteToWi
d6a0: 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 deChar(CP_UTF8,
d6b0: 30 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 4e 55 0, zText, -1, NU
d6c0: 4c 4c 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 43 LL, 0);. if( nC
d6d0: 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 har==0 ){. re
d6e0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 57 turn 0;. }. zW
d6f0: 69 64 65 54 65 78 74 20 3d 20 73 71 6c 69 74 65 ideText = sqlite
d700: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 43 68 3MallocZero( nCh
d710: 61 72 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29 ar*sizeof(WCHAR)
d720: 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 54 );. if( zWideT
d730: 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 ext==0 ){. re
d740: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 turn 0;. }. nC
d750: 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 har = osMultiByt
d760: 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55 eToWideChar(CP_U
d770: 54 46 38 2c 20 30 2c 20 7a 54 65 78 74 2c 20 2d TF8, 0, zText, -
d780: 31 2c 20 7a 57 69 64 65 54 65 78 74 2c 0a 20 20 1, zWideText,.
d790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
d7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 nC
d7b0: 68 61 72 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 har);. if( nCha
d7c0: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 r==0 ){. sqli
d7d0: 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 54 65 te3_free(zWideTe
d7e0: 78 74 29 3b 0a 20 20 20 20 7a 57 69 64 65 54 65 xt);. zWideTe
d7f0: 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 xt = 0;. }. re
d800: 74 75 72 6e 20 7a 57 69 64 65 54 65 78 74 3b 0a turn zWideText;.
d810: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 }../*.** Convert
d820: 20 61 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 a Microsoft Uni
d830: 63 6f 64 65 20 73 74 72 69 6e 67 20 74 6f 20 55 code string to U
d840: 54 46 2d 38 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 TF-8..**.** Spac
d850: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 e to hold the re
d860: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 turned string is
d870: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 obtained from s
d880: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e qlite3_malloc().
d890: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 .*/.static char
d8a0: 2a 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 *winUnicodeToUtf
d8b0: 38 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65 54 8(LPCWSTR zWideT
d8c0: 65 78 74 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 ext){. int nByt
d8d0: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 65 78 74 e;. char *zText
d8e0: 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 ;.. nByte = osW
d8f0: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 ideCharToMultiBy
d900: 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a te(CP_UTF8, 0, z
d910: 57 69 64 65 54 65 78 74 2c 20 2d 31 2c 20 30 2c WideText, -1, 0,
d920: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 0, 0, 0);. if(
d930: 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 nByte == 0 ){.
d940: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d return 0;. }
d950: 0a 20 20 7a 54 65 78 74 20 3d 20 73 71 6c 69 74 . zText = sqlit
d960: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 e3MallocZero( nB
d970: 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 54 65 yte );. if( zTe
d980: 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 xt==0 ){. ret
d990: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 urn 0;. }. nBy
d9a0: 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 te = osWideCharT
d9b0: 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54 oMultiByte(CP_UT
d9c0: 46 38 2c 20 30 2c 20 7a 57 69 64 65 54 65 78 74 F8, 0, zWideText
d9d0: 2c 20 2d 31 2c 20 7a 54 65 78 74 2c 20 6e 42 79 , -1, zText, nBy
d9e0: 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 te,.
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
da00: 20 20 20 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 0, 0);. if(
da10: 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 nByte == 0 ){.
da20: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 sqlite3_free(
da30: 7a 54 65 78 74 29 3b 0a 20 20 20 20 7a 54 65 78 zText);. zTex
da40: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 t = 0;. }. ret
da50: 75 72 6e 20 7a 54 65 78 74 3b 0a 7d 0a 0a 2f 2a urn zText;.}../*
da60: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 41 .** Convert an A
da70: 4e 53 49 20 73 74 72 69 6e 67 20 74 6f 20 4d 69 NSI string to Mi
da80: 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 2c crosoft Unicode,
da90: 20 75 73 69 6e 67 20 74 68 65 20 41 4e 53 49 20 using the ANSI
daa0: 6f 72 20 4f 45 4d 0a 2a 2a 20 63 6f 64 65 20 70 or OEM.** code p
dab0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 age..**.** Space
dac0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 to hold the ret
dad0: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 urned string is
dae0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 obtained from sq
daf0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a lite3_malloc()..
db00: 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52 */.static LPWSTR
db10: 20 77 69 6e 4d 62 63 73 54 6f 55 6e 69 63 6f 64 winMbcsToUnicod
db20: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 e(const char *zT
db30: 65 78 74 2c 20 69 6e 74 20 75 73 65 41 6e 73 69 ext, int useAnsi
db40: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a ){. int nByte;.
db50: 20 20 4c 50 57 53 54 52 20 7a 4d 62 63 73 54 65 LPWSTR zMbcsTe
db60: 78 74 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 xt;. int codepa
db70: 67 65 20 3d 20 75 73 65 41 6e 73 69 20 3f 20 43 ge = useAnsi ? C
db80: 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 P_ACP : CP_OEMCP
db90: 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d ;.. nByte = osM
dba0: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 ultiByteToWideCh
dbb0: 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 ar(codepage, 0,
dbc0: 7a 54 65 78 74 2c 20 2d 31 2c 20 4e 55 4c 4c 2c zText, -1, NULL,
dbd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
dbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
dbf0: 20 30 29 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 0)*sizeof(WCHAR
dc00: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d );. if( nByte==
dc10: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 0 ){. return
dc20: 30 3b 0a 20 20 7d 0a 20 20 7a 4d 62 63 73 54 65 0;. }. zMbcsTe
dc30: 78 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c xt = sqlite3Mall
dc40: 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 ocZero( nByte*si
dc50: 7a 65 6f 66 28 57 43 48 41 52 29 20 29 3b 0a 20 zeof(WCHAR) );.
dc60: 20 69 66 28 20 7a 4d 62 63 73 54 65 78 74 3d 3d if( zMbcsText==
dc70: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 0 ){. return
dc80: 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 0;. }. nByte =
dc90: 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 osMultiByteToWi
dca0: 64 65 43 68 61 72 28 63 6f 64 65 70 61 67 65 2c deChar(codepage,
dcb0: 20 30 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 7a 0, zText, -1, z
dcc0: 4d 62 63 73 54 65 78 74 2c 0a 20 20 20 20 20 20 MbcsText,.
dcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
dce0: 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 29 nByte)
dcf0: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 ;. if( nByte==0
dd00: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f ){. sqlite3_
dd10: 66 72 65 65 28 7a 4d 62 63 73 54 65 78 74 29 3b free(zMbcsText);
dd20: 0a 20 20 20 20 7a 4d 62 63 73 54 65 78 74 20 3d . zMbcsText =
dd30: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 0;. }. return
dd40: 20 7a 4d 62 63 73 54 65 78 74 3b 0a 7d 0a 0a 2f zMbcsText;.}../
dd50: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 4d *.** Convert a M
dd60: 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 icrosoft Unicode
dd70: 20 73 74 72 69 6e 67 20 74 6f 20 61 20 6d 75 6c string to a mul
dd80: 74 69 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 ti-byte characte
dd90: 72 20 73 74 72 69 6e 67 2c 0a 2a 2a 20 75 73 69 r string,.** usi
dda0: 6e 67 20 74 68 65 20 41 4e 53 49 20 6f 72 20 4f ng the ANSI or O
ddb0: 45 4d 20 63 6f 64 65 20 70 61 67 65 2e 0a 2a 2a EM code page..**
ddc0: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c .** Space to hol
ddd0: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 d the returned s
dde0: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 tring is obtaine
ddf0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d d from sqlite3_m
de00: 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 alloc()..*/.stat
de10: 69 63 20 63 68 61 72 20 2a 77 69 6e 55 6e 69 63 ic char *winUnic
de20: 6f 64 65 54 6f 4d 62 63 73 28 4c 50 43 57 53 54 odeToMbcs(LPCWST
de30: 52 20 7a 57 69 64 65 54 65 78 74 2c 20 69 6e 74 R zWideText, int
de40: 20 75 73 65 41 6e 73 69 29 7b 0a 20 20 69 6e 74 useAnsi){. int
de50: 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a nByte;. char *
de60: 7a 54 65 78 74 3b 0a 20 20 69 6e 74 20 63 6f 64 zText;. int cod
de70: 65 70 61 67 65 20 3d 20 75 73 65 41 6e 73 69 20 epage = useAnsi
de80: 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 ? CP_ACP : CP_OE
de90: 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 MCP;.. nByte =
dea0: 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 osWideCharToMult
deb0: 69 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20 iByte(codepage,
dec0: 30 2c 20 7a 57 69 64 65 54 65 78 74 2c 20 2d 31 0, zWideText, -1
ded0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 , 0, 0, 0, 0);.
dee0: 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 if( nByte == 0
def0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b ){. return 0;
df00: 0a 20 20 7d 0a 20 20 7a 54 65 78 74 20 3d 20 73 . }. zText = s
df10: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f qlite3MallocZero
df20: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 ( nByte );. if(
df30: 20 7a 54 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 zText==0 ){.
df40: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 return 0;. }.
df50: 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43 nByte = osWideC
df60: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 harToMultiByte(c
df70: 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 odepage, 0, zWid
df80: 65 54 65 78 74 2c 20 2d 31 2c 20 7a 54 65 78 74 eText, -1, zText
df90: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
dfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
dfb0: 20 20 6e 42 79 74 65 2c 20 30 2c 20 30 29 3b 0a nByte, 0, 0);.
dfc0: 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 if( nByte == 0
dfd0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f ){. sqlite3_
dfe0: 66 72 65 65 28 7a 54 65 78 74 29 3b 0a 20 20 20 free(zText);.
dff0: 20 7a 54 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a zText = 0;. }.
e000: 20 20 72 65 74 75 72 6e 20 7a 54 65 78 74 3b 0a return zText;.
e010: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 }../*.** Convert
e020: 20 61 20 6d 75 6c 74 69 2d 62 79 74 65 20 63 68 a multi-byte ch
e030: 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 20 74 aracter string t
e040: 6f 20 55 54 46 2d 38 2e 0a 2a 2a 0a 2a 2a 20 53 o UTF-8..**.** S
e050: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 pace to hold the
e060: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 returned string
e070: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f is obtained fro
e080: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 m sqlite3_malloc
e090: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 ()..*/.static ch
e0a0: 61 72 20 2a 77 69 6e 4d 62 63 73 54 6f 55 74 66 ar *winMbcsToUtf
e0b0: 38 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 8(const char *zT
e0c0: 65 78 74 2c 20 69 6e 74 20 75 73 65 41 6e 73 69 ext, int useAnsi
e0d0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 65 78 74 ){. char *zText
e0e0: 55 74 66 38 3b 0a 20 20 4c 50 57 53 54 52 20 7a Utf8;. LPWSTR z
e0f0: 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 TmpWide;.. zTmp
e100: 57 69 64 65 20 3d 20 77 69 6e 4d 62 63 73 54 6f Wide = winMbcsTo
e110: 55 6e 69 63 6f 64 65 28 7a 54 65 78 74 2c 20 75 Unicode(zText, u
e120: 73 65 41 6e 73 69 29 3b 0a 20 20 69 66 28 20 7a seAnsi);. if( z
e130: 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 TmpWide==0 ){.
e140: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a return 0;. }.
e150: 20 20 7a 54 65 78 74 55 74 66 38 20 3d 20 77 69 zTextUtf8 = wi
e160: 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a nUnicodeToUtf8(z
e170: 54 6d 70 57 69 64 65 29 3b 0a 20 20 73 71 6c 69 TmpWide);. sqli
e180: 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57 69 64 te3_free(zTmpWid
e190: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54 65 e);. return zTe
e1a0: 78 74 55 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a xtUtf8;.}../*.**
e1b0: 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38 Convert a UTF-8
e1c0: 20 73 74 72 69 6e 67 20 74 6f 20 61 20 6d 75 6c string to a mul
e1d0: 74 69 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 ti-byte characte
e1e0: 72 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 r string..**.**
e1f0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 Space to hold th
e200: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e e returned strin
e210: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 g is obtained fr
e220: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f om sqlite3_mallo
e230: 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 c()..*/.static c
e240: 68 61 72 20 2a 77 69 6e 55 74 66 38 54 6f 4d 62 har *winUtf8ToMb
e250: 63 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a cs(const char *z
e260: 54 65 78 74 2c 20 69 6e 74 20 75 73 65 41 6e 73 Text, int useAns
e270: 69 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 65 78 i){. char *zTex
e280: 74 4d 62 63 73 3b 0a 20 20 4c 50 57 53 54 52 20 tMbcs;. LPWSTR
e290: 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d zTmpWide;.. zTm
e2a0: 70 57 69 64 65 20 3d 20 77 69 6e 55 74 66 38 54 pWide = winUtf8T
e2b0: 6f 55 6e 69 63 6f 64 65 28 7a 54 65 78 74 29 3b oUnicode(zText);
e2c0: 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d . if( zTmpWide=
e2d0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e =0 ){. return
e2e0: 20 30 3b 0a 20 20 7d 0a 20 20 7a 54 65 78 74 4d 0;. }. zTextM
e2f0: 62 63 73 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 bcs = winUnicode
e300: 54 6f 4d 62 63 73 28 7a 54 6d 70 57 69 64 65 2c ToMbcs(zTmpWide,
e310: 20 75 73 65 41 6e 73 69 29 3b 0a 20 20 73 71 6c useAnsi);. sql
e320: 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57 69 ite3_free(zTmpWi
e330: 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54 de);. return zT
e340: 65 78 74 4d 62 63 73 3b 0a 7d 0a 0a 2f 2a 0a 2a extMbcs;.}../*.*
e350: 2a 20 54 68 69 73 20 69 73 20 61 20 70 75 62 6c * This is a publ
e360: 69 63 20 77 72 61 70 70 65 72 20 66 6f 72 20 74 ic wrapper for t
e370: 68 65 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 he winUtf8ToUnic
e380: 6f 64 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a ode() function..
e390: 2a 2f 0a 4c 50 57 53 54 52 20 73 71 6c 69 74 65 */.LPWSTR sqlite
e3a0: 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 3_win32_utf8_to_
e3b0: 75 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 unicode(const ch
e3c0: 61 72 20 2a 7a 54 65 78 74 29 7b 0a 23 69 66 64 ar *zText){.#ifd
e3d0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 ef SQLITE_ENABLE
e3e0: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 _API_ARMOR. if(
e3f0: 20 21 7a 54 65 78 74 20 29 7b 0a 20 20 20 20 28 !zText ){. (
e400: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 void)SQLITE_MISU
e410: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 SE_BKPT;. ret
e420: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 urn 0;. }.#endi
e430: 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 f.#ifndef SQLITE
e440: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 _OMIT_AUTOINIT.
e450: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69 6e 69 if( sqlite3_ini
e460: 74 69 61 6c 69 7a 65 28 29 20 29 20 72 65 74 75 tialize() ) retu
e470: 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 rn 0;.#endif. r
e480: 65 74 75 72 6e 20 77 69 6e 55 74 66 38 54 6f 55 eturn winUtf8ToU
e490: 6e 69 63 6f 64 65 28 7a 54 65 78 74 29 3b 0a 7d nicode(zText);.}
e4a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 ../*.** This is
e4b0: 61 20 70 75 62 6c 69 63 20 77 72 61 70 70 65 72 a public wrapper
e4c0: 20 66 6f 72 20 74 68 65 20 77 69 6e 55 6e 69 63 for the winUnic
e4d0: 6f 64 65 54 6f 55 74 66 38 28 29 20 66 75 6e 63 odeToUtf8() func
e4e0: 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 tion..*/.char *s
e4f0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 6e 69 qlite3_win32_uni
e500: 63 6f 64 65 5f 74 6f 5f 75 74 66 38 28 4c 50 43 code_to_utf8(LPC
e510: 57 53 54 52 20 7a 57 69 64 65 54 65 78 74 29 7b WSTR zWideText){
e520: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 .#ifdef SQLITE_E
e530: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a NABLE_API_ARMOR.
e540: 20 20 69 66 28 20 21 7a 57 69 64 65 54 65 78 74 if( !zWideText
e550: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 ){. (void)SQ
e560: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 LITE_MISUSE_BKPT
e570: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a ;. return 0;.
e580: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 }.#endif.#ifnd
e590: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 ef SQLITE_OMIT_A
e5a0: 55 54 4f 49 4e 49 54 0a 20 20 69 66 28 20 73 71 UTOINIT. if( sq
e5b0: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 lite3_initialize
e5c0: 28 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 () ) return 0;.#
e5d0: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 77 endif. return w
e5e0: 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 inUnicodeToUtf8(
e5f0: 7a 57 69 64 65 54 65 78 74 29 3b 0a 7d 0a 0a 2f zWideText);.}../
e600: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 70 *.** This is a p
e610: 75 62 6c 69 63 20 77 72 61 70 70 65 72 20 66 6f ublic wrapper fo
e620: 72 20 74 68 65 20 77 69 6e 4d 62 63 73 54 6f 55 r the winMbcsToU
e630: 74 66 38 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a tf8() function..
e640: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 */.char *sqlite3
e650: 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 _win32_mbcs_to_u
e660: 74 66 38 28 63 6f 6e 73 74 20 63 68 61 72 20 2a tf8(const char *
e670: 7a 54 65 78 74 29 7b 0a 23 69 66 64 65 66 20 53 zText){.#ifdef S
e680: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 QLITE_ENABLE_API
e690: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 7a 54 _ARMOR. if( !zT
e6a0: 65 78 74 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 ext ){. (void
e6b0: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 )SQLITE_MISUSE_B
e6c0: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 KPT;. return
e6d0: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 0;. }.#endif.#i
e6e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 fndef SQLITE_OMI
e6f0: 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69 66 28 T_AUTOINIT. if(
e700: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c sqlite3_initial
e710: 69 7a 65 28 29 20 29 20 72 65 74 75 72 6e 20 30 ize() ) return 0
e720: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 ;.#endif. retur
e730: 6e 20 77 69 6e 4d 62 63 73 54 6f 55 74 66 38 28 n winMbcsToUtf8(
e740: 7a 54 65 78 74 2c 20 6f 73 41 72 65 46 69 6c 65 zText, osAreFile
e750: 41 70 69 73 41 4e 53 49 28 29 29 3b 0a 7d 0a 0a ApisANSI());.}..
e760: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 /*.** This is a
e770: 70 75 62 6c 69 63 20 77 72 61 70 70 65 72 20 66 public wrapper f
e780: 6f 72 20 74 68 65 20 77 69 6e 4d 62 63 73 54 6f or the winMbcsTo
e790: 55 74 66 38 28 29 20 66 75 6e 63 74 69 6f 6e 2e Utf8() function.
e7a0: 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 .*/.char *sqlite
e7b0: 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 3_win32_mbcs_to_
e7c0: 75 74 66 38 5f 76 32 28 63 6f 6e 73 74 20 63 68 utf8_v2(const ch
e7d0: 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20 75 ar *zText, int u
e7e0: 73 65 41 6e 73 69 29 7b 0a 23 69 66 64 65 66 20 seAnsi){.#ifdef
e7f0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 SQLITE_ENABLE_AP
e800: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 7a I_ARMOR. if( !z
e810: 54 65 78 74 20 29 7b 0a 20 20 20 20 28 76 6f 69 Text ){. (voi
e820: 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f d)SQLITE_MISUSE_
e830: 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e BKPT;. return
e840: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 0;. }.#endif.#
e850: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d ifndef SQLITE_OM
e860: 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69 66 IT_AUTOINIT. if
e870: 28 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 ( sqlite3_initia
e880: 6c 69 7a 65 28 29 20 29 20 72 65 74 75 72 6e 20 lize() ) return
e890: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 0;.#endif. retu
e8a0: 72 6e 20 77 69 6e 4d 62 63 73 54 6f 55 74 66 38 rn winMbcsToUtf8
e8b0: 28 7a 54 65 78 74 2c 20 75 73 65 41 6e 73 69 29 (zText, useAnsi)
e8c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 ;.}../*.** This
e8d0: 69 73 20 61 20 70 75 62 6c 69 63 20 77 72 61 70 is a public wrap
e8e0: 70 65 72 20 66 6f 72 20 74 68 65 20 77 69 6e 55 per for the winU
e8f0: 74 66 38 54 6f 4d 62 63 73 28 29 20 66 75 6e 63 tf8ToMbcs() func
e900: 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 tion..*/.char *s
e910: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 qlite3_win32_utf
e920: 38 5f 74 6f 5f 6d 62 63 73 28 63 6f 6e 73 74 20 8_to_mbcs(const
e930: 63 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a 23 69 char *zText){.#i
e940: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 fdef SQLITE_ENAB
e950: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 LE_API_ARMOR. i
e960: 66 28 20 21 7a 54 65 78 74 20 29 7b 0a 20 20 20 f( !zText ){.
e970: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 (void)SQLITE_MI
e980: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 SUSE_BKPT;. r
e990: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e eturn 0;. }.#en
e9a0: 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 dif.#ifndef SQLI
e9b0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 TE_OMIT_AUTOINIT
e9c0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69 . if( sqlite3_i
e9d0: 6e 69 74 69 61 6c 69 7a 65 28 29 20 29 20 72 65 nitialize() ) re
e9e0: 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 turn 0;.#endif.
e9f0: 20 72 65 74 75 72 6e 20 77 69 6e 55 74 66 38 54 return winUtf8T
ea00: 6f 4d 62 63 73 28 7a 54 65 78 74 2c 20 6f 73 41 oMbcs(zText, osA
ea10: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 reFileApisANSI()
ea20: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 );.}../*.** This
ea30: 20 69 73 20 61 20 70 75 62 6c 69 63 20 77 72 61 is a public wra
ea40: 70 70 65 72 20 66 6f 72 20 74 68 65 20 77 69 6e pper for the win
ea50: 55 74 66 38 54 6f 4d 62 63 73 28 29 20 66 75 6e Utf8ToMbcs() fun
ea60: 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a ction..*/.char *
ea70: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 sqlite3_win32_ut
ea80: 66 38 5f 74 6f 5f 6d 62 63 73 5f 76 32 28 63 6f f8_to_mbcs_v2(co
ea90: 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 2c nst char *zText,
eaa0: 20 69 6e 74 20 75 73 65 41 6e 73 69 29 7b 0a 23 int useAnsi){.#
eab0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 ifdef SQLITE_ENA
eac0: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 BLE_API_ARMOR.
ead0: 69 66 28 20 21 7a 54 65 78 74 20 29 7b 0a 20 20 if( !zText ){.
eae0: 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d (void)SQLITE_M
eaf0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 ISUSE_BKPT;.
eb00: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 return 0;. }.#e
eb10: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c ndif.#ifndef SQL
eb20: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 ITE_OMIT_AUTOINI
eb30: 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f T. if( sqlite3_
eb40: 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 29 20 72 initialize() ) r
eb50: 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a eturn 0;.#endif.
eb60: 20 20 72 65 74 75 72 6e 20 77 69 6e 55 74 66 38 return winUtf8
eb70: 54 6f 4d 62 63 73 28 7a 54 65 78 74 2c 20 75 73 ToMbcs(zText, us
eb80: 65 41 6e 73 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a eAnsi);.}../*.**
eb90: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 This function s
eba0: 65 74 73 20 74 68 65 20 64 61 74 61 20 64 69 72 ets the data dir
ebb0: 65 63 74 6f 72 79 20 6f 72 20 74 68 65 20 74 65 ectory or the te
ebc0: 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 mporary director
ebd0: 79 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 y based on.** th
ebe0: 65 20 70 72 6f 76 69 64 65 64 20 61 72 67 75 6d e provided argum
ebf0: 65 6e 74 73 2e 20 20 54 68 65 20 74 79 70 65 20 ents. The type
ec00: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 argument must be
ec10: 20 31 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 1 in order to s
ec20: 65 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 20 64 et the.** data d
ec30: 69 72 65 63 74 6f 72 79 20 6f 72 20 32 20 69 6e irectory or 2 in
ec40: 20 6f 72 64 65 72 20 74 6f 20 73 65 74 20 74 68 order to set th
ec50: 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 e temporary dire
ec60: 63 74 6f 72 79 2e 20 20 54 68 65 20 7a 56 61 6c ctory. The zVal
ec70: 75 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 ue.** argument i
ec80: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 s the name of th
ec90: 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 75 e directory to u
eca0: 73 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 se. The return
ecb0: 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 0a 2a 2a value will be.**
ecc0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 SQLITE_OK if su
ecd0: 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 69 6e 74 ccessful..*/.int
ece0: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 sqlite3_win32_s
ecf0: 65 74 5f 64 69 72 65 63 74 6f 72 79 28 44 57 4f et_directory(DWO
ed00: 52 44 20 74 79 70 65 2c 20 4c 50 43 57 53 54 52 RD type, LPCWSTR
ed10: 20 7a 56 61 6c 75 65 29 7b 0a 20 20 63 68 61 72 zValue){. char
ed20: 20 2a 2a 70 70 44 69 72 65 63 74 6f 72 79 20 3d **ppDirectory =
ed30: 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 0;.#ifndef SQLI
ed40: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 TE_OMIT_AUTOINIT
ed50: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 . int rc = sqli
ed60: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 te3_initialize()
ed70: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 ;. if( rc ) ret
ed80: 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20 urn rc;.#endif.
ed90: 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c 49 54 if( type==SQLIT
eda0: 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52 E_WIN32_DATA_DIR
edb0: 45 43 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a 20 ECTORY_TYPE ){.
edc0: 20 20 20 70 70 44 69 72 65 63 74 6f 72 79 20 3d ppDirectory =
edd0: 20 26 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 &sqlite3_data_d
ede0: 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d 65 6c 73 irectory;. }els
edf0: 65 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c 49 e if( type==SQLI
ee00: 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 TE_WIN32_TEMP_DI
ee10: 52 45 43 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a RECTORY_TYPE ){.
ee20: 20 20 20 20 70 70 44 69 72 65 63 74 6f 72 79 20 ppDirectory
ee30: 3d 20 26 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f = &sqlite3_temp_
ee40: 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d 0a 20 directory;. }.
ee50: 20 61 73 73 65 72 74 28 20 21 70 70 44 69 72 65 assert( !ppDire
ee60: 63 74 6f 72 79 20 7c 7c 20 74 79 70 65 3d 3d 53 ctory || type==S
ee70: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 QLITE_WIN32_DATA
ee80: 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a _DIRECTORY_TYPE.
ee90: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 79 70 || typ
eea0: 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f e==SQLITE_WIN32_
eeb0: 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 TEMP_DIRECTORY_T
eec0: 59 50 45 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 YPE. );. asser
eed0: 74 28 20 21 70 70 44 69 72 65 63 74 6f 72 79 20 t( !ppDirectory
eee0: 7c 7c 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 || sqlite3Memdeb
eef0: 75 67 48 61 73 54 79 70 65 28 2a 70 70 44 69 72 ugHasType(*ppDir
ef00: 65 63 74 6f 72 79 2c 20 4d 45 4d 54 59 50 45 5f ectory, MEMTYPE_
ef10: 48 45 41 50 29 20 29 3b 0a 20 20 69 66 28 20 70 HEAP) );. if( p
ef20: 70 44 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 pDirectory ){.
ef30: 20 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 55 74 char *zValueUt
ef40: 66 38 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 f8 = 0;. if(
ef50: 7a 56 61 6c 75 65 20 26 26 20 7a 56 61 6c 75 65 zValue && zValue
ef60: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 56 61 [0] ){. zVa
ef70: 6c 75 65 55 74 66 38 20 3d 20 77 69 6e 55 6e 69 lueUtf8 = winUni
ef80: 63 6f 64 65 54 6f 55 74 66 38 28 7a 56 61 6c 75 codeToUtf8(zValu
ef90: 65 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 7a e);. if ( z
efa0: 56 61 6c 75 65 55 74 66 38 3d 3d 30 20 29 7b 0a ValueUtf8==0 ){.
efb0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 return S
efc0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 QLITE_NOMEM_BKPT
efd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a ;. }. }.
efe0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 sqlite3_free
eff0: 28 2a 70 70 44 69 72 65 63 74 6f 72 79 29 3b 0a (*ppDirectory);.
f000: 20 20 20 20 2a 70 70 44 69 72 65 63 74 6f 72 79 *ppDirectory
f010: 20 3d 20 7a 56 61 6c 75 65 55 74 66 38 3b 0a 20 = zValueUtf8;.
f020: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 return SQLITE
f030: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 _OK;. }. retur
f040: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a n SQLITE_ERROR;.
f050: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 65 74 }../*.** The ret
f060: 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 77 69 6e urn value of win
f070: 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 0a GetLastErrorMsg.
f080: 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 ** is zero if th
f090: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 e error message
f0a0: 66 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 fits in the buff
f0b0: 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a er, or non-zero.
f0c0: 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 ** otherwise (if
f0d0: 20 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 the message was
f0e0: 20 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a truncated)..*/.
f0f0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 static int winGe
f100: 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 44 57 tLastErrorMsg(DW
f110: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 69 ORD lastErrno, i
f120: 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a nt nBuf, char *z
f130: 42 75 66 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61 Buf){. /* Forma
f140: 74 4d 65 73 73 61 67 65 20 72 65 74 75 72 6e 73 tMessage returns
f150: 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20 0 on failure.
f160: 4f 74 68 65 72 77 69 73 65 20 69 74 0a 20 20 2a Otherwise it. *
f170: 2a 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 * returns the nu
f180: 6d 62 65 72 20 6f 66 20 54 43 48 41 52 73 20 77 mber of TCHARs w
f190: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6f 75 ritten to the ou
f1a0: 74 70 75 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 tput. ** buffer
f1b0: 2c 20 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20 , excluding the
f1c0: 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 6c terminating null
f1d0: 20 63 68 61 72 2e 0a 20 20 2a 2f 0a 20 20 44 57 char.. */. DW
f1e0: 4f 52 44 20 64 77 4c 65 6e 20 3d 20 30 3b 0a 20 ORD dwLen = 0;.
f1f0: 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 30 3b char *zOut = 0;
f200: 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 .. if( osIsNT()
f210: 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f ){.#if SQLITE_O
f220: 53 5f 57 49 4e 52 54 0a 20 20 20 20 57 43 48 41 S_WINRT. WCHA
f230: 52 20 7a 54 65 6d 70 57 69 64 65 5b 53 51 4c 49 R zTempWide[SQLI
f240: 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52 TE_WIN32_MAX_ERR
f250: 4d 53 47 5f 43 48 41 52 53 2b 31 5d 3b 0a 20 20 MSG_CHARS+1];.
f260: 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d dwLen = osForm
f270: 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52 4d 41 atMessageW(FORMA
f280: 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 T_MESSAGE_FROM_S
f290: 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 YSTEM |.
f2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f2b0: 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 FORMAT_MESS
f2c0: 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 AGE_IGNORE_INSER
f2d0: 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 TS,.
f2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f2f0: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 NULL,.
f300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f310: 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 lastErrno,.
f320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f330: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 0,.
f340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f350: 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d zTem
f360: 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 pWide,.
f370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f380: 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 SQLITE_WIN32
f390: 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41 52 _MAX_ERRMSG_CHAR
f3a0: 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 S,.
f3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f3c0: 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 4c 50 0);.#else. LP
f3d0: 57 53 54 52 20 7a 54 65 6d 70 57 69 64 65 20 3d WSTR zTempWide =
f3e0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e NULL;. dwLen
f3f0: 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 = osFormatMessa
f400: 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 geW(FORMAT_MESSA
f410: 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46 GE_ALLOCATE_BUFF
f420: 45 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 ER |.
f430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f440: 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 FORMAT_MESSAGE
f450: 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 _FROM_SYSTEM |.
f460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f470: 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d FORM
f480: 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 AT_MESSAGE_IGNOR
f490: 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 E_INSERTS,.
f4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f4b0: 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 NULL,.
f4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f4d0: 20 20 20 20 20 20 20 20 20 20 20 6c 61 73 74 45 lastE
f4e0: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 rrno,.
f4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f500: 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 0,.
f510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f520: 20 20 20 28 4c 50 57 53 54 52 29 20 26 7a 54 65 (LPWSTR) &zTe
f530: 6d 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20 mpWide,.
f540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f550: 20 20 20 20 20 30 2c 0a 20 20 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 30 29 3b 0a 23 65 6e 64 69 66 0a 0);.#endif.
f580: 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 if( dwLen >
f590: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 0 ){. /* al
f5a0: 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20 locate a buffer
f5b0: 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 and convert to U
f5c0: 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c TF8 */. sql
f5d0: 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d ite3BeginBenignM
f5e0: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a alloc();. z
f5f0: 4f 75 74 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 Out = winUnicode
f600: 54 6f 55 74 66 38 28 7a 54 65 6d 70 57 69 64 65 ToUtf8(zTempWide
f610: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 );. sqlite3
f620: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 EndBenignMalloc(
f630: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f );.#if !SQLITE_O
f640: 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 2f 2a S_WINRT. /*
f650: 20 66 72 65 65 20 74 68 65 20 73 79 73 74 65 6d free the system
f660: 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 buffer allocate
f670: 64 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 d by FormatMessa
f680: 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f ge */. osLo
f690: 63 61 6c 46 72 65 65 28 7a 54 65 6d 70 57 69 64 calFree(zTempWid
f6a0: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d e);.#endif. }
f6b0: 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 . }.#ifdef SQLI
f6c0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 TE_WIN32_HAS_ANS
f6d0: 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 I. else{. ch
f6e0: 61 72 20 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c ar *zTemp = NULL
f6f0: 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 ;. dwLen = os
f700: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 28 46 FormatMessageA(F
f710: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c ORMAT_MESSAGE_AL
f720: 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a LOCATE_BUFFER |.
f730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f740: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 FOR
f750: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d MAT_MESSAGE_FROM
f760: 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 _SYSTEM |.
f770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f780: 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 FORMAT_ME
f790: 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 SSAGE_IGNORE_INS
f7a0: 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 ERTS,.
f7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f7c0: 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 NULL,.
f7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f7e0: 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c lastErrno,
f7f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
f800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0,
f810: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
f820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 4c (L
f830: 50 53 54 52 29 20 26 7a 54 65 6d 70 2c 0a 20 20 PSTR) &zTemp,.
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f850: 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 0,.
f860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f870: 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20 0);.
f880: 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 if( dwLen > 0
f890: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c ){. /* all
f8a0: 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20 61 ocate a buffer a
f8b0: 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 nd convert to UT
f8c0: 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 F8 */. sqli
f8d0: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 te3BeginBenignMa
f8e0: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f lloc();. zO
f8f0: 75 74 20 3d 20 77 69 6e 4d 62 63 73 54 6f 55 74 ut = winMbcsToUt
f900: 66 38 28 7a 54 65 6d 70 2c 20 6f 73 41 72 65 46 f8(zTemp, osAreF
f910: 69 6c 65 41 70 69 73 41 4e 53 49 28 29 29 3b 0a ileApisANSI());.
f920: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 sqlite3End
f930: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a BenignMalloc();.
f940: 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 /* free th
f950: 65 20 73 79 73 74 65 6d 20 62 75 66 66 65 72 20 e system buffer
f960: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f 72 allocated by For
f970: 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20 matMessage */.
f980: 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28 osLocalFree(
f990: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 zTemp);. }.
f9a0: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 30 }.#endif. if( 0
f9b0: 20 3d 3d 20 64 77 4c 65 6e 20 29 7b 0a 20 20 20 == dwLen ){.
f9c0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 sqlite3_snprint
f9d0: 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 4f f(nBuf, zBuf, "O
f9e0: 73 45 72 72 6f 72 20 30 78 25 6c 78 20 28 25 6c sError 0x%lx (%l
f9f0: 75 29 22 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 u)", lastErrno,
fa00: 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 20 20 7d 65 lastErrno);. }e
fa10: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 63 6f 70 79 lse{. /* copy
fa20: 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6e 42 a maximum of nB
fa30: 75 66 20 63 68 61 72 73 20 74 6f 20 6f 75 74 70 uf chars to outp
fa40: 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 ut buffer */.
fa50: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 sqlite3_snprint
fa60: 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 25 f(nBuf, zBuf, "%
fa70: 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 2f s", zOut);. /
fa80: 2a 20 66 72 65 65 20 74 68 65 20 55 54 46 38 20 * free the UTF8
fa90: 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 73 71 buffer */. sq
faa0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 lite3_free(zOut)
fab0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 ;. }. return 0
fac0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 ;.}../*.**.** Th
fad0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20 77 69 is function - wi
fae0: 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 nLogErrorAtLine(
faf0: 29 20 2d 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 ) - is only ever
fb00: 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20 called via the
fb10: 6d 61 63 72 6f 0a 2a 2a 20 77 69 6e 4c 6f 67 45 macro.** winLogE
fb20: 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 rror()..**.** Th
fb30: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e is routine is in
fb40: 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e 20 65 voked after an e
fb50: 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 61 rror occurs in a
fb60: 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a n OS function..*
fb70: 2a 20 49 74 20 6c 6f 67 73 20 61 20 6d 65 73 73 * It logs a mess
fb80: 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 age using sqlite
fb90: 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69 3_log() containi
fba0: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 ng the current v
fbb0: 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 alue of.** error
fbc0: 20 63 6f 64 65 20 61 6e 64 2c 20 69 66 20 70 6f code and, if po
fbd0: 73 73 69 62 6c 65 2c 20 74 68 65 20 68 75 6d 61 ssible, the huma
fbe0: 6e 2d 72 65 61 64 61 62 6c 65 20 65 71 75 69 76 n-readable equiv
fbf0: 61 6c 65 6e 74 20 66 72 6f 6d 0a 2a 2a 20 46 6f alent from.** Fo
fc00: 72 6d 61 74 4d 65 73 73 61 67 65 2e 0a 2a 2a 0a rmatMessage..**.
fc10: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 ** The first arg
fc20: 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 ument passed to
fc30: 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 the macro should
fc40: 20 62 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f be the error co
fc50: 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 de that.** will
fc60: 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53 be returned to S
fc70: 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c 49 QLite (e.g. SQLI
fc80: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c TE_IOERR_DELETE,
fc90: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e SQLITE_CANTOPEN
fca0: 29 2e 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73 75 )..** The two su
fcb0: 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e bsequent argumen
fcc0: 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 ts should be the
fcd0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f 53 20 name of the OS
fce0: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a function that.**
fcf0: 20 66 61 69 6c 65 64 20 61 6e 64 20 74 68 65 20 failed and the
fd00: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d associated file-
fd10: 73 79 73 74 65 6d 20 70 61 74 68 2c 20 69 66 20 system path, if
fd20: 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 any..*/.#define
fd30: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c winLogError(a,b,
fd40: 63 2c 64 29 20 20 20 77 69 6e 4c 6f 67 45 72 72 c,d) winLogErr
fd50: 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 64 orAtLine(a,b,c,d
fd60: 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69 ,__LINE__).stati
fd70: 63 20 69 6e 74 20 77 69 6e 4c 6f 67 45 72 72 6f c int winLogErro
fd80: 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65 rAtLine(. int e
fd90: 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20 rrcode,
fda0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 /* SQ
fdb0: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 Lite error code
fdc0: 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 */. DWORD lastE
fdd0: 72 72 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 rrno,
fde0: 20 20 20 20 20 2f 2a 20 57 69 6e 33 32 20 6c 61 /* Win32 la
fdf0: 73 74 20 65 72 72 6f 72 20 2a 2f 0a 20 20 63 6f st error */. co
fe00: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c nst char *zFunc,
fe10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
fe20: 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63 Name of OS func
fe30: 74 69 6f 6e 20 74 68 61 74 20 66 61 69 6c 65 64 tion that failed
fe40: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 */. const char
fe50: 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 *zPath,
fe60: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 70 61 /* File pa
fe70: 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 th associated wi
fe80: 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e th error */. in
fe90: 74 20 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20 t iLine
fea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
feb0: 20 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d Source line num
fec0: 62 65 72 20 77 68 65 72 65 20 65 72 72 6f 72 20 ber where error
fed0: 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 occurred */.){.
fee0: 20 63 68 61 72 20 7a 4d 73 67 5b 35 30 30 5d 3b char zMsg[500];
fef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ff00: 20 2f 2a 20 48 75 6d 61 6e 20 72 65 61 64 61 62 /* Human readab
ff10: 6c 65 20 65 72 72 6f 72 20 74 65 78 74 20 2a 2f le error text */
ff20: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 . int i;
ff30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ff40: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 /* Loop count
ff50: 65 72 20 2a 2f 0a 0a 20 20 7a 4d 73 67 5b 30 5d er */.. zMsg[0]
ff60: 20 3d 20 30 3b 0a 20 20 77 69 6e 47 65 74 4c 61 = 0;. winGetLa
ff70: 73 74 45 72 72 6f 72 4d 73 67 28 6c 61 73 74 45 stErrorMsg(lastE
ff80: 72 72 6e 6f 2c 20 73 69 7a 65 6f 66 28 7a 4d 73 rrno, sizeof(zMs
ff90: 67 29 2c 20 7a 4d 73 67 29 3b 0a 20 20 61 73 73 g), zMsg);. ass
ffa0: 65 72 74 28 20 65 72 72 63 6f 64 65 21 3d 53 51 ert( errcode!=SQ
ffb0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 LITE_OK );. if(
ffc0: 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 zPath==0 ) zPat
ffd0: 68 20 3d 20 22 22 3b 0a 20 20 66 6f 72 28 69 3d h = "";. for(i=
ffe0: 30 3b 20 7a 4d 73 67 5b 69 5d 20 26 26 20 7a 4d 0; zMsg[i] && zM
fff0: 73 67 5b 69 5d 21 3d 27 5c 72 27 20 26 26 20 7a sg[i]!='\r' && z
10000 4d 73 67 5b 69 5d 21 3d 27 5c 6e 27 3b 20 69 2b Msg[i]!='\n'; i+
10010 2b 29 7b 7d 0a 20 20 7a 4d 73 67 5b 69 5d 20 3d +){}. zMsg[i] =
10020 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 0;. sqlite3_lo
10030 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20 20 20 g(errcode,.
10040 20 22 6f 73 5f 77 69 6e 2e 63 3a 25 64 3a 20 28 "os_win.c:%d: (
10050 25 6c 75 29 20 25 73 28 25 73 29 20 2d 20 25 73 %lu) %s(%s) - %s
10060 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c 20 ",. iLine,
10070 6c 61 73 74 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 lastErrno, zFunc
10080 2c 20 7a 50 61 74 68 2c 20 7a 4d 73 67 0a 20 20 , zPath, zMsg.
10090 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72 );.. return err
100a0 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 code;.}../*.** T
100b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d he number of tim
100c0 65 73 20 74 68 61 74 20 61 20 52 65 61 64 46 69 es that a ReadFi
100d0 6c 65 28 29 2c 20 57 72 69 74 65 46 69 6c 65 28 le(), WriteFile(
100e0 29 2c 20 61 6e 64 20 44 65 6c 65 74 65 46 69 6c ), and DeleteFil
100f0 65 28 29 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 e().** will be r
10100 65 74 72 69 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 etried following
10110 20 61 20 6c 6f 63 6b 69 6e 67 20 65 72 72 6f 72 a locking error
10120 20 2d 20 70 72 6f 62 61 62 6c 79 20 63 61 75 73 - probably caus
10130 65 64 20 62 79 0a 2a 2a 20 61 6e 74 69 76 69 72 ed by.** antivir
10140 75 73 20 73 6f 66 74 77 61 72 65 2e 20 20 41 6c us software. Al
10150 73 6f 20 74 68 65 20 69 6e 69 74 69 61 6c 20 64 so the initial d
10160 65 6c 61 79 20 62 65 66 6f 72 65 20 74 68 65 20 elay before the
10170 66 69 72 73 74 20 72 65 74 72 79 2e 0a 2a 2a 20 first retry..**
10180 54 68 65 20 64 65 6c 61 79 20 69 6e 63 72 65 61 The delay increa
10190 73 65 73 20 6c 69 6e 65 61 72 6c 79 20 77 69 74 ses linearly wit
101a0 68 20 65 61 63 68 20 72 65 74 72 79 2e 0a 2a 2f h each retry..*/
101b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f .#ifndef SQLITE_
101c0 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 WIN32_IOERR_RETR
101d0 59 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 Y.# define SQLIT
101e0 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 E_WIN32_IOERR_RE
101f0 54 52 59 20 31 30 0a 23 65 6e 64 69 66 0a 23 69 TRY 10.#endif.#i
10200 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e fndef SQLITE_WIN
10210 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 32_IOERR_RETRY_D
10220 45 4c 41 59 0a 23 20 64 65 66 69 6e 65 20 53 51 ELAY.# define SQ
10230 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 LITE_WIN32_IOERR
10240 5f 52 45 54 52 59 5f 44 45 4c 41 59 20 32 35 0a _RETRY_DELAY 25.
10250 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 69 6e #endif.static in
10260 74 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 20 t winIoerrRetry
10270 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 = SQLITE_WIN32_I
10280 4f 45 52 52 5f 52 45 54 52 59 3b 0a 73 74 61 74 OERR_RETRY;.stat
10290 69 63 20 69 6e 74 20 77 69 6e 49 6f 65 72 72 52 ic int winIoerrR
102a0 65 74 72 79 44 65 6c 61 79 20 3d 20 53 51 4c 49 etryDelay = SQLI
102b0 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 TE_WIN32_IOERR_R
102c0 45 54 52 59 5f 44 45 4c 41 59 3b 0a 0a 2f 2a 0a ETRY_DELAY;../*.
102d0 2a 2a 20 54 68 65 20 22 77 69 6e 49 6f 65 72 72 ** The "winIoerr
102e0 43 61 6e 52 65 74 72 79 31 22 20 6d 61 63 72 6f CanRetry1" macro
102f0 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 is used to dete
10300 72 6d 69 6e 65 20 69 66 20 61 20 70 61 72 74 69 rmine if a parti
10310 63 75 6c 61 72 20 49 2f 4f 0a 2a 2a 20 65 72 72 cular I/O.** err
10320 6f 72 20 63 6f 64 65 20 6f 62 74 61 69 6e 65 64 or code obtained
10330 20 76 69 61 20 47 65 74 4c 61 73 74 45 72 72 6f via GetLastErro
10340 72 28 29 20 69 73 20 65 6c 69 67 69 62 6c 65 20 r() is eligible
10350 74 6f 20 62 65 20 72 65 74 72 69 65 64 2e 20 20 to be retried.
10360 49 74 0a 2a 2a 20 6d 75 73 74 20 61 63 63 65 70 It.** must accep
10370 74 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 t the error code
10380 20 44 57 4f 52 44 20 61 73 20 69 74 73 20 6f 6e DWORD as its on
10390 6c 79 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 ly argument and
103a0 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 0a 2a 2a should return.**
103b0 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 non-zero if the
103c0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 74 error code is t
103d0 72 61 6e 73 69 65 6e 74 20 69 6e 20 6e 61 74 75 ransient in natu
103e0 72 65 20 61 6e 64 20 74 68 65 20 6f 70 65 72 61 re and the opera
103f0 74 69 6f 6e 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 tion.** responsi
10400 62 6c 65 20 66 6f 72 20 67 65 6e 65 72 61 74 69 ble for generati
10410 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 ng the original
10420 65 72 72 6f 72 20 6d 69 67 68 74 20 73 75 63 63 error might succ
10430 65 65 64 20 75 70 6f 6e 20 62 65 69 6e 67 0a 2a eed upon being.*
10440 2a 20 72 65 74 72 69 65 64 2e 20 20 54 68 65 20 * retried. The
10450 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 argument to this
10460 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 macro should be
10470 20 61 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2a 0a a variable..**.
10480 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c ** Additionally,
10490 20 61 20 6d 61 63 72 6f 20 6e 61 6d 65 64 20 22 a macro named "
104a0 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 winIoerrCanRetry
104b0 32 22 20 6d 61 79 20 62 65 20 64 65 66 69 6e 65 2" may be define
104c0 64 2e 20 20 49 66 20 69 74 0a 2a 2a 20 69 73 20 d. If it.** is
104d0 64 65 66 69 6e 65 64 2c 20 69 74 20 77 69 6c 6c defined, it will
104e0 20 62 65 20 63 6f 6e 73 75 6c 74 65 64 20 6f 6e be consulted on
104f0 6c 79 20 77 68 65 6e 20 74 68 65 20 6d 61 63 72 ly when the macr
10500 6f 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 o "winIoerrCanRe
10510 74 72 79 31 22 0a 2a 2a 20 72 65 74 75 72 6e 73 try1".** returns
10520 20 7a 65 72 6f 2e 20 20 54 68 65 20 22 77 69 6e zero. The "win
10530 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32 22 20 IoerrCanRetry2"
10540 6d 61 63 72 6f 20 69 73 20 63 6f 6d 70 6c 65 74 macro is complet
10550 65 6c 79 20 6f 70 74 69 6f 6e 61 6c 20 61 6e 64 ely optional and
10560 0a 2a 2a 20 6d 61 79 20 62 65 20 75 73 65 64 20 .** may be used
10570 74 6f 20 69 6e 63 6c 75 64 65 20 61 64 64 69 74 to include addit
10580 69 6f 6e 61 6c 20 65 72 72 6f 72 20 63 6f 64 65 ional error code
10590 73 20 69 6e 20 74 68 65 20 73 65 74 20 74 68 61 s in the set tha
105a0 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 72 65 73 75 t should.** resu
105b0 6c 74 20 69 6e 20 74 68 65 20 66 61 69 6c 69 6e lt in the failin
105c0 67 20 49 2f 4f 20 6f 70 65 72 61 74 69 6f 6e 20 g I/O operation
105d0 62 65 69 6e 67 20 72 65 74 72 69 65 64 20 62 79 being retried by
105e0 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 20 49 66 the caller. If
105f0 0a 2a 2a 20 64 65 66 69 6e 65 64 2c 20 74 68 65 .** defined, the
10600 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 "winIoerrCanRet
10610 72 79 32 22 20 6d 61 63 72 6f 20 6d 75 73 74 20 ry2" macro must
10620 65 78 68 69 62 69 74 20 65 78 74 65 72 6e 61 6c exhibit external
10630 20 73 65 6d 61 6e 74 69 63 73 0a 2a 2a 20 69 64 semantics.** id
10640 65 6e 74 69 63 61 6c 20 74 6f 20 74 68 6f 73 65 entical to those
10650 20 6f 66 20 74 68 65 20 22 77 69 6e 49 6f 65 72 of the "winIoer
10660 72 43 61 6e 52 65 74 72 79 31 22 20 6d 61 63 72 rCanRetry1" macr
10670 6f 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e o..*/.#if !defin
10680 65 64 28 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 ed(winIoerrCanRe
10690 74 72 79 31 29 0a 23 64 65 66 69 6e 65 20 77 69 try1).#define wi
106a0 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 28 nIoerrCanRetry1(
106b0 61 29 20 28 28 28 61 29 3d 3d 45 52 52 4f 52 5f a) (((a)==ERROR_
106c0 41 43 43 45 53 53 5f 44 45 4e 49 45 44 29 20 20 ACCESS_DENIED)
106d0 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 || \.
106e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
106f0 20 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45 ((a)==E
10700 52 52 4f 52 5f 53 48 41 52 49 4e 47 5f 56 49 4f RROR_SHARING_VIO
10710 4c 41 54 49 4f 4e 29 20 20 20 20 7c 7c 20 5c 0a LATION) || \.
10720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
10730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 ((
10740 61 29 3d 3d 45 52 52 4f 52 5f 4c 4f 43 4b 5f 56 a)==ERROR_LOCK_V
10750 49 4f 4c 41 54 49 4f 4e 29 20 20 20 20 20 20 20 IOLATION)
10760 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 || \.
10770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
10780 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 44 ((a)==ERROR_D
10790 45 56 5f 4e 4f 54 5f 45 58 49 53 54 29 20 20 20 EV_NOT_EXIST)
107a0 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20 || \.
107b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
107c0 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52 ((a)==ER
107d0 52 4f 52 5f 4e 45 54 4e 41 4d 45 5f 44 45 4c 45 ROR_NETNAME_DELE
107e0 54 45 44 29 20 20 20 20 20 20 7c 7c 20 5c 0a 20 TED) || \.
107f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
10800 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 61 ((a
10810 29 3d 3d 45 52 52 4f 52 5f 53 45 4d 5f 54 49 4d )==ERROR_SEM_TIM
10820 45 4f 55 54 29 20 20 20 20 20 20 20 20 20 20 7c EOUT) |
10830 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 | \.
10840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
10850 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 4e 45 ((a)==ERROR_NE
10860 54 57 4f 52 4b 5f 55 4e 52 45 41 43 48 41 42 4c TWORK_UNREACHABL
10870 45 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a E)).#endif../*.*
10880 2a 20 49 66 20 61 20 52 65 61 64 46 69 6c 65 28 * If a ReadFile(
10890 29 20 6f 72 20 57 72 69 74 65 46 69 6c 65 28 29 ) or WriteFile()
108a0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 69 error occurs, i
108b0 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69 nvoke this routi
108c0 6e 65 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 ne.** to see if
108d0 69 74 20 73 68 6f 75 6c 64 20 62 65 20 72 65 74 it should be ret
108e0 72 69 65 64 2e 20 20 52 65 74 75 72 6e 20 54 52 ried. Return TR
108f0 55 45 20 74 6f 20 72 65 74 72 79 2e 20 20 52 65 UE to retry. Re
10900 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 74 6f turn FALSE.** to
10910 20 67 69 76 65 20 75 70 20 77 69 74 68 20 61 6e give up with an
10920 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 error..*/.stati
10930 63 20 69 6e 74 20 77 69 6e 52 65 74 72 79 49 6f c int winRetryIo
10940 65 72 72 28 69 6e 74 20 2a 70 6e 52 65 74 72 79 err(int *pnRetry
10950 2c 20 44 57 4f 52 44 20 2a 70 45 72 72 6f 72 29 , DWORD *pError)
10960 7b 0a 20 20 44 57 4f 52 44 20 65 20 3d 20 6f 73 {. DWORD e = os
10970 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a GetLastError();.
10980 20 20 69 66 28 20 2a 70 6e 52 65 74 72 79 3e 3d if( *pnRetry>=
10990 77 69 6e 49 6f 65 72 72 52 65 74 72 79 20 29 7b winIoerrRetry ){
109a0 0a 20 20 20 20 69 66 28 20 70 45 72 72 6f 72 20 . if( pError
109b0 29 7b 0a 20 20 20 20 20 20 2a 70 45 72 72 6f 72 ){. *pError
109c0 20 3d 20 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 = e;. }.
109d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 return 0;. }.
109e0 69 66 28 20 77 69 6e 49 6f 65 72 72 43 61 6e 52 if( winIoerrCanR
109f0 65 74 72 79 31 28 65 29 20 29 7b 0a 20 20 20 20 etry1(e) ){.
10a00 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c sqlite3_win32_sl
10a10 65 65 70 28 77 69 6e 49 6f 65 72 72 52 65 74 72 eep(winIoerrRetr
10a20 79 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74 yDelay*(1+*pnRet
10a30 72 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 ry));. ++*pnR
10a40 65 74 72 79 3b 0a 20 20 20 20 72 65 74 75 72 6e etry;. return
10a50 20 31 3b 0a 20 20 7d 0a 23 69 66 20 64 65 66 69 1;. }.#if defi
10a60 6e 65 64 28 77 69 6e 49 6f 65 72 72 43 61 6e 52 ned(winIoerrCanR
10a70 65 74 72 79 32 29 0a 20 20 65 6c 73 65 20 69 66 etry2). else if
10a80 28 20 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 ( winIoerrCanRet
10a90 72 79 32 28 65 29 20 29 7b 0a 20 20 20 20 73 71 ry2(e) ){. sq
10aa0 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 lite3_win32_slee
10ab0 70 28 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 p(winIoerrRetryD
10ac0 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72 79 elay*(1+*pnRetry
10ad0 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 65 74 ));. ++*pnRet
10ae0 72 79 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 ry;. return 1
10af0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 ;. }.#endif. i
10b00 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 f( pError ){.
10b10 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20 *pError = e;.
10b20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a }. return 0;.}.
10b30 0a 2f 2a 0a 2a 2a 20 4c 6f 67 20 61 20 49 2f 4f ./*.** Log a I/O
10b40 20 65 72 72 6f 72 20 72 65 74 72 79 20 65 70 69 error retry epi
10b50 73 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 sode..*/.static
10b60 76 6f 69 64 20 77 69 6e 4c 6f 67 49 6f 65 72 72 void winLogIoerr
10b70 28 69 6e 74 20 6e 52 65 74 72 79 2c 20 69 6e 74 (int nRetry, int
10b80 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66 28 20 lineno){. if(
10b90 6e 52 65 74 72 79 20 29 7b 0a 20 20 20 20 73 71 nRetry ){. sq
10ba0 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 lite3_log(SQLITE
10bb0 5f 4e 4f 54 49 43 45 2c 0a 20 20 20 20 20 20 22 _NOTICE,. "
10bc0 64 65 6c 61 79 65 64 20 25 64 6d 73 20 66 6f 72 delayed %dms for
10bd0 20 6c 6f 63 6b 2f 73 68 61 72 69 6e 67 20 63 6f lock/sharing co
10be0 6e 66 6c 69 63 74 20 61 74 20 6c 69 6e 65 20 25 nflict at line %
10bf0 64 22 2c 0a 20 20 20 20 20 20 77 69 6e 49 6f 65 d",. winIoe
10c00 72 72 52 65 74 72 79 44 65 6c 61 79 2a 6e 52 65 rrRetryDelay*nRe
10c10 74 72 79 2a 28 6e 52 65 74 72 79 2b 31 29 2f 32 try*(nRetry+1)/2
10c20 2c 20 6c 69 6e 65 6e 6f 0a 20 20 20 20 29 3b 0a , lineno. );.
10c30 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 }.}../*.** Thi
10c40 73 20 23 69 66 20 64 6f 65 73 20 6e 6f 74 20 72 s #if does not r
10c50 65 6c 79 20 6f 6e 20 74 68 65 20 53 51 4c 49 54 ely on the SQLIT
10c60 45 5f 4f 53 5f 57 49 4e 43 45 20 64 65 66 69 6e E_OS_WINCE defin
10c70 65 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a e because the.**
10c80 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 73 corresponding s
10c90 65 63 74 69 6f 6e 20 69 6e 20 22 64 61 74 65 2e ection in "date.
10ca0 63 22 20 63 61 6e 6e 6f 74 20 75 73 65 20 69 74 c" cannot use it
10cb0 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 ..*/.#if !define
10cc0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f d(SQLITE_OMIT_LO
10cd0 43 41 4c 54 49 4d 45 29 20 26 26 20 64 65 66 69 CALTIME) && defi
10ce0 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 20 ned(_WIN32_WCE)
10cf0 26 26 20 5c 0a 20 20 20 20 28 21 64 65 66 69 6e && \. (!defin
10d00 65 64 28 53 51 4c 49 54 45 5f 4d 53 56 43 5f 4c ed(SQLITE_MSVC_L
10d10 4f 43 41 4c 54 49 4d 45 5f 41 50 49 29 20 7c 7c OCALTIME_API) ||
10d20 20 21 53 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f !SQLITE_MSVC_LO
10d30 43 41 4c 54 49 4d 45 5f 41 50 49 29 0a 2f 2a 0a CALTIME_API)./*.
10d40 2a 2a 20 54 68 65 20 4d 53 56 43 20 43 52 54 20 ** The MSVC CRT
10d50 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 20 6d 61 on Windows CE ma
10d60 79 20 6e 6f 74 20 68 61 76 65 20 61 20 6c 6f 63 y not have a loc
10d70 61 6c 74 69 6d 65 28 29 20 66 75 6e 63 74 69 6f altime() functio
10d80 6e 2e 0a 2a 2a 20 53 6f 20 64 65 66 69 6e 65 20 n..** So define
10d90 61 20 73 75 62 73 74 69 74 75 74 65 2e 0a 2a 2f a substitute..*/
10da0 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 74 69 6d .# include <tim
10db0 65 2e 68 3e 0a 73 74 72 75 63 74 20 74 6d 20 2a e.h>.struct tm *
10dc0 5f 5f 63 64 65 63 6c 20 6c 6f 63 61 6c 74 69 6d __cdecl localtim
10dd0 65 28 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20 2a e(const time_t *
10de0 74 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 73 74 t).{. static st
10df0 72 75 63 74 20 74 6d 20 79 3b 0a 20 20 46 49 4c ruct tm y;. FIL
10e00 45 54 49 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b 0a ETIME uTm, lTm;.
10e10 20 20 53 59 53 54 45 4d 54 49 4d 45 20 70 54 6d SYSTEMTIME pTm
10e20 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 ;. sqlite3_int6
10e30 34 20 74 36 34 3b 0a 20 20 74 36 34 20 3d 20 2a 4 t64;. t64 = *
10e40 74 3b 0a 20 20 74 36 34 20 3d 20 28 74 36 34 20 t;. t64 = (t64
10e50 2b 20 31 31 36 34 34 34 37 33 36 30 30 29 2a 31 + 11644473600)*1
10e60 30 30 30 30 30 30 30 3b 0a 20 20 75 54 6d 2e 64 0000000;. uTm.d
10e70 77 4c 6f 77 44 61 74 65 54 69 6d 65 20 3d 20 28 wLowDateTime = (
10e80 44 57 4f 52 44 29 28 74 36 34 20 26 20 30 78 46 DWORD)(t64 & 0xF
10e90 46 46 46 46 46 46 46 29 3b 0a 20 20 75 54 6d 2e FFFFFFF);. uTm.
10ea0 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 3d 20 dwHighDateTime=
10eb0 28 44 57 4f 52 44 29 28 74 36 34 20 3e 3e 20 33 (DWORD)(t64 >> 3
10ec0 32 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65 2);. osFileTime
10ed0 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 28 ToLocalFileTime(
10ee0 26 75 54 6d 2c 26 6c 54 6d 29 3b 0a 20 20 6f 73 &uTm,&lTm);. os
10ef0 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d FileTimeToSystem
10f00 54 69 6d 65 28 26 6c 54 6d 2c 26 70 54 6d 29 3b Time(&lTm,&pTm);
10f10 0a 20 20 79 2e 74 6d 5f 79 65 61 72 20 3d 20 70 . y.tm_year = p
10f20 54 6d 2e 77 59 65 61 72 20 2d 20 31 39 30 30 3b Tm.wYear - 1900;
10f30 0a 20 20 79 2e 74 6d 5f 6d 6f 6e 20 3d 20 70 54 . y.tm_mon = pT
10f40 6d 2e 77 4d 6f 6e 74 68 20 2d 20 31 3b 0a 20 20 m.wMonth - 1;.
10f50 79 2e 74 6d 5f 77 64 61 79 20 3d 20 70 54 6d 2e y.tm_wday = pTm.
10f60 77 44 61 79 4f 66 57 65 65 6b 3b 0a 20 20 79 2e wDayOfWeek;. y.
10f70 74 6d 5f 6d 64 61 79 20 3d 20 70 54 6d 2e 77 44 tm_mday = pTm.wD
10f80 61 79 3b 0a 20 20 79 2e 74 6d 5f 68 6f 75 72 20 ay;. y.tm_hour
10f90 3d 20 70 54 6d 2e 77 48 6f 75 72 3b 0a 20 20 79 = pTm.wHour;. y
10fa0 2e 74 6d 5f 6d 69 6e 20 3d 20 70 54 6d 2e 77 4d .tm_min = pTm.wM
10fb0 69 6e 75 74 65 3b 0a 20 20 79 2e 74 6d 5f 73 65 inute;. y.tm_se
10fc0 63 20 3d 20 70 54 6d 2e 77 53 65 63 6f 6e 64 3b c = pTm.wSecond;
10fd0 0a 20 20 72 65 74 75 72 6e 20 26 79 3b 0a 7d 0a . return &y;.}.
10fe0 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 #endif..#if SQLI
10ff0 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 2f 2a 2a 2a TE_OS_WINCE./***
11000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
11010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
11020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
11030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
11040 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 ******.** This s
11050 65 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 ection contains
11060 63 6f 64 65 20 66 6f 72 20 57 69 6e 43 45 20 6f code for WinCE o
11070 6e 6c 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 nly..*/.#define
11080 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c HANDLE_TO_WINFIL
11090 45 28 61 29 20 28 77 69 6e 46 69 6c 65 2a 29 26 E(a) (winFile*)&
110a0 28 28 63 68 61 72 2a 29 61 29 5b 2d 28 69 6e 74 ((char*)a)[-(int
110b0 29 6f 66 66 73 65 74 6f 66 28 77 69 6e 46 69 6c )offsetof(winFil
110c0 65 2c 68 29 5d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 e,h)]../*.** Acq
110d0 75 69 72 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 uire a lock on t
110e0 68 65 20 68 61 6e 64 6c 65 20 68 0a 2a 2f 0a 73 he handle h.*/.s
110f0 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65 tatic void wince
11100 4d 75 74 65 78 41 63 71 75 69 72 65 28 48 41 4e MutexAcquire(HAN
11110 44 4c 45 20 68 29 7b 0a 20 20 20 44 57 4f 52 44 DLE h){. DWORD
11120 20 64 77 45 72 72 3b 0a 20 20 20 64 6f 20 7b 0a dwErr;. do {.
11130 20 20 20 20 20 64 77 45 72 72 20 3d 20 6f 73 57 dwErr = osW
11140 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 aitForSingleObje
11150 63 74 28 68 2c 20 49 4e 46 49 4e 49 54 45 29 3b ct(h, INFINITE);
11160 0a 20 20 20 7d 20 77 68 69 6c 65 20 28 64 77 45 . } while (dwE
11170 72 72 20 21 3d 20 57 41 49 54 5f 4f 42 4a 45 43 rr != WAIT_OBJEC
11180 54 5f 30 20 26 26 20 64 77 45 72 72 20 21 3d 20 T_0 && dwErr !=
11190 57 41 49 54 5f 41 42 41 4e 44 4f 4e 45 44 29 3b WAIT_ABANDONED);
111a0 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 .}./*.** Release
111b0 20 61 20 6c 6f 63 6b 20 61 63 71 75 69 72 65 64 a lock acquired
111c0 20 62 79 20 77 69 6e 63 65 4d 75 74 65 78 41 63 by winceMutexAc
111d0 71 75 69 72 65 28 29 0a 2a 2f 0a 23 64 65 66 69 quire().*/.#defi
111e0 6e 65 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c ne winceMutexRel
111f0 65 61 73 65 28 68 29 20 52 65 6c 65 61 73 65 4d ease(h) ReleaseM
11200 75 74 65 78 28 68 29 0a 0a 2f 2a 0a 2a 2a 20 43 utex(h)../*.** C
11210 72 65 61 74 65 20 74 68 65 20 6d 75 74 65 78 20 reate the mutex
11220 61 6e 64 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 and shared memor
11230 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 y used for locki
11240 6e 67 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a ng in the file.*
11250 2a 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 * descriptor pFi
11260 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 le.*/.static int
11270 20 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b winceCreateLock
11280 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 (const char *zFi
11290 6c 65 6e 61 6d 65 2c 20 77 69 6e 46 69 6c 65 20 lename, winFile
112a0 2a 70 46 69 6c 65 29 7b 0a 20 20 4c 50 57 53 54 *pFile){. LPWST
112b0 52 20 7a 54 6f 6b 3b 0a 20 20 4c 50 57 53 54 52 R zTok;. LPWSTR
112c0 20 7a 4e 61 6d 65 3b 0a 20 20 44 57 4f 52 44 20 zName;. DWORD
112d0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 42 4f 4f lastErrno;. BOO
112e0 4c 20 62 4c 6f 67 67 65 64 20 3d 20 46 41 4c 53 L bLogged = FALS
112f0 45 3b 0a 20 20 42 4f 4f 4c 20 62 49 6e 69 74 20 E;. BOOL bInit
11300 3d 20 54 52 55 45 3b 0a 0a 20 20 7a 4e 61 6d 65 = TRUE;.. zName
11310 20 3d 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 = winUtf8ToUnic
11320 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a ode(zFilename);.
11330 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 if( zName==0 )
11340 7b 0a 20 20 20 20 2f 2a 20 6f 75 74 20 6f 66 20 {. /* out of
11350 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 20 20 72 65 memory */. re
11360 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 turn SQLITE_IOER
11370 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 R_NOMEM_BKPT;.
11380 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 }.. /* Initiali
11390 7a 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 ze the local loc
113a0 6b 64 61 74 61 20 2a 2f 0a 20 20 6d 65 6d 73 65 kdata */. memse
113b0 74 28 26 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2c t(&pFile->local,
113c0 20 30 2c 20 73 69 7a 65 6f 66 28 70 46 69 6c 65 0, sizeof(pFile
113d0 2d 3e 6c 6f 63 61 6c 29 29 3b 0a 0a 20 20 2f 2a ->local));.. /*
113e0 20 52 65 70 6c 61 63 65 20 74 68 65 20 62 61 63 Replace the bac
113f0 6b 73 6c 61 73 68 65 73 20 66 72 6f 6d 20 74 68 kslashes from th
11400 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 6c e filename and l
11410 6f 77 65 72 63 61 73 65 20 69 74 0a 20 20 2a 2a owercase it. **
11420 20 74 6f 20 64 65 72 69 76 65 20 61 20 6d 75 74 to derive a mut
11430 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 7a 54 ex name. */. zT
11440 6f 6b 20 3d 20 6f 73 43 68 61 72 4c 6f 77 65 72 ok = osCharLower
11450 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 20 W(zName);. for
11460 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f 6b 2b 2b 29 7b (;*zTok;zTok++){
11470 0a 20 20 20 20 69 66 20 28 2a 7a 54 6f 6b 20 3d . if (*zTok =
11480 3d 20 27 5c 5c 27 29 20 2a 7a 54 6f 6b 20 3d 20 = '\\') *zTok =
11490 27 5f 27 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 '_';. }.. /* C
114a0 72 65 61 74 65 2f 6f 70 65 6e 20 74 68 65 20 6e reate/open the n
114b0 61 6d 65 64 20 6d 75 74 65 78 20 2a 2f 0a 20 20 amed mutex */.
114c0 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 pFile->hMutex =
114d0 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57 28 4e osCreateMutexW(N
114e0 55 4c 4c 2c 20 46 41 4c 53 45 2c 20 7a 4e 61 6d ULL, FALSE, zNam
114f0 65 29 3b 0a 20 20 69 66 20 28 21 70 46 69 6c 65 e);. if (!pFile
11500 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20 20 70 ->hMutex){. p
11510 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 File->lastErrno
11520 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 = osGetLastError
11530 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f ();. sqlite3_
11540 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 free(zName);.
11550 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 return winLogEr
11560 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 ror(SQLITE_IOERR
11570 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 , pFile->lastErr
11580 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 no,.
11590 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 63 "winc
115a0 65 43 72 65 61 74 65 4c 6f 63 6b 31 22 2c 20 7a eCreateLock1", z
115b0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 0a Filename);. }..
115c0 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65 /* Acquire the
115d0 20 6d 75 74 65 78 20 62 65 66 6f 72 65 20 63 6f mutex before co
115e0 6e 74 69 6e 75 69 6e 67 20 2a 2f 0a 20 20 77 69 ntinuing */. wi
115f0 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 nceMutexAcquire(
11600 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a pFile->hMutex);.
11610 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 . /* Since the
11620 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65 64 20 6d names of named m
11630 75 74 65 78 65 73 2c 20 73 65 6d 61 70 68 6f 72 utexes, semaphor
11640 65 73 2c 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 es, file mapping
11650 73 20 65 74 63 20 61 72 65 0a 20 20 2a 2a 20 63 s etc are. ** c
11660 61 73 65 2d 73 65 6e 73 69 74 69 76 65 2c 20 74 ase-sensitive, t
11670 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 ake advantage of
11680 20 74 68 61 74 20 62 79 20 75 70 70 65 72 63 61 that by upperca
11690 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 20 6e sing the mutex n
116a0 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 75 73 69 ame. ** and usi
116b0 6e 67 20 74 68 61 74 20 61 73 20 74 68 65 20 73 ng that as the s
116c0 68 61 72 65 64 20 66 69 6c 65 6d 61 70 70 69 6e hared filemappin
116d0 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 6f g name.. */. o
116e0 73 43 68 61 72 55 70 70 65 72 57 28 7a 4e 61 6d sCharUpperW(zNam
116f0 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 53 68 e);. pFile->hSh
11700 61 72 65 64 20 3d 20 6f 73 43 72 65 61 74 65 46 ared = osCreateF
11710 69 6c 65 4d 61 70 70 69 6e 67 57 28 49 4e 56 41 ileMappingW(INVA
11720 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 LID_HANDLE_VALUE
11730 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 , NULL,.
11740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11760 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 PAGE_READWRITE,
11770 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 0, sizeof(winceL
11780 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 ock),.
11790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
117a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e zN
117b0 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 ame);.. /* Set
117c0 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69 a flag that indi
117d0 63 61 74 65 73 20 77 65 27 72 65 20 74 68 65 20 cates we're the
117e0 66 69 72 73 74 20 74 6f 20 63 72 65 61 74 65 20 first to create
117f0 74 68 65 20 6d 65 6d 6f 72 79 20 73 6f 20 69 74 the memory so it
11800 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 7a 65 . ** must be ze
11810 72 6f 2d 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a ro-initialized *
11820 2f 0a 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 /. lastErrno =
11830 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 osGetLastError()
11840 3b 0a 20 20 69 66 20 28 6c 61 73 74 45 72 72 6e ;. if (lastErrn
11850 6f 20 3d 3d 20 45 52 52 4f 52 5f 41 4c 52 45 41 o == ERROR_ALREA
11860 44 59 5f 45 58 49 53 54 53 29 7b 0a 20 20 20 20 DY_EXISTS){.
11870 62 49 6e 69 74 20 3d 20 46 41 4c 53 45 3b 0a 20 bInit = FALSE;.
11880 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 }.. sqlite3_fr
11890 65 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a ee(zName);.. /*
118a0 20 49 66 20 77 65 20 73 75 63 63 65 65 64 65 64 If we succeeded
118b0 20 69 6e 20 6d 61 6b 69 6e 67 20 74 68 65 20 73 in making the s
118c0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e hared memory han
118d0 64 6c 65 2c 20 6d 61 70 20 69 74 2e 20 2a 2f 0a dle, map it. */.
118e0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 53 68 if( pFile->hSh
118f0 61 72 65 64 20 29 7b 0a 20 20 20 20 70 46 69 6c ared ){. pFil
11900 65 2d 3e 73 68 61 72 65 64 20 3d 20 28 77 69 6e e->shared = (win
11910 63 65 4c 6f 63 6b 2a 29 6f 73 4d 61 70 56 69 65 ceLock*)osMapVie
11920 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 wOfFile(pFile->h
11930 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20 20 20 Shared,.
11940 20 20 20 20 20 46 49 4c 45 5f 4d 41 50 5f 52 45 FILE_MAP_RE
11950 41 44 7c 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 AD|FILE_MAP_WRIT
11960 45 2c 20 30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 E, 0, 0, sizeof(
11970 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 20 winceLock));.
11980 20 2f 2a 20 49 66 20 6d 61 70 70 69 6e 67 20 66 /* If mapping f
11990 61 69 6c 65 64 2c 20 63 6c 6f 73 65 20 74 68 65 ailed, close the
119a0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 shared memory h
119b0 61 6e 64 6c 65 20 61 6e 64 20 65 72 61 73 65 20 andle and erase
119c0 69 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 it */. if( !p
119d0 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 29 7b 0a File->shared ){.
119e0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 pFile->las
119f0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 tErrno = osGetLa
11a00 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 stError();.
11a10 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c winLogError(SQL
11a20 49 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 ITE_IOERR, pFile
11a30 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 ->lastErrno,.
11a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 "
11a50 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 32 winceCreateLock2
11a60 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 ", zFilename);.
11a70 20 20 20 20 20 62 4c 6f 67 67 65 64 20 3d 20 54 bLogged = T
11a80 52 55 45 3b 0a 20 20 20 20 20 20 6f 73 43 6c 6f RUE;. osClo
11a90 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e seHandle(pFile->
11aa0 68 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 hShared);.
11ab0 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d pFile->hShared =
11ac0 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d NULL;. }. }
11ad0 0a 0a 20 20 2f 2a 20 49 66 20 73 68 61 72 65 64 .. /* If shared
11ae0 20 6d 65 6d 6f 72 79 20 63 6f 75 6c 64 20 6e 6f memory could no
11af0 74 20 62 65 20 63 72 65 61 74 65 64 2c 20 74 68 t be created, th
11b00 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 6d 75 74 en close the mut
11b10 65 78 20 61 6e 64 20 66 61 69 6c 20 2a 2f 0a 20 ex and fail */.
11b20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 53 68 61 if( pFile->hSha
11b30 72 65 64 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 red==NULL ){.
11b40 20 69 66 28 20 21 62 4c 6f 67 67 65 64 20 29 7b if( !bLogged ){
11b50 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 . pFile->la
11b60 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 stErrno = lastEr
11b70 72 6e 6f 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f rno;. winLo
11b80 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f gError(SQLITE_IO
11b90 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 ERR, pFile->last
11ba0 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 Errno,.
11bb0 20 20 20 20 20 20 20 20 20 22 77 69 6e 63 65 43 "winceC
11bc0 72 65 61 74 65 4c 6f 63 6b 33 22 2c 20 7a 46 69 reateLock3", zFi
11bd0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 lename);. b
11be0 4c 6f 67 67 65 64 20 3d 20 54 52 55 45 3b 0a 20 Logged = TRUE;.
11bf0 20 20 20 7d 0a 20 20 20 20 77 69 6e 63 65 4d 75 }. winceMu
11c00 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 texRelease(pFile
11c10 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 6f ->hMutex);. o
11c20 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 sCloseHandle(pFi
11c30 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 le->hMutex);.
11c40 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d pFile->hMutex =
11c50 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 65 74 75 72 NULL;. retur
11c60 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a n SQLITE_IOERR;.
11c70 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 }.. /* Initia
11c80 6c 69 7a 65 20 74 68 65 20 73 68 61 72 65 64 20 lize the shared
11c90 6d 65 6d 6f 72 79 20 69 66 20 77 65 27 72 65 20 memory if we're
11ca0 73 75 70 70 6f 73 65 64 20 74 6f 20 2a 2f 0a 20 supposed to */.
11cb0 20 69 66 28 20 62 49 6e 69 74 20 29 7b 0a 20 20 if( bInit ){.
11cc0 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2d 3e memset(pFile->
11cd0 73 68 61 72 65 64 2c 20 30 2c 20 73 69 7a 65 6f shared, 0, sizeo
11ce0 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 f(winceLock));.
11cf0 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 }.. winceMutex
11d00 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 Release(pFile->h
11d10 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e Mutex);. return
11d20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f SQLITE_OK;.}../
11d30 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74 68 65 *.** Destroy the
11d40 20 70 61 72 74 20 6f 66 20 77 69 6e 46 69 6c 65 part of winFile
11d50 20 74 68 61 74 20 64 65 61 6c 73 20 77 69 74 68 that deals with
11d60 20 77 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a wince locks.*/.
11d70 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63 static void winc
11d80 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 77 69 6e eDestroyLock(win
11d90 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 File *pFile){.
11da0 69 66 20 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 if (pFile->hMute
11db0 78 29 7b 0a 20 20 20 20 2f 2a 20 41 63 71 75 69 x){. /* Acqui
11dc0 72 65 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a re the mutex */.
11dd0 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 winceMutexAc
11de0 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 quire(pFile->hMu
11df0 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 tex);.. /* Th
11e00 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 e following bloc
11e10 6b 73 20 73 68 6f 75 6c 64 20 70 72 6f 62 61 62 ks should probab
11e20 6c 79 20 61 73 73 65 72 74 20 69 6e 20 64 65 62 ly assert in deb
11e30 75 67 20 6d 6f 64 65 2c 20 62 75 74 20 74 68 65 ug mode, but the
11e40 79 0a 20 20 20 20 20 20 20 61 72 65 20 74 6f 20 y. are to
11e50 63 6c 65 61 6e 75 70 20 69 6e 20 63 61 73 65 20 cleanup in case
11e60 61 6e 79 20 6c 6f 63 6b 73 20 72 65 6d 61 69 6e any locks remain
11e70 65 64 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 ed open */. i
11e80 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e f (pFile->local.
11e90 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 nReaders){.
11ea0 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e pFile->shared->
11eb0 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 nReaders --;.
11ec0 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 }. if (pFile
11ed0 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 ->local.bReserve
11ee0 64 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d d){. pFile-
11ef0 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 >shared->bReserv
11f00 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 ed = FALSE;.
11f10 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d }. if (pFile-
11f20 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 >local.bPending)
11f30 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 {. pFile->s
11f40 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 hared->bPending
11f50 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 = FALSE;. }.
11f60 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f if (pFile->lo
11f70 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b cal.bExclusive){
11f80 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 . pFile->sh
11f90 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 ared->bExclusive
11fa0 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a = FALSE;. }.
11fb0 0a 20 20 20 20 2f 2a 20 44 65 2d 72 65 66 65 72 . /* De-refer
11fc0 65 6e 63 65 20 61 6e 64 20 63 6c 6f 73 65 20 6f ence and close o
11fd0 75 72 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 ur copy of the s
11fe0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e hared memory han
11ff0 64 6c 65 20 2a 2f 0a 20 20 20 20 6f 73 55 6e 6d dle */. osUnm
12000 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 apViewOfFile(pFi
12010 6c 65 2d 3e 73 68 61 72 65 64 29 3b 0a 20 20 20 le->shared);.
12020 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 osCloseHandle(p
12030 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a File->hShared);.
12040 0a 20 20 20 20 2f 2a 20 44 6f 6e 65 20 77 69 74 . /* Done wit
12050 68 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 h the mutex */.
12060 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c winceMutexRel
12070 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 ease(pFile->hMut
12080 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 ex);. osClose
12090 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d Handle(pFile->hM
120a0 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65 utex);. pFile
120b0 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b ->hMutex = NULL;
120c0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e . }.}../*.** An
120d0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 implementation
120e0 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 28 of the LockFile(
120f0 29 20 41 50 49 20 6f 66 20 57 69 6e 64 6f 77 73 ) API of Windows
12100 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69 for CE.*/.stati
12110 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b c BOOL winceLock
12120 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 File(. LPHANDLE
12130 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 phFile,. DWORD
12140 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 dwFileOffsetLow
12150 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 ,. DWORD dwFile
12160 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 OffsetHigh,. DW
12170 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 ORD nNumberOfByt
12180 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 esToLockLow,. D
12190 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 WORD nNumberOfBy
121a0 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 0a 29 7b tesToLockHigh.){
121b0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c . winFile *pFil
121c0 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 e = HANDLE_TO_WI
121d0 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 NFILE(phFile);.
121e0 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 BOOL bReturn =
121f0 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44 FALSE;.. UNUSED
12200 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c _PARAMETER(dwFil
12210 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20 eOffsetHigh);.
12220 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 UNUSED_PARAMETER
12230 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 (nNumberOfBytesT
12240 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69 oLockHigh);.. i
12250 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 f (!pFile->hMute
12260 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a x) return TRUE;.
12270 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 winceMutexAcqu
12280 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 ire(pFile->hMute
12290 78 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e 74 69 6e x);.. /* Wantin
122a0 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c g an exclusive l
122b0 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66 20 28 64 77 ock? */. if (dw
122c0 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d FileOffsetLow ==
122d0 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46 (DWORD)SHARED_F
122e0 49 52 53 54 0a 20 20 20 20 20 20 20 26 26 20 6e IRST. && n
122f0 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c NumberOfBytesToL
12300 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 ockLow == (DWORD
12310 29 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a 20 )SHARED_SIZE){.
12320 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 if (pFile->sh
12330 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 3d ared->nReaders =
12340 3d 20 30 20 26 26 20 70 46 69 6c 65 2d 3e 73 68 = 0 && pFile->sh
12350 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 ared->bExclusive
12360 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 20 70 == 0){. p
12370 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 File->shared->bE
12380 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45 3b xclusive = TRUE;
12390 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c . pFile->l
123a0 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 20 ocal.bExclusive
123b0 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20 62 = TRUE;. b
123c0 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 Return = TRUE;.
123d0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 }. }.. /* W
123e0 61 6e 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 ant a read-only
123f0 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 lock? */. else
12400 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 if (dwFileOffset
12410 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 Low == (DWORD)SH
12420 41 52 45 44 5f 46 49 52 53 54 20 26 26 0a 20 20 ARED_FIRST &&.
12430 20 20 20 20 20 20 20 20 20 6e 4e 75 6d 62 65 72 nNumber
12440 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 OfBytesToLockLow
12450 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 == 1){. if (
12460 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 pFile->shared->b
12470 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b Exclusive == 0){
12480 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f . pFile->lo
12490 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2b 2b 3b cal.nReaders ++;
124a0 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65 . if (pFile
124b0 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 ->local.nReaders
124c0 20 3d 3d 20 31 29 7b 0a 20 20 20 20 20 20 20 20 == 1){.
124d0 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e pFile->shared->n
124e0 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20 Readers ++;.
124f0 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72 }. bRetur
12500 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a n = TRUE;. }.
12510 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 }.. /* Want a
12520 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 3f 20 2a pending lock? *
12530 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 /. else if (dwF
12540 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 ileOffsetLow ==
12550 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42 (DWORD)PENDING_B
12560 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 26 YTE. &
12570 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 & nNumberOfBytes
12580 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b ToLockLow == 1){
12590 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 70 65 . /* If no pe
125a0 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62 nding lock has b
125b0 65 65 6e 20 61 63 71 75 69 72 65 64 2c 20 74 68 een acquired, th
125c0 65 6e 20 61 63 71 75 69 72 65 20 69 74 20 2a 2f en acquire it */
125d0 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e . if (pFile->
125e0 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 shared->bPending
125f0 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 70 == 0) {. p
12600 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 File->shared->bP
12610 65 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 ending = TRUE;.
12620 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 pFile->loca
12630 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55 l.bPending = TRU
12640 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e E;. bReturn
12650 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 = TRUE;. }.
12660 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 }.. /* Want a
12670 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 3f 20 2a reserved lock? *
12680 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 /. else if (dwF
12690 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 ileOffsetLow ==
126a0 28 44 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f (DWORD)RESERVED_
126b0 42 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 BYTE.
126c0 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 && nNumberOfByte
126d0 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 sToLockLow == 1)
126e0 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d {. if (pFile-
126f0 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 >shared->bReserv
12700 65 64 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 ed == 0) {.
12710 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e pFile->shared->
12720 62 52 65 73 65 72 76 65 64 20 3d 20 54 52 55 45 bReserved = TRUE
12730 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c ;. pFile->l
12740 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d ocal.bReserved =
12750 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65 TRUE;. bRe
12760 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 turn = TRUE;.
12770 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d }. }.. winceM
12780 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c utexRelease(pFil
12790 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 e->hMutex);. re
127a0 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a turn bReturn;.}.
127b0 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d ./*.** An implem
127c0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 entation of the
127d0 55 6e 6c 6f 63 6b 46 69 6c 65 20 41 50 49 20 6f UnlockFile API o
127e0 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45 f Windows for CE
127f0 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 .*/.static BOOL
12800 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 winceUnlockFile(
12810 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 . LPHANDLE phFi
12820 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 le,. DWORD dwFi
12830 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 leOffsetLow,. D
12840 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 WORD dwFileOffse
12850 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e tHigh,. DWORD n
12860 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 NumberOfBytesToU
12870 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 nlockLow,. DWOR
12880 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 D nNumberOfBytes
12890 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a ToUnlockHigh.){.
128a0 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 winFile *pFile
128b0 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e = HANDLE_TO_WIN
128c0 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 FILE(phFile);.
128d0 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 BOOL bReturn = F
128e0 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f ALSE;.. UNUSED_
128f0 50 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c 65 PARAMETER(dwFile
12900 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20 55 OffsetHigh);. U
12910 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 NUSED_PARAMETER(
12920 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f nNumberOfBytesTo
12930 55 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 UnlockHigh);..
12940 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 if (!pFile->hMut
12950 65 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b ex) return TRUE;
12960 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 . winceMutexAcq
12970 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 uire(pFile->hMut
12980 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 ex);.. /* Relea
12990 73 69 6e 67 20 61 20 72 65 61 64 65 72 20 6c 6f sing a reader lo
129a0 63 6b 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 ck or an exclusi
129b0 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 20 ve lock */. if
129c0 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 (dwFileOffsetLow
129d0 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 == (DWORD)SHARE
129e0 44 5f 46 49 52 53 54 29 7b 0a 20 20 20 20 2f 2a D_FIRST){. /*
129f0 20 44 69 64 20 77 65 20 68 61 76 65 20 61 6e 20 Did we have an
12a00 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 exclusive lock?
12a10 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 */. if (pFile
12a20 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 ->local.bExclusi
12a30 76 65 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 ve){. asser
12a40 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 t(nNumberOfBytes
12a50 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 ToUnlockLow == (
12a60 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a DWORD)SHARED_SIZ
12a70 45 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d E);. pFile-
12a80 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 >local.bExclusiv
12a90 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 e = FALSE;.
12aa0 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e pFile->shared->
12ab0 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c bExclusive = FAL
12ac0 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 SE;. bRetur
12ad0 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a n = TRUE;. }.
12ae0 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20 6a . /* Did we j
12af0 75 73 74 20 68 61 76 65 20 61 20 72 65 61 64 65 ust have a reade
12b00 72 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 65 r lock? */. e
12b10 6c 73 65 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c lse if (pFile->l
12b20 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a ocal.nReaders){.
12b30 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75 assert(nNu
12b40 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c mberOfBytesToUnl
12b50 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 ockLow == (DWORD
12b60 29 53 48 41 52 45 44 5f 53 49 5a 45 0a 20 20 20 )SHARED_SIZE.
12b70 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6e 4e 75 || nNu
12b80 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c mberOfBytesToUnl
12b90 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b 0a 20 20 ockLow == 1);.
12ba0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c pFile->local
12bb0 2e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 .nReaders --;.
12bc0 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c if (pFile->l
12bd0 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d ocal.nReaders ==
12be0 20 30 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 0). {.
12bf0 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 pFile->share
12c00 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a d->nReaders --;.
12c10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52 }. bR
12c20 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 eturn = TRUE;.
12c30 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 }. }.. /* Re
12c40 6c 65 61 73 69 6e 67 20 61 20 70 65 6e 64 69 6e leasing a pendin
12c50 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 g lock */. else
12c60 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 if (dwFileOffse
12c70 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 tLow == (DWORD)P
12c80 45 4e 44 49 4e 47 5f 42 59 54 45 0a 20 20 20 20 ENDING_BYTE.
12c90 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 && nNumbe
12ca0 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b rOfBytesToUnlock
12cb0 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 Low == 1){. i
12cc0 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e f (pFile->local.
12cd0 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20 bPending){.
12ce0 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 pFile->local.bP
12cf0 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a ending = FALSE;.
12d00 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 pFile->sha
12d10 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 red->bPending =
12d20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65 FALSE;. bRe
12d30 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 turn = TRUE;.
12d40 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 6c 65 }. }. /* Rele
12d50 61 73 69 6e 67 20 61 20 72 65 73 65 72 76 65 64 asing a reserved
12d60 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 lock */. else
12d70 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 if (dwFileOffset
12d80 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 Low == (DWORD)RE
12d90 53 45 52 56 45 44 5f 42 59 54 45 0a 20 20 20 20 SERVED_BYTE.
12da0 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 && nNumbe
12db0 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b rOfBytesToUnlock
12dc0 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 Low == 1){. i
12dd0 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e f (pFile->local.
12de0 62 52 65 73 65 72 76 65 64 29 20 7b 0a 20 20 20 bReserved) {.
12df0 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e pFile->local.
12e00 62 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 bReserved = FALS
12e10 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e E;. pFile->
12e20 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 shared->bReserve
12e30 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 d = FALSE;.
12e40 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b bReturn = TRUE;
12e50 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 . }. }.. wi
12e60 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 nceMutexRelease(
12e70 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a pFile->hMutex);.
12e80 20 20 72 65 74 75 72 6e 20 62 52 65 74 75 72 6e return bReturn
12e90 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 ;.}./*.** End of
12ea0 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 6f 64 the special cod
12eb0 65 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2a 2a 2a e for wince.****
12ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
12ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
12ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
12ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
12f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 *********/.#endi
12f10 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 f /* SQLITE_OS_W
12f20 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c INCE */../*.** L
12f30 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67 69 6f ock a file regio
12f40 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f n..*/.static BOO
12f50 4c 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 0a 20 L winLockFile(.
12f60 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 LPHANDLE phFile
12f70 2c 0a 20 20 44 57 4f 52 44 20 66 6c 61 67 73 2c ,. DWORD flags,
12f80 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74 4c . DWORD offsetL
12f90 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 ow,. DWORD offs
12fa0 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 etHigh,. DWORD
12fb0 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 44 numBytesLow,. D
12fc0 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 48 69 67 WORD numBytesHig
12fd0 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f h.){.#if SQLITE_
12fe0 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a 20 20 OS_WINCE. /*.
12ff0 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73 ** NOTE: Windows
13000 20 43 45 20 69 73 20 68 61 6e 64 6c 65 64 20 64 CE is handled d
13010 69 66 66 65 72 65 6e 74 6c 79 20 68 65 72 65 20 ifferently here
13020 64 75 65 20 69 74 73 20 6c 61 63 6b 20 6f 66 20 due its lack of
13030 74 68 65 20 57 69 6e 33 32 0a 20 20 2a 2a 20 20 the Win32. **
13040 20 20 20 20 20 41 50 49 20 4c 6f 63 6b 46 69 6c API LockFil
13050 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e e.. */. return
13060 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 70 winceLockFile(p
13070 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 hFile, offsetLow
13080 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 , offsetHigh,.
13090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
130a0 20 20 20 20 20 6e 75 6d 42 79 74 65 73 4c 6f 77 numBytesLow
130b0 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b , numBytesHigh);
130c0 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6f 73 49 .#else. if( osI
130d0 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f 56 45 sNT() ){. OVE
130e0 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 RLAPPED ovlp;.
130f0 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20 memset(&ovlp,
13100 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 0, sizeof(OVERLA
13110 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70 PPED));. ovlp
13120 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74 .Offset = offset
13130 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 Low;. ovlp.Of
13140 66 73 65 74 48 69 67 68 20 3d 20 6f 66 66 73 65 fsetHigh = offse
13150 74 48 69 67 68 3b 0a 20 20 20 20 72 65 74 75 72 tHigh;. retur
13160 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 28 2a n osLockFileEx(*
13170 70 68 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 30 phFile, flags, 0
13180 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e , numBytesLow, n
13190 75 6d 42 79 74 65 73 48 69 67 68 2c 20 26 6f 76 umBytesHigh, &ov
131a0 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 lp);. }else{.
131b0 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 return osLockF
131c0 69 6c 65 28 2a 70 68 46 69 6c 65 2c 20 6f 66 66 ile(*phFile, off
131d0 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 setLow, offsetHi
131e0 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c gh, numBytesLow,
131f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
13200 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73 48 numBytesH
13210 69 67 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 igh);. }.#endif
13220 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b .}../*.** Unlock
13230 20 61 20 66 69 6c 65 20 72 65 67 69 6f 6e 2e 0a a file region..
13240 20 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 */.static BOOL
13250 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 winUnlockFile(.
13260 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 LPHANDLE phFile
13270 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74 ,. DWORD offset
13280 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 Low,. DWORD off
13290 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 setHigh,. DWORD
132a0 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 numBytesLow,.
132b0 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 48 69 DWORD numBytesHi
132c0 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 gh.){.#if SQLITE
132d0 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a 20 _OS_WINCE. /*.
132e0 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 ** NOTE: Window
132f0 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65 64 20 s CE is handled
13300 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65 72 65 differently here
13310 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20 6f 66 due its lack of
13320 20 74 68 65 20 57 69 6e 33 32 0a 20 20 2a 2a 20 the Win32. **
13330 20 20 20 20 20 20 41 50 49 20 55 6e 6c 6f 63 6b API Unlock
13340 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 File.. */. ret
13350 75 72 6e 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 urn winceUnlockF
13360 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66 66 73 ile(phFile, offs
13370 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 etLow, offsetHig
13380 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 h,.
13390 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 numB
133a0 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 ytesLow, numByte
133b0 73 48 69 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20 sHigh);.#else.
133c0 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a if( osIsNT() ){.
133d0 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f OVERLAPPED o
133e0 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 vlp;. memset(
133f0 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 &ovlp, 0, sizeof
13400 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 (OVERLAPPED));.
13410 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d ovlp.Offset =
13420 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20 offsetLow;.
13430 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20 ovlp.OffsetHigh
13440 3d 20 6f 66 66 73 65 74 48 69 67 68 3b 0a 20 20 = offsetHigh;.
13450 20 20 72 65 74 75 72 6e 20 6f 73 55 6e 6c 6f 63 return osUnloc
13460 6b 46 69 6c 65 45 78 28 2a 70 68 46 69 6c 65 2c kFileEx(*phFile,
13470 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0, numBytesLow,
13480 20 6e 75 6d 42 79 74 65 73 48 69 67 68 2c 20 26 numBytesHigh, &
13490 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a ovlp);. }else{.
134a0 20 20 20 20 72 65 74 75 72 6e 20 6f 73 55 6e 6c return osUnl
134b0 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65 2c ockFile(*phFile,
134c0 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 offsetLow, offs
134d0 65 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65 73 etHigh, numBytes
134e0 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 Low,.
134f0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d num
13500 42 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a BytesHigh);. }.
13510 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a #endif.}../*****
13520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
13530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
13540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
13550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
13560 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 ********.** The
13570 6e 65 78 74 20 67 72 6f 75 70 20 6f 66 20 72 6f next group of ro
13580 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 utines implement
13590 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 the I/O methods
135a0 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 specified.** by
135b0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f the sqlite3_io_
135c0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0a methods object..
135d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
135e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
135f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
13600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
13610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a **************/.
13620 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63 72 ./*.** Some Micr
13630 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 osoft compilers
13640 6c 61 63 6b 20 74 68 69 73 20 64 65 66 69 6e 69 lack this defini
13650 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 tion..*/.#ifndef
13660 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c INVALID_SET_FIL
13670 45 5f 50 4f 49 4e 54 45 52 0a 23 20 64 65 66 69 E_POINTER.# defi
13680 6e 65 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 ne INVALID_SET_F
13690 49 4c 45 5f 50 4f 49 4e 54 45 52 20 28 28 44 57 ILE_POINTER ((DW
136a0 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a ORD)-1).#endif..
136b0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 /*.** Move the c
136c0 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 urrent position
136d0 6f 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 of the file hand
136e0 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 le passed as the
136f0 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 first.** argume
13700 6e 74 20 74 6f 20 6f 66 66 73 65 74 20 69 4f 66 nt to offset iOf
13710 66 73 65 74 20 77 69 74 68 69 6e 20 74 68 65 20 fset within the
13720 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 file. If success
13730 66 75 6c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a ful, return 0..*
13740 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 * Otherwise, set
13750 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e pFile->lastErrn
13760 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e o and return non
13770 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 -zero..*/.static
13780 20 69 6e 74 20 77 69 6e 53 65 65 6b 46 69 6c 65 int winSeekFile
13790 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c (winFile *pFile,
137a0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 sqlite3_int64 i
137b0 4f 66 66 73 65 74 29 7b 0a 23 69 66 20 21 53 51 Offset){.#if !SQ
137c0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 LITE_OS_WINRT.
137d0 4c 4f 4e 47 20 75 70 70 65 72 42 69 74 73 3b 20 LONG upperBits;
137e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
137f0 2f 2a 20 4d 6f 73 74 20 73 69 67 2e 20 33 32 20 /* Most sig. 32
13800 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 bits of new offs
13810 65 74 20 2a 2f 0a 20 20 4c 4f 4e 47 20 6c 6f 77 et */. LONG low
13820 65 72 42 69 74 73 3b 20 20 20 20 20 20 20 20 20 erBits;
13830 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 73 74 /* Least
13840 20 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f 66 sig. 32 bits of
13850 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 new offset */.
13860 20 44 57 4f 52 44 20 64 77 52 65 74 3b 20 20 20 DWORD dwRet;
13870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13880 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e /* Value return
13890 65 64 20 62 79 20 53 65 74 46 69 6c 65 50 6f 69 ed by SetFilePoi
138a0 6e 74 65 72 28 29 20 2a 2f 0a 20 20 44 57 4f 52 nter() */. DWOR
138b0 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 D lastErrno;
138c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 /* V
138d0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 alue returned by
138e0 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 GetLastError()
138f0 2a 2f 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 */.. OSTRACE(("
13900 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 66 SEEK file=%p, of
13910 66 73 65 74 3d 25 6c 6c 64 5c 6e 22 2c 20 70 46 fset=%lld\n", pF
13920 69 6c 65 2d 3e 68 2c 20 69 4f 66 66 73 65 74 29 ile->h, iOffset)
13930 29 3b 0a 0a 20 20 75 70 70 65 72 42 69 74 73 20 );.. upperBits
13940 3d 20 28 4c 4f 4e 47 29 28 28 69 4f 66 66 73 65 = (LONG)((iOffse
13950 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 t>>32) & 0x7ffff
13960 66 66 66 29 3b 0a 20 20 6c 6f 77 65 72 42 69 74 fff);. lowerBit
13970 73 20 3d 20 28 4c 4f 4e 47 29 28 69 4f 66 66 73 s = (LONG)(iOffs
13980 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29 et & 0xffffffff)
13990 3b 0a 0a 20 20 2f 2a 20 41 50 49 20 6f 64 64 69 ;.. /* API oddi
139a0 74 79 3a 20 49 66 20 73 75 63 63 65 73 73 66 75 ty: If successfu
139b0 6c 2c 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 l, SetFilePointe
139c0 72 28 29 20 72 65 74 75 72 6e 73 20 61 20 64 77 r() returns a dw
139d0 6f 72 64 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e ord. ** contain
139e0 69 6e 67 20 74 68 65 20 6c 6f 77 65 72 20 33 32 ing the lower 32
139f0 2d 62 69 74 73 20 6f 66 20 74 68 65 20 6e 65 77 -bits of the new
13a00 20 66 69 6c 65 2d 6f 66 66 73 65 74 2e 20 4f 72 file-offset. Or
13a10 2c 20 69 66 20 69 74 20 66 61 69 6c 73 2c 0a 20 , if it fails,.
13a20 20 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 49 ** it returns I
13a30 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f NVALID_SET_FILE_
13a40 50 4f 49 4e 54 45 52 2e 20 48 6f 77 65 76 65 72 POINTER. However
13a50 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 4d 53 according to MS
13a60 44 4e 2c 0a 20 20 2a 2a 20 49 4e 56 41 4c 49 44 DN,. ** INVALID
13a70 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 _SET_FILE_POINTE
13a80 52 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 61 20 R may also be a
13a90 76 61 6c 69 64 20 6e 65 77 20 6f 66 66 73 65 74 valid new offset
13aa0 2e 20 53 6f 20 74 6f 20 64 65 74 65 72 6d 69 6e . So to determin
13ab0 65 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 61 e. ** whether a
13ac0 6e 20 65 72 72 6f 72 20 68 61 73 20 61 63 74 75 n error has actu
13ad0 61 6c 6c 79 20 6f 63 63 75 72 72 65 64 2c 20 69 ally occurred, i
13ae0 74 20 69 73 20 61 6c 73 6f 20 6e 65 63 65 73 73 t is also necess
13af0 61 72 79 20 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a ary to call. **
13b00 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2e GetLastError().
13b10 0a 20 20 2a 2f 0a 20 20 64 77 52 65 74 20 3d 20 . */. dwRet =
13b20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 osSetFilePointer
13b30 28 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 77 65 72 (pFile->h, lower
13b40 42 69 74 73 2c 20 26 75 70 70 65 72 42 69 74 73 Bits, &upperBits
13b50 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a , FILE_BEGIN);..
13b60 20 20 69 66 28 20 28 64 77 52 65 74 3d 3d 49 4e if( (dwRet==IN
13b70 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 VALID_SET_FILE_P
13b80 4f 49 4e 54 45 52 0a 20 20 20 20 20 20 26 26 20 OINTER. &&
13b90 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 ((lastErrno = os
13ba0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 GetLastError())!
13bb0 3d 4e 4f 5f 45 52 52 4f 52 29 29 20 29 7b 0a 20 =NO_ERROR)) ){.
13bc0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 pFile->lastEr
13bd0 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b rno = lastErrno;
13be0 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 . winLogError
13bf0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 (SQLITE_IOERR_SE
13c00 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 EK, pFile->lastE
13c10 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 rrno,.
13c20 20 20 20 20 20 20 22 77 69 6e 53 65 65 6b 46 69 "winSeekFi
13c30 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 le", pFile->zPat
13c40 68 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 h);. OSTRACE(
13c50 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 ("SEEK file=%p,
13c60 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f rc=SQLITE_IOERR_
13c70 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e SEEK\n", pFile->
13c80 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 h));. return
13c90 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 1;. }.. OSTRAC
13ca0 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 E(("SEEK file=%p
13cb0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e , rc=SQLITE_OK\n
13cc0 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 ", pFile->h));.
13cd0 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6c 73 65 return 0;.#else
13ce0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 61 6d 65 20 . /*. ** Same
13cf0 61 73 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74 as above, except
13d00 20 74 68 61 74 20 74 68 69 73 20 69 6d 70 6c 65 that this imple
13d10 6d 65 6e 74 61 74 69 6f 6e 20 77 6f 72 6b 73 20 mentation works
13d20 66 6f 72 20 57 69 6e 52 54 2e 0a 20 20 2a 2f 0a for WinRT.. */.
13d30 0a 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 . LARGE_INTEGER
13d40 20 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 x;
13d50 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 66 /* The new of
13d60 66 73 65 74 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 fset */. BOOL b
13d70 52 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 Ret;
13d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c /* Val
13d90 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 ue returned by S
13da0 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 28 etFilePointerEx(
13db0 29 20 2a 2f 0a 0a 20 20 78 2e 51 75 61 64 50 61 ) */.. x.QuadPa
13dc0 72 74 20 3d 20 69 4f 66 66 73 65 74 3b 0a 20 20 rt = iOffset;.
13dd0 62 52 65 74 20 3d 20 6f 73 53 65 74 46 69 6c 65 bRet = osSetFile
13de0 50 6f 69 6e 74 65 72 45 78 28 70 46 69 6c 65 2d PointerEx(pFile-
13df0 3e 68 2c 20 78 2c 20 30 2c 20 46 49 4c 45 5f 42 >h, x, 0, FILE_B
13e00 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 21 62 52 EGIN);.. if(!bR
13e10 65 74 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e et){. pFile->
13e20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 lastErrno = osGe
13e30 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 tLastError();.
13e40 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 winLogError(SQ
13e50 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c LITE_IOERR_SEEK,
13e60 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e pFile->lastErrn
13e70 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 o,.
13e80 20 20 20 22 77 69 6e 53 65 65 6b 46 69 6c 65 22 "winSeekFile"
13e90 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b , pFile->zPath);
13ea0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 . OSTRACE(("S
13eb0 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d EEK file=%p, rc=
13ec0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 SQLITE_IOERR_SEE
13ed0 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 K\n", pFile->h))
13ee0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a ;. return 1;.
13ef0 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 }.. OSTRACE((
13f00 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72 "SEEK file=%p, r
13f10 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 c=SQLITE_OK\n",
13f20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 pFile->h));. re
13f30 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d turn 0;.#endif.}
13f40 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 ..#if SQLITE_MAX
13f50 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 20 _MMAP_SIZE>0./*
13f60 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 Forward referenc
13f70 65 73 20 74 6f 20 56 46 53 20 68 65 6c 70 65 72 es to VFS helper
13f80 20 6d 65 74 68 6f 64 73 20 75 73 65 64 20 66 6f methods used fo
13f90 72 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 r memory mapped
13fa0 66 69 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 files */.static
13fb0 69 6e 74 20 77 69 6e 4d 61 70 66 69 6c 65 28 77 int winMapfile(w
13fc0 69 6e 46 69 6c 65 2a 2c 20 73 71 6c 69 74 65 33 inFile*, sqlite3
13fd0 5f 69 6e 74 36 34 29 3b 0a 73 74 61 74 69 63 20 _int64);.static
13fe0 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 int winUnmapfile
13ff0 28 77 69 6e 46 69 6c 65 2a 29 3b 0a 23 65 6e 64 (winFile*);.#end
14000 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 if../*.** Close
14010 61 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 74 a file..**.** It
14020 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 68 61 is reported tha
14030 74 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 t an attempt to
14040 63 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6d close a handle m
14050 69 67 68 74 20 73 6f 6d 65 74 69 6d 65 73 0a 2a ight sometimes.*
14060 2a 20 66 61 69 6c 2e 20 20 54 68 69 73 20 69 73 * fail. This is
14070 20 61 20 76 65 72 79 20 75 6e 72 65 61 73 6f 6e a very unreason
14080 61 62 6c 65 20 72 65 73 75 6c 74 2c 20 62 75 74 able result, but
14090 20 57 69 6e 64 6f 77 73 20 69 73 20 6e 6f 74 6f Windows is noto
140a0 72 69 6f 75 73 0a 2a 2a 20 66 6f 72 20 62 65 69 rious.** for bei
140b0 6e 67 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 ng unreasonable
140c0 73 6f 20 49 20 64 6f 20 6e 6f 74 20 64 6f 75 62 so I do not doub
140d0 74 20 74 68 61 74 20 69 74 20 6d 69 67 68 74 20 t that it might
140e0 68 61 70 70 65 6e 2e 20 20 49 66 0a 2a 2a 20 74 happen. If.** t
140f0 68 65 20 63 6c 6f 73 65 20 66 61 69 6c 73 2c 20 he close fails,
14100 77 65 20 70 61 75 73 65 20 66 6f 72 20 31 30 30 we pause for 100
14110 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e milliseconds an
14120 64 20 74 72 79 20 61 67 61 69 6e 2e 20 20 41 73 d try again. As
14130 0a 2a 2a 20 6d 61 6e 79 20 61 73 20 4d 58 5f 43 .** many as MX_C
14140 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 61 74 74 LOSE_ATTEMPT att
14150 65 6d 70 74 73 20 74 6f 20 63 6c 6f 73 65 20 74 empts to close t
14160 68 65 20 68 61 6e 64 6c 65 20 61 72 65 20 6d 61 he handle are ma
14170 64 65 20 62 65 66 6f 72 65 0a 2a 2a 20 67 69 76 de before.** giv
14180 69 6e 67 20 75 70 20 61 6e 64 20 72 65 74 75 72 ing up and retur
14190 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a ning an error..*
141a0 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 43 4c 4f /.#define MX_CLO
141b0 53 45 5f 41 54 54 45 4d 50 54 20 33 0a 73 74 61 SE_ATTEMPT 3.sta
141c0 74 69 63 20 69 6e 74 20 77 69 6e 43 6c 6f 73 65 tic int winClose
141d0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 (sqlite3_file *i
141e0 64 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 63 6e d){. int rc, cn
141f0 74 20 3d 20 30 3b 0a 20 20 77 69 6e 46 69 6c 65 t = 0;. winFile
14200 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 *pFile = (winFi
14210 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 le*)id;.. asser
14220 74 28 20 69 64 21 3d 30 20 29 3b 0a 23 69 66 6e t( id!=0 );.#ifn
14230 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f def SQLITE_OMIT_
14240 57 41 4c 0a 20 20 61 73 73 65 72 74 28 20 70 46 WAL. assert( pF
14250 69 6c 65 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a ile->pShm==0 );.
14260 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 #endif. assert(
14270 20 70 46 69 6c 65 2d 3e 68 21 3d 4e 55 4c 4c 20 pFile->h!=NULL
14280 26 26 20 70 46 69 6c 65 2d 3e 68 21 3d 49 4e 56 && pFile->h!=INV
14290 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 ALID_HANDLE_VALU
142a0 45 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 E );. OSTRACE((
142b0 22 43 4c 4f 53 45 20 70 69 64 3d 25 6c 75 2c 20 "CLOSE pid=%lu,
142c0 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 pFile=%p, file=%
142d0 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 p\n",.
142e0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f osGetCurrentPro
142f0 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c cessId(), pFile,
14300 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 0a 23 69 pFile->h));..#i
14310 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 f SQLITE_MAX_MMA
14320 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e 55 6e P_SIZE>0. winUn
14330 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a mapfile(pFile);.
14340 23 65 6e 64 69 66 0a 0a 20 20 64 6f 7b 0a 20 20 #endif.. do{.
14350 20 20 72 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61 rc = osCloseHa
14360 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a ndle(pFile->h);.
14370 20 20 20 20 2f 2a 20 53 69 6d 75 6c 61 74 65 49 /* SimulateI
14380 4f 45 72 72 6f 72 28 20 72 63 3d 30 3b 20 63 6e OError( rc=0; cn
14390 74 3d 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d t=MX_CLOSE_ATTEM
143a0 50 54 3b 20 29 3b 20 2a 2f 0a 20 20 7d 77 68 69 PT; ); */. }whi
143b0 6c 65 28 20 72 63 3d 3d 30 20 26 26 20 2b 2b 63 le( rc==0 && ++c
143c0 6e 74 20 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 nt < MX_CLOSE_AT
143d0 54 45 4d 50 54 20 26 26 20 28 73 71 6c 69 74 65 TEMPT && (sqlite
143e0 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 30 3_win32_sleep(10
143f0 30 29 2c 20 31 29 20 29 3b 0a 23 69 66 20 53 51 0), 1) );.#if SQ
14400 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23 64 LITE_OS_WINCE.#d
14410 65 66 69 6e 65 20 57 49 4e 43 45 5f 44 45 4c 45 efine WINCE_DELE
14420 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20 33 0a TION_ATTEMPTS 3.
14430 20 20 7b 0a 20 20 20 20 77 69 6e 56 66 73 41 70 {. winVfsAp
14440 70 44 61 74 61 20 2a 70 41 70 70 44 61 74 61 20 pData *pAppData
14450 3d 20 28 77 69 6e 56 66 73 41 70 70 44 61 74 61 = (winVfsAppData
14460 2a 29 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 70 *)pFile->pVfs->p
14470 41 70 70 44 61 74 61 3b 0a 20 20 20 20 69 66 28 AppData;. if(
14480 20 70 41 70 70 44 61 74 61 3d 3d 4e 55 4c 4c 20 pAppData==NULL
14490 7c 7c 20 21 70 41 70 70 44 61 74 61 2d 3e 62 4e || !pAppData->bN
144a0 6f 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 77 oLock ){. w
144b0 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 inceDestroyLock(
144c0 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 pFile);. }.
144d0 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a }. if( pFile->z
144e0 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 29 7b DeleteOnClose ){
144f0 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 . int cnt = 0
14500 3b 0a 20 20 20 20 77 68 69 6c 65 28 0a 20 20 20 ;. while(.
14510 20 20 20 20 20 20 20 20 6f 73 44 65 6c 65 74 65 osDelete
14520 46 69 6c 65 57 28 70 46 69 6c 65 2d 3e 7a 44 65 FileW(pFile->zDe
14530 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a leteOnClose)==0.
14540 20 20 20 20 20 20 20 20 26 26 20 6f 73 47 65 74 && osGet
14550 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 FileAttributesW(
14560 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e pFile->zDeleteOn
14570 43 6c 6f 73 65 29 21 3d 30 78 66 66 66 66 66 66 Close)!=0xffffff
14580 66 66 0a 20 20 20 20 20 20 20 20 26 26 20 63 6e ff. && cn
14590 74 2b 2b 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45 t++ < WINCE_DELE
145a0 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20 TION_ATTEMPTS.
145b0 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 ){. sqli
145c0 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 te3_win32_sleep(
145d0 31 30 30 29 3b 20 20 2f 2a 20 57 61 69 74 20 61 100); /* Wait a
145e0 20 6c 69 74 74 6c 65 20 62 65 66 6f 72 65 20 74 little before t
145f0 72 79 69 6e 67 20 61 67 61 69 6e 20 2a 2f 0a 20 rying again */.
14600 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 }. sqlite3
14610 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 7a 44 65 _free(pFile->zDe
14620 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 leteOnClose);.
14630 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 }.#endif. if( r
14640 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e c ){. pFile->
14650 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 h = NULL;. }.
14660 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b OpenCounter(-1);
14670 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f . OSTRACE(("CLO
14680 53 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c SE pid=%lu, pFil
14690 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 e=%p, file=%p, r
146a0 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 c=%s\n",.
146b0 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 osGetCurrent
146c0 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 ProcessId(), pFi
146d0 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 le, pFile->h, rc
146e0 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 ? "ok" : "faile
146f0 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 d"));. return r
14700 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 c ? SQLITE_OK.
14710 20 20 20 20 20 20 20 20 20 20 3a 20 77 69 6e 4c : winL
14720 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 ogError(SQLITE_I
14730 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 6f 73 47 65 OERR_CLOSE, osGe
14740 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 tLastError(),.
14750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
14760 20 20 20 20 20 20 20 20 22 77 69 6e 43 6c 6f 73 "winClos
14770 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 e", pFile->zPath
14780 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 );.}../*.** Read
14790 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c data from a fil
147a0 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e e into a buffer.
147b0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f Return SQLITE_
147c0 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 OK if all.** byt
147d0 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63 es were read suc
147e0 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 cessfully and SQ
147f0 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e LITE_IOERR if an
14800 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 ything goes.** w
14810 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 rong..*/.static
14820 69 6e 74 20 77 69 6e 52 65 61 64 28 0a 20 20 73 int winRead(. s
14830 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c qlite3_file *id,
14840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c /* Fil
14850 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a e to read from *
14860 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 /. void *pBuf,
14870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
14880 2a 20 57 72 69 74 65 20 63 6f 6e 74 65 6e 74 20 * Write content
14890 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 into this buffer
148a0 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 */. int amt,
148b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
148c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 /* Number of by
148d0 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 tes to read */.
148e0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f sqlite3_int64 o
148f0 66 66 73 65 74 20 20 20 20 20 20 20 2f 2a 20 42 ffset /* B
14900 65 67 69 6e 20 72 65 61 64 69 6e 67 20 61 74 20 egin reading at
14910 74 68 69 73 20 6f 66 66 73 65 74 20 2a 2f 0a 29 this offset */.)
14920 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 {.#if !SQLITE_OS
14930 5f 57 49 4e 43 45 20 26 26 20 21 64 65 66 69 6e _WINCE && !defin
14940 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f ed(SQLITE_WIN32_
14950 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a 20 NO_OVERLAPPED).
14960 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65 72 OVERLAPPED over
14970 6c 61 70 70 65 64 3b 20 20 20 20 20 20 20 20 20 lapped;
14980 20 2f 2a 20 54 68 65 20 6f 66 66 73 65 74 20 66 /* The offset f
14990 6f 72 20 52 65 61 64 46 69 6c 65 2e 20 2a 2f 0a or ReadFile. */.
149a0 23 65 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 #endif. winFile
149b0 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 *pFile = (winFi
149c0 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 66 69 6c 65 le*)id; /* file
149d0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 44 57 4f handle */. DWO
149e0 52 44 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20 RD nRead;
149f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
14a00 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 Number of bytes
14a10 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72 actually read fr
14a20 6f 6d 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 om file */. int
14a30 20 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20 nRetry = 0;
14a40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
14a50 4e 75 6d 62 65 72 20 6f 66 20 72 65 74 72 79 73 Number of retrys
14a60 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 */.. assert( i
14a70 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 d!=0 );. assert
14a80 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73 ( amt>0 );. ass
14a90 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 ert( offset>=0 )
14aa0 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 ;. SimulateIOEr
14ab0 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 ror(return SQLIT
14ac0 45 5f 49 4f 45 52 52 5f 52 45 41 44 29 3b 0a 20 E_IOERR_READ);.
14ad0 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20 OSTRACE(("READ
14ae0 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 pid=%lu, pFile=%
14af0 70 2c 20 66 69 6c 65 3d 25 70 2c 20 62 75 66 66 p, file=%p, buff
14b00 65 72 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d 25 64 er=%p, amount=%d
14b10 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 , ". "
14b20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 6c 6f 63 offset=%lld, loc
14b30 6b 3d 25 64 5c 6e 22 2c 20 6f 73 47 65 74 43 75 k=%d\n", osGetCu
14b40 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 rrentProcessId()
14b50 2c 20 70 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 , pFile,.
14b60 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 42 pFile->h, pB
14b70 75 66 2c 20 61 6d 74 2c 20 6f 66 66 73 65 74 2c uf, amt, offset,
14b80 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 pFile->locktype
14b90 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f ));..#if SQLITE_
14ba0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a MAX_MMAP_SIZE>0.
14bb0 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61 /* Deal with a
14bc0 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20 72 s much of this r
14bd0 65 61 64 20 72 65 71 75 65 73 74 20 61 73 20 70 ead request as p
14be0 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73 ossible by trans
14bf0 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 fering. ** data
14c00 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 from the memory
14c10 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d mapping using m
14c20 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 emcpy(). */. i
14c30 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d f( offset<pFile-
14c40 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 >mmapSize ){.
14c50 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 if( offset+amt
14c60 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 <= pFile->mmapSi
14c70 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 ze ){. memc
14c80 70 79 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a py(pBuf, &((u8 *
14c90 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 )(pFile->pMapReg
14ca0 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 61 ion))[offset], a
14cb0 6d 74 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 mt);. OSTRA
14cc0 43 45 28 28 22 52 45 41 44 2d 4d 4d 41 50 20 70 CE(("READ-MMAP p
14cd0 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 id=%lu, pFile=%p
14ce0 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 , file=%p, rc=SQ
14cf0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 LITE_OK\n",.
14d00 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 osGet
14d10 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 CurrentProcessId
14d20 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 (), pFile, pFile
14d30 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 ->h));. ret
14d40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 urn SQLITE_OK;.
14d50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
14d60 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e 74 int nCopy = (int
14d70 29 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a )(pFile->mmapSiz
14d80 65 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 e - offset);.
14d90 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 memcpy(pBuf,
14da0 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e &((u8 *)(pFile->
14db0 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 pMapRegion))[off
14dc0 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 set], nCopy);.
14dd0 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 pBuf = &((u8
14de0 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b *)pBuf)[nCopy];
14df0 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 . amt -= nC
14e00 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 opy;. offse
14e10 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 t += nCopy;.
14e20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 }. }.#endif..#i
14e30 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 f SQLITE_OS_WINC
14e40 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c E || defined(SQL
14e50 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 ITE_WIN32_NO_OVE
14e60 52 4c 41 50 50 45 44 29 0a 20 20 69 66 28 20 77 RLAPPED). if( w
14e70 69 6e 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 inSeekFile(pFile
14e80 2c 20 6f 66 66 73 65 74 29 20 29 7b 0a 20 20 20 , offset) ){.
14e90 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20 OSTRACE(("READ
14ea0 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 pid=%lu, pFile=%
14eb0 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 p, file=%p, rc=S
14ec0 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22 2c 0a 20 QLITE_FULL\n",.
14ed0 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 osGe
14ee0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 tCurrentProcessI
14ef0 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c d(), pFile, pFil
14f00 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 e->h));. retu
14f10 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a rn SQLITE_FULL;.
14f20 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 }. while( !os
14f30 52 65 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e ReadFile(pFile->
14f40 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e h, pBuf, amt, &n
14f50 52 65 61 64 2c 20 30 29 20 29 7b 0a 23 65 6c 73 Read, 0) ){.#els
14f60 65 0a 20 20 6d 65 6d 73 65 74 28 26 6f 76 65 72 e. memset(&over
14f70 6c 61 70 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f lapped, 0, sizeo
14f80 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a f(OVERLAPPED));.
14f90 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 overlapped.Off
14fa0 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 set = (LONG)(off
14fb0 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66 set & 0xffffffff
14fc0 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65 64 2e );. overlapped.
14fd0 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f OffsetHigh = (LO
14fe0 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 NG)((offset>>32)
14ff0 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a & 0x7fffffff);.
15000 20 20 77 68 69 6c 65 28 20 21 6f 73 52 65 61 64 while( !osRead
15010 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 File(pFile->h, p
15020 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64 Buf, amt, &nRead
15030 2c 20 26 6f 76 65 72 6c 61 70 70 65 64 29 20 26 , &overlapped) &
15040 26 0a 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 &. osGet
15050 4c 61 73 74 45 72 72 6f 72 28 29 21 3d 45 52 52 LastError()!=ERR
15060 4f 52 5f 48 41 4e 44 4c 45 5f 45 4f 46 20 29 7b OR_HANDLE_EOF ){
15070 0a 23 65 6e 64 69 66 0a 20 20 20 20 44 57 4f 52 .#endif. DWOR
15080 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 D lastErrno;.
15090 20 69 66 28 20 77 69 6e 52 65 74 72 79 49 6f 65 if( winRetryIoe
150a0 72 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73 rr(&nRetry, &las
150b0 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e tErrno) ) contin
150c0 75 65 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c ue;. pFile->l
150d0 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 astErrno = lastE
150e0 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43 rrno;. OSTRAC
150f0 45 28 28 22 52 45 41 44 20 70 69 64 3d 25 6c 75 E(("READ pid=%lu
15100 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 , pFile=%p, file
15110 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 =%p, rc=SQLITE_I
15120 4f 45 52 52 5f 52 45 41 44 5c 6e 22 2c 0a 20 20 OERR_READ\n",.
15130 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 osGet
15140 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 CurrentProcessId
15150 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 (), pFile, pFile
15160 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 ->h));. retur
15170 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 n winLogError(SQ
15180 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 2c LITE_IOERR_READ,
15190 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e pFile->lastErrn
151a0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 o,.
151b0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 52 65 "winRe
151c0 61 64 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 ad", pFile->zPat
151d0 68 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 4c 6f 67 h);. }. winLog
151e0 49 6f 65 72 72 28 6e 52 65 74 72 79 2c 20 5f 5f Ioerr(nRetry, __
151f0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 69 66 28 20 6e LINE__);. if( n
15200 52 65 61 64 3c 28 44 57 4f 52 44 29 61 6d 74 20 Read<(DWORD)amt
15210 29 7b 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 ){. /* Unread
15220 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 parts of the bu
15230 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 ffer must be zer
15240 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 o-filled */.
15250 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 memset(&((char*)
15260 70 42 75 66 29 5b 6e 52 65 61 64 5d 2c 20 30 2c pBuf)[nRead], 0,
15270 20 61 6d 74 2d 6e 52 65 61 64 29 3b 0a 20 20 20 amt-nRead);.
15280 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20 OSTRACE(("READ
15290 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 pid=%lu, pFile=%
152a0 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 p, file=%p, rc=S
152b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 QLITE_IOERR_SHOR
152c0 54 5f 52 45 41 44 5c 6e 22 2c 0a 20 20 20 20 20 T_READ\n",.
152d0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 osGetCur
152e0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c rentProcessId(),
152f0 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 pFile, pFile->h
15300 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 ));. return S
15310 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 QLITE_IOERR_SHOR
15320 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 4f T_READ;. }.. O
15330 53 54 52 41 43 45 28 28 22 52 45 41 44 20 70 69 STRACE(("READ pi
15340 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c d=%lu, pFile=%p,
15350 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c file=%p, rc=SQL
15360 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 ITE_OK\n",.
15370 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 osGetCurre
15380 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 ntProcessId(), p
15390 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 File, pFile->h))
153a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 ;. return SQLIT
153b0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 E_OK;.}../*.** W
153c0 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 rite data from a
153d0 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 buffer into a f
153e0 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c ile. Return SQL
153f0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 ITE_OK on succes
15400 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 s.** or some oth
15410 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e er error code on
15420 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 failure..*/.sta
15430 74 69 63 20 69 6e 74 20 77 69 6e 57 72 69 74 65 tic int winWrite
15440 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 (. sqlite3_file
15450 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 *id,
15460 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 77 /* File to w
15470 72 69 74 65 20 69 6e 74 6f 20 2a 2f 0a 20 20 63 rite into */. c
15480 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c onst void *pBuf,
15490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
154a0 2a 20 54 68 65 20 62 79 74 65 73 20 74 6f 20 62 * The bytes to b
154b0 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 e written */. i
154c0 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 nt amt,
154d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
154e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 * Number of byte
154f0 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 s to write */.
15500 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 sqlite3_int64 of
15510 66 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20 fset
15520 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 /* Offset into t
15530 68 65 20 66 69 6c 65 20 74 6f 20 62 65 67 69 6e he file to begin
15540 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a 29 writing at */.)
15550 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 {. int rc = 0;
15560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15570 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 65 /* True if e
15580 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 rror has occurre
15590 64 2c 20 65 6c 73 65 20 66 61 6c 73 65 20 2a 2f d, else false */
155a0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c . winFile *pFil
155b0 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 e = (winFile*)id
155c0 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c ; /* File handl
155d0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72 e */. int nRetr
155e0 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 y = 0;
155f0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 /* Number
15600 20 6f 66 20 72 65 74 72 69 65 73 20 2a 2f 0a 0a of retries */..
15610 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 assert( amt>0
15620 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 );. assert( pFi
15630 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 le );. Simulate
15640 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 IOError(return S
15650 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 QLITE_IOERR_WRIT
15660 45 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 E);. SimulateDi
15670 73 6b 66 75 6c 6c 45 72 72 6f 72 28 72 65 74 75 skfullError(retu
15680 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 3b rn SQLITE_FULL);
15690 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 .. OSTRACE(("WR
156a0 49 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 ITE pid=%lu, pFi
156b0 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 le=%p, file=%p,
156c0 62 75 66 66 65 72 3d 25 70 2c 20 61 6d 6f 75 6e buffer=%p, amoun
156d0 74 3d 25 64 2c 20 22 0a 20 20 20 20 20 20 20 20 t=%d, ".
156e0 20 20 20 22 6f 66 66 73 65 74 3d 25 6c 6c 64 2c "offset=%lld,
156f0 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 6f 73 47 lock=%d\n", osG
15700 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 etCurrentProcess
15710 49 64 28 29 2c 20 70 46 69 6c 65 2c 0a 20 20 20 Id(), pFile,.
15720 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 pFile->h
15730 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 6f 66 66 , pBuf, amt, off
15740 73 65 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b set, pFile->lock
15750 74 79 70 65 29 29 3b 0a 0a 23 69 66 20 64 65 66 type));..#if def
15760 69 6e 65 64 28 53 51 4c 49 54 45 5f 4d 4d 41 50 ined(SQLITE_MMAP
15770 5f 52 45 41 44 57 52 49 54 45 29 20 26 26 20 53 _READWRITE) && S
15780 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 QLITE_MAX_MMAP_S
15790 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 IZE>0. /* Deal
157a0 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 with as much of
157b0 74 68 69 73 20 77 72 69 74 65 20 72 65 71 75 65 this write reque
157c0 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 st as possible b
157d0 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 y transfering.
157e0 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 ** data from the
157f0 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 memory mapping
15800 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 using memcpy().
15810 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 */. if( offset
15820 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 <pFile->mmapSize
15830 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 ){. if( offs
15840 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d et+amt <= pFile-
15850 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 >mmapSize ){.
15860 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 memcpy(&((u8
15870 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 *)(pFile->pMapRe
15880 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 gion))[offset],
15890 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20 pBuf, amt);.
158a0 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 OSTRACE(("WRIT
158b0 45 2d 4d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 E-MMAP pid=%lu,
158c0 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 pFile=%p, file=%
158d0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c p, rc=SQLITE_OK\
158e0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 n",.
158f0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 osGetCurrentP
15900 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c rocessId(), pFil
15910 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 e, pFile->h));.
15920 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 return SQLI
15930 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 TE_OK;. }else
15940 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 {. int nCop
15950 79 20 3d 20 28 69 6e 74 29 28 70 46 69 6c 65 2d y = (int)(pFile-
15960 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 >mmapSize - offs
15970 65 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 et);. memcp
15980 79 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 y(&((u8 *)(pFile
15990 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f ->pMapRegion))[o
159a0 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 6e 43 ffset], pBuf, nC
159b0 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66 opy);. pBuf
159c0 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66 29 = &((u8 *)pBuf)
159d0 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 [nCopy];. a
159e0 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 mt -= nCopy;.
159f0 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f offset += nCo
15a00 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 py;. }. }.#e
15a10 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 ndif..#if SQLITE
15a20 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 64 65 66 _OS_WINCE || def
15a30 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 ined(SQLITE_WIN3
15a40 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29 2_NO_OVERLAPPED)
15a50 0a 20 20 72 63 20 3d 20 77 69 6e 53 65 65 6b 46 . rc = winSeekF
15a60 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 ile(pFile, offse
15a70 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 t);. if( rc==0
15a80 29 7b 0a 23 65 6c 73 65 0a 20 20 7b 0a 23 65 6e ){.#else. {.#en
15a90 64 69 66 0a 23 69 66 20 21 53 51 4c 49 54 45 5f dif.#if !SQLITE_
15aa0 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 64 65 66 OS_WINCE && !def
15ab0 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 ined(SQLITE_WIN3
15ac0 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29 2_NO_OVERLAPPED)
15ad0 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20 . OVERLAPPED
15ae0 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20 20 20 overlapped;
15af0 20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73 65 74 /* The offset
15b00 20 66 6f 72 20 57 72 69 74 65 46 69 6c 65 2e 20 for WriteFile.
15b10 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 75 38 */.#endif. u8
15b20 20 2a 61 52 65 6d 20 3d 20 28 75 38 20 2a 29 70 *aRem = (u8 *)p
15b30 42 75 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 Buf; /* D
15b40 61 74 61 20 79 65 74 20 74 6f 20 62 65 20 77 72 ata yet to be wr
15b50 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 itten */. int
15b60 20 6e 52 65 6d 20 3d 20 61 6d 74 3b 20 20 20 20 nRem = amt;
15b70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 /* Nu
15b80 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 79 65 mber of bytes ye
15b90 74 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 t to be written
15ba0 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6e 57 72 */. DWORD nWr
15bb0 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 ite;
15bc0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 77 72 /* Bytes wr
15bd0 69 74 74 65 6e 20 62 79 20 65 61 63 68 20 57 72 itten by each Wr
15be0 69 74 65 46 69 6c 65 28 29 20 63 61 6c 6c 20 2a iteFile() call *
15bf0 2f 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 /. DWORD last
15c00 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 Errno = NO_ERROR
15c10 3b 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 ; /* Value ret
15c20 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61 73 74 urned by GetLast
15c30 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 23 69 66 20 Error() */..#if
15c40 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 !SQLITE_OS_WINCE
15c50 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c && !defined(SQL
15c60 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 ITE_WIN32_NO_OVE
15c70 52 4c 41 50 50 45 44 29 0a 20 20 20 20 6d 65 6d RLAPPED). mem
15c80 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65 64 2c set(&overlapped,
15c90 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 0, sizeof(OVERL
15ca0 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 65 APPED));. ove
15cb0 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d rlapped.Offset =
15cc0 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 (LONG)(offset &
15cd0 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 0xffffffff);.
15ce0 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 overlapped.Off
15cf0 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 setHigh = (LONG)
15d00 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 ((offset>>32) &
15d10 30 78 37 66 66 66 66 66 66 66 29 3b 0a 23 65 6e 0x7fffffff);.#en
15d20 64 69 66 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 dif.. while(
15d30 6e 52 65 6d 3e 30 20 29 7b 0a 23 69 66 20 53 51 nRem>0 ){.#if SQ
15d40 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c LITE_OS_WINCE ||
15d50 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f defined(SQLITE_
15d60 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 WIN32_NO_OVERLAP
15d70 50 45 44 29 0a 20 20 20 20 20 20 69 66 28 20 21 PED). if( !
15d80 6f 73 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c osWriteFile(pFil
15d90 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d e->h, aRem, nRem
15da0 2c 20 26 6e 57 72 69 74 65 2c 20 30 29 20 29 7b , &nWrite, 0) ){
15db0 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 .#else. if(
15dc0 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28 70 46 !osWriteFile(pF
15dd0 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 ile->h, aRem, nR
15de0 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 26 6f 76 em, &nWrite, &ov
15df0 65 72 6c 61 70 70 65 64 29 20 29 7b 0a 23 65 6e erlapped) ){.#en
15e00 64 69 66 0a 20 20 20 20 20 20 20 20 69 66 28 20 dif. if(
15e10 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 6e winRetryIoerr(&n
15e20 52 65 74 72 79 2c 20 26 6c 61 73 74 45 72 72 6e Retry, &lastErrn
15e30 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 o) ) continue;.
15e40 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 break;.
15e50 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 }. asse
15e60 72 74 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c rt( nWrite==0 ||
15e70 20 6e 57 72 69 74 65 3c 3d 28 44 57 4f 52 44 29 nWrite<=(DWORD)
15e80 6e 52 65 6d 20 29 3b 0a 20 20 20 20 20 20 69 66 nRem );. if
15e90 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 6e ( nWrite==0 || n
15ea0 57 72 69 74 65 3e 28 44 57 4f 52 44 29 6e 52 65 Write>(DWORD)nRe
15eb0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 m ){. las
15ec0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 tErrno = osGetLa
15ed0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 stError();.
15ee0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 break;.
15ef0 7d 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 }.#if !SQLITE_OS
15f00 5f 57 49 4e 43 45 20 26 26 20 21 64 65 66 69 6e _WINCE && !defin
15f10 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f ed(SQLITE_WIN32_
15f20 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a 20 NO_OVERLAPPED).
15f30 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e offset += n
15f40 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6f 76 65 Write;. ove
15f50 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d rlapped.Offset =
15f60 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 (LONG)(offset &
15f70 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 0xffffffff);.
15f80 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f overlapped.O
15f90 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e ffsetHigh = (LON
15fa0 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 G)((offset>>32)
15fb0 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 23 & 0x7fffffff);.#
15fc0 65 6e 64 69 66 0a 20 20 20 20 20 20 61 52 65 6d endif. aRem
15fd0 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 += nWrite;.
15fe0 20 20 6e 52 65 6d 20 2d 3d 20 6e 57 72 69 74 65 nRem -= nWrite
15ff0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 ;. }. if(
16000 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 nRem>0 ){.
16010 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f pFile->lastErrno
16020 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 = lastErrno;.
16030 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 rc = 1;.
16040 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 }. }.. if( rc
16050 29 7b 0a 20 20 20 20 69 66 28 20 20 20 28 20 70 ){. if( ( p
16060 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d File->lastErrno=
16070 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 44 49 =ERROR_HANDLE_DI
16080 53 4b 5f 46 55 4c 4c 20 29 0a 20 20 20 20 20 20 SK_FULL ).
16090 20 7c 7c 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 || ( pFile->las
160a0 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 44 49 tErrno==ERROR_DI
160b0 53 4b 5f 46 55 4c 4c 20 29 29 7b 0a 20 20 20 20 SK_FULL )){.
160c0 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 OSTRACE(("WRIT
160d0 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 E pid=%lu, pFile
160e0 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 =%p, file=%p, rc
160f0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22 2c =SQLITE_FULL\n",
16100 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
16110 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 osGetCurrentProc
16120 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 essId(), pFile,
16130 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 pFile->h));.
16140 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 return winLogE
16150 72 72 6f 72 28 53 51 4c 49 54 45 5f 46 55 4c 4c rror(SQLITE_FULL
16160 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 , pFile->lastErr
16170 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 no,.
16180 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 "wi
16190 6e 57 72 69 74 65 31 22 2c 20 70 46 69 6c 65 2d nWrite1", pFile-
161a0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 >zPath);. }.
161b0 20 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 OSTRACE(("WRI
161c0 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c TE pid=%lu, pFil
161d0 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 e=%p, file=%p, r
161e0 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 c=SQLITE_IOERR_W
161f0 52 49 54 45 5c 6e 22 2c 0a 20 20 20 20 20 20 20 RITE\n",.
16200 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 osGetCurre
16210 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 ntProcessId(), p
16220 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 File, pFile->h))
16230 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e ;. return win
16240 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f LogError(SQLITE_
16250 49 4f 45 52 52 5f 57 52 49 54 45 2c 20 70 46 69 IOERR_WRITE, pFi
16260 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 le->lastErrno,.
16270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16280 20 20 20 20 20 20 22 77 69 6e 57 72 69 74 65 32 "winWrite2
16290 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 ", pFile->zPath)
162a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 ;. }else{. w
162b0 69 6e 4c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72 inLogIoerr(nRetr
162c0 79 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 y, __LINE__);.
162d0 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 }. OSTRACE(("WR
162e0 49 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 ITE pid=%lu, pFi
162f0 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 le=%p, file=%p,
16300 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c rc=SQLITE_OK\n",
16310 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 . osGe
16320 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 tCurrentProcessI
16330 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c d(), pFile, pFil
16340 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e e->h));. return
16350 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f SQLITE_OK;.}../
16360 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e *.** Truncate an
16370 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 open file to a
16380 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a specified size.*
16390 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e /.static int win
163a0 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 Truncate(sqlite3
163b0 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 _file *id, sqlit
163c0 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29 7b e3_int64 nByte){
163d0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c . winFile *pFil
163e0 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 e = (winFile*)id
163f0 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c ; /* File handl
16400 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e e object */. in
16410 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b t rc = SQLITE_OK
16420 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a ; /*
16430 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 6f 72 Return code for
16440 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a this function *
16450 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 /. DWORD lastEr
16460 72 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 rno;.. assert(
16470 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c pFile );. Simul
16480 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 ateIOError(retur
16490 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 n SQLITE_IOERR_T
164a0 52 55 4e 43 41 54 45 29 3b 0a 20 20 4f 53 54 52 RUNCATE);. OSTR
164b0 41 43 45 28 28 22 54 52 55 4e 43 41 54 45 20 70 ACE(("TRUNCATE p
164c0 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 id=%lu, pFile=%p
164d0 2c 20 66 69 6c 65 3d 25 70 2c 20 73 69 7a 65 3d , file=%p, size=
164e0 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 %lld, lock=%d\n"
164f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 ,. osG
16500 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 etCurrentProcess
16510 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 Id(), pFile, pFi
16520 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 2c 20 70 46 le->h, nByte, pF
16530 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b ile->locktype));
16540 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 .. /* If the us
16550 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65 er has configure
16560 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 d a chunk-size f
16570 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72 or this file, tr
16580 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 uncate the. **
16590 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 file so that it
165a0 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69 consists of an i
165b0 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 nteger number of
165c0 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 chunks (i.e. th
165d0 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 e. ** actual fi
165e0 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 le size after th
165f0 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 e operation may
16600 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 be larger than t
16610 68 65 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a he requested. *
16620 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 * size).. */.
16630 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 if( pFile->szChu
16640 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 nk>0 ){. nByt
16650 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46 e = ((nByte + pF
16660 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 ile->szChunk - 1
16670 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b )/pFile->szChunk
16680 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 ) * pFile->szChu
16690 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 nk;. }.. /* Se
166a0 74 45 6e 64 4f 66 46 69 6c 65 28 29 20 72 65 74 tEndOfFile() ret
166b0 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 urns non-zero wh
166c0 65 6e 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f en successful, o
166d0 72 20 7a 65 72 6f 20 77 68 65 6e 20 69 74 20 66 r zero when it f
166e0 61 69 6c 73 2e 20 2a 2f 0a 20 20 69 66 28 20 77 ails. */. if( w
166f0 69 6e 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 inSeekFile(pFile
16700 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20 , nByte) ){.
16710 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 rc = winLogError
16720 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 (SQLITE_IOERR_TR
16730 55 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c UNCATE, pFile->l
16740 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 astErrno,.
16750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 "
16760 77 69 6e 54 72 75 6e 63 61 74 65 31 22 2c 20 70 winTruncate1", p
16770 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 File->zPath);.
16780 7d 65 6c 73 65 20 69 66 28 20 30 3d 3d 6f 73 53 }else if( 0==osS
16790 65 74 45 6e 64 4f 66 46 69 6c 65 28 70 46 69 6c etEndOfFile(pFil
167a0 65 2d 3e 68 29 20 26 26 0a 20 20 20 20 20 20 20 e->h) &&.
167b0 20 20 20 20 20 28 28 6c 61 73 74 45 72 72 6e 6f ((lastErrno
167c0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f = osGetLastErro
167d0 72 28 29 29 21 3d 45 52 52 4f 52 5f 55 53 45 52 r())!=ERROR_USER
167e0 5f 4d 41 50 50 45 44 5f 46 49 4c 45 29 20 29 7b _MAPPED_FILE) ){
167f0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 . pFile->last
16800 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e Errno = lastErrn
16810 6f 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c o;. rc = winL
16820 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 ogError(SQLITE_I
16830 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 70 OERR_TRUNCATE, p
16840 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c File->lastErrno,
16850 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
16860 20 20 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61 "winTrunca
16870 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 te2", pFile->zPa
16880 74 68 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 th);. }..#if SQ
16890 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 LITE_MAX_MMAP_SI
168a0 5a 45 3e 30 0a 20 20 2f 2a 20 49 66 20 74 68 65 ZE>0. /* If the
168b0 20 66 69 6c 65 20 77 61 73 20 74 72 75 6e 63 61 file was trunca
168c0 74 65 64 20 74 6f 20 61 20 73 69 7a 65 20 73 6d ted to a size sm
168d0 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 63 aller than the c
168e0 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 6d 61 urrently. ** ma
168f0 70 70 65 64 20 72 65 67 69 6f 6e 2c 20 72 65 64 pped region, red
16900 75 63 65 20 74 68 65 20 65 66 66 65 63 74 69 76 uce the effectiv
16910 65 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 61 e mapping size a
16920 73 20 77 65 6c 6c 2e 20 53 51 4c 69 74 65 20 77 s well. SQLite w
16930 69 6c 6c 0a 20 20 2a 2a 20 75 73 65 20 72 65 61 ill. ** use rea
16940 64 28 29 20 61 6e 64 20 77 72 69 74 65 28 29 20 d() and write()
16950 74 6f 20 61 63 63 65 73 73 20 64 61 74 61 20 62 to access data b
16960 65 79 6f 6e 64 20 74 68 69 73 20 70 6f 69 6e 74 eyond this point
16970 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 0a 20 20 from now on..
16980 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e */. if( pFile->
16990 70 4d 61 70 52 65 67 69 6f 6e 20 26 26 20 6e 42 pMapRegion && nB
169a0 79 74 65 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 yte<pFile->mmapS
169b0 69 7a 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 ize ){. pFile
169c0 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 42 79 ->mmapSize = nBy
169d0 74 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a te;. }.#endif..
169e0 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e OSTRACE(("TRUN
169f0 43 41 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 CATE pid=%lu, pF
16a00 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c ile=%p, file=%p,
16a10 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 rc=%s\n",.
16a20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 osGetCurre
16a30 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 ntProcessId(), p
16a40 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 File, pFile->h,
16a50 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 sqlite3ErrName(r
16a60 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 c)));. return r
16a70 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c c;.}..#ifdef SQL
16a80 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 ITE_TEST./*.** C
16a90 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 ount the number
16aa0 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 of fullsyncs and
16ab0 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 normal syncs.
16ac0 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 This is used to
16ad0 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e test.** that syn
16ae0 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 cs and fullsyncs
16af0 20 61 72 65 20 6f 63 63 75 72 69 6e 67 20 61 74 are occuring at
16b00 20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 73 the right times
16b10 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 ..*/.int sqlite3
16b20 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b _sync_count = 0;
16b30 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c .int sqlite3_ful
16b40 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b lsync_count = 0;
16b50 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d .#endif../*.** M
16b60 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69 ake sure all wri
16b70 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75 tes to a particu
16b80 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d lar file are com
16b90 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a mitted to disk..
16ba0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 */.static int wi
16bb0 6e 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 nSync(sqlite3_fi
16bc0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 le *id, int flag
16bd0 73 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 s){.#ifndef SQLI
16be0 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 2f 2a 0a TE_NO_SYNC. /*.
16bf0 20 20 2a 2a 20 55 73 65 64 20 6f 6e 6c 79 20 77 ** Used only w
16c00 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 hen SQLITE_NO_SY
16c10 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 NC is not define
16c20 64 2e 0a 20 20 20 2a 2f 0a 20 20 42 4f 4f 4c 20 d.. */. BOOL
16c30 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 rc;.#endif.#if !
16c40 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 defined(NDEBUG)
16c50 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 || !defined(SQLI
16c60 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 7c 7c 20 5c TE_NO_SYNC) || \
16c70 0a 20 20 20 20 64 65 66 69 6e 65 64 28 53 51 4c . defined(SQL
16c80 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 ITE_HAVE_OS_TRAC
16c90 45 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 E). /*. ** Use
16ca0 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f d when SQLITE_NO
16cb0 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 _SYNC is not def
16cc0 69 6e 65 64 20 61 6e 64 20 62 79 20 74 68 65 20 ined and by the
16cd0 61 73 73 65 72 74 28 29 20 61 6e 64 2f 6f 72 0a assert() and/or.
16ce0 20 20 2a 2a 20 4f 53 54 52 41 43 45 28 29 20 6d ** OSTRACE() m
16cf0 61 63 72 6f 73 2e 0a 20 20 20 2a 2f 0a 20 20 77 acros.. */. w
16d00 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 inFile *pFile =
16d10 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 23 65 (winFile*)id;.#e
16d20 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 lse. UNUSED_PAR
16d30 41 4d 45 54 45 52 28 69 64 29 3b 0a 23 65 6e 64 AMETER(id);.#end
16d40 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 if.. assert( pF
16d50 69 6c 65 20 29 3b 0a 20 20 2f 2a 20 43 68 65 63 ile );. /* Chec
16d60 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 k that one of SQ
16d70 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c LITE_SYNC_NORMAL
16d80 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 or FULL was pas
16d90 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 sed */. assert(
16da0 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 (flags&0x0F)==SQ
16db0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c LITE_SYNC_NORMAL
16dc0 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 . || (flags
16dd0 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 &0x0F)==SQLITE_S
16de0 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 YNC_FULL. );..
16df0 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c /* Unix cannot,
16e00 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d but some system
16e10 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c s may return SQL
16e20 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 ITE_FULL from he
16e30 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 re. This. ** li
16e40 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 ne is to test th
16e50 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 at doing so does
16e60 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70 not cause any p
16e70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 roblems.. */.
16e80 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c SimulateDiskfull
16e90 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 Error( return SQ
16ea0 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 LITE_FULL );..
16eb0 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 70 OSTRACE(("SYNC p
16ec0 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 id=%lu, pFile=%p
16ed0 2c 20 66 69 6c 65 3d 25 70 2c 20 66 6c 61 67 73 , file=%p, flags
16ee0 3d 25 78 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c =%x, lock=%d\n",
16ef0 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 . osGe
16f00 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 tCurrentProcessI
16f10 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c d(), pFile, pFil
16f20 65 2d 3e 68 2c 20 66 6c 61 67 73 2c 0a 20 20 20 e->h, flags,.
16f30 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c pFile->l
16f40 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 6e ocktype));..#ifn
16f50 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a def SQLITE_TEST.
16f60 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 UNUSED_PARAMET
16f70 45 52 28 66 6c 61 67 73 29 3b 0a 23 65 6c 73 65 ER(flags);.#else
16f80 0a 20 20 69 66 28 20 28 66 6c 61 67 73 26 30 78 . if( (flags&0x
16f90 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 0F)==SQLITE_SYNC
16fa0 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c _FULL ){. sql
16fb0 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f ite3_fullsync_co
16fc0 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c unt++;. }. sql
16fd0 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b ite3_sync_count+
16fe0 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 +;.#endif.. /*
16ff0 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 If we compiled w
17000 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e ith the SQLITE_N
17010 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 O_SYNC flag, the
17020 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 n syncing is a.
17030 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 ** no-op. */.#
17040 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f ifdef SQLITE_NO_
17050 53 59 4e 43 0a 20 20 4f 53 54 52 41 43 45 28 28 SYNC. OSTRACE((
17060 22 53 59 4e 43 2d 4e 4f 50 20 70 69 64 3d 25 6c "SYNC-NOP pid=%l
17070 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c u, pFile=%p, fil
17080 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f e=%p, rc=SQLITE_
17090 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 OK\n",.
170a0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 osGetCurrentPr
170b0 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 ocessId(), pFile
170c0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 , pFile->h));.
170d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
170e0 3b 0a 23 65 6c 73 65 0a 23 69 66 20 53 51 4c 49 ;.#else.#if SQLI
170f0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 TE_MAX_MMAP_SIZE
17100 3e 30 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e >0. if( pFile->
17110 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a 20 20 pMapRegion ){.
17120 20 20 69 66 28 20 6f 73 46 6c 75 73 68 56 69 65 if( osFlushVie
17130 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 70 wOfFile(pFile->p
17140 4d 61 70 52 65 67 69 6f 6e 2c 20 30 29 20 29 7b MapRegion, 0) ){
17150 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 . OSTRACE((
17160 22 53 59 4e 43 2d 4d 4d 41 50 20 70 69 64 3d 25 "SYNC-MMAP pid=%
17170 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 4d lu, pFile=%p, pM
17180 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 apRegion=%p, ".
17190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 72 "r
171a0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 c=SQLITE_OK\n",
171b0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 osGetCurrentProc
171c0 65 73 73 49 64 28 29 2c 0a 20 20 20 20 20 20 20 essId(),.
171d0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2c 20 70 pFile, p
171e0 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e File->pMapRegion
171f0 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 ));. }else{.
17200 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 pFile->last
17210 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 Errno = osGetLas
17220 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 tError();.
17230 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 2d 4d OSTRACE(("SYNC-M
17240 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 MAP pid=%lu, pFi
17250 6c 65 3d 25 70 2c 20 70 4d 61 70 52 65 67 69 6f le=%p, pMapRegio
17260 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20 20 20 20 n=%p, ".
17270 20 20 20 20 20 20 20 22 72 63 3d 53 51 4c 49 54 "rc=SQLIT
17280 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c E_IOERR_MMAP\n",
17290 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f osGetCurrentPro
172a0 63 65 73 73 49 64 28 29 2c 0a 20 20 20 20 20 20 cessId(),.
172b0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2c 20 pFile,
172c0 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f pFile->pMapRegio
172d0 6e 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 n));. retur
172e0 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 n winLogError(SQ
172f0 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c LITE_IOERR_MMAP,
17300 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e pFile->lastErrn
17310 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 o,.
17320 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e "win
17330 53 79 6e 63 31 22 2c 20 70 46 69 6c 65 2d 3e 7a Sync1", pFile->z
17340 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d Path);. }. }
17350 0a 23 65 6e 64 69 66 0a 20 20 72 63 20 3d 20 6f .#endif. rc = o
17360 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 sFlushFileBuffer
17370 73 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 53 s(pFile->h);. S
17380 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 imulateIOError(
17390 72 63 3d 46 41 4c 53 45 20 29 3b 0a 20 20 69 66 rc=FALSE );. if
173a0 28 20 72 63 20 29 7b 0a 20 20 20 20 4f 53 54 52 ( rc ){. OSTR
173b0 41 43 45 28 28 22 53 59 4e 43 20 70 69 64 3d 25 ACE(("SYNC pid=%
173c0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 lu, pFile=%p, fi
173d0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 le=%p, rc=SQLITE
173e0 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 _OK\n",.
173f0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e osGetCurren
17400 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 tProcessId(), pF
17410 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b ile, pFile->h));
17420 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 . return SQLI
17430 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a TE_OK;. }else{.
17440 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 pFile->lastE
17450 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 rrno = osGetLast
17460 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 4f 53 54 Error();. OST
17470 52 41 43 45 28 28 22 53 59 4e 43 20 70 69 64 3d RACE(("SYNC pid=
17480 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 %lu, pFile=%p, f
17490 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 ile=%p, rc=SQLIT
174a0 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 5c 6e 22 E_IOERR_FSYNC\n"
174b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f ,. o
174c0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 sGetCurrentProce
174d0 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 ssId(), pFile, p
174e0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 File->h));. r
174f0 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f eturn winLogErro
17500 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 r(SQLITE_IOERR_F
17510 53 59 4e 43 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 SYNC, pFile->las
17520 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 tErrno,.
17530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 "
17540 77 69 6e 53 79 6e 63 32 22 2c 20 70 46 69 6c 65 winSync2", pFile
17550 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23 65 ->zPath);. }.#e
17560 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 ndif.}../*.** De
17570 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 termine the curr
17580 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 ent size of a fi
17590 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 le in bytes.*/.s
175a0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c tatic int winFil
175b0 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 eSize(sqlite3_fi
175c0 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f le *id, sqlite3_
175d0 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 int64 *pSize){.
175e0 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 winFile *pFile
175f0 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a = (winFile*)id;.
17600 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 int rc = SQLIT
17610 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 E_OK;.. assert(
17620 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 id!=0 );. asse
17630 72 74 28 20 70 53 69 7a 65 21 3d 30 20 29 3b 0a rt( pSize!=0 );.
17640 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f SimulateIOErro
17650 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f r(return SQLITE_
17660 49 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a 20 20 IOERR_FSTAT);.
17670 4f 53 54 52 41 43 45 28 28 22 53 49 5a 45 20 66 OSTRACE(("SIZE f
17680 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25 70 ile=%p, pSize=%p
17690 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 \n", pFile->h, p
176a0 53 69 7a 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c Size));..#if SQL
176b0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b ITE_OS_WINRT. {
176c0 0a 20 20 20 20 46 49 4c 45 5f 53 54 41 4e 44 41 . FILE_STANDA
176d0 52 44 5f 49 4e 46 4f 20 69 6e 66 6f 3b 0a 20 20 RD_INFO info;.
176e0 20 20 69 66 28 20 6f 73 47 65 74 46 69 6c 65 49 if( osGetFileI
176f0 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 nformationByHand
17700 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 46 leEx(pFile->h, F
17710 69 6c 65 53 74 61 6e 64 61 72 64 49 6e 66 6f 2c ileStandardInfo,
17720 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
17730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17740 20 20 20 20 20 20 26 69 6e 66 6f 2c 20 73 69 7a &info, siz
17750 65 6f 66 28 69 6e 66 6f 29 29 20 29 7b 0a 20 20 eof(info)) ){.
17760 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 69 6e 66 *pSize = inf
17770 6f 2e 45 6e 64 4f 66 46 69 6c 65 2e 51 75 61 64 o.EndOfFile.Quad
17780 50 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b Part;. }else{
17790 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 . pFile->la
177a0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c stErrno = osGetL
177b0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 astError();.
177c0 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 rc = winLogErr
177d0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f or(SQLITE_IOERR_
177e0 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 FSTAT, pFile->la
177f0 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 stErrno,.
17800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17810 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 "winFileSize", p
17820 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 File->zPath);.
17830 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 }. }.#else.
17840 7b 0a 20 20 20 20 44 57 4f 52 44 20 75 70 70 65 {. DWORD uppe
17850 72 42 69 74 73 3b 0a 20 20 20 20 44 57 4f 52 44 rBits;. DWORD
17860 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 20 20 lowerBits;.
17870 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b DWORD lastErrno;
17880 0a 0a 20 20 20 20 6c 6f 77 65 72 42 69 74 73 20 .. lowerBits
17890 3d 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 28 = osGetFileSize(
178a0 70 46 69 6c 65 2d 3e 68 2c 20 26 75 70 70 65 72 pFile->h, &upper
178b0 42 69 74 73 29 3b 0a 20 20 20 20 2a 70 53 69 7a Bits);. *pSiz
178c0 65 20 3d 20 28 28 28 73 71 6c 69 74 65 33 5f 69 e = (((sqlite3_i
178d0 6e 74 36 34 29 75 70 70 65 72 42 69 74 73 29 3c nt64)upperBits)<
178e0 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69 74 73 <32) + lowerBits
178f0 3b 0a 20 20 20 20 69 66 28 20 20 20 28 6c 6f 77 ;. if( (low
17900 65 72 42 69 74 73 20 3d 3d 20 49 4e 56 41 4c 49 erBits == INVALI
17910 44 5f 46 49 4c 45 5f 53 49 5a 45 29 0a 20 20 20 D_FILE_SIZE).
17920 20 20 20 20 26 26 20 28 28 6c 61 73 74 45 72 72 && ((lastErr
17930 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 no = osGetLastEr
17940 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 ror())!=NO_ERROR
17950 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 ) ){. pFile
17960 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 ->lastErrno = la
17970 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 stErrno;. r
17980 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 c = winLogError(
17990 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 SQLITE_IOERR_FST
179a0 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 AT, pFile->lastE
179b0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 rrno,.
179c0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 "wi
179d0 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c nFileSize", pFil
179e0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d e->zPath);. }
179f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 . }.#endif. OS
17a00 54 52 41 43 45 28 28 22 53 49 5a 45 20 66 69 6c TRACE(("SIZE fil
17a10 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25 70 2c 20 e=%p, pSize=%p,
17a20 2a 70 53 69 7a 65 3d 25 6c 6c 64 2c 20 72 63 3d *pSize=%lld, rc=
17a30 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 %s\n",.
17a40 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53 69 7a pFile->h, pSiz
17a50 65 2c 20 2a 70 53 69 7a 65 2c 20 73 71 6c 69 74 e, *pSize, sqlit
17a60 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b e3ErrName(rc)));
17a70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a . return rc;.}.
17a80 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f ./*.** LOCKFILE_
17a90 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 FAIL_IMMEDIATELY
17aa0 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 6f 6e is undefined on
17ab0 20 73 6f 6d 65 20 57 69 6e 64 6f 77 73 20 73 79 some Windows sy
17ac0 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 stems..*/.#ifnde
17ad0 66 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f f LOCKFILE_FAIL_
17ae0 49 4d 4d 45 44 49 41 54 45 4c 59 0a 23 20 64 65 IMMEDIATELY.# de
17af0 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 fine LOCKFILE_FA
17b00 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 31 IL_IMMEDIATELY 1
17b10 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 .#endif..#ifndef
17b20 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 LOCKFILE_EXCLUS
17b30 49 56 45 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e IVE_LOCK.# defin
17b40 65 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 e LOCKFILE_EXCLU
17b50 53 49 56 45 5f 4c 4f 43 4b 20 32 0a 23 65 6e 64 SIVE_LOCK 2.#end
17b60 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 69 73 74 6f 72 if../*.** Histor
17b70 69 63 61 6c 6c 79 2c 20 53 51 4c 69 74 65 20 68 ically, SQLite h
17b80 61 73 20 75 73 65 64 20 62 6f 74 68 20 74 68 65 as used both the
17b90 20 4c 6f 63 6b 46 69 6c 65 20 61 6e 64 20 4c 6f LockFile and Lo
17ba0 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f ckFileEx functio
17bb0 6e 73 2e 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 ns..** When the
17bc0 4c 6f 63 6b 46 69 6c 65 20 66 75 6e 63 74 69 6f LockFile functio
17bd0 6e 20 77 61 73 20 75 73 65 64 2c 20 69 74 20 77 n was used, it w
17be0 61 73 20 61 6c 77 61 79 73 20 65 78 70 65 63 74 as always expect
17bf0 65 64 20 74 6f 20 66 61 69 6c 0a 2a 2a 20 69 6d ed to fail.** im
17c00 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74 68 65 mediately if the
17c10 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 lock could not
17c20 62 65 20 6f 62 74 61 69 6e 65 64 2e 20 20 41 6c be obtained. Al
17c30 73 6f 2c 20 69 74 20 61 6c 77 61 79 73 20 65 78 so, it always ex
17c40 70 65 63 74 65 64 20 74 6f 0a 2a 2a 20 6f 62 74 pected to.** obt
17c50 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65 ain an exclusive
17c60 20 6c 6f 63 6b 2e 20 20 54 68 65 73 65 20 66 6c lock. These fl
17c70 61 67 73 20 61 72 65 20 75 73 65 64 20 77 69 74 ags are used wit
17c80 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 h the LockFileEx
17c90 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 function.** and
17ca0 20 72 65 66 6c 65 63 74 20 74 68 6f 73 65 20 65 reflect those e
17cb0 78 70 65 63 74 61 74 69 6f 6e 73 3b 20 74 68 65 xpectations; the
17cc0 72 65 66 6f 72 65 2c 20 74 68 65 79 20 73 68 6f refore, they sho
17cd0 75 6c 64 20 6e 6f 74 20 62 65 20 63 68 61 6e 67 uld not be chang
17ce0 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 ed..*/.#ifndef S
17cf0 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 QLITE_LOCKFILE_F
17d00 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20 53 51 LAGS.# define SQ
17d10 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c LITE_LOCKFILE_FL
17d20 41 47 53 20 20 20 28 4c 4f 43 4b 46 49 4c 45 5f AGS (LOCKFILE_
17d30 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 FAIL_IMMEDIATELY
17d40 20 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 | \.
17d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17d60 20 20 20 20 20 20 20 4c 4f 43 4b 46 49 4c 45 5f LOCKFILE_
17d70 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a EXCLUSIVE_LOCK).
17d80 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 75 #endif../*.** Cu
17d90 72 72 65 6e 74 6c 79 2c 20 53 51 4c 69 74 65 20 rrently, SQLite
17da0 6e 65 76 65 72 20 63 61 6c 6c 73 20 74 68 65 20 never calls the
17db0 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 LockFileEx funct
17dc0 69 6f 6e 20 77 69 74 68 6f 75 74 20 77 61 6e 74 ion without want
17dd0 69 6e 67 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 ing the.** call
17de0 74 6f 20 66 61 69 6c 20 69 6d 6d 65 64 69 61 74 to fail immediat
17df0 65 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 ely if the lock
17e00 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e cannot be obtain
17e10 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 ed..*/.#ifndef S
17e20 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 QLITE_LOCKFILEEX
17e30 5f 46 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20 _FLAGS.# define
17e40 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 SQLITE_LOCKFILEE
17e50 58 5f 46 4c 41 47 53 20 28 4c 4f 43 4b 46 49 4c X_FLAGS (LOCKFIL
17e60 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 E_FAIL_IMMEDIATE
17e70 4c 59 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a LY).#endif../*.*
17e80 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 61 64 * Acquire a read
17e90 65 72 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66 er lock..** Diff
17ea0 65 72 65 6e 74 20 41 50 49 20 72 6f 75 74 69 6e erent API routin
17eb0 65 73 20 61 72 65 20 63 61 6c 6c 65 64 20 64 65 es are called de
17ec0 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 pending on wheth
17ed0 65 72 20 6f 72 20 6e 6f 74 20 74 68 69 73 0a 2a er or not this.*
17ee0 2a 20 69 73 20 57 69 6e 39 78 20 6f 72 20 57 69 * is Win9x or Wi
17ef0 6e 4e 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 nNT..*/.static i
17f00 6e 74 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 nt winGetReadLoc
17f10 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 k(winFile *pFile
17f20 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 ){. int res;.
17f30 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 4c OSTRACE(("READ-L
17f40 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 OCK file=%p, loc
17f50 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e k=%d\n", pFile->
17f60 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 h, pFile->lockty
17f70 70 65 29 29 3b 0a 20 20 69 66 28 20 6f 73 49 73 pe));. if( osIs
17f80 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 NT() ){.#if SQLI
17f90 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 TE_OS_WINCE.
17fa0 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 /*. ** NOTE:
17fb0 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 Windows CE is ha
17fc0 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c ndled differentl
17fd0 79 20 68 65 72 65 20 64 75 65 20 69 74 73 20 6c y here due its l
17fe0 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 ack of the Win32
17ff0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41 50 . ** AP
18000 49 20 4c 6f 63 6b 46 69 6c 65 45 78 2e 0a 20 20 I LockFileEx..
18010 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 77 */. res = w
18020 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26 70 46 inceLockFile(&pF
18030 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 ile->h, SHARED_F
18040 49 52 53 54 2c 20 30 2c 20 31 2c 20 30 29 3b 0a IRST, 0, 1, 0);.
18050 23 65 6c 73 65 0a 20 20 20 20 72 65 73 20 3d 20 #else. res =
18060 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 winLockFile(&pFi
18070 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f le->h, SQLITE_LO
18080 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c 20 CKFILEEX_FLAGS,
18090 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c SHARED_FIRST, 0,
180a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
180b0 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 SHARED_SI
180c0 5a 45 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 ZE, 0);.#endif.
180d0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 }.#ifdef SQLITE
180e0 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a _WIN32_HAS_ANSI.
180f0 20 20 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 else{. int
18100 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f lk;. sqlite3_
18110 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f randomness(sizeo
18120 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20 20 f(lk), &lk);.
18130 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f pFile->sharedLo
18140 63 6b 42 79 74 65 20 3d 20 28 73 68 6f 72 74 29 ckByte = (short)
18150 28 28 6c 6b 20 26 20 30 78 37 66 66 66 66 66 66 ((lk & 0x7ffffff
18160 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20 f)%(SHARED_SIZE
18170 2d 20 31 29 29 3b 0a 20 20 20 20 72 65 73 20 3d - 1));. res =
18180 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 winLockFile(&pF
18190 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c ile->h, SQLITE_L
181a0 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 OCKFILE_FLAGS,.
181b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
181c0 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 SHARED_FIRS
181d0 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c T+pFile->sharedL
181e0 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 ockByte, 0, 1, 0
181f0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 );. }.#endif.
18200 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29 7b 0a if( res == 0 ){.
18210 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 pFile->lastE
18220 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 rrno = osGetLast
18230 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 2f 2a 20 Error();. /*
18240 4e 6f 20 6e 65 65 64 20 74 6f 20 6c 6f 67 20 61 No need to log a
18250 20 66 61 69 6c 75 72 65 20 74 6f 20 6c 6f 63 6b failure to lock
18260 20 2a 2f 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 */. }. OSTRAC
18270 45 28 28 22 52 45 41 44 2d 4c 4f 43 4b 20 66 69 E(("READ-LOCK fi
18280 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25 64 le=%p, result=%d
18290 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 \n", pFile->h, r
182a0 65 73 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 es));. return r
182b0 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 es;.}../*.** Und
182c0 6f 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a o a readlock.*/.
182d0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e static int winUn
182e0 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77 69 6e lockReadLock(win
182f0 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 File *pFile){.
18300 69 6e 74 20 72 65 73 3b 0a 20 20 44 57 4f 52 44 int res;. DWORD
18310 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 4f 53 lastErrno;. OS
18320 54 52 41 43 45 28 28 22 52 45 41 44 2d 55 4e 4c TRACE(("READ-UNL
18330 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 OCK file=%p, loc
18340 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e k=%d\n", pFile->
18350 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 h, pFile->lockty
18360 70 65 29 29 3b 0a 20 20 69 66 28 20 6f 73 49 73 pe));. if( osIs
18370 4e 54 28 29 20 29 7b 0a 20 20 20 20 72 65 73 20 NT() ){. res
18380 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 = winUnlockFile(
18390 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 &pFile->h, SHARE
183a0 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 D_FIRST, 0, SHAR
183b0 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 7d ED_SIZE, 0);. }
183c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 .#ifdef SQLITE_W
183d0 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 IN32_HAS_ANSI.
183e0 65 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d 20 else{. res =
183f0 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 winUnlockFile(&p
18400 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f File->h, SHARED_
18410 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 FIRST+pFile->sha
18420 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 redLockByte, 0,
18430 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 1, 0);. }.#endi
18440 66 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 26 f. if( res==0 &
18450 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 & ((lastErrno =
18460 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 osGetLastError()
18470 29 21 3d 45 52 52 4f 52 5f 4e 4f 54 5f 4c 4f 43 )!=ERROR_NOT_LOC
18480 4b 45 44 29 20 29 7b 0a 20 20 20 20 70 46 69 6c KED) ){. pFil
18490 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c e->lastErrno = l
184a0 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 astErrno;. wi
184b0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 nLogError(SQLITE
184c0 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 70 _IOERR_UNLOCK, p
184d0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c File->lastErrno,
184e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
184f0 20 22 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c "winUnlockReadL
18500 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 ock", pFile->zPa
18510 74 68 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 th);. }. OSTRA
18520 43 45 28 28 22 52 45 41 44 2d 55 4e 4c 4f 43 4b CE(("READ-UNLOCK
18530 20 66 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74 file=%p, result
18540 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 =%d\n", pFile->h
18550 2c 20 72 65 73 29 29 3b 0a 20 20 72 65 74 75 72 , res));. retur
18560 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 n res;.}../*.**
18570 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 Lock the file wi
18580 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 th the lock spec
18590 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 ified by paramet
185a0 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e er locktype - on
185b0 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c e.** of the foll
185c0 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 owing:.**.**
185d0 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b (1) SHARED_LOCK
185e0 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 .** (2) RESE
185f0 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 RVED_LOCK.**
18600 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 (3) PENDING_LOC
18610 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 K.** (4) EXC
18620 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a LUSIVE_LOCK.**.*
18630 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e * Sometimes when
18640 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 requesting one
18650 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 lock state, addi
18660 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 tional lock stat
18670 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 es.** are insert
18680 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 ed in between.
18690 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 The locking migh
186a0 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 t fail on one of
186b0 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 the later.** tr
186c0 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e ansitions leavin
186d0 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 g the lock state
186e0 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 different from
186f0 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 what it started
18700 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f but.** still sho
18710 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 rt of its goal.
18720 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 The following c
18730 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 hart shows the a
18740 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 llowed.** transi
18750 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e tions and the in
18760 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 serted intermedi
18770 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a ate states:.**.*
18780 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e * UNLOCKED ->
18790 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 SHARED.** SH
187a0 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 ARED -> RESERVED
187b0 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e .** SHARED ->
187c0 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 (PENDING) -> EX
187d0 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 CLUSIVE.** RE
187e0 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 SERVED -> (PENDI
187f0 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 NG) -> EXCLUSIVE
18800 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d .** PENDING -
18810 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a > EXCLUSIVE.**.*
18820 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 * This routine w
18830 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 ill only increas
18840 65 20 61 20 6c 6f 63 6b 2e 20 20 54 68 65 20 77 e a lock. The w
18850 69 6e 55 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 inUnlock() routi
18860 6e 65 0a 2a 2a 20 65 72 61 73 65 73 20 61 6c 6c ne.** erases all
18870 20 6c 6f 63 6b 73 20 61 74 20 6f 6e 63 65 20 61 locks at once a
18880 6e 64 20 72 65 74 75 72 6e 73 20 75 73 20 69 6d nd returns us im
18890 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6c 6f 63 mediately to loc
188a0 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2a king level 0..**
188b0 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 It is not possi
188c0 62 6c 65 20 74 6f 20 6c 6f 77 65 72 20 74 68 65 ble to lower the
188d0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f locking level o
188e0 6e 65 20 73 74 65 70 20 61 74 20 61 20 74 69 6d ne step at a tim
188f0 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d 75 73 74 20 e. You.** must
18900 67 6f 20 73 74 72 61 69 67 68 74 20 74 6f 20 6c go straight to l
18910 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a ocking level 0..
18920 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 */.static int wi
18930 6e 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 nLock(sqlite3_fi
18940 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b le *id, int lock
18950 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 type){. int rc
18960 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 = SQLITE_OK;
18970 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 /* Return code f
18980 72 6f 6d 20 73 75 62 72 6f 75 74 69 6e 65 73 20 rom subroutines
18990 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 */. int res = 1
189a0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 ; /* R
189b0 65 73 75 6c 74 20 6f 66 20 61 20 57 69 6e 64 6f esult of a Windo
189c0 77 73 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a ws lock call */.
189d0 20 20 69 6e 74 20 6e 65 77 4c 6f 63 6b 74 79 70 int newLocktyp
189e0 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 e; /* Set
189f0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 pFile->locktype
18a00 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 62 65 to this value be
18a10 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a fore exiting */.
18a20 20 20 69 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67 int gotPending
18a30 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20 54 72 75 65 Lock = 0;/* True
18a40 20 69 66 20 77 65 20 61 63 71 75 69 72 65 64 20 if we acquired
18a50 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 a PENDING lock t
18a60 68 69 73 20 74 69 6d 65 20 2a 2f 0a 20 20 77 69 his time */. wi
18a70 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 nFile *pFile = (
18a80 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44 winFile*)id;. D
18a90 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d WORD lastErrno =
18aa0 20 4e 4f 5f 45 52 52 4f 52 3b 0a 0a 20 20 61 73 NO_ERROR;.. as
18ab0 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 sert( id!=0 );.
18ac0 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 OSTRACE(("LOCK
18ad0 66 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c 6f 63 6b file=%p, oldLock
18ae0 3d 25 64 28 25 64 29 2c 20 6e 65 77 4c 6f 63 6b =%d(%d), newLock
18af0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 =%d\n",.
18b00 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 pFile->h, pFi
18b10 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 le->locktype, pF
18b20 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 ile->sharedLockB
18b30 79 74 65 2c 20 6c 6f 63 6b 74 79 70 65 29 29 3b yte, locktype));
18b40 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 .. /* If there
18b50 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 is already a loc
18b60 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f k of this type o
18b70 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 r more restricti
18b80 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 4f ve on the. ** O
18b90 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e sFile, do nothin
18ba0 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65 g. Don't use the
18bb0 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 end_lock: exit
18bc0 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 73 71 path, as. ** sq
18bd0 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 lite3OsEnterMute
18be0 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 x() hasn't been
18bf0 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f called yet.. */
18c00 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f . if( pFile->lo
18c10 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 cktype>=locktype
18c20 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 ){. OSTRACE(
18c30 28 22 4c 4f 43 4b 2d 48 45 4c 44 20 66 69 6c 65 ("LOCK-HELD file
18c40 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f =%p, rc=SQLITE_O
18c50 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 K\n", pFile->h))
18c60 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c ;. return SQL
18c70 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f ITE_OK;. }.. /
18c80 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 * Do not allow a
18c90 6e 79 20 6b 69 6e 64 20 6f 66 20 77 72 69 74 65 ny kind of write
18ca0 2d 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 61 64 2d -lock on a read-
18cb0 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 0a 20 20 only database.
18cc0 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d */. if( (pFile-
18cd0 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57 49 4e >ctrlFlags & WIN
18ce0 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 21 3d 30 20 FILE_RDONLY)!=0
18cf0 26 26 20 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 && locktype>=RES
18d00 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 ERVED_LOCK ){.
18d10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
18d20 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a IOERR_LOCK;. }.
18d30 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 . /* Make sure
18d40 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 the locking sequ
18d50 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a ence is correct.
18d60 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 */. assert( p
18d70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d File->locktype!=
18d80 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 NO_LOCK || lockt
18d90 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b ype==SHARED_LOCK
18da0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f );. assert( lo
18db0 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f cktype!=PENDING_
18dc0 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 LOCK );. assert
18dd0 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 ( locktype!=RESE
18de0 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 RVED_LOCK || pFi
18df0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 le->locktype==SH
18e00 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 ARED_LOCK );..
18e10 2f 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45 4e 44 /* Lock the PEND
18e20 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 66 ING_LOCK byte if
18e30 20 77 65 20 6e 65 65 64 20 74 6f 20 61 63 71 75 we need to acqu
18e40 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f ire a PENDING lo
18e50 63 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53 48 41 ck or. ** a SHA
18e60 52 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20 77 65 RED lock. If we
18e70 20 61 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 are acquiring a
18e80 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 SHARED lock, th
18e90 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6f 66 e acquisition of
18ea0 0a 20 20 2a 2a 20 74 68 65 20 50 45 4e 44 49 4e . ** the PENDIN
18eb0 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73 20 74 G_LOCK byte is t
18ec0 65 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f 0a 20 emporary.. */.
18ed0 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 70 newLocktype = p
18ee0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a File->locktype;.
18ef0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 if( pFile->loc
18f00 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 0a 20 ktype==NO_LOCK.
18f10 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65 3d 3d || (locktype==
18f20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 EXCLUSIVE_LOCK &
18f30 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 & pFile->locktyp
18f40 65 3c 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b e<=RESERVED_LOCK
18f50 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 ). ){. int c
18f60 6e 74 20 3d 20 33 3b 0a 20 20 20 20 77 68 69 6c nt = 3;. whil
18f70 65 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72 e( cnt-->0 && (r
18f80 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 es = winLockFile
18f90 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 (&pFile->h, SQLI
18fa0 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 TE_LOCKFILE_FLAG
18fb0 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 S,.
18fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
18fd0 20 20 20 20 20 20 20 20 20 20 20 20 50 45 4e 44 PEND
18fe0 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 ING_BYTE, 0, 1,
18ff0 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 0))==0 ){.
19000 2f 2a 20 54 72 79 20 33 20 74 69 6d 65 73 20 74 /* Try 3 times t
19010 6f 20 67 65 74 20 74 68 65 20 70 65 6e 64 69 6e o get the pendin
19020 67 20 6c 6f 63 6b 2e 20 20 54 68 69 73 20 69 73 g lock. This is
19030 20 6e 65 65 64 65 64 20 74 6f 20 77 6f 72 6b 0a needed to work.
19040 20 20 20 20 20 20 2a 2a 20 61 72 6f 75 6e 64 20 ** around
19050 70 72 6f 62 6c 65 6d 73 20 63 61 75 73 65 64 20 problems caused
19060 62 79 20 69 6e 64 65 78 69 6e 67 20 61 6e 64 2f by indexing and/
19070 6f 72 20 61 6e 74 69 2d 76 69 72 75 73 20 73 6f or anti-virus so
19080 66 74 77 61 72 65 20 6f 6e 0a 20 20 20 20 20 20 ftware on.
19090 2a 2a 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 ** Windows syste
190a0 6d 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 ms.. ** If
190b0 79 6f 75 20 61 72 65 20 75 73 69 6e 67 20 74 68 you are using th
190c0 69 73 20 63 6f 64 65 20 61 73 20 61 20 6d 6f 64 is code as a mod
190d0 65 6c 20 66 6f 72 20 61 6c 74 65 72 6e 61 74 69 el for alternati
190e0 76 65 20 56 46 53 65 73 2c 20 64 6f 20 6e 6f 74 ve VFSes, do not
190f0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 74 . ** copy t
19100 68 69 73 20 72 65 74 72 79 20 6c 6f 67 69 63 2e his retry logic.
19110 20 20 49 74 20 69 73 20 61 20 68 61 63 6b 20 69 It is a hack i
19120 6e 74 65 6e 64 65 64 20 66 6f 72 20 57 69 6e 64 ntended for Wind
19130 6f 77 73 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 ows only..
19140 2a 2f 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 */. lastErr
19150 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 no = osGetLastEr
19160 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54 ror();. OST
19170 52 41 43 45 28 28 22 4c 4f 43 4b 2d 50 45 4e 44 RACE(("LOCK-PEND
19180 49 4e 47 2d 46 41 49 4c 20 66 69 6c 65 3d 25 70 ING-FAIL file=%p
19190 2c 20 63 6f 75 6e 74 3d 25 64 2c 20 72 65 73 75 , count=%d, resu
191a0 6c 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 lt=%d\n",.
191b0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e pFile->
191c0 68 2c 20 63 6e 74 2c 20 72 65 73 29 29 3b 0a 20 h, cnt, res));.
191d0 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 if( lastErr
191e0 6e 6f 3d 3d 45 52 52 4f 52 5f 49 4e 56 41 4c 49 no==ERROR_INVALI
191f0 44 5f 48 41 4e 44 4c 45 20 29 7b 0a 20 20 20 20 D_HANDLE ){.
19200 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 pFile->lastE
19210 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f rrno = lastErrno
19220 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 ;. rc = S
19230 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b QLITE_IOERR_LOCK
19240 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 ;. OSTRAC
19250 45 28 28 22 4c 4f 43 4b 2d 46 41 49 4c 20 66 69 E(("LOCK-FAIL fi
19260 6c 65 3d 25 70 2c 20 63 6f 75 6e 74 3d 25 64 2c le=%p, count=%d,
19270 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 rc=%s\n",.
19280 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c pFil
19290 65 2d 3e 68 2c 20 63 6e 74 2c 20 73 71 6c 69 74 e->h, cnt, sqlit
192a0 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b e3ErrName(rc)));
192b0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 . return
192c0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 rc;. }.
192d0 20 20 69 66 28 20 63 6e 74 20 29 20 73 71 6c 69 if( cnt ) sqli
192e0 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 te3_win32_sleep(
192f0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 1);. }. go
19300 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72 tPendingLock = r
19310 65 73 3b 0a 20 20 20 20 69 66 28 20 21 72 65 73 es;. if( !res
19320 20 29 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 ){. lastEr
19330 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 rno = osGetLastE
19340 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 rror();. }.
19350 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 }.. /* Acquire
19360 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20 a shared lock.
19370 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 */. if( locktyp
19380 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 e==SHARED_LOCK &
19390 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 & res ){. ass
193a0 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b ert( pFile->lock
193b0 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b type==NO_LOCK );
193c0 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 47 65 . res = winGe
193d0 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 tReadLock(pFile)
193e0 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b ;. if( res ){
193f0 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 . newLockty
19400 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b pe = SHARED_LOCK
19410 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 ;. }else{.
19420 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f lastErrno = o
19430 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b sGetLastError();
19440 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a . }. }.. /*
19450 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52 Acquire a RESER
19460 56 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 VED lock. */.
19470 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 if( locktype==RE
19480 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 72 SERVED_LOCK && r
19490 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 es ){. assert
194a0 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 ( pFile->locktyp
194b0 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 e==SHARED_LOCK )
194c0 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c ;. res = winL
194d0 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e ockFile(&pFile->
194e0 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 h, SQLITE_LOCKFI
194f0 4c 45 5f 46 4c 41 47 53 2c 20 52 45 53 45 52 56 LE_FLAGS, RESERV
19500 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 ED_BYTE, 0, 1, 0
19510 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 );. if( res )
19520 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 {. newLockt
19530 79 70 65 20 3d 20 52 45 53 45 52 56 45 44 5f 4c ype = RESERVED_L
19540 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a OCK;. }else{.
19550 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 lastErrno
19560 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 = osGetLastError
19570 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 ();. }. }..
19580 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 50 45 /* Acquire a PE
19590 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a NDING lock. */.
195a0 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d if( locktype==
195b0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 EXCLUSIVE_LOCK &
195c0 26 20 72 65 73 20 29 7b 0a 20 20 20 20 6e 65 77 & res ){. new
195d0 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 Locktype = PENDI
195e0 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f 74 NG_LOCK;. got
195f0 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b PendingLock = 0;
19600 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 . }.. /* Acqui
19610 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 re an EXCLUSIVE
19620 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 lock. */. if(
19630 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 locktype==EXCLUS
19640 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 IVE_LOCK && res
19650 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 ){. assert( p
19660 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d File->locktype>=
19670 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 SHARED_LOCK );.
19680 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f res = winUnlo
19690 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 ckReadLock(pFile
196a0 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e );. res = win
196b0 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d LockFile(&pFile-
196c0 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 >h, SQLITE_LOCKF
196d0 49 4c 45 5f 46 4c 41 47 53 2c 20 53 48 41 52 45 ILE_FLAGS, SHARE
196e0 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20 20 20 D_FIRST, 0,.
196f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
19700 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 SHARED_SIZE, 0
19710 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 );. if( res )
19720 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 {. newLockt
19730 79 70 65 20 3d 20 45 58 43 4c 55 53 49 56 45 5f ype = EXCLUSIVE_
19740 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b LOCK;. }else{
19750 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f . lastErrno
19760 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f = osGetLastErro
19770 72 28 29 3b 0a 20 20 20 20 20 20 77 69 6e 47 65 r();. winGe
19780 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 tReadLock(pFile)
19790 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f ;. }. }.. /
197a0 2a 20 49 66 20 77 65 20 61 72 65 20 68 6f 6c 64 * If we are hold
197b0 69 6e 67 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f ing a PENDING lo
197c0 63 6b 20 74 68 61 74 20 6f 75 67 68 74 20 74 6f ck that ought to
197d0 20 62 65 20 72 65 6c 65 61 73 65 64 2c 20 74 68 be released, th
197e0 65 6e 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65 20 en. ** release
197f0 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 it now.. */. i
19800 66 28 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 f( gotPendingLoc
19810 6b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 k && locktype==S
19820 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 HARED_LOCK ){.
19830 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 winUnlockFile(
19840 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 &pFile->h, PENDI
19850 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 NG_BYTE, 0, 1, 0
19860 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 );. }.. /* Upd
19870 61 74 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 ate the state of
19880 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 68 65 the lock has he
19890 6c 64 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64 ld in the file d
198a0 65 73 63 72 69 70 74 6f 72 20 74 68 65 6e 0a 20 escriptor then.
198b0 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61 ** return the a
198c0 70 70 72 6f 70 72 69 61 74 65 20 72 65 73 75 6c ppropriate resul
198d0 74 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 t code.. */. i
198e0 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 72 63 f( res ){. rc
198f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 = SQLITE_OK;.
19900 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 }else{. pFile
19910 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 ->lastErrno = la
19920 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 stErrno;. rc
19930 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 = SQLITE_BUSY;.
19940 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 OSTRACE(("LOC
19950 4b 2d 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c 20 K-FAIL file=%p,
19960 77 61 6e 74 65 64 3d 25 64 2c 20 67 6f 74 3d 25 wanted=%d, got=%
19970 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 d\n",.
19980 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 pFile->h, loc
19990 6b 74 79 70 65 2c 20 6e 65 77 4c 6f 63 6b 74 79 ktype, newLockty
199a0 70 65 29 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c pe));. }. pFil
199b0 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 e->locktype = (u
199c0 38 29 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 0a 20 8)newLocktype;.
199d0 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 OSTRACE(("LOCK
199e0 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 file=%p, lock=%d
199f0 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 , rc=%s\n",.
19a00 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c pFile->h,
19a10 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 pFile->locktype
19a20 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 , sqlite3ErrName
19a30 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e (rc)));. return
19a40 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 rc;.}../*.** Th
19a50 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b is routine check
19a60 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 s if there is a
19a70 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 RESERVED lock he
19a80 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 ld on the specif
19a90 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 ied.** file by t
19aa0 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 his or any other
19ab0 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 process. If suc
19ac0 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 h a lock is held
19ad0 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d , return.** non-
19ae0 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 zero, otherwise
19af0 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 zero..*/.static
19b00 69 6e 74 20 77 69 6e 43 68 65 63 6b 52 65 73 65 int winCheckRese
19b10 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 rvedLock(sqlite3
19b20 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a _file *id, int *
19b30 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 pResOut){. int
19b40 72 65 73 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a res;. winFile *
19b50 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 pFile = (winFile
19b60 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 *)id;.. Simulat
19b70 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e eIOError( return
19b80 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 SQLITE_IOERR_CH
19b90 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b ECKRESERVEDLOCK;
19ba0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 );. OSTRACE(("
19bb0 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c TEST-WR-LOCK fil
19bc0 65 3d 25 70 2c 20 70 52 65 73 4f 75 74 3d 25 70 e=%p, pResOut=%p
19bd0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 \n", pFile->h, p
19be0 52 65 73 4f 75 74 29 29 3b 0a 0a 20 20 61 73 73 ResOut));.. ass
19bf0 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 ert( id!=0 );.
19c00 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 if( pFile->lockt
19c10 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f ype>=RESERVED_LO
19c20 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 CK ){. res =
19c30 31 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 1;. OSTRACE((
19c40 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 "TEST-WR-LOCK fi
19c50 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25 64 le=%p, result=%d
19c60 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69 (local)\n", pFi
19c70 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20 le->h, res));.
19c80 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d }else{. res =
19c90 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 winLockFile(&pF
19ca0 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c ile->h, SQLITE_L
19cb0 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c OCKFILEEX_FLAGS,
19cc0 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 30 2c RESERVED_BYTE,0,
19cd0 31 2c 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 1,0);. if( re
19ce0 73 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 55 6e s ){. winUn
19cf0 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d lockFile(&pFile-
19d00 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 >h, RESERVED_BYT
19d10 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 E, 0, 1, 0);.
19d20 20 7d 0a 20 20 20 20 72 65 73 20 3d 20 21 72 65 }. res = !re
19d30 73 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 s;. OSTRACE((
19d40 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 "TEST-WR-LOCK fi
19d50 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25 64 le=%p, result=%d
19d60 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20 70 46 (remote)\n", pF
19d70 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20 ile->h, res));.
19d80 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 }. *pResOut =
19d90 72 65 73 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 res;. OSTRACE((
19da0 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 "TEST-WR-LOCK fi
19db0 6c 65 3d 25 70 2c 20 70 52 65 73 4f 75 74 3d 25 le=%p, pResOut=%
19dc0 70 2c 20 2a 70 52 65 73 4f 75 74 3d 25 64 2c 20 p, *pResOut=%d,
19dd0 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c rc=SQLITE_OK\n",
19de0 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c . pFil
19df0 65 2d 3e 68 2c 20 70 52 65 73 4f 75 74 2c 20 2a e->h, pResOut, *
19e00 70 52 65 73 4f 75 74 29 29 3b 0a 20 20 72 65 74 pResOut));. ret
19e10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d urn SQLITE_OK;.}
19e20 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 ../*.** Lower th
19e30 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 e locking level
19e40 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 on file descript
19e50 6f 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70 or id to locktyp
19e60 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 e. locktype.**
19e70 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e must be either N
19e80 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 O_LOCK or SHARED
19e90 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 _LOCK..**.** If
19ea0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 the locking leve
19eb0 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 l of the file de
19ec0 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 scriptor is alre
19ed0 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a ady at or below.
19ee0 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 ** the requested
19ef0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 locking level,
19f00 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 this routine is
19f10 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 a no-op..**.** I
19f20 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c t is not possibl
19f30 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 e for this routi
19f40 6e 65 20 74 6f 20 66 61 69 6c 20 69 66 20 74 68 ne to fail if th
19f50 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e e second argumen
19f60 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e t.** is NO_LOCK.
19f70 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 If the second
19f80 61 72 67 75 6d 65 6e 74 20 69 73 20 53 48 41 52 argument is SHAR
19f90 45 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69 ED_LOCK then thi
19fa0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 s routine.** mig
19fb0 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 ht return SQLITE
19fc0 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61 74 69 _IOERR;.*/.stati
19fd0 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 28 c int winUnlock(
19fe0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 sqlite3_file *id
19ff0 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b , int locktype){
1a000 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 77 . int type;. w
1a010 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 inFile *pFile =
1a020 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 (winFile*)id;.
1a030 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f int rc = SQLITE_
1a040 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 OK;. assert( pF
1a050 69 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 ile!=0 );. asse
1a060 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 rt( locktype<=SH
1a070 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 4f ARED_LOCK );. O
1a080 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 STRACE(("UNLOCK
1a090 66 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c 6f 63 6b file=%p, oldLock
1a0a0 3d 25 64 28 25 64 29 2c 20 6e 65 77 4c 6f 63 6b =%d(%d), newLock
1a0b0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 =%d\n",.
1a0c0 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 pFile->h, pFi
1a0d0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 le->locktype, pF
1a0e0 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 ile->sharedLockB
1a0f0 79 74 65 2c 20 6c 6f 63 6b 74 79 70 65 29 29 3b yte, locktype));
1a100 0a 20 20 74 79 70 65 20 3d 20 70 46 69 6c 65 2d . type = pFile-
1a110 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 >locktype;. if(
1a120 20 74 79 70 65 3e 3d 45 58 43 4c 55 53 49 56 45 type>=EXCLUSIVE
1a130 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e _LOCK ){. win
1a140 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c UnlockFile(&pFil
1a150 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 e->h, SHARED_FIR
1a160 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 ST, 0, SHARED_SI
1a170 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 ZE, 0);. if(
1a180 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 locktype==SHARED
1a190 5f 4c 4f 43 4b 20 26 26 20 21 77 69 6e 47 65 74 _LOCK && !winGet
1a1a0 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 20 ReadLock(pFile)
1a1b0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 ){. /* This
1a1c0 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 should never ha
1a1d0 70 70 65 6e 2e 20 20 57 65 20 73 68 6f 75 6c 64 ppen. We should
1a1e0 20 61 6c 77 61 79 73 20 62 65 20 61 62 6c 65 20 always be able
1a1f0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 63 to. ** reac
1a200 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c quire the read l
1a210 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 ock */. rc
1a220 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 = winLogError(SQ
1a230 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 LITE_IOERR_UNLOC
1a240 4b 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f K, osGetLastErro
1a250 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 r(),.
1a260 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e "win
1a270 55 6e 6c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e Unlock", pFile->
1a280 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 zPath);. }.
1a290 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 52 45 }. if( type>=RE
1a2a0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 SERVED_LOCK ){.
1a2b0 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 winUnlockFile
1a2c0 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 (&pFile->h, RESE
1a2d0 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c RVED_BYTE, 0, 1,
1a2e0 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 0);. }. if( l
1a2f0 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b ocktype==NO_LOCK
1a300 20 26 26 20 74 79 70 65 3e 3d 53 48 41 52 45 44 && type>=SHARED
1a310 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e _LOCK ){. win
1a320 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 UnlockReadLock(p
1a330 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 File);. }. if(
1a340 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c type>=PENDING_L
1a350 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e OCK ){. winUn
1a360 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d lockFile(&pFile-
1a370 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 >h, PENDING_BYTE
1a380 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a , 0, 1, 0);. }.
1a390 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 pFile->locktyp
1a3a0 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70 65 e = (u8)locktype
1a3b0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e ;. OSTRACE(("UN
1a3c0 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f LOCK file=%p, lo
1a3d0 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c ck=%d, rc=%s\n",
1a3e0 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c . pFil
1a3f0 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 e->h, pFile->loc
1a400 6b 74 79 70 65 2c 20 73 71 6c 69 74 65 33 45 72 ktype, sqlite3Er
1a410 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 rName(rc)));. r
1a420 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a eturn rc;.}../**
1a430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1a440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1a450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1a460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1a470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a ************.***
1a480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1a490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f *********** No-o
1a4a0 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a p Locking ******
1a4b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1a4c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a ************.**.
1a4d0 2a 2a 20 4f 66 20 74 68 65 20 76 61 72 69 6f 75 ** Of the variou
1a4e0 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d s locking implem
1a4f0 65 6e 74 61 74 69 6f 6e 73 20 61 76 61 69 6c 61 entations availa
1a500 62 6c 65 2c 20 74 68 69 73 20 69 73 20 62 79 20 ble, this is by
1a510 66 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c far the.** simpl
1a520 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73 est: locking is
1a530 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74 ignored. No at
1a540 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f tempt is made to
1a550 20 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 lock the databa
1a560 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72 se.** file for r
1a570 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e eading or writin
1a580 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f g..**.** This lo
1a590 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 61 70 cking mode is ap
1a5a0 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 75 73 propriate for us
1a5b0 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64 e on read-only d
1a5c0 61 74 61 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a atabases.** (ex:
1a5d0 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 databases that
1a5e0 61 72 65 20 62 75 72 6e 65 64 20 69 6e 74 6f 20 are burned into
1a5f0 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d CD-ROM, for exam
1a600 70 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a ple.) It can.**
1a610 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20 69 66 also be used if
1a620 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e the application
1a630 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78 employs some ex
1a640 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d ternal mechanism
1a650 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73 to.** prevent s
1a660 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63 63 65 imultaneous acce
1a670 73 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 64 ss of the same d
1a680 61 74 61 62 61 73 65 20 62 79 20 74 77 6f 20 6f atabase by two o
1a690 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61 r more.** databa
1a6a0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 se connections.
1a6b0 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20 But there is a
1a6c0 73 65 72 69 6f 75 73 20 72 69 73 6b 20 6f 66 20 serious risk of
1a6d0 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72 database.** corr
1a6e0 75 70 74 69 6f 6e 20 69 66 20 74 68 69 73 20 6c uption if this l
1a6f0 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 ocking mode is u
1a700 73 65 64 20 69 6e 20 73 69 74 75 61 74 69 6f 6e sed in situation
1a710 73 20 77 68 65 72 65 20 6d 75 6c 74 69 70 6c 65 s where multiple
1a720 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e .** database con
1a730 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61 63 63 nections are acc
1a740 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 essing the same
1a750 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 database file at
1a760 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d the same.** tim
1a770 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 e and one or mor
1a780 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 e of those conne
1a790 63 74 69 6f 6e 73 20 61 72 65 20 77 72 69 74 69 ctions are writi
1a7a0 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 ng..*/..static i
1a7b0 6e 74 20 77 69 6e 4e 6f 6c 6f 63 6b 4c 6f 63 6b nt winNolockLock
1a7c0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 (sqlite3_file *i
1a7d0 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 d, int locktype)
1a7e0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d {. UNUSED_PARAM
1a7f0 45 54 45 52 28 69 64 29 3b 0a 20 20 55 4e 55 53 ETER(id);. UNUS
1a800 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6c 6f 63 ED_PARAMETER(loc
1a810 6b 74 79 70 65 29 3b 0a 20 20 72 65 74 75 72 6e ktype);. return
1a820 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 SQLITE_OK;.}..s
1a830 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4e 6f 6c tatic int winNol
1a840 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 ockCheckReserved
1a850 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c Lock(sqlite3_fil
1a860 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 e *id, int *pRes
1a870 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 Out){. UNUSED_P
1a880 41 52 41 4d 45 54 45 52 28 69 64 29 3b 0a 20 20 ARAMETER(id);.
1a890 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 UNUSED_PARAMETER
1a8a0 28 70 52 65 73 4f 75 74 29 3b 0a 20 20 72 65 74 (pResOut);. ret
1a8b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d urn SQLITE_OK;.}
1a8c0 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e ..static int win
1a8d0 4e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c NolockUnlock(sql
1a8e0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 ite3_file *id, i
1a8f0 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 nt locktype){.
1a900 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 UNUSED_PARAMETER
1a910 28 69 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 (id);. UNUSED_P
1a920 41 52 41 4d 45 54 45 52 28 6c 6f 63 6b 74 79 70 ARAMETER(locktyp
1a930 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c e);. return SQL
1a940 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a ITE_OK;.}../****
1a950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 ***************
1a960 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 End of the no-op
1a970 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 lock implementa
1a980 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a tion ***********
1a990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a **********.*****
1a9a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1a9b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1a9c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1a9d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1a9e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a *********/../*.*
1a9f0 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 69 6e * If *pArg is in
1aa00 69 74 69 61 6c 6c 79 20 6e 65 67 61 74 69 76 65 itially negative
1aa10 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 20 then this is a
1aa20 71 75 65 72 79 2e 20 20 53 65 74 20 2a 70 41 72 query. Set *pAr
1aa30 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64 g to.** 1 or 0 d
1aa40 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 epending on whet
1aa50 68 65 72 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d her or not bit m
1aa60 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 ask of pFile->ct
1aa70 72 6c 46 6c 61 67 73 20 69 73 20 73 65 74 2e 0a rlFlags is set..
1aa80 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 **.** If *pArg i
1aa90 73 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 63 s 0 or 1, then c
1aaa0 6c 65 61 72 20 6f 72 20 73 65 74 20 74 68 65 20 lear or set the
1aab0 6d 61 73 6b 20 62 69 74 20 6f 66 20 70 46 69 6c mask bit of pFil
1aac0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f e->ctrlFlags..*/
1aad0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e .static void win
1aae0 4d 6f 64 65 42 69 74 28 77 69 6e 46 69 6c 65 20 ModeBit(winFile
1aaf0 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 *pFile, unsigned
1ab00 20 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20 char mask, int
1ab10 2a 70 41 72 67 29 7b 0a 20 20 69 66 28 20 2a 70 *pArg){. if( *p
1ab20 41 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41 Arg<0 ){. *pA
1ab30 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72 rg = (pFile->ctr
1ab40 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b 29 21 3d lFlags & mask)!=
1ab50 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 0;. }else if( (
1ab60 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 *pArg)==0 ){.
1ab70 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 pFile->ctrlFlag
1ab80 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 s &= ~mask;. }e
1ab90 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e lse{. pFile->
1aba0 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73 ctrlFlags |= mas
1abb0 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 k;. }.}../* For
1abc0 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 ward references
1abd0 74 6f 20 56 46 53 20 68 65 6c 70 65 72 20 6d 65 to VFS helper me
1abe0 74 68 6f 64 73 20 75 73 65 64 20 66 6f 72 20 74 thods used for t
1abf0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 2a emporary files *
1ac00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e /.static int win
1ac10 47 65 74 54 65 6d 70 6e 61 6d 65 28 73 71 6c 69 GetTempname(sqli
1ac20 74 65 33 5f 76 66 73 20 2a 2c 20 63 68 61 72 20 te3_vfs *, char
1ac30 2a 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 **);.static int
1ac40 77 69 6e 49 73 44 69 72 28 63 6f 6e 73 74 20 76 winIsDir(const v
1ac50 6f 69 64 20 2a 29 3b 0a 73 74 61 74 69 63 20 42 oid *);.static B
1ac60 4f 4f 4c 20 77 69 6e 49 73 44 72 69 76 65 4c 65 OOL winIsDriveLe
1ac70 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 63 6f 6e tterAndColon(con
1ac80 73 74 20 63 68 61 72 20 2a 29 3b 0a 0a 2f 2a 0a st char *);../*.
1ac90 2a 2a 20 43 6f 6e 74 72 6f 6c 20 61 6e 64 20 71 ** Control and q
1aca0 75 65 72 79 20 6f 66 20 74 68 65 20 6f 70 65 6e uery of the open
1acb0 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f file handle..*/
1acc0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 .static int winF
1acd0 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 ileControl(sqlit
1ace0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 e3_file *id, int
1acf0 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 op, void *pArg)
1ad00 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 {. winFile *pFi
1ad10 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 le = (winFile*)i
1ad20 64 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46 d;. OSTRACE(("F
1ad30 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 6f 70 CNTL file=%p, op
1ad40 3d 25 64 2c 20 70 41 72 67 3d 25 70 5c 6e 22 2c =%d, pArg=%p\n",
1ad50 20 70 46 69 6c 65 2d 3e 68 2c 20 6f 70 2c 20 70 pFile->h, op, p
1ad60 41 72 67 29 29 3b 0a 20 20 73 77 69 74 63 68 28 Arg));. switch(
1ad70 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 op ){. case
1ad80 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 SQLITE_FCNTL_LOC
1ad90 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 KSTATE: {.
1ada0 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 *(int*)pArg = pF
1adb0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 ile->locktype;.
1adc0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 OSTRACE(("F
1add0 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 CNTL file=%p, rc
1ade0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 =SQLITE_OK\n", p
1adf0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 File->h));.
1ae00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
1ae10 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 K;. }. cas
1ae20 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c e SQLITE_FCNTL_L
1ae30 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 AST_ERRNO: {.
1ae40 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d *(int*)pArg =
1ae50 20 28 69 6e 74 29 70 46 69 6c 65 2d 3e 6c 61 73 (int)pFile->las
1ae60 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 4f 53 tErrno;. OS
1ae70 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 TRACE(("FCNTL fi
1ae80 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 le=%p, rc=SQLITE
1ae90 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 _OK\n", pFile->h
1aea0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e ));. return
1aeb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 SQLITE_OK;.
1aec0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 }. case SQLIT
1aed0 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 E_FCNTL_CHUNK_SI
1aee0 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c ZE: {. pFil
1aef0 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 e->szChunk = *(i
1af00 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 nt *)pArg;.
1af10 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c OSTRACE(("FCNTL
1af20 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c file=%p, rc=SQL
1af30 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 ITE_OK\n", pFile
1af40 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 ->h));. ret
1af50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 urn SQLITE_OK;.
1af60 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 }. case SQ
1af70 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f LITE_FCNTL_SIZE_
1af80 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 HINT: {. if
1af90 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b ( pFile->szChunk
1afa0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 >0 ){. sq
1afb0 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 6c 64 53 lite3_int64 oldS
1afc0 7a 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 z;. int r
1afd0 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 c = winFileSize(
1afe0 69 64 2c 20 26 6f 6c 64 53 7a 29 3b 0a 20 20 20 id, &oldSz);.
1aff0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c if( rc==SQL
1b000 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 ITE_OK ){.
1b010 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 sqlite3_int6
1b020 34 20 6e 65 77 53 7a 20 3d 20 2a 28 73 71 6c 69 4 newSz = *(sqli
1b030 74 65 33 5f 69 6e 74 36 34 2a 29 70 41 72 67 3b te3_int64*)pArg;
1b040 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e . if( n
1b050 65 77 53 7a 3e 6f 6c 64 53 7a 20 29 7b 0a 20 20 ewSz>oldSz ){.
1b060 20 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 Simula
1b070 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 teIOErrorBenign(
1b080 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 1);.
1b090 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 rc = winTruncate
1b0a0 28 69 64 2c 20 6e 65 77 53 7a 29 3b 0a 20 20 20 (id, newSz);.
1b0b0 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 Simulat
1b0c0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 eIOErrorBenign(0
1b0d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 );. }.
1b0e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
1b0f0 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c OSTRACE(("FCNTL
1b100 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c file=%p, rc=%s\
1b110 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 n", pFile->h, sq
1b120 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 lite3ErrName(rc)
1b130 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 ));. retu
1b140 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 rn rc;. }.
1b150 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 OSTRACE(("F
1b160 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 CNTL file=%p, rc
1b170 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 =SQLITE_OK\n", p
1b180 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 File->h));.
1b190 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
1b1a0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 K;. }. cas
1b1b0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 e SQLITE_FCNTL_P
1b1c0 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 ERSIST_WAL: {.
1b1d0 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74 28 70 winModeBit(p
1b1e0 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50 45 File, WINFILE_PE
1b1f0 52 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a RSIST_WAL, (int*
1b200 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 4f 53 )pArg);. OS
1b210 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 TRACE(("FCNTL fi
1b220 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 le=%p, rc=SQLITE
1b230 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 _OK\n", pFile->h
1b240 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e ));. return
1b250 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 SQLITE_OK;.
1b260 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 }. case SQLIT
1b270 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 E_FCNTL_POWERSAF
1b280 45 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a 20 E_OVERWRITE: {.
1b290 20 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74 28 winModeBit(
1b2a0 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50 pFile, WINFILE_P
1b2b0 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 SOW, (int*)pArg)
1b2c0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 ;. OSTRACE(
1b2d0 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c ("FCNTL file=%p,
1b2e0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 rc=SQLITE_OK\n"
1b2f0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 , pFile->h));.
1b300 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 return SQLIT
1b310 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 E_OK;. }.
1b320 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 case SQLITE_FCNT
1b330 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 L_VFSNAME: {.
1b340 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 *(char**)pArg
1b350 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e = sqlite3_mprin
1b360 74 66 28 22 25 73 22 2c 20 70 46 69 6c 65 2d 3e tf("%s", pFile->
1b370 70 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 pVfs->zName);.
1b380 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 OSTRACE(("FC
1b390 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d NTL file=%p, rc=
1b3a0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 SQLITE_OK\n", pF
1b3b0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 ile->h));.
1b3c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
1b3d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 ;. }. case
1b3e0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 SQLITE_FCNTL_WI
1b3f0 4e 33 32 5f 41 56 5f 52 45 54 52 59 3a 20 7b 0a N32_AV_RETRY: {.
1b400 20 20 20 20 20 20 69 6e 74 20 2a 61 20 3d 20 28 int *a = (
1b410 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 int*)pArg;.
1b420 20 69 66 28 20 61 5b 30 5d 3e 30 20 29 7b 0a 20 if( a[0]>0 ){.
1b430 20 20 20 20 20 20 20 77 69 6e 49 6f 65 72 72 52 winIoerrR
1b440 65 74 72 79 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 etry = a[0];.
1b450 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
1b460 20 20 61 5b 30 5d 20 3d 20 77 69 6e 49 6f 65 72 a[0] = winIoer
1b470 72 52 65 74 72 79 3b 0a 20 20 20 20 20 20 7d 0a rRetry;. }.
1b480 20 20 20 20 20 20 69 66 28 20 61 5b 31 5d 3e 30 if( a[1]>0
1b490 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 49 ){. winI
1b4a0 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 20 3d oerrRetryDelay =
1b4b0 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c a[1];. }el
1b4c0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 5b 31 5d se{. a[1]
1b4d0 20 3d 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 = winIoerrRetry
1b4e0 44 65 6c 61 79 3b 0a 20 20 20 20 20 20 7d 0a 20 Delay;. }.
1b4f0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 OSTRACE(("F
1b500 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 CNTL file=%p, rc
1b510 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 =SQLITE_OK\n", p
1b520 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 File->h));.
1b530 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
1b540 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 K;. }. cas
1b550 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 e SQLITE_FCNTL_W
1b560 49 4e 33 32 5f 47 45 54 5f 48 41 4e 44 4c 45 3a IN32_GET_HANDLE:
1b570 20 7b 0a 20 20 20 20 20 20 4c 50 48 41 4e 44 4c {. LPHANDL
1b580 45 20 70 68 46 69 6c 65 20 3d 20 28 4c 50 48 41 E phFile = (LPHA
1b590 4e 44 4c 45 29 70 41 72 67 3b 0a 20 20 20 20 20 NDLE)pArg;.
1b5a0 20 2a 70 68 46 69 6c 65 20 3d 20 70 46 69 6c 65 *phFile = pFile
1b5b0 2d 3e 68 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 ->h;. OSTRA
1b5c0 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d CE(("FCNTL file=
1b5d0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b %p, rc=SQLITE_OK
1b5e0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b \n", pFile->h));
1b5f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 . return SQ
1b600 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 LITE_OK;. }.#
1b610 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 ifdef SQLITE_TES
1b620 54 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 T. case SQLIT
1b630 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 53 45 E_FCNTL_WIN32_SE
1b640 54 5f 48 41 4e 44 4c 45 3a 20 7b 0a 20 20 20 20 T_HANDLE: {.
1b650 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c LPHANDLE phFil
1b660 65 20 3d 20 28 4c 50 48 41 4e 44 4c 45 29 70 41 e = (LPHANDLE)pA
1b670 72 67 3b 0a 20 20 20 20 20 20 48 41 4e 44 4c 45 rg;. HANDLE
1b680 20 68 4f 6c 64 46 69 6c 65 20 3d 20 70 46 69 6c hOldFile = pFil
1b690 65 2d 3e 68 3b 0a 20 20 20 20 20 20 70 46 69 6c e->h;. pFil
1b6a0 65 2d 3e 68 20 3d 20 2a 70 68 46 69 6c 65 3b 0a e->h = *phFile;.
1b6b0 20 20 20 20 20 20 2a 70 68 46 69 6c 65 20 3d 20 *phFile =
1b6c0 68 4f 6c 64 46 69 6c 65 3b 0a 20 20 20 20 20 20 hOldFile;.
1b6d0 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 OSTRACE(("FCNTL
1b6e0 6f 6c 64 46 69 6c 65 3d 25 70 2c 20 6e 65 77 46 oldFile=%p, newF
1b6f0 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 ile=%p, rc=SQLIT
1b700 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 E_OK\n",.
1b710 20 20 20 20 20 20 20 20 68 4f 6c 64 46 69 6c 65 hOldFile
1b720 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 , pFile->h));.
1b730 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 return SQLIT
1b740 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 E_OK;. }.#end
1b750 69 66 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 if. case SQLI
1b760 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c TE_FCNTL_TEMPFIL
1b770 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 63 ENAME: {. c
1b780 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d 20 30 3b har *zTFile = 0;
1b790 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 . int rc =
1b7a0 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 winGetTempname(p
1b7b0 46 69 6c 65 2d 3e 70 56 66 73 2c 20 26 7a 54 46 File->pVfs, &zTF
1b7c0 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 ile);. if(
1b7d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc==SQLITE_OK ){
1b7e0 0a 20 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a . *(char*
1b7f0 2a 29 70 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b *)pArg = zTFile;
1b800 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f . }. O
1b810 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 STRACE(("FCNTL f
1b820 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 ile=%p, rc=%s\n"
1b830 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 , pFile->h, sqli
1b840 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 te3ErrName(rc)))
1b850 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 ;. return r
1b860 63 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c c;. }.#if SQL
1b870 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a ITE_MAX_MMAP_SIZ
1b880 45 3e 30 0a 20 20 20 20 63 61 73 65 20 53 51 4c E>0. case SQL
1b890 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 ITE_FCNTL_MMAP_S
1b8a0 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 36 34 IZE: {. i64
1b8b0 20 6e 65 77 4c 69 6d 69 74 20 3d 20 2a 28 69 36 newLimit = *(i6
1b8c0 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69 4*)pArg;. i
1b8d0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f nt rc = SQLITE_O
1b8e0 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 K;. if( new
1b8f0 4c 69 6d 69 74 3e 73 71 6c 69 74 65 33 47 6c 6f Limit>sqlite3Glo
1b900 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 balConfig.mxMmap
1b910 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 4c ){. newL
1b920 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 47 6c imit = sqlite3Gl
1b930 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 obalConfig.mxMma
1b940 70 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 p;. }..
1b950 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f /* The value o
1b960 66 20 6e 65 77 4c 69 6d 69 74 20 6d 61 79 20 62 f newLimit may b
1b970 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 73 e eventually cas
1b980 74 20 74 6f 20 28 53 49 5a 45 5f 54 29 20 61 6e t to (SIZE_T) an
1b990 64 20 70 61 73 73 65 64 0a 20 20 20 20 20 20 2a d passed. *
1b9a0 2a 20 74 6f 20 4d 61 70 56 69 65 77 4f 66 46 69 * to MapViewOfFi
1b9b0 6c 65 28 29 2e 20 52 65 73 74 72 69 63 74 20 69 le(). Restrict i
1b9c0 74 73 20 76 61 6c 75 65 20 74 6f 20 32 47 42 20 ts value to 2GB
1b9d0 69 66 20 28 53 49 5a 45 5f 54 29 20 69 73 20 6e if (SIZE_T) is n
1b9e0 6f 74 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 6c ot at. ** l
1b9f0 65 61 73 74 20 61 20 36 34 2d 62 69 74 20 74 79 east a 64-bit ty
1ba00 70 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 pe. */. if(
1ba10 20 6e 65 77 4c 69 6d 69 74 3e 30 20 26 26 20 73 newLimit>0 && s
1ba20 69 7a 65 6f 66 28 53 49 5a 45 5f 54 29 3c 38 20 izeof(SIZE_T)<8
1ba30 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 4c 69 ){. newLi
1ba40 6d 69 74 20 3d 20 28 6e 65 77 4c 69 6d 69 74 20 mit = (newLimit
1ba50 26 20 30 78 37 46 46 46 46 46 46 46 29 3b 0a 20 & 0x7FFFFFFF);.
1ba60 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2a 28 }.. *(
1ba70 69 36 34 2a 29 70 41 72 67 20 3d 20 70 46 69 6c i64*)pArg = pFil
1ba80 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a e->mmapSizeMax;.
1ba90 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d if( newLim
1baa0 69 74 3e 3d 30 20 26 26 20 6e 65 77 4c 69 6d 69 it>=0 && newLimi
1bab0 74 21 3d 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 t!=pFile->mmapSi
1bac0 7a 65 4d 61 78 20 26 26 20 70 46 69 6c 65 2d 3e zeMax && pFile->
1bad0 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 7b 0a nFetchOut==0 ){.
1bae0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d pFile->m
1baf0 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 6e 65 77 mapSizeMax = new
1bb00 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 69 Limit;. i
1bb10 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 f( pFile->mmapSi
1bb20 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 ze>0 ){.
1bb30 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 winUnmapfile(p
1bb40 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 File);.
1bb50 20 72 63 20 3d 20 77 69 6e 4d 61 70 66 69 6c 65 rc = winMapfile
1bb60 28 70 46 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 20 (pFile, -1);.
1bb70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 }. }.
1bb80 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 OSTRACE(("F
1bb90 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 CNTL file=%p, rc
1bba0 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 =%s\n", pFile->h
1bbb0 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 , sqlite3ErrName
1bbc0 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65 (rc)));. re
1bbd0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 turn rc;. }.#
1bbe0 65 6e 64 69 66 0a 20 20 7d 0a 20 20 4f 53 54 52 endif. }. OSTR
1bbf0 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 ACE(("FCNTL file
1bc00 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e =%p, rc=SQLITE_N
1bc10 4f 54 46 4f 55 4e 44 5c 6e 22 2c 20 70 46 69 6c OTFOUND\n", pFil
1bc20 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e e->h));. return
1bc30 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 SQLITE_NOTFOUND
1bc40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 ;.}../*.** Retur
1bc50 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a n the sector siz
1bc60 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 e in bytes of th
1bc70 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f e underlying blo
1bc80 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a ck device for.**
1bc90 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 the specified f
1bca0 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d ile. This is alm
1bcb0 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 ost always 512 b
1bcc0 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 ytes, but may be
1bcd0 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 .** larger for s
1bce0 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a ome devices..**.
1bcf0 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 ** SQLite code a
1bd00 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 ssumes this func
1bd10 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c tion cannot fail
1bd20 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 . It also assume
1bd30 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f s that.** if two
1bd40 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 files are creat
1bd50 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 ed in the same f
1bd60 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 ile-system direc
1bd70 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 tory (i.e..** a
1bd80 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 database and its
1bd90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 journal file) t
1bda0 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 hat the sector s
1bdb0 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a ize will be the.
1bdc0 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 ** same for both
1bdd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 ..*/.static int
1bde0 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 28 73 71 winSectorSize(sq
1bdf0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b lite3_file *id){
1be00 0a 20 20 28 76 6f 69 64 29 69 64 3b 0a 20 20 72 . (void)id;. r
1be10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 eturn SQLITE_DEF
1be20 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 AULT_SECTOR_SIZE
1be30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 ;.}../*.** Retur
1be40 6e 20 61 20 76 65 63 74 6f 72 20 6f 66 20 64 65 n a vector of de
1be50 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 vice characteris
1be60 74 69 63 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 tics..*/.static
1be70 69 6e 74 20 77 69 6e 44 65 76 69 63 65 43 68 61 int winDeviceCha
1be80 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c racteristics(sql
1be90 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a ite3_file *id){.
1bea0 20 20 77 69 6e 46 69 6c 65 20 2a 70 20 3d 20 28 winFile *p = (
1beb0 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 72 winFile*)id;. r
1bec0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 eturn SQLITE_IOC
1bed0 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 AP_UNDELETABLE_W
1bee0 48 45 4e 5f 4f 50 45 4e 20 7c 0a 20 20 20 20 20 HEN_OPEN |.
1bef0 20 20 20 20 28 28 70 2d 3e 63 74 72 6c 46 6c 61 ((p->ctrlFla
1bf00 67 73 20 26 20 57 49 4e 46 49 4c 45 5f 50 53 4f gs & WINFILE_PSO
1bf10 57 29 3f 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f W)?SQLITE_IOCAP_
1bf20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 POWERSAFE_OVERWR
1bf30 49 54 45 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a ITE:0);.}../*.**
1bf40 20 57 69 6e 64 6f 77 73 20 77 69 6c 6c 20 6f 6e Windows will on
1bf50 6c 79 20 6c 65 74 20 79 6f 75 20 63 72 65 61 74 ly let you creat
1bf60 65 20 66 69 6c 65 20 76 69 65 77 20 6d 61 70 70 e file view mapp
1bf70 69 6e 67 73 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f 63 ings.** on alloc
1bf80 61 74 69 6f 6e 20 73 69 7a 65 20 67 72 61 6e 75 ation size granu
1bf90 6c 61 72 69 74 79 20 62 6f 75 6e 64 61 72 69 65 larity boundarie
1bfa0 73 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 73 71 6c s..** During sql
1bfb0 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 ite3_os_init() w
1bfc0 65 20 64 6f 20 61 20 47 65 74 53 79 73 74 65 6d e do a GetSystem
1bfd0 49 6e 66 6f 28 29 0a 2a 2a 20 74 6f 20 67 65 74 Info().** to get
1bfe0 20 74 68 65 20 67 72 61 6e 75 6c 61 72 69 74 79 the granularity
1bff0 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 size..*/.static
1c000 20 53 59 53 54 45 4d 5f 49 4e 46 4f 20 77 69 6e SYSTEM_INFO win
1c010 53 79 73 49 6e 66 6f 3b 0a 0a 23 69 66 6e 64 65 SysInfo;..#ifnde
1c020 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 f SQLITE_OMIT_WA
1c030 4c 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 L../*.** Helper
1c040 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 functions to obt
1c050 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 ain and relinqui
1c060 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 sh the global mu
1c070 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 tex. The.** glob
1c080 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65 64 al mutex is used
1c090 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20 to protect the
1c0a0 77 69 6e 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 winLockInfo obje
1c0b0 63 74 73 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 cts used by.** t
1c0c0 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 his file, all of
1c0d0 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 73 68 which may be sh
1c0e0 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 ared by multiple
1c0f0 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 threads..**.**
1c100 46 75 6e 63 74 69 6f 6e 20 77 69 6e 53 68 6d 4d Function winShmM
1c110 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 75 73 utexHeld() is us
1c120 65 64 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 ed to assert() t
1c130 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d hat the global m
1c140 75 74 65 78 0a 2a 2a 20 69 73 20 68 65 6c 64 20 utex.** is held
1c150 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54 when required. T
1c160 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 his function is
1c170 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 only used as par
1c180 74 20 6f 66 20 61 73 73 65 72 74 28 29 0a 2a 2a t of assert().**
1c190 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 statements. e.g
1c1a0 2e 0a 2a 2a 0a 2a 2a 20 20 20 77 69 6e 53 68 6d ..**.** winShm
1c1b0 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 EnterMutex().**
1c1c0 20 20 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 assert( winS
1c1d0 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b hmMutexHeld() );
1c1e0 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 4c 65 61 76 .** winShmLeav
1c1f0 65 4d 75 74 65 78 28 29 0a 2a 2f 0a 73 74 61 74 eMutex().*/.stat
1c200 69 63 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 ic sqlite3_mutex
1c210 20 2a 77 69 6e 42 69 67 4c 6f 63 6b 20 3d 20 30 *winBigLock = 0
1c220 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 ;.static void wi
1c230 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 76 nShmEnterMutex(v
1c240 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f oid){. sqlite3_
1c250 6d 75 74 65 78 5f 65 6e 74 65 72 28 77 69 6e 42 mutex_enter(winB
1c260 69 67 4c 6f 63 6b 29 3b 0a 7d 0a 73 74 61 74 69 igLock);.}.stati
1c270 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 4c 65 61 c void winShmLea
1c280 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 veMutex(void){.
1c290 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c sqlite3_mutex_l
1c2a0 65 61 76 65 28 77 69 6e 42 69 67 4c 6f 63 6b 29 eave(winBigLock)
1c2b0 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 ;.}.#ifndef NDEB
1c2c0 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 UG.static int wi
1c2d0 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 76 6f nShmMutexHeld(vo
1c2e0 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 id) {. return s
1c2f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c qlite3_mutex_hel
1c300 64 28 77 69 6e 42 69 67 4c 6f 63 6b 29 3b 0a 7d d(winBigLock);.}
1c310 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f .#endif../*.** O
1c320 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 bject used to re
1c330 70 72 65 73 65 6e 74 20 61 20 73 69 6e 67 6c 65 present a single
1c340 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64 file opened and
1c350 20 6d 6d 61 70 70 65 64 20 74 6f 20 70 72 6f 76 mmapped to prov
1c360 69 64 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65 ide.** shared me
1c370 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74 mory. When mult
1c380 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c iple threads all
1c390 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 reference the s
1c3a0 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 ame.** log-summa
1c3b0 72 79 2c 20 65 61 63 68 20 74 68 72 65 61 64 20 ry, each thread
1c3c0 68 61 73 20 69 74 73 20 6f 77 6e 20 77 69 6e 46 has its own winF
1c3d0 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 ile object, but
1c3e0 74 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e they all.** poin
1c3f0 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e t to a single in
1c400 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f stance of this o
1c410 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 bject. In other
1c420 20 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a 20 words, each.**
1c430 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f log-summary is o
1c440 70 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 pened only once
1c450 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a per process..**.
1c460 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 ** winShmMutexHe
1c470 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 ld() must be tru
1c480 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 e when creating
1c490 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a or destroying.**
1c4a0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 this object or
1c4b0 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 while reading or
1c4c0 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c writing the fol
1c4d0 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a lowing fields:.*
1c4e0 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a *.** nRef.*
1c4f0 2a 20 20 20 20 20 20 70 4e 65 78 74 0a 2a 2a 0a * pNext.**.
1c500 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 ** The following
1c510 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 fields are read
1c520 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20 -only after the
1c530 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 object is create
1c540 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 69 d:.**.** fi
1c550 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e d.** zFilen
1c560 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 ame.**.** Either
1c570 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 winShmNode.mute
1c580 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f x must be held o
1c590 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 r winShmNode.nRe
1c5a0 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77 69 6e 53 f==0 and.** winS
1c5b0 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 hmMutexHeld() is
1c5c0 20 74 72 75 65 20 77 68 65 6e 20 72 65 61 64 69 true when readi
1c5d0 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e ng or writing an
1c5e0 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a y other field.**
1c5f0 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 in this structu
1c600 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75 63 74 re..**.*/.struct
1c610 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 winShmNode {.
1c620 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d sqlite3_mutex *m
1c630 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 utex; /* Mu
1c640 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74 68 tex to access th
1c650 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 is object */. c
1c660 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 har *zFilename;
1c670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d /* Nam
1c680 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f e of the file */
1c690 0a 20 20 77 69 6e 46 69 6c 65 20 68 46 69 6c 65 . winFile hFile
1c6a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a ; /*
1c6b0 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f File handle fro
1c6c0 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20 20 m winOpen */..
1c6d0 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 int szRegion;
1c6e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 /* Si
1c6f0 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d ze of shared-mem
1c700 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 ory regions */.
1c710 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20 20 20 int nRegion;
1c720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 /* S
1c730 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70 52 ize of array apR
1c740 65 67 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73 egion */. u8 is
1c750 52 65 61 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20 Readonly;
1c760 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 /* True if
1c770 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 read-only */.
1c780 75 38 20 69 73 55 6e 6c 6f 63 6b 65 64 3b 20 20 u8 isUnlocked;
1c790 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 /* Tr
1c7a0 75 65 20 69 66 20 6e 6f 20 44 4d 53 20 6c 6f 63 ue if no DMS loc
1c7b0 6b 20 68 65 6c 64 20 2a 2f 0a 0a 20 20 73 74 72 k held */.. str
1c7c0 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b 0a uct ShmRegion {.
1c7d0 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b HANDLE hMap;
1c7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1c7f0 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d File handle from
1c800 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 CreateFileMappi
1c810 6e 67 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a ng */. void *
1c820 70 4d 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67 69 pMap;. } *aRegi
1c830 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 on;. DWORD last
1c840 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 Errno;
1c850 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 /* The Windows
1c860 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c errno from the l
1c870 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f ast I/O error */
1c880 0a 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 .. int nRef;
1c890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1c8a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e 53 * Number of winS
1c8b0 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 hm objects point
1c8c0 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 ing to this */.
1c8d0 20 77 69 6e 53 68 6d 20 2a 70 46 69 72 73 74 3b winShm *pFirst;
1c8e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 /* A
1c8f0 6c 6c 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 ll winShm object
1c900 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 s pointing to th
1c910 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f is */. winShmNo
1c920 64 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 de *pNext;
1c930 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 /* Next in li
1c940 73 74 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d st of all winShm
1c950 4e 6f 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a Node objects */.
1c960 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 #if defined(SQLI
1c970 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 TE_DEBUG) || def
1c980 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 ined(SQLITE_HAVE
1c990 5f 4f 53 5f 54 52 41 43 45 29 0a 20 20 75 38 20 _OS_TRACE). u8
1c9a0 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20 nextShmId;
1c9b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 /* Next
1c9c0 61 76 61 69 6c 61 62 6c 65 20 77 69 6e 53 68 6d available winShm
1c9d0 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e .id value */.#en
1c9e0 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 dif.};../*.** A
1c9f0 67 6c 6f 62 61 6c 20 61 72 72 61 79 20 6f 66 20 global array of
1ca00 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f all winShmNode o
1ca10 62 6a 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 bjects..**.** Th
1ca20 65 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c e winShmMutexHel
1ca30 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 d() must be true
1ca40 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f while reading o
1ca50 72 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 6c r writing this l
1ca60 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 77 ist..*/.static w
1ca70 69 6e 53 68 6d 4e 6f 64 65 20 2a 77 69 6e 53 68 inShmNode *winSh
1ca80 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a mNodeList = 0;..
1ca90 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 /*.** Structure
1caa0 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 used internally
1cab0 62 79 20 74 68 69 73 20 56 46 53 20 74 6f 20 72 by this VFS to r
1cac0 65 63 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 ecord the state
1cad0 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 of an.** open sh
1cae0 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e ared memory conn
1caf0 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 ection..**.** Th
1cb00 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c e following fiel
1cb10 64 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a ds are initializ
1cb20 65 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a ed when this obj
1cb30 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20 61 ect is created a
1cb40 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f nd.** are read-o
1cb50 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a nly thereafter:.
1cb60 2a 2a 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e **.** winShm.
1cb70 70 53 68 6d 4e 6f 64 65 0a 2a 2a 20 20 20 20 77 pShmNode.** w
1cb80 69 6e 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 inShm.id.**.** A
1cb90 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 ll other fields
1cba0 61 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20 are read/write.
1cbb0 20 54 68 65 20 77 69 6e 53 68 6d 2e 70 53 68 6d The winShm.pShm
1cbc0 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 Node->mutex must
1cbd0 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c be held.** whil
1cbe0 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20 e accessing any
1cbf0 72 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64 read/write field
1cc00 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e s..*/.struct win
1cc10 53 68 6d 20 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f Shm {. winShmNo
1cc20 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 de *pShmNode;
1cc30 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c /* The underl
1cc40 79 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 ying winShmNode
1cc50 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 77 69 6e 53 object */. winS
1cc60 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 hm *pNext;
1cc70 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 77 /* Next w
1cc80 69 6e 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 inShm with the s
1cc90 61 6d 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a ame winShmNode *
1cca0 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b /. u8 hasMutex;
1ccb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1ccc0 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e * True if holdin
1ccd0 67 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 g the winShmNode
1cce0 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 31 36 20 mutex */. u16
1ccf0 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 sharedMask;
1cd00 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f /* Mask o
1cd10 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 f shared locks h
1cd20 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 eld */. u16 exc
1cd30 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 lMask;
1cd40 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 /* Mask of e
1cd50 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 xclusive locks h
1cd60 65 6c 64 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e eld */.#if defin
1cd70 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 ed(SQLITE_DEBUG)
1cd80 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 || defined(SQLI
1cd90 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45 TE_HAVE_OS_TRACE
1cda0 29 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20 20 ). u8 id;
1cdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1cdc0 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e * Id of this con
1cdd0 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 69 74 73 nection with its
1cde0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23 winShmNode */.#
1cdf0 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 endif.};../*.**
1ce00 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66 Constants used f
1ce10 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 or locking.*/.#d
1ce20 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 42 41 efine WIN_SHM_BA
1ce30 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45 SE ((22+SQLITE
1ce40 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 _SHM_NLOCK)*4)
1ce50 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c /* first l
1ce60 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 ock byte */.#def
1ce70 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 20 ine WIN_SHM_DMS
1ce80 20 20 20 28 57 49 4e 5f 53 48 4d 5f 42 41 53 45 (WIN_SHM_BASE
1ce90 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 +SQLITE_SHM_NLOC
1cea0 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 K) /* deadman s
1ceb0 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 witch */../*.**
1cec0 41 70 70 6c 79 20 61 64 76 69 73 6f 72 79 20 6c Apply advisory l
1ced0 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 6e 20 62 ocks for all n b
1cee0 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 ytes beginning a
1cef0 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 t ofst..*/.#defi
1cf00 6e 65 20 57 49 4e 53 48 4d 5f 55 4e 4c 43 4b 20 ne WINSHM_UNLCK
1cf10 20 31 0a 23 64 65 66 69 6e 65 20 57 49 4e 53 48 1.#define WINSH
1cf20 4d 5f 52 44 4c 43 4b 20 20 32 0a 23 64 65 66 69 M_RDLCK 2.#defi
1cf30 6e 65 20 57 49 4e 53 48 4d 5f 57 52 4c 43 4b 20 ne WINSHM_WRLCK
1cf40 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 3.static int wi
1cf50 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a nShmSystemLock(.
1cf60 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 46 winShmNode *pF
1cf70 69 6c 65 2c 20 20 20 20 2f 2a 20 41 70 70 6c 79 ile, /* Apply
1cf80 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f locks to this o
1cf90 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 pen shared-memor
1cfa0 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 y segment */. i
1cfb0 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 nt lockType,
1cfc0 20 20 20 20 20 2f 2a 20 57 49 4e 53 48 4d 5f 55 /* WINSHM_U
1cfd0 4e 4c 43 4b 2c 20 57 49 4e 53 48 4d 5f 52 44 4c NLCK, WINSHM_RDL
1cfe0 43 4b 2c 20 6f 72 20 57 49 4e 53 48 4d 5f 57 52 CK, or WINSHM_WR
1cff0 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 LCK */. int ofs
1d000 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f t, /
1d010 2a 20 4f 66 66 73 65 74 20 74 6f 20 66 69 72 73 * Offset to firs
1d020 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 t byte to be loc
1d030 6b 65 64 2f 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a ked/unlocked */.
1d040 20 20 69 6e 74 20 6e 42 79 74 65 20 20 20 20 20 int nByte
1d050 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 /* Numbe
1d060 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f r of bytes to lo
1d070 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0a ck or unlock */.
1d080 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b ){. int rc = 0;
1d090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 /* Re
1d0a0 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 4c sult code form L
1d0b0 6f 63 6b 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 ock/UnlockFileEx
1d0c0 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 () */.. /* Acce
1d0d0 73 73 20 74 6f 20 74 68 65 20 77 69 6e 53 68 6d ss to the winShm
1d0e0 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73 Node object is s
1d0f0 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65 erialized by the
1d100 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 caller */. ass
1d110 65 72 74 28 20 70 46 69 6c 65 2d 3e 6e 52 65 66 ert( pFile->nRef
1d120 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d ==0 || sqlite3_m
1d130 75 74 65 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d utex_held(pFile-
1d140 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 4f 53 >mutex) );.. OS
1d150 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b TRACE(("SHM-LOCK
1d160 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 file=%p, lock=%
1d170 64 2c 20 6f 66 66 73 65 74 3d 25 64 2c 20 73 69 d, offset=%d, si
1d180 7a 65 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 ze=%d\n",.
1d190 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c pFile->hFil
1d1a0 65 2e 68 2c 20 6c 6f 63 6b 54 79 70 65 2c 20 6f e.h, lockType, o
1d1b0 66 73 74 2c 20 6e 42 79 74 65 29 29 3b 0a 0a 20 fst, nByte));..
1d1c0 20 2f 2a 20 52 65 6c 65 61 73 65 2f 41 63 71 75 /* Release/Acqu
1d1d0 69 72 65 20 74 68 65 20 73 79 73 74 65 6d 2d 6c ire the system-l
1d1e0 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 evel lock */. i
1d1f0 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 57 49 4e f( lockType==WIN
1d200 53 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 SHM_UNLCK ){.
1d210 20 72 63 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 rc = winUnlockF
1d220 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 46 69 6c ile(&pFile->hFil
1d230 65 2e 68 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42 e.h, ofst, 0, nB
1d240 79 74 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 yte, 0);. }else
1d250 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c {. /* Initial
1d260 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 ize the locking
1d270 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 parameters */.
1d280 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 20 DWORD dwFlags
1d290 3d 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f = LOCKFILE_FAIL_
1d2a0 49 4d 4d 45 44 49 41 54 45 4c 59 3b 0a 20 20 20 IMMEDIATELY;.
1d2b0 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 20 3d 3d if( lockType ==
1d2c0 20 57 49 4e 53 48 4d 5f 57 52 4c 43 4b 20 29 20 WINSHM_WRLCK )
1d2d0 64 77 46 6c 61 67 73 20 7c 3d 20 4c 4f 43 4b 46 dwFlags |= LOCKF
1d2e0 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f ILE_EXCLUSIVE_LO
1d2f0 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e CK;. rc = win
1d300 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d LockFile(&pFile-
1d310 3e 68 46 69 6c 65 2e 68 2c 20 64 77 46 6c 61 67 >hFile.h, dwFlag
1d320 73 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74 s, ofst, 0, nByt
1d330 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 e, 0);. }.. if
1d340 28 20 72 63 21 3d 20 30 20 29 7b 0a 20 20 20 20 ( rc!= 0 ){.
1d350 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a rc = SQLITE_OK;.
1d360 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 }else{. pFi
1d370 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 le->lastErrno =
1d380 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 osGetLastError(
1d390 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 );. rc = SQLI
1d3a0 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 TE_BUSY;. }..
1d3b0 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f OSTRACE(("SHM-LO
1d3c0 43 4b 20 66 69 6c 65 3d 25 70 2c 20 66 75 6e 63 CK file=%p, func
1d3d0 3d 25 73 2c 20 65 72 72 6e 6f 3d 25 6c 75 2c 20 =%s, errno=%lu,
1d3e0 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 rc=%s\n",.
1d3f0 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c pFile->hFil
1d400 65 2e 68 2c 20 28 6c 6f 63 6b 54 79 70 65 20 3d e.h, (lockType =
1d410 3d 20 57 49 4e 53 48 4d 5f 55 4e 4c 43 4b 29 20 = WINSHM_UNLCK)
1d420 3f 20 22 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 ? "winUnlockFile
1d430 22 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20 22 " :. "
1d440 77 69 6e 4c 6f 63 6b 46 69 6c 65 22 2c 20 70 46 winLockFile", pF
1d450 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 ile->lastErrno,
1d460 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 sqlite3ErrName(r
1d470 63 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 c)));.. return
1d480 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 rc;.}../* Forwar
1d490 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 d references to
1d4a0 56 46 53 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 VFS methods */.s
1d4b0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 tatic int winOpe
1d4c0 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 63 n(sqlite3_vfs*,c
1d4d0 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 onst char*,sqlit
1d4e0 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69 6e 74 e3_file*,int,int
1d4f0 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 *);.static int w
1d500 69 6e 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 inDelete(sqlite3
1d510 5f 76 66 73 20 2a 2c 63 6f 6e 73 74 20 63 68 61 _vfs *,const cha
1d520 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 r*,int);../*.**
1d530 50 75 72 67 65 20 74 68 65 20 77 69 6e 53 68 6d Purge the winShm
1d540 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 NodeList list of
1d550 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74 all entries wit
1d560 68 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 h winShmNode.nRe
1d570 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 f==0..**.** This
1d580 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68 is not a VFS sh
1d590 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 ared-memory meth
1d5a0 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c od; it is a util
1d5b0 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c ity function cal
1d5c0 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68 led.** by VFS sh
1d5d0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 ared-memory meth
1d5e0 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 ods..*/.static v
1d5f0 6f 69 64 20 77 69 6e 53 68 6d 50 75 72 67 65 28 oid winShmPurge(
1d600 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 sqlite3_vfs *pVf
1d610 73 2c 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 s, int deleteFla
1d620 67 29 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 g){. winShmNode
1d630 20 2a 2a 70 70 3b 0a 20 20 77 69 6e 53 68 6d 4e **pp;. winShmN
1d640 6f 64 65 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 ode *p;. assert
1d650 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c ( winShmMutexHel
1d660 64 28 29 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 d() );. OSTRACE
1d670 28 28 22 53 48 4d 2d 50 55 52 47 45 20 70 69 64 (("SHM-PURGE pid
1d680 3d 25 6c 75 2c 20 64 65 6c 65 74 65 46 6c 61 67 =%lu, deleteFlag
1d690 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 =%d\n",.
1d6a0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 osGetCurrentP
1d6b0 72 6f 63 65 73 73 49 64 28 29 2c 20 64 65 6c 65 rocessId(), dele
1d6c0 74 65 46 6c 61 67 29 29 3b 0a 20 20 70 70 20 3d teFlag));. pp =
1d6d0 20 26 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 &winShmNodeList
1d6e0 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 20 3d 20 ;. while( (p =
1d6f0 2a 70 70 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 *pp)!=0 ){. i
1d700 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b f( p->nRef==0 ){
1d710 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 . int i;.
1d720 20 20 20 20 69 66 28 20 70 2d 3e 6d 75 74 65 78 if( p->mutex
1d730 20 29 7b 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 ){ sqlite3_mute
1d740 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 x_free(p->mutex)
1d750 3b 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d ; }. for(i=
1d760 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 0; i<p->nRegion;
1d770 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 42 i++){. B
1d780 4f 4f 4c 20 62 52 63 20 3d 20 6f 73 55 6e 6d 61 OOL bRc = osUnma
1d790 70 56 69 65 77 4f 66 46 69 6c 65 28 70 2d 3e 61 pViewOfFile(p->a
1d7a0 52 65 67 69 6f 6e 5b 69 5d 2e 70 4d 61 70 29 3b Region[i].pMap);
1d7b0 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 . OSTRACE
1d7c0 28 28 22 53 48 4d 2d 50 55 52 47 45 2d 55 4e 4d (("SHM-PURGE-UNM
1d7d0 41 50 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 AP pid=%lu, regi
1d7e0 6f 6e 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c on=%d, rc=%s\n",
1d7f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
1d800 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 osGetCurrentPr
1d810 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 20 62 52 ocessId(), i, bR
1d820 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c c ? "ok" : "fail
1d830 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 55 ed"));. U
1d840 4e 55 53 45 44 5f 56 41 52 49 41 42 4c 45 5f 56 NUSED_VARIABLE_V
1d850 41 4c 55 45 28 62 52 63 29 3b 0a 20 20 20 20 20 ALUE(bRc);.
1d860 20 20 20 62 52 63 20 3d 20 6f 73 43 6c 6f 73 65 bRc = osClose
1d870 48 61 6e 64 6c 65 28 70 2d 3e 61 52 65 67 69 6f Handle(p->aRegio
1d880 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20 20 20 20 n[i].hMap);.
1d890 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 OSTRACE(("SH
1d8a0 4d 2d 50 55 52 47 45 2d 43 4c 4f 53 45 20 70 69 M-PURGE-CLOSE pi
1d8b0 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64 d=%lu, region=%d
1d8c0 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 , rc=%s\n",.
1d8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 osG
1d8e0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 etCurrentProcess
1d8f0 49 64 28 29 2c 20 69 2c 20 62 52 63 20 3f 20 22 Id(), i, bRc ? "
1d900 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 ok" : "failed"))
1d910 3b 0a 20 20 20 20 20 20 20 20 55 4e 55 53 45 44 ;. UNUSED
1d920 5f 56 41 52 49 41 42 4c 45 5f 56 41 4c 55 45 28 _VARIABLE_VALUE(
1d930 62 52 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 bRc);. }.
1d940 20 20 20 20 69 66 28 20 70 2d 3e 68 46 69 6c 65 if( p->hFile
1d950 2e 68 21 3d 4e 55 4c 4c 20 26 26 20 70 2d 3e 68 .h!=NULL && p->h
1d960 46 69 6c 65 2e 68 21 3d 49 4e 56 41 4c 49 44 5f File.h!=INVALID_
1d970 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a HANDLE_VALUE ){.
1d980 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 Simulate
1d990 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 IOErrorBenign(1)
1d9a0 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 43 6c 6f ;. winClo
1d9b0 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 se((sqlite3_file
1d9c0 20 2a 29 26 70 2d 3e 68 46 69 6c 65 29 3b 0a 20 *)&p->hFile);.
1d9d0 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 SimulateI
1d9e0 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b OErrorBenign(0);
1d9f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 . }. i
1da00 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20 29 7b f( deleteFlag ){
1da10 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 . Simulat
1da20 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 eIOErrorBenign(1
1da30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 );. sqlit
1da40 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c e3BeginBenignMal
1da50 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 77 loc();. w
1da60 69 6e 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 inDelete(pVfs, p
1da70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b ->zFilename, 0);
1da80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 . sqlite3
1da90 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 EndBenignMalloc(
1daa0 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c );. Simul
1dab0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e ateIOErrorBenign
1dac0 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 (0);. }.
1dad0 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 *pp = p->pNex
1dae0 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 t;. sqlite3
1daf0 5f 66 72 65 65 28 70 2d 3e 61 52 65 67 69 6f 6e _free(p->aRegion
1db00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 );. sqlite3
1db10 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 7d 65 _free(p);. }e
1db20 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 20 3d 20 lse{. pp =
1db30 26 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d &p->pNext;. }
1db40 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 . }.}../*.** Th
1db50 65 20 44 4d 53 20 6c 6f 63 6b 20 68 61 73 20 6e e DMS lock has n
1db60 6f 74 20 79 65 74 20 62 65 65 6e 20 74 61 6b 65 ot yet been take
1db70 6e 20 6f 6e 20 73 68 6d 20 66 69 6c 65 20 70 53 n on shm file pS
1db80 68 6d 4e 6f 64 65 2e 20 41 74 74 65 6d 70 74 20 hmNode. Attempt
1db90 74 6f 0a 2a 2a 20 74 61 6b 65 20 69 74 20 6e 6f to.** take it no
1dba0 77 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 w. Return SQLITE
1dbb0 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 _OK if successfu
1dbc0 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 l, or an SQLite
1dbd0 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 error.** code ot
1dbe0 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 herwise..**.** I
1dbf0 66 20 74 68 65 20 44 4d 53 20 63 61 6e 6e 6f 74 f the DMS cannot
1dc00 20 62 65 20 6c 6f 63 6b 65 64 20 62 65 63 61 75 be locked becau
1dc10 73 65 20 74 68 69 73 20 69 73 20 61 20 72 65 61 se this is a rea
1dc20 64 6f 6e 6c 79 5f 73 68 6d 3d 31 0a 2a 2a 20 63 donly_shm=1.** c
1dc30 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20 6e 6f onnection and no
1dc40 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 61 other process a
1dc50 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 20 6c lready holds a l
1dc60 6f 63 6b 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 ock, return.** S
1dc70 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 QLITE_READONLY_C
1dc80 41 4e 54 49 4e 49 54 20 61 6e 64 20 73 65 74 20 ANTINIT and set
1dc90 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c 6f pShmNode->isUnlo
1dca0 63 6b 65 64 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 cked=1..*/.stati
1dcb0 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b 53 68 61 c int winLockSha
1dcc0 72 65 64 4d 65 6d 6f 72 79 28 77 69 6e 53 68 6d redMemory(winShm
1dcd0 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 29 7b Node *pShmNode){
1dce0 0a 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 53 . int rc = winS
1dcf0 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 hmSystemLock(pSh
1dd00 6d 4e 6f 64 65 2c 20 57 49 4e 53 48 4d 5f 57 52 mNode, WINSHM_WR
1dd10 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 LCK, WIN_SHM_DMS
1dd20 2c 20 31 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d , 1);.. if( rc=
1dd30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 =SQLITE_OK ){.
1dd40 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e if( pShmNode->
1dd50 69 73 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 isReadonly ){.
1dd60 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 pShmNode->is
1dd70 55 6e 6c 6f 63 6b 65 64 20 3d 20 31 3b 0a 20 20 Unlocked = 1;.
1dd80 20 20 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d winShmSystem
1dd90 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 57 Lock(pShmNode, W
1dda0 49 4e 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e INSHM_UNLCK, WIN
1ddb0 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 _SHM_DMS, 1);.
1ddc0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 return SQLIT
1ddd0 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 49 E_READONLY_CANTI
1dde0 4e 49 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 NIT;. }else i
1ddf0 66 28 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28 f( winTruncate((
1de00 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 sqlite3_file*)&p
1de10 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 ShmNode->hFile,
1de20 30 29 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 53 0) ){. winS
1de30 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 hmSystemLock(pSh
1de40 6d 4e 6f 64 65 2c 20 57 49 4e 53 48 4d 5f 55 4e mNode, WINSHM_UN
1de50 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 LCK, WIN_SHM_DMS
1de60 2c 20 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75 , 1);. retu
1de70 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 rn winLogError(S
1de80 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f QLITE_IOERR_SHMO
1de90 50 45 4e 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 PEN, osGetLastEr
1dea0 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 ror(),.
1deb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1dec0 22 77 69 6e 4c 6f 63 6b 53 68 61 72 65 64 4d 65 "winLockSharedMe
1ded0 6d 6f 72 79 22 2c 20 70 53 68 6d 4e 6f 64 65 2d mory", pShmNode-
1dee0 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 >zFilename);.
1def0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 }. }.. if( rc
1df00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 ==SQLITE_OK ){.
1df10 20 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c winShmSystemL
1df20 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 57 49 ock(pShmNode, WI
1df30 4e 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f NSHM_UNLCK, WIN_
1df40 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 7d SHM_DMS, 1);. }
1df50 0a 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 53 68 .. return winSh
1df60 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d mSystemLock(pShm
1df70 4e 6f 64 65 2c 20 57 49 4e 53 48 4d 5f 52 44 4c Node, WINSHM_RDL
1df80 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c CK, WIN_SHM_DMS,
1df90 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 1);.}../*.** Op
1dfa0 65 6e 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 en the shared-me
1dfb0 6d 6f 72 79 20 61 72 65 61 20 61 73 73 6f 63 69 mory area associ
1dfc0 61 74 65 64 20 77 69 74 68 20 64 61 74 61 62 61 ated with databa
1dfd0 73 65 20 66 69 6c 65 20 70 44 62 46 64 2e 0a 2a se file pDbFd..*
1dfe0 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e *.** When openin
1dff0 67 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d g a new shared-m
1e000 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e emory file, if n
1e010 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65 o other instance
1e020 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c s of that.** fil
1e030 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 e are currently
1e040 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 open, in this pr
1e050 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 ocess or in othe
1e060 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65 r processes, the
1e070 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 n.** the file mu
1e080 73 74 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 st be truncated
1e090 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f to zero length o
1e0a0 72 20 68 61 76 65 20 69 74 73 20 68 65 61 64 65 r have its heade
1e0b0 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 r cleared..*/.st
1e0c0 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e atic int winOpen
1e0d0 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 77 69 6e SharedMemory(win
1e0e0 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 File *pDbFd){.
1e0f0 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20 2a 70 struct winShm *p
1e100 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
1e110 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 /* The connec
1e120 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 tion to be opene
1e130 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 d */. winShmNod
1e140 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b e *pShmNode = 0;
1e150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 /* The
1e160 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 underlying mmap
1e170 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e ped file */. in
1e180 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b t rc = SQLITE_OK
1e190 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
1e1a0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 /* Result code
1e1b0 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 */. winShmNode
1e1c0 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 *pNew;
1e1d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 /* Newly
1e1e0 20 61 6c 6c 6f 63 61 74 65 64 20 77 69 6e 53 68 allocated winSh
1e1f0 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e mNode */. int n
1e200 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 Name;
1e210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1e220 20 53 69 7a 65 20 6f 66 20 7a 4e 61 6d 65 20 69 Size of zName i
1e230 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 61 73 n bytes */.. as
1e240 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68 sert( pDbFd->pSh
1e250 6d 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 4e 6f m==0 ); /* No
1e260 74 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 t previously ope
1e270 6e 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c ned */.. /* All
1e280 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 ocate space for
1e290 74 68 65 20 6e 65 77 20 73 71 6c 69 74 65 33 5f the new sqlite3_
1e2a0 73 68 6d 20 6f 62 6a 65 63 74 2e 20 20 41 6c 73 shm object. Als
1e2b0 6f 20 73 70 65 63 75 6c 61 74 69 76 65 6c 79 0a o speculatively.
1e2c0 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 73 70 ** allocate sp
1e2d0 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20 77 69 ace for a new wi
1e2e0 6e 53 68 6d 4e 6f 64 65 20 61 6e 64 20 66 69 6c nShmNode and fil
1e2f0 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 ename.. */. p
1e300 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a = sqlite3MallocZ
1e310 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 ero( sizeof(*p)
1e320 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 );. if( p==0 )
1e330 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f return SQLITE_IO
1e340 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a ERR_NOMEM_BKPT;.
1e350 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 nName = sqlite
1e360 33 53 74 72 6c 65 6e 33 30 28 70 44 62 46 64 2d 3Strlen30(pDbFd-
1e370 3e 7a 50 61 74 68 29 3b 0a 20 20 70 4e 65 77 20 >zPath);. pNew
1e380 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a = sqlite3MallocZ
1e390 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 ero( sizeof(*pSh
1e3a0 6d 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b mNode) + nName +
1e3b0 20 31 37 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 17 );. if( pNe
1e3c0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 w==0 ){. sqli
1e3d0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 te3_free(p);.
1e3e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 return SQLITE_I
1e3f0 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b OERR_NOMEM_BKPT;
1e400 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a 46 69 . }. pNew->zFi
1e410 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 lename = (char*)
1e420 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 73 71 6c 69 &pNew[1];. sqli
1e430 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4e 61 te3_snprintf(nNa
1e440 6d 65 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a 46 69 me+15, pNew->zFi
1e450 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 lename, "%s-shm"
1e460 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b , pDbFd->zPath);
1e470 0a 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 . sqlite3FileSu
1e480 66 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 ffix3(pDbFd->zPa
1e490 74 68 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e th, pNew->zFilen
1e4a0 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b ame);.. /* Look
1e4b0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 to see if there
1e4c0 20 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20 is an existing
1e4d0 77 69 6e 53 68 6d 4e 6f 64 65 20 74 68 61 74 20 winShmNode that
1e4e0 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 20 20 2a can be used.. *
1e4f0 2a 20 49 66 20 6e 6f 20 6d 61 74 63 68 69 6e 67 * If no matching
1e500 20 77 69 6e 53 68 6d 4e 6f 64 65 20 63 75 72 72 winShmNode curr
1e510 65 6e 74 6c 79 20 65 78 69 73 74 73 2c 20 63 72 ently exists, cr
1e520 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a eate a new one..
1e530 20 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 */. winShmEnt
1e540 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 erMutex();. for
1e550 28 70 53 68 6d 4e 6f 64 65 20 3d 20 77 69 6e 53 (pShmNode = winS
1e560 68 6d 4e 6f 64 65 4c 69 73 74 3b 20 70 53 68 6d hmNodeList; pShm
1e570 4e 6f 64 65 3b 20 70 53 68 6d 4e 6f 64 65 3d 70 Node; pShmNode=p
1e580 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 29 7b ShmNode->pNext){
1e590 0a 20 20 20 20 2f 2a 20 54 42 44 20 6e 65 65 64 . /* TBD need
1e5a0 20 74 6f 20 63 6f 6d 65 20 75 70 20 77 69 74 68 to come up with
1e5b0 20 62 65 74 74 65 72 20 6d 61 74 63 68 20 68 65 better match he
1e5c0 72 65 2e 20 20 50 65 72 68 61 70 73 0a 20 20 20 re. Perhaps.
1e5d0 20 2a 2a 20 75 73 65 20 46 49 4c 45 5f 49 44 5f ** use FILE_ID_
1e5e0 42 4f 54 48 5f 44 49 52 5f 49 4e 46 4f 20 53 74 BOTH_DIR_INFO St
1e5f0 72 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a ructure.. */.
1e600 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 if( sqlite3S
1e610 74 72 49 43 6d 70 28 70 53 68 6d 4e 6f 64 65 2d trICmp(pShmNode-
1e620 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 >zFilename, pNew
1e630 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30 20 ->zFilename)==0
1e640 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 ) break;. }. i
1e650 66 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a 20 f( pShmNode ){.
1e660 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 sqlite3_free(
1e670 70 4e 65 77 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a pNew);. }else{.
1e680 20 20 20 20 69 6e 74 20 69 6e 46 6c 61 67 73 20 int inFlags
1e690 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 = SQLITE_OPEN_WA
1e6a0 4c 3b 0a 20 20 20 20 69 6e 74 20 6f 75 74 46 6c L;. int outFl
1e6b0 61 67 73 20 3d 20 30 3b 0a 0a 20 20 20 20 70 53 ags = 0;.. pS
1e6c0 68 6d 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a 20 hmNode = pNew;.
1e6d0 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 pNew = 0;.
1e6e0 20 28 28 77 69 6e 46 69 6c 65 2a 29 28 26 70 53 ((winFile*)(&pS
1e6f0 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 29 29 2d hmNode->hFile))-
1e700 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e >h = INVALID_HAN
1e710 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20 70 DLE_VALUE;. p
1e720 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d ShmNode->pNext =
1e730 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b winShmNodeList;
1e740 0a 20 20 20 20 77 69 6e 53 68 6d 4e 6f 64 65 4c . winShmNodeL
1e750 69 73 74 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a ist = pShmNode;.
1e760 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 . if( sqlite3
1e770 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f GlobalConfig.bCo
1e780 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 reMutex ){.
1e790 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 pShmNode->mutex
1e7a0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 = sqlite3_mutex
1e7b0 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 _alloc(SQLITE_MU
1e7c0 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 TEX_FAST);.
1e7d0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d if( pShmNode->m
1e7e0 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 utex==0 ){.
1e7f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 rc = SQLITE_I
1e800 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b OERR_NOMEM_BKPT;
1e810 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 . goto sh
1e820 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 m_open_err;.
1e830 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 }. }.. i
1e840 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 75 72 f( 0==sqlite3_ur
1e850 69 5f 62 6f 6f 6c 65 61 6e 28 70 44 62 46 64 2d i_boolean(pDbFd-
1e860 3e 7a 50 61 74 68 2c 20 22 72 65 61 64 6f 6e 6c >zPath, "readonl
1e870 79 5f 73 68 6d 22 2c 20 30 29 20 29 7b 0a 20 20 y_shm", 0) ){.
1e880 20 20 20 20 69 6e 46 6c 61 67 73 20 7c 3d 20 53 inFlags |= S
1e890 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 QLITE_OPEN_READW
1e8a0 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 RITE | SQLITE_OP
1e8b0 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 7d EN_CREATE;. }
1e8c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 46 6c else{. inFl
1e8d0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 ags |= SQLITE_OP
1e8e0 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 EN_READONLY;.
1e8f0 20 7d 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f }. rc = winO
1e900 70 65 6e 28 70 44 62 46 64 2d 3e 70 56 66 73 2c pen(pDbFd->pVfs,
1e910 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 pShmNode->zFile
1e920 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 name,.
1e930 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f (sqlite3_
1e940 66 69 6c 65 2a 29 26 70 53 68 6d 4e 6f 64 65 2d file*)&pShmNode-
1e950 3e 68 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 >hFile,.
1e960 20 20 20 20 20 20 20 20 20 69 6e 46 6c 61 67 73 inFlags
1e970 2c 20 26 6f 75 74 46 6c 61 67 73 29 3b 0a 20 20 , &outFlags);.
1e980 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 if( rc!=SQLITE
1e990 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 _OK ){. rc
1e9a0 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 72 63 = winLogError(rc
1e9b0 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 , osGetLastError
1e9c0 28 29 2c 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22 (), "winOpenShm"
1e9d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
1e9e0 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 pShmNod
1e9f0 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 e->zFilename);.
1ea00 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 goto shm_op
1ea10 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 en_err;. }.
1ea20 20 20 69 66 28 20 6f 75 74 46 6c 61 67 73 3d 3d if( outFlags==
1ea30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 SQLITE_OPEN_READ
1ea40 4f 4e 4c 59 20 29 20 70 53 68 6d 4e 6f 64 65 2d ONLY ) pShmNode-
1ea50 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b >isReadonly = 1;
1ea60 0a 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f .. rc = winLo
1ea70 63 6b 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 ckSharedMemory(p
1ea80 53 68 6d 4e 6f 64 65 29 3b 0a 20 20 20 20 69 66 ShmNode);. if
1ea90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc!=SQLITE_OK
1eaa0 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 45 && rc!=SQLITE_RE
1eab0 41 44 4f 4e 4c 59 5f 43 41 4e 54 49 4e 49 54 20 ADONLY_CANTINIT
1eac0 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f ) goto shm_open_
1ead0 65 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d err;. }.. /* M
1eae0 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e ake the new conn
1eaf0 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f ection a child o
1eb00 66 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 f the winShmNode
1eb10 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 */. p->pShmNod
1eb20 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 e = pShmNode;.#i
1eb30 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 f defined(SQLITE
1eb40 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e _DEBUG) || defin
1eb50 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f ed(SQLITE_HAVE_O
1eb60 53 5f 54 52 41 43 45 29 0a 20 20 70 2d 3e 69 64 S_TRACE). p->id
1eb70 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 = pShmNode->nex
1eb80 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 tShmId++;.#endif
1eb90 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 . pShmNode->nRe
1eba0 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 f++;. pDbFd->pS
1ebb0 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e 53 68 6d hm = p;. winShm
1ebc0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 LeaveMutex();..
1ebd0 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63 /* The referenc
1ebe0 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e e count on pShmN
1ebf0 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 ode has already
1ec00 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64 been incremented
1ec10 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 20 under. ** the
1ec20 63 6f 76 65 72 20 6f 66 20 74 68 65 20 77 69 6e cover of the win
1ec30 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 20 ShmEnterMutex()
1ec40 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f mutex and the po
1ec50 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20 inter from the.
1ec60 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20 ** new (struct
1ec70 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63 74 20 74 winShm) object t
1ec80 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68 o the pShmNode h
1ec90 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c as been set. All
1eca0 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65 that is. ** le
1ecb0 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c ft to do is to l
1ecc0 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 ink the new obje
1ecd0 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b ct into the link
1ece0 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 ed list starting
1ecf0 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64 . ** at pShmNod
1ed00 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20 e->pFirst. This
1ed10 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69 must be done whi
1ed20 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70 le holding the p
1ed30 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 0a 20 ShmNode->mutex.
1ed40 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a ** mutex.. */.
1ed50 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f sqlite3_mutex_
1ed60 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e enter(pShmNode->
1ed70 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 mutex);. p->pNe
1ed80 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 xt = pShmNode->p
1ed90 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 First;. pShmNod
1eda0 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 e->pFirst = p;.
1edb0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c sqlite3_mutex_l
1edc0 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d eave(pShmNode->m
1edd0 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 utex);. return
1ede0 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 rc;.. /* Jump h
1edf0 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 ere on any error
1ee00 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 */.shm_open_err
1ee10 3a 0a 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d :. winShmSystem
1ee20 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 57 Lock(pShmNode, W
1ee30 49 4e 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e INSHM_UNLCK, WIN
1ee40 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 _SHM_DMS, 1);.
1ee50 77 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46 winShmPurge(pDbF
1ee60 64 2d 3e 70 56 66 73 2c 20 30 29 3b 20 20 20 20 d->pVfs, 0);
1ee70 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 /* This call f
1ee80 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 rees pShmNode if
1ee90 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 required */. s
1eea0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a qlite3_free(p);.
1eeb0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 sqlite3_free(p
1eec0 4e 65 77 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 New);. winShmLe
1eed0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 aveMutex();. re
1eee0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a turn rc;.}../*.*
1eef0 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 * Close a connec
1ef00 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d tion to shared-m
1ef10 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74 emory. Delete t
1ef20 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a he underlying.**
1ef30 20 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65 storage if dele
1ef40 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a teFlag is true..
1ef50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 */.static int wi
1ef60 6e 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c nShmUnmap(. sql
1ef70 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 ite3_file *fd,
1ef80 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 /* Datab
1ef90 61 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 ase holding shar
1efa0 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 ed memory */. i
1efb0 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20 nt deleteFlag
1efc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c /* Del
1efd0 65 74 65 20 61 66 74 65 72 20 63 6c 6f 73 69 6e ete after closin
1efe0 67 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a g if true */.){.
1eff0 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 winFile *pDbFd
1f000 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 ; /* Datab
1f010 61 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 ase holding shar
1f020 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 ed-memory */. w
1f030 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 inShm *p;
1f040 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e /* The conn
1f050 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f ection to be clo
1f060 73 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e sed */. winShmN
1f070 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f ode *pShmNode; /
1f080 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 * The underlying
1f090 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 shared-memory f
1f0a0 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 ile */. winShm
1f0b0 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 2f **pp; /
1f0c0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 * For looping ov
1f0d0 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 er sibling conne
1f0e0 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 70 44 62 ctions */.. pDb
1f0f0 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 Fd = (winFile*)f
1f100 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e d;. p = pDbFd->
1f110 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 pShm;. if( p==0
1f120 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 ) return SQLITE
1f130 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 _OK;. pShmNode
1f140 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a = p->pShmNode;..
1f150 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e /* Remove conn
1f160 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 ection p from th
1f170 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 e set of connect
1f180 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a ions associated.
1f190 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f ** with pShmNo
1f1a0 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f de */. sqlite3_
1f1b0 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d mutex_enter(pShm
1f1c0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 Node->mutex);.
1f1d0 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 for(pp=&pShmNode
1f1e0 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21 ->pFirst; (*pp)!
1f1f0 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d =p; pp = &(*pp)-
1f200 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 >pNext){}. *pp
1f210 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f = p->pNext;.. /
1f220 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 * Free the conne
1f230 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c ction p */. sql
1f240 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 ite3_free(p);.
1f250 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b pDbFd->pShm = 0;
1f260 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 . sqlite3_mutex
1f270 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d _leave(pShmNode-
1f280 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 >mutex);.. /* I
1f290 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 f pShmNode->nRef
1f2a0 20 68 61 73 20 72 65 61 63 68 65 64 20 30 2c 20 has reached 0,
1f2b0 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 then close the u
1f2c0 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 nderlying. ** s
1f2d0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c hared-memory fil
1f2e0 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 77 69 6e 53 e, too */. winS
1f2f0 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a hmEnterMutex();.
1f300 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f assert( pShmNo
1f310 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 de->nRef>0 );.
1f320 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d pShmNode->nRef--
1f330 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 ;. if( pShmNode
1f340 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 ->nRef==0 ){.
1f350 20 77 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62 winShmPurge(pDb
1f360 46 64 2d 3e 70 56 66 73 2c 20 64 65 6c 65 74 65 Fd->pVfs, delete
1f370 46 6c 61 67 29 3b 0a 20 20 7d 0a 20 20 77 69 6e Flag);. }. win
1f380 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b ShmLeaveMutex();
1f390 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 .. return SQLIT
1f3a0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 E_OK;.}../*.** C
1f3b0 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 hange the lock s
1f3c0 74 61 74 65 20 66 6f 72 20 61 20 73 68 61 72 65 tate for a share
1f3d0 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 d-memory segment
1f3e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 ..*/.static int
1f3f0 77 69 6e 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 winShmLock(. sq
1f400 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 lite3_file *fd,
1f410 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 /* Data
1f420 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e base file holdin
1f430 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d g the shared mem
1f440 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 ory */. int ofs
1f450 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 t,
1f460 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 /* First loc
1f470 6b 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 k to acquire or
1f480 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 release */. int
1f490 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 n,
1f4a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 /* Numbe
1f4b0 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 r of locks to ac
1f4c0 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 quire or release
1f4d0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 */. int flags
1f4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1f4f0 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 /* What to do w
1f500 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a ith the lock */.
1f510 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 ){. winFile *pD
1f520 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 bFd = (winFile*)
1f530 66 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f fd; /* Co
1f540 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 nnection holding
1f550 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a shared memory *
1f560 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20 /. winShm *p =
1f570 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 pDbFd->pShm;
1f580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 /* The
1f590 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 shared memory b
1f5a0 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 eing locked */.
1f5b0 20 77 69 6e 53 68 6d 20 2a 70 58 3b 20 20 20 20 winShm *pX;
1f5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1f5d0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f /* For lo
1f5e0 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 oping over all s
1f5f0 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 77 69 6e iblings */. win
1f600 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 ShmNode *pShmNod
1f610 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b e = p->pShmNode;
1f620 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 . int rc = SQLI
1f630 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 TE_OK;
1f640 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 /* Resu
1f650 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 lt code */. u16
1f660 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 mask;
1f670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1f680 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f /* Mask of lo
1f690 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 cks to take or r
1f6a0 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 elease */.. ass
1f6b0 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 ert( ofst>=0 &&
1f6c0 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 ofst+n<=SQLITE_S
1f6d0 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 HM_NLOCK );. as
1f6e0 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 sert( n>=1 );.
1f6f0 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 assert( flags==(
1f700 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 SQLITE_SHM_LOCK
1f710 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 | SQLITE_SHM_SHA
1f720 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 RED). || f
1f730 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 lags==(SQLITE_SH
1f740 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f M_LOCK | SQLITE_
1f750 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 SHM_EXCLUSIVE).
1f760 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d || flags==
1f770 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f (SQLITE_SHM_UNLO
1f780 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f CK | SQLITE_SHM_
1f790 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c SHARED). |
1f7a0 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 | flags==(SQLITE
1f7b0 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 _SHM_UNLOCK | SQ
1f7c0 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 LITE_SHM_EXCLUSI
1f7d0 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 VE) );. assert(
1f7e0 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 n==1 || (flags
1f7f0 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 & SQLITE_SHM_EXC
1f800 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a 0a 20 LUSIVE)!=0 );..
1f810 20 6d 61 73 6b 20 3d 20 28 75 31 36 29 28 28 31 mask = (u16)((1
1f820 55 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 U<<(ofst+n)) - (
1f830 31 55 3c 3c 6f 66 73 74 29 29 3b 0a 20 20 61 73 1U<<ofst));. as
1f840 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 sert( n>1 || mas
1f850 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a k==(1<<ofst) );.
1f860 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f sqlite3_mutex_
1f870 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e enter(pShmNode->
1f880 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c mutex);. if( fl
1f890 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d ags & SQLITE_SHM
1f8a0 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 _UNLOCK ){. u
1f8b0 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 16 allMask = 0;
1f8c0 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 /* Mask of locks
1f8d0 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 held by sibling
1f8e0 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 s */.. /* See
1f8f0 20 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 if any siblings
1f900 20 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 hold this same
1f910 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 lock */. for(
1f920 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 pX=pShmNode->pFi
1f930 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e rst; pX; pX=pX->
1f940 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 pNext){. if
1f950 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e ( pX==p ) contin
1f960 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 ue;. assert
1f970 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 ( (pX->exclMask
1f980 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 & (p->exclMask|p
1f990 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d ->sharedMask))==
1f9a0 30 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 0 );. allMa
1f9b0 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 sk |= pX->shared
1f9c0 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 Mask;. }..
1f9d0 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 /* Unlock the s
1f9e0 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b ystem-level lock
1f9f0 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 s */. if( (ma
1fa00 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 sk & allMask)==0
1fa10 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 ){. rc = w
1fa20 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 inShmSystemLock(
1fa30 70 53 68 6d 4e 6f 64 65 2c 20 57 49 4e 53 48 4d pShmNode, WINSHM
1fa40 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e _UNLCK, ofst+WIN
1fa50 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 _SHM_BASE, n);.
1fa60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
1fa70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a rc = SQLITE_OK;.
1fa80 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e }.. /* Un
1fa90 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 do the local loc
1faa0 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 ks */. if( rc
1fab0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 ==SQLITE_OK ){.
1fac0 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b p->exclMask
1fad0 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 &= ~mask;.
1fae0 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 p->sharedMask &
1faf0 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 = ~mask;. }.
1fb00 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 }else if( flags
1fb10 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 & SQLITE_SHM_SH
1fb20 41 52 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20 ARED ){. u16
1fb30 61 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20 allShared = 0;
1fb40 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b /* Union of lock
1fb50 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 s held by connec
1fb60 74 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e tions other than
1fb70 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 "p" */.. /*
1fb80 46 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73 Find out which s
1fb90 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 hared locks are
1fba0 61 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79 20 already held by
1fbb0 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 sibling connecti
1fbc0 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 ons.. ** If a
1fbd0 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 ny sibling alrea
1fbe0 64 79 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c dy holds an excl
1fbf0 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 usive lock, go a
1fc00 68 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a head and return.
1fc10 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 ** SQLITE_BU
1fc20 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 SY.. */. f
1fc30 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e or(pX=pShmNode->
1fc40 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 pFirst; pX; pX=p
1fc50 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 X->pNext){.
1fc60 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 if( (pX->exclMa
1fc70 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b sk & mask)!=0 ){
1fc80 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 . rc = SQ
1fc90 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 LITE_BUSY;.
1fca0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 break;.
1fcb0 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65 }. allShare
1fcc0 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d d |= pX->sharedM
1fcd0 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ask;. }..
1fce0 2f 2a 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f /* Get shared lo
1fcf0 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65 cks at the syste
1fd00 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 m level, if nece
1fd10 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 ssary */. if(
1fd20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 rc==SQLITE_OK )
1fd30 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c {. if( (all
1fd40 53 68 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d Shared & mask)==
1fd50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 0 ){. rc
1fd60 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f = winShmSystemLo
1fd70 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 57 49 4e ck(pShmNode, WIN
1fd80 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b SHM_RDLCK, ofst+
1fd90 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 WIN_SHM_BASE, n)
1fda0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 ;. }else{.
1fdb0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 rc = SQLI
1fdc0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 TE_OK;. }.
1fdd0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 }.. /* Get
1fde0 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 the local share
1fdf0 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 d locks */. i
1fe00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b f( rc==SQLITE_OK
1fe10 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 ){. p->sha
1fe20 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b redMask |= mask;
1fe30 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a . }. }else{.
1fe40 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 /* Make sure
1fe50 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e no sibling conn
1fe60 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 ections hold loc
1fe70 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f ks that will blo
1fe80 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c ck this. ** l
1fe90 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c ock. If any do,
1fea0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 return SQLITE_B
1feb0 55 53 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a USY right away..
1fec0 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 */. for(p
1fed0 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 X=pShmNode->pFir
1fee0 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 st; pX; pX=pX->p
1fef0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 Next){. if(
1ff00 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 (pX->exclMask &
1ff10 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 mask)!=0 || (pX
1ff20 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d ->sharedMask & m
1ff30 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 ask)!=0 ){.
1ff40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 rc = SQLITE_B
1ff50 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 USY;. bre
1ff60 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 ak;. }.
1ff70 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 }.. /* Get th
1ff80 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b e exclusive lock
1ff90 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 s at the system
1ffa0 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 level. Then if
1ffb0 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a successful. *
1ffc0 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 * also mark the
1ffd0 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e local connection
1ffe0 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 as being locked
1fff0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 .. */. if(
20000 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 rc==SQLITE_OK )
20010 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e {. rc = win
20020 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 ShmSystemLock(pS
20030 68 6d 4e 6f 64 65 2c 20 57 49 4e 53 48 4d 5f 57 hmNode, WINSHM_W
20040 52 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 RLCK, ofst+WIN_S
20050 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 HM_BASE, n);.
20060 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 if( rc==SQLIT
20070 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 E_OK ){.
20080 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72 assert( (p->shar
20090 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d edMask & mask)==
200a0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 0 );. p->
200b0 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b exclMask |= mask
200c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a ;. }. }.
200d0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 }. sqlite3_mu
200e0 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f tex_leave(pShmNo
200f0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 de->mutex);. OS
20100 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b TRACE(("SHM-LOCK
20110 20 70 69 64 3d 25 6c 75 2c 20 69 64 3d 25 64 2c pid=%lu, id=%d,
20120 20 73 68 61 72 65 64 4d 61 73 6b 3d 25 30 33 78 sharedMask=%03x
20130 2c 20 65 78 63 6c 4d 61 73 6b 3d 25 30 33 78 2c , exclMask=%03x,
20140 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 rc=%s\n",.
20150 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 osGetCurre
20160 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 ntProcessId(), p
20170 2d 3e 69 64 2c 20 70 2d 3e 73 68 61 72 65 64 4d ->id, p->sharedM
20180 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b ask, p->exclMask
20190 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c ,. sql
201a0 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 ite3ErrName(rc))
201b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a );. return rc;.
201c0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 }../*.** Impleme
201d0 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 nt a memory barr
201e0 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 ier or memory fe
201f0 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 nce on shared me
20200 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 mory..**.** All
20210 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73 loads and stores
20220 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68 begun before th
20230 65 20 62 61 72 72 69 65 72 20 6d 75 73 74 20 63 e barrier must c
20240 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a omplete before.*
20250 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 * any load or st
20260 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65 72 20 ore begun after
20270 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a the barrier..*/.
20280 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 static void winS
20290 68 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c hmBarrier(. sql
202a0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 ite3_file *fd
202b0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 /* Databa
202c0 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 se holding the s
202d0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a hared memory */.
202e0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 ){. UNUSED_PARA
202f0 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 73 71 6c METER(fd);. sql
20300 69 74 65 33 4d 65 6d 6f 72 79 42 61 72 72 69 65 ite3MemoryBarrie
20310 72 28 29 3b 20 20 20 2f 2a 20 63 6f 6d 70 69 6c r(); /* compil
20320 65 72 2d 64 65 66 69 6e 65 64 20 6d 65 6d 6f 72 er-defined memor
20330 79 20 62 61 72 72 69 65 72 20 2a 2f 0a 20 20 77 y barrier */. w
20340 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 inShmEnterMutex(
20350 29 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f ); /* Also
20360 20 6d 75 74 65 78 2c 20 66 6f 72 20 72 65 64 75 mutex, for redu
20370 6e 64 61 6e 63 79 20 2a 2f 0a 20 20 77 69 6e 53 ndancy */. winS
20380 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a hmLeaveMutex();.
20390 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 }../*.** This fu
203a0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 nction is called
203b0 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 to obtain a poi
203c0 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 nter to region i
203d0 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a Region of the.**
203e0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 shared-memory a
203f0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 ssociated with t
20400 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 he database file
20410 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f fd. Shared-memo
20420 72 79 20 72 65 67 69 6f 6e 73 0a 2a 2a 20 61 72 ry regions.** ar
20430 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 e numbered start
20440 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 ing from zero. E
20450 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 ach shared-memor
20460 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 y region is szRe
20470 67 69 6f 6e 0a 2a 2a 20 62 79 74 65 73 20 69 6e gion.** bytes in
20480 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 size..**.** If
20490 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c an error occurs,
204a0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 an error code i
204b0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a s returned and *
204c0 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c pp is set to NUL
204d0 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 L..**.** Otherwi
204e0 73 65 2c 20 69 66 20 74 68 65 20 69 73 57 72 69 se, if the isWri
204f0 74 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 te parameter is
20500 30 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 0 and the reques
20510 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 ted shared-memor
20520 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 y.** region has
20530 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 not been allocat
20540 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e ed (by any clien
20550 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 t, including one
20560 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a running in a.**
20570 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 separate proces
20580 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20 s), then *pp is
20590 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 set to NULL and
205a0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e SQLITE_OK return
205b0 65 64 2e 20 49 66 0a 2a 2a 20 69 73 57 72 69 74 ed. If.** isWrit
205c0 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e e is non-zero an
205d0 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 d the requested
205e0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 shared-memory re
205f0 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 gion has not yet
20600 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 .** been allocat
20610 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 ed, it is alloca
20620 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 ted by this func
20630 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 tion..**.** If t
20640 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 he shared-memory
20650 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 region has alre
20660 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 ady been allocat
20670 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 ed or is allocat
20680 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 ed by.** this ca
20690 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20 ll as described
206a0 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69 above, then it i
206b0 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 s mapped into th
206c0 69 73 20 70 72 6f 63 65 73 73 65 73 0a 2a 2a 20 is processes.**
206d0 61 64 64 72 65 73 73 20 73 70 61 63 65 20 28 69 address space (i
206e0 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 f it is not alre
206f0 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74 ady), *pp is set
20700 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 to point to the
20710 20 6d 61 70 70 65 64 0a 2a 2a 20 6d 65 6d 6f 72 mapped.** memor
20720 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 y and SQLITE_OK
20730 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 returned..*/.sta
20740 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 61 tic int winShmMa
20750 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c p(. sqlite3_fil
20760 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 e *fd,
20770 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f /* Handle o
20780 70 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 pen on database
20790 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 file */. int iR
207a0 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 egion,
207b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 /* Reg
207c0 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 ion to retrieve
207d0 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f */. int szRegio
207e0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 n,
207f0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 /* Size of
20800 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 regions */. int
20810 20 69 73 57 72 69 74 65 2c 20 20 20 20 20 20 20 isWrite,
20820 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
20830 54 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66 True to extend f
20840 69 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 ile if necessary
20850 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 */. void volat
20860 69 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20 ile **pp
20870 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 /* OUT: Ma
20880 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 pped memory */.)
20890 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 {. winFile *pDb
208a0 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 Fd = (winFile*)f
208b0 64 3b 0a 20 20 77 69 6e 53 68 6d 20 2a 70 53 68 d;. winShm *pSh
208c0 6d 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b m = pDbFd->pShm;
208d0 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 . winShmNode *p
208e0 53 68 6d 4e 6f 64 65 3b 0a 20 20 44 57 4f 52 44 ShmNode;. DWORD
208f0 20 70 72 6f 74 65 63 74 20 3d 20 50 41 47 45 5f protect = PAGE_
20900 52 45 41 44 57 52 49 54 45 3b 0a 20 20 44 57 4f READWRITE;. DWO
20910 52 44 20 66 6c 61 67 73 20 3d 20 46 49 4c 45 5f RD flags = FILE_
20920 4d 41 50 5f 57 52 49 54 45 20 7c 20 46 49 4c 45 MAP_WRITE | FILE
20930 5f 4d 41 50 5f 52 45 41 44 3b 0a 20 20 69 6e 74 _MAP_READ;. int
20940 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b rc = SQLITE_OK;
20950 0a 0a 20 20 69 66 28 20 21 70 53 68 6d 20 29 7b .. if( !pShm ){
20960 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 . rc = winOpe
20970 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 nSharedMemory(pD
20980 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 bFd);. if( rc
20990 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 !=SQLITE_OK ) re
209a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 53 68 turn rc;. pSh
209b0 6d 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b m = pDbFd->pShm;
209c0 0a 20 20 7d 0a 20 20 70 53 68 6d 4e 6f 64 65 20 . }. pShmNode
209d0 3d 20 70 53 68 6d 2d 3e 70 53 68 6d 4e 6f 64 65 = pShm->pShmNode
209e0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 ;.. sqlite3_mut
209f0 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 ex_enter(pShmNod
20a00 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 e->mutex);. if(
20a10 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c pShmNode->isUnl
20a20 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 72 63 20 ocked ){. rc
20a30 3d 20 77 69 6e 4c 6f 63 6b 53 68 61 72 65 64 4d = winLockSharedM
20a40 65 6d 6f 72 79 28 70 53 68 6d 4e 6f 64 65 29 3b emory(pShmNode);
20a50 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c . if( rc!=SQL
20a60 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 68 ITE_OK ) goto sh
20a70 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 70 mpage_out;. p
20a80 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c 6f 63 ShmNode->isUnloc
20a90 6b 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 ked = 0;. }. a
20aa0 73 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d ssert( szRegion=
20ab0 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 =pShmNode->szReg
20ac0 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d ion || pShmNode-
20ad0 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 0a >nRegion==0 );..
20ae0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e if( pShmNode->
20af0 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e nRegion<=iRegion
20b00 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 ){. struct S
20b10 68 6d 52 65 67 69 6f 6e 20 2a 61 70 4e 65 77 3b hmRegion *apNew;
20b20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 /* Ne
20b30 77 20 61 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 w aRegion[] arra
20b40 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 y */. int nBy
20b50 74 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 te = (iRegion+1)
20b60 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d *szRegion; /* M
20b70 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 inimum required
20b80 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 file size */.
20b90 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 sqlite3_int64 s
20ba0 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 z;
20bb0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 /* Current s
20bc0 69 7a 65 20 6f 66 20 77 61 6c 2d 69 6e 64 65 78 ize of wal-index
20bd0 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 70 53 file */.. pS
20be0 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e hmNode->szRegion
20bf0 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 = szRegion;..
20c00 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 /* The request
20c10 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 ed region is not
20c20 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 mapped into thi
20c30 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 s processes addr
20c40 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20 2a ess space.. *
20c50 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 * Check to see i
20c60 66 20 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c f it has been al
20c70 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66 located (i.e. if
20c80 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 the wal-index f
20c90 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 6c 61 ile is. ** la
20ca0 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f rge enough to co
20cb0 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 ntain the reques
20cc0 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 ted region)..
20cd0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 69 6e */. rc = win
20ce0 46 69 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65 FileSize((sqlite
20cf0 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 3_file *)&pShmNo
20d00 64 65 2d 3e 68 46 69 6c 65 2c 20 26 73 7a 29 3b de->hFile, &sz);
20d10 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c . if( rc!=SQL
20d20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 ITE_OK ){.
20d30 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 rc = winLogError
20d40 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 (SQLITE_IOERR_SH
20d50 4d 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73 74 MSIZE, osGetLast
20d60 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 Error(),.
20d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20d80 22 77 69 6e 53 68 6d 4d 61 70 31 22 2c 20 70 44 "winShmMap1", pD
20d90 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 bFd->zPath);.
20da0 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f goto shmpage_
20db0 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 out;. }..
20dc0 69 66 28 20 73 7a 3c 6e 42 79 74 65 20 29 7b 0a if( sz<nByte ){.
20dd0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 /* The req
20de0 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 uested memory re
20df0 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 gion does not ex
20e00 69 73 74 2e 20 49 66 20 69 73 57 72 69 74 65 20 ist. If isWrite
20e10 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20 is set to.
20e20 2a 2a 20 7a 65 72 6f 2c 20 65 78 69 74 20 65 61 ** zero, exit ea
20e30 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 rly. *pp will be
20e40 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 set to NULL and
20e50 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 SQLITE_OK retur
20e60 6e 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 ned.. **.
20e70 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69 ** Alternati
20e80 76 65 6c 79 2c 20 69 66 20 69 73 57 72 69 74 65 vely, if isWrite
20e90 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75 73 is non-zero, us
20ea0 65 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f e ftruncate() to
20eb0 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20 allocate.
20ec0 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 ** the requested
20ed0 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a memory region..
20ee0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 */. i
20ef0 66 28 20 21 69 73 57 72 69 74 65 20 29 20 67 6f f( !isWrite ) go
20f00 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a to shmpage_out;.
20f10 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 rc = winTr
20f20 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f uncate((sqlite3_
20f30 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 file *)&pShmNode
20f40 2d 3e 68 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b ->hFile, nByte);
20f50 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 . if( rc!=S
20f60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 QLITE_OK ){.
20f70 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 rc = winLogE
20f80 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 rror(SQLITE_IOER
20f90 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74 R_SHMSIZE, osGet
20fa0 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 LastError(),.
20fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20fc0 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 "winShmMap
20fd0 32 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 2", pDbFd->zPath
20fe0 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 );. goto
20ff0 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 shmpage_out;.
21000 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 }. }..
21010 2f 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 /* Map the reque
21020 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 sted memory regi
21030 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f on into this pro
21040 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73 cesses address s
21050 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e pace. */. apN
21060 65 77 20 3d 20 28 73 74 72 75 63 74 20 53 68 6d ew = (struct Shm
21070 52 65 67 69 6f 6e 20 2a 29 73 71 6c 69 74 65 33 Region *)sqlite3
21080 5f 72 65 61 6c 6c 6f 63 36 34 28 0a 20 20 20 20 _realloc64(.
21090 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 pShmNode->aR
210a0 65 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b egion, (iRegion+
210b0 31 29 2a 73 69 7a 65 6f 66 28 61 70 4e 65 77 5b 1)*sizeof(apNew[
210c0 30 5d 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 0]). );. i
210d0 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 f( !apNew ){.
210e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 rc = SQLITE_I
210f0 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b OERR_NOMEM_BKPT;
21100 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 . goto shmp
21110 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 age_out;. }.
21120 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 pShmNode->aRe
21130 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a 20 gion = apNew;..
21140 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d if( pShmNode-
21150 3e 69 73 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 >isReadonly ){.
21160 20 20 20 20 20 70 72 6f 74 65 63 74 20 3d 20 50 protect = P
21170 41 47 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 AGE_READONLY;.
21180 20 20 20 20 66 6c 61 67 73 20 3d 20 46 49 4c 45 flags = FILE
21190 5f 4d 41 50 5f 52 45 41 44 3b 0a 20 20 20 20 7d _MAP_READ;. }
211a0 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53 68 .. while( pSh
211b0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d mNode->nRegion<=
211c0 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 iRegion ){.
211d0 20 48 41 4e 44 4c 45 20 68 4d 61 70 20 3d 20 4e HANDLE hMap = N
211e0 55 4c 4c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 ULL; /*
211f0 66 69 6c 65 2d 6d 61 70 70 69 6e 67 20 68 61 6e file-mapping han
21200 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69 dle */. voi
21210 64 20 2a 70 4d 61 70 20 3d 20 30 3b 20 20 20 20 d *pMap = 0;
21220 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 /* Mapp
21230 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e ed memory region
21240 20 2a 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f */..#if SQLITE_
21250 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 68 OS_WINRT. h
21260 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 Map = osCreateFi
21270 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 leMappingFromApp
21280 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 (pShmNode->hFile
21290 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55 .h,. NU
212a0 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 20 6e 42 79 LL, protect, nBy
212b0 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 te, NULL. )
212c0 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 ;.#elif defined(
212d0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 SQLITE_WIN32_HAS
212e0 5f 57 49 44 45 29 0a 20 20 20 20 20 20 68 4d 61 _WIDE). hMa
212f0 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 p = osCreateFile
21300 4d 61 70 70 69 6e 67 57 28 70 53 68 6d 4e 6f 64 MappingW(pShmNod
21310 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20 e->hFile.h,.
21320 20 20 20 20 20 20 4e 55 4c 4c 2c 20 70 72 6f 74 NULL, prot
21330 65 63 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e ect, 0, nByte, N
21340 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c ULL. );.#el
21350 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 if defined(SQLIT
21360 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 E_WIN32_HAS_ANSI
21370 29 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 ) && SQLITE_WIN3
21380 32 5f 43 52 45 41 54 45 46 49 4c 45 4d 41 50 50 2_CREATEFILEMAPP
21390 49 4e 47 41 0a 20 20 20 20 20 20 68 4d 61 70 20 INGA. hMap
213a0 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 = osCreateFileMa
213b0 70 70 69 6e 67 41 28 70 53 68 6d 4e 6f 64 65 2d ppingA(pShmNode-
213c0 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20 >hFile.h,.
213d0 20 20 20 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 NULL, protec
213e0 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c t, 0, nByte, NUL
213f0 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69 L. );.#endi
21400 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 f. OSTRACE(
21410 28 22 53 48 4d 2d 4d 41 50 2d 43 52 45 41 54 45 ("SHM-MAP-CREATE
21420 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e pid=%lu, region
21430 3d 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72 63 =%d, size=%d, rc
21440 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 =%s\n",.
21450 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 osGetCurr
21460 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 entProcessId(),
21470 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f pShmNode->nRegio
21480 6e 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 n, nByte,.
21490 20 20 20 20 20 20 20 20 20 68 4d 61 70 20 3f 20 hMap ?
214a0 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 "ok" : "failed")
214b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 4d 61 );. if( hMa
214c0 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 p ){. int
214d0 20 69 4f 66 66 73 65 74 20 3d 20 70 53 68 6d 4e iOffset = pShmN
214e0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52 ode->nRegion*szR
214f0 65 67 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 egion;. i
21500 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66 74 20 nt iOffsetShift
21510 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53 = iOffset % winS
21520 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 ysInfo.dwAllocat
21530 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a ionGranularity;.
21540 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 #if SQLITE_OS_WI
21550 4e 52 54 0a 20 20 20 20 20 20 20 20 70 4d 61 70 NRT. pMap
21560 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 = osMapViewOfFi
21570 6c 65 46 72 6f 6d 41 70 70 28 68 4d 61 70 2c 20 leFromApp(hMap,
21580 66 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 flags,.
21590 20 20 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 iOffset - iOf
215a0 66 73 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67 fsetShift, szReg
215b0 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69 ion + iOffsetShi
215c0 66 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 65 ft. );.#e
215d0 6c 73 65 0a 20 20 20 20 20 20 20 20 70 4d 61 70 lse. pMap
215e0 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 = osMapViewOfFi
215f0 6c 65 28 68 4d 61 70 2c 20 66 6c 61 67 73 2c 0a le(hMap, flags,.
21600 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 69 0, i
21610 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73 65 74 Offset - iOffset
21620 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20 Shift, szRegion
21630 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74 0a 20 + iOffsetShift.
21640 20 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 );.#endif
21650 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 . OSTRACE
21660 28 28 22 53 48 4d 2d 4d 41 50 2d 4d 41 50 20 70 (("SHM-MAP-MAP p
21670 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 id=%lu, region=%
21680 64 2c 20 6f 66 66 73 65 74 3d 25 64 2c 20 73 69 d, offset=%d, si
21690 7a 65 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c ze=%d, rc=%s\n",
216a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
216b0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 osGetCurrentPr
216c0 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68 6d 4e ocessId(), pShmN
216d0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 69 4f ode->nRegion, iO
216e0 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20 20 20 ffset,.
216f0 20 20 20 20 20 20 20 20 73 7a 52 65 67 69 6f 6e szRegion
21700 2c 20 70 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 , pMap ? "ok" :
21710 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 "failed"));.
21720 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 }. if( !p
21730 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 Map ){. p
21740 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72 ShmNode->lastErr
21750 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 no = osGetLastEr
21760 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 72 ror();. r
21770 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 c = winLogError(
21780 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d SQLITE_IOERR_SHM
21790 4d 41 50 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c MAP, pShmNode->l
217a0 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 astErrno,.
217b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
217c0 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 33 22 2c "winShmMap3",
217d0 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a pDbFd->zPath);.
217e0 20 20 20 20 20 20 20 20 69 66 28 20 68 4d 61 70 if( hMap
217f0 20 29 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 ) osCloseHandle
21800 28 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 (hMap);.
21810 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 goto shmpage_out
21820 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 ;. }..
21830 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 pShmNode->aRegi
21840 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 on[pShmNode->nRe
21850 67 69 6f 6e 5d 2e 70 4d 61 70 20 3d 20 70 4d 61 gion].pMap = pMa
21860 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 p;. pShmNod
21870 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e e->aRegion[pShmN
21880 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 68 4d ode->nRegion].hM
21890 61 70 20 3d 20 68 4d 61 70 3b 0a 20 20 20 20 20 ap = hMap;.
218a0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 pShmNode->nRegi
218b0 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a on++;. }. }.
218c0 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 .shmpage_out:.
218d0 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 if( pShmNode->nR
218e0 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b egion>iRegion ){
218f0 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 . int iOffset
21900 20 3d 20 69 52 65 67 69 6f 6e 2a 73 7a 52 65 67 = iRegion*szReg
21910 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 ion;. int iOf
21920 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66 fsetShift = iOff
21930 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f set % winSysInfo
21940 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 .dwAllocationGra
21950 6e 75 6c 61 72 69 74 79 3b 0a 20 20 20 20 63 68 nularity;. ch
21960 61 72 20 2a 70 20 3d 20 28 63 68 61 72 20 2a 29 ar *p = (char *)
21970 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f pShmNode->aRegio
21980 6e 5b 69 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 3b n[iRegion].pMap;
21990 0a 20 20 20 20 2a 70 70 20 3d 20 28 76 6f 69 64 . *pp = (void
219a0 20 2a 29 26 70 5b 69 4f 66 66 73 65 74 53 68 69 *)&p[iOffsetShi
219b0 66 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 ft];. }else{.
219c0 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 *pp = 0;. }.
219d0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 if( pShmNode->i
219e0 73 52 65 61 64 6f 6e 6c 79 20 26 26 20 72 63 3d sReadonly && rc=
219f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 =SQLITE_OK ) rc
21a00 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c = SQLITE_READONL
21a10 59 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 Y;. sqlite3_mut
21a20 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 ex_leave(pShmNod
21a30 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 e->mutex);. ret
21a40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 urn rc;.}..#else
21a50 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d .# define winShm
21a60 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65 66 69 Map 0.# defi
21a70 6e 65 20 77 69 6e 53 68 6d 4c 6f 63 6b 20 20 20 ne winShmLock
21a80 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 0.# define winS
21a90 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64 65 hmBarrier 0.# de
21aa0 66 69 6e 65 20 77 69 6e 53 68 6d 55 6e 6d 61 70 fine winShmUnmap
21ab0 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 0.#endif /* #
21ac0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d ifndef SQLITE_OM
21ad0 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a IT_WAL */../*.**
21ae0 20 43 6c 65 61 6e 73 20 75 70 20 74 68 65 20 6d Cleans up the m
21af0 61 70 70 65 64 20 72 65 67 69 6f 6e 20 6f 66 20 apped region of
21b00 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 the specified fi
21b10 6c 65 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 le, if any..*/.#
21b20 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d if SQLITE_MAX_MM
21b30 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 AP_SIZE>0.static
21b40 20 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66 69 6c int winUnmapfil
21b50 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 e(winFile *pFile
21b60 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 ){. assert( pFi
21b70 6c 65 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 le!=0 );. OSTRA
21b80 43 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 CE(("UNMAP-FILE
21b90 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 pid=%lu, pFile=%
21ba0 70 2c 20 68 4d 61 70 3d 25 70 2c 20 70 4d 61 70 p, hMap=%p, pMap
21bb0 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 Region=%p, ".
21bc0 20 20 20 20 20 20 20 20 22 6d 6d 61 70 53 69 7a "mmapSiz
21bd0 65 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a 65 e=%lld, mmapSize
21be0 41 63 74 75 61 6c 3d 25 6c 6c 64 2c 20 6d 6d 61 Actual=%lld, mma
21bf0 70 53 69 7a 65 4d 61 78 3d 25 6c 6c 64 5c 6e 22 pSizeMax=%lld\n"
21c00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 ,. osG
21c10 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 etCurrentProcess
21c20 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 Id(), pFile, pFi
21c30 6c 65 2d 3e 68 4d 61 70 2c 20 70 46 69 6c 65 2d le->hMap, pFile-
21c40 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 0a 20 20 20 >pMapRegion,.
21c50 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d pFile->m
21c60 6d 61 70 53 69 7a 65 2c 20 70 46 69 6c 65 2d 3e mapSize, pFile->
21c70 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 2c 20 mmapSizeActual,
21c80 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d pFile->mmapSizeM
21c90 61 78 29 29 3b 0a 20 20 69 66 28 20 70 46 69 6c ax));. if( pFil
21ca0 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b e->pMapRegion ){
21cb0 0a 20 20 20 20 69 66 28 20 21 6f 73 55 6e 6d 61 . if( !osUnma
21cc0 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c pViewOfFile(pFil
21cd0 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 20 29 e->pMapRegion) )
21ce0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c {. pFile->l
21cf0 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 astErrno = osGet
21d00 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 LastError();.
21d10 20 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d OSTRACE(("UNM
21d20 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c AP-FILE pid=%lu,
21d30 20 70 46 69 6c 65 3d 25 70 2c 20 70 4d 61 70 52 pFile=%p, pMapR
21d40 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20 egion=%p, ".
21d50 20 20 20 20 20 20 20 20 20 20 20 22 72 63 3d 53 "rc=S
21d60 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 QLITE_IOERR_MMAP
21d70 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72 72 65 6e \n", osGetCurren
21d80 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 tProcessId(), pF
21d90 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 ile,.
21da0 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 pFile->pMapR
21db0 65 67 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20 72 egion));. r
21dc0 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f eturn winLogErro
21dd0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d r(SQLITE_IOERR_M
21de0 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 MAP, pFile->last
21df0 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 Errno,.
21e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
21e10 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65 31 22 2c "winUnmapfile1",
21e20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a pFile->zPath);.
21e30 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d }. pFile-
21e40 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b >pMapRegion = 0;
21e50 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 . pFile->mmap
21e60 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 Size = 0;. pF
21e70 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 ile->mmapSizeAct
21e80 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 ual = 0;. }. i
21e90 66 28 20 70 46 69 6c 65 2d 3e 68 4d 61 70 21 3d f( pFile->hMap!=
21ea0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 NULL ){. if(
21eb0 21 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 !osCloseHandle(p
21ec0 46 69 6c 65 2d 3e 68 4d 61 70 29 20 29 7b 0a 20 File->hMap) ){.
21ed0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 pFile->last
21ee0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 Errno = osGetLas
21ef0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 tError();.
21f00 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d OSTRACE(("UNMAP-
21f10 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 FILE pid=%lu, pF
21f20 69 6c 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c ile=%p, hMap=%p,
21f30 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 rc=SQLITE_IOERR
21f40 5f 4d 4d 41 50 5c 6e 22 2c 0a 20 20 20 20 20 20 _MMAP\n",.
21f50 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 osGetCu
21f60 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 rrentProcessId()
21f70 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e , pFile, pFile->
21f80 68 4d 61 70 29 29 3b 0a 20 20 20 20 20 20 72 65 hMap));. re
21f90 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 turn winLogError
21fa0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d (SQLITE_IOERR_MM
21fb0 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 AP, pFile->lastE
21fc0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 rrno,.
21fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 "
21fe0 77 69 6e 55 6e 6d 61 70 66 69 6c 65 32 22 2c 20 winUnmapfile2",
21ff0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 pFile->zPath);.
22000 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e }. pFile->
22010 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d hMap = NULL;. }
22020 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d . OSTRACE(("UNM
22030 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c AP-FILE pid=%lu,
22040 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 pFile=%p, rc=SQ
22050 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 LITE_OK\n",.
22060 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 osGetCurr
22070 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 entProcessId(),
22080 70 46 69 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 pFile));. retur
22090 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a n SQLITE_OK;.}..
220a0 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 /*.** Memory map
220b0 20 6f 72 20 72 65 6d 61 70 20 74 68 65 20 66 69 or remap the fi
220c0 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 66 69 6c le opened by fil
220d0 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70 46 64 e-descriptor pFd
220e0 20 28 69 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a (if the file.**
220f0 20 69 73 20 61 6c 72 65 61 64 79 20 6d 61 70 70 is already mapp
22100 65 64 2c 20 74 68 65 20 65 78 69 73 74 69 6e 67 ed, the existing
22110 20 6d 61 70 70 69 6e 67 20 69 73 20 72 65 70 6c mapping is repl
22120 61 63 65 64 20 62 79 20 74 68 65 20 6e 65 77 29 aced by the new)
22130 2e 20 4f 72 2c 20 69 66 0a 2a 2a 20 74 68 65 72 . Or, if.** ther
22140 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 e already exists
22150 20 61 20 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 a mapping for t
22160 68 69 73 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 his file, and th
22170 65 72 65 20 61 72 65 20 73 74 69 6c 6c 0a 2a 2a ere are still.**
22180 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 outstanding xFe
22190 74 63 68 28 29 20 72 65 66 65 72 65 6e 63 65 73 tch() references
221a0 20 74 6f 20 69 74 2c 20 74 68 69 73 20 66 75 6e to it, this fun
221b0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 ction is a no-op
221c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d ..**.** If param
221d0 65 74 65 72 20 6e 42 79 74 65 20 69 73 20 6e 6f eter nByte is no
221e0 6e 2d 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e n-negative, then
221f0 20 69 74 20 69 73 20 74 68 65 20 72 65 71 75 65 it is the reque
22200 73 74 65 64 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 sted size of.**
22210 74 68 65 20 6d 61 70 70 69 6e 67 20 74 6f 20 63 the mapping to c
22220 72 65 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 reate. Otherwise
22230 2c 20 69 66 20 6e 42 79 74 65 20 69 73 20 6c 65 , if nByte is le
22240 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 ss than zero, th
22250 65 6e 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 en the.** reques
22260 74 65 64 20 73 69 7a 65 20 69 73 20 74 68 65 20 ted size is the
22270 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 size of the file
22280 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20 61 63 on disk. The ac
22290 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 tual size of the
222a0 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d 61 70 70 .** created mapp
222b0 69 6e 67 20 69 73 20 65 69 74 68 65 72 20 74 68 ing is either th
222c0 65 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 e requested size
222d0 20 6f 72 20 74 68 65 20 76 61 6c 75 65 20 63 6f or the value co
222e0 6e 66 69 67 75 72 65 64 0a 2a 2a 20 75 73 69 6e nfigured.** usin
222f0 67 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d g SQLITE_FCNTL_M
22300 4d 41 50 5f 53 49 5a 45 2c 20 77 68 69 63 68 65 MAP_SIZE, whiche
22310 76 65 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e 0a ver is smaller..
22320 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 **.** SQLITE_OK
22330 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e is returned if n
22340 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 o error occurs (
22350 65 76 65 6e 20 69 66 20 74 68 65 20 6d 61 70 70 even if the mapp
22360 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72 65 ing is not.** re
22370 63 72 65 61 74 65 64 20 61 73 20 61 20 72 65 73 created as a res
22380 75 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 ult of outstandi
22390 6e 67 20 72 65 66 65 72 65 6e 63 65 73 29 20 6f ng references) o
223a0 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f r an SQLite erro
223b0 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 r.** code otherw
223c0 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 ise..*/.static i
223d0 6e 74 20 77 69 6e 4d 61 70 66 69 6c 65 28 77 69 nt winMapfile(wi
223e0 6e 46 69 6c 65 20 2a 70 46 64 2c 20 73 71 6c 69 nFile *pFd, sqli
223f0 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29 te3_int64 nByte)
22400 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 {. sqlite3_int6
22410 34 20 6e 4d 61 70 20 3d 20 6e 42 79 74 65 3b 0a 4 nMap = nByte;.
22420 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 int rc;.. ass
22430 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 ert( nMap>=0 ||
22440 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d pFd->nFetchOut==
22450 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 0 );. OSTRACE((
22460 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c "MAP-FILE pid=%l
22470 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 73 69 7a u, pFile=%p, siz
22480 65 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 e=%lld\n",.
22490 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 osGetCurre
224a0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 ntProcessId(), p
224b0 46 64 2c 20 6e 42 79 74 65 29 29 3b 0a 0a 20 20 Fd, nByte));..
224c0 69 66 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f if( pFd->nFetchO
224d0 75 74 3e 30 20 29 20 72 65 74 75 72 6e 20 53 51 ut>0 ) return SQ
224e0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 LITE_OK;.. if(
224f0 6e 4d 61 70 3c 30 20 29 7b 0a 20 20 20 20 72 63 nMap<0 ){. rc
22500 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 28 = winFileSize((
22510 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 46 sqlite3_file*)pF
22520 64 2c 20 26 6e 4d 61 70 29 3b 0a 20 20 20 20 69 d, &nMap);. i
22530 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 4f f( rc ){. O
22540 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c STRACE(("MAP-FIL
22550 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 E pid=%lu, pFile
22560 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 =%p, rc=SQLITE_I
22570 4f 45 52 52 5f 46 53 54 41 54 5c 6e 22 2c 0a 20 OERR_FSTAT\n",.
22580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 os
22590 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 GetCurrentProces
225a0 73 49 64 28 29 2c 20 70 46 64 29 29 3b 0a 20 20 sId(), pFd));.
225b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 return SQLIT
225c0 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 E_IOERR_FSTAT;.
225d0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e }. }. if( n
225e0 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a Map>pFd->mmapSiz
225f0 65 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d 61 70 eMax ){. nMap
22600 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 = pFd->mmapSize
22610 4d 61 78 3b 0a 20 20 7d 0a 20 20 6e 4d 61 70 20 Max;. }. nMap
22620 26 3d 20 7e 28 73 71 6c 69 74 65 33 5f 69 6e 74 &= ~(sqlite3_int
22630 36 34 29 28 77 69 6e 53 79 73 49 6e 66 6f 2e 64 64)(winSysInfo.d
22640 77 50 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a wPageSize - 1);.
22650 0a 20 20 69 66 28 20 6e 4d 61 70 3d 3d 30 20 26 . if( nMap==0 &
22660 26 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3e & pFd->mmapSize>
22670 30 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6d 61 0 ){. winUnma
22680 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a pfile(pFd);. }.
22690 20 20 69 66 28 20 6e 4d 61 70 21 3d 70 46 64 2d if( nMap!=pFd-
226a0 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 >mmapSize ){.
226b0 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20 30 3b void *pNew = 0;
226c0 0a 20 20 20 20 44 57 4f 52 44 20 70 72 6f 74 65 . DWORD prote
226d0 63 74 20 3d 20 50 41 47 45 5f 52 45 41 44 4f 4e ct = PAGE_READON
226e0 4c 59 3b 0a 20 20 20 20 44 57 4f 52 44 20 66 6c LY;. DWORD fl
226f0 61 67 73 20 3d 20 46 49 4c 45 5f 4d 41 50 5f 52 ags = FILE_MAP_R
22700 45 41 44 3b 0a 0a 20 20 20 20 77 69 6e 55 6e 6d EAD;.. winUnm
22710 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 23 69 66 apfile(pFd);.#if
22720 64 65 66 20 53 51 4c 49 54 45 5f 4d 4d 41 50 5f def SQLITE_MMAP_
22730 52 45 41 44 57 52 49 54 45 0a 20 20 20 20 69 66 READWRITE. if
22740 28 20 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 ( (pFd->ctrlFlag
22750 73 20 26 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e s & WINFILE_RDON
22760 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 LY)==0 ){.
22770 70 72 6f 74 65 63 74 20 3d 20 50 41 47 45 5f 52 protect = PAGE_R
22780 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20 20 20 EADWRITE;.
22790 66 6c 61 67 73 20 7c 3d 20 46 49 4c 45 5f 4d 41 flags |= FILE_MA
227a0 50 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 0a 23 P_WRITE;. }.#
227b0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 endif.#if SQLITE
227c0 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 70 46 _OS_WINRT. pF
227d0 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 d->hMap = osCrea
227e0 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f teFileMappingFro
227f0 6d 41 70 70 28 70 46 64 2d 3e 68 2c 20 4e 55 4c mApp(pFd->h, NUL
22800 4c 2c 20 70 72 6f 74 65 63 74 2c 20 6e 4d 61 70 L, protect, nMap
22810 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66 20 64 , NULL);.#elif d
22820 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 efined(SQLITE_WI
22830 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 N32_HAS_WIDE).
22840 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 pFd->hMap = os
22850 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e CreateFileMappin
22860 67 57 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c gW(pFd->h, NULL,
22870 20 70 72 6f 74 65 63 74 2c 0a 20 20 20 20 20 20 protect,.
22880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
22890 20 20 20 20 20 20 20 20 20 20 28 44 57 4f 52 44 (DWORD
228a0 29 28 28 6e 4d 61 70 3e 3e 33 32 29 20 26 20 30 )((nMap>>32) & 0
228b0 78 66 66 66 66 66 66 66 66 29 2c 0a 20 20 20 20 xffffffff),.
228c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
228d0 20 20 20 20 20 20 20 20 20 20 20 20 28 44 57 4f (DWO
228e0 52 44 29 28 6e 4d 61 70 20 26 20 30 78 66 66 66 RD)(nMap & 0xfff
228f0 66 66 66 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23 fffff), NULL);.#
22900 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c elif defined(SQL
22910 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e ITE_WIN32_HAS_AN
22920 53 49 29 20 26 26 20 53 51 4c 49 54 45 5f 57 49 SI) && SQLITE_WI
22930 4e 33 32 5f 43 52 45 41 54 45 46 49 4c 45 4d 41 N32_CREATEFILEMA
22940 50 50 49 4e 47 41 0a 20 20 20 20 70 46 64 2d 3e PPINGA. pFd->
22950 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 hMap = osCreateF
22960 69 6c 65 4d 61 70 70 69 6e 67 41 28 70 46 64 2d ileMappingA(pFd-
22970 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 >h, NULL, protec
22980 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 t,.
22990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
229a0 20 20 20 28 44 57 4f 52 44 29 28 28 6e 4d 61 70 (DWORD)((nMap
229b0 3e 3e 33 32 29 20 26 20 30 78 66 66 66 66 66 66 >>32) & 0xffffff
229c0 66 66 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 ff),.
229d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
229e0 20 20 20 20 20 28 44 57 4f 52 44 29 28 6e 4d 61 (DWORD)(nMa
229f0 70 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c p & 0xffffffff),
22a00 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 NULL);.#endif.
22a10 20 20 20 69 66 28 20 70 46 64 2d 3e 68 4d 61 70 if( pFd->hMap
22a20 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 ==NULL ){.
22a30 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d pFd->lastErrno =
22a40 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 osGetLastError(
22a50 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 );. rc = wi
22a60 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 nLogError(SQLITE
22a70 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 64 _IOERR_MMAP, pFd
22a80 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 ->lastErrno,.
22a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
22aa0 20 20 20 20 22 77 69 6e 4d 61 70 66 69 6c 65 31 "winMapfile1
22ab0 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a ", pFd->zPath);.
22ac0 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74 68 65 /* Log the
22ad0 20 65 72 72 6f 72 2c 20 62 75 74 20 63 6f 6e 74 error, but cont
22ae0 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 inue normal oper
22af0 61 74 69 6f 6e 20 75 73 69 6e 67 20 78 52 65 61 ation using xRea
22b00 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 d/xWrite */.
22b10 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d OSTRACE(("MAP-
22b20 46 49 4c 45 2d 43 52 45 41 54 45 20 70 69 64 3d FILE-CREATE pid=
22b30 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 %lu, pFile=%p, r
22b40 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 c=%s\n",.
22b50 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 osGetCur
22b60 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c rentProcessId(),
22b70 20 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72 72 pFd, sqlite3Err
22b80 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 Name(rc)));.
22b90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
22ba0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 OK;. }. as
22bb0 73 65 72 74 28 20 28 6e 4d 61 70 20 25 20 77 69 sert( (nMap % wi
22bc0 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 nSysInfo.dwPageS
22bd0 69 7a 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 ize)==0 );. a
22be0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 53 49 ssert( sizeof(SI
22bf0 5a 45 5f 54 29 3d 3d 73 69 7a 65 6f 66 28 73 71 ZE_T)==sizeof(sq
22c00 6c 69 74 65 33 5f 69 6e 74 36 34 29 20 7c 7c 20 lite3_int64) ||
22c10 6e 4d 61 70 3c 3d 30 78 66 66 66 66 66 66 66 66 nMap<=0xffffffff
22c20 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f );.#if SQLITE_O
22c30 53 5f 57 49 4e 52 54 0a 20 20 20 20 70 4e 65 77 S_WINRT. pNew
22c40 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 = osMapViewOfFi
22c50 6c 65 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68 leFromApp(pFd->h
22c60 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30 2c 20 28 Map, flags, 0, (
22c70 53 49 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a 23 65 SIZE_T)nMap);.#e
22c80 6c 73 65 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f lse. pNew = o
22c90 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 sMapViewOfFile(p
22ca0 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c Fd->hMap, flags,
22cb0 20 30 2c 20 30 2c 20 28 53 49 5a 45 5f 54 29 6e 0, 0, (SIZE_T)n
22cc0 4d 61 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 Map);.#endif.
22cd0 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 if( pNew==NULL
22ce0 29 7b 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 ){. osClose
22cf0 48 61 6e 64 6c 65 28 70 46 64 2d 3e 68 4d 61 70 Handle(pFd->hMap
22d00 29 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 68 4d );. pFd->hM
22d10 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 ap = NULL;.
22d20 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 pFd->lastErrno
22d30 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 = osGetLastError
22d40 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 ();. rc = w
22d50 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 inLogError(SQLIT
22d60 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 E_IOERR_MMAP, pF
22d70 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 d->lastErrno,.
22d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
22d90 20 20 20 20 20 22 77 69 6e 4d 61 70 66 69 6c 65 "winMapfile
22da0 32 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 2", pFd->zPath);
22db0 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74 68 . /* Log th
22dc0 65 20 65 72 72 6f 72 2c 20 62 75 74 20 63 6f 6e e error, but con
22dd0 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70 65 tinue normal ope
22de0 72 61 74 69 6f 6e 20 75 73 69 6e 67 20 78 52 65 ration using xRe
22df0 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20 20 ad/xWrite */.
22e00 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 OSTRACE(("MAP
22e10 2d 46 49 4c 45 2d 4d 41 50 20 70 69 64 3d 25 6c -FILE-MAP pid=%l
22e20 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d u, pFile=%p, rc=
22e30 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 %s\n",.
22e40 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 osGetCurre
22e50 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 ntProcessId(), p
22e60 46 64 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 Fd, sqlite3ErrNa
22e70 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 me(rc)));.
22e80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
22e90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 64 2d ;. }. pFd-
22ea0 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 70 4e >pMapRegion = pN
22eb0 65 77 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 ew;. pFd->mma
22ec0 70 53 69 7a 65 20 3d 20 6e 4d 61 70 3b 0a 20 20 pSize = nMap;.
22ed0 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 pFd->mmapSizeA
22ee0 63 74 75 61 6c 20 3d 20 6e 4d 61 70 3b 0a 20 20 ctual = nMap;.
22ef0 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4d }.. OSTRACE(("M
22f00 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c AP-FILE pid=%lu,
22f10 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 pFile=%p, rc=SQ
22f20 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 LITE_OK\n",.
22f30 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 osGetCurr
22f40 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 entProcessId(),
22f50 70 46 64 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 pFd));. return
22f60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e SQLITE_OK;.}.#en
22f70 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 dif /* SQLITE_MA
22f80 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f X_MMAP_SIZE>0 */
22f90 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73 73 69 ../*.** If possi
22fa0 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 20 70 6f ble, return a po
22fb0 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70 70 69 inter to a mappi
22fc0 6e 67 20 6f 66 20 66 69 6c 65 20 66 64 20 73 74 ng of file fd st
22fd0 61 72 74 69 6e 67 20 61 74 20 6f 66 66 73 65 74 arting at offset
22fe0 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20 6d 61 .** iOff. The ma
22ff0 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20 76 61 pping must be va
23000 6c 69 64 20 66 6f 72 20 61 74 20 6c 65 61 73 74 lid for at least
23010 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a 2a 0a nAmt bytes..**.
23020 2a 2a 20 49 66 20 73 75 63 68 20 61 20 70 6f 69 ** If such a poi
23030 6e 74 65 72 20 63 61 6e 20 62 65 20 6f 62 74 61 nter can be obta
23040 69 6e 65 64 2c 20 73 74 6f 72 65 20 69 74 20 69 ined, store it i
23050 6e 20 2a 70 70 20 61 6e 64 20 72 65 74 75 72 6e n *pp and return
23060 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f SQLITE_OK..** O
23070 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 r, if one cannot
23080 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 but no error oc
23090 63 75 72 73 2c 20 73 65 74 20 2a 70 70 20 74 6f curs, set *pp to
230a0 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 0 and return SQ
230b0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 LITE_OK..** Fina
230c0 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 lly, if an error
230d0 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 72 65 74 does occur, ret
230e0 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 urn an SQLite er
230f0 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20 66 69 ror code. The fi
23100 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 nal.** value of
23110 2a 70 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 *pp is undefined
23120 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a in this case..*
23130 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e *.** If this fun
23140 63 74 69 6f 6e 20 64 6f 65 73 20 72 65 74 75 72 ction does retur
23150 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20 74 68 65 n a pointer, the
23160 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 76 65 caller must eve
23170 6e 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 6c 65 61 ntually.** relea
23180 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 se the reference
23190 20 62 79 20 63 61 6c 6c 69 6e 67 20 77 69 6e 55 by calling winU
231a0 6e 66 65 74 63 68 28 29 2e 0a 2a 2f 0a 73 74 61 nfetch()..*/.sta
231b0 74 69 63 20 69 6e 74 20 77 69 6e 46 65 74 63 68 tic int winFetch
231c0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 (sqlite3_file *f
231d0 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 69 6e 74 d, i64 iOff, int
231e0 20 6e 41 6d 74 2c 20 76 6f 69 64 20 2a 2a 70 70 nAmt, void **pp
231f0 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 ){.#if SQLITE_MA
23200 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 X_MMAP_SIZE>0.
23210 77 69 6e 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 winFile *pFd = (
23220 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 2f winFile*)fd; /
23230 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 * The underlying
23240 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a database file *
23250 2f 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 20 3d /.#endif. *pp =
23260 20 30 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 0;.. OSTRACE((
23270 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 "FETCH pid=%lu,
23280 70 46 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 pFile=%p, offset
23290 3d 25 6c 6c 64 2c 20 61 6d 6f 75 6e 74 3d 25 64 =%lld, amount=%d
232a0 2c 20 70 70 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 , pp=%p\n",.
232b0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 osGetCurr
232c0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 entProcessId(),
232d0 66 64 2c 20 69 4f 66 66 2c 20 6e 41 6d 74 2c 20 fd, iOff, nAmt,
232e0 70 70 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 pp));..#if SQLIT
232f0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e E_MAX_MMAP_SIZE>
23300 30 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 0. if( pFd->mma
23310 70 53 69 7a 65 4d 61 78 3e 30 20 29 7b 0a 20 20 pSizeMax>0 ){.
23320 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 if( pFd->pMapR
23330 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 egion==0 ){.
23340 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 4d 61 int rc = winMa
23350 70 66 69 6c 65 28 70 46 64 2c 20 2d 31 29 3b 0a pfile(pFd, -1);.
23360 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 if( rc!=SQ
23370 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 LITE_OK ){.
23380 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 45 54 OSTRACE(("FET
23390 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c CH pid=%lu, pFil
233a0 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a e=%p, rc=%s\n",.
233b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
233c0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f osGetCurrentPro
233d0 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 73 cessId(), pFd, s
233e0 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 qlite3ErrName(rc
233f0 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 )));. ret
23400 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a urn rc;. }.
23410 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 }. if( pF
23420 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20 69 d->mmapSize >= i
23430 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20 20 Off+nAmt ){.
23440 20 20 2a 70 70 20 3d 20 26 28 28 75 38 20 2a 29 *pp = &((u8 *)
23450 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 pFd->pMapRegion)
23460 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70 46 [iOff];. pF
23470 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b 0a d->nFetchOut++;.
23480 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 }. }.#endif
23490 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46 45 .. OSTRACE(("FE
234a0 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 TCH pid=%lu, pFi
234b0 6c 65 3d 25 70 2c 20 70 70 3d 25 70 2c 20 2a 70 le=%p, pp=%p, *p
234c0 70 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f p=%p, rc=SQLITE_
234d0 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 OK\n",.
234e0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 osGetCurrentPr
234f0 6f 63 65 73 73 49 64 28 29 2c 20 66 64 2c 20 70 ocessId(), fd, p
23500 70 2c 20 2a 70 70 29 29 3b 0a 20 20 72 65 74 75 p, *pp));. retu
23510 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a rn SQLITE_OK;.}.
23520 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 ./*.** If the th
23530 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 ird argument is
23540 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 non-NULL, then t
23550 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 6c his function rel
23560 65 61 73 65 73 20 61 0a 2a 2a 20 72 65 66 65 72 eases a.** refer
23570 65 6e 63 65 20 6f 62 74 61 69 6e 65 64 20 62 79 ence obtained by
23580 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c an earlier call
23590 20 74 6f 20 77 69 6e 46 65 74 63 68 28 29 2e 20 to winFetch().
235a0 54 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 The second.** ar
235b0 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f gument passed to
235c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d this function m
235d0 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 ust be the same
235e0 61 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e as the correspon
235f0 64 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 ding.** argument
23600 20 74 68 61 74 20 77 61 73 20 70 61 73 73 65 64 that was passed
23610 20 74 6f 20 74 68 65 20 77 69 6e 46 65 74 63 68 to the winFetch
23620 28 29 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 2a () invocation..*
23630 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 *.** Or, if the
23640 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69 third argument i
23650 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 s NULL, then thi
23660 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 s function is be
23670 69 6e 67 20 63 61 6c 6c 65 64 0a 2a 2a 20 74 6f ing called.** to
23680 20 69 6e 66 6f 72 6d 20 74 68 65 20 56 46 53 20 inform the VFS
23690 6c 61 79 65 72 20 74 68 61 74 2c 20 61 63 63 6f layer that, acco
236a0 72 64 69 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20 rding to POSIX,
236b0 61 6e 79 20 65 78 69 73 74 69 6e 67 20 6d 61 70 any existing map
236c0 70 69 6e 67 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 ping.** may now
236d0 62 65 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 be invalid and s
236e0 68 6f 75 6c 64 20 62 65 20 75 6e 6d 61 70 70 65 hould be unmappe
236f0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 d..*/.static int
23700 20 77 69 6e 55 6e 66 65 74 63 68 28 73 71 6c 69 winUnfetch(sqli
23710 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 te3_file *fd, i6
23720 34 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29 4 iOff, void *p)
23730 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 {.#if SQLITE_MAX
23740 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77 _MMAP_SIZE>0. w
23750 69 6e 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 77 inFile *pFd = (w
23760 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 2f 2a inFile*)fd; /*
23770 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 The underlying
23780 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f database file */
23790 0a 0a 20 20 2f 2a 20 49 66 20 70 3d 3d 30 20 28 .. /* If p==0 (
237a0 75 6e 6d 61 70 20 74 68 65 20 65 6e 74 69 72 65 unmap the entire
237b0 20 66 69 6c 65 29 20 74 68 65 6e 20 74 68 65 72 file) then ther
237c0 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 6f 75 74 e must be no out
237d0 73 74 61 6e 64 69 6e 67 0a 20 20 2a 2a 20 78 46 standing. ** xF
237e0 65 74 63 68 20 72 65 66 65 72 65 6e 63 65 73 2e etch references.
237f0 20 4f 72 2c 20 69 66 20 70 21 3d 30 20 28 6d 65 Or, if p!=0 (me
23800 61 6e 69 6e 67 20 69 74 20 69 73 20 61 6e 20 78 aning it is an x
23810 46 65 74 63 68 20 72 65 66 65 72 65 6e 63 65 29 Fetch reference)
23820 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 ,. ** then ther
23830 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 e must be at lea
23840 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 st one outstandi
23850 6e 67 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 ng. */. assert
23860 28 20 28 70 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e ( (p==0)==(pFd->
23870 6e 46 65 74 63 68 4f 75 74 3d 3d 30 29 20 29 3b nFetchOut==0) );
23880 0a 0a 20 20 2f 2a 20 49 66 20 70 21 3d 30 2c 20 .. /* If p!=0,
23890 69 74 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 it must match th
238a0 65 20 69 4f 66 66 20 76 61 6c 75 65 2e 20 2a 2f e iOff value. */
238b0 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 . assert( p==0
238c0 7c 7c 20 70 3d 3d 26 28 28 75 38 20 2a 29 70 46 || p==&((u8 *)pF
238d0 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 d->pMapRegion)[i
238e0 4f 66 66 5d 20 29 3b 0a 0a 20 20 4f 53 54 52 41 Off] );.. OSTRA
238f0 43 45 28 28 22 55 4e 46 45 54 43 48 20 70 69 64 CE(("UNFETCH pid
23900 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 =%lu, pFile=%p,
23910 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 70 3d 25 offset=%lld, p=%
23920 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 p\n",.
23930 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f osGetCurrentPro
23940 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 69 cessId(), pFd, i
23950 4f 66 66 2c 20 70 29 29 3b 0a 0a 20 20 69 66 28 Off, p));.. if(
23960 20 70 20 29 7b 0a 20 20 20 20 70 46 64 2d 3e 6e p ){. pFd->n
23970 46 65 74 63 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65 FetchOut--;. }e
23980 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46 49 58 4d lse{. /* FIXM
23990 45 3a 20 20 49 66 20 57 69 6e 64 6f 77 73 20 74 E: If Windows t
239a0 72 75 6c 79 20 61 6c 77 61 79 73 20 70 72 65 76 ruly always prev
239b0 65 6e 74 73 20 74 72 75 6e 63 61 74 69 6e 67 20 ents truncating
239c0 6f 72 20 64 65 6c 65 74 69 6e 67 20 61 0a 20 20 or deleting a.
239d0 20 20 2a 2a 20 66 69 6c 65 20 77 68 69 6c 65 20 ** file while
239e0 61 20 6d 61 70 70 69 6e 67 20 69 73 20 68 65 6c a mapping is hel
239f0 64 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c d, then the foll
23a00 6f 77 69 6e 67 20 77 69 6e 55 6e 6d 61 70 66 69 owing winUnmapfi
23a10 6c 65 28 29 20 63 61 6c 6c 0a 20 20 20 20 2a 2a le() call. **
23a20 20 69 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 is unnecessary
23a30 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 20 2d can be omitted -
23a40 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 69 6d 70 potentially imp
23a50 72 6f 76 69 6e 67 0a 20 20 20 20 2a 2a 20 70 65 roving. ** pe
23a60 72 66 6f 72 6d 61 6e 63 65 2e 20 20 2a 2f 0a 20 rformance. */.
23a70 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 winUnmapfile(
23a80 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 pFd);. }.. ass
23a90 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 ert( pFd->nFetch
23aa0 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6e 64 69 66 Out>=0 );.#endif
23ab0 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e .. OSTRACE(("UN
23ac0 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 FETCH pid=%lu, p
23ad0 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 File=%p, rc=SQLI
23ae0 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 TE_OK\n",.
23af0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e osGetCurren
23b00 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64 tProcessId(), fd
23b10 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c ));. return SQL
23b20 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a ITE_OK;.}../*.**
23b30 20 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 Here ends the i
23b40 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 mplementation of
23b50 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c all sqlite3_fil
23b60 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a e methods..**.**
23b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
23b80 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 **** End sqlite3
23b90 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a _file Methods **
23ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
23bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a *************.**
23bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
23bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
23be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
23bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
23c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f ************/../
23c10 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72 *.** This vector
23c20 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 defines all the
23c30 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63 61 methods that ca
23c40 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 0a n operate on an.
23c50 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 ** sqlite3_file
23c60 66 6f 72 20 77 69 6e 33 32 2e 0a 2a 2f 0a 73 74 for win32..*/.st
23c70 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 atic const sqlit
23c80 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 77 69 e3_io_methods wi
23c90 6e 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20 nIoMethod = {.
23ca0 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3,
23cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23cc0 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 /* iVersion */.
23cd0 20 77 69 6e 43 6c 6f 73 65 2c 20 20 20 20 20 20 winClose,
23ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23cf0 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 /* xClose */.
23d00 77 69 6e 52 65 61 64 2c 20 20 20 20 20 20 20 20 winRead,
23d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23d20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20 77 69 /* xRead */. wi
23d30 6e 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 nWrite,
23d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
23d50 20 78 57 72 69 74 65 20 2a 2f 0a 20 20 77 69 6e xWrite */. win
23d60 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 Truncate,
23d70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
23d80 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20 77 xTruncate */. w
23d90 69 6e 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 inSync,
23da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
23db0 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 77 69 6e * xSync */. win
23dc0 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 FileSize,
23dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
23de0 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 77 xFileSize */. w
23df0 69 6e 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 inLock,
23e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
23e10 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e * xLock */. win
23e20 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 Unlock,
23e30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
23e40 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e xUnlock */. win
23e50 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 CheckReservedLoc
23e60 6b 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 k, /*
23e70 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f xCheckReservedLo
23e80 63 6b 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 43 ck */. winFileC
23e90 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 ontrol,
23ea0 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 /* xFile
23eb0 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 77 69 6e Control */. win
23ec0 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 SectorSize,
23ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
23ee0 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 xSectorSize */.
23ef0 20 77 69 6e 44 65 76 69 63 65 43 68 61 72 61 63 winDeviceCharac
23f00 74 65 72 69 73 74 69 63 73 2c 20 20 20 20 20 20 teristics,
23f10 20 2f 2a 20 78 44 65 76 69 63 65 43 68 61 72 61 /* xDeviceChara
23f20 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 cteristics */.
23f30 77 69 6e 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 winShmMap,
23f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23f50 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 0a 20 20 /* xShmMap */.
23f60 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 winShmLock,
23f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23f80 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 /* xShmLock */.
23f90 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 2c 20 winShmBarrier,
23fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23fb0 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20 /* xShmBarrier
23fc0 2a 2f 0a 20 20 77 69 6e 53 68 6d 55 6e 6d 61 70 */. winShmUnmap
23fd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
23fe0 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 /* xShmUnma
23ff0 70 20 2a 2f 0a 20 20 77 69 6e 46 65 74 63 68 2c p */. winFetch,
24000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
24010 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68 /* xFetch
24020 20 2a 2f 0a 20 20 77 69 6e 55 6e 66 65 74 63 68 */. winUnfetch
24030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
24040 20 20 20 20 20 20 2f 2a 20 78 55 6e 66 65 74 63 /* xUnfetc
24050 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 h */.};../*.** T
24060 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e his vector defin
24070 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f es all the metho
24080 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72 ds that can oper
24090 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c ate on an.** sql
240a0 69 74 65 33 5f 66 69 6c 65 20 66 6f 72 20 77 69 ite3_file for wi
240b0 6e 33 32 20 77 69 74 68 6f 75 74 20 70 65 72 66 n32 without perf
240c0 6f 72 6d 69 6e 67 20 61 6e 79 20 6c 6f 63 6b 69 orming any locki
240d0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f ng..*/.static co
240e0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d nst sqlite3_io_m
240f0 65 74 68 6f 64 73 20 77 69 6e 49 6f 4e 6f 6c 6f ethods winIoNolo
24100 63 6b 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20 33 ckMethod = {. 3
24110 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
24120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
24130 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 * iVersion */.
24140 77 69 6e 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 winClose,
24150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
24160 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 77 /* xClose */. w
24170 69 6e 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 inRead,
24180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
24190 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20 77 69 6e * xRead */. win
241a0 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 Write,
241b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
241c0 78 57 72 69 74 65 20 2a 2f 0a 20 20 77 69 6e 54 xWrite */. winT
241d0 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 runcate,
241e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 /* x
241f0 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20 77 69 Truncate */. wi
24200 6e 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 nSync,
24210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
24220 20 78 53 79 6e 63 20 2a 2f 0a 20 20 77 69 6e 46 xSync */. winF
24230 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 ileSize,
24240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 /* x
24250 46 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 77 69 FileSize */. wi
24260 6e 4e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 nNolockLock,
24270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
24280 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 4e xLock */. winN
24290 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 olockUnlock,
242a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 /* x
242b0 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 4e Unlock */. winN
242c0 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 olockCheckReserv
242d0 65 64 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a 20 78 edLock, /* x
242e0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 CheckReservedLoc
242f0 6b 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 43 6f k */. winFileCo
24300 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 ntrol,
24310 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 /* xFileC
24320 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53 ontrol */. winS
24330 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 ectorSize,
24340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 /* x
24350 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 SectorSize */.
24360 77 69 6e 44 65 76 69 63 65 43 68 61 72 61 63 74 winDeviceCharact
24370 65 72 69 73 74 69 63 73 2c 20 20 20 20 20 20 20 eristics,
24380 2f 2a 20 78 44 65 76 69 63 65 43 68 61 72 61 63 /* xDeviceCharac
24390 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 77 teristics */. w
243a0 69 6e 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 inShmMap,
243b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
243c0 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 0a 20 20 77 * xShmMap */. w
243d0 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 inShmLock,
243e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
243f0 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 * xShmLock */.
24400 77 69 6e 53 68 6d 42 61 72 72 69 65 72 2c 20 20 winShmBarrier,
24410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
24420 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a /* xShmBarrier *
24430 2f 0a 20 20 77 69 6e 53 68 6d 55 6e 6d 61 70 2c /. winShmUnmap,
24440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
24450 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 /* xShmUnmap
24460 20 2a 2f 0a 20 20 77 69 6e 46 65 74 63 68 2c 20 */. winFetch,
24470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
24480 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68 20 /* xFetch
24490 2a 2f 0a 20 20 77 69 6e 55 6e 66 65 74 63 68 20 */. winUnfetch
244a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
244b0 20 20 20 20 20 2f 2a 20 78 55 6e 66 65 74 63 68 /* xUnfetch
244c0 20 2a 2f 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 77 */.};..static w
244d0 69 6e 56 66 73 41 70 70 44 61 74 61 20 77 69 6e inVfsAppData win
244e0 41 70 70 44 61 74 61 20 3d 20 7b 0a 20 20 26 77 AppData = {. &w
244f0 69 6e 49 6f 4d 65 74 68 6f 64 2c 20 20 20 20 20 inIoMethod,
24500 20 20 2f 2a 20 70 4d 65 74 68 6f 64 20 2a 2f 0a /* pMethod */.
24510 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 0,
24520 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 /* pAppDat
24530 61 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 a */. 0
24540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 62 4e /* bN
24550 6f 4c 6f 63 6b 20 2a 2f 0a 7d 3b 0a 0a 73 74 61 oLock */.};..sta
24560 74 69 63 20 77 69 6e 56 66 73 41 70 70 44 61 74 tic winVfsAppDat
24570 61 20 77 69 6e 4e 6f 6c 6f 63 6b 41 70 70 44 61 a winNolockAppDa
24580 74 61 20 3d 20 7b 0a 20 20 26 77 69 6e 49 6f 4e ta = {. &winIoN
24590 6f 6c 6f 63 6b 4d 65 74 68 6f 64 2c 20 2f 2a 20 olockMethod, /*
245a0 70 4d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 2c 20 pMethod */. 0,
245b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
245c0 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a /* pAppData */.
245d0 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 1
245e0 20 20 20 20 20 20 2f 2a 20 62 4e 6f 4c 6f 63 6b /* bNoLock
245f0 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a */.};../*******
24600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
24610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
24620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
24630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
24640 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a *****.**********
24650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
24660 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d ** sqlite3_vfs m
24670 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a ethods *********
24680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
24690 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 ***.**.** This d
246a0 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 ivision contains
246b0 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 the implementat
246c0 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f ion of methods o
246d0 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 n the.** sqlite3
246e0 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a _vfs object..*/.
246f0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 .#if defined(__C
24700 59 47 57 49 4e 5f 5f 29 0a 2f 2a 0a 2a 2a 20 43 YGWIN__)./*.** C
24710 6f 6e 76 65 72 74 20 61 20 66 69 6c 65 6e 61 6d onvert a filenam
24720 65 20 66 72 6f 6d 20 77 68 61 74 65 76 65 72 20 e from whatever
24730 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f the underlying o
24740 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 0a perating system.
24750 2a 2a 20 73 75 70 70 6f 72 74 73 20 66 6f 72 20 ** supports for
24760 66 69 6c 65 6e 61 6d 65 73 20 69 6e 74 6f 20 55 filenames into U
24770 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20 TF-8. Space to
24780 68 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74 20 hold the result
24790 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 is.** obtained f
247a0 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d rom malloc and m
247b0 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 ust be freed by
247c0 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 the calling func
247d0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 tion..*/.static
247e0 63 68 61 72 20 2a 77 69 6e 43 6f 6e 76 65 72 74 char *winConvert
247f0 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 63 ToUtf8Filename(c
24800 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 onst void *zFile
24810 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a name){. char *z
24820 43 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 Converted = 0;.
24830 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b if( osIsNT() ){
24840 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 . zConverted
24850 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 = winUnicodeToUt
24860 66 38 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 f8(zFilename);.
24870 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 }.#ifdef SQLITE
24880 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a _WIN32_HAS_ANSI.
24890 20 20 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f 6e else{. zCon
248a0 76 65 72 74 65 64 20 3d 20 77 69 6e 4d 62 63 73 verted = winMbcs
248b0 54 6f 55 74 66 38 28 7a 46 69 6c 65 6e 61 6d 65 ToUtf8(zFilename
248c0 2c 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 , osAreFileApisA
248d0 4e 53 49 28 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 NSI());. }.#end
248e0 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77 if. /* caller w
248f0 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f ill handle out o
24900 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 f memory */. re
24910 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b turn zConverted;
24920 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a .}.#endif../*.**
24930 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38 Convert a UTF-8
24940 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 77 filename into w
24950 68 61 74 65 76 65 72 20 66 6f 72 6d 20 74 68 65 hatever form the
24960 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f underlying.** o
24970 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 perating system
24980 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d 65 73 20 wants filenames
24990 69 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f in. Space to ho
249a0 6c 64 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a ld the result.**
249b0 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f is obtained fro
249c0 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 m malloc and mus
249d0 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 t be freed by th
249e0 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e e calling.** fun
249f0 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 ction..*/.static
24a00 20 76 6f 69 64 20 2a 77 69 6e 43 6f 6e 76 65 72 void *winConver
24a10 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d tFromUtf8Filenam
24a20 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 e(const char *zF
24a30 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76 6f 69 64 ilename){. void
24a40 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 30 *zConverted = 0
24a50 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 ;. if( osIsNT()
24a60 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 ){. zConvert
24a70 65 64 20 3d 20 77 69 6e 55 74 66 38 54 6f 55 6e ed = winUtf8ToUn
24a80 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 icode(zFilename)
24a90 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c ;. }.#ifdef SQL
24aa0 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e ITE_WIN32_HAS_AN
24ab0 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 7a SI. else{. z
24ac0 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 55 Converted = winU
24ad0 74 66 38 54 6f 4d 62 63 73 28 7a 46 69 6c 65 6e tf8ToMbcs(zFilen
24ae0 61 6d 65 2c 20 6f 73 41 72 65 46 69 6c 65 41 70 ame, osAreFileAp
24af0 69 73 41 4e 53 49 28 29 29 3b 0a 20 20 7d 0a 23 isANSI());. }.#
24b00 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 endif. /* calle
24b10 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 r will handle ou
24b20 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 t of memory */.
24b30 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74 return zConvert
24b40 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 ed;.}../*.** Thi
24b50 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 s function retur
24b60 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 ns non-zero if t
24b70 68 65 20 73 70 65 63 69 66 69 65 64 20 55 54 46 he specified UTF
24b80 2d 38 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 -8 string buffer
24b90 0a 2a 2a 20 65 6e 64 73 20 77 69 74 68 20 61 20 .** ends with a
24ba0 64 69 72 65 63 74 6f 72 79 20 73 65 70 61 72 61 directory separa
24bb0 74 6f 72 20 63 68 61 72 61 63 74 65 72 20 6f 72 tor character or
24bc0 20 6f 6e 65 20 77 61 73 20 73 75 63 63 65 73 73 one was success
24bd0 66 75 6c 6c 79 0a 2a 2a 20 61 64 64 65 64 20 74 fully.** added t
24be0 6f 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 o it..*/.static
24bf0 69 6e 74 20 77 69 6e 4d 61 6b 65 45 6e 64 49 6e int winMakeEndIn
24c00 44 69 72 53 65 70 28 69 6e 74 20 6e 42 75 66 2c DirSep(int nBuf,
24c10 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 char *zBuf){.
24c20 69 66 28 20 7a 42 75 66 20 29 7b 0a 20 20 20 20 if( zBuf ){.
24c30 69 6e 74 20 6e 4c 65 6e 20 3d 20 73 71 6c 69 74 int nLen = sqlit
24c40 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 e3Strlen30(zBuf)
24c50 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 6e 3e 30 ;. if( nLen>0
24c60 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77 69 ){. if( wi
24c70 6e 49 73 44 69 72 53 65 70 28 7a 42 75 66 5b 6e nIsDirSep(zBuf[n
24c80 4c 65 6e 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20 Len-1]) ){.
24c90 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 return 1;.
24ca0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 4c 65 }else if( nLe
24cb0 6e 2b 31 3c 6e 42 75 66 20 29 7b 0a 20 20 20 20 n+1<nBuf ){.
24cc0 20 20 20 20 7a 42 75 66 5b 6e 4c 65 6e 5d 20 3d zBuf[nLen] =
24cd0 20 77 69 6e 47 65 74 44 69 72 53 65 70 28 29 3b winGetDirSep();
24ce0 0a 20 20 20 20 20 20 20 20 7a 42 75 66 5b 6e 4c . zBuf[nL
24cf0 65 6e 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 en+1] = '\0';.
24d00 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a return 1;.
24d10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 }. }.
24d20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a }. return 0;.}.
24d30 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 ./*.** Create a
24d40 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e temporary file n
24d50 61 6d 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 ame and store th
24d60 65 20 72 65 73 75 6c 74 69 6e 67 20 70 6f 69 6e e resulting poin
24d70 74 65 72 20 69 6e 74 6f 20 70 7a 42 75 66 2e 0a ter into pzBuf..
24d80 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 ** The pointer r
24d90 65 74 75 72 6e 65 64 20 69 6e 20 70 7a 42 75 66 eturned in pzBuf
24da0 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 76 must be freed v
24db0 69 61 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 ia sqlite3_free(
24dc0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 )..*/.static int
24dd0 20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 winGetTempname(
24de0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 sqlite3_vfs *pVf
24df0 73 2c 20 63 68 61 72 20 2a 2a 70 7a 42 75 66 29 s, char **pzBuf)
24e00 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 {. static char
24e10 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 zChars[] =. "
24e20 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 abcdefghijklmnop
24e30 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 qrstuvwxyz".
24e40 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f "ABCDEFGHIJKLMNO
24e50 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 PQRSTUVWXYZ".
24e60 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 "0123456789";.
24e70 20 73 69 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20 20 size_t i, j;.
24e80 69 6e 74 20 6e 50 72 65 20 3d 20 73 71 6c 69 74 int nPre = sqlit
24e90 65 33 53 74 72 6c 65 6e 33 30 28 53 51 4c 49 54 e3Strlen30(SQLIT
24ea0 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 E_TEMP_FILE_PREF
24eb0 49 58 29 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 2c IX);. int nMax,
24ec0 20 6e 42 75 66 2c 20 6e 44 69 72 2c 20 6e 4c 65 nBuf, nDir, nLe
24ed0 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 3b n;. char *zBuf;
24ee0 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 .. /* It's odd
24ef0 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 to simulate an i
24f00 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 o-error here, bu
24f10 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 t really this is
24f20 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 just. ** using
24f30 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e the io-error in
24f40 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 frastructure to
24f50 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 test that SQLite
24f60 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 handles this.
24f70 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c ** function fail
24f80 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 ing.. */. Simu
24f90 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 lateIOError( ret
24fa0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 urn SQLITE_IOERR
24fb0 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 );.. /* Alloca
24fc0 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62 te a temporary b
24fd0 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74 uffer to store t
24fe0 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 he fully qualifi
24ff0 65 64 20 66 69 6c 65 0a 20 20 2a 2a 20 6e 61 6d ed file. ** nam
25000 65 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 e for the tempor
25010 61 72 79 20 66 69 6c 65 2e 20 20 49 66 20 74 68 ary file. If th
25020 69 73 20 66 61 69 6c 73 2c 20 77 65 20 63 61 6e is fails, we can
25030 6e 6f 74 20 63 6f 6e 74 69 6e 75 65 2e 0a 20 20 not continue..
25040 2a 2f 0a 20 20 6e 4d 61 78 20 3d 20 70 56 66 73 */. nMax = pVfs
25050 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3b 20 6e 42 ->mxPathname; nB
25060 75 66 20 3d 20 6e 4d 61 78 20 2b 20 32 3b 0a 20 uf = nMax + 2;.
25070 20 7a 42 75 66 20 3d 20 73 71 6c 69 74 65 33 4d zBuf = sqlite3M
25080 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 75 66 20 allocZero( nBuf
25090 29 3b 0a 20 20 69 66 28 20 21 7a 42 75 66 20 29 );. if( !zBuf )
250a0 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 {. OSTRACE(("
250b0 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 TEMP-FILENAME rc
250c0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f =SQLITE_IOERR_NO
250d0 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 MEM\n"));. re
250e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 turn SQLITE_IOER
250f0 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 R_NOMEM_BKPT;.
25100 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f }.. /* Figure o
25110 75 74 20 74 68 65 20 65 66 66 65 63 74 69 76 65 ut the effective
25120 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 temporary direc
25130 74 6f 72 79 2e 20 20 46 69 72 73 74 2c 20 63 68 tory. First, ch
25140 65 63 6b 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 eck if one. **
25150 68 61 73 20 62 65 65 6e 20 65 78 70 6c 69 63 69 has been explici
25160 74 6c 79 20 73 65 74 20 62 79 20 74 68 65 20 61 tly set by the a
25170 70 70 6c 69 63 61 74 69 6f 6e 3b 20 6f 74 68 65 pplication; othe
25180 72 77 69 73 65 2c 20 75 73 65 20 74 68 65 20 6f rwise, use the o
25190 6e 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 ne. ** configur
251a0 65 64 20 62 79 20 74 68 65 20 6f 70 65 72 61 74 ed by the operat
251b0 69 6e 67 20 73 79 73 74 65 6d 2e 0a 20 20 2a 2f ing system.. */
251c0 0a 20 20 6e 44 69 72 20 3d 20 6e 4d 61 78 20 2d . nDir = nMax -
251d0 20 28 6e 50 72 65 20 2b 20 31 35 29 3b 0a 20 20 (nPre + 15);.
251e0 61 73 73 65 72 74 28 20 6e 44 69 72 3e 30 20 29 assert( nDir>0 )
251f0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f ;. if( sqlite3_
25200 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29 temp_directory )
25210 7b 0a 20 20 20 20 69 6e 74 20 6e 44 69 72 4c 65 {. int nDirLe
25220 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 n = sqlite3Strle
25230 6e 33 30 28 73 71 6c 69 74 65 33 5f 74 65 6d 70 n30(sqlite3_temp
25240 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 _directory);.
25250 20 69 66 28 20 6e 44 69 72 4c 65 6e 3e 30 20 29 if( nDirLen>0 )
25260 7b 0a 20 20 20 20 20 20 69 66 28 20 21 77 69 6e {. if( !win
25270 49 73 44 69 72 53 65 70 28 73 71 6c 69 74 65 33 IsDirSep(sqlite3
25280 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 5b _temp_directory[
25290 6e 44 69 72 4c 65 6e 2d 31 5d 29 20 29 7b 0a 20 nDirLen-1]) ){.
252a0 20 20 20 20 20 20 20 6e 44 69 72 4c 65 6e 2b 2b nDirLen++
252b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
252c0 69 66 28 20 6e 44 69 72 4c 65 6e 3e 6e 44 69 72 if( nDirLen>nDir
252d0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 ){. sqli
252e0 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a te3_free(zBuf);.
252f0 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 OSTRACE(
25300 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 ("TEMP-FILENAME
25310 72 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 5c rc=SQLITE_ERROR\
25320 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 n"));. re
25330 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 turn winLogError
25340 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30 (SQLITE_ERROR, 0
25350 2c 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d , "winGetTempnam
25360 65 31 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d e1", 0);. }
25370 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 . sqlite3_s
25380 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 nprintf(nMax, zB
25390 75 66 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 uf, "%s", sqlite
253a0 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3_temp_directory
253b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 );. }. }.#if
253c0 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 defined(__CYGWI
253d0 4e 5f 5f 29 0a 20 20 65 6c 73 65 7b 0a 20 20 20 N__). else{.
253e0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 static const ch
253f0 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b ar *azDirs[] = {
25400 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 . 0, /* ge
25410 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d 50 tenv("SQLITE_TMP
25420 44 49 52 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 DIR") */.
25430 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 54 4d 0, /* getenv("TM
25440 50 44 49 52 22 29 20 2a 2f 0a 20 20 20 20 20 20 PDIR") */.
25450 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 54 0, /* getenv("T
25460 4d 50 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 30 MP") */. 0
25470 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 54 45 4d , /* getenv("TEM
25480 50 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c P") */. 0,
25490 20 2f 2a 20 67 65 74 65 6e 76 28 22 55 53 45 52 /* getenv("USER
254a0 50 52 4f 46 49 4c 45 22 29 20 2a 2f 0a 20 20 20 PROFILE") */.
254b0 20 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a "/var/tmp",.
254c0 20 20 20 20 20 20 20 22 2f 75 73 72 2f 74 6d 70 "/usr/tmp
254d0 22 2c 0a 20 20 20 20 20 20 20 22 2f 74 6d 70 22 ",. "/tmp"
254e0 2c 0a 20 20 20 20 20 20 20 22 2e 22 2c 0a 20 20 ,. ".",.
254f0 20 20 20 20 20 30 20 20 20 20 20 20 20 20 2f 2a 0 /*
25500 20 4c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72 List terminator
25510 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 75 */. };. u
25520 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 nsigned int i;.
25530 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a const char *z
25540 44 69 72 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 Dir = 0;.. if
25550 28 20 21 61 7a 44 69 72 73 5b 30 5d 20 29 20 61 ( !azDirs[0] ) a
25560 7a 44 69 72 73 5b 30 5d 20 3d 20 67 65 74 65 6e zDirs[0] = geten
25570 76 28 22 53 51 4c 49 54 45 5f 54 4d 50 44 49 52 v("SQLITE_TMPDIR
25580 22 29 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44 ");. if( !azD
25590 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b irs[1] ) azDirs[
255a0 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 1] = getenv("TMP
255b0 44 49 52 22 29 3b 0a 20 20 20 20 69 66 28 20 21 DIR");. if( !
255c0 61 7a 44 69 72 73 5b 32 5d 20 29 20 61 7a 44 69 azDirs[2] ) azDi
255d0 72 73 5b 32 5d 20 3d 20 67 65 74 65 6e 76 28 22 rs[2] = getenv("
255e0 54 4d 50 22 29 3b 0a 20 20 20 20 69 66 28 20 21 TMP");. if( !
255f0 61 7a 44 69 72 73 5b 33 5d 20 29 20 61 7a 44 69 azDirs[3] ) azDi
25600 72 73 5b 33 5d 20 3d 20 67 65 74 65 6e 76 28 22 rs[3] = getenv("
25610 54 45 4d 50 22 29 3b 0a 20 20 20 20 69 66 28 20 TEMP");. if(
25620 21 61 7a 44 69 72 73 5b 34 5d 20 29 20 61 7a 44 !azDirs[4] ) azD
25630 69 72 73 5b 34 5d 20 3d 20 67 65 74 65 6e 76 28 irs[4] = getenv(
25640 22 55 53 45 52 50 52 4f 46 49 4c 45 22 29 3b 0a "USERPROFILE");.
25650 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 for(i=0; i<s
25660 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 izeof(azDirs)/si
25670 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b zeof(azDirs[0]);
25680 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b zDir=azDirs[i++
25690 5d 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a ]){. void *
256a0 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 20 20 zConverted;.
256b0 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29 20 if( zDir==0 )
256c0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 continue;.
256d0 2f 2a 20 49 66 20 74 68 65 20 70 61 74 68 20 73 /* If the path s
256e0 74 61 72 74 73 20 77 69 74 68 20 61 20 64 72 69 tarts with a dri
256f0 76 65 20 6c 65 74 74 65 72 20 66 6f 6c 6c 6f 77 ve letter follow
25700 65 64 20 62 79 20 74 68 65 20 63 6f 6c 6f 6e 0a ed by the colon.
25710 20 20 20 20 20 20 2a 2a 20 63 68 61 72 61 63 74 ** charact
25720 65 72 2c 20 61 73 73 75 6d 65 20 69 74 20 69 73 er, assume it is
25730 20 61 6c 72 65 61 64 79 20 61 20 6e 61 74 69 76 already a nativ
25740 65 20 57 69 6e 33 32 20 70 61 74 68 3b 20 6f 74 e Win32 path; ot
25750 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a herwise,. *
25760 2a 20 69 74 20 6d 75 73 74 20 62 65 20 63 6f 6e * it must be con
25770 76 65 72 74 65 64 20 74 6f 20 61 20 6e 61 74 69 verted to a nati
25780 76 65 20 57 69 6e 33 32 20 70 61 74 68 20 76 69 ve Win32 path vi
25790 61 20 74 68 65 20 43 79 67 77 69 6e 20 41 50 49 a the Cygwin API
257a0 0a 20 20 20 20 20 20 2a 2a 20 70 72 69 6f 72 20 . ** prior
257b0 74 6f 20 75 73 69 6e 67 20 69 74 2e 0a 20 20 20 to using it..
257c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 */. if(
257d0 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72 winIsDriveLetter
257e0 41 6e 64 43 6f 6c 6f 6e 28 7a 44 69 72 29 20 29 AndColon(zDir) )
257f0 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6e 76 65 {. zConve
25800 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 rted = winConver
25810 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d tFromUtf8Filenam
25820 65 28 7a 44 69 72 29 3b 0a 20 20 20 20 20 20 20 e(zDir);.
25830 20 69 66 28 20 21 7a 43 6f 6e 76 65 72 74 65 64 if( !zConverted
25840 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 ){. sq
25850 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 lite3_free(zBuf)
25860 3b 0a 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 ;. OSTR
25870 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e ACE(("TEMP-FILEN
25880 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f AME rc=SQLITE_IO
25890 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a ERR_NOMEM\n"));.
258a0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e return
258b0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f SQLITE_IOERR_NO
258c0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 MEM_BKPT;.
258d0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 }. if(
258e0 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65 72 winIsDir(zConver
258f0 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 ted) ){.
25900 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e sqlite3_snprin
25910 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 tf(nMax, zBuf, "
25920 25 73 22 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 %s", zDir);.
25930 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 sqlite3_fr
25940 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a ee(zConverted);.
25950 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b break;
25960 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
25970 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 sqlite3_free(
25980 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 zConverted);.
25990 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
259a0 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 73 zConverted = s
259b0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f qlite3MallocZero
259c0 28 20 6e 4d 61 78 2b 31 20 29 3b 0a 20 20 20 20 ( nMax+1 );.
259d0 20 20 20 20 69 66 28 20 21 7a 43 6f 6e 76 65 72 if( !zConver
259e0 74 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 ted ){.
259f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 sqlite3_free(zB
25a00 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 4f uf);. O
25a10 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 STRACE(("TEMP-FI
25a20 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 LENAME rc=SQLITE
25a30 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 _IOERR_NOMEM\n")
25a40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 );. ret
25a50 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 urn SQLITE_IOERR
25a60 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 _NOMEM_BKPT;.
25a70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 }. i
25a80 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 f( cygwin_conv_p
25a90 61 74 68 28 0a 20 20 20 20 20 20 20 20 20 20 20 ath(.
25aa0 20 20 20 20 20 6f 73 49 73 4e 54 28 29 20 3f 20 osIsNT() ?
25ab0 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e CCP_POSIX_TO_WIN
25ac0 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54 _W : CCP_POSIX_T
25ad0 4f 5f 57 49 4e 5f 41 2c 20 7a 44 69 72 2c 0a 20 O_WIN_A, zDir,.
25ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a z
25af0 43 6f 6e 76 65 72 74 65 64 2c 20 6e 4d 61 78 2b Converted, nMax+
25b00 31 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 1)<0 ){.
25b10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a sqlite3_free(z
25b20 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 Converted);.
25b30 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 sqlite3_fr
25b40 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 ee(zBuf);.
25b50 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 OSTRACE(("TE
25b60 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 MP-FILENAME rc=S
25b70 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 QLITE_IOERR_CONV
25b80 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20 PATH\n"));.
25b90 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c return winL
25ba0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 ogError(SQLITE_I
25bb0 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 2c 20 28 OERR_CONVPATH, (
25bc0 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 DWORD)errno,.
25bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
25be0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 47 65 "winGe
25bf0 74 54 65 6d 70 6e 61 6d 65 32 22 2c 20 7a 44 69 tTempname2", zDi
25c00 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 r);. }.
25c10 20 20 20 20 20 20 69 66 28 20 77 69 6e 49 73 44 if( winIsD
25c20 69 72 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 ir(zConverted) )
25c30 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 {. /* A
25c40 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 t this point, we
25c50 20 6b 6e 6f 77 20 74 68 65 20 63 61 6e 64 69 64 know the candid
25c60 61 74 65 20 64 69 72 65 63 74 6f 72 79 20 65 78 ate directory ex
25c70 69 73 74 73 20 61 6e 64 20 73 68 6f 75 6c 64 0a ists and should.
25c80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 ** be
25c90 75 73 65 64 2e 20 20 48 6f 77 65 76 65 72 2c 20 used. However,
25ca0 77 65 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 63 we may need to c
25cb0 6f 6e 76 65 72 74 20 74 68 65 20 73 74 72 69 6e onvert the strin
25cc0 67 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 g containing.
25cd0 20 20 20 20 20 20 20 2a 2a 20 69 74 73 20 6e 61 ** its na
25ce0 6d 65 20 69 6e 74 6f 20 55 54 46 2d 38 20 28 69 me into UTF-8 (i
25cf0 2e 65 2e 20 69 66 20 69 74 20 69 73 20 55 54 46 .e. if it is UTF
25d00 2d 31 36 20 72 69 67 68 74 20 6e 6f 77 29 2e 0a -16 right now)..
25d10 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 */.
25d20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74 char *zUt
25d30 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54 f8 = winConvertT
25d40 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 43 oUtf8Filename(zC
25d50 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 onverted);.
25d60 20 20 20 20 20 69 66 28 20 21 7a 55 74 66 38 20 if( !zUtf8
25d70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 ){. s
25d80 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e qlite3_free(zCon
25d90 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 verted);.
25da0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 sqlite3_fre
25db0 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 e(zBuf);.
25dc0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 OSTRACE(("T
25dd0 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d EMP-FILENAME rc=
25de0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d SQLITE_IOERR_NOM
25df0 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 EM\n"));.
25e00 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 return SQLI
25e10 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 TE_IOERR_NOMEM_B
25e20 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d KPT;. }
25e30 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 . sqlit
25e40 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 e3_snprintf(nMax
25e50 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 55 , zBuf, "%s", zU
25e60 74 66 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20 tf8);.
25e70 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74 sqlite3_free(zUt
25e80 66 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 f8);. s
25e90 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e qlite3_free(zCon
25ea0 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 verted);.
25eb0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 break;.
25ec0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 }. sqli
25ed0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 te3_free(zConver
25ee0 74 65 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 ted);. }.
25ef0 20 20 7d 0a 20 20 7d 0a 23 65 6c 69 66 20 21 53 }. }.#elif !S
25f00 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 QLITE_OS_WINRT &
25f10 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 & !defined(__CYG
25f20 57 49 4e 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 WIN__). else if
25f30 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 ( osIsNT() ){.
25f40 20 20 63 68 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a char *zMulti;.
25f50 20 20 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65 LPWSTR zWide
25f60 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 4d 61 Path = sqlite3Ma
25f70 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61 78 2a 73 llocZero( nMax*s
25f80 69 7a 65 6f 66 28 57 43 48 41 52 29 20 29 3b 0a izeof(WCHAR) );.
25f90 20 20 20 20 69 66 28 20 21 7a 57 69 64 65 50 61 if( !zWidePa
25fa0 74 68 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 th ){. sqli
25fb0 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a te3_free(zBuf);.
25fc0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 OSTRACE(("
25fd0 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 TEMP-FILENAME rc
25fe0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f =SQLITE_IOERR_NO
25ff0 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 MEM\n"));.
26000 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f return SQLITE_IO
26010 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a ERR_NOMEM_BKPT;.
26020 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 73 }. if( os
26030 47 65 74 54 65 6d 70 50 61 74 68 57 28 6e 4d 61 GetTempPathW(nMa
26040 78 2c 20 7a 57 69 64 65 50 61 74 68 29 3d 3d 30 x, zWidePath)==0
26050 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 ){. sqlite
26060 33 5f 66 72 65 65 28 7a 57 69 64 65 50 61 74 68 3_free(zWidePath
26070 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 );. sqlite3
26080 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 _free(zBuf);.
26090 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d OSTRACE(("TEM
260a0 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 P-FILENAME rc=SQ
260b0 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 LITE_IOERR_GETTE
260c0 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20 MPPATH\n"));.
260d0 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 return winLog
260e0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 Error(SQLITE_IOE
260f0 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 2c 20 RR_GETTEMPPATH,
26100 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 osGetLastError()
26110 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
26120 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 47 "winG
26130 65 74 54 65 6d 70 6e 61 6d 65 32 22 2c 20 30 29 etTempname2", 0)
26140 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d 75 6c ;. }. zMul
26150 74 69 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 ti = winUnicodeT
26160 6f 55 74 66 38 28 7a 57 69 64 65 50 61 74 68 29 oUtf8(zWidePath)
26170 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75 6c 74 69 ;. if( zMulti
26180 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 ){. sqlite
26190 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 3_snprintf(nMax,
261a0 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 4d 75 zBuf, "%s", zMu
261b0 6c 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 lti);. sqli
261c0 74 65 33 5f 66 72 65 65 28 7a 4d 75 6c 74 69 29 te3_free(zMulti)
261d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f ;. sqlite3_
261e0 66 72 65 65 28 7a 57 69 64 65 50 61 74 68 29 3b free(zWidePath);
261f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 . }else{.
26200 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a sqlite3_free(z
26210 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 20 WidePath);.
26220 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 sqlite3_free(zB
26230 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 uf);. OSTRA
26240 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 CE(("TEMP-FILENA
26250 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 ME rc=SQLITE_IOE
26260 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 RR_NOMEM\n"));.
26270 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 return SQLI
26280 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 TE_IOERR_NOMEM_B
26290 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 KPT;. }. }.#
262a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e ifdef SQLITE_WIN
262b0 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 32_HAS_ANSI. el
262c0 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 55 se{. char *zU
262d0 74 66 38 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a tf8;. char *z
262e0 4d 62 63 73 50 61 74 68 20 3d 20 73 71 6c 69 74 MbcsPath = sqlit
262f0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d e3MallocZero( nM
26300 61 78 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a ax );. if( !z
26310 4d 62 63 73 50 61 74 68 20 29 7b 0a 20 20 20 20 MbcsPath ){.
26320 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a sqlite3_free(z
26330 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 Buf);. OSTR
26340 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e ACE(("TEMP-FILEN
26350 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f AME rc=SQLITE_IO
26360 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a ERR_NOMEM\n"));.
26370 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c return SQL
26380 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f ITE_IOERR_NOMEM_
26390 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 BKPT;. }.
263a0 69 66 28 20 6f 73 47 65 74 54 65 6d 70 50 61 74 if( osGetTempPat
263b0 68 41 28 6e 4d 61 78 2c 20 7a 4d 62 63 73 50 61 hA(nMax, zMbcsPa
263c0 74 68 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 th)==0 ){.
263d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 sqlite3_free(zBu
263e0 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 f);. OSTRAC
263f0 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d E(("TEMP-FILENAM
26400 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 E rc=SQLITE_IOER
26410 52 5f 47 45 54 54 45 4d 50 50 41 54 48 5c 6e 22 R_GETTEMPPATH\n"
26420 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e ));. return
26430 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c winLogError(SQL
26440 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d ITE_IOERR_GETTEM
26450 50 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 PPATH, osGetLast
26460 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 Error(),.
26470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
26480 20 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d "winGetTempnam
26490 65 33 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 e3", 0);. }.
264a0 20 20 20 7a 55 74 66 38 20 3d 20 77 69 6e 4d 62 zUtf8 = winMb
264b0 63 73 54 6f 55 74 66 38 28 7a 4d 62 63 73 50 61 csToUtf8(zMbcsPa
264c0 74 68 2c 20 6f 73 41 72 65 46 69 6c 65 41 70 69 th, osAreFileApi
264d0 73 41 4e 53 49 28 29 29 3b 0a 20 20 20 20 69 66 sANSI());. if
264e0 28 20 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20 ( zUtf8 ){.
264f0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 sqlite3_snprint
26500 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 f(nMax, zBuf, "%
26510 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 s", zUtf8);.
26520 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a sqlite3_free(z
26530 55 74 66 38 29 3b 0a 20 20 20 20 7d 65 6c 73 65 Utf8);. }else
26540 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f {. sqlite3_
26550 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 free(zBuf);.
26560 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 OSTRACE(("TEMP
26570 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c -FILENAME rc=SQL
26580 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c ITE_IOERR_NOMEM\
26590 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 n"));. retu
265a0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f rn SQLITE_IOERR_
265b0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 NOMEM_BKPT;.
265c0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 }. }.#endif /*
265d0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 SQLITE_WIN32_HAS
265e0 5f 41 4e 53 49 20 2a 2f 0a 23 65 6e 64 69 66 20 _ANSI */.#endif
265f0 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 /* !SQLITE_OS_WI
26600 4e 52 54 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a NRT */.. /*. *
26610 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 * Check to make
26620 73 75 72 65 20 74 68 65 20 74 65 6d 70 6f 72 61 sure the tempora
26630 72 79 20 64 69 72 65 63 74 6f 72 79 20 65 6e 64 ry directory end
26640 73 20 77 69 74 68 20 61 6e 20 61 70 70 72 6f 70 s with an approp
26650 72 69 61 74 65 0a 20 20 2a 2a 20 73 65 70 61 72 riate. ** separ
26660 61 74 6f 72 2e 20 20 49 66 20 69 74 20 64 6f 65 ator. If it doe
26670 73 20 6e 6f 74 20 61 6e 64 20 74 68 65 72 65 20 s not and there
26680 69 73 20 6e 6f 74 20 65 6e 6f 75 67 68 20 73 70 is not enough sp
26690 61 63 65 20 6c 65 66 74 20 74 6f 20 61 64 64 0a ace left to add.
266a0 20 20 2a 2a 20 6f 6e 65 2c 20 66 61 69 6c 2e 0a ** one, fail..
266b0 20 20 2a 2f 0a 20 20 69 66 28 20 21 77 69 6e 4d */. if( !winM
266c0 61 6b 65 45 6e 64 49 6e 44 69 72 53 65 70 28 6e akeEndInDirSep(n
266d0 44 69 72 2b 31 2c 20 7a 42 75 66 29 20 29 7b 0a Dir+1, zBuf) ){.
266e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 sqlite3_free
266f0 28 7a 42 75 66 29 3b 0a 20 20 20 20 4f 53 54 52 (zBuf);. OSTR
26700 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e ACE(("TEMP-FILEN
26710 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52 AME rc=SQLITE_ER
26720 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 ROR\n"));. re
26730 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 turn winLogError
26740 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30 (SQLITE_ERROR, 0
26750 2c 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d , "winGetTempnam
26760 65 34 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 e4", 0);. }..
26770 2f 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74 68 /*. ** Check th
26780 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 at the output bu
26790 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e ffer is large en
267a0 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d ough for the tem
267b0 70 6f 72 61 72 79 20 66 69 6c 65 0a 20 20 2a 2a porary file. **
267c0 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 66 6f 6c name in the fol
267d0 6c 6f 77 69 6e 67 20 66 6f 72 6d 61 74 3a 0a 20 lowing format:.
267e0 20 2a 2a 0a 20 20 2a 2a 20 20 20 22 3c 74 65 6d **. ** "<tem
267f0 70 6f 72 61 72 79 5f 64 69 72 65 63 74 6f 72 79 porary_directory
26800 3e 2f 65 74 69 6c 71 73 5f 58 58 58 58 58 58 58 >/etilqs_XXXXXXX
26810 58 58 58 58 58 58 58 58 5c 30 5c 30 22 0a 20 20 XXXXXXXX\0\0".
26820 2a 2a 0a 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 **. ** If not,
26830 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 return SQLITE_ER
26840 52 4f 52 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 ROR. The number
26850 20 31 37 20 69 73 20 75 73 65 64 20 68 65 72 65 17 is used here
26860 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a in order to. *
26870 2a 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 * account for th
26880 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20 e space used by
26890 74 68 65 20 31 35 20 63 68 61 72 61 63 74 65 72 the 15 character
268a0 20 72 61 6e 64 6f 6d 20 73 75 66 66 69 78 20 61 random suffix a
268b0 6e 64 20 74 68 65 0a 20 20 2a 2a 20 74 77 6f 20 nd the. ** two
268c0 74 72 61 69 6c 69 6e 67 20 4e 55 4c 20 63 68 61 trailing NUL cha
268d0 72 61 63 74 65 72 73 2e 20 20 54 68 65 20 66 69 racters. The fi
268e0 6e 61 6c 20 64 69 72 65 63 74 6f 72 79 20 73 65 nal directory se
268f0 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 parator characte
26900 72 0a 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 r. ** has alrea
26910 64 79 20 61 64 64 65 64 20 69 66 20 69 74 20 77 dy added if it w
26920 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 70 as not already p
26930 72 65 73 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e resent.. */. n
26940 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 Len = sqlite3Str
26950 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 69 len30(zBuf);. i
26960 66 28 20 28 6e 4c 65 6e 20 2b 20 6e 50 72 65 20 f( (nLen + nPre
26970 2b 20 31 37 29 20 3e 20 6e 42 75 66 20 29 7b 0a + 17) > nBuf ){.
26980 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 sqlite3_free
26990 28 7a 42 75 66 29 3b 0a 20 20 20 20 4f 53 54 52 (zBuf);. OSTR
269a0 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e ACE(("TEMP-FILEN
269b0 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52 AME rc=SQLITE_ER
269c0 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 ROR\n"));. re
269d0 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 turn winLogError
269e0 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30 (SQLITE_ERROR, 0
269f0 2c 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d , "winGetTempnam
26a00 65 35 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 e5", 0);. }..
26a10 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 sqlite3_snprintf
26a20 28 6e 42 75 66 2d 31 36 2d 6e 4c 65 6e 2c 20 7a (nBuf-16-nLen, z
26a30 42 75 66 2b 6e 4c 65 6e 2c 20 53 51 4c 49 54 45 Buf+nLen, SQLITE
26a40 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 _TEMP_FILE_PREFI
26a50 58 29 3b 0a 0a 20 20 6a 20 3d 20 73 71 6c 69 74 X);.. j = sqlit
26a60 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 e3Strlen30(zBuf)
26a70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 ;. sqlite3_rand
26a80 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66 omness(15, &zBuf
26a90 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b [j]);. for(i=0;
26aa0 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 i<15; i++, j++)
26ab0 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 {. zBuf[j] =
26ac0 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 (char)zChars[ ((
26ad0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 unsigned char)zB
26ae0 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a uf[j])%(sizeof(z
26af0 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 7d Chars)-1) ];. }
26b00 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a . zBuf[j] = 0;.
26b10 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b zBuf[j+1] = 0;
26b20 0a 20 20 2a 70 7a 42 75 66 20 3d 20 7a 42 75 66 . *pzBuf = zBuf
26b30 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 ;.. OSTRACE(("T
26b40 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 6e 61 6d EMP-FILENAME nam
26b50 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f e=%s, rc=SQLITE_
26b60 4f 4b 5c 6e 22 2c 20 7a 42 75 66 29 29 3b 0a 20 OK\n", zBuf));.
26b70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
26b80 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 K;.}../*.** Retu
26b90 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6e rn TRUE if the n
26ba0 61 6d 65 64 20 66 69 6c 65 20 69 73 20 72 65 61 amed file is rea
26bb0 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72 79 2e lly a directory.
26bc0 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 Return false i
26bd0 66 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 f.** it is somet
26be0 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 hing other than
26bf0 61 20 64 69 72 65 63 74 6f 72 79 2c 20 6f 72 20 a directory, or
26c00 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 if there is any
26c10 6b 69 6e 64 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a kind of memory.*
26c20 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 * allocation fai
26c30 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 lure..*/.static
26c40 69 6e 74 20 77 69 6e 49 73 44 69 72 28 63 6f 6e int winIsDir(con
26c50 73 74 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 st void *zConver
26c60 74 65 64 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 ted){. DWORD at
26c70 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 tr;. int rc = 0
26c80 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 ;. DWORD lastEr
26c90 72 6e 6f 3b 0a 0a 20 20 69 66 28 20 6f 73 49 73 rno;.. if( osIs
26ca0 4e 54 28 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 NT() ){. int
26cb0 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e cnt = 0;. WIN
26cc0 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 32_FILE_ATTRIBUT
26cd0 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74 61 E_DATA sAttrData
26ce0 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41 ;. memset(&sA
26cf0 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 ttrData, 0, size
26d00 6f 66 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a of(sAttrData));.
26d10 20 20 20 20 77 68 69 6c 65 28 20 21 28 72 63 20 while( !(rc
26d20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 = osGetFileAttri
26d30 62 75 74 65 73 45 78 57 28 28 4c 50 43 57 53 54 butesExW((LPCWST
26d40 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 R)zConverted,.
26d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
26d60 20 20 20 20 20 20 20 20 20 20 20 47 65 74 46 69 GetFi
26d70 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 leExInfoStandard
26d80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
26d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 &
26da0 73 41 74 74 72 44 61 74 61 29 29 20 26 26 20 77 sAttrData)) && w
26db0 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e inRetryIoerr(&cn
26dc0 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 t, &lastErrno) )
26dd0 7b 7d 0a 20 20 20 20 69 66 28 20 21 72 63 20 29 {}. if( !rc )
26de0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 {. return 0
26df0 3b 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6e 61 6d ; /* Invalid nam
26e00 65 3f 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 e? */. }.
26e10 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74 61 attr = sAttrData
26e20 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 .dwFileAttribute
26e30 73 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 s;.#if SQLITE_OS
26e40 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 _WINCE==0. }els
26e50 65 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 6f 73 e{. attr = os
26e60 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 GetFileAttribute
26e70 73 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 sA((char*)zConve
26e80 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 rted);.#endif.
26e90 7d 0a 20 20 72 65 74 75 72 6e 20 28 61 74 74 72 }. return (attr
26ea0 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 !=INVALID_FILE_A
26eb0 54 54 52 49 42 55 54 45 53 29 20 26 26 20 28 61 TTRIBUTES) && (a
26ec0 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55 ttr&FILE_ATTRIBU
26ed0 54 45 5f 44 49 52 45 43 54 4f 52 59 29 3b 0a 7d TE_DIRECTORY);.}
26ee0 0a 0a 2f 2a 20 66 6f 72 77 61 72 64 20 72 65 66 ../* forward ref
26ef0 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 erence */.static
26f00 20 69 6e 74 20 77 69 6e 41 63 63 65 73 73 28 0a int winAccess(.
26f10 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 sqlite3_vfs *p
26f20 56 66 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 Vfs, /*
26f30 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 Not used on win3
26f40 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 2 */. const cha
26f50 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 r *zFilename,
26f60 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c /* Name of fil
26f70 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 e to check */.
26f80 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 int flags,
26f90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 /* Ty
26fa0 70 65 20 6f 66 20 74 65 73 74 20 74 6f 20 6d 61 pe of test to ma
26fb0 6b 65 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 ke on this file
26fc0 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 */. int *pResOu
26fd0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 t
26fe0 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 20 2a /* OUT: Result *
26ff0 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e /.);../*.** Open
27000 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 a file..*/.stat
27010 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 0a ic int winOpen(.
27020 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 sqlite3_vfs *p
27030 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 55 Vfs, /* U
27040 73 65 64 20 74 6f 20 67 65 74 20 6d 61 78 69 6d sed to get maxim
27050 75 6d 20 70 61 74 68 20 6c 65 6e 67 74 68 20 61 um path length a
27060 6e 64 20 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 nd AppData */.
27070 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d const char *zNam
27080 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d e, /* Nam
27090 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55 e of the file (U
270a0 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 TF-8) */. sqlit
270b0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 e3_file *id,
270c0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 /* Write th
270d0 65 20 53 51 4c 69 74 65 20 66 69 6c 65 20 68 61 e SQLite file ha
270e0 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 ndle here */. i
270f0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 nt flags,
27100 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e /* Open
27110 20 6d 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20 mode flags */.
27120 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 int *pOutFlags
27130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 /* St
27140 61 74 75 73 20 72 65 74 75 72 6e 20 66 6c 61 67 atus return flag
27150 73 20 2a 2f 0a 29 7b 0a 20 20 48 41 4e 44 4c 45 s */.){. HANDLE
27160 20 68 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 h;. DWORD last
27170 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 44 57 4f Errno = 0;. DWO
27180 52 44 20 64 77 44 65 73 69 72 65 64 41 63 63 65 RD dwDesiredAcce
27190 73 73 3b 0a 20 20 44 57 4f 52 44 20 64 77 53 68 ss;. DWORD dwSh
271a0 61 72 65 4d 6f 64 65 3b 0a 20 20 44 57 4f 52 44 areMode;. DWORD
271b0 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f dwCreationDispo
271c0 73 69 74 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 sition;. DWORD
271d0 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 dwFlagsAndAttrib
271e0 75 74 65 73 20 3d 20 30 3b 0a 23 69 66 20 53 51 utes = 0;.#if SQ
271f0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 LITE_OS_WINCE.
27200 69 6e 74 20 69 73 54 65 6d 70 20 3d 20 30 3b 0a int isTemp = 0;.
27210 23 65 6e 64 69 66 0a 20 20 77 69 6e 56 66 73 41 #endif. winVfsA
27220 70 70 44 61 74 61 20 2a 70 41 70 70 44 61 74 61 ppData *pAppData
27230 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 ;. winFile *pFi
27240 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 le = (winFile*)i
27250 64 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 d;. void *zConv
27260 65 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 erted;
27270 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 /* Filename
27280 69 6e 20 4f 53 20 65 6e 63 6f 64 69 6e 67 20 2a in OS encoding *
27290 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a /. const char *
272a0 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 4e 61 6d zUtf8Name = zNam
272b0 65 3b 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 e; /* Filename i
272c0 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64 69 6e 67 n UTF-8 encoding
272d0 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 */. int cnt =
272e0 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 0;.. /* If argu
272f0 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20 ment zPath is a
27300 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 NULL pointer, th
27310 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 is function is r
27320 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a equired to open.
27330 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 ** a temporary
27340 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20 file. Use this
27350 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 buffer to store
27360 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e the file name in
27370 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a .. */. char *z
27380 54 6d 70 6e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 Tmpname = 0; /*
27390 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 For temporary fi
273a0 6c 65 6e 61 6d 65 2c 20 69 66 20 6e 65 63 65 73 lename, if neces
273b0 73 61 72 79 2e 20 2a 2f 0a 0a 20 20 69 6e 74 20 sary. */.. int
273c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 rc = SQLITE_OK;
273d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 /* Fu
273e0 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f nction Return Co
273f0 64 65 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e de */.#if !defin
27400 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 53 51 ed(NDEBUG) || SQ
27410 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 LITE_OS_WINCE.
27420 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67 int eType = flag
27430 73 26 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f s&0xFFFFFF00; /
27440 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74 * Type of file t
27450 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 o open */.#endif
27460 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73 .. int isExclus
27470 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 ive = (flags &
27480 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c SQLITE_OPEN_EXCL
27490 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 USIVE);. int is
274a0 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c Delete = (fl
274b0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 ags & SQLITE_OPE
274c0 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 N_DELETEONCLOSE)
274d0 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 ;. int isCreate
274e0 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 = (flags &
274f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 SQLITE_OPEN_CREA
27500 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 TE);. int isRea
27510 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 donly = (flags
27520 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 & SQLITE_OPEN_R
27530 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 EADONLY);. int
27540 69 73 52 65 61 64 57 72 69 74 65 20 20 3d 20 28 isReadWrite = (
27550 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f flags & SQLITE_O
27560 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a PEN_READWRITE);.
27570 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a .#ifndef NDEBUG.
27580 20 20 69 6e 74 20 69 73 4f 70 65 6e 4a 6f 75 72 int isOpenJour
27590 6e 61 6c 20 3d 20 28 69 73 43 72 65 61 74 65 20 nal = (isCreate
275a0 26 26 20 28 0a 20 20 20 20 20 20 20 20 65 54 79 && (. eTy
275b0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f pe==SQLITE_OPEN_
275c0 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 0a 20 MASTER_JOURNAL.
275d0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 || eType==SQ
275e0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a LITE_OPEN_MAIN_J
275f0 4f 55 52 4e 41 4c 0a 20 20 20 20 20 7c 7c 20 65 OURNAL. || e
27600 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 Type==SQLITE_OPE
27610 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 23 65 6e 64 N_WAL. ));.#end
27620 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 if.. OSTRACE(("
27630 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 70 46 OPEN name=%s, pF
27640 69 6c 65 3d 25 70 2c 20 66 6c 61 67 73 3d 25 78 ile=%p, flags=%x
27650 2c 20 70 4f 75 74 46 6c 61 67 73 3d 25 70 5c 6e , pOutFlags=%p\n
27660 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a 55 ",. zU
27670 74 66 38 4e 61 6d 65 2c 20 69 64 2c 20 66 6c 61 tf8Name, id, fla
27680 67 73 2c 20 70 4f 75 74 46 6c 61 67 73 29 29 3b gs, pOutFlags));
27690 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 .. /* Check the
276a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 following state
276b0 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65 3a 0a ments are true:.
276c0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 **. ** (a)
276d0 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 Exactly one of t
276e0 68 65 20 52 45 41 44 57 52 49 54 45 20 61 6e 64 he READWRITE and
276f0 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 READONLY flags
27700 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64 must be set, and
27710 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43 . ** (b) if C
27720 52 45 41 54 45 20 69 73 20 73 65 74 2c 20 74 68 REATE is set, th
27730 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75 73 en READWRITE mus
27740 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 t also be set, a
27750 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66 nd. ** (c) if
27760 20 45 58 43 4c 55 53 49 56 45 20 69 73 20 73 65 EXCLUSIVE is se
27770 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d t, then CREATE m
27780 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e ust also be set.
27790 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 . ** (d) if D
277a0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 ELETEONCLOSE is
277b0 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 set, then CREATE
277c0 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 must also be se
277d0 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 t.. */. assert
277e0 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 ((isReadonly==0
277f0 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d || isReadWrite==
27800 30 29 20 26 26 20 28 69 73 52 65 61 64 57 72 69 0) && (isReadWri
27810 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 te || isReadonly
27820 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43 ));. assert(isC
27830 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 reate==0 || isRe
27840 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 adWrite);. asse
27850 72 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d rt(isExclusive==
27860 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0 || isCreate);.
27870 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 assert(isDelet
27880 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 e==0 || isCreate
27890 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 );.. /* The mai
278a0 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e n DB, main journ
278b0 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 al, WAL file and
278c0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 master journal
278d0 61 72 65 20 6e 65 76 65 72 0a 20 20 2a 2a 20 61 are never. ** a
278e0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c utomatically del
278f0 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 eted. Nor are th
27900 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72 ey ever temporar
27910 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 y files. */. a
27920 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 ssert( (!isDelet
27930 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 e && zName) || e
27940 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 Type!=SQLITE_OPE
27950 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 N_MAIN_DB );. a
27960 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 ssert( (!isDelet
27970 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 e && zName) || e
27980 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 Type!=SQLITE_OPE
27990 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 N_MAIN_JOURNAL )
279a0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 ;. assert( (!is
279b0 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 Delete && zName)
279c0 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 || eType!=SQLIT
279d0 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f E_OPEN_MASTER_JO
279e0 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 URNAL );. asser
279f0 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 t( (!isDelete &&
27a00 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 zName) || eType
27a10 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 !=SQLITE_OPEN_WA
27a20 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 L );.. /* Asser
27a30 74 20 74 68 61 74 20 74 68 65 20 75 70 70 65 72 t that the upper
27a40 20 6c 61 79 65 72 20 68 61 73 20 73 65 74 20 6f layer has set o
27a50 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d ne of the "file-
27a60 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a type" flags. */.
27a70 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d assert( eType=
27a80 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 =SQLITE_OPEN_MAI
27a90 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 N_DB || eTy
27aa0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f pe==SQLITE_OPEN_
27ab0 54 45 4d 50 5f 44 42 0a 20 20 20 20 20 20 20 7c TEMP_DB. |
27ac0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f | eType==SQLITE_
27ad0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 OPEN_MAIN_JOURNA
27ae0 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 L || eType==SQLI
27af0 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 TE_OPEN_TEMP_JOU
27b00 52 4e 41 4c 0a 20 20 20 20 20 20 20 7c 7c 20 65 RNAL. || e
27b10 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 Type==SQLITE_OPE
27b20 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c N_SUBJOURNAL |
27b30 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f | eType==SQLITE_
27b40 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 OPEN_MASTER_JOUR
27b50 4e 41 4c 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 NAL. || eT
27b60 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e ype==SQLITE_OPEN
27b70 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c _TRANSIENT_DB ||
27b80 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f eType==SQLITE_O
27b90 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 PEN_WAL. );..
27ba0 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30 assert( pFile!=0
27bb0 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69 );. memset(pFi
27bc0 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 le, 0, sizeof(wi
27bd0 6e 46 69 6c 65 29 29 3b 0a 20 20 70 46 69 6c 65 nFile));. pFile
27be0 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 ->h = INVALID_HA
27bf0 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a 23 69 66 NDLE_VALUE;..#if
27c00 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 SQLITE_OS_WINRT
27c10 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61 6d . if( !zUtf8Nam
27c20 65 20 26 26 20 21 73 71 6c 69 74 65 33 5f 74 65 e && !sqlite3_te
27c30 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a mp_directory ){.
27c40 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 sqlite3_log(
27c50 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 0a 20 20 SQLITE_ERROR,.
27c60 20 20 20 20 20 20 22 73 71 6c 69 74 65 33 5f 74 "sqlite3_t
27c70 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 76 61 emp_directory va
27c80 72 69 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 riable should be
27c90 20 73 65 74 20 66 6f 72 20 57 69 6e 52 54 22 29 set for WinRT")
27ca0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 ;. }.#endif..
27cb0 2f 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 /* If the second
27cc0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 argument to thi
27cd0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55 s function is NU
27ce0 4c 4c 2c 20 67 65 6e 65 72 61 74 65 20 61 0a 20 LL, generate a.
27cf0 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66 69 ** temporary fi
27d00 6c 65 20 6e 61 6d 65 20 74 6f 20 75 73 65 0a 20 le name to use.
27d10 20 2a 2f 0a 20 20 69 66 28 20 21 7a 55 74 66 38 */. if( !zUtf8
27d20 4e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65 Name ){. asse
27d30 72 74 28 20 69 73 44 65 6c 65 74 65 20 26 26 20 rt( isDelete &&
27d40 21 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 29 !isOpenJournal )
27d50 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 47 65 ;. rc = winGe
27d60 74 54 65 6d 70 6e 61 6d 65 28 70 56 66 73 2c 20 tTempname(pVfs,
27d70 26 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 &zTmpname);.
27d80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f if( rc!=SQLITE_O
27d90 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 K ){. OSTRA
27da0 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 CE(("OPEN name=%
27db0 73 2c 20 72 63 3d 25 73 22 2c 20 7a 55 74 66 38 s, rc=%s", zUtf8
27dc0 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72 Name, sqlite3Err
27dd0 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 Name(rc)));.
27de0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 return rc;.
27df0 20 7d 0a 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 }. zUtf8Name
27e00 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d = zTmpname;. }
27e10 0a 0a 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 .. /* Database
27e20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 64 6f filenames are do
27e30 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e uble-zero termin
27e40 61 74 65 64 20 69 66 20 74 68 65 79 20 61 72 65 ated if they are
27e50 20 6e 6f 74 0a 20 20 2a 2a 20 55 52 49 73 20 77 not. ** URIs w
27e60 69 74 68 20 70 61 72 61 6d 65 74 65 72 73 2e 20 ith parameters.
27e70 20 48 65 6e 63 65 2c 20 74 68 65 79 20 63 61 6e Hence, they can
27e80 20 61 6c 77 61 79 73 20 62 65 20 70 61 73 73 65 always be passe
27e90 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 d into. ** sqli
27ea0 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 te3_uri_paramete
27eb0 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 r().. */. asse
27ec0 72 74 28 20 28 65 54 79 70 65 21 3d 53 51 4c 49 rt( (eType!=SQLI
27ed0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 TE_OPEN_MAIN_DB)
27ee0 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c || (flags & SQL
27ef0 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c ITE_OPEN_URI) ||
27f00 0a 20 20 20 20 20 20 20 7a 55 74 66 38 4e 61 6d . zUtf8Nam
27f10 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 e[sqlite3Strlen3
27f20 30 28 7a 55 74 66 38 4e 61 6d 65 29 2b 31 5d 3d 0(zUtf8Name)+1]=
27f30 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76 =0 );.. /* Conv
27f40 65 72 74 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 ert the filename
27f50 20 74 6f 20 74 68 65 20 73 79 73 74 65 6d 20 65 to the system e
27f60 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 7a 43 ncoding. */. zC
27f70 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f onverted = winCo
27f80 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c nvertFromUtf8Fil
27f90 65 6e 61 6d 65 28 7a 55 74 66 38 4e 61 6d 65 29 ename(zUtf8Name)
27fa0 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 ;. if( zConvert
27fb0 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c ed==0 ){. sql
27fc0 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 ite3_free(zTmpna
27fd0 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 me);. OSTRACE
27fe0 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c (("OPEN name=%s,
27ff0 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 rc=SQLITE_IOERR
28000 5f 4e 4f 4d 45 4d 22 2c 20 7a 55 74 66 38 4e 61 _NOMEM", zUtf8Na
28010 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e me));. return
28020 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f SQLITE_IOERR_NO
28030 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 MEM_BKPT;. }..
28040 20 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 if( winIsDir(zC
28050 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 onverted) ){.
28060 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 sqlite3_free(zC
28070 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 73 onverted);. s
28080 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 qlite3_free(zTmp
28090 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 name);. OSTRA
280a0 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 CE(("OPEN name=%
280b0 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e s, rc=SQLITE_CAN
280c0 54 4f 50 45 4e 5f 49 53 44 49 52 22 2c 20 7a 55 TOPEN_ISDIR", zU
280d0 74 66 38 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 tf8Name));. r
280e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e eturn SQLITE_CAN
280f0 54 4f 50 45 4e 5f 49 53 44 49 52 3b 0a 20 20 7d TOPEN_ISDIR;. }
28100 0a 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72 .. if( isReadWr
28110 69 74 65 20 29 7b 0a 20 20 20 20 64 77 44 65 73 ite ){. dwDes
28120 69 72 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e iredAccess = GEN
28130 45 52 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 ERIC_READ | GENE
28140 52 49 43 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c RIC_WRITE;. }el
28150 73 65 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65 se{. dwDesire
28160 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49 dAccess = GENERI
28170 43 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f C_READ;. }.. /
28180 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 * SQLITE_OPEN_EX
28190 43 4c 55 53 49 56 45 20 69 73 20 75 73 65 64 20 CLUSIVE is used
281a0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 to make sure tha
281b0 74 20 61 20 6e 65 77 20 66 69 6c 65 20 69 73 0a t a new file is.
281c0 20 20 2a 2a 20 63 72 65 61 74 65 64 2e 20 53 51 ** created. SQ
281d0 4c 69 74 65 20 64 6f 65 73 6e 27 74 20 75 73 65 Lite doesn't use
281e0 20 69 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20 it to indicate
281f0 22 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 "exclusive acces
28200 73 22 0a 20 20 2a 2a 20 61 73 20 69 74 20 69 73 s". ** as it is
28210 20 75 73 75 61 6c 6c 79 20 75 6e 64 65 72 73 74 usually underst
28220 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 ood.. */. if(
28230 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 isExclusive ){.
28240 20 20 20 2f 2a 20 43 72 65 61 74 65 73 20 61 20 /* Creates a
28250 6e 65 77 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 new file, only i
28260 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c f it does not al
28270 72 65 61 64 79 20 65 78 69 73 74 2e 20 2a 2f 0a ready exist. */.
28280 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 /* If the fi
28290 6c 65 20 65 78 69 73 74 73 2c 20 69 74 20 66 61 le exists, it fa
282a0 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 ils. */. dwCr
282b0 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f eationDispositio
282c0 6e 20 3d 20 43 52 45 41 54 45 5f 4e 45 57 3b 0a n = CREATE_NEW;.
282d0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 43 72 }else if( isCr
282e0 65 61 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f eate ){. /* O
282f0 70 65 6e 20 65 78 69 73 74 69 6e 67 20 66 69 6c pen existing fil
28300 65 2c 20 6f 72 20 63 72 65 61 74 65 20 69 66 20 e, or create if
28310 69 74 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74 it doesn't exist
28320 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 */. dwCreati
28330 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 onDisposition =
28340 4f 50 45 4e 5f 41 4c 57 41 59 53 3b 0a 20 20 7d OPEN_ALWAYS;. }
28350 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 else{. /* Ope
28360 6e 73 20 61 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 ns a file, only
28370 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 2a 2f if it exists. */
28380 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 . dwCreationD
28390 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 isposition = OPE
283a0 4e 5f 45 58 49 53 54 49 4e 47 3b 0a 20 20 7d 0a N_EXISTING;. }.
283b0 0a 20 20 64 77 53 68 61 72 65 4d 6f 64 65 20 3d . dwShareMode =
283c0 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 FILE_SHARE_READ
283d0 20 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 | FILE_SHARE_WR
283e0 49 54 45 3b 0a 0a 20 20 69 66 28 20 69 73 44 65 ITE;.. if( isDe
283f0 6c 65 74 65 20 29 7b 0a 23 69 66 20 53 51 4c 49 lete ){.#if SQLI
28400 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 TE_OS_WINCE.
28410 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 dwFlagsAndAttrib
28420 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 utes = FILE_ATTR
28430 49 42 55 54 45 5f 48 49 44 44 45 4e 3b 0a 20 20 IBUTE_HIDDEN;.
28440 20 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 65 isTemp = 1;.#e
28450 6c 73 65 0a 20 20 20 20 64 77 46 6c 61 67 73 41 lse. dwFlagsA
28460 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 ndAttributes = F
28470 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 54 45 ILE_ATTRIBUTE_TE
28480 4d 50 4f 52 41 52 59 0a 20 20 20 20 20 20 20 20 MPORARY.
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 7c 20 46 49 4c 45 5f 41 54 | FILE_AT
284b0 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e 0a 20 TRIBUTE_HIDDEN.
284c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
284d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 |
284e0 46 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45 FILE_FLAG_DELETE
284f0 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64 69 _ON_CLOSE;.#endi
28500 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 f. }else{. d
28510 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 wFlagsAndAttribu
28520 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 tes = FILE_ATTRI
28530 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d BUTE_NORMAL;. }
28540 0a 20 20 2f 2a 20 52 65 70 6f 72 74 73 20 66 72 . /* Reports fr
28550 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 65 74 20 om the internet
28560 61 72 65 20 74 68 61 74 20 70 65 72 66 6f 72 6d are that perform
28570 61 6e 63 65 20 69 73 20 61 6c 77 61 79 73 0a 20 ance is always.
28580 20 2a 2a 20 62 65 74 74 65 72 20 69 66 20 46 49 ** better if FI
28590 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 LE_FLAG_RANDOM_A
285a0 43 43 45 53 53 20 69 73 20 75 73 65 64 2e 20 20 CCESS is used.
285b0 54 69 63 6b 65 74 20 23 32 36 39 39 2e 20 2a 2f Ticket #2699. */
285c0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 .#if SQLITE_OS_W
285d0 49 4e 43 45 0a 20 20 64 77 46 6c 61 67 73 41 6e INCE. dwFlagsAn
285e0 64 41 74 74 72 69 62 75 74 65 73 20 7c 3d 20 46 dAttributes |= F
285f0 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f ILE_FLAG_RANDOM_
28600 41 43 43 45 53 53 3b 0a 23 65 6e 64 69 66 0a 0a ACCESS;.#endif..
28610 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 if( osIsNT() )
28620 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f {.#if SQLITE_OS_
28630 57 49 4e 52 54 0a 20 20 20 20 43 52 45 41 54 45 WINRT. CREATE
28640 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 FILE2_EXTENDED_P
28650 41 52 41 4d 45 54 45 52 53 20 65 78 74 65 6e 64 ARAMETERS extend
28660 65 64 50 61 72 61 6d 65 74 65 72 73 3b 0a 20 20 edParameters;.
28670 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 extendedParame
28680 74 65 72 73 2e 64 77 53 69 7a 65 20 3d 20 73 69 ters.dwSize = si
28690 7a 65 6f 66 28 43 52 45 41 54 45 46 49 4c 45 32 zeof(CREATEFILE2
286a0 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 _EXTENDED_PARAME
286b0 54 45 52 53 29 3b 0a 20 20 20 20 65 78 74 65 6e TERS);. exten
286c0 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 dedParameters.dw
286d0 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 20 3d FileAttributes =
286e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46 . dwF
286f0 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 lagsAndAttribute
28700 73 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 s & FILE_ATTRIBU
28710 54 45 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74 TE_MASK;. ext
28720 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e endedParameters.
28730 64 77 46 69 6c 65 46 6c 61 67 73 20 3d 20 64 77 dwFileFlags = dw
28740 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 FlagsAndAttribut
28750 65 73 20 26 20 46 49 4c 45 5f 46 4c 41 47 5f 4d es & FILE_FLAG_M
28760 41 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 ASK;. extende
28770 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53 65 dParameters.dwSe
28780 63 75 72 69 74 79 51 6f 73 46 6c 61 67 73 20 3d curityQosFlags =
28790 20 53 45 43 55 52 49 54 59 5f 41 4e 4f 4e 59 4d SECURITY_ANONYM
287a0 4f 55 53 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 OUS;. extende
287b0 64 50 61 72 61 6d 65 74 65 72 73 2e 6c 70 53 65 dParameters.lpSe
287c0 63 75 72 69 74 79 41 74 74 72 69 62 75 74 65 73 curityAttributes
287d0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 65 78 74 = NULL;. ext
287e0 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e endedParameters.
287f0 68 54 65 6d 70 6c 61 74 65 46 69 6c 65 20 3d 20 hTemplateFile =
28800 4e 55 4c 4c 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 NULL;. do{.
28810 20 20 20 20 68 20 3d 20 6f 73 43 72 65 61 74 65 h = osCreate
28820 46 69 6c 65 32 28 28 4c 50 43 57 53 54 52 29 7a File2((LPCWSTR)z
28830 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 Converted,.
28840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
28850 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 dwDesiredAcce
28860 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 ss,.
28870 20 20 20 20 20 20 20 20 20 20 20 20 64 77 53 68 dwSh
28880 61 72 65 4d 6f 64 65 2c 0a 20 20 20 20 20 20 20 areMode,.
28890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
288a0 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f dwCreationDispo
288b0 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 sition,.
288c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
288d0 26 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 &extendedParamet
288e0 65 72 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 ers);. if(
288f0 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c h!=INVALID_HANDL
28900 45 5f 56 41 4c 55 45 20 29 20 62 72 65 61 6b 3b E_VALUE ) break;
28910 0a 20 20 20 20 20 20 69 66 28 20 69 73 52 65 61 . if( isRea
28920 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 dWrite ){.
28930 20 20 69 6e 74 20 72 63 32 2c 20 69 73 52 4f 20 int rc2, isRO
28940 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c = 0;. sql
28950 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d ite3BeginBenignM
28960 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 alloc();.
28970 20 72 63 32 20 3d 20 77 69 6e 41 63 63 65 73 73 rc2 = winAccess
28980 28 70 56 66 73 2c 20 7a 4e 61 6d 65 2c 20 53 51 (pVfs, zName, SQ
28990 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 LITE_ACCESS_READ
289a0 2c 20 26 69 73 52 4f 29 3b 0a 20 20 20 20 20 20 , &isRO);.
289b0 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 sqlite3EndBeni
289c0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 gnMalloc();.
289d0 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c if( rc2==SQL
289e0 49 54 45 5f 4f 4b 20 26 26 20 69 73 52 4f 20 29 ITE_OK && isRO )
289f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a break;. }.
28a00 20 20 20 20 7d 77 68 69 6c 65 28 20 77 69 6e 52 }while( winR
28a10 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 etryIoerr(&cnt,
28a20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 3b 0a 23 &lastErrno) );.#
28a30 65 6c 73 65 0a 20 20 20 20 64 6f 7b 0a 20 20 20 else. do{.
28a40 20 20 20 68 20 3d 20 6f 73 43 72 65 61 74 65 46 h = osCreateF
28a50 69 6c 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 ileW((LPCWSTR)zC
28a60 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 onverted,.
28a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
28a80 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 dwDesiredAcces
28a90 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 s,.
28aa0 20 20 20 20 20 20 20 20 20 20 20 64 77 53 68 61 dwSha
28ab0 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 reMode, NULL,.
28ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
28ad0 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e dwCreation
28ae0 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 Disposition,.
28af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
28b00 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 dwFlagsAndA
28b10 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20 20 20 ttributes,.
28b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
28b30 20 20 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 NULL);.
28b40 69 66 28 20 68 21 3d 49 4e 56 41 4c 49 44 5f 48 if( h!=INVALID_H
28b50 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 20 62 72 ANDLE_VALUE ) br
28b60 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 eak;. if( i
28b70 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 sReadWrite ){.
28b80 20 20 20 20 20 20 69 6e 74 20 72 63 32 2c 20 69 int rc2, i
28b90 73 52 4f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 sRO = 0;.
28ba0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e sqlite3BeginBen
28bb0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 ignMalloc();.
28bc0 20 20 20 20 20 72 63 32 20 3d 20 77 69 6e 41 63 rc2 = winAc
28bd0 63 65 73 73 28 70 56 66 73 2c 20 7a 4e 61 6d 65 cess(pVfs, zName
28be0 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f , SQLITE_ACCESS_
28bf0 52 45 41 44 2c 20 26 69 73 52 4f 29 3b 0a 20 20 READ, &isRO);.
28c00 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 sqlite3End
28c10 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a BenignMalloc();.
28c20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 32 3d if( rc2=
28c30 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 73 =SQLITE_OK && is
28c40 52 4f 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 RO ) break;.
28c50 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 }. }while(
28c60 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 winRetryIoerr(&c
28c70 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 nt, &lastErrno)
28c80 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 );.#endif. }.#i
28c90 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 fdef SQLITE_WIN3
28ca0 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 2_HAS_ANSI. els
28cb0 65 7b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 e{. do{.
28cc0 20 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c h = osCreateFil
28cd0 65 41 28 28 4c 50 43 53 54 52 29 7a 43 6f 6e 76 eA((LPCSTR)zConv
28ce0 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 erted,.
28cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 d
28d00 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a wDesiredAccess,.
28d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
28d20 20 20 20 20 20 20 20 20 64 77 53 68 61 72 65 4d dwShareM
28d30 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 ode, NULL,.
28d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
28d50 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 dwCreationDis
28d60 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 position,.
28d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
28d80 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 dwFlagsAndAttr
28d90 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20 ibutes,.
28da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
28db0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 69 66 28 NULL);. if(
28dc0 20 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 h!=INVALID_HAND
28dd0 4c 45 5f 56 41 4c 55 45 20 29 20 62 72 65 61 6b LE_VALUE ) break
28de0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 52 65 ;. if( isRe
28df0 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 adWrite ){.
28e00 20 20 20 69 6e 74 20 72 63 32 2c 20 69 73 52 4f int rc2, isRO
28e10 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 = 0;. sq
28e20 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e lite3BeginBenign
28e30 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 Malloc();.
28e40 20 20 72 63 32 20 3d 20 77 69 6e 41 63 63 65 73 rc2 = winAcces
28e50 73 28 70 56 66 73 2c 20 7a 4e 61 6d 65 2c 20 53 s(pVfs, zName, S
28e60 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 QLITE_ACCESS_REA
28e70 44 2c 20 26 69 73 52 4f 29 3b 0a 20 20 20 20 20 D, &isRO);.
28e80 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e sqlite3EndBen
28e90 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 ignMalloc();.
28ea0 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51 if( rc2==SQ
28eb0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 73 52 4f 20 LITE_OK && isRO
28ec0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d ) break;. }
28ed0 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 77 69 6e . }while( win
28ee0 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c RetryIoerr(&cnt,
28ef0 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 3b 0a &lastErrno) );.
28f00 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e }.#endif. win
28f10 4c 6f 67 49 6f 65 72 72 28 63 6e 74 2c 20 5f 5f LogIoerr(cnt, __
28f20 4c 49 4e 45 5f 5f 29 3b 0a 0a 20 20 4f 53 54 52 LINE__);.. OSTR
28f30 41 43 45 28 28 22 4f 50 45 4e 20 66 69 6c 65 3d ACE(("OPEN file=
28f40 25 70 2c 20 6e 61 6d 65 3d 25 73 2c 20 61 63 63 %p, name=%s, acc
28f50 65 73 73 3d 25 6c 78 2c 20 72 63 3d 25 73 5c 6e ess=%lx, rc=%s\n
28f60 22 2c 20 68 2c 20 7a 55 74 66 38 4e 61 6d 65 2c ", h, zUtf8Name,
28f70 0a 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65 . dwDe
28f80 73 69 72 65 64 41 63 63 65 73 73 2c 20 28 68 3d siredAccess, (h=
28f90 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f =INVALID_HANDLE_
28fa0 56 41 4c 55 45 29 20 3f 20 22 66 61 69 6c 65 64 VALUE) ? "failed
28fb0 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 20 20 69 " : "ok"));.. i
28fc0 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 f( h==INVALID_HA
28fd0 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 NDLE_VALUE ){.
28fe0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a sqlite3_free(z
28ff0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 Converted);.
29000 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d sqlite3_free(zTm
29010 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 pname);. if(
29020 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20 21 isReadWrite && !
29030 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 isExclusive ){.
29040 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4f return winO
29050 70 65 6e 28 70 56 66 73 2c 20 7a 4e 61 6d 65 2c pen(pVfs, zName,
29060 20 69 64 2c 0a 20 20 20 20 20 20 20 20 20 28 28 id,. ((
29070 66 6c 61 67 73 7c 53 51 4c 49 54 45 5f 4f 50 45 flags|SQLITE_OPE
29080 4e 5f 52 45 41 44 4f 4e 4c 59 29 20 26 0a 20 20 N_READONLY) &.
29090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
290a0 20 20 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e ~(SQLITE_OPEN
290b0 5f 43 52 45 41 54 45 7c 53 51 4c 49 54 45 5f 4f _CREATE|SQLITE_O
290c0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 29 2c PEN_READWRITE)),
290d0 0a 20 20 20 20 20 20 20 20 20 70 4f 75 74 46 6c . pOutFl
290e0 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b ags);. }else{
290f0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 . pFile->la
29100 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 stErrno = lastEr
29110 72 6e 6f 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f rno;. winLo
29120 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 gError(SQLITE_CA
29130 4e 54 4f 50 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c NTOPEN, pFile->l
29140 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 4f 70 astErrno, "winOp
29150 65 6e 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b en", zUtf8Name);
29160 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 . return SQ
29170 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b LITE_CANTOPEN_BK
29180 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 PT;. }. }..
29190 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29 if( pOutFlags )
291a0 7b 0a 20 20 20 20 69 66 28 20 69 73 52 65 61 64 {. if( isRead
291b0 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 2a Write ){. *
291c0 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 pOutFlags = SQLI
291d0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 TE_OPEN_READWRIT
291e0 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 E;. }else{.
291f0 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d *pOutFlags =
29200 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 SQLITE_OPEN_REA
29210 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d DONLY;. }. }
29220 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 .. OSTRACE(("OP
29230 45 4e 20 66 69 6c 65 3d 25 70 2c 20 6e 61 6d 65 EN file=%p, name
29240 3d 25 73 2c 20 61 63 63 65 73 73 3d 25 6c 78 2c =%s, access=%lx,
29250 20 70 4f 75 74 46 6c 61 67 73 3d 25 70 2c 20 2a pOutFlags=%p, *
29260 70 4f 75 74 46 6c 61 67 73 3d 25 64 2c 20 22 0a pOutFlags=%d, ".
29270 20 20 20 20 20 20 20 20 20 20 20 22 72 63 3d 25 "rc=%
29280 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66 38 4e 61 s\n", h, zUtf8Na
29290 6d 65 2c 20 64 77 44 65 73 69 72 65 64 41 63 63 me, dwDesiredAcc
292a0 65 73 73 2c 20 70 4f 75 74 46 6c 61 67 73 2c 20 ess, pOutFlags,
292b0 70 4f 75 74 46 6c 61 67 73 20 3f 0a 20 20 20 20 pOutFlags ?.
292c0 20 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 *pOutFlag
292d0 73 20 3a 20 30 2c 20 28 68 3d 3d 49 4e 56 41 4c s : 0, (h==INVAL
292e0 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29 ID_HANDLE_VALUE)
292f0 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f ? "failed" : "o
29300 6b 22 29 29 3b 0a 0a 20 20 70 41 70 70 44 61 74 k"));.. pAppDat
29310 61 20 3d 20 28 77 69 6e 56 66 73 41 70 70 44 61 a = (winVfsAppDa
29320 74 61 2a 29 70 56 66 73 2d 3e 70 41 70 70 44 61 ta*)pVfs->pAppDa
29330 74 61 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f ta;..#if SQLITE_
29340 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 0a 20 20 20 OS_WINCE. {.
29350 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 if( isReadWrite
29360 20 26 26 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 && eType==SQLIT
29370 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a 20 E_OPEN_MAIN_DB.
29380 20 20 20 20 20 20 20 20 26 26 20 28 28 70 41 70 && ((pAp
29390 70 44 61 74 61 3d 3d 4e 55 4c 4c 29 20 7c 7c 20 pData==NULL) ||
293a0 21 70 41 70 70 44 61 74 61 2d 3e 62 4e 6f 4c 6f !pAppData->bNoLo
293b0 63 6b 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 ck). &&
293c0 28 72 63 20 3d 20 77 69 6e 63 65 43 72 65 61 74 (rc = winceCreat
293d0 65 4c 6f 63 6b 28 7a 4e 61 6d 65 2c 20 70 46 69 eLock(zName, pFi
293e0 6c 65 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a le))!=SQLITE_OK.
293f0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6f 73 43 ){. osC
29400 6c 6f 73 65 48 61 6e 64 6c 65 28 68 29 3b 0a 20 loseHandle(h);.
29410 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 sqlite3_fre
29420 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 e(zConverted);.
29430 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 sqlite3_fre
29440 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 e(zTmpname);.
29450 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 OSTRACE(("OPE
29460 4e 2d 43 45 2d 4c 4f 43 4b 20 6e 61 6d 65 3d 25 N-CE-LOCK name=%
29470 73 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 7a 4e 61 s, rc=%s\n", zNa
29480 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 me, sqlite3ErrNa
29490 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 me(rc)));.
294a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d return rc;. }
294b0 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 54 65 6d . }. if( isTem
294c0 70 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e p ){. pFile->
294d0 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 3d zDeleteOnClose =
294e0 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 7d zConverted;. }
294f0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a else.#endif. {.
29500 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 sqlite3_free
29510 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 (zConverted);.
29520 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 }.. sqlite3_fre
29530 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 70 e(zTmpname);. p
29540 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 File->pMethod =
29550 70 41 70 70 44 61 74 61 20 3f 20 70 41 70 70 44 pAppData ? pAppD
29560 61 74 61 2d 3e 70 4d 65 74 68 6f 64 20 3a 20 26 ata->pMethod : &
29570 77 69 6e 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 70 winIoMethod;. p
29580 46 69 6c 65 2d 3e 70 56 66 73 20 3d 20 70 56 66 File->pVfs = pVf
29590 73 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 s;. pFile->h =
295a0 68 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f h;. if( isReado
295b0 6e 6c 79 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 nly ){. pFile
295c0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 ->ctrlFlags |= W
295d0 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 INFILE_RDONLY;.
295e0 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 }. if( sqlite3
295f0 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61 _uri_boolean(zNa
29600 6d 65 2c 20 22 70 73 6f 77 22 2c 20 53 51 4c 49 me, "psow", SQLI
29610 54 45 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 TE_POWERSAFE_OVE
29620 52 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 70 RWRITE) ){. p
29630 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 File->ctrlFlags
29640 7c 3d 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 3b |= WINFILE_PSOW;
29650 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 . }. pFile->la
29660 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 stErrno = NO_ERR
29670 4f 52 3b 0a 20 20 70 46 69 6c 65 2d 3e 7a 50 61 OR;. pFile->zPa
29680 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 69 66 20 th = zName;.#if
29690 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f SQLITE_MAX_MMAP_
296a0 53 49 5a 45 3e 30 0a 20 20 70 46 69 6c 65 2d 3e SIZE>0. pFile->
296b0 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 70 hMap = NULL;. p
296c0 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e File->pMapRegion
296d0 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d = 0;. pFile->m
296e0 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 mapSize = 0;. p
296f0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 File->mmapSizeAc
29700 74 75 61 6c 20 3d 20 30 3b 0a 20 20 70 46 69 6c tual = 0;. pFil
29710 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d e->mmapSizeMax =
29720 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f sqlite3GlobalCo
29730 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65 6e nfig.szMmap;.#en
29740 64 69 66 0a 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 dif.. OpenCount
29750 65 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e er(+1);. return
29760 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 rc;.}../*.** De
29770 6c 65 74 65 20 74 68 65 20 6e 61 6d 65 64 20 66 lete the named f
29780 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 ile..**.** Note
29790 74 68 61 74 20 57 69 6e 64 6f 77 73 20 64 6f 65 that Windows doe
297a0 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 66 69 s not allow a fi
297b0 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 le to be deleted
297c0 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a if some other.*
297d0 2a 20 70 72 6f 63 65 73 73 20 68 61 73 20 69 74 * process has it
297e0 20 6f 70 65 6e 2e 20 20 53 6f 6d 65 74 69 6d 65 open. Sometime
297f0 73 20 61 20 76 69 72 75 73 20 73 63 61 6e 6e 65 s a virus scanne
29800 72 20 6f 72 20 69 6e 64 65 78 69 6e 67 20 70 72 r or indexing pr
29810 6f 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70 ogram.** will op
29820 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c en a journal fil
29830 65 20 73 68 6f 72 74 6c 79 20 61 66 74 65 72 20 e shortly after
29840 69 74 20 69 73 20 63 72 65 61 74 65 64 20 69 6e it is created in
29850 20 6f 72 64 65 72 20 74 6f 20 64 6f 0a 2a 2a 20 order to do.**
29860 77 68 61 74 65 76 65 72 20 69 74 20 64 6f 65 73 whatever it does
29870 2e 20 20 57 68 69 6c 65 20 74 68 69 73 20 6f 74 . While this ot
29880 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 her process is h
29890 6f 6c 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 olding the.** fi
298a0 6c 65 20 6f 70 65 6e 2c 20 77 65 20 77 69 6c 6c le open, we will
298b0 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 64 65 be unable to de
298c0 6c 65 74 65 20 69 74 2e 20 20 54 6f 20 77 6f 72 lete it. To wor
298d0 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 0a 2a 2a k around this.**
298e0 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 65 6c problem, we del
298f0 61 79 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f ay 100 milliseco
29900 6e 64 73 20 61 6e 64 20 74 72 79 20 74 6f 20 64 nds and try to d
29910 65 6c 65 74 65 20 61 67 61 69 6e 2e 20 20 55 70 elete again. Up
29920 0a 2a 2a 20 74 6f 20 4d 58 5f 44 45 4c 45 54 49 .** to MX_DELETI
29930 4f 4e 5f 41 54 54 45 4d 50 54 73 20 64 65 6c 65 ON_ATTEMPTs dele
29940 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 61 72 tion attempts ar
29950 65 20 72 75 6e 20 62 65 66 6f 72 65 20 67 69 76 e run before giv
29960 69 6e 67 0a 2a 2a 20 75 70 20 61 6e 64 20 72 65 ing.** up and re
29970 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 turning an error
29980 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 ..*/.static int
29990 77 69 6e 44 65 6c 65 74 65 28 0a 20 20 73 71 6c winDelete(. sql
299a0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 ite3_vfs *pVfs,
299b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 /* Not
299c0 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f used on win32 */
299d0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
299e0 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 2f Filename, /
299f0 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 * Name of file t
29a00 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e o delete */. in
29a10 74 20 73 79 6e 63 44 69 72 20 20 20 20 20 20 20 t syncDir
29a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 /* Not
29a30 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a used on win32 *
29a40 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d /.){. int cnt =
29a50 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 0;. int rc;.
29a60 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 44 57 DWORD attr;. DW
29a70 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 ORD lastErrno =
29a80 30 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 0;. void *zConv
29a90 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f erted;. UNUSED_
29aa0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b PARAMETER(pVfs);
29ab0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 . UNUSED_PARAME
29ac0 54 45 52 28 73 79 6e 63 44 69 72 29 3b 0a 0a 20 TER(syncDir);..
29ad0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 SimulateIOError
29ae0 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 (return SQLITE_I
29af0 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 OERR_DELETE);.
29b00 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 OSTRACE(("DELETE
29b10 20 6e 61 6d 65 3d 25 73 2c 20 73 79 6e 63 44 69 name=%s, syncDi
29b20 72 3d 25 64 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 r=%d\n", zFilena
29b30 6d 65 2c 20 73 79 6e 63 44 69 72 29 29 3b 0a 0a me, syncDir));..
29b40 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 zConverted = w
29b50 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 inConvertFromUtf
29b60 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 8Filename(zFilen
29b70 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e ame);. if( zCon
29b80 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 verted==0 ){.
29b90 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45 54 OSTRACE(("DELET
29ba0 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 E name=%s, rc=SQ
29bb0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d LITE_IOERR_NOMEM
29bc0 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 \n", zFilename))
29bd0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c ;. return SQL
29be0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f ITE_IOERR_NOMEM_
29bf0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 BKPT;. }. if(
29c00 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 osIsNT() ){.
29c10 64 6f 20 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f do {.#if SQLITE_
29c20 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 57 OS_WINRT. W
29c30 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 IN32_FILE_ATTRIB
29c40 55 54 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 UTE_DATA sAttrDa
29c50 74 61 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 ta;. memset
29c60 28 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 (&sAttrData, 0,
29c70 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 sizeof(sAttrData
29c80 29 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6f ));. if ( o
29c90 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 sGetFileAttribut
29ca0 65 73 45 78 57 28 7a 43 6f 6e 76 65 72 74 65 64 esExW(zConverted
29cb0 2c 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 , GetFileExInfoS
29cc0 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20 tandard,.
29cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
29ce0 20 20 20 20 20 20 20 20 20 20 20 26 73 41 74 74 &sAtt
29cf0 72 44 61 74 61 29 20 29 7b 0a 20 20 20 20 20 20 rData) ){.
29d00 20 20 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 attr = sAttrDa
29d10 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 ta.dwFileAttribu
29d20 74 65 73 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 tes;. }else
29d30 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 {. lastEr
29d40 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 rno = osGetLastE
29d50 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 rror();.
29d60 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 if( lastErrno==E
29d70 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f RROR_FILE_NOT_FO
29d80 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 UND. ||
29d90 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 lastErrno==ERROR
29da0 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 _PATH_NOT_FOUND
29db0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 ){. rc
29dc0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 = SQLITE_IOERR_D
29dd0 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 ELETE_NOENT; /*
29de0 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f Already gone? */
29df0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a . }else{.
29e00 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 rc = S
29e10 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 QLITE_ERROR;.
29e20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 }. b
29e30 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 reak;. }.#e
29e40 6c 73 65 0a 20 20 20 20 20 20 61 74 74 72 20 3d lse. attr =
29e50 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 osGetFileAttrib
29e60 75 74 65 73 57 28 7a 43 6f 6e 76 65 72 74 65 64 utesW(zConverted
29e70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 );.#endif.
29e80 69 66 20 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c if ( attr==INVAL
29e90 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 ID_FILE_ATTRIBUT
29ea0 45 53 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 ES ){. la
29eb0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c stErrno = osGetL
29ec0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 astError();.
29ed0 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e if( lastErrn
29ee0 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f o==ERROR_FILE_NO
29ef0 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 T_FOUND.
29f00 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 || lastErrno==E
29f10 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f RROR_PATH_NOT_FO
29f20 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 UND ){.
29f30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 rc = SQLITE_IOE
29f40 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b RR_DELETE_NOENT;
29f50 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 /* Already gone
29f60 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c ? */. }el
29f70 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 se{. rc
29f80 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b = SQLITE_ERROR;
29f90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
29fa0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 break;.
29fb0 7d 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74 }. if ( att
29fc0 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 r&FILE_ATTRIBUTE
29fd0 5f 44 49 52 45 43 54 4f 52 59 20 29 7b 0a 20 20 _DIRECTORY ){.
29fe0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 rc = SQLIT
29ff0 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 E_ERROR; /* File
2a000 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 s only. */.
2a010 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 break;.
2a020 7d 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73 44 }. if ( osD
2a030 65 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f 6e 76 eleteFileW(zConv
2a040 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 erted) ){.
2a050 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b rc = SQLITE_OK
2a060 3b 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e ; /* Deleted OK.
2a070 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 */. brea
2a080 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 k;. }.
2a090 20 69 66 20 28 20 21 77 69 6e 52 65 74 72 79 49 if ( !winRetryI
2a0a0 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 oerr(&cnt, &last
2a0b0 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 Errno) ){.
2a0c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 rc = SQLITE_ER
2a0d0 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 ROR; /* No more
2a0e0 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 retries. */.
2a0f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 break;.
2a100 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 28 31 }. } while(1
2a110 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 );. }.#ifdef SQ
2a120 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 LITE_WIN32_HAS_A
2a130 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 NSI. else{.
2a140 64 6f 20 7b 0a 20 20 20 20 20 20 61 74 74 72 20 do {. attr
2a150 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 = osGetFileAttri
2a160 62 75 74 65 73 41 28 7a 43 6f 6e 76 65 72 74 65 butesA(zConverte
2a170 64 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 61 d);. if ( a
2a180 74 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c ttr==INVALID_FIL
2a190 45 5f 41 54 54 52 49 42 55 54 45 53 20 29 7b 0a E_ATTRIBUTES ){.
2a1a0 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e lastErrn
2a1b0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 o = osGetLastErr
2a1c0 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 or();. if
2a1d0 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 ( lastErrno==ERR
2a1e0 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e OR_FILE_NOT_FOUN
2a1f0 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61 D. || la
2a200 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 stErrno==ERROR_P
2a210 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b ATH_NOT_FOUND ){
2a220 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 . rc =
2a230 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c SQLITE_IOERR_DEL
2a240 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c ETE_NOENT; /* Al
2a250 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 ready gone? */.
2a260 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 }else{.
2a270 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c rc = SQL
2a280 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 ITE_ERROR;.
2a290 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 }. bre
2a2a0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 ak;. }.
2a2b0 20 20 69 66 20 28 20 61 74 74 72 26 46 49 4c 45 if ( attr&FILE
2a2c0 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 _ATTRIBUTE_DIREC
2a2d0 54 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 TORY ){.
2a2e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f rc = SQLITE_ERRO
2a2f0 52 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 R; /* Files only
2a300 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 . */. bre
2a310 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 ak;. }.
2a320 20 20 69 66 20 28 20 6f 73 44 65 6c 65 74 65 46 if ( osDeleteF
2a330 69 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 ileA(zConverted)
2a340 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d ){. rc =
2a350 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 SQLITE_OK; /* D
2a360 65 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 eleted OK. */.
2a370 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
2a380 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 }. if (
2a390 21 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 !winRetryIoerr(&
2a3a0 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 cnt, &lastErrno)
2a3b0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d ){. rc =
2a3c0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f SQLITE_ERROR; /
2a3d0 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69 65 * No more retrie
2a3e0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 s. */. br
2a3f0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 eak;. }.
2a400 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20 20 7d } while(1);. }
2a410 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 .#endif. if( rc
2a420 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 && rc!=SQLITE_I
2a430 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e OERR_DELETE_NOEN
2a440 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 T ){. rc = wi
2a450 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 nLogError(SQLITE
2a460 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 6c _IOERR_DELETE, l
2a470 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 44 65 astErrno, "winDe
2a480 6c 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 lete", zFilename
2a490 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 );. }else{.
2a4a0 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 2c winLogIoerr(cnt,
2a4b0 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 0a __LINE__);. }.
2a4c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a sqlite3_free(z
2a4d0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 4f 53 Converted);. OS
2a4e0 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 20 6e TRACE(("DELETE n
2a4f0 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73 5c 6e 22 ame=%s, rc=%s\n"
2a500 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c , zFilename, sql
2a510 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 ite3ErrName(rc))
2a520 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a );. return rc;.
2a530 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 }../*.** Check t
2a540 68 65 20 65 78 69 73 74 65 6e 63 65 20 61 6e 64 he existence and
2a550 20 73 74 61 74 75 73 20 6f 66 20 61 20 66 69 6c status of a fil
2a560 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 e..*/.static int
2a570 20 77 69 6e 41 63 63 65 73 73 28 0a 20 20 73 71 winAccess(. sq
2a580 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c lite3_vfs *pVfs,
2a590 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 /* Not
2a5a0 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f used on win32 */
2a5b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
2a5c0 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 2f 2a Filename, /*
2a5d0 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f Name of file to
2a5e0 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 check */. int
2a5f0 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 flags,
2a600 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f /* Type o
2a610 66 20 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 6f f test to make o
2a620 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 n this file */.
2a630 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20 int *pResOut
2a640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f /* O
2a650 55 54 3a 20 52 65 73 75 6c 74 20 2a 2f 0a 29 7b UT: Result */.){
2a660 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 . DWORD attr;.
2a670 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 44 int rc = 0;. D
2a680 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d WORD lastErrno =
2a690 20 30 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 0;. void *zCon
2a6a0 76 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44 verted;. UNUSED
2a6b0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 _PARAMETER(pVfs)
2a6c0 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 ;.. SimulateIOE
2a6d0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c rror( return SQL
2a6e0 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 ITE_IOERR_ACCESS
2a6f0 3b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 ; );. OSTRACE((
2a700 22 41 43 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c "ACCESS name=%s,
2a710 20 66 6c 61 67 73 3d 25 78 2c 20 70 52 65 73 4f flags=%x, pResO
2a720 75 74 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 ut=%p\n",.
2a730 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 zFilename,
2a740 66 6c 61 67 73 2c 20 70 52 65 73 4f 75 74 29 29 flags, pResOut))
2a750 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 ;.. zConverted
2a760 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d = winConvertFrom
2a770 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 Utf8Filename(zFi
2a780 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a lename);. if( z
2a790 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a Converted==0 ){.
2a7a0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 41 43 OSTRACE(("AC
2a7b0 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20 72 63 CESS name=%s, rc
2a7c0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f =SQLITE_IOERR_NO
2a7d0 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d MEM\n", zFilenam
2a7e0 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 e));. return
2a7f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d SQLITE_IOERR_NOM
2a800 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 EM_BKPT;. }. i
2a810 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 f( osIsNT() ){.
2a820 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a int cnt = 0;.
2a830 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 WIN32_FILE_A
2a840 54 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41 TTRIBUTE_DATA sA
2a850 74 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d ttrData;. mem
2a860 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 set(&sAttrData,
2a870 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 0, sizeof(sAttrD
2a880 61 74 61 29 29 3b 0a 20 20 20 20 77 68 69 6c 65 ata));. while
2a890 28 20 21 28 72 63 20 3d 20 6f 73 47 65 74 46 69 ( !(rc = osGetFi
2a8a0 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 28 leAttributesExW(
2a8b0 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 (LPCWSTR)zConver
2a8c0 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 ted,.
2a8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2a8e0 20 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 GetFileExInfoS
2a8f0 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20 tandard,.
2a900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2a910 20 20 20 20 20 20 26 73 41 74 74 72 44 61 74 61 &sAttrData
2a920 29 29 20 26 26 20 77 69 6e 52 65 74 72 79 49 6f )) && winRetryIo
2a930 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 err(&cnt, &lastE
2a940 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66 rrno) ){}. if
2a950 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a ( rc ){. /*
2a960 20 46 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f 41 For an SQLITE_A
2a970 43 43 45 53 53 5f 45 58 49 53 54 53 20 71 75 65 CCESS_EXISTS que
2a980 72 79 2c 20 74 72 65 61 74 20 61 20 7a 65 72 6f ry, treat a zero
2a990 2d 6c 65 6e 67 74 68 20 66 69 6c 65 0a 20 20 20 -length file.
2a9a0 20 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20 64 ** as if it d
2a9b0 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 oes not exist..
2a9c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 */. if
2a9d0 28 20 20 20 20 66 6c 61 67 73 3d 3d 53 51 4c 49 ( flags==SQLI
2a9e0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 TE_ACCESS_EXISTS
2a9f0 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73 41 . && sA
2aa00 74 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a ttrData.nFileSiz
2aa10 65 48 69 67 68 3d 3d 30 0a 20 20 20 20 20 20 20 eHigh==0.
2aa20 20 20 20 26 26 20 73 41 74 74 72 44 61 74 61 2e && sAttrData.
2aa30 6e 46 69 6c 65 53 69 7a 65 4c 6f 77 3d 3d 30 20 nFileSizeLow==0
2aa40 29 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 ){. attr
2aa50 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 = INVALID_FILE_A
2aa60 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 TTRIBUTES;.
2aa70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 }else{.
2aa80 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74 61 attr = sAttrData
2aa90 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 .dwFileAttribute
2aaa0 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d s;. }. }
2aab0 65 6c 73 65 7b 0a 20 20 20 20 20 20 77 69 6e 4c else{. winL
2aac0 6f 67 49 6f 65 72 72 28 63 6e 74 2c 20 5f 5f 4c ogIoerr(cnt, __L
2aad0 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 69 66 INE__);. if
2aae0 28 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52 ( lastErrno!=ERR
2aaf0 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e OR_FILE_NOT_FOUN
2ab00 44 20 26 26 20 6c 61 73 74 45 72 72 6e 6f 21 3d D && lastErrno!=
2ab10 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 ERROR_PATH_NOT_F
2ab20 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 OUND ){.
2ab30 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f sqlite3_free(zCo
2ab40 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 nverted);.
2ab50 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 return winLogE
2ab60 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 rror(SQLITE_IOER
2ab70 52 5f 41 43 43 45 53 53 2c 20 6c 61 73 74 45 72 R_ACCESS, lastEr
2ab80 72 6e 6f 2c 20 22 77 69 6e 41 63 63 65 73 73 22 rno, "winAccess"
2ab90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
2aba0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 zFi
2abb0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d lename);. }
2abc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74 else{. at
2abd0 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c tr = INVALID_FIL
2abe0 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 E_ATTRIBUTES;.
2abf0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a }. }. }.
2ac00 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 #ifdef SQLITE_WI
2ac10 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 N32_HAS_ANSI. e
2ac20 6c 73 65 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 lse{. attr =
2ac30 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 osGetFileAttribu
2ac40 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e tesA((char*)zCon
2ac50 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e verted);. }.#en
2ac60 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 dif. sqlite3_fr
2ac70 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a ee(zConverted);.
2ac80 20 20 73 77 69 74 63 68 28 20 66 6c 61 67 73 20 switch( flags
2ac90 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 ){. case SQLI
2aca0 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a TE_ACCESS_READ:.
2acb0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f case SQLITE_
2acc0 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 ACCESS_EXISTS:.
2acd0 20 20 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d rc = attr!=
2ace0 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 INVALID_FILE_ATT
2acf0 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 62 RIBUTES;. b
2ad00 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 reak;. case S
2ad10 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 QLITE_ACCESS_REA
2ad20 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20 72 63 DWRITE:. rc
2ad30 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 = attr!=INVALID
2ad40 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 _FILE_ATTRIBUTES
2ad50 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 &&.
2ad60 20 28 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54 (attr & FILE_AT
2ad70 54 52 49 42 55 54 45 5f 52 45 41 44 4f 4e 4c 59 TRIBUTE_READONLY
2ad80 29 3d 3d 30 3b 0a 20 20 20 20 20 20 62 72 65 61 )==0;. brea
2ad90 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a k;. default:.
2ada0 20 20 20 20 20 20 61 73 73 65 72 74 28 21 22 49 assert(!"I
2adb0 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67 nvalid flags arg
2adc0 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a ument");. }. *
2add0 70 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 pResOut = rc;.
2ade0 4f 53 54 52 41 43 45 28 28 22 41 43 43 45 53 53 OSTRACE(("ACCESS
2adf0 20 6e 61 6d 65 3d 25 73 2c 20 70 52 65 73 4f 75 name=%s, pResOu
2ae00 74 3d 25 70 2c 20 2a 70 52 65 73 4f 75 74 3d 25 t=%p, *pResOut=%
2ae10 64 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c d, rc=SQLITE_OK\
2ae20 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a n",. z
2ae30 46 69 6c 65 6e 61 6d 65 2c 20 70 52 65 73 4f 75 Filename, pResOu
2ae40 74 2c 20 2a 70 52 65 73 4f 75 74 29 29 3b 0a 20 t, *pResOut));.
2ae50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
2ae60 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 K;.}../*.** Retu
2ae70 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 rns non-zero if
2ae80 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 the specified pa
2ae90 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77 th name starts w
2aea0 69 74 68 20 61 20 64 72 69 76 65 20 6c 65 74 74 ith a drive lett
2aeb0 65 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 er.** followed b
2aec0 79 20 61 20 63 6f 6c 6f 6e 20 63 68 61 72 61 63 y a colon charac
2aed0 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 ter..*/.static B
2aee0 4f 4f 4c 20 77 69 6e 49 73 44 72 69 76 65 4c 65 OOL winIsDriveLe
2aef0 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 0a 20 20 tterAndColon(.
2af00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 const char *zPat
2af10 68 6e 61 6d 65 0a 29 7b 0a 20 20 72 65 74 75 72 hname.){. retur
2af20 6e 20 28 20 73 71 6c 69 74 65 33 49 73 61 6c 70 n ( sqlite3Isalp
2af30 68 61 28 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 29 ha(zPathname[0])
2af40 20 26 26 20 7a 50 61 74 68 6e 61 6d 65 5b 31 5d && zPathname[1]
2af50 3d 3d 27 3a 27 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a ==':' );.}../*.*
2af60 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 * Returns non-ze
2af70 72 6f 20 69 66 20 74 68 65 20 73 70 65 63 69 66 ro if the specif
2af80 69 65 64 20 70 61 74 68 20 6e 61 6d 65 20 73 68 ied path name sh
2af90 6f 75 6c 64 20 62 65 20 75 73 65 64 20 76 65 72 ould be used ver
2afa0 62 61 74 69 6d 2e 20 20 49 66 0a 2a 2a 20 6e 6f batim. If.** no
2afb0 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e n-zero is return
2afc0 65 64 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e ed from this fun
2afd0 63 74 69 6f 6e 2c 20 74 68 65 20 63 61 6c 6c 69 ction, the calli
2afe0 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 ng function must
2aff0 20 73 69 6d 70 6c 79 0a 2a 2a 20 75 73 65 20 74 simply.** use t
2b000 68 65 20 70 72 6f 76 69 64 65 64 20 70 61 74 68 he provided path
2b010 20 6e 61 6d 65 20 76 65 72 62 61 74 69 6d 20 2d name verbatim -
2b020 4f 52 2d 20 72 65 73 6f 6c 76 65 20 69 74 20 69 OR- resolve it i
2b030 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 20 nto a full path
2b040 6e 61 6d 65 0a 2a 2a 20 75 73 69 6e 67 20 74 68 name.** using th
2b050 65 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d e GetFullPathNam
2b060 65 20 57 69 6e 33 32 20 41 50 49 20 66 75 6e 63 e Win32 API func
2b070 74 69 6f 6e 20 28 69 66 20 61 76 61 69 6c 61 62 tion (if availab
2b080 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 le)..*/.static B
2b090 4f 4f 4c 20 77 69 6e 49 73 56 65 72 62 61 74 69 OOL winIsVerbati
2b0a0 6d 50 61 74 68 6e 61 6d 65 28 0a 20 20 63 6f 6e mPathname(. con
2b0b0 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 st char *zPathna
2b0c0 6d 65 0a 29 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20 me.){. /*. **
2b0d0 49 66 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65 If the path name
2b0e0 20 73 74 61 72 74 73 20 77 69 74 68 20 61 20 66 starts with a f
2b0f0 6f 72 77 61 72 64 20 73 6c 61 73 68 20 6f 72 20 orward slash or
2b100 61 20 62 61 63 6b 73 6c 61 73 68 2c 20 69 74 20 a backslash, it
2b110 69 73 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 61 is either. ** a
2b120 20 6c 65 67 61 6c 20 55 4e 43 20 6e 61 6d 65 2c legal UNC name,
2b130 20 61 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69 a volume relati
2b140 76 65 20 70 61 74 68 2c 20 6f 72 20 61 6e 20 61 ve path, or an a
2b150 62 73 6f 6c 75 74 65 20 70 61 74 68 20 6e 61 6d bsolute path nam
2b160 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 55 e in the. ** "U
2b170 6e 69 78 22 20 66 6f 72 6d 61 74 20 6f 6e 20 57 nix" format on W
2b180 69 6e 64 6f 77 73 2e 20 20 54 68 65 72 65 20 69 indows. There i
2b190 73 20 6e 6f 20 65 61 73 79 20 77 61 79 20 74 6f s no easy way to
2b1a0 20 64 69 66 66 65 72 65 6e 74 69 61 74 65 20 62 differentiate b
2b1b0 65 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20 etween. ** the
2b1c0 66 69 6e 61 6c 20 74 77 6f 20 63 61 73 65 73 3b final two cases;
2b1d0 20 74 68 65 72 65 66 6f 72 65 2c 20 77 65 20 72 therefore, we r
2b1e0 65 74 75 72 6e 20 74 68 65 20 73 61 66 65 72 20 eturn the safer
2b1f0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 return value of
2b200 54 52 55 45 0a 20 20 2a 2a 20 73 6f 20 74 68 61 TRUE. ** so tha
2b210 74 20 63 61 6c 6c 65 72 73 20 6f 66 20 74 68 69 t callers of thi
2b220 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 s function will
2b230 73 69 6d 70 6c 79 20 75 73 65 20 69 74 20 76 65 simply use it ve
2b240 72 62 61 74 69 6d 2e 0a 20 20 2a 2f 0a 20 20 69 rbatim.. */. i
2b250 66 20 28 20 77 69 6e 49 73 44 69 72 53 65 70 28 f ( winIsDirSep(
2b260 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 29 20 29 7b zPathname[0]) ){
2b270 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52 55 45 . return TRUE
2b280 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a ;. }.. /*. **
2b290 20 49 66 20 74 68 65 20 70 61 74 68 20 6e 61 6d If the path nam
2b2a0 65 20 73 74 61 72 74 73 20 77 69 74 68 20 61 20 e starts with a
2b2b0 6c 65 74 74 65 72 20 61 6e 64 20 61 20 63 6f 6c letter and a col
2b2c0 6f 6e 20 69 74 20 69 73 20 65 69 74 68 65 72 20 on it is either
2b2d0 61 20 76 6f 6c 75 6d 65 0a 20 20 2a 2a 20 72 65 a volume. ** re
2b2e0 6c 61 74 69 76 65 20 70 61 74 68 20 6f 72 20 61 lative path or a
2b2f0 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 2e n absolute path.
2b300 20 20 43 61 6c 6c 65 72 73 20 6f 66 20 74 68 69 Callers of thi
2b310 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 s function must
2b320 6e 6f 74 0a 20 20 2a 2a 20 61 74 74 65 6d 70 74 not. ** attempt
2b330 20 74 6f 20 74 72 65 61 74 20 69 74 20 61 73 20 to treat it as
2b340 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 a relative path
2b350 6e 61 6d 65 20 28 69 2e 65 2e 20 74 68 65 79 20 name (i.e. they
2b360 73 68 6f 75 6c 64 20 73 69 6d 70 6c 79 20 75 73 should simply us
2b370 65 0a 20 20 2a 2a 20 69 74 20 76 65 72 62 61 74 e. ** it verbat
2b380 69 6d 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28 im).. */. if (
2b390 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 winIsDriveLette
2b3a0 72 41 6e 64 43 6f 6c 6f 6e 28 7a 50 61 74 68 6e rAndColon(zPathn
2b3b0 61 6d 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 ame) ){. retu
2b3c0 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 rn TRUE;. }..
2b3d0 2f 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 67 65 /*. ** If we ge
2b3e0 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c t to this point,
2b3f0 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73 the path name s
2b400 68 6f 75 6c 64 20 61 6c 6d 6f 73 74 20 63 65 72 hould almost cer
2b410 74 61 69 6e 6c 79 20 62 65 20 61 20 70 75 72 65 tainly be a pure
2b420 6c 79 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76 65 ly. ** relative
2b430 20 6f 6e 65 20 28 69 2e 65 2e 20 6e 6f 74 20 61 one (i.e. not a
2b440 20 55 4e 43 20 6e 61 6d 65 2c 20 6e 6f 74 20 61 UNC name, not a
2b450 62 73 6f 6c 75 74 65 2c 20 61 6e 64 20 6e 6f 74 bsolute, and not
2b460 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76 65 volume relative
2b470 29 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e ).. */. return
2b480 20 46 41 4c 53 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a FALSE;.}../*.**
2b490 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 Turn a relative
2b4a0 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 pathname into a
2b4b0 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 full pathname.
2b4c0 20 57 72 69 74 65 20 74 68 65 20 66 75 6c 6c 0a Write the full.
2b4d0 2a 2a 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f ** pathname into
2b4e0 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d zOut[]. zOut[]
2b4f0 20 77 69 6c 6c 20 62 65 20 61 74 20 6c 65 61 73 will be at leas
2b500 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 t pVfs->mxPathna
2b510 6d 65 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 me.** bytes in s
2b520 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 ize..*/.static i
2b530 6e 74 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 nt winFullPathna
2b540 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 me(. sqlite3_vf
2b550 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 s *pVfs,
2b560 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 /* Pointer t
2b570 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a o vfs object */.
2b580 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 const char *zR
2b590 65 6c 61 74 69 76 65 2c 20 20 20 20 20 20 20 20 elative,
2b5a0 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 /* Possibly rela
2b5b0 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 tive input path
2b5c0 2a 2f 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 2c 20 */. int nFull,
2b5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2b5e0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 /* Size of ou
2b5f0 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 tput buffer in b
2b600 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a ytes */. char *
2b610 7a 46 75 6c 6c 20 20 20 20 20 20 20 20 20 20 20 zFull
2b620 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 /* Outpu
2b630 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 23 t buffer */.){.#
2b640 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 if !SQLITE_OS_WI
2b650 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f NCE && !SQLITE_O
2b660 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 S_WINRT && !defi
2b670 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a ned(__CYGWIN__).
2b680 20 20 44 57 4f 52 44 20 6e 42 79 74 65 3b 0a 20 DWORD nByte;.
2b690 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 void *zConverte
2b6a0 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b d;. char *zOut;
2b6b0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 .#endif.. /* If
2b6c0 20 74 68 69 73 20 70 61 74 68 20 6e 61 6d 65 20 this path name
2b6d0 62 65 67 69 6e 73 20 77 69 74 68 20 22 2f 58 3a begins with "/X:
2b6e0 22 2c 20 77 68 65 72 65 20 22 58 22 20 69 73 20 ", where "X" is
2b6f0 61 6e 79 20 61 6c 70 68 61 62 65 74 69 63 0a 20 any alphabetic.
2b700 20 2a 2a 20 63 68 61 72 61 63 74 65 72 2c 20 64 ** character, d
2b710 69 73 63 61 72 64 20 74 68 65 20 69 6e 69 74 69 iscard the initi
2b720 61 6c 20 22 2f 22 20 66 72 6f 6d 20 74 68 65 20 al "/" from the
2b730 70 61 74 68 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 pathname.. */.
2b740 20 69 66 28 20 7a 52 65 6c 61 74 69 76 65 5b 30 if( zRelative[0
2b750 5d 3d 3d 27 2f 27 20 26 26 20 77 69 6e 49 73 44 ]=='/' && winIsD
2b760 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c riveLetterAndCol
2b770 6f 6e 28 7a 52 65 6c 61 74 69 76 65 2b 31 29 20 on(zRelative+1)
2b780 29 7b 0a 20 20 20 20 7a 52 65 6c 61 74 69 76 65 ){. zRelative
2b790 2b 2b 3b 0a 20 20 7d 0a 0a 23 69 66 20 64 65 66 ++;. }..#if def
2b7a0 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 ined(__CYGWIN__)
2b7b0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 . SimulateIOErr
2b7c0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 or( return SQLIT
2b7d0 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 55 4e 55 E_ERROR );. UNU
2b7e0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 SED_PARAMETER(nF
2b7f0 75 6c 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 ull);. assert(
2b800 6e 46 75 6c 6c 3e 3d 70 56 66 73 2d 3e 6d 78 50 nFull>=pVfs->mxP
2b810 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 69 66 20 athname );. if
2b820 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 ( sqlite3_data_d
2b830 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e irectory && !win
2b840 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 IsVerbatimPathna
2b850 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b me(zRelative) ){
2b860 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e . /*. ** N
2b870 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c OTE: We are deal
2b880 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61 74 ing with a relat
2b890 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e ive path name an
2b8a0 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a d the data. *
2b8b0 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 * director
2b8c0 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 y has been set.
2b8d0 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 Therefore, use
2b8e0 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73 0a it as the basis.
2b8f0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 ** for
2b900 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20 converting the
2b910 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 relative path na
2b920 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 me to an absolut
2b930 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f e. ** o
2b940 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67 ne by prepending
2b950 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74 the data direct
2b960 6f 72 79 20 61 6e 64 20 61 20 73 6c 61 73 68 2e ory and a slash.
2b970 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 . */. char
2b980 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 *zOut = sqlite3
2b990 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 56 66 73 MallocZero( pVfs
2b9a0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 29 ->mxPathname+1 )
2b9b0 3b 0a 20 20 20 20 69 66 28 20 21 7a 4f 75 74 20 ;. if( !zOut
2b9c0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 ){. return
2b9d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d SQLITE_IOERR_NOM
2b9e0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 EM_BKPT;. }.
2b9f0 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63 6f if( cygwin_co
2ba00 6e 76 5f 70 61 74 68 28 0a 20 20 20 20 20 20 20 nv_path(.
2ba10 20 20 20 20 20 28 6f 73 49 73 4e 54 28 29 20 3f (osIsNT() ?
2ba20 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 CCP_POSIX_TO_WI
2ba30 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f N_W : CCP_POSIX_
2ba40 54 4f 5f 57 49 4e 5f 41 29 20 7c 0a 20 20 20 20 TO_WIN_A) |.
2ba50 20 20 20 20 20 20 20 20 43 43 50 5f 52 45 4c 41 CCP_RELA
2ba60 54 49 56 45 2c 20 7a 52 65 6c 61 74 69 76 65 2c TIVE, zRelative,
2ba70 20 7a 4f 75 74 2c 20 70 56 66 73 2d 3e 6d 78 50 zOut, pVfs->mxP
2ba80 61 74 68 6e 61 6d 65 2b 31 29 3c 30 20 29 7b 0a athname+1)<0 ){.
2ba90 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 sqlite3_fr
2baa0 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 ee(zOut);.
2bab0 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 return winLogErr
2bac0 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 or(SQLITE_CANTOP
2bad0 45 4e 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44 57 EN_CONVPATH, (DW
2bae0 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20 ORD)errno,.
2baf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2bb00 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 "winFullPath
2bb10 6e 61 6d 65 31 22 2c 20 7a 52 65 6c 61 74 69 76 name1", zRelativ
2bb20 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 e);. }else{.
2bb30 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 char *zUtf8
2bb40 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 = winConvertToU
2bb50 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 4f 75 74 tf8Filename(zOut
2bb60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 55 );. if( !zU
2bb70 74 66 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 tf8 ){. s
2bb80 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 qlite3_free(zOut
2bb90 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 );. retur
2bba0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e n SQLITE_IOERR_N
2bbb0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 OMEM_BKPT;.
2bbc0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 }. sqlite3
2bbd0 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 _snprintf(MIN(nF
2bbe0 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 ull, pVfs->mxPat
2bbf0 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 hname), zFull, "
2bc00 25 73 25 63 25 73 22 2c 0a 20 20 20 20 20 20 20 %s%c%s",.
2bc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2bc20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 sqlite3_data_dir
2bc30 65 63 74 6f 72 79 2c 20 77 69 6e 47 65 74 44 69 ectory, winGetDi
2bc40 72 53 65 70 28 29 2c 20 7a 55 74 66 38 29 3b 0a rSep(), zUtf8);.
2bc50 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 sqlite3_fr
2bc60 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 ee(zUtf8);.
2bc70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f sqlite3_free(zO
2bc80 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c ut);. }. }el
2bc90 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f se{. char *zO
2bca0 75 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c ut = sqlite3Mall
2bcb0 6f 63 5a 65 72 6f 28 20 70 56 66 73 2d 3e 6d 78 ocZero( pVfs->mx
2bcc0 50 61 74 68 6e 61 6d 65 2b 31 20 29 3b 0a 20 20 Pathname+1 );.
2bcd0 20 20 69 66 28 20 21 7a 4f 75 74 20 29 7b 0a 20 if( !zOut ){.
2bce0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 return SQLI
2bcf0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 TE_IOERR_NOMEM_B
2bd00 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 KPT;. }. i
2bd10 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 f( cygwin_conv_p
2bd20 61 74 68 28 0a 20 20 20 20 20 20 20 20 20 20 20 ath(.
2bd30 20 28 6f 73 49 73 4e 54 28 29 20 3f 20 43 43 50 (osIsNT() ? CCP
2bd40 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 _POSIX_TO_WIN_W
2bd50 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 : CCP_POSIX_TO_W
2bd60 49 4e 5f 41 29 2c 0a 20 20 20 20 20 20 20 20 20 IN_A),.
2bd70 20 20 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a 4f zRelative, zO
2bd80 75 74 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 ut, pVfs->mxPath
2bd90 6e 61 6d 65 2b 31 29 3c 30 20 29 7b 0a 20 20 20 name+1)<0 ){.
2bda0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 sqlite3_free(
2bdb0 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 72 65 74 zOut);. ret
2bdc0 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 urn winLogError(
2bdd0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f SQLITE_CANTOPEN_
2bde0 43 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f 52 44 CONVPATH, (DWORD
2bdf0 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 )errno,.
2be00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2be10 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d "winFullPathnam
2be20 65 32 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b e2", zRelative);
2be30 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 . }else{.
2be40 20 20 63 68 61 72 20 2a 7a 55 74 66 38 20 3d 20 char *zUtf8 =
2be50 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 winConvertToUtf8
2be60 46 69 6c 65 6e 61 6d 65 28 7a 4f 75 74 29 3b 0a Filename(zOut);.
2be70 20 20 20 20 20 20 69 66 28 20 21 7a 55 74 66 38 if( !zUtf8
2be80 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 ){. sqli
2be90 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a te3_free(zOut);.
2bea0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 return S
2beb0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 QLITE_IOERR_NOME
2bec0 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a M_BKPT;. }.
2bed0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e sqlite3_sn
2bee0 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c printf(MIN(nFull
2bef0 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 , pVfs->mxPathna
2bf00 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 me), zFull, "%s"
2bf10 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 , zUtf8);.
2bf20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74 sqlite3_free(zUt
2bf30 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 f8);. sqlit
2bf40 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 e3_free(zOut);.
2bf50 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 }. }. retur
2bf60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e n SQLITE_OK;.#en
2bf70 64 69 66 0a 0a 23 69 66 20 28 53 51 4c 49 54 45 dif..#if (SQLITE
2bf80 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c _OS_WINCE || SQL
2bf90 49 54 45 5f 4f 53 5f 57 49 4e 52 54 29 20 26 26 ITE_OS_WINRT) &&
2bfa0 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 !defined(__CYGW
2bfb0 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 IN__). Simulate
2bfc0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 IOError( return
2bfd0 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a SQLITE_ERROR );.
2bfe0 20 20 2f 2a 20 57 69 6e 43 45 20 68 61 73 20 6e /* WinCE has n
2bff0 6f 20 63 6f 6e 63 65 70 74 20 6f 66 20 61 20 72 o concept of a r
2c000 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 elative pathname
2c010 2c 20 6f 72 20 73 6f 20 49 20 61 6d 20 74 6f 6c , or so I am tol
2c020 64 2e 20 2a 2f 0a 20 20 2f 2a 20 57 69 6e 52 54 d. */. /* WinRT
2c030 20 68 61 73 20 6e 6f 20 77 61 79 20 74 6f 20 63 has no way to c
2c040 6f 6e 76 65 72 74 20 61 20 72 65 6c 61 74 69 76 onvert a relativ
2c050 65 20 70 61 74 68 20 74 6f 20 61 6e 20 61 62 73 e path to an abs
2c060 6f 6c 75 74 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 olute one. */.
2c070 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74 if ( sqlite3_dat
2c080 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20 21 a_directory && !
2c090 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 winIsVerbatimPat
2c0a0 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 hname(zRelative)
2c0b0 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a ){. /*. *
2c0c0 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64 * NOTE: We are d
2c0d0 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65 ealing with a re
2c0e0 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 lative path name
2c0f0 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20 and the data.
2c100 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63 ** direc
2c110 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 tory has been se
2c120 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75 t. Therefore, u
2c130 73 65 20 69 74 20 61 73 20 74 68 65 20 62 61 73 se it as the bas
2c140 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 is. **
2c150 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 for converting t
2c160 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 he relative path
2c170 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f name to an abso
2c180 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 lute. **
2c190 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64 one by prepend
2c1a0 69 6e 67 20 74 68 65 20 64 61 74 61 20 64 69 72 ing the data dir
2c1b0 65 63 74 6f 72 79 20 61 6e 64 20 61 20 62 61 63 ectory and a bac
2c1c0 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 kslash.. */.
2c1d0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 sqlite3_snpri
2c1e0 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 ntf(MIN(nFull, p
2c1f0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 Vfs->mxPathname)
2c200 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63 25 73 , zFull, "%s%c%s
2c210 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ",.
2c220 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f sqlite3_
2c230 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 data_directory,
2c240 77 69 6e 47 65 74 44 69 72 53 65 70 28 29 2c 20 winGetDirSep(),
2c250 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d 65 zRelative);. }e
2c260 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 lse{. sqlite3
2c270 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 _snprintf(MIN(nF
2c280 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 ull, pVfs->mxPat
2c290 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 hname), zFull, "
2c2a0 25 73 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b %s", zRelative);
2c2b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 . }. return SQ
2c2c0 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a LITE_OK;.#endif.
2c2d0 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f .#if !SQLITE_OS_
2c2e0 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 WINCE && !SQLITE
2c2f0 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 _OS_WINRT && !de
2c300 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f fined(__CYGWIN__
2c310 29 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 ). /* It's odd
2c320 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 to simulate an i
2c330 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 o-error here, bu
2c340 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 t really this is
2c350 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 just. ** using
2c360 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e the io-error in
2c370 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 frastructure to
2c380 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 test that SQLite
2c390 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 handles this.
2c3a0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c ** function fail
2c3b0 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 ing. This functi
2c3c0 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 on could fail if
2c3d0 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 , for example, t
2c3e0 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 he. ** current
2c3f0 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 working director
2c400 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e y has been unlin
2c410 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 ked.. */. Simu
2c420 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 lateIOError( ret
2c430 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 urn SQLITE_ERROR
2c440 20 29 3b 0a 20 20 69 66 20 28 20 73 71 6c 69 74 );. if ( sqlit
2c450 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 e3_data_director
2c460 79 20 26 26 20 21 77 69 6e 49 73 56 65 72 62 61 y && !winIsVerba
2c470 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c timPathname(zRel
2c480 61 74 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a ative) ){. /*
2c490 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 . ** NOTE: We
2c4a0 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 are dealing wit
2c4b0 68 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 h a relative pat
2c4c0 68 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 h name and the d
2c4d0 61 74 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 ata. **
2c4e0 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 directory has b
2c4f0 65 65 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66 een set. Theref
2c500 6f 72 65 2c 20 75 73 65 20 69 74 20 61 73 20 74 ore, use it as t
2c510 68 65 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 he basis. **
2c520 20 20 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 for conver
2c530 74 69 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76 ting the relativ
2c540 65 20 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 e path name to a
2c550 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a n absolute. *
2c560 2a 20 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70 * one by p
2c570 72 65 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61 repending the da
2c580 74 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 ta directory and
2c590 20 61 20 62 61 63 6b 73 6c 61 73 68 2e 0a 20 20 a backslash..
2c5a0 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 */. sqlite3
2c5b0 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 _snprintf(MIN(nF
2c5c0 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 ull, pVfs->mxPat
2c5d0 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 hname), zFull, "
2c5e0 25 73 25 63 25 73 22 2c 0a 20 20 20 20 20 20 20 %s%c%s",.
2c5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 sq
2c600 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 lite3_data_direc
2c610 74 6f 72 79 2c 20 77 69 6e 47 65 74 44 69 72 53 tory, winGetDirS
2c620 65 70 28 29 2c 20 7a 52 65 6c 61 74 69 76 65 29 ep(), zRelative)
2c630 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c ;. return SQL
2c640 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 7a 43 ITE_OK;. }. zC
2c650 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f onverted = winCo
2c660 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c nvertFromUtf8Fil
2c670 65 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 ename(zRelative)
2c680 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 ;. if( zConvert
2c690 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 ed==0 ){. ret
2c6a0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 urn SQLITE_IOERR
2c6b0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d _NOMEM_BKPT;. }
2c6c0 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 . if( osIsNT()
2c6d0 29 7b 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54 ){. LPWSTR zT
2c6e0 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d emp;. nByte =
2c6f0 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 osGetFullPathNa
2c700 6d 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f meW((LPCWSTR)zCo
2c710 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 nverted, 0, 0, 0
2c720 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 );. if( nByte
2c730 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c ==0 ){. sql
2c740 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 ite3_free(zConve
2c750 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 rted);. ret
2c760 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 urn winLogError(
2c770 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f SQLITE_CANTOPEN_
2c780 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c FULLPATH, osGetL
2c790 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 astError(),.
2c7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2c7b0 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 "winFullPat
2c7c0 68 6e 61 6d 65 31 22 2c 20 7a 52 65 6c 61 74 69 hname1", zRelati
2c7d0 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e ve);. }. n
2c7e0 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a Byte += 3;. z
2c7f0 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 Temp = sqlite3Ma
2c800 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a llocZero( nByte*
2c810 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 sizeof(zTemp[0])
2c820 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d );. if( zTem
2c830 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 p==0 ){. sq
2c840 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 lite3_free(zConv
2c850 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 erted);. re
2c860 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 turn SQLITE_IOER
2c870 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 R_NOMEM_BKPT;.
2c880 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 }. nByte =
2c890 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d osGetFullPathNam
2c8a0 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e eW((LPCWSTR)zCon
2c8b0 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a verted, nByte, z
2c8c0 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 Temp, 0);. if
2c8d0 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 ( nByte==0 ){.
2c8e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 sqlite3_free
2c8f0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 (zConverted);.
2c900 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 sqlite3_free
2c910 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 72 (zTemp);. r
2c920 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f eturn winLogErro
2c930 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 r(SQLITE_CANTOPE
2c940 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 N_FULLPATH, osGe
2c950 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 tLastError(),.
2c960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2c970 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 "winFullP
2c980 61 74 68 6e 61 6d 65 32 22 2c 20 7a 52 65 6c 61 athname2", zRela
2c990 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 tive);. }.
2c9a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 sqlite3_free(zC
2c9b0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a onverted);. z
2c9c0 4f 75 74 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 Out = winUnicode
2c9d0 54 6f 55 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 ToUtf8(zTemp);.
2c9e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 sqlite3_free(
2c9f0 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 69 66 64 zTemp);. }.#ifd
2ca00 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f ef SQLITE_WIN32_
2ca10 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b HAS_ANSI. else{
2ca20 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 . char *zTemp
2ca30 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 ;. nByte = os
2ca40 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 GetFullPathNameA
2ca50 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 ((char*)zConvert
2ca60 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 ed, 0, 0, 0);.
2ca70 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 if( nByte==0 )
2ca80 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f {. sqlite3_
2ca90 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 free(zConverted)
2caa0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 ;. return w
2cab0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 inLogError(SQLIT
2cac0 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 E_CANTOPEN_FULLP
2cad0 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 ATH, osGetLastEr
2cae0 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 ror(),.
2caf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2cb00 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 "winFullPathname
2cb10 33 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 3", zRelative);.
2cb20 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 }. nByte
2cb30 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 += 3;. zTemp
2cb40 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a = sqlite3MallocZ
2cb50 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f ero( nByte*sizeo
2cb60 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 f(zTemp[0]) );.
2cb70 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 if( zTemp==0
2cb80 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 ){. sqlite3
2cb90 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 _free(zConverted
2cba0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 );. return
2cbb0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d SQLITE_IOERR_NOM
2cbc0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 EM_BKPT;. }.
2cbd0 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 nByte = osGet
2cbe0 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 FullPathNameA((c
2cbf0 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c har*)zConverted,
2cc00 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 nByte, zTemp, 0
2cc10 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 );. if( nByte
2cc20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c ==0 ){. sql
2cc30 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 ite3_free(zConve
2cc40 72 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c rted);. sql
2cc50 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 ite3_free(zTemp)
2cc60 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 ;. return w
2cc70 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 inLogError(SQLIT
2cc80 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 E_CANTOPEN_FULLP
2cc90 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 ATH, osGetLastEr
2cca0 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 ror(),.
2ccb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2ccc0 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 "winFullPathname
2ccd0 34 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 4", zRelative);.
2cce0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 }. sqlite
2ccf0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 3_free(zConverte
2cd00 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 77 d);. zOut = w
2cd10 69 6e 4d 62 63 73 54 6f 55 74 66 38 28 7a 54 65 inMbcsToUtf8(zTe
2cd20 6d 70 2c 20 6f 73 41 72 65 46 69 6c 65 41 70 69 mp, osAreFileApi
2cd30 73 41 4e 53 49 28 29 29 3b 0a 20 20 20 20 73 71 sANSI());. sq
2cd40 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 lite3_free(zTemp
2cd50 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 );. }.#endif.
2cd60 69 66 28 20 7a 4f 75 74 20 29 7b 0a 20 20 20 20 if( zOut ){.
2cd70 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 sqlite3_snprintf
2cd80 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 (MIN(nFull, pVfs
2cd90 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a ->mxPathname), z
2cda0 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 4f 75 74 Full, "%s", zOut
2cdb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 );. sqlite3_f
2cdc0 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 72 ree(zOut);. r
2cdd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b eturn SQLITE_OK;
2cde0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 . }else{. re
2cdf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 turn SQLITE_IOER
2ce00 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 R_NOMEM_BKPT;.
2ce10 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 6e }.#endif.}..#ifn
2ce20 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f def SQLITE_OMIT_
2ce30 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f LOAD_EXTENSION./
2ce40 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 *.** Interfaces
2ce50 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 for opening a sh
2ce60 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 ared library, fi
2ce70 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e nding entry poin
2ce80 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 ts.** within the
2ce90 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c shared library,
2cea0 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 and closing the
2ceb0 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e shared library.
2cec0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 .*/.static void
2ced0 2a 77 69 6e 44 6c 4f 70 65 6e 28 73 71 6c 69 74 *winDlOpen(sqlit
2cee0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f e3_vfs *pVfs, co
2cef0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e nst char *zFilen
2cf00 61 6d 65 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 ame){. HANDLE h
2cf10 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f ;.#if defined(__
2cf20 43 59 47 57 49 4e 5f 5f 29 0a 20 20 69 6e 74 20 CYGWIN__). int
2cf30 6e 46 75 6c 6c 20 3d 20 70 56 66 73 2d 3e 6d 78 nFull = pVfs->mx
2cf40 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 63 68 Pathname+1;. ch
2cf50 61 72 20 2a 7a 46 75 6c 6c 20 3d 20 73 71 6c 69 ar *zFull = sqli
2cf60 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e te3MallocZero( n
2cf70 46 75 6c 6c 20 29 3b 0a 20 20 76 6f 69 64 20 2a Full );. void *
2cf80 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a zConverted = 0;.
2cf90 20 20 69 66 28 20 7a 46 75 6c 6c 3d 3d 30 20 29 if( zFull==0 )
2cfa0 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 {. OSTRACE(("
2cfb0 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 DLOPEN name=%s,
2cfc0 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46 handle=%p\n", zF
2cfd0 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29 ilename, (void*)
2cfe0 30 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 0));. return
2cff0 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77 69 6e 0;. }. if( win
2d000 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 FullPathname(pVf
2d010 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 s, zFilename, nF
2d020 75 6c 6c 2c 20 7a 46 75 6c 6c 29 21 3d 53 51 4c ull, zFull)!=SQL
2d030 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 ITE_OK ){. sq
2d040 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c lite3_free(zFull
2d050 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 );. OSTRACE((
2d060 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c "DLOPEN name=%s,
2d070 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a handle=%p\n", z
2d080 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a Filename, (void*
2d090 29 30 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e )0));. return
2d0a0 20 30 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e 76 65 0;. }. zConve
2d0b0 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 rted = winConver
2d0c0 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d tFromUtf8Filenam
2d0d0 65 28 7a 46 75 6c 6c 29 3b 0a 20 20 73 71 6c 69 e(zFull);. sqli
2d0e0 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 29 3b te3_free(zFull);
2d0f0 0a 23 65 6c 73 65 0a 20 20 76 6f 69 64 20 2a 7a .#else. void *z
2d100 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 Converted = winC
2d110 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 onvertFromUtf8Fi
2d120 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 lename(zFilename
2d130 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 );. UNUSED_PARA
2d140 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 23 65 6e METER(pVfs);.#en
2d150 64 69 66 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 dif. if( zConve
2d160 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f rted==0 ){. O
2d170 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 STRACE(("DLOPEN
2d180 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d name=%s, handle=
2d190 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 %p\n", zFilename
2d1a0 2c 20 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20 , (void*)0));.
2d1b0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a return 0;. }.
2d1c0 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 if( osIsNT() )
2d1d0 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f {.#if SQLITE_OS_
2d1e0 57 49 4e 52 54 0a 20 20 20 20 68 20 3d 20 6f 73 WINRT. h = os
2d1f0 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 LoadPackagedLibr
2d200 61 72 79 28 28 4c 50 43 57 53 54 52 29 7a 43 6f ary((LPCWSTR)zCo
2d210 6e 76 65 72 74 65 64 2c 20 30 29 3b 0a 23 65 6c nverted, 0);.#el
2d220 73 65 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 se. h = osLoa
2d230 64 4c 69 62 72 61 72 79 57 28 28 4c 50 43 57 53 dLibraryW((LPCWS
2d240 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a TR)zConverted);.
2d250 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 #endif. }.#ifde
2d260 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 f SQLITE_WIN32_H
2d270 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a AS_ANSI. else{.
2d280 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 h = osLoadLi
2d290 62 72 61 72 79 41 28 28 63 68 61 72 2a 29 7a 43 braryA((char*)zC
2d2a0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 23 onverted);. }.#
2d2b0 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28 endif. OSTRACE(
2d2c0 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 ("DLOPEN name=%s
2d2d0 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 , handle=%p\n",
2d2e0 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 zFilename, (void
2d2f0 2a 29 68 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 *)h));. sqlite3
2d300 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 _free(zConverted
2d310 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 );. return (voi
2d320 64 2a 29 68 3b 0a 7d 0a 73 74 61 74 69 63 20 76 d*)h;.}.static v
2d330 6f 69 64 20 77 69 6e 44 6c 45 72 72 6f 72 28 73 oid winDlError(s
2d340 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 qlite3_vfs *pVfs
2d350 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 , int nBuf, char
2d360 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 55 4e *zBufOut){. UN
2d370 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 USED_PARAMETER(p
2d380 56 66 73 29 3b 0a 20 20 77 69 6e 47 65 74 4c 61 Vfs);. winGetLa
2d390 73 74 45 72 72 6f 72 4d 73 67 28 6f 73 47 65 74 stErrorMsg(osGet
2d3a0 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 6e 42 75 LastError(), nBu
2d3b0 66 2c 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a 73 f, zBufOut);.}.s
2d3c0 74 61 74 69 63 20 76 6f 69 64 20 28 2a 77 69 6e tatic void (*win
2d3d0 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 DlSym(sqlite3_vf
2d3e0 73 20 2a 70 56 66 73 2c 76 6f 69 64 20 2a 70 48 s *pVfs,void *pH
2d3f0 2c 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 ,const char *zSy
2d400 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 46 41 52 m))(void){. FAR
2d410 50 52 4f 43 20 70 72 6f 63 3b 0a 20 20 55 4e 55 PROC proc;. UNU
2d420 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 SED_PARAMETER(pV
2d430 66 73 29 3b 0a 20 20 70 72 6f 63 20 3d 20 6f 73 fs);. proc = os
2d440 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 28 GetProcAddressA(
2d450 28 48 41 4e 44 4c 45 29 70 48 2c 20 7a 53 79 6d (HANDLE)pH, zSym
2d460 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 );. OSTRACE(("D
2d470 4c 53 59 4d 20 68 61 6e 64 6c 65 3d 25 70 2c 20 LSYM handle=%p,
2d480 73 79 6d 62 6f 6c 3d 25 73 2c 20 61 64 64 72 65 symbol=%s, addre
2d490 73 73 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 ss=%p\n",.
2d4a0 20 20 20 20 20 28 76 6f 69 64 2a 29 70 48 2c 20 (void*)pH,
2d4b0 7a 53 79 6d 2c 20 28 76 6f 69 64 2a 29 70 72 6f zSym, (void*)pro
2d4c0 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 c));. return (v
2d4d0 6f 69 64 28 2a 29 28 76 6f 69 64 29 29 70 72 6f oid(*)(void))pro
2d4e0 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 c;.}.static void
2d4f0 20 77 69 6e 44 6c 43 6c 6f 73 65 28 73 71 6c 69 winDlClose(sqli
2d500 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 te3_vfs *pVfs, v
2d510 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 oid *pHandle){.
2d520 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 UNUSED_PARAMETE
2d530 52 28 70 56 66 73 29 3b 0a 20 20 6f 73 46 72 65 R(pVfs);. osFre
2d540 65 4c 69 62 72 61 72 79 28 28 48 41 4e 44 4c 45 eLibrary((HANDLE
2d550 29 70 48 61 6e 64 6c 65 29 3b 0a 20 20 4f 53 54 )pHandle);. OST
2d560 52 41 43 45 28 28 22 44 4c 43 4c 4f 53 45 20 68 RACE(("DLCLOSE h
2d570 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 28 76 6f andle=%p\n", (vo
2d580 69 64 2a 29 70 48 61 6e 64 6c 65 29 29 3b 0a 7d id*)pHandle));.}
2d590 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c .#else /* if SQL
2d5a0 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 ITE_OMIT_LOAD_EX
2d5b0 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e TENSION is defin
2d5c0 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 ed: */. #define
2d5d0 20 77 69 6e 44 6c 4f 70 65 6e 20 20 30 0a 20 20 winDlOpen 0.
2d5e0 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 45 72 72 #define winDlErr
2d5f0 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 or 0. #define w
2d600 69 6e 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 inDlSym 0. #d
2d610 65 66 69 6e 65 20 77 69 6e 44 6c 43 6c 6f 73 65 efine winDlClose
2d620 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 53 74 0.#endif../* St
2d630 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 ate information
2d640 66 6f 72 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 for the randomne
2d650 73 73 20 67 61 74 68 65 72 65 72 2e 20 2a 2f 0a ss gatherer. */.
2d660 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 45 typedef struct E
2d670 6e 74 72 6f 70 79 47 61 74 68 65 72 65 72 20 45 ntropyGatherer E
2d680 6e 74 72 6f 70 79 47 61 74 68 65 72 65 72 3b 0a ntropyGatherer;.
2d690 73 74 72 75 63 74 20 45 6e 74 72 6f 70 79 47 61 struct EntropyGa
2d6a0 74 68 65 72 65 72 20 7b 0a 20 20 75 6e 73 69 67 therer {. unsig
2d6b0 6e 65 64 20 63 68 61 72 20 2a 61 3b 20 20 20 2f ned char *a; /
2d6c0 2a 20 47 61 74 68 65 72 20 65 6e 74 72 6f 70 79 * Gather entropy
2d6d0 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 into this buffe
2d6e0 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 61 3b 20 20 r */. int na;
2d6f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 /* Si
2d700 7a 65 20 6f 66 20 61 5b 5d 20 69 6e 20 62 79 74 ze of a[] in byt
2d710 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 es */. int i;
2d720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58 /* X
2d730 4f 52 20 6e 65 78 74 20 69 6e 70 75 74 20 69 6e OR next input in
2d740 74 6f 20 61 5b 69 5d 20 2a 2f 0a 20 20 69 6e 74 to a[i] */. int
2d750 20 6e 58 6f 72 3b 20 20 20 20 20 20 20 20 20 20 nXor;
2d760 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 58 4f /* Number of XO
2d770 52 20 6f 70 65 72 61 74 69 6f 6e 73 20 64 6f 6e R operations don
2d780 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 21 64 65 e */.};..#if !de
2d790 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 fined(SQLITE_TES
2d7a0 54 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 T) && !defined(S
2d7b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 41 4e 44 4f QLITE_OMIT_RANDO
2d7c0 4d 4e 45 53 53 29 0a 2f 2a 20 4d 69 78 20 73 7a MNESS)./* Mix sz
2d7d0 20 62 79 74 65 73 20 6f 66 20 65 6e 74 72 6f 70 bytes of entrop
2d7e0 79 20 69 6e 74 6f 20 70 2e 20 2a 2f 0a 73 74 61 y into p. */.sta
2d7f0 74 69 63 20 76 6f 69 64 20 78 6f 72 4d 65 6d 6f tic void xorMemo
2d800 72 79 28 45 6e 74 72 6f 70 79 47 61 74 68 65 72 ry(EntropyGather
2d810 65 72 20 2a 70 2c 20 75 6e 73 69 67 6e 65 64 20 er *p, unsigned
2d820 63 68 61 72 20 2a 78 2c 20 69 6e 74 20 73 7a 29 char *x, int sz)
2d830 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 0a 20 20 {. int j, k;.
2d840 66 6f 72 28 6a 3d 30 2c 20 6b 3d 70 2d 3e 69 3b for(j=0, k=p->i;
2d850 20 6a 3c 73 7a 3b 20 6a 2b 2b 29 7b 0a 20 20 20 j<sz; j++){.
2d860 20 70 2d 3e 61 5b 6b 2b 2b 5d 20 5e 3d 20 78 5b p->a[k++] ^= x[
2d870 6a 5d 3b 0a 20 20 20 20 69 66 28 20 6b 3e 3d 70 j];. if( k>=p
2d880 2d 3e 6e 61 20 29 20 6b 20 3d 20 30 3b 0a 20 20 ->na ) k = 0;.
2d890 7d 0a 20 20 70 2d 3e 69 20 3d 20 6b 3b 0a 20 20 }. p->i = k;.
2d8a0 70 2d 3e 6e 58 6f 72 20 2b 3d 20 73 7a 3b 0a 7d p->nXor += sz;.}
2d8b0 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 .#endif /* !defi
2d8c0 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 ned(SQLITE_TEST)
2d8d0 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c && !defined(SQL
2d8e0 49 54 45 5f 4f 4d 49 54 5f 52 41 4e 44 4f 4d 4e ITE_OMIT_RANDOMN
2d8f0 45 53 53 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 ESS) */../*.** W
2d900 72 69 74 65 20 75 70 20 74 6f 20 6e 42 75 66 20 rite up to nBuf
2d910 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 6e bytes of randomn
2d920 65 73 73 20 69 6e 74 6f 20 7a 42 75 66 2e 0a 2a ess into zBuf..*
2d930 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e /.static int win
2d940 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 Randomness(sqlit
2d950 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e e3_vfs *pVfs, in
2d960 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 t nBuf, char *zB
2d970 75 66 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 uf){.#if defined
2d980 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c (SQLITE_TEST) ||
2d990 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f defined(SQLITE_
2d9a0 4f 4d 49 54 5f 52 41 4e 44 4f 4d 4e 45 53 53 29 OMIT_RANDOMNESS)
2d9b0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 . UNUSED_PARAME
2d9c0 54 45 52 28 70 56 66 73 29 3b 0a 20 20 6d 65 6d TER(pVfs);. mem
2d9d0 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 set(zBuf, 0, nBu
2d9e0 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 42 75 f);. return nBu
2d9f0 66 3b 0a 23 65 6c 73 65 0a 20 20 45 6e 74 72 6f f;.#else. Entro
2da00 70 79 47 61 74 68 65 72 65 72 20 65 3b 0a 20 20 pyGatherer e;.
2da10 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 UNUSED_PARAMETER
2da20 28 70 56 66 73 29 3b 0a 20 20 6d 65 6d 73 65 74 (pVfs);. memset
2da30 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b (zBuf, 0, nBuf);
2da40 0a 20 20 65 2e 61 20 3d 20 28 75 6e 73 69 67 6e . e.a = (unsign
2da50 65 64 20 63 68 61 72 2a 29 7a 42 75 66 3b 0a 20 ed char*)zBuf;.
2da60 20 65 2e 6e 61 20 3d 20 6e 42 75 66 3b 0a 20 20 e.na = nBuf;.
2da70 65 2e 6e 58 6f 72 20 3d 20 30 3b 0a 20 20 65 2e e.nXor = 0;. e.
2da80 69 20 3d 20 30 3b 0a 20 20 7b 0a 20 20 20 20 53 i = 0;. {. S
2da90 59 53 54 45 4d 54 49 4d 45 20 78 3b 0a 20 20 20 YSTEMTIME x;.
2daa0 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 osGetSystemTime
2dab0 28 26 78 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d (&x);. xorMem
2dac0 6f 72 79 28 26 65 2c 20 28 75 6e 73 69 67 6e 65 ory(&e, (unsigne
2dad0 64 20 63 68 61 72 2a 29 26 78 2c 20 73 69 7a 65 d char*)&x, size
2dae0 6f 66 28 53 59 53 54 45 4d 54 49 4d 45 29 29 3b of(SYSTEMTIME));
2daf0 0a 20 20 7d 0a 20 20 7b 0a 20 20 20 20 44 57 4f . }. {. DWO
2db00 52 44 20 70 69 64 20 3d 20 6f 73 47 65 74 43 75 RD pid = osGetCu
2db10 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 rrentProcessId()
2db20 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f 72 79 28 ;. xorMemory(
2db30 26 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 &e, (unsigned ch
2db40 61 72 2a 29 26 70 69 64 2c 20 73 69 7a 65 6f 66 ar*)&pid, sizeof
2db50 28 44 57 4f 52 44 29 29 3b 0a 20 20 7d 0a 23 69 (DWORD));. }.#i
2db60 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 f SQLITE_OS_WINR
2db70 54 0a 20 20 7b 0a 20 20 20 20 55 4c 4f 4e 47 4c T. {. ULONGL
2db80 4f 4e 47 20 63 6e 74 20 3d 20 6f 73 47 65 74 54 ONG cnt = osGetT
2db90 69 63 6b 43 6f 75 6e 74 36 34 28 29 3b 0a 20 20 ickCount64();.
2dba0 20 20 78 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20 xorMemory(&e,
2dbb0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 (unsigned char*)
2dbc0 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 55 4c 4f &cnt, sizeof(ULO
2dbd0 4e 47 4c 4f 4e 47 29 29 3b 0a 20 20 7d 0a 23 65 NGLONG));. }.#e
2dbe0 6c 73 65 0a 20 20 7b 0a 20 20 20 20 44 57 4f 52 lse. {. DWOR
2dbf0 44 20 63 6e 74 20 3d 20 6f 73 47 65 74 54 69 63 D cnt = osGetTic
2dc00 6b 43 6f 75 6e 74 28 29 3b 0a 20 20 20 20 78 6f kCount();. xo
2dc10 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28 75 6e 73 rMemory(&e, (uns
2dc20 69 67 6e 65 64 20 63 68 61 72 2a 29 26 63 6e 74 igned char*)&cnt
2dc30 2c 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 29 , sizeof(DWORD))
2dc40 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 ;. }.#endif /*
2dc50 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 SQLITE_OS_WINRT
2dc60 2a 2f 0a 20 20 7b 0a 20 20 20 20 4c 41 52 47 45 */. {. LARGE
2dc70 5f 49 4e 54 45 47 45 52 20 69 3b 0a 20 20 20 20 _INTEGER i;.
2dc80 6f 73 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e osQueryPerforman
2dc90 63 65 43 6f 75 6e 74 65 72 28 26 69 29 3b 0a 20 ceCounter(&i);.
2dca0 20 20 20 78 6f 72 4d 65 6d 6f 72 79 28 26 65 2c xorMemory(&e,
2dcb0 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a (unsigned char*
2dcc0 29 26 69 2c 20 73 69 7a 65 6f 66 28 4c 41 52 47 )&i, sizeof(LARG
2dcd0 45 5f 49 4e 54 45 47 45 52 29 29 3b 0a 20 20 7d E_INTEGER));. }
2dce0 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f .#if !SQLITE_OS_
2dcf0 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 WINCE && !SQLITE
2dd00 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 53 51 4c _OS_WINRT && SQL
2dd10 49 54 45 5f 57 49 4e 33 32 5f 55 53 45 5f 55 55 ITE_WIN32_USE_UU
2dd20 49 44 0a 20 20 7b 0a 20 20 20 20 55 55 49 44 20 ID. {. UUID
2dd30 69 64 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 id;. memset(&
2dd40 69 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 55 55 id, 0, sizeof(UU
2dd50 49 44 29 29 3b 0a 20 20 20 20 6f 73 55 75 69 64 ID));. osUuid
2dd60 43 72 65 61 74 65 28 26 69 64 29 3b 0a 20 20 20 Create(&id);.
2dd70 20 78 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28 xorMemory(&e, (
2dd80 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26 unsigned char*)&
2dd90 69 64 2c 20 73 69 7a 65 6f 66 28 55 55 49 44 29 id, sizeof(UUID)
2dda0 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 );. memset(&i
2ddb0 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 55 55 49 d, 0, sizeof(UUI
2ddc0 44 29 29 3b 0a 20 20 20 20 6f 73 55 75 69 64 43 D));. osUuidC
2ddd0 72 65 61 74 65 53 65 71 75 65 6e 74 69 61 6c 28 reateSequential(
2dde0 26 69 64 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d &id);. xorMem
2ddf0 6f 72 79 28 26 65 2c 20 28 75 6e 73 69 67 6e 65 ory(&e, (unsigne
2de00 64 20 63 68 61 72 2a 29 26 69 64 2c 20 73 69 7a d char*)&id, siz
2de10 65 6f 66 28 55 55 49 44 29 29 3b 0a 20 20 7d 0a eof(UUID));. }.
2de20 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 #endif /* !SQLIT
2de30 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 E_OS_WINCE && !S
2de40 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 QLITE_OS_WINRT &
2de50 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 55 & SQLITE_WIN32_U
2de60 53 45 5f 55 55 49 44 20 2a 2f 0a 20 20 72 65 74 SE_UUID */. ret
2de70 75 72 6e 20 65 2e 6e 58 6f 72 3e 6e 42 75 66 20 urn e.nXor>nBuf
2de80 3f 20 6e 42 75 66 20 3a 20 65 2e 6e 58 6f 72 3b ? nBuf : e.nXor;
2de90 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e .#endif /* defin
2dea0 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 ed(SQLITE_TEST)
2deb0 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 || defined(SQLIT
2dec0 45 5f 4f 4d 49 54 5f 52 41 4e 44 4f 4d 4e 45 53 E_OMIT_RANDOMNES
2ded0 53 29 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 S) */.}.../*.**
2dee0 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 Sleep for a litt
2def0 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 le while. Retur
2df00 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 n the amount of
2df10 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 time slept..*/.s
2df20 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 6c 65 tatic int winSle
2df30 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a ep(sqlite3_vfs *
2df40 70 56 66 73 2c 20 69 6e 74 20 6d 69 63 72 6f 73 pVfs, int micros
2df50 65 63 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 77 ec){. sqlite3_w
2df60 69 6e 33 32 5f 73 6c 65 65 70 28 28 6d 69 63 72 in32_sleep((micr
2df70 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29 3b osec+999)/1000);
2df80 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 . UNUSED_PARAME
2df90 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 TER(pVfs);. ret
2dfa0 75 72 6e 20 28 28 6d 69 63 72 6f 73 65 63 2b 39 urn ((microsec+9
2dfb0 39 39 29 2f 31 30 30 30 29 2a 31 30 30 30 3b 0a 99)/1000)*1000;.
2dfc0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c }../*.** The fol
2dfd0 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c lowing variable,
2dfe0 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e if set to a non
2dff0 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 -zero value, is
2e000 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a interpreted as.*
2e010 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 * the number of
2e020 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 seconds since 19
2e030 37 30 20 61 6e 64 20 69 73 20 75 73 65 64 20 74 70 and is used t
2e040 6f 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 o set the result
2e050 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 of.** sqlite3Os
2e060 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75 CurrentTime() du
2e070 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f ring testing..*/
2e080 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 .#ifdef SQLITE_T
2e090 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f EST.int sqlite3_
2e0a0 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 current_time = 0
2e0b0 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 ; /* Fake syste
2e0c0 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 m time in second
2e0d0 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f s since 1970. */
2e0e0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 .#endif../*.** F
2e0f0 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 ind the current
2e100 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 time (in Univers
2e110 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 al Coordinated T
2e120 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e 74 ime). Write int
2e130 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 o *piNow.** the
2e140 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 current time and
2e150 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 date as a Julia
2e160 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d n Day number tim
2e170 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 es 86_400_000.
2e180 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 In.** other word
2e190 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 s, write into *p
2e1a0 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20 iNow the number
2e1b0 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 of milliseconds
2e1c0 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e since the Julian
2e1d0 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f .** epoch of noo
2e1e0 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f n in Greenwich o
2e1f0 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 n November 24, 4
2e200 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 714 B.C accordin
2e210 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c g to the.** prol
2e220 65 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e 20 eptic Gregorian
2e230 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 calendar..**.**
2e240 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 75 On success, retu
2e250 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 rn SQLITE_OK. R
2e260 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 eturn SQLITE_ERR
2e270 4f 52 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 OR if the time a
2e280 6e 64 20 64 61 74 65 0a 2a 2a 20 63 61 6e 6e 6f nd date.** canno
2e290 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 t be found..*/.s
2e2a0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 75 72 tatic int winCur
2e2b0 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71 rentTimeInt64(sq
2e2c0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c lite3_vfs *pVfs,
2e2d0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a sqlite3_int64 *
2e2e0 70 69 4e 6f 77 29 7b 0a 20 20 2f 2a 20 46 49 4c piNow){. /* FIL
2e2f0 45 54 49 4d 45 20 73 74 72 75 63 74 75 72 65 20 ETIME structure
2e300 69 73 20 61 20 36 34 2d 62 69 74 20 76 61 6c 75 is a 64-bit valu
2e310 65 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 e representing t
2e320 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 he number of.
2e330 20 20 31 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 100-nanosecond
2e340 20 69 6e 74 65 72 76 61 6c 73 20 73 69 6e 63 65 intervals since
2e350 20 4a 61 6e 75 61 72 79 20 31 2c 20 31 36 30 31 January 1, 1601
2e360 20 28 3d 20 4a 44 20 32 33 30 35 38 31 33 2e 35 (= JD 2305813.5
2e370 29 2e 0a 20 20 2a 2f 0a 20 20 46 49 4c 45 54 49 ).. */. FILETI
2e380 4d 45 20 66 74 3b 0a 20 20 73 74 61 74 69 63 20 ME ft;. static
2e390 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e const sqlite3_in
2e3a0 74 36 34 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 t64 winFiletimeE
2e3b0 70 6f 63 68 20 3d 20 32 33 30 35 38 31 33 35 2a poch = 23058135*
2e3c0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 (sqlite3_int64)8
2e3d0 36 34 30 30 30 30 3b 0a 23 69 66 64 65 66 20 53 640000;.#ifdef S
2e3e0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 74 61 QLITE_TEST. sta
2e3f0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 tic const sqlite
2e400 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 3_int64 unixEpoc
2e410 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71 h = 24405875*(sq
2e420 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 lite3_int64)8640
2e430 30 30 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 000;.#endif. /*
2e440 20 32 5e 33 32 20 2d 20 74 6f 20 61 76 6f 69 64 2^32 - to avoid
2e450 20 75 73 65 20 6f 66 20 4c 4c 20 61 6e 64 20 77 use of LL and w
2e460 61 72 6e 69 6e 67 73 20 69 6e 20 67 63 63 20 2a arnings in gcc *
2e470 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 /. static const
2e480 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d sqlite3_int64 m
2e490 61 78 33 32 42 69 74 56 61 6c 75 65 20 3d 0a 20 ax32BitValue =.
2e4a0 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e (sqlite3_in
2e4b0 74 36 34 29 32 30 30 30 30 30 30 30 30 30 20 2b t64)2000000000 +
2e4c0 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 (sqlite3_int64)
2e4d0 32 30 30 30 30 30 30 30 30 30 20 2b 0a 20 20 20 2000000000 +.
2e4e0 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 (sqlite3_int6
2e4f0 34 29 32 39 34 39 36 37 32 39 36 3b 0a 0a 23 69 4)294967296;..#i
2e500 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 f SQLITE_OS_WINC
2e510 45 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20 74 E. SYSTEMTIME t
2e520 69 6d 65 3b 0a 20 20 6f 73 47 65 74 53 79 73 74 ime;. osGetSyst
2e530 65 6d 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a 20 emTime(&time);.
2e540 20 2f 2a 20 69 66 20 53 79 73 74 65 6d 54 69 6d /* if SystemTim
2e550 65 54 6f 46 69 6c 65 54 69 6d 65 28 29 20 66 61 eToFileTime() fa
2e560 69 6c 73 2c 20 69 74 20 72 65 74 75 72 6e 73 20 ils, it returns
2e570 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 20 28 21 zero. */. if (!
2e580 6f 73 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 osSystemTimeToFi
2e590 6c 65 54 69 6d 65 28 26 74 69 6d 65 2c 26 66 74 leTime(&time,&ft
2e5a0 29 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 )){. return S
2e5b0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d QLITE_ERROR;. }
2e5c0 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 .#else. osGetSy
2e5d0 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 stemTimeAsFileTi
2e5e0 6d 65 28 20 26 66 74 20 29 3b 0a 23 65 6e 64 69 me( &ft );.#endi
2e5f0 66 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 77 69 f.. *piNow = wi
2e600 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 2b nFiletimeEpoch +
2e610 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28 28 . (((
2e620 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 (sqlite3_int64)f
2e630 74 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 t.dwHighDateTime
2e640 29 2a 6d 61 78 33 32 42 69 74 56 61 6c 75 65 29 )*max32BitValue)
2e650 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 +.
2e660 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 (sqlite3_int64
2e670 29 66 74 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d )ft.dwLowDateTim
2e680 65 29 2f 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 e)/(sqlite3_int6
2e690 34 29 31 30 30 30 30 3b 0a 0a 23 69 66 64 65 66 4)10000;..#ifdef
2e6a0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 SQLITE_TEST. i
2e6b0 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 f( sqlite3_curre
2e6c0 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a nt_time ){. *
2e6d0 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 piNow = 1000*(sq
2e6e0 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 lite3_int64)sqli
2e6f0 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 te3_current_time
2e700 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 + unixEpoch;.
2e710 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 }.#endif. UNUSE
2e720 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 D_PARAMETER(pVfs
2e730 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 );. return SQLI
2e740 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 TE_OK;.}../*.**
2e750 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 Find the current
2e760 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 time (in Univer
2e770 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 sal Coordinated
2e780 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 Time). Write th
2e790 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d e.** current tim
2e7a0 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 e and date as a
2e7b0 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 Julian Day numbe
2e7c0 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e r into *prNow an
2e7d0 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 d.** return 0.
2e7e0 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 Return 1 if the
2e7f0 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 time and date ca
2e800 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a nnot be found..*
2e810 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e /.static int win
2e820 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 CurrentTime(sqli
2e830 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 te3_vfs *pVfs, d
2e840 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 ouble *prNow){.
2e850 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 int rc;. sqlit
2e860 65 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20 72 63 e3_int64 i;. rc
2e870 20 3d 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d = winCurrentTim
2e880 65 49 6e 74 36 34 28 70 56 66 73 2c 20 26 69 29 eInt64(pVfs, &i)
2e890 3b 0a 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 ;. if( !rc ){.
2e8a0 20 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 *prNow = i/86
2e8b0 34 30 30 30 30 30 2e 30 3b 0a 20 20 7d 0a 20 20 400000.0;. }.
2e8c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a return rc;.}../*
2e8d0 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73 20 .** The idea is
2e8e0 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 that this functi
2e8f0 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b 65 20 61 20 on works like a
2e900 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a combination of.*
2e910 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 * GetLastError()
2e920 20 61 6e 64 20 46 6f 72 6d 61 74 4d 65 73 73 61 and FormatMessa
2e930 67 65 28 29 20 6f 6e 20 57 69 6e 64 6f 77 73 20 ge() on Windows
2e940 28 6f 72 20 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a (or errno and.**
2e950 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 6f 6e strerror_r() on
2e960 20 55 6e 69 78 29 2e 20 41 66 74 65 72 20 61 6e Unix). After an
2e970 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e error is return
2e980 65 64 20 62 79 20 61 6e 20 4f 53 0a 2a 2a 20 66 ed by an OS.** f
2e990 75 6e 63 74 69 6f 6e 2c 20 53 51 4c 69 74 65 20 unction, SQLite
2e9a0 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 calls this funct
2e9b0 69 6f 6e 20 77 69 74 68 20 7a 42 75 66 20 70 6f ion with zBuf po
2e9c0 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20 61 20 62 inting to.** a b
2e9d0 75 66 66 65 72 20 6f 66 20 6e 42 75 66 20 62 79 uffer of nBuf by
2e9e0 74 65 73 2e 20 54 68 65 20 4f 53 20 6c 61 79 65 tes. The OS laye
2e9f0 72 20 73 68 6f 75 6c 64 20 70 6f 70 75 6c 61 74 r should populat
2ea00 65 20 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 20 e the.** buffer
2ea10 77 69 74 68 20 61 20 6e 75 6c 2d 74 65 72 6d 69 with a nul-termi
2ea20 6e 61 74 65 64 20 55 54 46 2d 38 20 65 6e 63 6f nated UTF-8 enco
2ea30 64 65 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 ded error messag
2ea40 65 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20 e.** describing
2ea50 74 68 65 20 6c 61 73 74 20 49 4f 20 65 72 72 6f the last IO erro
2ea60 72 20 74 6f 20 68 61 76 65 20 6f 63 63 75 72 72 r to have occurr
2ea70 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 ed within the ca
2ea80 6c 6c 69 6e 67 0a 2a 2a 20 74 68 72 65 61 64 2e lling.** thread.
2ea90 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 72 .**.** If the er
2eaa0 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 74 ror message is t
2eab0 6f 6f 20 6c 61 72 67 65 20 66 6f 72 20 74 68 65 oo large for the
2eac0 20 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 supplied buffer
2ead0 2c 0a 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20 62 ,.** it should b
2eae0 65 20 74 72 75 6e 63 61 74 65 64 2e 20 54 68 65 e truncated. The
2eaf0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 return value of
2eb00 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 0a 2a xGetLastError.*
2eb10 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 * is zero if the
2eb20 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 error message f
2eb30 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 65 its in the buffe
2eb40 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a r, or non-zero.*
2eb50 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20 * otherwise (if
2eb60 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 20 the message was
2eb70 74 72 75 6e 63 61 74 65 64 29 2e 20 49 66 20 6e truncated). If n
2eb80 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 on-zero is retur
2eb90 6e 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 ned,.** then it
2eba0 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 is not necessary
2ebb0 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 to include the
2ebc0 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 63 nul-terminator c
2ebd0 68 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 74 haracter.** in t
2ebe0 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 he output buffer
2ebf0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70 70 ..**.** Not supp
2ec00 6c 79 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d lying an error m
2ec10 65 73 73 61 67 65 20 77 69 6c 6c 20 68 61 76 65 essage will have
2ec20 20 6e 6f 20 61 64 76 65 72 73 65 20 65 66 66 65 no adverse effe
2ec30 63 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74 65 2e ct.** on SQLite.
2ec40 20 49 74 20 69 73 20 66 69 6e 65 20 74 6f 20 68 It is fine to h
2ec50 61 76 65 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 ave an implement
2ec60 61 74 69 6f 6e 20 74 68 61 74 20 6e 65 76 65 72 ation that never
2ec70 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e 20 65 .** returns an e
2ec80 72 72 6f 72 20 6d 65 73 73 61 67 65 3a 0a 2a 2a rror message:.**
2ec90 0a 2a 2a 20 20 20 69 6e 74 20 78 47 65 74 4c 61 .** int xGetLa
2eca0 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f stError(sqlite3_
2ecb0 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e vfs *pVfs, int n
2ecc0 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 Buf, char *zBuf)
2ecd0 7b 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 {.** assert(
2ece0 7a 42 75 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a zBuf[0]=='\0');.
2ecf0 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b ** return 0;
2ed00 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f .** }.**.** Ho
2ed10 77 65 76 65 72 20 69 66 20 61 6e 20 65 72 72 6f wever if an erro
2ed20 72 20 6d 65 73 73 61 67 65 20 69 73 20 73 75 70 r message is sup
2ed30 70 6c 69 65 64 2c 20 69 74 20 77 69 6c 6c 20 62 plied, it will b
2ed40 65 20 69 6e 63 6f 72 70 6f 72 61 74 65 64 0a 2a e incorporated.*
2ed50 2a 20 62 79 20 73 71 6c 69 74 65 20 69 6e 74 6f * by sqlite into
2ed60 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 the error messa
2ed70 67 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 ge available to
2ed80 74 68 65 20 75 73 65 72 20 75 73 69 6e 67 0a 2a the user using.*
2ed90 2a 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 * sqlite3_errmsg
2eda0 28 29 2c 20 70 6f 73 73 69 62 6c 79 20 6d 61 6b (), possibly mak
2edb0 69 6e 67 20 49 4f 20 65 72 72 6f 72 73 20 65 61 ing IO errors ea
2edc0 73 69 65 72 20 74 6f 20 64 65 62 75 67 2e 0a 2a sier to debug..*
2edd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e /.static int win
2ede0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c GetLastError(sql
2edf0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 ite3_vfs *pVfs,
2ee00 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a int nBuf, char *
2ee10 7a 42 75 66 29 7b 0a 20 20 44 57 4f 52 44 20 65 zBuf){. DWORD e
2ee20 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f = osGetLastErro
2ee30 72 28 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 r();. UNUSED_PA
2ee40 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 RAMETER(pVfs);.
2ee50 20 69 66 28 20 6e 42 75 66 3e 30 20 29 20 77 69 if( nBuf>0 ) wi
2ee60 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 nGetLastErrorMsg
2ee70 28 65 2c 20 6e 42 75 66 2c 20 7a 42 75 66 29 3b (e, nBuf, zBuf);
2ee80 0a 20 20 72 65 74 75 72 6e 20 65 3b 0a 7d 0a 0a . return e;.}..
2ee90 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 /*.** Initialize
2eea0 20 61 6e 64 20 64 65 69 6e 69 74 69 61 6c 69 7a and deinitializ
2eeb0 65 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 e the operating
2eec0 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65 system interface
2eed0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 ..*/.int sqlite3
2eee0 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a _os_init(void){.
2eef0 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 static sqlite3
2ef00 5f 76 66 73 20 77 69 6e 56 66 73 20 3d 20 7b 0a _vfs winVfs = {.
2ef10 20 20 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 3,
2ef20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 /* iV
2ef30 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 ersion */. si
2ef40 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20 zeof(winFile),
2ef50 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 /* szOsFile
2ef60 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f 57 */. SQLITE_W
2ef70 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59 IN32_MAX_PATH_BY
2ef80 54 45 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e 61 TES, /* mxPathna
2ef90 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 me */. 0,
2efa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2efb0 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 /* pNext */.
2efc0 20 22 77 69 6e 33 32 22 2c 20 20 20 20 20 20 20 "win32",
2efd0 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 /* zName
2efe0 20 2a 2f 0a 20 20 20 20 26 77 69 6e 41 70 70 44 */. &winAppD
2eff0 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 2f ata, /
2f000 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 * pAppData */.
2f010 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 winOpen,
2f020 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 /* xOpe
2f030 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 n */. winDele
2f040 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 te,
2f050 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 /* xDelete */.
2f060 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20 winAccess,
2f070 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 /* xAcc
2f080 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 ess */. winFu
2f090 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 llPathname,
2f0a0 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 /* xFullPathna
2f0b0 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f me */. winDlO
2f0c0 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 pen,
2f0d0 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 /* xDlOpen */.
2f0e0 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20 winDlError,
2f0f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c /* xDl
2f100 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e Error */. win
2f110 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 DlSym,
2f120 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f /* xDlSym */
2f130 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c . winDlClose,
2f140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 /* x
2f150 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 DlClose */. w
2f160 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 inRandomness,
2f170 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d /* xRandom
2f180 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 ness */. winS
2f190 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 leep,
2f1a0 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a /* xSleep */.
2f1b0 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 winCurrentTi
2f1c0 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 43 me, /* xC
2f1d0 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 urrentTime */.
2f1e0 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f winGetLastErro
2f1f0 72 2c 20 20 20 20 20 20 20 2f 2a 20 78 47 65 74 r, /* xGet
2f200 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20 LastError */.
2f210 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 winCurrentTimeI
2f220 6e 74 36 34 2c 20 20 20 2f 2a 20 78 43 75 72 72 nt64, /* xCurr
2f230 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a entTimeInt64 */.
2f240 20 20 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d winSetSystem
2f250 43 61 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 78 53 Call, /* xS
2f260 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a etSystemCall */.
2f270 20 20 20 20 77 69 6e 47 65 74 53 79 73 74 65 6d winGetSystem
2f280 43 61 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 78 47 Call, /* xG
2f290 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a etSystemCall */.
2f2a0 20 20 20 20 77 69 6e 4e 65 78 74 53 79 73 74 65 winNextSyste
2f2b0 6d 43 61 6c 6c 2c 20 20 20 20 20 2f 2a 20 78 4e mCall, /* xN
2f2c0 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f extSystemCall */
2f2d0 0a 20 20 7d 3b 0a 23 69 66 20 64 65 66 69 6e 65 . };.#if define
2f2e0 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 d(SQLITE_WIN32_H
2f2f0 41 53 5f 57 49 44 45 29 0a 20 20 73 74 61 74 69 AS_WIDE). stati
2f300 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69 c sqlite3_vfs wi
2f310 6e 4c 6f 6e 67 50 61 74 68 56 66 73 20 3d 20 7b nLongPathVfs = {
2f320 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20 20 20 . 3,
2f330 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 /* i
2f340 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 Version */. s
2f350 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 izeof(winFile),
2f360 20 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c /* szOsFil
2f370 65 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f e */. SQLITE_
2f380 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42 WINNT_MAX_PATH_B
2f390 59 54 45 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e YTES, /* mxPathn
2f3a0 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 ame */. 0,
2f3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2f3c0 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 /* pNext */.
2f3d0 20 20 22 77 69 6e 33 32 2d 6c 6f 6e 67 70 61 74 "win32-longpat
2f3e0 68 22 2c 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d h", /* zNam
2f3f0 65 20 2a 2f 0a 20 20 20 20 26 77 69 6e 41 70 70 e */. &winApp
2f400 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 Data,
2f410 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 /* pAppData */.
2f420 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 winOpen,
2f430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 /* xOp
2f440 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c en */. winDel
2f450 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 ete,
2f460 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 /* xDelete */.
2f470 20 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20 winAccess,
2f480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 /* xAc
2f490 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 cess */. winF
2f4a0 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 ullPathname,
2f4b0 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e /* xFullPathn
2f4c0 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c ame */. winDl
2f4d0 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 Open,
2f4e0 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a /* xDlOpen */.
2f4f0 20 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 winDlError,
2f500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 /* xD
2f510 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 lError */. wi
2f520 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 nDlSym,
2f530 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a /* xDlSym *
2f540 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 /. winDlClose
2f550 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 , /*
2f560 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 xDlClose */.
2f570 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 winRandomness,
2f580 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f /* xRando
2f590 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e mness */. win
2f5a0 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 Sleep,
2f5b0 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f /* xSleep */
2f5c0 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 . winCurrentT
2f5d0 69 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 ime, /* x
2f5e0 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 CurrentTime */.
2f5f0 20 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 winGetLastErr
2f600 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 78 47 65 or, /* xGe
2f610 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 tLastError */.
2f620 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 winCurrentTime
2f630 49 6e 74 36 34 2c 20 20 20 2f 2a 20 78 43 75 72 Int64, /* xCur
2f640 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f rentTimeInt64 */
2f650 0a 20 20 20 20 77 69 6e 53 65 74 53 79 73 74 65 . winSetSyste
2f660 6d 43 61 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 78 mCall, /* x
2f670 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f SetSystemCall */
2f680 0a 20 20 20 20 77 69 6e 47 65 74 53 79 73 74 65 . winGetSyste
2f690 6d 43 61 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 78 mCall, /* x
2f6a0 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f GetSystemCall */
2f6b0 0a 20 20 20 20 77 69 6e 4e 65 78 74 53 79 73 74 . winNextSyst
2f6c0 65 6d 43 61 6c 6c 2c 20 20 20 20 20 2f 2a 20 78 emCall, /* x
2f6d0 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a NextSystemCall *
2f6e0 2f 0a 20 20 7d 3b 0a 23 65 6e 64 69 66 0a 20 20 /. };.#endif.
2f6f0 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 static sqlite3_v
2f700 66 73 20 77 69 6e 4e 6f 6c 6f 63 6b 56 66 73 20 fs winNolockVfs
2f710 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20 = {. 3,
2f720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
2f730 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 * iVersion */.
2f740 20 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 sizeof(winFile
2f750 29 2c 20 20 20 20 20 20 20 2f 2a 20 73 7a 4f 73 ), /* szOs
2f760 46 69 6c 65 20 2a 2f 0a 20 20 20 20 53 51 4c 49 File */. SQLI
2f770 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 TE_WIN32_MAX_PAT
2f780 48 5f 42 59 54 45 53 2c 20 2f 2a 20 6d 78 50 61 H_BYTES, /* mxPa
2f790 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c thname */. 0,
2f7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2f7b0 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f /* pNext */
2f7c0 0a 20 20 20 20 22 77 69 6e 33 32 2d 6e 6f 6e 65 . "win32-none
2f7d0 22 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a ", /* z
2f7e0 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 26 77 69 6e Name */. &win
2f7f0 4e 6f 6c 6f 63 6b 41 70 70 44 61 74 61 2c 20 20 NolockAppData,
2f800 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a /* pAppData *
2f810 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 /. winOpen,
2f820 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
2f830 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e xOpen */. win
2f840 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 Delete,
2f850 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a /* xDelete *
2f860 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73 73 2c /. winAccess,
2f870 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
2f880 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 xAccess */. w
2f890 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 inFullPathname,
2f8a0 20 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 /* xFullPa
2f8b0 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 thname */. wi
2f8c0 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 nDlOpen,
2f8d0 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 /* xDlOpen
2f8e0 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72 6f */. winDlErro
2f8f0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a r, /*
2f900 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 xDlError */.
2f910 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 winDlSym,
2f920 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 /* xDlSy
2f930 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c m */. winDlCl
2f940 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 ose,
2f950 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 /* xDlClose */.
2f960 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 winRandomness
2f970 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 61 , /* xRa
2f980 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 ndomness */.
2f990 77 69 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20 winSleep,
2f9a0 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 /* xSleep
2f9b0 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 */. winCurre
2f9c0 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 20 20 2f ntTime, /
2f9d0 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a * xCurrentTime *
2f9e0 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74 /. winGetLast
2f9f0 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 Error, /*
2fa00 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f xGetLastError */
2fa10 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 . winCurrentT
2fa20 69 6d 65 49 6e 74 36 34 2c 20 20 20 2f 2a 20 78 imeInt64, /* x
2fa30 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 CurrentTimeInt64
2fa40 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74 53 79 */. winSetSy
2fa50 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 20 20 2f stemCall, /
2fa60 2a 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c * xSetSystemCall
2fa70 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 53 79 */. winGetSy
2fa80 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 20 20 2f stemCall, /
2fa90 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c * xGetSystemCall
2faa0 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74 53 */. winNextS
2fab0 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 20 2f ystemCall, /
2fac0 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c * xNextSystemCal
2fad0 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 69 66 20 64 65 l */. };.#if de
2fae0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e fined(SQLITE_WIN
2faf0 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 73 32_HAS_WIDE). s
2fb00 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 tatic sqlite3_vf
2fb10 73 20 77 69 6e 4c 6f 6e 67 50 61 74 68 4e 6f 6c s winLongPathNol
2fb20 6f 63 6b 56 66 73 20 3d 20 7b 0a 20 20 20 20 33 ockVfs = {. 3
2fb30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
2fb40 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f /* iVersio
2fb50 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 n */. sizeof(
2fb60 77 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 20 20 winFile),
2fb70 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 /* szOsFile */.
2fb80 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f SQLITE_WINNT_
2fb90 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53 2c 20 MAX_PATH_BYTES,
2fba0 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f /* mxPathname */
2fbb0 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 . 0,
2fbc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 /* p
2fbd0 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e Next */. "win
2fbe0 33 32 2d 6c 6f 6e 67 70 61 74 68 2d 6e 6f 6e 65 32-longpath-none
2fbf0 22 2c 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 ", /* zName */.
2fc00 20 20 20 26 77 69 6e 4e 6f 6c 6f 63 6b 41 70 70 &winNolockApp
2fc10 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 70 41 70 Data, /* pAp
2fc20 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e pData */. win
2fc30 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 Open,
2fc40 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a /* xOpen */.
2fc50 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 winDelete,
2fc60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 /* xD
2fc70 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e elete */. win
2fc80 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 Access,
2fc90 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a /* xAccess *
2fca0 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 /. winFullPat
2fcb0 68 6e 61 6d 65 2c 20 20 20 20 20 20 20 2f 2a 20 hname, /*
2fcc0 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f xFullPathname */
2fcd0 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 . winDlOpen,
2fce0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 /* x
2fcf0 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 DlOpen */. wi
2fd00 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 nDlError,
2fd10 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 /* xDlError
2fd20 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d */. winDlSym
2fd30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f , /
2fd40 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 * xDlSym */.
2fd50 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 winDlClose,
2fd60 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f /* xDlClo
2fd70 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e se */. winRan
2fd80 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 20 domness,
2fd90 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 /* xRandomness
2fda0 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65 70 2c */. winSleep,
2fdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
2fdc0 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77 xSleep */. w
2fdd0 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 inCurrentTime,
2fde0 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e /* xCurren
2fdf0 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e tTime */. win
2fe00 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 GetLastError,
2fe10 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 /* xGetLastE
2fe20 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43 rror */. winC
2fe30 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c urrentTimeInt64,
2fe40 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 /* xCurrentTi
2fe50 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77 meInt64 */. w
2fe60 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c inSetSystemCall,
2fe70 20 20 20 20 20 20 2f 2a 20 78 53 65 74 53 79 73 /* xSetSys
2fe80 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 temCall */. w
2fe90 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c inGetSystemCall,
2fea0 20 20 20 20 20 20 2f 2a 20 78 47 65 74 53 79 73 /* xGetSys
2feb0 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 temCall */. w
2fec0 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c inNextSystemCall
2fed0 2c 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 , /* xNextSy
2fee0 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b stemCall */. };
2fef0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f .#endif.. /* Do
2ff00 75 62 6c 65 2d 63 68 65 63 6b 20 74 68 61 74 20 uble-check that
2ff10 74 68 65 20 61 53 79 73 63 61 6c 6c 5b 5d 20 61 the aSyscall[] a
2ff20 72 72 61 79 20 68 61 73 20 62 65 65 6e 20 63 6f rray has been co
2ff30 6e 73 74 72 75 63 74 65 64 0a 20 20 2a 2a 20 63 nstructed. ** c
2ff40 6f 72 72 65 63 74 6c 79 2e 20 20 53 65 65 20 74 orrectly. See t
2ff50 69 63 6b 65 74 20 5b 62 62 33 61 38 36 65 38 39 icket [bb3a86e89
2ff60 30 63 38 65 39 36 61 62 5d 20 2a 2f 0a 20 20 61 0c8e96ab] */. a
2ff70 73 73 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 ssert( ArraySize
2ff80 28 61 53 79 73 63 61 6c 6c 29 3d 3d 38 30 20 29 (aSyscall)==80 )
2ff90 3b 0a 0a 20 20 2f 2a 20 67 65 74 20 6d 65 6d 6f ;.. /* get memo
2ffa0 72 79 20 6d 61 70 20 61 6c 6c 6f 63 61 74 69 6f ry map allocatio
2ffb0 6e 20 67 72 61 6e 75 6c 61 72 69 74 79 20 2a 2f n granularity */
2ffc0 0a 20 20 6d 65 6d 73 65 74 28 26 77 69 6e 53 79 . memset(&winSy
2ffd0 73 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 sInfo, 0, sizeof
2ffe0 28 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 3b 0a (SYSTEM_INFO));.
2fff0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 #if SQLITE_OS_WI
30000 4e 52 54 0a 20 20 6f 73 47 65 74 4e 61 74 69 76 NRT. osGetNativ
30010 65 53 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e eSystemInfo(&win
30020 53 79 73 49 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a SysInfo);.#else.
30030 20 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66 osGetSystemInf
30040 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a o(&winSysInfo);.
30050 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 #endif. assert(
30060 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c winSysInfo.dwAl
30070 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 locationGranular
30080 69 74 79 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 ity>0 );. asser
30090 74 28 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 t( winSysInfo.dw
300a0 50 61 67 65 53 69 7a 65 3e 30 20 29 3b 0a 0a 20 PageSize>0 );..
300b0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 sqlite3_vfs_reg
300c0 69 73 74 65 72 28 26 77 69 6e 56 66 73 2c 20 31 ister(&winVfs, 1
300d0 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 );..#if defined(
300e0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 SQLITE_WIN32_HAS
300f0 5f 57 49 44 45 29 0a 20 20 73 71 6c 69 74 65 33 _WIDE). sqlite3
30100 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 77 _vfs_register(&w
30110 69 6e 4c 6f 6e 67 50 61 74 68 56 66 73 2c 20 30 inLongPathVfs, 0
30120 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c );.#endif.. sql
30130 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 ite3_vfs_registe
30140 72 28 26 77 69 6e 4e 6f 6c 6f 63 6b 56 66 73 2c r(&winNolockVfs,
30150 20 30 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 0);..#if define
30160 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 d(SQLITE_WIN32_H
30170 41 53 5f 57 49 44 45 29 0a 20 20 73 71 6c 69 74 AS_WIDE). sqlit
30180 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 e3_vfs_register(
30190 26 77 69 6e 4c 6f 6e 67 50 61 74 68 4e 6f 6c 6f &winLongPathNolo
301a0 63 6b 56 66 73 2c 20 30 29 3b 0a 23 65 6e 64 69 ckVfs, 0);.#endi
301b0 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 f..#ifndef SQLIT
301c0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 77 69 6e E_OMIT_WAL. win
301d0 42 69 67 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65 BigLock = sqlite
301e0 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 3MutexAlloc(SQLI
301f0 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f TE_MUTEX_STATIC_
30200 56 46 53 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 VFS1);.#endif..
30210 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
30220 4b 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 K;.}..int sqlite
30230 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 0a 3_os_end(void){.
30240 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 #if SQLITE_OS_WI
30250 4e 52 54 0a 20 20 69 66 28 20 73 6c 65 65 70 4f NRT. if( sleepO
30260 62 6a 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 bj!=NULL ){.
30270 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 73 6c osCloseHandle(sl
30280 65 65 70 4f 62 6a 29 3b 0a 20 20 20 20 73 6c 65 eepObj);. sle
30290 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 epObj = NULL;.
302a0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 }.#endif..#ifnde
302b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 f SQLITE_OMIT_WA
302c0 4c 0a 20 20 77 69 6e 42 69 67 4c 6f 63 6b 20 3d L. winBigLock =
302d0 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 0;.#endif.. re
302e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a turn SQLITE_OK;.
302f0 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c }..#endif /* SQL
30300 49 54 45 5f 4f 53 5f 57 49 4e 20 2a 2f 0a ITE_OS_WIN */.