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 23 69 66 64 65 66 20 5f 5f 43 59 */..#ifdef __CY
0220: 47 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65 GWIN__.# include
0230: 20 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a <sys/cygwin.h>.
0240: 23 20 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f # include <errno
0250: 2e 68 3e 20 2f 2a 20 61 6d 61 6c 67 61 6d 61 74 .h> /* amalgamat
0260: 6f 72 3a 20 6b 65 65 70 20 2a 2f 0a 23 65 6e 64 or: keep */.#end
0270: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 if../*.** Includ
0280: 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 63 e code that is c
0290: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f ommon to all os_
02a0: 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e *.c files.*/.#in
02b0: 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e clude "os_common
02c0: 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69 .h"../*.** Compi
02d0: 6c 69 6e 67 20 61 6e 64 20 75 73 69 6e 67 20 57 ling and using W
02e0: 41 4c 20 6d 6f 64 65 20 72 65 71 75 69 72 65 73 AL mode requires
02f0: 20 73 65 76 65 72 61 6c 20 41 50 49 73 20 74 68 several APIs th
0300: 61 74 20 61 72 65 20 6f 6e 6c 79 0a 2a 2a 20 61 at are only.** a
0310: 76 61 69 6c 61 62 6c 65 20 69 6e 20 57 69 6e 64 vailable in Wind
0320: 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73 20 62 61 ows platforms ba
0330: 73 65 64 20 6f 6e 20 74 68 65 20 4e 54 20 6b 65 sed on the NT ke
0340: 72 6e 65 6c 2e 0a 2a 2f 0a 23 69 66 20 21 53 51 rnel..*/.#if !SQ
0350: 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e 54 20 26 26 LITE_OS_WINNT &&
0360: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 !defined(SQLITE
0370: 5f 4f 4d 49 54 5f 57 41 4c 29 0a 23 20 20 65 72 _OMIT_WAL).# er
0380: 72 6f 72 20 22 57 41 4c 20 6d 6f 64 65 20 72 65 ror "WAL mode re
0390: 71 75 69 72 65 73 20 73 75 70 70 6f 72 74 20 66 quires support f
03a0: 72 6f 6d 20 74 68 65 20 57 69 6e 64 6f 77 73 20 rom the Windows
03b0: 4e 54 20 6b 65 72 6e 65 6c 2c 20 63 6f 6d 70 69 NT kernel, compi
03c0: 6c 65 5c 0a 20 77 69 74 68 20 53 51 4c 49 54 45 le\. with SQLITE
03d0: 5f 4f 4d 49 54 5f 57 41 4c 2e 22 0a 23 65 6e 64 _OMIT_WAL.".#end
03e0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 72 65 20 6d 6f if../*.** Are mo
03f0: 73 74 20 6f 66 20 74 68 65 20 57 69 6e 33 32 20 st of the Win32
0400: 41 4e 53 49 20 41 50 49 73 20 61 76 61 69 6c 61 ANSI APIs availa
0410: 62 6c 65 20 28 69 2e 65 2e 20 77 69 74 68 20 63 ble (i.e. with c
0420: 65 72 74 61 69 6e 20 65 78 63 65 70 74 69 6f 6e ertain exception
0430: 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20 74 68 s.** based on th
0440: 65 20 73 75 62 2d 70 6c 61 74 66 6f 72 6d 29 3f e sub-platform)?
0450: 0a 2a 2f 0a 23 69 66 20 21 53 51 4c 49 54 45 5f .*/.#if !SQLITE_
0460: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c OS_WINCE && !SQL
0470: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 ITE_OS_WINRT &&
0480: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f !defined(SQLITE_
0490: 57 49 4e 33 32 5f 4e 4f 5f 41 4e 53 49 29 0a 23 WIN32_NO_ANSI).#
04a0: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f define SQLITE_
04b0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 23 WIN32_HAS_ANSI.#
04c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 72 65 endif../*.** Are
04d0: 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 57 69 6e most of the Win
04e0: 33 32 20 55 6e 69 63 6f 64 65 20 41 50 49 73 20 32 Unicode APIs
04f0: 61 76 61 69 6c 61 62 6c 65 20 28 69 2e 65 2e 20 available (i.e.
0500: 77 69 74 68 20 63 65 72 74 61 69 6e 20 65 78 63 with certain exc
0510: 65 70 74 69 6f 6e 73 0a 2a 2a 20 62 61 73 65 64 eptions.** based
0520: 20 6f 6e 20 74 68 65 20 73 75 62 2d 70 6c 61 74 on the sub-plat
0530: 66 6f 72 6d 29 3f 0a 2a 2f 0a 23 69 66 20 28 53 form)?.*/.#if (S
0540: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c QLITE_OS_WINCE |
0550: 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e | SQLITE_OS_WINN
0560: 54 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 T || SQLITE_OS_W
0570: 49 4e 52 54 29 20 26 26 20 5c 0a 20 20 20 20 21 INRT) && \. !
0580: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 defined(SQLITE_W
0590: 49 4e 33 32 5f 4e 4f 5f 57 49 44 45 29 0a 23 20 IN32_NO_WIDE).#
05a0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 define SQLITE_W
05b0: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 0a 23 65 IN32_HAS_WIDE.#e
05c0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 ndif../*.** Make
05d0: 20 73 75 72 65 20 61 74 20 6c 65 61 73 74 20 6f sure at least o
05e0: 6e 65 20 73 65 74 20 6f 66 20 57 69 6e 33 32 20 ne set of Win32
05f0: 41 50 49 73 20 69 73 20 61 76 61 69 6c 61 62 6c APIs is availabl
0600: 65 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e e..*/.#if !defin
0610: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f ed(SQLITE_WIN32_
0620: 48 41 53 5f 41 4e 53 49 29 20 26 26 20 21 64 65 HAS_ANSI) && !de
0630: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e fined(SQLITE_WIN
0640: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 23 20 20 32_HAS_WIDE).#
0650: 65 72 72 6f 72 20 22 41 74 20 6c 65 61 73 74 20 error "At least
0660: 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 57 49 one of SQLITE_WI
0670: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 20 61 6e 64 N32_HAS_ANSI and
0680: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 SQLITE_WIN32_HA
0690: 53 5f 57 49 44 45 5c 0a 20 6d 75 73 74 20 62 65 S_WIDE\. must be
06a0: 20 64 65 66 69 6e 65 64 2e 22 0a 23 65 6e 64 69 defined.".#endi
06b0: 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d f../*.** Maximum
06c0: 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68 pathname length
06d0: 20 28 69 6e 20 63 68 61 72 73 29 20 66 6f 72 20 (in chars) for
06e0: 57 69 6e 33 32 2e 20 20 54 68 69 73 20 73 68 6f Win32. This sho
06f0: 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a uld normally be.
0700: 2a 2a 20 4d 41 58 5f 50 41 54 48 2e 0a 2a 2f 0a ** MAX_PATH..*/.
0710: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 #ifndef SQLITE_W
0720: 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 43 48 IN32_MAX_PATH_CH
0730: 41 52 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 ARS.# define SQ
0740: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 LITE_WIN32_MAX_P
0750: 41 54 48 5f 43 48 41 52 53 20 20 20 28 4d 41 58 ATH_CHARS (MAX
0760: 5f 50 41 54 48 29 0a 23 65 6e 64 69 66 0a 0a 2f _PATH).#endif../
0770: 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 70 61 74 *.** Maximum pat
0780: 68 6e 61 6d 65 20 6c 65 6e 67 74 68 20 28 69 6e hname length (in
0790: 20 63 68 61 72 73 29 20 66 6f 72 20 57 69 6e 4e chars) for WinN
07a0: 54 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 T. This should
07b0: 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a 2a 2a 20 33 normally be.** 3
07c0: 32 37 36 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 2767..*/.#ifndef
07d0: 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 SQLITE_WINNT_MA
07e0: 58 5f 50 41 54 48 5f 43 48 41 52 53 0a 23 20 20 X_PATH_CHARS.#
07f0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 define SQLITE_WI
0800: 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41 NNT_MAX_PATH_CHA
0810: 52 53 20 20 20 28 33 32 37 36 37 29 0a 23 65 6e RS (32767).#en
0820: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d dif../*.** Maxim
0830: 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67 um pathname leng
0840: 74 68 20 28 69 6e 20 62 79 74 65 73 29 20 66 6f th (in bytes) fo
0850: 72 20 57 69 6e 33 32 2e 20 20 54 68 65 20 4d 41 r Win32. The MA
0860: 58 5f 50 41 54 48 20 6d 61 63 72 6f 20 69 73 20 X_PATH macro is
0870: 69 6e 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 in.** characters
0880: 2c 20 73 6f 20 77 65 20 61 6c 6c 6f 63 61 74 65 , so we allocate
0890: 20 33 20 62 79 74 65 73 20 70 65 72 20 63 68 61 3 bytes per cha
08a0: 72 61 63 74 65 72 20 61 73 73 75 6d 69 6e 67 20 racter assuming
08b0: 77 6f 72 73 74 2d 63 61 73 65 20 6f 66 0a 2a 2a worst-case of.**
08c0: 20 34 2d 62 79 74 65 73 2d 70 65 72 2d 63 68 61 4-bytes-per-cha
08d0: 72 61 63 74 65 72 20 66 6f 72 20 55 54 46 38 2e racter for UTF8.
08e0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 .*/.#ifndef SQLI
08f0: 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 TE_WIN32_MAX_PAT
0900: 48 5f 42 59 54 45 53 0a 23 20 20 64 65 66 69 6e H_BYTES.# defin
0910: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d e SQLITE_WIN32_M
0920: 41 58 5f 50 41 54 48 5f 42 59 54 45 53 20 20 20 AX_PATH_BYTES
0930: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 (SQLITE_WIN32_MA
0940: 58 5f 50 41 54 48 5f 43 48 41 52 53 2a 34 29 0a X_PATH_CHARS*4).
0950: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 #endif../*.** Ma
0960: 78 69 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c ximum pathname l
0970: 65 6e 67 74 68 20 28 69 6e 20 62 79 74 65 73 29 ength (in bytes)
0980: 20 66 6f 72 20 57 69 6e 4e 54 2e 20 20 54 68 69 for WinNT. Thi
0990: 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c s should normall
09a0: 79 20 62 65 0a 2a 2a 20 33 32 37 36 37 20 2a 20 y be.** 32767 *
09b0: 73 69 7a 65 6f 66 28 57 43 48 41 52 29 2e 0a 2a sizeof(WCHAR)..*
09c0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 /.#ifndef SQLITE
09d0: 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f _WINNT_MAX_PATH_
09e0: 42 59 54 45 53 0a 23 20 20 64 65 66 69 6e 65 20 BYTES.# define
09f0: 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 SQLITE_WINNT_MAX
0a00: 5f 50 41 54 48 5f 42 59 54 45 53 20 20 20 5c 0a _PATH_BYTES \.
0a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0a20: 20 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a (siz
0a30: 65 6f 66 28 57 43 48 41 52 29 20 2a 20 53 51 4c eof(WCHAR) * SQL
0a40: 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 ITE_WINNT_MAX_PA
0a50: 54 48 5f 43 48 41 52 53 29 0a 23 65 6e 64 69 66 TH_CHARS).#endif
0a60: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 ../*.** Maximum
0a70: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6c 65 error message le
0a80: 6e 67 74 68 20 28 69 6e 20 63 68 61 72 73 29 20 ngth (in chars)
0a90: 66 6f 72 20 57 69 6e 52 54 2e 0a 2a 2f 0a 23 69 for WinRT..*/.#i
0aa0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e fndef SQLITE_WIN
0ab0: 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 32_MAX_ERRMSG_CH
0ac0: 41 52 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 ARS.# define SQ
0ad0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 LITE_WIN32_MAX_E
0ae0: 52 52 4d 53 47 5f 43 48 41 52 53 20 28 31 30 32 RRMSG_CHARS (102
0af0: 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 4).#endif../*.**
0b00: 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 Returns non-zer
0b10: 6f 20 69 66 20 74 68 65 20 63 68 61 72 61 63 74 o if the charact
0b20: 65 72 20 73 68 6f 75 6c 64 20 62 65 20 74 72 65 er should be tre
0b30: 61 74 65 64 20 61 73 20 61 20 64 69 72 65 63 74 ated as a direct
0b40: 6f 72 79 0a 2a 2a 20 73 65 70 61 72 61 74 6f 72 ory.** separator
0b50: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 77 69 6e ..*/.#ifndef win
0b60: 49 73 44 69 72 53 65 70 0a 23 20 20 64 65 66 69 IsDirSep.# defi
0b70: 6e 65 20 77 69 6e 49 73 44 69 72 53 65 70 28 61 ne winIsDirSep(a
0b80: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 )
0b90: 20 28 28 28 61 29 20 3d 3d 20 27 2f 27 29 20 7c (((a) == '/') |
0ba0: 7c 20 28 28 61 29 20 3d 3d 20 27 5c 5c 27 29 29 | ((a) == '\\'))
0bb0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 .#endif../*.** T
0bc0: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 75 73 65 his macro is use
0bd0: 64 20 77 68 65 6e 20 61 20 6c 6f 63 61 6c 20 76 d when a local v
0be0: 61 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 ariable is set t
0bf0: 6f 20 61 20 76 61 6c 75 65 20 74 68 61 74 20 69 o a value that i
0c00: 73 0a 2a 2a 20 5b 73 6f 6d 65 74 69 6d 65 73 5d s.** [sometimes]
0c10: 20 6e 6f 74 20 75 73 65 64 20 62 79 20 74 68 65 not used by the
0c20: 20 63 6f 64 65 20 28 65 2e 67 2e 20 76 69 61 20 code (e.g. via
0c30: 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 63 6f 6d 70 conditional comp
0c40: 69 6c 61 74 69 6f 6e 29 2e 0a 2a 2f 0a 23 69 66 ilation)..*/.#if
0c50: 6e 64 65 66 20 55 4e 55 53 45 44 5f 56 41 52 49 ndef UNUSED_VARI
0c60: 41 42 4c 45 5f 56 41 4c 55 45 0a 23 20 20 64 65 ABLE_VALUE.# de
0c70: 66 69 6e 65 20 55 4e 55 53 45 44 5f 56 41 52 49 fine UNUSED_VARI
0c80: 41 42 4c 45 5f 56 41 4c 55 45 28 78 29 20 28 76 ABLE_VALUE(x) (v
0c90: 6f 69 64 29 28 78 29 0a 23 65 6e 64 69 66 0a 0a oid)(x).#endif..
0ca0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 /*.** Returns th
0cb0: 65 20 63 68 61 72 61 63 74 65 72 20 74 68 61 74 e character that
0cc0: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 should be used
0cd0: 61 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 as the directory
0ce0: 20 73 65 70 61 72 61 74 6f 72 2e 0a 2a 2f 0a 23 separator..*/.#
0cf0: 69 66 6e 64 65 66 20 77 69 6e 47 65 74 44 69 72 ifndef winGetDir
0d00: 53 65 70 0a 23 20 20 64 65 66 69 6e 65 20 77 69 Sep.# define wi
0d10: 6e 47 65 74 44 69 72 53 65 70 28 29 20 20 20 20 nGetDirSep()
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 27 5c 5c 27 '\\'
0d30: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 .#endif../*.** D
0d40: 6f 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6e o we need to man
0d50: 75 61 6c 6c 79 20 64 65 66 69 6e 65 20 74 68 65 ually define the
0d60: 20 57 69 6e 33 32 20 66 69 6c 65 20 6d 61 70 70 Win32 file mapp
0d70: 69 6e 67 20 41 50 49 73 20 66 6f 72 20 75 73 65 ing APIs for use
0d80: 20 77 69 74 68 20 57 41 4c 0a 2a 2a 20 6d 6f 64 with WAL.** mod
0d90: 65 20 28 65 2e 67 2e 20 74 68 65 73 65 20 41 50 e (e.g. these AP
0da0: 49 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 Is are available
0db0: 20 69 6e 20 74 68 65 20 57 69 6e 64 6f 77 73 20 in the Windows
0dc0: 43 45 20 53 44 4b 3b 20 68 6f 77 65 76 65 72 2c CE SDK; however,
0dd0: 20 74 68 65 79 0a 2a 2a 20 61 72 65 20 6e 6f 74 they.** are not
0de0: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 present in the
0df0: 68 65 61 64 65 72 20 66 69 6c 65 29 3f 0a 2a 2f header file)?.*/
0e00: 0a 23 69 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 .#if SQLITE_WIN3
0e10: 32 5f 46 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50 2_FILEMAPPING_AP
0e20: 49 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 I && !defined(SQ
0e30: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 2f LITE_OMIT_WAL)./
0e40: 2a 0a 2a 2a 20 54 77 6f 20 6f 66 20 74 68 65 20 *.** Two of the
0e50: 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 41 50 49 file mapping API
0e60: 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 20 s are different
0e70: 75 6e 64 65 72 20 57 69 6e 52 54 2e 20 20 46 69 under WinRT. Fi
0e80: 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 0a 2a gure out which.*
0e90: 2a 20 73 65 74 20 77 65 20 6e 65 65 64 2e 0a 2a * set we need..*
0ea0: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f /.#if SQLITE_OS_
0eb0: 57 49 4e 52 54 0a 57 49 4e 42 41 53 45 41 50 49 WINRT.WINBASEAPI
0ec0: 20 48 41 4e 44 4c 45 20 57 49 4e 41 50 49 20 43 HANDLE WINAPI C
0ed0: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 reateFileMapping
0ee0: 46 72 6f 6d 41 70 70 28 48 41 4e 44 4c 45 2c 20 FromApp(HANDLE,
0ef0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43 55 \. LPSECU
0f00: 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c RITY_ATTRIBUTES,
0f10: 20 55 4c 4f 4e 47 2c 20 55 4c 4f 4e 47 36 34 2c ULONG, ULONG64,
0f20: 20 4c 50 43 57 53 54 52 29 3b 0a 0a 57 49 4e 42 LPCWSTR);..WINB
0f30: 41 53 45 41 50 49 20 4c 50 56 4f 49 44 20 57 49 ASEAPI LPVOID WI
0f40: 4e 41 50 49 20 4d 61 70 56 69 65 77 4f 66 46 69 NAPI MapViewOfFi
0f50: 6c 65 46 72 6f 6d 41 70 70 28 48 41 4e 44 4c 45 leFromApp(HANDLE
0f60: 2c 20 55 4c 4f 4e 47 2c 20 55 4c 4f 4e 47 36 34 , ULONG, ULONG64
0f70: 2c 20 53 49 5a 45 5f 54 29 3b 0a 23 65 6c 73 65 , SIZE_T);.#else
0f80: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c .#if defined(SQL
0f90: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e ITE_WIN32_HAS_AN
0fa0: 53 49 29 0a 57 49 4e 42 41 53 45 41 50 49 20 48 SI).WINBASEAPI H
0fb0: 41 4e 44 4c 45 20 57 49 4e 41 50 49 20 43 72 65 ANDLE WINAPI Cre
0fc0: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 ateFileMappingA(
0fd0: 48 41 4e 44 4c 45 2c 20 4c 50 53 45 43 55 52 49 HANDLE, LPSECURI
0fe0: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c TY_ATTRIBUTES, \
0ff0: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 20 . DWORD,
1000: 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 4c 50 DWORD, DWORD, LP
1010: 43 53 54 52 29 3b 0a 23 65 6e 64 69 66 20 2f 2a CSTR);.#endif /*
1020: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f defined(SQLITE_
1030: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 WIN32_HAS_ANSI)
1040: 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 */..#if defined(
1050: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 SQLITE_WIN32_HAS
1060: 5f 57 49 44 45 29 0a 57 49 4e 42 41 53 45 41 50 _WIDE).WINBASEAP
1070: 49 20 48 41 4e 44 4c 45 20 57 49 4e 41 50 49 20 I HANDLE WINAPI
1080: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e CreateFileMappin
1090: 67 57 28 48 41 4e 44 4c 45 2c 20 4c 50 53 45 43 gW(HANDLE, LPSEC
10a0: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 URITY_ATTRIBUTES
10b0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 , \. DWOR
10c0: 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c D, DWORD, DWORD,
10d0: 20 4c 50 43 57 53 54 52 29 3b 0a 23 65 6e 64 69 LPCWSTR);.#endi
10e0: 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c f /* defined(SQL
10f0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 ITE_WIN32_HAS_WI
1100: 44 45 29 20 2a 2f 0a 0a 57 49 4e 42 41 53 45 41 DE) */..WINBASEA
1110: 50 49 20 4c 50 56 4f 49 44 20 57 49 4e 41 50 49 PI LPVOID WINAPI
1120: 20 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 48 MapViewOfFile(H
1130: 41 4e 44 4c 45 2c 20 44 57 4f 52 44 2c 20 44 57 ANDLE, DWORD, DW
1140: 4f 52 44 2c 20 44 57 4f 52 44 2c 20 53 49 5a 45 ORD, DWORD, SIZE
1150: 5f 54 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 _T);.#endif /* S
1160: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 2a QLITE_OS_WINRT *
1170: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 69 /../*.** This fi
1180: 6c 65 20 6d 61 70 70 69 6e 67 20 41 50 49 20 69 le mapping API i
1190: 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 62 6f 74 68 s common to both
11a0: 20 57 69 6e 33 32 20 61 6e 64 20 57 69 6e 52 54 Win32 and WinRT
11b0: 2e 0a 2a 2f 0a 57 49 4e 42 41 53 45 41 50 49 20 ..*/.WINBASEAPI
11c0: 42 4f 4f 4c 20 57 49 4e 41 50 49 20 55 6e 6d 61 BOOL WINAPI Unma
11d0: 70 56 69 65 77 4f 66 46 69 6c 65 28 4c 50 43 56 pViewOfFile(LPCV
11e0: 4f 49 44 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 OID);.#endif /*
11f0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 46 49 4c SQLITE_WIN32_FIL
1200: 45 4d 41 50 50 49 4e 47 5f 41 50 49 20 26 26 20 EMAPPING_API &&
1210: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f !defined(SQLITE_
1220: 4f 4d 49 54 5f 57 41 4c 29 20 2a 2f 0a 0a 2f 2a OMIT_WAL) */../*
1230: 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63 72 6f 73 6f .** Some Microso
1240: 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63 ft compilers lac
1250: 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74 69 6f k this definitio
1260: 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e n..*/.#ifndef IN
1270: 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 VALID_FILE_ATTRI
1280: 42 55 54 45 53 0a 23 20 64 65 66 69 6e 65 20 49 BUTES.# define I
1290: 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 NVALID_FILE_ATTR
12a0: 49 42 55 54 45 53 20 28 28 44 57 4f 52 44 29 2d IBUTES ((DWORD)-
12b0: 31 29 20 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 1) .#endif..#ifn
12c0: 64 65 66 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 def FILE_FLAG_MA
12d0: 53 4b 0a 23 20 64 65 66 69 6e 65 20 46 49 4c 45 SK.# define FILE
12e0: 5f 46 4c 41 47 5f 4d 41 53 4b 20 20 20 20 20 20 _FLAG_MASK
12f0: 20 20 20 20 28 30 78 46 46 33 43 30 30 30 30 29 (0xFF3C0000)
1300: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 .#endif..#ifndef
1310: 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f FILE_ATTRIBUTE_
1320: 4d 41 53 4b 0a 23 20 64 65 66 69 6e 65 20 46 49 MASK.# define FI
1330: 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4d 41 53 LE_ATTRIBUTE_MAS
1340: 4b 20 20 20 20 20 28 30 78 30 30 30 33 46 46 46 K (0x0003FFF
1350: 37 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 7).#endif..#ifnd
1360: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 ef SQLITE_OMIT_W
1370: 41 4c 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 AL./* Forward re
1380: 66 65 72 65 6e 63 65 73 20 74 6f 20 73 74 72 75 ferences to stru
1390: 63 74 75 72 65 73 20 75 73 65 64 20 66 6f 72 20 ctures used for
13a0: 57 41 4c 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 WAL */.typedef s
13b0: 74 72 75 63 74 20 77 69 6e 53 68 6d 20 77 69 6e truct winShm win
13c0: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f Shm; /
13d0: 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 * A connection t
13e0: 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 o shared-memory
13f0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 */.typedef struc
1400: 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 77 69 6e t winShmNode win
1410: 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 41 20 ShmNode; /* A
1420: 72 65 67 69 6f 6e 20 6f 66 20 73 68 61 72 65 64 region of shared
1430: 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 23 65 6e 64 69 -memory */.#endi
1440: 66 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 43 45 20 6c f../*.** WinCE l
1450: 61 63 6b 73 20 6e 61 74 69 76 65 20 73 75 70 70 acks native supp
1460: 6f 72 74 20 66 6f 72 20 66 69 6c 65 20 6c 6f 63 ort for file loc
1470: 6b 69 6e 67 20 73 6f 20 77 65 20 68 61 76 65 20 king so we have
1480: 74 6f 20 66 61 6b 65 20 69 74 0a 2a 2a 20 77 69 to fake it.** wi
1490: 74 68 20 73 6f 6d 65 20 63 6f 64 65 20 6f 66 20 th some code of
14a0: 6f 75 72 20 6f 77 6e 2e 0a 2a 2f 0a 23 69 66 20 our own..*/.#if
14b0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a SQLITE_OS_WINCE.
14c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77 typedef struct w
14d0: 69 6e 63 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e 74 inceLock {. int
14e0: 20 6e 52 65 61 64 65 72 73 3b 20 20 20 20 20 20 nReaders;
14f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 /* Number of re
1500: 61 64 65 72 20 6c 6f 63 6b 73 20 6f 62 74 61 69 ader locks obtai
1510: 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 50 ned */. BOOL bP
1520: 65 6e 64 69 6e 67 3b 20 20 20 20 20 20 2f 2a 20 ending; /*
1530: 49 6e 64 69 63 61 74 65 73 20 61 20 70 65 6e 64 Indicates a pend
1540: 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 ing lock has bee
1550: 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20 n obtained */.
1560: 42 4f 4f 4c 20 62 52 65 73 65 72 76 65 64 3b 20 BOOL bReserved;
1570: 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65 73 /* Indicates
1580: 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b a reserved lock
1590: 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e has been obtain
15a0: 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 45 78 ed */. BOOL bEx
15b0: 63 6c 75 73 69 76 65 3b 20 20 20 20 2f 2a 20 49 clusive; /* I
15c0: 6e 64 69 63 61 74 65 73 20 61 6e 20 65 78 63 6c ndicates an excl
15d0: 75 73 69 76 65 20 6c 6f 63 6b 20 68 61 73 20 62 usive lock has b
15e0: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a een obtained */.
15f0: 7d 20 77 69 6e 63 65 4c 6f 63 6b 3b 0a 23 65 6e } winceLock;.#en
1600: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 dif../*.** The w
1610: 69 6e 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 inFile structure
1620: 20 69 73 20 61 20 73 75 62 63 6c 61 73 73 20 6f is a subclass o
1630: 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 20 f sqlite3_file*
1640: 73 70 65 63 69 66 69 63 20 74 6f 20 74 68 65 20 specific to the
1650: 77 69 6e 33 32 0a 2a 2a 20 70 6f 72 74 61 62 69 win32.** portabi
1660: 6c 69 74 79 20 6c 61 79 65 72 2e 0a 2a 2f 0a 74 lity layer..*/.t
1670: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77 69 ypedef struct wi
1680: 6e 46 69 6c 65 20 77 69 6e 46 69 6c 65 3b 0a 73 nFile winFile;.s
1690: 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20 7b 0a truct winFile {.
16a0: 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f const sqlite3_
16b0: 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 io_methods *pMet
16c0: 68 6f 64 3b 20 2f 2a 2a 2a 20 4d 75 73 74 20 62 hod; /*** Must b
16d0: 65 20 66 69 72 73 74 20 2a 2a 2a 2f 0a 20 20 73 e first ***/. s
16e0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 qlite3_vfs *pVfs
16f0: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 ; /* The VF
1700: 53 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 S used to open t
1710: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 48 41 his file */. HA
1720: 4e 44 4c 45 20 68 3b 20 20 20 20 20 20 20 20 20 NDLE h;
1730: 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 /* Handle
1740: 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20 74 68 for accessing th
1750: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6c e file */. u8 l
1760: 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20 20 ocktype;
1770: 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 6c /* Type of l
1780: 6f 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 68 65 ock currently he
1790: 6c 64 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 ld on this file
17a0: 2a 2f 0a 20 20 73 68 6f 72 74 20 73 68 61 72 65 */. short share
17b0: 64 4c 6f 63 6b 42 79 74 65 3b 20 20 20 2f 2a 20 dLockByte; /*
17c0: 52 61 6e 64 6f 6d 6c 79 20 63 68 6f 73 65 6e 20 Randomly chosen
17d0: 62 79 74 65 20 75 73 65 64 20 61 73 20 61 20 73 byte used as a s
17e0: 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 hared lock */.
17f0: 75 38 20 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 u8 ctrlFlags;
1800: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 /* Flags
1810: 2e 20 20 53 65 65 20 57 49 4e 46 49 4c 45 5f 2a . See WINFILE_*
1820: 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 44 57 4f 52 below */. DWOR
1830: 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 D lastErrno;
1840: 20 20 20 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f /* The Windo
1850: 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 ws errno from th
1860: 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 e last I/O error
1870: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 */.#ifndef SQLI
1880: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 77 69 TE_OMIT_WAL. wi
1890: 6e 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 nShm *pShm;
18a0: 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 61 6e 63 /* Instanc
18b0: 65 20 6f 66 20 73 68 61 72 65 64 20 6d 65 6d 6f e of shared memo
18c0: 72 79 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 ry on this file
18d0: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 6f 6e 73 */.#endif. cons
18e0: 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b 20 20 t char *zPath;
18f0: 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 /* Full path
1900: 6e 61 6d 65 20 6f 66 20 74 68 69 73 20 66 69 6c name of this fil
1910: 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 43 68 75 e */. int szChu
1920: 6e 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f nk; /
1930: 2a 20 43 68 75 6e 6b 20 73 69 7a 65 20 63 6f 6e * Chunk size con
1940: 66 69 67 75 72 65 64 20 62 79 20 46 43 4e 54 4c figured by FCNTL
1950: 5f 43 48 55 4e 4b 5f 53 49 5a 45 20 2a 2f 0a 23 _CHUNK_SIZE */.#
1960: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e if SQLITE_OS_WIN
1970: 43 45 0a 20 20 4c 50 57 53 54 52 20 7a 44 65 6c CE. LPWSTR zDel
1980: 65 74 65 4f 6e 43 6c 6f 73 65 3b 20 20 2f 2a 20 eteOnClose; /*
1990: 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 Name of file to
19a0: 64 65 6c 65 74 65 20 77 68 65 6e 20 63 6c 6f 73 delete when clos
19b0: 69 6e 67 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 ing */. HANDLE
19c0: 68 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 hMutex;
19d0: 20 2f 2a 20 4d 75 74 65 78 20 75 73 65 64 20 74 /* Mutex used t
19e0: 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 o control access
19f0: 20 74 6f 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 to shared lock
1a00: 2a 2f 20 20 0a 20 20 48 41 4e 44 4c 45 20 68 53 */ . HANDLE hS
1a10: 68 61 72 65 64 3b 20 20 20 20 20 20 20 20 20 2f hared; /
1a20: 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 * Shared memory
1a30: 73 65 67 6d 65 6e 74 20 75 73 65 64 20 66 6f 72 segment used for
1a40: 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 77 69 locking */. wi
1a50: 6e 63 65 4c 6f 63 6b 20 6c 6f 63 61 6c 3b 20 20 nceLock local;
1a60: 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 73 20 6f /* Locks o
1a70: 62 74 61 69 6e 65 64 20 62 79 20 74 68 69 73 20 btained by this
1a80: 69 6e 73 74 61 6e 63 65 20 6f 66 20 77 69 6e 46 instance of winF
1a90: 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f ile */. winceLo
1aa0: 63 6b 20 2a 73 68 61 72 65 64 3b 20 20 20 20 20 ck *shared;
1ab0: 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 68 61 72 65 /* Global share
1ac0: 64 20 6c 6f 63 6b 20 6d 65 6d 6f 72 79 20 66 6f d lock memory fo
1ad0: 72 20 74 68 65 20 66 69 6c 65 20 20 2a 2f 0a 23 r the file */.#
1ae0: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 endif.#if SQLITE
1af0: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 _MAX_MMAP_SIZE>0
1b00: 0a 20 20 69 6e 74 20 6e 46 65 74 63 68 4f 75 74 . int nFetchOut
1b10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
1b20: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 /* Number of ou
1b30: 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68 tstanding xFetch
1b40: 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 20 references */.
1b50: 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20 HANDLE hMap;
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1b70: 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 61 63 63 * Handle for acc
1b80: 65 73 73 69 6e 67 20 6d 65 6d 6f 72 79 20 6d 61 essing memory ma
1b90: 70 70 69 6e 67 20 2a 2f 0a 20 20 76 6f 69 64 20 pping */. void
1ba0: 2a 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20 20 *pMapRegion;
1bb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 65 61 /* Area
1bc0: 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 2a memory mapped *
1bd0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 /. sqlite3_int6
1be0: 34 20 6d 6d 61 70 53 69 7a 65 3b 20 20 20 20 20 4 mmapSize;
1bf0: 20 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 /* Usable size
1c00: 20 6f 66 20 6d 61 70 70 65 64 20 72 65 67 69 6f of mapped regio
1c10: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 n */. sqlite3_i
1c20: 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 41 63 74 nt64 mmapSizeAct
1c30: 75 61 6c 3b 20 2f 2a 20 41 63 74 75 61 6c 20 73 ual; /* Actual s
1c40: 69 7a 65 20 6f 66 20 6d 61 70 70 65 64 20 72 65 ize of mapped re
1c50: 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 gion */. sqlite
1c60: 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 3_int64 mmapSize
1c70: 4d 61 78 3b 20 20 20 20 2f 2a 20 43 6f 6e 66 69 Max; /* Confi
1c80: 67 75 72 65 64 20 46 43 4e 54 4c 5f 4d 4d 41 50 gured FCNTL_MMAP
1c90: 5f 53 49 5a 45 20 76 61 6c 75 65 20 2a 2f 0a 23 _SIZE value */.#
1ca0: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 endif.};../*.**
1cb0: 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66 Allowed values f
1cc0: 6f 72 20 77 69 6e 46 69 6c 65 2e 63 74 72 6c 46 or winFile.ctrlF
1cd0: 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 lags.*/.#define
1ce0: 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 WINFILE_RDONLY
1cf0: 20 20 20 20 20 20 20 20 30 78 30 32 20 20 20 2f 0x02 /
1d00: 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 * Connection is
1d10: 72 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 read only */.#de
1d20: 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50 45 52 fine WINFILE_PER
1d30: 53 49 53 54 5f 57 41 4c 20 20 20 20 20 30 78 30 SIST_WAL 0x0
1d40: 34 20 20 20 2f 2a 20 50 65 72 73 69 73 74 65 6e 4 /* Persisten
1d50: 74 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23 64 t WAL mode */.#d
1d60: 65 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50 53 efine WINFILE_PS
1d70: 4f 57 20 20 20 20 20 20 20 20 20 20 20 20 30 78 OW 0x
1d80: 31 30 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 10 /* SQLITE_I
1d90: 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f OCAP_POWERSAFE_O
1da0: 56 45 52 57 52 49 54 45 20 2a 2f 0a 0a 2f 2a 0a VERWRITE */../*.
1db0: 20 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 * The size of t
1dc0: 68 65 20 62 75 66 66 65 72 20 75 73 65 64 20 62 he buffer used b
1dd0: 79 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f y sqlite3_win32_
1de0: 77 72 69 74 65 5f 64 65 62 75 67 28 29 2e 0a 20 write_debug()..
1df0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 */.#ifndef SQLIT
1e00: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f E_WIN32_DBG_BUF_
1e10: 53 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53 SIZE.# define S
1e20: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f QLITE_WIN32_DBG_
1e30: 42 55 46 5f 53 49 5a 45 20 20 20 28 28 69 6e 74 BUF_SIZE ((int
1e40: 29 28 34 30 39 36 2d 73 69 7a 65 6f 66 28 44 57 )(4096-sizeof(DW
1e50: 4f 52 44 29 29 29 0a 23 65 6e 64 69 66 0a 0a 2f ORD))).#endif../
1e60: 2a 0a 20 2a 20 54 68 65 20 76 61 6c 75 65 20 75 *. * The value u
1e70: 73 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 sed with sqlite3
1e80: 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 _win32_set_direc
1e90: 74 6f 72 79 28 29 20 74 6f 20 73 70 65 63 69 66 tory() to specif
1ea0: 79 20 74 68 61 74 0a 20 2a 20 74 68 65 20 64 61 y that. * the da
1eb0: 74 61 20 64 69 72 65 63 74 6f 72 79 20 73 68 6f ta directory sho
1ec0: 75 6c 64 20 62 65 20 63 68 61 6e 67 65 64 2e 0a uld be changed..
1ed0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 */.#ifndef SQLI
1ee0: 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 TE_WIN32_DATA_DI
1ef0: 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 23 20 20 RECTORY_TYPE.#
1f00: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 define SQLITE_WI
1f10: 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f N32_DATA_DIRECTO
1f20: 52 59 5f 54 59 50 45 20 28 31 29 0a 23 65 6e 64 RY_TYPE (1).#end
1f30: 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 76 61 if../*. * The va
1f40: 6c 75 65 20 75 73 65 64 20 77 69 74 68 20 73 71 lue used with sq
1f50: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f lite3_win32_set_
1f60: 64 69 72 65 63 74 6f 72 79 28 29 20 74 6f 20 73 directory() to s
1f70: 70 65 63 69 66 79 20 74 68 61 74 0a 20 2a 20 74 pecify that. * t
1f80: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 he temporary dir
1f90: 65 63 74 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 ectory should be
1fa0: 20 63 68 61 6e 67 65 64 2e 0a 20 2a 2f 0a 23 69 changed.. */.#i
1fb0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e fndef SQLITE_WIN
1fc0: 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 32_TEMP_DIRECTOR
1fd0: 59 5f 54 59 50 45 0a 23 20 20 64 65 66 69 6e 65 Y_TYPE.# define
1fe0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 SQLITE_WIN32_TE
1ff0: 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 MP_DIRECTORY_TYP
2000: 45 20 28 32 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a E (2).#endif../*
2010: 0a 20 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 . * If compiled
2020: 77 69 74 68 20 53 51 4c 49 54 45 5f 57 49 4e 33 with SQLITE_WIN3
2030: 32 5f 4d 41 4c 4c 4f 43 20 6f 6e 20 57 69 6e 64 2_MALLOC on Wind
2040: 6f 77 73 2c 20 77 65 20 77 69 6c 6c 20 75 73 65 ows, we will use
2050: 20 74 68 65 0a 20 2a 20 76 61 72 69 6f 75 73 20 the. * various
2060: 57 69 6e 33 32 20 41 50 49 20 68 65 61 70 20 66 Win32 API heap f
2070: 75 6e 63 74 69 6f 6e 73 20 69 6e 73 74 65 61 64 unctions instead
2080: 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 20 2a 2f of our own.. */
2090: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 .#ifdef SQLITE_W
20a0: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 0a 2f 2a 0a IN32_MALLOC../*.
20b0: 20 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f * If this is no
20c0: 6e 2d 7a 65 72 6f 2c 20 61 6e 20 69 73 6f 6c 61 n-zero, an isola
20d0: 74 65 64 20 68 65 61 70 20 77 69 6c 6c 20 62 65 ted heap will be
20e0: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20 created by the
20f0: 6e 61 74 69 76 65 20 57 69 6e 33 32 0a 20 2a 20 native Win32. *
2100: 61 6c 6c 6f 63 61 74 6f 72 20 73 75 62 73 79 73 allocator subsys
2110: 74 65 6d 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 tem; otherwise,
2120: 74 68 65 20 64 65 66 61 75 6c 74 20 70 72 6f 63 the default proc
2130: 65 73 73 20 68 65 61 70 20 77 69 6c 6c 20 62 65 ess heap will be
2140: 20 75 73 65 64 2e 20 20 54 68 69 73 0a 20 2a 20 used. This. *
2150: 73 65 74 74 69 6e 67 20 68 61 73 20 6e 6f 20 65 setting has no e
2160: 66 66 65 63 74 20 77 68 65 6e 20 63 6f 6d 70 69 ffect when compi
2170: 6c 69 6e 67 20 66 6f 72 20 57 69 6e 52 54 2e 20 ling for WinRT.
2180: 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69 By default, thi
2190: 73 20 69 73 20 65 6e 61 62 6c 65 64 0a 20 2a 20 s is enabled. *
21a0: 61 6e 64 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 and an isolated
21b0: 68 65 61 70 20 77 69 6c 6c 20 62 65 20 63 72 65 heap will be cre
21c0: 61 74 65 64 20 74 6f 20 73 74 6f 72 65 20 61 6c ated to store al
21d0: 6c 20 61 6c 6c 6f 63 61 74 65 64 20 64 61 74 61 l allocated data
21e0: 2e 0a 20 2a 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .. *. **********
21f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
2200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
2210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
2220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
2230: 2a 2a 2a 2a 0a 20 2a 20 57 41 52 4e 49 4e 47 3a ****. * WARNING:
2240: 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 It is important
2250: 20 74 6f 20 6e 6f 74 65 20 74 68 61 74 20 77 68 to note that wh
2260: 65 6e 20 74 68 69 73 20 73 65 74 74 69 6e 67 20 en this setting
2270: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 is non-zero and
2280: 74 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20 20 the. *
2290: 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 20 66 winMemShutdown f
22a0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 unction is calle
22b0: 64 20 28 65 2e 67 2e 20 62 79 20 74 68 65 20 73 d (e.g. by the s
22c0: 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 0a qlite3_shutdown.
22d0: 20 2a 20 20 20 20 20 20 20 20 20 20 66 75 6e 63 * func
22e0: 74 69 6f 6e 29 2c 20 61 6c 6c 20 64 61 74 61 20 tion), all data
22f0: 74 68 61 74 20 77 61 73 20 61 6c 6c 6f 63 61 74 that was allocat
2300: 65 64 20 75 73 69 6e 67 20 74 68 65 20 69 73 6f ed using the iso
2310: 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c 6c 0a lated heap will.
2320: 20 2a 20 20 20 20 20 20 20 20 20 20 62 65 20 66 * be f
2330: 72 65 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 reed immediately
2340: 20 61 6e 64 20 61 6e 79 20 61 74 74 65 6d 70 74 and any attempt
2350: 20 74 6f 20 61 63 63 65 73 73 20 61 6e 79 20 6f to access any o
2360: 66 20 74 68 61 74 20 66 72 65 65 64 0a 20 2a 20 f that freed. *
2370: 20 20 20 20 20 20 20 20 20 64 61 74 61 20 77 69 data wi
2380: 6c 6c 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 ll almost certai
2390: 6e 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e nly result in an
23a0: 20 69 6d 6d 65 64 69 61 74 65 20 61 63 63 65 73 immediate acces
23b0: 73 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 20 2a 2a s violation.. **
23c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
23d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
23e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
23f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
2400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 2f ************. */
2410: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f .#ifndef SQLITE_
2420: 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54 WIN32_HEAP_CREAT
2430: 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 E.# define SQLI
2440: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 TE_WIN32_HEAP_CR
2450: 45 41 54 45 20 20 20 20 28 54 52 55 45 29 0a 23 EATE (TRUE).#
2460: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 endif../*. * The
2470: 20 69 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f 66 initial size of
2480: 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 the Win32-speci
2490: 66 69 63 20 68 65 61 70 2e 20 20 54 68 69 73 20 fic heap. This
24a0: 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 value may be zer
24b0: 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 o.. */.#ifndef S
24c0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 QLITE_WIN32_HEAP
24d0: 5f 49 4e 49 54 5f 53 49 5a 45 0a 23 20 20 64 65 _INIT_SIZE.# de
24e0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 fine SQLITE_WIN3
24f0: 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 2_HEAP_INIT_SIZE
2500: 20 28 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c ((SQLITE_DEFAUL
2510: 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 20 2a 20 T_CACHE_SIZE) *
2520: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 \.
2530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2540: 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 (SQLITE
2550: 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 _DEFAULT_PAGE_SI
2560: 5a 45 29 20 2b 20 34 31 39 34 33 30 34 29 0a 23 ZE) + 4194304).#
2570: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 endif../*. * The
2580: 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 maximum size of
2590: 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 the Win32-speci
25a0: 66 69 63 20 68 65 61 70 2e 20 20 54 68 69 73 20 fic heap. This
25b0: 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 value may be zer
25c0: 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 o.. */.#ifndef S
25d0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 QLITE_WIN32_HEAP
25e0: 5f 4d 41 58 5f 53 49 5a 45 0a 23 20 20 64 65 66 _MAX_SIZE.# def
25f0: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 ine SQLITE_WIN32
2600: 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 20 20 _HEAP_MAX_SIZE
2610: 28 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 (0).#endif../*.
2620: 2a 20 54 68 65 20 65 78 74 72 61 20 66 6c 61 67 * The extra flag
2630: 73 20 74 6f 20 75 73 65 20 69 6e 20 63 61 6c 6c s to use in call
2640: 73 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 68 s to the Win32 h
2650: 65 61 70 20 41 50 49 73 2e 20 20 54 68 69 73 20 eap APIs. This
2660: 76 61 6c 75 65 20 6d 61 79 20 62 65 0a 20 2a 20 value may be. *
2670: 7a 65 72 6f 20 66 6f 72 20 74 68 65 20 64 65 66 zero for the def
2680: 61 75 6c 74 20 62 65 68 61 76 69 6f 72 2e 0a 20 ault behavior..
2690: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 */.#ifndef SQLIT
26a0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 E_WIN32_HEAP_FLA
26b0: 47 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c GS.# define SQL
26c0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 ITE_WIN32_HEAP_F
26d0: 4c 41 47 53 20 20 20 20 20 28 30 29 0a 23 65 6e LAGS (0).#en
26e0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 dif.../*.** The
26f0: 77 69 6e 4d 65 6d 44 61 74 61 20 73 74 72 75 63 winMemData struc
2700: 74 75 72 65 20 73 74 6f 72 65 73 20 69 6e 66 6f ture stores info
2710: 72 6d 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 rmation required
2720: 20 62 79 20 74 68 65 20 57 69 6e 33 32 2d 73 70 by the Win32-sp
2730: 65 63 69 66 69 63 0a 2a 2a 20 73 71 6c 69 74 65 ecific.** sqlite
2740: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 69 6d 3_mem_methods im
2750: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f plementation..*/
2760: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 .typedef struct
2770: 77 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e 4d 65 winMemData winMe
2780: 6d 44 61 74 61 3b 0a 73 74 72 75 63 74 20 77 69 mData;.struct wi
2790: 6e 4d 65 6d 44 61 74 61 20 7b 0a 23 69 66 6e 64 nMemData {.#ifnd
27a0: 65 66 20 4e 44 45 42 55 47 0a 20 20 75 33 32 20 ef NDEBUG. u32
27b0: 6d 61 67 69 63 31 3b 20 20 20 2f 2a 20 4d 61 67 magic1; /* Mag
27c0: 69 63 20 6e 75 6d 62 65 72 20 74 6f 20 64 65 74 ic number to det
27d0: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 63 6f ect structure co
27e0: 72 72 75 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e rruption. */.#en
27f0: 64 69 66 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 dif. HANDLE hHe
2800: 61 70 3b 20 2f 2a 20 54 68 65 20 68 61 6e 64 6c ap; /* The handl
2810: 65 20 74 6f 20 6f 75 72 20 68 65 61 70 2e 20 2a e to our heap. *
2820: 2f 0a 20 20 42 4f 4f 4c 20 62 4f 77 6e 65 64 3b /. BOOL bOwned;
2830: 20 20 2f 2a 20 44 6f 20 77 65 20 6f 77 6e 20 74 /* Do we own t
2840: 68 65 20 68 65 61 70 20 28 69 2e 65 2e 20 64 65 he heap (i.e. de
2850: 73 74 72 6f 79 20 69 74 20 6f 6e 20 73 68 75 74 stroy it on shut
2860: 64 6f 77 6e 29 3f 20 2a 2f 0a 23 69 66 6e 64 65 down)? */.#ifnde
2870: 66 20 4e 44 45 42 55 47 0a 20 20 75 33 32 20 6d f NDEBUG. u32 m
2880: 61 67 69 63 32 3b 20 20 20 2f 2a 20 4d 61 67 69 agic2; /* Magi
2890: 63 20 6e 75 6d 62 65 72 20 74 6f 20 64 65 74 65 c number to dete
28a0: 63 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 72 ct structure cor
28b0: 72 75 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64 ruption. */.#end
28c0: 69 66 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 4e if.};..#ifndef N
28d0: 44 45 42 55 47 0a 23 64 65 66 69 6e 65 20 57 49 DEBUG.#define WI
28e0: 4e 4d 45 4d 5f 4d 41 47 49 43 31 20 20 20 20 20 NMEM_MAGIC1
28f0: 30 78 34 32 62 32 38 33 30 62 0a 23 64 65 66 69 0x42b2830b.#defi
2900: 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 ne WINMEM_MAGIC2
2910: 20 20 20 20 20 30 78 62 64 34 64 37 63 66 34 0a 0xbd4d7cf4.
2920: 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 73 #endif..static s
2930: 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 truct winMemData
2940: 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 20 3d 20 win_mem_data =
2950: 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 {.#ifndef NDEBUG
2960: 0a 20 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 . WINMEM_MAGIC1
2970: 2c 0a 23 65 6e 64 69 66 0a 20 20 4e 55 4c 4c 2c ,.#endif. NULL,
2980: 20 46 41 4c 53 45 0a 23 69 66 6e 64 65 66 20 4e FALSE.#ifndef N
2990: 44 45 42 55 47 0a 20 20 2c 57 49 4e 4d 45 4d 5f DEBUG. ,WINMEM_
29a0: 4d 41 47 49 43 32 0a 23 65 6e 64 69 66 0a 7d 3b MAGIC2.#endif.};
29b0: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 ..#ifndef NDEBUG
29c0: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 .#define winMemA
29d0: 73 73 65 72 74 4d 61 67 69 63 31 28 29 20 61 73 ssertMagic1() as
29e0: 73 65 72 74 28 20 77 69 6e 5f 6d 65 6d 5f 64 61 sert( win_mem_da
29f0: 74 61 2e 6d 61 67 69 63 31 3d 3d 57 49 4e 4d 45 ta.magic1==WINME
2a00: 4d 5f 4d 41 47 49 43 31 20 29 0a 23 64 65 66 69 M_MAGIC1 ).#defi
2a10: 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d ne winMemAssertM
2a20: 61 67 69 63 32 28 29 20 61 73 73 65 72 74 28 20 agic2() assert(
2a30: 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 win_mem_data.mag
2a40: 69 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 ic2==WINMEM_MAGI
2a50: 43 32 20 29 0a 23 64 65 66 69 6e 65 20 77 69 6e C2 ).#define win
2a60: 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 MemAssertMagic()
2a70: 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 winMemAssertMa
2a80: 67 69 63 31 28 29 3b 20 77 69 6e 4d 65 6d 41 73 gic1(); winMemAs
2a90: 73 65 72 74 4d 61 67 69 63 32 28 29 3b 0a 23 65 sertMagic2();.#e
2aa0: 6c 73 65 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d lse.#define winM
2ab0: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 0a emAssertMagic().
2ac0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 #endif..#define
2ad0: 77 69 6e 4d 65 6d 47 65 74 44 61 74 61 50 74 72 winMemGetDataPtr
2ae0: 28 29 20 20 26 77 69 6e 5f 6d 65 6d 5f 64 61 74 () &win_mem_dat
2af0: 61 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d a.#define winMem
2b00: 47 65 74 48 65 61 70 28 29 20 20 20 20 20 77 69 GetHeap() wi
2b10: 6e 5f 6d 65 6d 5f 64 61 74 61 2e 68 48 65 61 70 n_mem_data.hHeap
2b20: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 .#define winMemG
2b30: 65 74 4f 77 6e 65 64 28 29 20 20 20 20 77 69 6e etOwned() win
2b40: 5f 6d 65 6d 5f 64 61 74 61 2e 62 4f 77 6e 65 64 _mem_data.bOwned
2b50: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 ..static void *w
2b60: 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 inMemMalloc(int
2b70: 6e 42 79 74 65 73 29 3b 0a 73 74 61 74 69 63 20 nBytes);.static
2b80: 76 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 void winMemFree(
2b90: 76 6f 69 64 20 2a 70 50 72 69 6f 72 29 3b 0a 73 void *pPrior);.s
2ba0: 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d tatic void *winM
2bb0: 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a emRealloc(void *
2bc0: 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 pPrior, int nByt
2bd0: 65 73 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 es);.static int
2be0: 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20 winMemSize(void
2bf0: 2a 70 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 *p);.static int
2c00: 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e winMemRoundup(in
2c10: 74 20 6e 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 t n);.static int
2c20: 20 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64 winMemInit(void
2c30: 20 2a 70 41 70 70 44 61 74 61 29 3b 0a 73 74 61 *pAppData);.sta
2c40: 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53 tic void winMemS
2c50: 68 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41 hutdown(void *pA
2c60: 70 70 44 61 74 61 29 3b 0a 0a 63 6f 6e 73 74 20 ppData);..const
2c70: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 sqlite3_mem_meth
2c80: 6f 64 73 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 ods *sqlite3MemG
2c90: 65 74 57 69 6e 33 32 28 76 6f 69 64 29 3b 0a 23 etWin32(void);.#
2ca0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f endif /* SQLITE_
2cb0: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a WIN32_MALLOC */.
2cc0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f ./*.** The follo
2cd0: 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20 69 73 wing variable is
2ce0: 20 28 6e 6f 72 6d 61 6c 6c 79 29 20 73 65 74 20 (normally) set
2cf0: 6f 6e 63 65 20 61 6e 64 20 6e 65 76 65 72 20 63 once and never c
2d00: 68 61 6e 67 65 73 0a 2a 2a 20 74 68 65 72 65 61 hanges.** therea
2d10: 66 74 65 72 2e 20 20 49 74 20 72 65 63 6f 72 64 fter. It record
2d20: 73 20 77 68 65 74 68 65 72 20 74 68 65 20 6f 70 s whether the op
2d30: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 erating system i
2d40: 73 20 57 69 6e 39 78 0a 2a 2a 20 6f 72 20 57 69 s Win9x.** or Wi
2d50: 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20 20 20 nNT..**.** 0:
2d60: 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d Operating system
2d70: 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31 3a 20 unknown..** 1:
2d80: 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 Operating syst
2d90: 65 6d 20 69 73 20 57 69 6e 39 78 2e 0a 2a 2a 20 em is Win9x..**
2da0: 32 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 2: Operating s
2db0: 79 73 74 65 6d 20 69 73 20 57 69 6e 4e 54 2e 0a ystem is WinNT..
2dc0: 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 **.** In order t
2dd0: 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 65 73 o facilitate tes
2de0: 74 69 6e 67 20 6f 6e 20 61 20 57 69 6e 4e 54 20 ting on a WinNT
2df0: 73 79 73 74 65 6d 2c 20 74 68 65 20 74 65 73 74 system, the test
2e00: 20 66 69 78 74 75 72 65 0a 2a 2a 20 63 61 6e 20 fixture.** can
2e10: 6d 61 6e 75 61 6c 6c 79 20 73 65 74 20 74 68 69 manually set thi
2e20: 73 20 76 61 6c 75 65 20 74 6f 20 31 20 74 6f 20 s value to 1 to
2e30: 65 6d 75 6c 61 74 65 20 57 69 6e 39 38 20 62 65 emulate Win98 be
2e40: 68 61 76 69 6f 72 2e 0a 2a 2f 0a 23 69 66 64 65 havior..*/.#ifde
2e50: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e f SQLITE_TEST.in
2e60: 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 t sqlite3_os_typ
2e70: 65 20 3d 20 30 3b 0a 23 65 6c 69 66 20 21 53 51 e = 0;.#elif !SQ
2e80: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 LITE_OS_WINCE &&
2e90: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 !SQLITE_OS_WINR
2ea0: 54 20 26 26 20 5c 0a 20 20 20 20 20 20 64 65 66 T && \. def
2eb0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 ined(SQLITE_WIN3
2ec0: 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20 64 2_HAS_ANSI) && d
2ed0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 efined(SQLITE_WI
2ee0: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 73 74 N32_HAS_WIDE).st
2ef0: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 atic int sqlite3
2f00: 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65 _os_type = 0;.#e
2f10: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 59 ndif..#ifndef SY
2f20: 53 43 41 4c 4c 0a 23 20 20 64 65 66 69 6e 65 20 SCALL.# define
2f30: 53 59 53 43 41 4c 4c 20 73 71 6c 69 74 65 33 5f SYSCALL sqlite3_
2f40: 73 79 73 63 61 6c 6c 5f 70 74 72 0a 23 65 6e 64 syscall_ptr.#end
2f50: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 if../*.** This f
2f60: 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61 unction is not a
2f70: 76 61 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64 vailable on Wind
2f80: 6f 77 73 20 43 45 20 6f 72 20 57 69 6e 52 54 2e ows CE or WinRT.
2f90: 0a 20 2a 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45 . */..#if SQLITE
2fa0: 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c _OS_WINCE || SQL
2fb0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 23 20 20 ITE_OS_WINRT.#
2fc0: 64 65 66 69 6e 65 20 6f 73 41 72 65 46 69 6c 65 define osAreFile
2fd0: 41 70 69 73 41 4e 53 49 28 29 20 20 20 20 20 20 ApisANSI()
2fe0: 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 1.#endif../*.**
2ff0: 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63 61 6c Many system cal
3000: 6c 73 20 61 72 65 20 61 63 63 65 73 73 65 64 20 ls are accessed
3010: 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d through pointer-
3020: 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20 to-functions so
3030: 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61 79 that.** they may
3040: 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 61 be overridden a
3050: 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66 61 63 t runtime to fac
3060: 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20 69 6e ilitate fault in
3070: 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a 2a jection during.*
3080: 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73 61 * testing and sa
3090: 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65 20 66 ndboxing. The f
30a0: 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68 ollowing array h
30b0: 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73 20 61 olds the names a
30c0: 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 nd pointers.** t
30d0: 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65 61 62 o all overrideab
30e0: 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e le system calls.
30f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 .*/.static struc
3100: 74 20 77 69 6e 5f 73 79 73 63 61 6c 6c 20 7b 0a t win_syscall {.
3110: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e const char *zN
3120: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 ame;
3130: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 /* Name of the s
3140: 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 ystem call */.
3150: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f sqlite3_syscall_
3160: 70 74 72 20 70 43 75 72 72 65 6e 74 3b 20 2f 2a ptr pCurrent; /*
3170: 20 43 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f Current value o
3180: 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c f the system cal
3190: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 l */. sqlite3_s
31a0: 79 73 63 61 6c 6c 5f 70 74 72 20 70 44 65 66 61 yscall_ptr pDefa
31b0: 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74 20 ult; /* Default
31c0: 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73 63 value */.} aSysc
31d0: 61 6c 6c 5b 5d 20 3d 20 7b 0a 23 69 66 20 21 53 all[] = {.#if !S
31e0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 QLITE_OS_WINCE &
31f0: 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e & !SQLITE_OS_WIN
3200: 52 54 0a 20 20 7b 20 22 41 72 65 46 69 6c 65 41 RT. { "AreFileA
3210: 70 69 73 41 4e 53 49 22 2c 20 20 20 20 20 20 20 pisANSI",
3220: 20 20 28 53 59 53 43 41 4c 4c 29 41 72 65 46 69 (SYSCALL)AreFi
3230: 6c 65 41 70 69 73 41 4e 53 49 2c 20 20 20 20 20 leApisANSI,
3240: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 0 },.#else.
3250: 20 7b 20 22 41 72 65 46 69 6c 65 41 70 69 73 41 { "AreFileApisA
3260: 4e 53 49 22 2c 20 20 20 20 20 20 20 20 20 28 53 NSI", (S
3270: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 YSCALL)0,
3280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3290: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 0 },.#endif..#if
32a0: 6e 64 65 66 20 6f 73 41 72 65 46 69 6c 65 41 70 ndef osAreFileAp
32b0: 69 73 41 4e 53 49 0a 23 64 65 66 69 6e 65 20 6f isANSI.#define o
32c0: 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 sAreFileApisANSI
32d0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 ((BOOL(WINAPI*)
32e0: 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b (VOID))aSyscall[
32f0: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 0].pCurrent).#en
3300: 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f dif..#if SQLITE_
3310: 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 OS_WINCE && defi
3320: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 ned(SQLITE_WIN32
3330: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 _HAS_WIDE). { "
3340: 43 68 61 72 4c 6f 77 65 72 57 22 2c 20 20 20 20 CharLowerW",
3350: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 (SYSCA
3360: 4c 4c 29 43 68 61 72 4c 6f 77 65 72 57 2c 20 20 LL)CharLowerW,
3370: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0 },
3380: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 68 61 72 .#else. { "Char
3390: 4c 6f 77 65 72 57 22 2c 20 20 20 20 20 20 20 20 LowerW",
33a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 (SYSCALL)0
33b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
33c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 0 },.#en
33d0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 dif..#define osC
33e0: 68 61 72 4c 6f 77 65 72 57 20 28 28 4c 50 57 53 harLowerW ((LPWS
33f0: 54 52 28 57 49 4e 41 50 49 2a 29 28 4c 50 57 53 TR(WINAPI*)(LPWS
3400: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e TR))aSyscall[1].
3410: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 pCurrent)..#if S
3420: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 QLITE_OS_WINCE &
3430: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 & defined(SQLITE
3440: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 _WIN32_HAS_WIDE)
3450: 0a 20 20 7b 20 22 43 68 61 72 55 70 70 65 72 57 . { "CharUpperW
3460: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ",
3470: 28 53 59 53 43 41 4c 4c 29 43 68 61 72 55 70 70 (SYSCALL)CharUpp
3480: 65 72 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 erW,
3490: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 0 },.#else. {
34a0: 20 22 43 68 61 72 55 70 70 65 72 57 22 2c 20 20 "CharUpperW",
34b0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 (SYS
34c0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 CALL)0,
34d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 0
34e0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 },.#endif..#defi
34f0: 6e 65 20 6f 73 43 68 61 72 55 70 70 65 72 57 20 ne osCharUpperW
3500: 28 28 4c 50 57 53 54 52 28 57 49 4e 41 50 49 2a ((LPWSTR(WINAPI*
3510: 29 28 4c 50 57 53 54 52 29 29 61 53 79 73 63 61 )(LPWSTR))aSysca
3520: 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a ll[2].pCurrent).
3530: 0a 20 20 7b 20 22 43 6c 6f 73 65 48 61 6e 64 6c . { "CloseHandl
3540: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 e",
3550: 28 53 59 53 43 41 4c 4c 29 43 6c 6f 73 65 48 61 (SYSCALL)CloseHa
3560: 6e 64 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 ndle,
3570: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 0 },..#define
3580: 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 20 28 28 osCloseHandle ((
3590: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 BOOL(WINAPI*)(HA
35a0: 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 NDLE))aSyscall[3
35b0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 ].pCurrent)..#if
35c0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f defined(SQLITE_
35d0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a WIN32_HAS_ANSI).
35e0: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 41 { "CreateFileA
35f0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 ", (
3600: 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 SYSCALL)CreateFi
3610: 6c 65 41 2c 20 20 20 20 20 20 20 20 20 20 20 20 leA,
3620: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 0 },.#else. {
3630: 22 43 72 65 61 74 65 46 69 6c 65 41 22 2c 20 20 "CreateFileA",
3640: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 (SYSC
3650: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 ALL)0,
3660: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 0 }
3670: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e ,.#endif..#defin
3680: 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 41 20 e osCreateFileA
3690: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a ((HANDLE(WINAPI*
36a0: 29 28 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c 44 )(LPCSTR,DWORD,D
36b0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 WORD, \.
36c0: 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 LPSECURITY_ATTRI
36d0: 42 55 54 45 53 2c 44 57 4f 52 44 2c 44 57 4f 52 BUTES,DWORD,DWOR
36e0: 44 2c 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 D,HANDLE))aSysca
36f0: 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a ll[4].pCurrent).
3700: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f .#if !SQLITE_OS_
3710: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 WINRT && defined
3720: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 (SQLITE_WIN32_HA
3730: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 72 65 S_WIDE). { "Cre
3740: 61 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 ateFileW",
3750: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 (SYSCALL)
3760: 43 72 65 61 74 65 46 69 6c 65 57 2c 20 20 20 20 CreateFileW,
3770: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 0 },.#e
3780: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 lse. { "CreateF
3790: 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 ileW",
37a0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 (SYSCALL)0,
37b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
37c0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0 },.#endif
37d0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 ..#define osCrea
37e0: 74 65 46 69 6c 65 57 20 28 28 48 41 4e 44 4c 45 teFileW ((HANDLE
37f0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 (WINAPI*)(LPCWST
3800: 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c R,DWORD,DWORD, \
3810: 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43 55 52 . LPSECUR
3820: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 44 ITY_ATTRIBUTES,D
3830: 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c WORD,DWORD,HANDL
3840: 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 E))aSyscall[5].p
3850: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 28 21 Current)..#if (!
3860: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 SQLITE_OS_WINRT
3870: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 && defined(SQLIT
3880: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 E_WIN32_HAS_ANSI
3890: 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 21 ) && \. !
38a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f defined(SQLITE_O
38b0: 4d 49 54 5f 57 41 4c 29 29 0a 20 20 7b 20 22 43 MIT_WAL)). { "C
38c0: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 reateFileMapping
38d0: 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c A", (SYSCAL
38e0: 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 L)CreateFileMapp
38f0: 69 6e 67 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a ingA, 0 },.
3900: 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 #else. { "Creat
3910: 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20 eFileMappingA",
3920: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c (SYSCALL)0,
3930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3940: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 0 },.#end
3950: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 if..#define osCr
3960: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 eateFileMappingA
3970: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 ((HANDLE(WINAPI
3980: 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55 *)(HANDLE,LPSECU
3990: 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c RITY_ATTRIBUTES,
39a0: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 \. DWORD
39b0: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43 ,DWORD,DWORD,LPC
39c0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d STR))aSyscall[6]
39d0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 .pCurrent)..#if
39e0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 SQLITE_OS_WINCE
39f0: 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57 || (!SQLITE_OS_W
3a00: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 INRT && defined(
3a10: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 SQLITE_WIN32_HAS
3a20: 5f 57 49 44 45 29 20 26 26 20 5c 0a 20 20 20 20 _WIDE) && \.
3a30: 20 20 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c !defined(SQL
3a40: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 29 0a 20 ITE_OMIT_WAL)).
3a50: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 { "CreateFileMa
3a60: 70 70 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 ppingW", (S
3a70: 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c YSCALL)CreateFil
3a80: 65 4d 61 70 70 69 6e 67 57 2c 20 20 20 20 20 20 eMappingW,
3a90: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 0 },.#else. { "
3aa0: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e CreateFileMappin
3ab0: 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 gW", (SYSCA
3ac0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 LL)0,
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0 },
3ae0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 .#endif..#define
3af0: 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 osCreateFileMap
3b00: 70 69 6e 67 57 20 28 28 48 41 4e 44 4c 45 28 57 pingW ((HANDLE(W
3b10: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c INAPI*)(HANDLE,L
3b20: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 PSECURITY_ATTRIB
3b30: 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 UTES, \.
3b40: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 DWORD,DWORD,DWOR
3b50: 44 2c 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 D,LPCWSTR))aSysc
3b60: 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 all[7].pCurrent)
3b70: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 ..#if !SQLITE_OS
3b80: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 _WINRT && define
3b90: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 d(SQLITE_WIN32_H
3ba0: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 72 AS_WIDE). { "Cr
3bb0: 65 61 74 65 4d 75 74 65 78 57 22 2c 20 20 20 20 eateMutexW",
3bc0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c (SYSCALL
3bd0: 29 43 72 65 61 74 65 4d 75 74 65 78 57 2c 20 20 )CreateMutexW,
3be0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 0 },.#
3bf0: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 else. { "Create
3c00: 4d 75 74 65 78 57 22 2c 20 20 20 20 20 20 20 20 MutexW",
3c10: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 (SYSCALL)0,
3c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3c30: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 0 },.#endi
3c40: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 f..#define osCre
3c50: 61 74 65 4d 75 74 65 78 57 20 28 28 48 41 4e 44 ateMutexW ((HAND
3c60: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 45 LE(WINAPI*)(LPSE
3c70: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 CURITY_ATTRIBUTE
3c80: 53 2c 42 4f 4f 4c 2c 20 5c 0a 20 20 20 20 20 20 S,BOOL, \.
3c90: 20 20 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 LPCWSTR))aSysc
3ca0: 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29 all[8].pCurrent)
3cb0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 ..#if defined(SQ
3cc0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 LITE_WIN32_HAS_A
3cd0: 4e 53 49 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 NSI). { "Delete
3ce0: 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20 FileA",
3cf0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 44 65 6c (SYSCALL)Del
3d00: 65 74 65 46 69 6c 65 41 2c 20 20 20 20 20 20 20 eteFileA,
3d10: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0 },.#else
3d20: 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 . { "DeleteFile
3d30: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 A",
3d40: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 (SYSCALL)0,
3d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3d60: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 0 },.#endif..#
3d70: 64 65 66 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 define osDeleteF
3d80: 69 6c 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 ileA ((BOOL(WINA
3d90: 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 PI*)(LPCSTR))aSy
3da0: 73 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e scall[9].pCurren
3db0: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 t)..#if defined(
3dc0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 SQLITE_WIN32_HAS
3dd0: 5f 57 49 44 45 29 0a 20 20 7b 20 22 44 65 6c 65 _WIDE). { "Dele
3de0: 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 teFileW",
3df0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 44 (SYSCALL)D
3e00: 65 6c 65 74 65 46 69 6c 65 57 2c 20 20 20 20 20 eleteFileW,
3e10: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 0 },.#el
3e20: 73 65 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 se. { "DeleteFi
3e30: 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 leW",
3e40: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 (SYSCALL)0,
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3e60: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0 },.#endif.
3e70: 0a 23 64 65 66 69 6e 65 20 6f 73 44 65 6c 65 74 .#define osDelet
3e80: 65 46 69 6c 65 57 20 28 28 42 4f 4f 4c 28 57 49 eFileW ((BOOL(WI
3e90: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 NAPI*)(LPCWSTR))
3ea0: 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 aSyscall[10].pCu
3eb0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 rrent)..#if SQLI
3ec0: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 TE_OS_WINCE. {
3ed0: 22 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c "FileTimeToLocal
3ee0: 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 FileTime", (SYSC
3ef0: 41 4c 4c 29 46 69 6c 65 54 69 6d 65 54 6f 4c 6f ALL)FileTimeToLo
3f00: 63 61 6c 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d calFileTime, 0 }
3f10: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 69 6c ,.#else. { "Fil
3f20: 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 eTimeToLocalFile
3f30: 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 Time", (SYSCALL)
3f40: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0,
3f50: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 0 },.#e
3f60: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 ndif..#define os
3f70: 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 FileTimeToLocalF
3f80: 69 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 ileTime ((BOOL(W
3f90: 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20 46 49 INAPI*)(CONST FI
3fa0: 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 LETIME*, \.
3fb0: 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 LPFILETIME))a
3fc0: 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 Syscall[11].pCur
3fd0: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 rent)..#if SQLIT
3fe0: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 E_OS_WINCE. { "
3ff0: 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d FileTimeToSystem
4000: 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41 Time", (SYSCA
4010: 4c 4c 29 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 LL)FileTimeToSys
4020: 74 65 6d 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c temTime, 0 },
4030: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65 .#else. { "File
4040: 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 TimeToSystemTime
4050: 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 ", (SYSCALL)0
4060: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
4070: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 0 },.#en
4080: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 dif..#define osF
4090: 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 ileTimeToSystemT
40a0: 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 ime ((BOOL(WINAP
40b0: 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45 54 49 I*)(CONST FILETI
40c0: 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c ME*, \. L
40d0: 50 53 59 53 54 45 4d 54 49 4d 45 29 29 61 53 79 PSYSTEMTIME))aSy
40e0: 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 scall[12].pCurre
40f0: 6e 74 29 0a 0a 20 20 7b 20 22 46 6c 75 73 68 46 nt).. { "FlushF
4100: 69 6c 65 42 75 66 66 65 72 73 22 2c 20 20 20 20 ileBuffers",
4110: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6c 75 (SYSCALL)Flu
4120: 73 68 46 69 6c 65 42 75 66 66 65 72 73 2c 20 20 shFileBuffers,
4130: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 0 },..#def
4140: 69 6e 65 20 6f 73 46 6c 75 73 68 46 69 6c 65 42 ine osFlushFileB
4150: 75 66 66 65 72 73 20 28 28 42 4f 4f 4c 28 57 49 uffers ((BOOL(WI
4160: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 NAPI*)(HANDLE))a
4170: 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 Syscall[13].pCur
4180: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e rent)..#if defin
4190: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f ed(SQLITE_WIN32_
41a0: 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 46 HAS_ANSI). { "F
41b0: 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 22 2c 20 ormatMessageA",
41c0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c (SYSCAL
41d0: 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 L)FormatMessageA
41e0: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a , 0 },.
41f0: 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61 #else. { "Forma
4200: 74 4d 65 73 73 61 67 65 41 22 2c 20 20 20 20 20 tMessageA",
4210: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c (SYSCALL)0,
4220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4230: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 0 },.#end
4240: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f if..#define osFo
4250: 72 6d 61 74 4d 65 73 73 61 67 65 41 20 28 28 44 rmatMessageA ((D
4260: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57 WORD(WINAPI*)(DW
4270: 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 ORD,LPCVOID,DWOR
4280: 44 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c D,DWORD,LPSTR, \
4290: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 76 . DWORD,v
42a0: 61 5f 6c 69 73 74 2a 29 29 61 53 79 73 63 61 6c a_list*))aSyscal
42b0: 6c 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a l[14].pCurrent).
42c0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c .#if defined(SQL
42d0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 ITE_WIN32_HAS_WI
42e0: 44 45 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d DE). { "FormatM
42f0: 65 73 73 61 67 65 57 22 2c 20 20 20 20 20 20 20 essageW",
4300: 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d (SYSCALL)Form
4310: 61 74 4d 65 73 73 61 67 65 57 2c 20 20 20 20 20 atMessageW,
4320: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 0 },.#else.
4330: 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 { "FormatMessa
4340: 67 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 28 geW", (
4350: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 SYSCALL)0,
4360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4370: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 0 },.#endif..#d
4380: 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65 efine osFormatMe
4390: 73 73 61 67 65 57 20 28 28 44 57 4f 52 44 28 57 ssageW ((DWORD(W
43a0: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 INAPI*)(DWORD,LP
43b0: 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52 CVOID,DWORD,DWOR
43c0: 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 D,LPWSTR, \.
43d0: 20 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73 DWORD,va_lis
43e0: 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d t*))aSyscall[15]
43f0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 .pCurrent)..#if
4400: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f !defined(SQLITE_
4410: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 OMIT_LOAD_EXTENS
4420: 49 4f 4e 29 0a 20 20 7b 20 22 46 72 65 65 4c 69 ION). { "FreeLi
4430: 62 72 61 72 79 22 2c 20 20 20 20 20 20 20 20 20 brary",
4440: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 72 65 (SYSCALL)Fre
4450: 65 4c 69 62 72 61 72 79 2c 20 20 20 20 20 20 20 eLibrary,
4460: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0 },.#else
4470: 0a 20 20 7b 20 22 46 72 65 65 4c 69 62 72 61 72 . { "FreeLibrar
4480: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 y",
4490: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 (SYSCALL)0,
44a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
44b0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 0 },.#endif..#
44c0: 64 65 66 69 6e 65 20 6f 73 46 72 65 65 4c 69 62 define osFreeLib
44d0: 72 61 72 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41 rary ((BOOL(WINA
44e0: 50 49 2a 29 28 48 4d 4f 44 55 4c 45 29 29 61 53 PI*)(HMODULE))aS
44f0: 79 73 63 61 6c 6c 5b 31 36 5d 2e 70 43 75 72 72 yscall[16].pCurr
4500: 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 43 75 ent).. { "GetCu
4510: 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 22 2c rrentProcessId",
4520: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 (SYSCALL)Ge
4530: 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 tCurrentProcessI
4540: 64 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 d, 0 },..#de
4550: 66 69 6e 65 20 6f 73 47 65 74 43 75 72 72 65 6e fine osGetCurren
4560: 74 50 72 6f 63 65 73 73 49 64 20 28 28 44 57 4f tProcessId ((DWO
4570: 52 44 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 RD(WINAPI*)(VOID
4580: 29 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 ))aSyscall[17].p
4590: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 Current)..#if !S
45a0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 QLITE_OS_WINCE &
45b0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 & defined(SQLITE
45c0: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 _WIN32_HAS_ANSI)
45d0: 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 . { "GetDiskFre
45e0: 65 53 70 61 63 65 41 22 2c 20 20 20 20 20 20 20 eSpaceA",
45f0: 28 53 59 53 43 41 4c 4c 29 47 65 74 44 69 73 6b (SYSCALL)GetDisk
4600: 46 72 65 65 53 70 61 63 65 41 2c 20 20 20 20 20 FreeSpaceA,
4610: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 0 },.#else. {
4620: 20 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 "GetDiskFreeSpa
4630: 63 65 41 22 2c 20 20 20 20 20 20 20 28 53 59 53 ceA", (SYS
4640: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 CALL)0,
4650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 0
4660: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 },.#endif..#defi
4670: 6e 65 20 6f 73 47 65 74 44 69 73 6b 46 72 65 65 ne osGetDiskFree
4680: 53 70 61 63 65 41 20 28 28 42 4f 4f 4c 28 57 49 SpaceA ((BOOL(WI
4690: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 4c 50 NAPI*)(LPCSTR,LP
46a0: 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 DWORD,LPDWORD,LP
46b0: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 DWORD, \.
46c0: 20 4c 50 44 57 4f 52 44 29 29 61 53 79 73 63 61 LPDWORD))aSysca
46d0: 6c 6c 5b 31 38 5d 2e 70 43 75 72 72 65 6e 74 29 ll[18].pCurrent)
46e0: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 ..#if !SQLITE_OS
46f0: 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 _WINCE && !SQLIT
4700: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 E_OS_WINRT && de
4710: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e fined(SQLITE_WIN
4720: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 32_HAS_WIDE). {
4730: 20 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 "GetDiskFreeSpa
4740: 63 65 57 22 2c 20 20 20 20 20 20 20 28 53 59 53 ceW", (SYS
4750: 43 41 4c 4c 29 47 65 74 44 69 73 6b 46 72 65 65 CALL)GetDiskFree
4760: 53 70 61 63 65 57 2c 20 20 20 20 20 20 20 30 20 SpaceW, 0
4770: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 },.#else. { "Ge
4780: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 22 tDiskFreeSpaceW"
4790: 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c , (SYSCALL
47a0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 )0,
47b0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 0 },.#
47c0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f endif..#define o
47d0: 73 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 sGetDiskFreeSpac
47e0: 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 eW ((BOOL(WINAPI
47f0: 2a 29 28 4c 50 43 57 53 54 52 2c 4c 50 44 57 4f *)(LPCWSTR,LPDWO
4800: 52 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f RD,LPDWORD,LPDWO
4810: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 RD, \. LP
4820: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b DWORD))aSyscall[
4830: 31 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 19].pCurrent)..#
4840: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 if defined(SQLIT
4850: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 E_WIN32_HAS_ANSI
4860: 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 ). { "GetFileAt
4870: 74 72 69 62 75 74 65 73 41 22 2c 20 20 20 20 20 tributesA",
4880: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c (SYSCALL)GetFil
4890: 65 41 74 74 72 69 62 75 74 65 73 41 2c 20 20 20 eAttributesA,
48a0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 0 },.#else.
48b0: 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 { "GetFileAttrib
48c0: 75 74 65 73 41 22 2c 20 20 20 20 20 20 28 53 59 utesA", (SY
48d0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 SCALL)0,
48e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0
48f0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 },.#endif..#def
4900: 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41 74 74 ine osGetFileAtt
4910: 72 69 62 75 74 65 73 41 20 28 28 44 57 4f 52 44 ributesA ((DWORD
4920: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 (WINAPI*)(LPCSTR
4930: 29 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 ))aSyscall[20].p
4940: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 Current)..#if !S
4950: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 QLITE_OS_WINRT &
4960: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 & defined(SQLITE
4970: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 _WIN32_HAS_WIDE)
4980: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 . { "GetFileAtt
4990: 72 69 62 75 74 65 73 57 22 2c 20 20 20 20 20 20 ributesW",
49a0: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 (SYSCALL)GetFile
49b0: 41 74 74 72 69 62 75 74 65 73 57 2c 20 20 20 20 AttributesW,
49c0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 0 },.#else. {
49d0: 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 "GetFileAttribu
49e0: 74 65 73 57 22 2c 20 20 20 20 20 20 28 53 59 53 tesW", (SYS
49f0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 CALL)0,
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 0
4a10: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 },.#endif..#defi
4a20: 6e 65 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 ne osGetFileAttr
4a30: 69 62 75 74 65 73 57 20 28 28 44 57 4f 52 44 28 ibutesW ((DWORD(
4a40: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 WINAPI*)(LPCWSTR
4a50: 29 29 61 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 ))aSyscall[21].p
4a60: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 Current)..#if de
4a70: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e fined(SQLITE_WIN
4a80: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 32_HAS_WIDE). {
4a90: 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 "GetFileAttribu
4aa0: 74 65 73 45 78 57 22 2c 20 20 20 20 28 53 59 53 tesExW", (SYS
4ab0: 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72 CALL)GetFileAttr
4ac0: 69 62 75 74 65 73 45 78 57 2c 20 20 20 20 30 20 ibutesExW, 0
4ad0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 },.#else. { "Ge
4ae0: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 tFileAttributesE
4af0: 78 57 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c xW", (SYSCALL
4b00: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 )0,
4b10: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 0 },.#
4b20: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f endif..#define o
4b30: 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 sGetFileAttribut
4b40: 65 73 45 78 57 20 28 28 42 4f 4f 4c 28 57 49 4e esExW ((BOOL(WIN
4b50: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 47 45 API*)(LPCWSTR,GE
4b60: 54 5f 46 49 4c 45 45 58 5f 49 4e 46 4f 5f 4c 45 T_FILEEX_INFO_LE
4b70: 56 45 4c 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 VELS, \.
4b80: 4c 50 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c LPVOID))aSyscall
4b90: 5b 32 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a [22].pCurrent)..
4ba0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 #if !SQLITE_OS_W
4bb0: 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 46 69 6c INRT. { "GetFil
4bc0: 65 53 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 eSize",
4bd0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 (SYSCALL)Get
4be0: 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 FileSize,
4bf0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0 },.#else
4c00: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 53 69 7a . { "GetFileSiz
4c10: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 e",
4c20: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 (SYSCALL)0,
4c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4c40: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 0 },.#endif..#
4c50: 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 define osGetFile
4c60: 53 69 7a 65 20 28 28 44 57 4f 52 44 28 57 49 4e Size ((DWORD(WIN
4c70: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 44 API*)(HANDLE,LPD
4c80: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 WORD))aSyscall[2
4c90: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 3].pCurrent)..#i
4ca0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e f !SQLITE_OS_WIN
4cb0: 43 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 CE && defined(SQ
4cc0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 LITE_WIN32_HAS_A
4cd0: 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 46 75 6c NSI). { "GetFul
4ce0: 6c 50 61 74 68 4e 61 6d 65 41 22 2c 20 20 20 20 lPathNameA",
4cf0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 (SYSCALL)Get
4d00: 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 2c 20 20 FullPathNameA,
4d10: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0 },.#else
4d20: 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 . { "GetFullPat
4d30: 68 4e 61 6d 65 41 22 2c 20 20 20 20 20 20 20 20 hNameA",
4d40: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 (SYSCALL)0,
4d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4d60: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 0 },.#endif..#
4d70: 64 65 66 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c define osGetFull
4d80: 50 61 74 68 4e 61 6d 65 41 20 28 28 44 57 4f 52 PathNameA ((DWOR
4d90: 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 D(WINAPI*)(LPCST
4da0: 52 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c R,DWORD,LPSTR, \
4db0: 0a 20 20 20 20 20 20 20 20 4c 50 53 54 52 2a 29 . LPSTR*)
4dc0: 29 61 53 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 )aSyscall[24].pC
4dd0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 urrent)..#if !SQ
4de0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 LITE_OS_WINCE &&
4df0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 !SQLITE_OS_WINR
4e00: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c T && defined(SQL
4e10: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 ITE_WIN32_HAS_WI
4e20: 44 45 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c DE). { "GetFull
4e30: 50 61 74 68 4e 61 6d 65 57 22 2c 20 20 20 20 20 PathNameW",
4e40: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 (SYSCALL)GetF
4e50: 75 6c 6c 50 61 74 68 4e 61 6d 65 57 2c 20 20 20 ullPathNameW,
4e60: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 0 },.#else.
4e70: 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 { "GetFullPath
4e80: 4e 61 6d 65 57 22 2c 20 20 20 20 20 20 20 20 28 NameW", (
4e90: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 SYSCALL)0,
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4eb0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 0 },.#endif..#d
4ec0: 65 66 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 efine osGetFullP
4ed0: 61 74 68 4e 61 6d 65 57 20 28 28 44 57 4f 52 44 athNameW ((DWORD
4ee0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 (WINAPI*)(LPCWST
4ef0: 52 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20 R,DWORD,LPWSTR,
4f00: 5c 0a 20 20 20 20 20 20 20 20 4c 50 57 53 54 52 \. LPWSTR
4f10: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 32 35 5d 2e *))aSyscall[25].
4f20: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 pCurrent).. { "
4f30: 47 65 74 4c 61 73 74 45 72 72 6f 72 22 2c 20 20 GetLastError",
4f40: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 (SYSCA
4f50: 4c 4c 29 47 65 74 4c 61 73 74 45 72 72 6f 72 2c LL)GetLastError,
4f60: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0 },
4f70: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 4c ..#define osGetL
4f80: 61 73 74 45 72 72 6f 72 20 28 28 44 57 4f 52 44 astError ((DWORD
4f90: 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 (WINAPI*)(VOID))
4fa0: 61 53 79 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 aSyscall[26].pCu
4fb0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 rrent)..#if !def
4fc0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 ined(SQLITE_OMIT
4fd0: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 _LOAD_EXTENSION)
4fe0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 .#if SQLITE_OS_W
4ff0: 49 4e 43 45 0a 20 20 2f 2a 20 54 68 65 20 47 65 INCE. /* The Ge
5000: 74 50 72 6f 63 41 64 64 72 65 73 73 41 28 29 20 tProcAddressA()
5010: 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 routine is only
5020: 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e available on Win
5030: 64 6f 77 73 20 43 45 2e 20 2a 2f 0a 20 20 7b 20 dows CE. */. {
5040: 22 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 "GetProcAddressA
5050: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 ", (SYSC
5060: 41 4c 4c 29 47 65 74 50 72 6f 63 41 64 64 72 65 ALL)GetProcAddre
5070: 73 73 41 2c 20 20 20 20 20 20 20 20 20 30 20 7d ssA, 0 }
5080: 2c 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c ,.#else. /* All
5090: 20 6f 74 68 65 72 20 57 69 6e 64 6f 77 73 20 70 other Windows p
50a0: 6c 61 74 66 6f 72 6d 73 20 65 78 70 65 63 74 20 latforms expect
50b0: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 28 29 GetProcAddress()
50c0: 20 74 6f 20 74 61 6b 65 0a 20 20 2a 2a 20 61 6e to take. ** an
50d0: 20 41 4e 53 49 20 73 74 72 69 6e 67 20 72 65 67 ANSI string reg
50e0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 5f ardless of the _
50f0: 55 4e 49 43 4f 44 45 20 73 65 74 74 69 6e 67 20 UNICODE setting
5100: 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41 */. { "GetProcA
5110: 64 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20 ddressA",
5120: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50 72 (SYSCALL)GetPr
5130: 6f 63 41 64 64 72 65 73 73 2c 20 20 20 20 20 20 ocAddress,
5140: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0 },.#endif.
5150: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 50 72 #else. { "GetPr
5160: 6f 63 41 64 64 72 65 73 73 41 22 2c 20 20 20 20 ocAddressA",
5170: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c (SYSCALL)0,
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5190: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 0 },.#end
51a0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 if..#define osGe
51b0: 74 50 72 6f 63 41 64 64 72 65 73 73 41 20 28 28 tProcAddressA ((
51c0: 46 41 52 50 52 4f 43 28 57 49 4e 41 50 49 2a 29 FARPROC(WINAPI*)
51d0: 28 48 4d 4f 44 55 4c 45 2c 20 5c 0a 20 20 20 20 (HMODULE, \.
51e0: 20 20 20 20 4c 50 43 53 54 52 29 29 61 53 79 73 LPCSTR))aSys
51f0: 63 61 6c 6c 5b 32 37 5d 2e 70 43 75 72 72 65 6e call[27].pCurren
5200: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f t)..#if !SQLITE_
5210: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 OS_WINRT. { "Ge
5220: 74 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 tSystemInfo",
5230: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c (SYSCALL
5240: 29 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 2c 20 )GetSystemInfo,
5250: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 0 },.#
5260: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 53 79 73 else. { "GetSys
5270: 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 temInfo",
5280: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 (SYSCALL)0,
5290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
52a0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 0 },.#endi
52b0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 f..#define osGet
52c0: 53 79 73 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49 SystemInfo ((VOI
52d0: 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 D(WINAPI*)(LPSYS
52e0: 54 45 4d 5f 49 4e 46 4f 29 29 61 53 79 73 63 61 TEM_INFO))aSysca
52f0: 6c 6c 5b 32 38 5d 2e 70 43 75 72 72 65 6e 74 29 ll[28].pCurrent)
5300: 0a 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d .. { "GetSystem
5310: 54 69 6d 65 22 2c 20 20 20 20 20 20 20 20 20 20 Time",
5320: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73 (SYSCALL)GetSys
5330: 74 65 6d 54 69 6d 65 2c 20 20 20 20 20 20 20 20 temTime,
5340: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 0 },..#define
5350: 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 osGetSystemTime
5360: 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 ((VOID(WINAPI*)
5370: 28 4c 50 53 59 53 54 45 4d 54 49 4d 45 29 29 61 (LPSYSTEMTIME))a
5380: 53 79 73 63 61 6c 6c 5b 32 39 5d 2e 70 43 75 72 Syscall[29].pCur
5390: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 rent)..#if !SQLI
53a0: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 TE_OS_WINCE. {
53b0: 22 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 "GetSystemTimeAs
53c0: 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 FileTime", (SYSC
53d0: 41 4c 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d ALL)GetSystemTim
53e0: 65 41 73 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d eAsFileTime, 0 }
53f0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 ,.#else. { "Get
5400: 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 SystemTimeAsFile
5410: 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 Time", (SYSCALL)
5420: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0,
5430: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 0 },.#e
5440: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 ndif..#define os
5450: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 GetSystemTimeAsF
5460: 69 6c 65 54 69 6d 65 20 28 28 56 4f 49 44 28 57 ileTime ((VOID(W
5470: 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 INAPI*)( \.
5480: 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 LPFILETIME))a
5490: 53 79 73 63 61 6c 6c 5b 33 30 5d 2e 70 43 75 72 Syscall[30].pCur
54a0: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e rent)..#if defin
54b0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f ed(SQLITE_WIN32_
54c0: 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 HAS_ANSI). { "G
54d0: 65 74 54 65 6d 70 50 61 74 68 41 22 2c 20 20 20 etTempPathA",
54e0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c (SYSCAL
54f0: 4c 29 47 65 74 54 65 6d 70 50 61 74 68 41 2c 20 L)GetTempPathA,
5500: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0 },.
5510: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54 65 #else. { "GetTe
5520: 6d 70 50 61 74 68 41 22 2c 20 20 20 20 20 20 20 mpPathA",
5530: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c (SYSCALL)0,
5540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5550: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 0 },.#end
5560: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 if..#define osGe
5570: 74 54 65 6d 70 50 61 74 68 41 20 28 28 44 57 4f tTempPathA ((DWO
5580: 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 RD(WINAPI*)(DWOR
5590: 44 2c 4c 50 53 54 52 29 29 61 53 79 73 63 61 6c D,LPSTR))aSyscal
55a0: 6c 5b 33 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a l[31].pCurrent).
55b0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f .#if !SQLITE_OS_
55c0: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 WINRT && defined
55d0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 (SQLITE_WIN32_HA
55e0: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 S_WIDE). { "Get
55f0: 54 65 6d 70 50 61 74 68 57 22 2c 20 20 20 20 20 TempPathW",
5600: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 (SYSCALL)
5610: 47 65 74 54 65 6d 70 50 61 74 68 57 2c 20 20 20 GetTempPathW,
5620: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 0 },.#e
5630: 6c 73 65 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 lse. { "GetTemp
5640: 50 61 74 68 57 22 2c 20 20 20 20 20 20 20 20 20 PathW",
5650: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 (SYSCALL)0,
5660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5670: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0 },.#endif
5680: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 ..#define osGetT
5690: 65 6d 70 50 61 74 68 57 20 28 28 44 57 4f 52 44 empPathW ((DWORD
56a0: 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c (WINAPI*)(DWORD,
56b0: 4c 50 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c LPWSTR))aSyscall
56c0: 5b 33 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a [32].pCurrent)..
56d0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 #if !SQLITE_OS_W
56e0: 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 54 69 63 INRT. { "GetTic
56f0: 6b 43 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 kCount",
5700: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 (SYSCALL)Get
5710: 54 69 63 6b 43 6f 75 6e 74 2c 20 20 20 20 20 20 TickCount,
5720: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0 },.#else
5730: 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 . { "GetTickCou
5740: 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 nt",
5750: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 (SYSCALL)0,
5760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5770: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 0 },.#endif..#
5780: 64 65 66 69 6e 65 20 6f 73 47 65 74 54 69 63 6b define osGetTick
5790: 43 6f 75 6e 74 20 28 28 44 57 4f 52 44 28 57 49 Count ((DWORD(WI
57a0: 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 NAPI*)(VOID))aSy
57b0: 73 63 61 6c 6c 5b 33 33 5d 2e 70 43 75 72 72 65 scall[33].pCurre
57c0: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 nt)..#if defined
57d0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 (SQLITE_WIN32_HA
57e0: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 S_ANSI). { "Get
57f0: 56 65 72 73 69 6f 6e 45 78 41 22 2c 20 20 20 20 VersionExA",
5800: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 (SYSCALL)
5810: 47 65 74 56 65 72 73 69 6f 6e 45 78 41 2c 20 20 GetVersionExA,
5820: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 0 },.#e
5830: 6c 73 65 0a 20 20 7b 20 22 47 65 74 56 65 72 73 lse. { "GetVers
5840: 69 6f 6e 45 78 41 22 2c 20 20 20 20 20 20 20 20 ionExA",
5850: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 (SYSCALL)0,
5860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5870: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0 },.#endif
5880: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 56 ..#define osGetV
5890: 65 72 73 69 6f 6e 45 78 41 20 28 28 42 4f 4f 4c ersionExA ((BOOL
58a0: 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 (WINAPI*)( \.
58b0: 20 20 20 20 20 4c 50 4f 53 56 45 52 53 49 4f 4e LPOSVERSION
58c0: 49 4e 46 4f 41 29 29 61 53 79 73 63 61 6c 6c 5b INFOA))aSyscall[
58d0: 33 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 34].pCurrent)..#
58e0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 if !SQLITE_OS_WI
58f0: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 NRT && defined(S
5900: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f QLITE_WIN32_HAS_
5910: 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 56 65 WIDE). { "GetVe
5920: 72 73 69 6f 6e 45 78 57 22 2c 20 20 20 20 20 20 rsionExW",
5930: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 (SYSCALL)Ge
5940: 74 56 65 72 73 69 6f 6e 45 78 57 2c 20 20 20 20 tVersionExW,
5950: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 0 },.#els
5960: 65 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f e. { "GetVersio
5970: 6e 45 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 nExW",
5980: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 (SYSCALL)0,
5990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59a0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 0 },.#endif..
59b0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 56 65 72 #define osGetVer
59c0: 73 69 6f 6e 45 78 57 20 28 28 42 4f 4f 4c 28 57 sionExW ((BOOL(W
59d0: 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 INAPI*)( \.
59e0: 20 20 20 4c 50 4f 53 56 45 52 53 49 4f 4e 49 4e LPOSVERSIONIN
59f0: 46 4f 57 29 29 61 53 79 73 63 61 6c 6c 5b 33 35 FOW))aSyscall[35
5a00: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b ].pCurrent).. {
5a10: 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20 20 20 "HeapAlloc",
5a20: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 (SYS
5a30: 43 41 4c 4c 29 48 65 61 70 41 6c 6c 6f 63 2c 20 CALL)HeapAlloc,
5a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 0
5a50: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 },..#define osHe
5a60: 61 70 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49 44 apAlloc ((LPVOID
5a70: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 (WINAPI*)(HANDLE
5a80: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 ,DWORD, \.
5a90: 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 SIZE_T))aSysca
5aa0: 6c 6c 5b 33 36 5d 2e 70 43 75 72 72 65 6e 74 29 ll[36].pCurrent)
5ab0: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 ..#if !SQLITE_OS
5ac0: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 _WINRT. { "Heap
5ad0: 43 72 65 61 74 65 22 2c 20 20 20 20 20 20 20 20 Create",
5ae0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 (SYSCALL)H
5af0: 65 61 70 43 72 65 61 74 65 2c 20 20 20 20 20 20 eapCreate,
5b00: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 0 },.#el
5b10: 73 65 0a 20 20 7b 20 22 48 65 61 70 43 72 65 61 se. { "HeapCrea
5b20: 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 te",
5b30: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 (SYSCALL)0,
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5b50: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0 },.#endif.
5b60: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 43 .#define osHeapC
5b70: 72 65 61 74 65 20 28 28 48 41 4e 44 4c 45 28 57 reate ((HANDLE(W
5b80: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 53 49 INAPI*)(DWORD,SI
5b90: 5a 45 5f 54 2c 20 5c 0a 20 20 20 20 20 20 20 20 ZE_T, \.
5ba0: 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c SIZE_T))aSyscall
5bb0: 5b 33 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a [37].pCurrent)..
5bc0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 #if !SQLITE_OS_W
5bd0: 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 44 65 INRT. { "HeapDe
5be0: 73 74 72 6f 79 22 2c 20 20 20 20 20 20 20 20 20 stroy",
5bf0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 (SYSCALL)Hea
5c00: 70 44 65 73 74 72 6f 79 2c 20 20 20 20 20 20 20 pDestroy,
5c10: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0 },.#else
5c20: 0a 20 20 7b 20 22 48 65 61 70 44 65 73 74 72 6f . { "HeapDestro
5c30: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 y",
5c40: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 (SYSCALL)0,
5c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5c60: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 0 },.#endif..#
5c70: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 44 65 73 define osHeapDes
5c80: 74 72 6f 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41 troy ((BOOL(WINA
5c90: 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 PI*)(HANDLE))aSy
5ca0: 73 63 61 6c 6c 5b 33 38 5d 2e 70 43 75 72 72 65 scall[38].pCurre
5cb0: 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 46 72 nt).. { "HeapFr
5cc0: 65 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 ee",
5cd0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 (SYSCALL)Hea
5ce0: 70 46 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 pFree,
5cf0: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 0 },..#def
5d00: 69 6e 65 20 6f 73 48 65 61 70 46 72 65 65 20 28 ine osHeapFree (
5d10: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 (BOOL(WINAPI*)(H
5d20: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f ANDLE,DWORD,LPVO
5d30: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 39 5d ID))aSyscall[39]
5d40: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 .pCurrent).. {
5d50: 22 48 65 61 70 52 65 41 6c 6c 6f 63 22 2c 20 20 "HeapReAlloc",
5d60: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 (SYSC
5d70: 41 4c 4c 29 48 65 61 70 52 65 41 6c 6c 6f 63 2c ALL)HeapReAlloc,
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 0 }
5d90: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 ,..#define osHea
5da0: 70 52 65 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49 pReAlloc ((LPVOI
5db0: 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c D(WINAPI*)(HANDL
5dc0: 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44 2c 20 E,DWORD,LPVOID,
5dd0: 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 \. SIZE_T
5de0: 29 29 61 53 79 73 63 61 6c 6c 5b 34 30 5d 2e 70 ))aSyscall[40].p
5df0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 Current).. { "H
5e00: 65 61 70 53 69 7a 65 22 2c 20 20 20 20 20 20 20 eapSize",
5e10: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c (SYSCAL
5e20: 4c 29 48 65 61 70 53 69 7a 65 2c 20 20 20 20 20 L)HeapSize,
5e30: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0 },.
5e40: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 53 .#define osHeapS
5e50: 69 7a 65 20 28 28 53 49 5a 45 5f 54 28 57 49 4e ize ((SIZE_T(WIN
5e60: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f API*)(HANDLE,DWO
5e70: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 RD, \. LP
5e80: 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b CVOID))aSyscall[
5e90: 34 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 41].pCurrent)..#
5ea0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 if !SQLITE_OS_WI
5eb0: 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 56 61 6c NRT. { "HeapVal
5ec0: 69 64 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 idate",
5ed0: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 (SYSCALL)Heap
5ee0: 56 61 6c 69 64 61 74 65 2c 20 20 20 20 20 20 20 Validate,
5ef0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 0 },.#else.
5f00: 20 20 7b 20 22 48 65 61 70 56 61 6c 69 64 61 74 { "HeapValidat
5f10: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 e", (
5f20: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 SYSCALL)0,
5f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5f40: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 0 },.#endif..#d
5f50: 65 66 69 6e 65 20 6f 73 48 65 61 70 56 61 6c 69 efine osHeapVali
5f60: 64 61 74 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 date ((BOOL(WINA
5f70: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 PI*)(HANDLE,DWOR
5f80: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 D, \. LPC
5f90: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 VOID))aSyscall[4
5fa0: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 2].pCurrent)..#i
5fb0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e f !SQLITE_OS_WIN
5fc0: 52 54 0a 20 20 7b 20 22 48 65 61 70 43 6f 6d 70 RT. { "HeapComp
5fd0: 61 63 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 act",
5fe0: 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 43 (SYSCALL)HeapC
5ff0: 6f 6d 70 61 63 74 2c 20 20 20 20 20 20 20 20 20 ompact,
6000: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 0 },.#else.
6010: 20 7b 20 22 48 65 61 70 43 6f 6d 70 61 63 74 22 { "HeapCompact"
6020: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 , (S
6030: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 YSCALL)0,
6040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6050: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 0 },.#endif..#de
6060: 66 69 6e 65 20 6f 73 48 65 61 70 43 6f 6d 70 61 fine osHeapCompa
6070: 63 74 20 28 28 55 49 4e 54 28 57 49 4e 41 50 49 ct ((UINT(WINAPI
6080: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 29 *)(HANDLE,DWORD)
6090: 29 61 53 79 73 63 61 6c 6c 5b 34 33 5d 2e 70 43 )aSyscall[43].pC
60a0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 urrent)..#if def
60b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 ined(SQLITE_WIN3
60c0: 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20 21 2_HAS_ANSI) && !
60d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f defined(SQLITE_O
60e0: 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 MIT_LOAD_EXTENSI
60f0: 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 ON). { "LoadLib
6100: 72 61 72 79 41 22 2c 20 20 20 20 20 20 20 20 20 raryA",
6110: 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 (SYSCALL)Load
6120: 4c 69 62 72 61 72 79 41 2c 20 20 20 20 20 20 20 LibraryA,
6130: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 0 },.#else.
6140: 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 { "LoadLibrary
6150: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 A", (
6160: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 SYSCALL)0,
6170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6180: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 0 },.#endif..#d
6190: 65 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72 efine osLoadLibr
61a0: 61 72 79 41 20 28 28 48 4d 4f 44 55 4c 45 28 57 aryA ((HMODULE(W
61b0: 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 INAPI*)(LPCSTR))
61c0: 61 53 79 73 63 61 6c 6c 5b 34 34 5d 2e 70 43 75 aSyscall[44].pCu
61d0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c rrent)..#if !SQL
61e0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 ITE_OS_WINRT &&
61f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 defined(SQLITE_W
6200: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26 IN32_HAS_WIDE) &
6210: 26 20 5c 0a 20 20 20 20 20 20 20 20 21 64 65 66 & \. !def
6220: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 ined(SQLITE_OMIT
6230: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 _LOAD_EXTENSION)
6240: 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 . { "LoadLibrar
6250: 79 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 yW",
6260: 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62 (SYSCALL)LoadLib
6270: 72 61 72 79 57 2c 20 20 20 20 20 20 20 20 20 20 raryW,
6280: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 0 },.#else. {
6290: 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c "LoadLibraryW",
62a0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 (SYS
62b0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 CALL)0,
62c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 0
62d0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 },.#endif..#defi
62e0: 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 ne osLoadLibrary
62f0: 57 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41 W ((HMODULE(WINA
6300: 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 PI*)(LPCWSTR))aS
6310: 79 73 63 61 6c 6c 5b 34 35 5d 2e 70 43 75 72 72 yscall[45].pCurr
6320: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 ent)..#if !SQLIT
6330: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 E_OS_WINRT. { "
6340: 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20 20 20 20 LocalFree",
6350: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 (SYSCA
6360: 4c 4c 29 4c 6f 63 61 6c 46 72 65 65 2c 20 20 20 LL)LocalFree,
6370: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0 },
6380: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 61 .#else. { "Loca
6390: 6c 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20 lFree",
63a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 (SYSCALL)0
63b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
63c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 0 },.#en
63d0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c dif..#define osL
63e0: 6f 63 61 6c 46 72 65 65 20 28 28 48 4c 4f 43 41 ocalFree ((HLOCA
63f0: 4c 28 57 49 4e 41 50 49 2a 29 28 48 4c 4f 43 41 L(WINAPI*)(HLOCA
6400: 4c 29 29 61 53 79 73 63 61 6c 6c 5b 34 36 5d 2e L))aSyscall[46].
6410: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 pCurrent)..#if !
6420: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 SQLITE_OS_WINCE
6430: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 && !SQLITE_OS_WI
6440: 4e 52 54 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c NRT. { "LockFil
6450: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 e",
6460: 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b (SYSCALL)Lock
6470: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 File,
6480: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 0 },.#else.
6490: 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 { "LockFile",
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 (
64b0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 SYSCALL)0,
64c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
64d0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 0 },.#endif..#i
64e0: 66 6e 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 fndef osLockFile
64f0: 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 .#define osLockF
6500: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 ile ((BOOL(WINAP
6510: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 I*)(HANDLE,DWORD
6520: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a ,DWORD,DWORD, \.
6530: 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 DWORD))a
6540: 53 79 73 63 61 6c 6c 5b 34 37 5d 2e 70 43 75 72 Syscall[47].pCur
6550: 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 rent).#endif..#i
6560: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e f !SQLITE_OS_WIN
6570: 43 45 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 CE. { "LockFile
6580: 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 Ex",
6590: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 (SYSCALL)LockF
65a0: 69 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20 20 ileEx,
65b0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 0 },.#else.
65c0: 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c { "LockFileEx",
65d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 (S
65e0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 YSCALL)0,
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6600: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 0 },.#endif..#if
6610: 6e 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 ndef osLockFileE
6620: 78 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b x.#define osLock
6630: 46 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 FileEx ((BOOL(WI
6640: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 NAPI*)(HANDLE,DW
6650: 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c ORD,DWORD,DWORD,
6660: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 DWORD, \.
6670: 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 LPOVERLAPPED))a
6680: 53 79 73 63 61 6c 6c 5b 34 38 5d 2e 70 43 75 72 Syscall[48].pCur
6690: 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 rent).#endif..#i
66a0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 f SQLITE_OS_WINC
66b0: 45 20 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53 E || (!SQLITE_OS
66c0: 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e _WINRT && !defin
66d0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 ed(SQLITE_OMIT_W
66e0: 41 4c 29 29 0a 20 20 7b 20 22 4d 61 70 56 69 65 AL)). { "MapVie
66f0: 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 wOfFile",
6700: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 61 70 (SYSCALL)Map
6710: 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 ViewOfFile,
6720: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0 },.#else
6730: 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 . { "MapViewOfF
6740: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 ile",
6750: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 (SYSCALL)0,
6760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6770: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 0 },.#endif..#
6780: 64 65 66 69 6e 65 20 6f 73 4d 61 70 56 69 65 77 define osMapView
6790: 4f 66 46 69 6c 65 20 28 28 4c 50 56 4f 49 44 28 OfFile ((LPVOID(
67a0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c WINAPI*)(HANDLE,
67b0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 DWORD,DWORD,DWOR
67c0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a D, \. SIZ
67d0: 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 34 39 E_T))aSyscall[49
67e0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b ].pCurrent).. {
67f0: 20 22 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 "MultiByteToWid
6800: 65 43 68 61 72 22 2c 20 20 20 20 20 28 53 59 53 eChar", (SYS
6810: 43 41 4c 4c 29 4d 75 6c 74 69 42 79 74 65 54 6f CALL)MultiByteTo
6820: 57 69 64 65 43 68 61 72 2c 20 20 20 20 20 30 20 WideChar, 0
6830: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 75 },..#define osMu
6840: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 ltiByteToWideCha
6850: 72 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a 29 r ((int(WINAPI*)
6860: 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 53 (UINT,DWORD,LPCS
6870: 54 52 2c 69 6e 74 2c 4c 50 57 53 54 52 2c 20 5c TR,int,LPWSTR, \
6880: 0a 20 20 20 20 20 20 20 20 69 6e 74 29 29 61 53 . int))aS
6890: 79 73 63 61 6c 6c 5b 35 30 5d 2e 70 43 75 72 72 yscall[50].pCurr
68a0: 65 6e 74 29 0a 0a 20 20 7b 20 22 51 75 65 72 79 ent).. { "Query
68b0: 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 PerformanceCount
68c0: 65 72 22 2c 20 28 53 59 53 43 41 4c 4c 29 51 75 er", (SYSCALL)Qu
68d0: 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f eryPerformanceCo
68e0: 75 6e 74 65 72 2c 20 30 20 7d 2c 0a 0a 23 64 65 unter, 0 },..#de
68f0: 66 69 6e 65 20 6f 73 51 75 65 72 79 50 65 72 66 fine osQueryPerf
6900: 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20 28 ormanceCounter (
6910: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 (BOOL(WINAPI*)(
6920: 5c 0a 20 20 20 20 20 20 20 20 4c 41 52 47 45 5f \. LARGE_
6930: 49 4e 54 45 47 45 52 2a 29 29 61 53 79 73 63 61 INTEGER*))aSysca
6940: 6c 6c 5b 35 31 5d 2e 70 43 75 72 72 65 6e 74 29 ll[51].pCurrent)
6950: 0a 0a 20 20 7b 20 22 52 65 61 64 46 69 6c 65 22 .. { "ReadFile"
6960: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
6970: 20 28 53 59 53 43 41 4c 4c 29 52 65 61 64 46 69 (SYSCALL)ReadFi
6980: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 le,
6990: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 0 },..#define
69a0: 20 6f 73 52 65 61 64 46 69 6c 65 20 28 28 42 4f osReadFile ((BO
69b0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 OL(WINAPI*)(HAND
69c0: 4c 45 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 2c LE,LPVOID,DWORD,
69d0: 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 LPDWORD, \.
69e0: 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 LPOVERLAPPED)
69f0: 29 61 53 79 73 63 61 6c 6c 5b 35 32 5d 2e 70 43 )aSyscall[52].pC
6a00: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 65 urrent).. { "Se
6a10: 74 45 6e 64 4f 66 46 69 6c 65 22 2c 20 20 20 20 tEndOfFile",
6a20: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c (SYSCALL
6a30: 29 53 65 74 45 6e 64 4f 66 46 69 6c 65 2c 20 20 )SetEndOfFile,
6a40: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 0 },..
6a50: 23 64 65 66 69 6e 65 20 6f 73 53 65 74 45 6e 64 #define osSetEnd
6a60: 4f 66 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 OfFile ((BOOL(WI
6a70: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 NAPI*)(HANDLE))a
6a80: 53 79 73 63 61 6c 6c 5b 35 33 5d 2e 70 43 75 72 Syscall[53].pCur
6a90: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 rent)..#if !SQLI
6aa0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 TE_OS_WINRT. {
6ab0: 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 22 "SetFilePointer"
6ac0: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 , (SYSC
6ad0: 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e 74 ALL)SetFilePoint
6ae0: 65 72 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d er, 0 }
6af0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 65 74 ,.#else. { "Set
6b00: 46 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20 20 FilePointer",
6b10: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 (SYSCALL)
6b20: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0,
6b30: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 0 },.#e
6b40: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 ndif..#define os
6b50: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 20 28 SetFilePointer (
6b60: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 (DWORD(WINAPI*)(
6b70: 48 41 4e 44 4c 45 2c 4c 4f 4e 47 2c 50 4c 4f 4e HANDLE,LONG,PLON
6b80: 47 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f G, \. DWO
6b90: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 34 5d RD))aSyscall[54]
6ba0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 .pCurrent)..#if
6bb0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 !SQLITE_OS_WINRT
6bc0: 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c 20 20 20 . { "Sleep",
6bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6be0: 28 53 59 53 43 41 4c 4c 29 53 6c 65 65 70 2c 20 (SYSCALL)Sleep,
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6c00: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 0 },.#else. {
6c10: 20 22 53 6c 65 65 70 22 2c 20 20 20 20 20 20 20 "Sleep",
6c20: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 (SYS
6c30: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 CALL)0,
6c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 0
6c50: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 },.#endif..#defi
6c60: 6e 65 20 6f 73 53 6c 65 65 70 20 28 28 56 4f 49 ne osSleep ((VOI
6c70: 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 D(WINAPI*)(DWORD
6c80: 29 29 61 53 79 73 63 61 6c 6c 5b 35 35 5d 2e 70 ))aSyscall[55].p
6c90: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 Current).. { "S
6ca0: 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 ystemTimeToFileT
6cb0: 69 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c ime", (SYSCAL
6cc0: 4c 29 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 L)SystemTimeToFi
6cd0: 6c 65 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a leTime, 0 },.
6ce0: 0a 23 64 65 66 69 6e 65 20 6f 73 53 79 73 74 65 .#define osSyste
6cf0: 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 20 mTimeToFileTime
6d00: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 ((BOOL(WINAPI*)(
6d10: 43 4f 4e 53 54 20 53 59 53 54 45 4d 54 49 4d 45 CONST SYSTEMTIME
6d20: 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 *, \. LPF
6d30: 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c ILETIME))aSyscal
6d40: 6c 5b 35 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a l[56].pCurrent).
6d50: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f .#if !SQLITE_OS_
6d60: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 WINCE && !SQLITE
6d70: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 55 _OS_WINRT. { "U
6d80: 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 nlockFile",
6d90: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c (SYSCAL
6da0: 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 2c 20 20 20 L)UnlockFile,
6db0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0 },.
6dc0: 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 #else. { "Unloc
6dd0: 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 kFile",
6de0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c (SYSCALL)0,
6df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6e00: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 0 },.#end
6e10: 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 55 6e if..#ifndef osUn
6e20: 6c 6f 63 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65 lockFile.#define
6e30: 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 20 28 28 osUnlockFile ((
6e40: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 BOOL(WINAPI*)(HA
6e50: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 NDLE,DWORD,DWORD
6e60: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 ,DWORD, \.
6e70: 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c DWORD))aSyscal
6e80: 6c 5b 35 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a l[57].pCurrent).
6e90: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c #endif..#if !SQL
6ea0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b ITE_OS_WINCE. {
6eb0: 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c "UnlockFileEx",
6ec0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 (SYS
6ed0: 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 45 CALL)UnlockFileE
6ee0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 x, 0
6ef0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e },.#else. { "Un
6f00: 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 lockFileEx",
6f10: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c (SYSCALL
6f20: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 )0,
6f30: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 0 },.#
6f40: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f endif..#define o
6f50: 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 20 28 28 sUnlockFileEx ((
6f60: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 BOOL(WINAPI*)(HA
6f70: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 NDLE,DWORD,DWORD
6f80: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 ,DWORD, \.
6f90: 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 LPOVERLAPPED))
6fa0: 61 53 79 73 63 61 6c 6c 5b 35 38 5d 2e 70 43 75 aSyscall[58].pCu
6fb0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 rrent)..#if SQLI
6fc0: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 21 TE_OS_WINCE || !
6fd0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f defined(SQLITE_O
6fe0: 4d 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22 55 6e MIT_WAL). { "Un
6ff0: 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 mapViewOfFile",
7000: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c (SYSCALL
7010: 29 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 )UnmapViewOfFile
7020: 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 , 0 },.#
7030: 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6d 61 70 56 else. { "UnmapV
7040: 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 iewOfFile",
7050: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 (SYSCALL)0,
7060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7070: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 0 },.#endi
7080: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6d f..#define osUnm
7090: 61 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28 42 apViewOfFile ((B
70a0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 OOL(WINAPI*)(LPC
70b0: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 VOID))aSyscall[5
70c0: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 9].pCurrent)..
70d0: 7b 20 22 57 69 64 65 43 68 61 72 54 6f 4d 75 6c { "WideCharToMul
70e0: 74 69 42 79 74 65 22 2c 20 20 20 20 20 28 53 59 tiByte", (SY
70f0: 53 43 41 4c 4c 29 57 69 64 65 43 68 61 72 54 6f SCALL)WideCharTo
7100: 4d 75 6c 74 69 42 79 74 65 2c 20 20 20 20 20 30 MultiByte, 0
7110: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 },..#define osW
7120: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 ideCharToMultiBy
7130: 74 65 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a te ((int(WINAPI*
7140: 29 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 )(UINT,DWORD,LPC
7150: 57 53 54 52 2c 69 6e 74 2c 4c 50 53 54 52 2c 69 WSTR,int,LPSTR,i
7160: 6e 74 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 nt, \. LP
7170: 43 53 54 52 2c 4c 50 42 4f 4f 4c 29 29 61 53 79 CSTR,LPBOOL))aSy
7180: 73 63 61 6c 6c 5b 36 30 5d 2e 70 43 75 72 72 65 scall[60].pCurre
7190: 6e 74 29 0a 0a 20 20 7b 20 22 57 72 69 74 65 46 nt).. { "WriteF
71a0: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 ile",
71b0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 72 69 (SYSCALL)Wri
71c0: 74 65 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 teFile,
71d0: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 0 },..#def
71e0: 69 6e 65 20 6f 73 57 72 69 74 65 46 69 6c 65 20 ine osWriteFile
71f0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 ((BOOL(WINAPI*)(
7200: 48 41 4e 44 4c 45 2c 4c 50 43 56 4f 49 44 2c 44 HANDLE,LPCVOID,D
7210: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a WORD,LPDWORD, \.
7220: 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 LPOVERLA
7230: 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 PPED))aSyscall[6
7240: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 1].pCurrent)..#i
7250: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 f SQLITE_OS_WINR
7260: 54 0a 20 20 7b 20 22 43 72 65 61 74 65 45 76 65 T. { "CreateEve
7270: 6e 74 45 78 57 22 2c 20 20 20 20 20 20 20 20 20 ntExW",
7280: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 (SYSCALL)Create
7290: 45 76 65 6e 74 45 78 57 2c 20 20 20 20 20 20 20 EventExW,
72a0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 0 },.#else.
72b0: 7b 20 22 43 72 65 61 74 65 45 76 65 6e 74 45 78 { "CreateEventEx
72c0: 57 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 W", (SY
72d0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 SCALL)0,
72e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0
72f0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 },.#endif..#def
7300: 69 6e 65 20 6f 73 43 72 65 61 74 65 45 76 65 6e ine osCreateEven
7310: 74 45 78 57 20 28 28 48 41 4e 44 4c 45 28 57 49 tExW ((HANDLE(WI
7320: 4e 41 50 49 2a 29 28 4c 50 53 45 43 55 52 49 54 NAPI*)(LPSECURIT
7330: 59 5f 41 54 54 52 49 42 55 54 45 53 2c 4c 50 43 Y_ATTRIBUTES,LPC
7340: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 WSTR, \.
7350: 44 57 4f 52 44 2c 44 57 4f 52 44 29 29 61 53 79 DWORD,DWORD))aSy
7360: 73 63 61 6c 6c 5b 36 32 5d 2e 70 43 75 72 72 65 scall[62].pCurre
7370: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 nt)..#if !SQLITE
7380: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 57 _OS_WINRT. { "W
7390: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 aitForSingleObje
73a0: 63 74 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c ct", (SYSCAL
73b0: 4c 29 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f L)WaitForSingleO
73c0: 62 6a 65 63 74 2c 20 20 20 20 20 30 20 7d 2c 0a bject, 0 },.
73d0: 23 65 6c 73 65 0a 20 20 7b 20 22 57 61 69 74 46 #else. { "WaitF
73e0: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 22 2c orSingleObject",
73f0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c (SYSCALL)0,
7400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7410: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 0 },.#end
7420: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 if..#define osWa
7430: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 itForSingleObjec
7440: 74 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 t ((DWORD(WINAPI
7450: 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 *)(HANDLE, \.
7460: 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 DWORD))aSys
7470: 63 61 6c 6c 5b 36 33 5d 2e 70 43 75 72 72 65 6e call[63].pCurren
7480: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f t)..#if SQLITE_O
7490: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 57 61 69 S_WINRT. { "Wai
74a0: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 tForSingleObject
74b0: 45 78 22 2c 20 20 20 28 53 59 53 43 41 4c 4c 29 Ex", (SYSCALL)
74c0: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a WaitForSingleObj
74d0: 65 63 74 45 78 2c 20 20 20 30 20 7d 2c 0a 23 65 ectEx, 0 },.#e
74e0: 6c 73 65 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 lse. { "WaitFor
74f0: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c SingleObjectEx",
7500: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 (SYSCALL)0,
7510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7520: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0 },.#endif
7530: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 69 74 ..#define osWait
7540: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 ForSingleObjectE
7550: 78 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 x ((DWORD(WINAPI
7560: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c *)(HANDLE,DWORD,
7570: 20 5c 0a 20 20 20 20 20 20 20 20 42 4f 4f 4c 29 \. BOOL)
7580: 29 61 53 79 73 63 61 6c 6c 5b 36 34 5d 2e 70 43 )aSyscall[64].pC
7590: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c urrent)..#if SQL
75a0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b ITE_OS_WINRT. {
75b0: 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 "SetFilePointer
75c0: 45 78 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 Ex", (SYS
75d0: 43 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e CALL)SetFilePoin
75e0: 74 65 72 45 78 2c 20 20 20 20 20 20 20 20 30 20 terEx, 0
75f0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 65 },.#else. { "Se
7600: 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c tFilePointerEx",
7610: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c (SYSCALL
7620: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 )0,
7630: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 0 },.#
7640: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f endif..#define o
7650: 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 sSetFilePointerE
7660: 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a x ((BOOL(WINAPI*
7670: 29 28 48 41 4e 44 4c 45 2c 4c 41 52 47 45 5f 49 )(HANDLE,LARGE_I
7680: 4e 54 45 47 45 52 2c 20 5c 0a 20 20 20 20 20 20 NTEGER, \.
7690: 20 20 50 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 PLARGE_INTEGER
76a0: 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c ,DWORD))aSyscall
76b0: 5b 36 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a [65].pCurrent)..
76c0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 #if SQLITE_OS_WI
76d0: 4e 52 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 NRT. { "GetFile
76e0: 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e InformationByHan
76f0: 64 6c 65 45 78 22 2c 20 28 53 59 53 43 41 4c 4c dleEx", (SYSCALL
7700: 29 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 )GetFileInformat
7710: 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 2c 20 30 ionByHandleEx, 0
7720: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 },.#else. { "G
7730: 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f etFileInformatio
7740: 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28 53 nByHandleEx", (S
7750: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 YSCALL)0,
7760: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0 },.
7770: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 #endif..#define
7780: 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 osGetFileInforma
7790: 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 20 28 tionByHandleEx (
77a0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 (BOOL(WINAPI*)(H
77b0: 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 ANDLE, \.
77c0: 20 46 49 4c 45 5f 49 4e 46 4f 5f 42 59 5f 48 41 FILE_INFO_BY_HA
77d0: 4e 44 4c 45 5f 43 4c 41 53 53 2c 4c 50 56 4f 49 NDLE_CLASS,LPVOI
77e0: 44 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c D,DWORD))aSyscal
77f0: 6c 5b 36 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a l[66].pCurrent).
7800: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 .#if SQLITE_OS_W
7810: 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 INRT && !defined
7820: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c (SQLITE_OMIT_WAL
7830: 29 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 ). { "MapViewOf
7840: 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20 20 FileFromApp",
7850: 20 28 53 59 53 43 41 4c 4c 29 4d 61 70 56 69 65 (SYSCALL)MapVie
7860: 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 2c 20 wOfFileFromApp,
7870: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 0 },.#else.
7880: 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 { "MapViewOfFile
7890: 46 72 6f 6d 41 70 70 22 2c 20 20 20 20 28 53 59 FromApp", (SY
78a0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 SCALL)0,
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0
78c0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 },.#endif..#def
78d0: 69 6e 65 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 ine osMapViewOfF
78e0: 69 6c 65 46 72 6f 6d 41 70 70 20 28 28 4c 50 56 ileFromApp ((LPV
78f0: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e OID(WINAPI*)(HAN
7900: 44 4c 45 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 DLE,ULONG,ULONG6
7910: 34 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 4, \. SIZ
7920: 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 36 37 E_T))aSyscall[67
7930: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 ].pCurrent)..#if
7940: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 SQLITE_OS_WINRT
7950: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 . { "CreateFile
7960: 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2",
7970: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 (SYSCALL)CreateF
7980: 69 6c 65 32 2c 20 20 20 20 20 20 20 20 20 20 20 ile2,
7990: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 0 },.#else. {
79a0: 20 22 43 72 65 61 74 65 46 69 6c 65 32 22 2c 20 "CreateFile2",
79b0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 (SYS
79c0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 CALL)0,
79d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 0
79e0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 },.#endif..#defi
79f0: 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 32 ne osCreateFile2
7a00: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 ((HANDLE(WINAPI
7a10: 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 *)(LPCWSTR,DWORD
7a20: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a ,DWORD,DWORD, \.
7a30: 20 20 20 20 20 20 20 20 4c 50 43 52 45 41 54 45 LPCREATE
7a40: 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 FILE2_EXTENDED_P
7a50: 41 52 41 4d 45 54 45 52 53 29 29 61 53 79 73 63 ARAMETERS))aSysc
7a60: 61 6c 6c 5b 36 38 5d 2e 70 43 75 72 72 65 6e 74 all[68].pCurrent
7a70: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 )..#if SQLITE_OS
7a80: 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e _WINRT && !defin
7a90: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c ed(SQLITE_OMIT_L
7aa0: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 OAD_EXTENSION).
7ab0: 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67 65 64 { "LoadPackaged
7ac0: 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 28 53 Library", (S
7ad0: 59 53 43 41 4c 4c 29 4c 6f 61 64 50 61 63 6b 61 YSCALL)LoadPacka
7ae0: 67 65 64 4c 69 62 72 61 72 79 2c 20 20 20 20 20 gedLibrary,
7af0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 0 },.#else. { "
7b00: 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 LoadPackagedLibr
7b10: 61 72 79 22 2c 20 20 20 20 20 28 53 59 53 43 41 ary", (SYSCA
7b20: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 LL)0,
7b30: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0 },
7b40: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 .#endif..#define
7b50: 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c osLoadPackagedL
7b60: 69 62 72 61 72 79 20 28 28 48 4d 4f 44 55 4c 45 ibrary ((HMODULE
7b70: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 (WINAPI*)(LPCWST
7b80: 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f R, \. DWO
7b90: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 39 5d RD))aSyscall[69]
7ba0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 .pCurrent)..#if
7bb0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a SQLITE_OS_WINRT.
7bc0: 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e { "GetTickCoun
7bd0: 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 28 t64", (
7be0: 53 59 53 43 41 4c 4c 29 47 65 74 54 69 63 6b 43 SYSCALL)GetTickC
7bf0: 6f 75 6e 74 36 34 2c 20 20 20 20 20 20 20 20 20 ount64,
7c00: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 0 },.#else. {
7c10: 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 22 "GetTickCount64"
7c20: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 , (SYSC
7c30: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 ALL)0,
7c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 0 }
7c50: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e ,.#endif..#defin
7c60: 65 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 e osGetTickCount
7c70: 36 34 20 28 28 55 4c 4f 4e 47 4c 4f 4e 47 28 57 64 ((ULONGLONG(W
7c80: 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 INAPI*)(VOID))aS
7c90: 79 73 63 61 6c 6c 5b 37 30 5d 2e 70 43 75 72 72 yscall[70].pCurr
7ca0: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 ent)..#if SQLITE
7cb0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 _OS_WINRT. { "G
7cc0: 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e etNativeSystemIn
7cd0: 66 6f 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c fo", (SYSCAL
7ce0: 4c 29 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 L)GetNativeSyste
7cf0: 6d 49 6e 66 6f 2c 20 20 20 20 20 30 20 7d 2c 0a mInfo, 0 },.
7d00: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 4e 61 #else. { "GetNa
7d10: 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 22 2c tiveSystemInfo",
7d20: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c (SYSCALL)0,
7d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7d40: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 0 },.#end
7d50: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 if..#define osGe
7d60: 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 tNativeSystemInf
7d70: 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a o ((VOID(WINAPI*
7d80: 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 )( \. LPS
7d90: 59 53 54 45 4d 5f 49 4e 46 4f 29 29 61 53 79 73 YSTEM_INFO))aSys
7da0: 63 61 6c 6c 5b 37 31 5d 2e 70 43 75 72 72 65 6e call[71].pCurren
7db0: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 t)..#if defined(
7dc0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 SQLITE_WIN32_HAS
7dd0: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 4f 75 74 70 _ANSI). { "Outp
7de0: 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 22 2c utDebugStringA",
7df0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4f (SYSCALL)O
7e00: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 utputDebugString
7e10: 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c A, 0 },.#el
7e20: 73 65 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 se. { "OutputDe
7e30: 62 75 67 53 74 72 69 6e 67 41 22 2c 20 20 20 20 bugStringA",
7e40: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 (SYSCALL)0,
7e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7e60: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0 },.#endif.
7e70: 0a 23 64 65 66 69 6e 65 20 6f 73 4f 75 74 70 75 .#define osOutpu
7e80: 74 44 65 62 75 67 53 74 72 69 6e 67 41 20 28 28 tDebugStringA ((
7e90: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 VOID(WINAPI*)(LP
7ea0: 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 CSTR))aSyscall[7
7eb0: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 2].pCurrent)..#i
7ec0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 f defined(SQLITE
7ed0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 _WIN32_HAS_WIDE)
7ee0: 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75 . { "OutputDebu
7ef0: 67 53 74 72 69 6e 67 57 22 2c 20 20 20 20 20 20 gStringW",
7f00: 28 53 59 53 43 41 4c 4c 29 4f 75 74 70 75 74 44 (SYSCALL)OutputD
7f10: 65 62 75 67 53 74 72 69 6e 67 57 2c 20 20 20 20 ebugStringW,
7f20: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 0 },.#else. {
7f30: 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 "OutputDebugStr
7f40: 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 ingW", (SYS
7f50: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 CALL)0,
7f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 0
7f70: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 },.#endif..#defi
7f80: 6e 65 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 ne osOutputDebug
7f90: 53 74 72 69 6e 67 57 20 28 28 56 4f 49 44 28 57 StringW ((VOID(W
7fa0: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 INAPI*)(LPCWSTR)
7fb0: 29 61 53 79 73 63 61 6c 6c 5b 37 33 5d 2e 70 43 )aSyscall[73].pC
7fc0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 urrent).. { "Ge
7fd0: 74 50 72 6f 63 65 73 73 48 65 61 70 22 2c 20 20 tProcessHeap",
7fe0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c (SYSCALL
7ff0: 29 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 2c )GetProcessHeap,
8000: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 0 },..
8010: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 50 72 6f #define osGetPro
8020: 63 65 73 73 48 65 61 70 20 28 28 48 41 4e 44 4c cessHeap ((HANDL
8030: 45 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 E(WINAPI*)(VOID)
8040: 29 61 53 79 73 63 61 6c 6c 5b 37 34 5d 2e 70 43 )aSyscall[74].pC
8050: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c urrent)..#if SQL
8060: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 ITE_OS_WINRT &&
8070: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f !defined(SQLITE_
8080: 4f 4d 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22 43 OMIT_WAL). { "C
8090: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 reateFileMapping
80a0: 46 72 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41 FromApp", (SYSCA
80b0: 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70 LL)CreateFileMap
80c0: 70 69 6e 67 46 72 6f 6d 41 70 70 2c 20 30 20 7d pingFromApp, 0 }
80d0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 ,.#else. { "Cre
80e0: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 ateFileMappingFr
80f0: 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c 4c omApp", (SYSCALL
8100: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 )0,
8110: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 0 },.#e
8120: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 ndif..#define os
8130: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e CreateFileMappin
8140: 67 46 72 6f 6d 41 70 70 20 28 28 48 41 4e 44 4c gFromApp ((HANDL
8150: 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c E(WINAPI*)(HANDL
8160: 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 E, \. LPS
8170: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 ECURITY_ATTRIBUT
8180: 45 53 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34 ES,ULONG,ULONG64
8190: 2c 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 ,LPCWSTR))aSysca
81a0: 6c 6c 5b 37 35 5d 2e 70 43 75 72 72 65 6e 74 29 ll[75].pCurrent)
81b0: 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 ..}; /* End of t
81c0: 68 65 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 he overrideable
81d0: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a system calls */.
81e0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 ./*.** This is t
81f0: 68 65 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c he xSetSystemCal
8200: 6c 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 l() method of sq
8210: 6c 69 74 65 33 5f 76 66 73 20 66 6f 72 20 61 6c lite3_vfs for al
8220: 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 22 77 69 6e l of the.** "win
8230: 33 32 22 20 56 46 53 65 73 2e 20 20 52 65 74 75 32" VFSes. Retu
8240: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f rn SQLITE_OK opo
8250: 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 75 n successfully u
8260: 70 64 61 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73 pdating the.** s
8270: 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 ystem call point
8280: 65 72 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f er, or SQLITE_NO
8290: 54 46 4f 55 4e 44 20 69 66 20 74 68 65 72 65 20 TFOUND if there
82a0: 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62 is no configurab
82b0: 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c le.** system cal
82c0: 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a l named zName..*
82d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e /.static int win
82e0: 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 SetSystemCall(.
82f0: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e sqlite3_vfs *pN
8300: 6f 74 55 73 65 64 2c 20 20 20 20 20 20 20 20 2f otUsed, /
8310: 2a 20 54 68 65 20 56 46 53 20 70 6f 69 6e 74 65 * The VFS pointe
8320: 72 2e 20 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a r. Not used */.
8330: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e const char *zN
8340: 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 ame,
8350: 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 /* Name of syste
8360: 6d 20 63 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 m call to overri
8370: 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f de */. sqlite3_
8380: 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 syscall_ptr pNew
8390: 46 75 6e 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 Func /* Pointer
83a0: 20 74 6f 20 6e 65 77 20 73 79 73 74 65 6d 20 63 to new system c
83b0: 61 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a all value */.){.
83c0: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 unsigned int i
83d0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c ;. int rc = SQL
83e0: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 ITE_NOTFOUND;..
83f0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 UNUSED_PARAMETE
8400: 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 R(pNotUsed);. i
8410: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 f( zName==0 ){.
8420: 20 20 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d /* If no zNam
8430: 65 20 69 73 20 67 69 76 65 6e 2c 20 72 65 73 74 e is given, rest
8440: 6f 72 65 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 ore all system c
8450: 61 6c 6c 73 20 74 6f 20 74 68 65 69 72 20 64 65 alls to their de
8460: 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 fault. ** set
8470: 74 69 6e 67 73 20 61 6e 64 20 72 65 74 75 72 6e tings and return
8480: 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 NULL. */.
8490: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b rc = SQLITE_OK;
84a0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c . for(i=0; i<
84b0: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 sizeof(aSyscall)
84c0: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c /sizeof(aSyscall
84d0: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 [0]); i++){.
84e0: 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 if( aSyscall[i
84f0: 5d 2e 70 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 ].pDefault ){.
8500: 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 aSyscall[i
8510: 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 61 53 79 ].pCurrent = aSy
8520: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c scall[i].pDefaul
8530: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d t;. }. }
8540: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a . }else{. /*
8550: 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 If zName is spe
8560: 63 69 66 69 65 64 2c 20 6f 70 65 72 61 74 65 20 cified, operate
8570: 6f 6e 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 on only the one
8580: 73 79 73 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 system call.
8590: 2a 2a 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 ** specified..
85a0: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 */. for(i=0
85b0: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 ; i<sizeof(aSysc
85c0: 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 all)/sizeof(aSys
85d0: 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a call[0]); i++){.
85e0: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 if( strcmp
85f0: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c (zName, aSyscall
8600: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b [i].zName)==0 ){
8610: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 53 79 . if( aSy
8620: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c scall[i].pDefaul
8630: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 t==0 ){.
8640: 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 aSyscall[i].pD
8650: 65 66 61 75 6c 74 20 3d 20 61 53 79 73 63 61 6c efault = aSyscal
8660: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 l[i].pCurrent;.
8670: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
8680: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b rc = SQLITE_OK;
8690: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 . if( pNe
86a0: 77 46 75 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 wFunc==0 ) pNewF
86b0: 75 6e 63 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 unc = aSyscall[i
86c0: 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 ].pDefault;.
86d0: 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e aSyscall[i].
86e0: 70 43 75 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 pCurrent = pNewF
86f0: 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 unc;. bre
8700: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 ak;. }.
8710: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 }. }. return r
8720: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 c;.}../*.** Retu
8730: 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 rn the value of
8740: 61 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 a system call.
8750: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a Return NULL if z
8760: 4e 61 6d 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a Name is not a.**
8770: 20 72 65 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 recognized syst
8780: 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e em call name. N
8790: 55 4c 4c 20 69 73 20 61 6c 73 6f 20 72 65 74 75 ULL is also retu
87a0: 72 6e 65 64 20 69 66 20 74 68 65 20 73 79 73 74 rned if the syst
87b0: 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 em call.** is cu
87c0: 72 72 65 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 rrently undefine
87d0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c d..*/.static sql
87e0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 ite3_syscall_ptr
87f0: 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c winGetSystemCal
8800: 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 l(. sqlite3_vfs
8810: 20 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f *pNotUsed,. co
8820: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a nst char *zName.
8830: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e ){. unsigned in
8840: 74 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 t i;.. UNUSED_P
8850: 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 ARAMETER(pNotUse
8860: 64 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 d);. for(i=0; i
8870: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c <sizeof(aSyscall
8880: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c )/sizeof(aSyscal
8890: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 l[0]); i++){.
88a0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d if( strcmp(zNam
88b0: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a e, aSyscall[i].z
88c0: 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 Name)==0 ) retur
88d0: 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 n aSyscall[i].pC
88e0: 75 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 urrent;. }. re
88f0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a turn 0;.}../*.**
8900: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 Return the name
8910: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79 of the first sy
8920: 73 74 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 stem call after
8930: 7a 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 zName. If zName
8940: 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 ==NULL.** then r
8950: 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f eturn the name o
8960: 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74 f the first syst
8970: 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e em call. Return
8980: 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a NULL if zName.*
8990: 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20 73 79 * is the last sy
89a0: 73 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 stem call or if
89b0: 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 zName is not the
89c0: 20 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 name of a valid
89d0: 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e .** system call.
89e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 .*/.static const
89f0: 20 63 68 61 72 20 2a 77 69 6e 4e 65 78 74 53 79 char *winNextSy
8a00: 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 stemCall(sqlite3
8a10: 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 _vfs *p, const c
8a20: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 har *zName){. i
8a30: 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e nt i = -1;.. UN
8a40: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 USED_PARAMETER(p
8a50: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 );. if( zName )
8a60: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 {. for(i=0; i
8a70: 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 <ArraySize(aSysc
8a80: 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 all)-1; i++){.
8a90: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a if( strcmp(z
8aa0: 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 Name, aSyscall[i
8ab0: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 ].zName)==0 ) br
8ac0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 eak;. }. }.
8ad0: 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 for(i++; i<Arra
8ae0: 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b ySize(aSyscall);
8af0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 i++){. if( a
8b00: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 Syscall[i].pCurr
8b10: 65 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 ent!=0 ) return
8b20: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d aSyscall[i].zNam
8b30: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 e;. }. return
8b40: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 0;.}../*.** If a
8b50: 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65 Win32 native he
8b60: 61 70 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 ap has been conf
8b70: 69 67 75 72 65 64 2c 20 74 68 69 73 20 66 75 6e igured, this fun
8b80: 63 74 69 6f 6e 20 77 69 6c 6c 20 61 74 74 65 6d ction will attem
8b90: 70 74 20 74 6f 0a 2a 2a 20 63 6f 6d 70 61 63 74 pt to.** compact
8ba0: 20 69 74 2e 20 20 55 70 6f 6e 20 73 75 63 63 65 it. Upon succe
8bb0: 73 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 77 69 ss, SQLITE_OK wi
8bc0: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 ll be returned.
8bd0: 20 55 70 6f 6e 20 66 61 69 6c 75 72 65 2c 20 6f Upon failure, o
8be0: 6e 65 0a 2a 2a 20 6f 66 20 53 51 4c 49 54 45 5f ne.** of SQLITE_
8bf0: 4e 4f 4d 45 4d 2c 20 53 51 4c 49 54 45 5f 45 52 NOMEM, SQLITE_ER
8c00: 52 4f 52 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e ROR, or SQLITE_N
8c10: 4f 54 46 4f 55 4e 44 20 77 69 6c 6c 20 62 65 20 OTFOUND will be
8c20: 72 65 74 75 72 6e 65 64 2e 20 20 54 68 65 0a 2a returned. The.*
8c30: 2a 20 22 70 6e 4c 61 72 67 65 73 74 22 20 61 72 * "pnLargest" ar
8c40: 67 75 6d 65 6e 74 2c 20 69 66 20 6e 6f 6e 2d 7a gument, if non-z
8c50: 65 72 6f 2c 20 77 69 6c 6c 20 62 65 20 75 73 65 ero, will be use
8c60: 64 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65 20 d to return the
8c70: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6c size of the.** l
8c80: 61 72 67 65 73 74 20 63 6f 6d 6d 69 74 74 65 64 argest committed
8c90: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 6e 20 74 free block in t
8ca0: 68 65 20 68 65 61 70 2c 20 69 6e 20 62 79 74 65 he heap, in byte
8cb0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 s..*/.int sqlite
8cc0: 33 5f 77 69 6e 33 32 5f 63 6f 6d 70 61 63 74 5f 3_win32_compact_
8cd0: 68 65 61 70 28 4c 50 55 49 4e 54 20 70 6e 4c 61 heap(LPUINT pnLa
8ce0: 72 67 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 rgest){. int rc
8cf0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 = SQLITE_OK;.
8d00: 55 49 4e 54 20 6e 4c 61 72 67 65 73 74 20 3d 20 UINT nLargest =
8d10: 30 3b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 0;. HANDLE hHea
8d20: 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 p;.. winMemAsse
8d30: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 rtMagic();. hHe
8d40: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 ap = winMemGetHe
8d50: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 ap();. assert(
8d60: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 hHeap!=0 );. as
8d70: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 sert( hHeap!=INV
8d80: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 ALID_HANDLE_VALU
8d90: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 E );.#if !SQLITE
8da0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 _OS_WINRT && def
8db0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 ined(SQLITE_WIN3
8dc0: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 2_MALLOC_VALIDAT
8dd0: 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 E). assert( osH
8de0: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 eapValidate(hHea
8df0: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f p, SQLITE_WIN32_
8e00: 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c HEAP_FLAGS, NULL
8e10: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 ) );.#endif.#if
8e20: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 !SQLITE_OS_WINRT
8e30: 0a 20 20 69 66 28 20 28 6e 4c 61 72 67 65 73 74 . if( (nLargest
8e40: 3d 6f 73 48 65 61 70 43 6f 6d 70 61 63 74 28 68 =osHeapCompact(h
8e50: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e Heap, SQLITE_WIN
8e60: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 29 29 3d 32_HEAP_FLAGS))=
8e70: 3d 30 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 =0 ){. DWORD
8e80: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 lastErrno = osGe
8e90: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 tLastError();.
8ea0: 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d if( lastErrno=
8eb0: 3d 4e 4f 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 =NO_ERROR ){.
8ec0: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 sqlite3_log(S
8ed0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 QLITE_NOMEM, "fa
8ee0: 69 6c 65 64 20 74 6f 20 48 65 61 70 43 6f 6d 70 iled to HeapComp
8ef0: 61 63 74 20 28 6e 6f 20 73 70 61 63 65 29 2c 20 act (no space),
8f00: 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 heap=%p",.
8f10: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 (voi
8f20: 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20 20 d*)hHeap);.
8f30: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d rc = SQLITE_NOM
8f40: 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 EM;. }else{.
8f50: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 sqlite3_log
8f60: 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22 (SQLITE_ERROR, "
8f70: 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 43 6f failed to HeapCo
8f80: 6d 70 61 63 74 20 28 25 6c 75 29 2c 20 68 65 61 mpact (%lu), hea
8f90: 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 p=%p",.
8fa0: 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61 osGetLa
8fb0: 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 stError(), (void
8fc0: 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20 20 20 *)hHeap);.
8fd0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f rc = SQLITE_ERRO
8fe0: 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c R;. }. }.#el
8ff0: 73 65 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 se. sqlite3_log
9000: 28 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 (SQLITE_NOTFOUND
9010: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 , "failed to Hea
9020: 70 43 6f 6d 70 61 63 74 2c 20 68 65 61 70 3d 25 pCompact, heap=%
9030: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 p",.
9040: 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b (void*)hHeap);
9050: 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e . rc = SQLITE_N
9060: 4f 54 46 4f 55 4e 44 3b 0a 23 65 6e 64 69 66 0a OTFOUND;.#endif.
9070: 20 20 69 66 28 20 70 6e 4c 61 72 67 65 73 74 20 if( pnLargest
9080: 29 20 2a 70 6e 4c 61 72 67 65 73 74 20 3d 20 6e ) *pnLargest = n
9090: 4c 61 72 67 65 73 74 3b 0a 20 20 72 65 74 75 72 Largest;. retur
90a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 n rc;.}../*.** I
90b0: 66 20 61 20 57 69 6e 33 32 20 6e 61 74 69 76 65 f a Win32 native
90c0: 20 68 65 61 70 20 68 61 73 20 62 65 65 6e 20 63 heap has been c
90d0: 6f 6e 66 69 67 75 72 65 64 2c 20 74 68 69 73 20 onfigured, this
90e0: 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 61 74 function will at
90f0: 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 64 65 73 74 tempt to.** dest
9100: 72 6f 79 20 61 6e 64 20 72 65 63 72 65 61 74 65 roy and recreate
9110: 20 69 74 2e 20 20 49 66 20 74 68 65 20 57 69 6e it. If the Win
9120: 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 20 69 32 native heap i
9130: 73 20 6e 6f 74 20 69 73 6f 6c 61 74 65 64 20 61 s not isolated a
9140: 6e 64 2f 6f 72 0a 2a 2a 20 74 68 65 20 73 71 6c nd/or.** the sql
9150: 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 ite3_memory_used
9160: 28 29 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 () function does
9170: 20 6e 6f 74 20 72 65 74 75 72 6e 20 7a 65 72 6f not return zero
9180: 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 69 , SQLITE_BUSY wi
9190: 6c 6c 0a 2a 2a 20 62 65 20 72 65 74 75 72 6e 65 ll.** be returne
91a0: 64 20 61 6e 64 20 6e 6f 20 63 68 61 6e 67 65 73 d and no changes
91b0: 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f will be made to
91c0: 20 74 68 65 20 57 69 6e 33 32 20 6e 61 74 69 76 the Win32 nativ
91d0: 65 20 68 65 61 70 2e 0a 2a 2f 0a 69 6e 74 20 73 e heap..*/.int s
91e0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 72 65 73 qlite3_win32_res
91f0: 65 74 5f 68 65 61 70 28 29 7b 0a 20 20 69 6e 74 et_heap(){. int
9200: 20 72 63 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 rc;. MUTEX_LOG
9210: 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 IC( sqlite3_mute
9220: 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 20 2f 2a x *pMaster; ) /*
9230: 20 54 68 65 20 6d 61 69 6e 20 73 74 61 74 69 63 The main static
9240: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 4d 55 54 45 mutex */. MUTE
9250: 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 X_LOGIC( sqlite3
9260: 5f 6d 75 74 65 78 20 2a 70 4d 65 6d 3b 20 29 20 _mutex *pMem; )
9270: 20 20 20 2f 2a 20 54 68 65 20 6d 65 6d 73 79 73 /* The memsys
9280: 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a 2f static mutex */
9290: 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 . MUTEX_LOGIC(
92a0: 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 pMaster = sqlite
92b0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 3MutexAlloc(SQLI
92c0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f TE_MUTEX_STATIC_
92d0: 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 4d 55 54 MASTER); ). MUT
92e0: 45 58 5f 4c 4f 47 49 43 28 20 70 4d 65 6d 20 3d EX_LOGIC( pMem =
92f0: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c sqlite3MutexAll
9300: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f oc(SQLITE_MUTEX_
9310: 53 54 41 54 49 43 5f 4d 45 4d 29 3b 20 29 0a 20 STATIC_MEM); ).
9320: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 sqlite3_mutex_e
9330: 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 nter(pMaster);.
9340: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 sqlite3_mutex_e
9350: 6e 74 65 72 28 70 4d 65 6d 29 3b 0a 20 20 69 66 nter(pMem);. if
9360: 28 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 ( winMemGetOwned
9370: 28 29 20 26 26 20 73 71 6c 69 74 65 33 5f 6d 65 () && sqlite3_me
9380: 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d 30 20 29 mory_used()==0 )
9390: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 {. /*. **
93a0: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 At this point, t
93b0: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 6e here should be n
93c0: 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6d 65 o outstanding me
93d0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 mory allocations
93e0: 20 6f 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 68 on. ** the h
93f0: 65 61 70 2e 20 20 41 6c 73 6f 2c 20 73 69 6e 63 eap. Also, sinc
9400: 65 20 62 6f 74 68 20 74 68 65 20 6d 61 73 74 65 e both the maste
9410: 72 20 61 6e 64 20 6d 65 6d 73 79 73 20 6c 6f 63 r and memsys loc
9420: 6b 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 ks are currently
9430: 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 68 65 . ** being he
9440: 6c 64 20 62 79 20 75 73 2c 20 6e 6f 20 6f 74 68 ld by us, no oth
9450: 65 72 20 66 75 6e 63 74 69 6f 6e 20 28 69 2e 65 er function (i.e
9460: 2e 20 66 72 6f 6d 20 61 6e 6f 74 68 65 72 20 74 . from another t
9470: 68 72 65 61 64 29 20 73 68 6f 75 6c 64 0a 20 20 hread) should.
9480: 20 20 2a 2a 20 62 65 20 61 62 6c 65 20 74 6f 20 ** be able to
9490: 65 76 65 6e 20 61 63 63 65 73 73 20 74 68 65 20 even access the
94a0: 68 65 61 70 2e 20 20 41 74 74 65 6d 70 74 20 74 heap. Attempt t
94b0: 6f 20 64 65 73 74 72 6f 79 20 61 6e 64 20 72 65 o destroy and re
94c0: 63 72 65 61 74 65 20 6f 75 72 0a 20 20 20 20 2a create our. *
94d0: 2a 20 69 73 6f 6c 61 74 65 64 20 57 69 6e 33 32 * isolated Win32
94e0: 20 6e 61 74 69 76 65 20 68 65 61 70 20 6e 6f 77 native heap now
94f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 69 6e .. */. win
9500: 4d 65 6d 53 68 75 74 64 6f 77 6e 28 77 69 6e 4d MemShutdown(winM
9510: 65 6d 47 65 74 44 61 74 61 50 74 72 28 29 29 3b emGetDataPtr());
9520: 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4d 65 6d . rc = winMem
9530: 49 6e 69 74 28 77 69 6e 4d 65 6d 47 65 74 44 61 Init(winMemGetDa
9540: 74 61 50 74 72 28 29 29 3b 0a 20 20 7d 65 6c 73 taPtr());. }els
9550: 65 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a e{. /*. **
9560: 20 54 68 65 20 57 69 6e 33 32 20 6e 61 74 69 76 The Win32 nativ
9570: 65 20 68 65 61 70 20 63 61 6e 6e 6f 74 20 62 65 e heap cannot be
9580: 20 6d 6f 64 69 66 69 65 64 20 62 65 63 61 75 73 modified becaus
9590: 65 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20 75 e it may be in u
95a0: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 se.. */. r
95b0: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b c = SQLITE_BUSY;
95c0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d . }. sqlite3_m
95d0: 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 65 6d 29 utex_leave(pMem)
95e0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 ;. sqlite3_mute
95f0: 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 x_leave(pMaster)
9600: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d ;. return rc;.}
9610: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e ../*.** This fun
9620: 63 74 69 6f 6e 20 6f 75 74 70 75 74 73 20 74 68 ction outputs th
9630: 65 20 73 70 65 63 69 66 69 65 64 20 28 41 4e 53 e specified (ANS
9640: 49 29 20 73 74 72 69 6e 67 20 74 6f 20 74 68 65 I) string to the
9650: 20 57 69 6e 33 32 20 64 65 62 75 67 67 65 72 0a Win32 debugger.
9660: 2a 2a 20 28 69 66 20 61 76 61 69 6c 61 62 6c 65 ** (if available
9670: 29 2e 0a 2a 2f 0a 0a 76 6f 69 64 20 73 71 6c 69 )..*/..void sqli
9680: 74 65 33 5f 77 69 6e 33 32 5f 77 72 69 74 65 5f te3_win32_write_
9690: 64 65 62 75 67 28 63 6f 6e 73 74 20 63 68 61 72 debug(const char
96a0: 20 2a 7a 42 75 66 2c 20 69 6e 74 20 6e 42 75 66 *zBuf, int nBuf
96b0: 29 7b 0a 20 20 63 68 61 72 20 7a 44 62 67 42 75 ){. char zDbgBu
96c0: 66 5b 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 f[SQLITE_WIN32_D
96d0: 42 47 5f 42 55 46 5f 53 49 5a 45 5d 3b 0a 20 20 BG_BUF_SIZE];.
96e0: 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28 6e int nMin = MIN(n
96f0: 42 75 66 2c 20 28 53 51 4c 49 54 45 5f 57 49 4e Buf, (SQLITE_WIN
9700: 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 32_DBG_BUF_SIZE
9710: 2d 20 31 29 29 3b 20 2f 2a 20 6d 61 79 20 62 65 - 1)); /* may be
9720: 20 6e 65 67 61 74 69 76 65 2e 20 2a 2f 0a 20 20 negative. */.
9730: 69 66 28 20 6e 4d 69 6e 3c 2d 31 20 29 20 6e 4d if( nMin<-1 ) nM
9740: 69 6e 20 3d 20 2d 31 3b 20 2f 2a 20 61 6c 6c 20 in = -1; /* all
9750: 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 73 20 negative values
9760: 62 65 63 6f 6d 65 20 2d 31 2e 20 2a 2f 0a 20 20 become -1. */.
9770: 61 73 73 65 72 74 28 20 6e 4d 69 6e 3d 3d 2d 31 assert( nMin==-1
9780: 20 7c 7c 20 6e 4d 69 6e 3d 3d 30 20 7c 7c 20 6e || nMin==0 || n
9790: 4d 69 6e 3c 53 51 4c 49 54 45 5f 57 49 4e 33 32 Min<SQLITE_WIN32
97a0: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 29 3b _DBG_BUF_SIZE );
97b0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c .#if defined(SQL
97c0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e ITE_WIN32_HAS_AN
97d0: 53 49 29 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30 SI). if( nMin>0
97e0: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a ){. memset(z
97f0: 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 DbgBuf, 0, SQLIT
9800: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f E_WIN32_DBG_BUF_
9810: 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63 70 SIZE);. memcp
9820: 79 28 7a 44 62 67 42 75 66 2c 20 7a 42 75 66 2c y(zDbgBuf, zBuf,
9830: 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 6f 73 4f 75 nMin);. osOu
9840: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 tputDebugStringA
9850: 28 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d 65 6c (zDbgBuf);. }el
9860: 73 65 7b 0a 20 20 20 20 6f 73 4f 75 74 70 75 74 se{. osOutput
9870: 44 65 62 75 67 53 74 72 69 6e 67 41 28 7a 42 75 DebugStringA(zBu
9880: 66 29 3b 0a 20 20 7d 0a 23 65 6c 69 66 20 64 65 f);. }.#elif de
9890: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e fined(SQLITE_WIN
98a0: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 6d 32_HAS_WIDE). m
98b0: 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30 emset(zDbgBuf, 0
98c0: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 , SQLITE_WIN32_D
98d0: 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 BG_BUF_SIZE);.
98e0: 69 66 20 28 20 6f 73 4d 75 6c 74 69 42 79 74 65 if ( osMultiByte
98f0: 54 6f 57 69 64 65 43 68 61 72 28 0a 20 20 20 20 ToWideChar(.
9900: 20 20 20 20 20 20 6f 73 41 72 65 46 69 6c 65 41 osAreFileA
9910: 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 pisANSI() ? CP_A
9920: 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 2c 20 30 CP : CP_OEMCP, 0
9930: 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20 20 20 20 , zBuf,.
9940: 20 20 6e 4d 69 6e 2c 20 28 4c 50 57 53 54 52 29 nMin, (LPWSTR)
9950: 7a 44 62 67 42 75 66 2c 20 53 51 4c 49 54 45 5f zDbgBuf, SQLITE_
9960: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 WIN32_DBG_BUF_SI
9970: 5a 45 2f 73 69 7a 65 6f 66 28 57 43 48 41 52 29 ZE/sizeof(WCHAR)
9980: 29 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 )<=0 ){. retu
9990: 72 6e 3b 0a 20 20 7d 0a 20 20 6f 73 4f 75 74 70 rn;. }. osOutp
99a0: 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 28 28 utDebugStringW((
99b0: 4c 50 43 57 53 54 52 29 7a 44 62 67 42 75 66 29 LPCWSTR)zDbgBuf)
99c0: 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6e 4d ;.#else. if( nM
99d0: 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 in>0 ){. mems
99e0: 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 et(zDbgBuf, 0, S
99f0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f QLITE_WIN32_DBG_
9a00: 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d BUF_SIZE);. m
9a10: 65 6d 63 70 79 28 7a 44 62 67 42 75 66 2c 20 7a emcpy(zDbgBuf, z
9a20: 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 Buf, nMin);.
9a30: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 fprintf(stderr,
9a40: 22 25 73 22 2c 20 7a 44 62 67 42 75 66 29 3b 0a "%s", zDbgBuf);.
9a50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 }else{. fpr
9a60: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 intf(stderr, "%s
9a70: 22 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65 ", zBuf);. }.#e
9a80: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 ndif.}../*.** Th
9a90: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 e following rout
9aa0: 69 6e 65 20 73 75 73 70 65 6e 64 73 20 74 68 65 ine suspends the
9ab0: 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20 current thread
9ac0: 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6d 73 0a for at least ms.
9ad0: 2a 2a 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2e ** milliseconds.
9ae0: 20 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61 This is equiva
9af0: 6c 65 6e 74 20 74 6f 20 74 68 65 20 57 69 6e 33 lent to the Win3
9b00: 32 20 53 6c 65 65 70 28 29 20 69 6e 74 65 72 66 2 Sleep() interf
9b10: 61 63 65 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 ace..*/.#if SQLI
9b20: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 73 74 61 74 TE_OS_WINRT.stat
9b30: 69 63 20 48 41 4e 44 4c 45 20 73 6c 65 65 70 4f ic HANDLE sleepO
9b40: 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 bj = NULL;.#endi
9b50: 66 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f f..void sqlite3_
9b60: 77 69 6e 33 32 5f 73 6c 65 65 70 28 44 57 4f 52 win32_sleep(DWOR
9b70: 44 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 7b D milliseconds){
9b80: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 .#if SQLITE_OS_W
9b90: 49 4e 52 54 0a 20 20 69 66 20 28 20 73 6c 65 65 INRT. if ( slee
9ba0: 70 4f 62 6a 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 pObj==NULL ){.
9bb0: 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20 6f 73 43 sleepObj = osC
9bc0: 72 65 61 74 65 45 76 65 6e 74 45 78 57 28 4e 55 reateEventExW(NU
9bd0: 4c 4c 2c 20 4e 55 4c 4c 2c 20 43 52 45 41 54 45 LL, NULL, CREATE
9be0: 5f 45 56 45 4e 54 5f 4d 41 4e 55 41 4c 5f 52 45 _EVENT_MANUAL_RE
9bf0: 53 45 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 SET,.
9c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9c10: 20 20 20 20 20 53 59 4e 43 48 52 4f 4e 49 5a 45 SYNCHRONIZE
9c20: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 );. }. assert(
9c30: 20 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20 sleepObj!=NULL
9c40: 29 3b 0a 20 20 6f 73 57 61 69 74 46 6f 72 53 69 );. osWaitForSi
9c50: 6e 67 6c 65 4f 62 6a 65 63 74 45 78 28 73 6c 65 ngleObjectEx(sle
9c60: 65 70 4f 62 6a 2c 20 6d 69 6c 6c 69 73 65 63 6f epObj, milliseco
9c70: 6e 64 73 2c 20 46 41 4c 53 45 29 3b 0a 23 65 6c nds, FALSE);.#el
9c80: 73 65 0a 20 20 6f 73 53 6c 65 65 70 28 6d 69 6c se. osSleep(mil
9c90: 6c 69 73 65 63 6f 6e 64 73 29 3b 0a 23 65 6e 64 liseconds);.#end
9ca0: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 if.}../*.** Retu
9cb0: 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 rn true (non-zer
9cc0: 6f 29 20 69 66 20 77 65 20 61 72 65 20 72 75 6e o) if we are run
9cd0: 6e 69 6e 67 20 75 6e 64 65 72 20 57 69 6e 4e 54 ning under WinNT
9ce0: 2c 20 57 69 6e 32 4b 2c 20 57 69 6e 58 50 2c 0a , Win2K, WinXP,.
9cf0: 2a 2a 20 6f 72 20 57 69 6e 43 45 2e 20 20 52 65 ** or WinCE. Re
9d00: 74 75 72 6e 20 66 61 6c 73 65 20 28 7a 65 72 6f turn false (zero
9d10: 29 20 66 6f 72 20 57 69 6e 39 35 2c 20 57 69 6e ) for Win95, Win
9d20: 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e 0a 2a 2a 98, or WinME..**
9d30: 0a 2a 2a 20 48 65 72 65 20 69 73 20 61 6e 20 69 .** Here is an i
9d40: 6e 74 65 72 65 73 74 69 6e 67 20 6f 62 73 65 72 nteresting obser
9d50: 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39 35 2c 20 vation: Win95,
9d60: 57 69 6e 39 38 2c 20 61 6e 64 20 57 69 6e 4d 45 Win98, and WinME
9d70: 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20 4c 6f 63 lack.** the Loc
9d80: 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e 20 20 kFileEx() API.
9d90: 42 75 74 20 77 65 20 63 61 6e 20 73 74 69 6c 6c But we can still
9da0: 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b statically link
9db0: 20 61 67 61 69 6e 73 74 20 74 68 61 74 0a 2a 2a against that.**
9dc0: 20 41 50 49 20 61 73 20 6c 6f 6e 67 20 61 73 20 API as long as
9dd0: 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c 20 69 74 we don't call it
9de0: 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 57 69 when running Wi
9df0: 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 41 20 63 61 n95/98/ME. A ca
9e00: 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f ll to.** this ro
9e10: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f utine is used to
9e20: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 determine if th
9e30: 65 20 68 6f 73 74 20 69 73 20 57 69 6e 39 35 2f e host is Win95/
9e40: 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e 98/ME or.** WinN
9e50: 54 2f 32 4b 2f 58 50 20 73 6f 20 74 68 61 74 20 T/2K/XP so that
9e60: 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 we will know whe
9e70: 74 68 65 72 20 6f 72 20 6e 6f 74 20 77 65 20 63 ther or not we c
9e80: 61 6e 20 73 61 66 65 6c 79 20 63 61 6c 6c 0a 2a an safely call.*
9e90: 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 * the LockFileEx
9ea0: 28 29 20 41 50 49 2e 0a 2a 2f 0a 23 69 66 6e 64 () API..*/.#ifnd
9eb0: 65 66 20 4e 54 44 44 49 5f 57 49 4e 38 0a 23 20 ef NTDDI_WIN8.#
9ec0: 20 64 65 66 69 6e 65 20 4e 54 44 44 49 5f 57 49 define NTDDI_WI
9ed0: 4e 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20 N8
9ee0: 20 20 20 20 20 20 20 20 20 20 30 78 30 36 30 32 0x0602
9ef0: 30 30 30 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 0000.#endif..#if
9f00: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 SQLITE_OS_WINCE
9f10: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 || SQLITE_OS_WI
9f20: 4e 52 54 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 NRT || !defined(
9f30: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 SQLITE_WIN32_HAS
9f40: 5f 41 4e 53 49 29 0a 23 20 64 65 66 69 6e 65 20 _ANSI).# define
9f50: 6f 73 49 73 4e 54 28 29 20 20 28 31 29 0a 23 65 osIsNT() (1).#e
9f60: 6c 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c lif !defined(SQL
9f70: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 ITE_WIN32_HAS_WI
9f80: 44 45 29 0a 23 20 64 65 66 69 6e 65 20 6f 73 49 DE).# define osI
9f90: 73 4e 54 28 29 20 20 28 30 29 0a 23 65 6c 73 65 sNT() (0).#else
9fa0: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6f 73 . static int os
9fb0: 49 73 4e 54 28 76 6f 69 64 29 7b 0a 20 20 20 20 IsNT(void){.
9fc0: 69 66 28 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 if( sqlite3_os_t
9fd0: 79 70 65 3d 3d 30 20 29 7b 0a 23 69 66 20 64 65 ype==0 ){.#if de
9fe0: 66 69 6e 65 64 28 4e 54 44 44 49 5f 56 45 52 53 fined(NTDDI_VERS
9ff0: 49 4f 4e 29 20 26 26 20 4e 54 44 44 49 5f 56 45 ION) && NTDDI_VE
a000: 52 53 49 4f 4e 20 3e 3d 20 4e 54 44 44 49 5f 57 RSION >= NTDDI_W
a010: 49 4e 38 0a 20 20 20 20 20 20 4f 53 56 45 52 53 IN8. OSVERS
a020: 49 4f 4e 49 4e 46 4f 57 20 73 49 6e 66 6f 3b 0a IONINFOW sInfo;.
a030: 20 20 20 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53 sInfo.dwOS
a040: 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 VersionInfoSize
a050: 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b = sizeof(sInfo);
a060: 0a 20 20 20 20 20 20 6f 73 47 65 74 56 65 72 73 . osGetVers
a070: 69 6f 6e 45 78 57 28 26 73 49 6e 66 6f 29 3b 0a ionExW(&sInfo);.
a080: 23 65 6c 73 65 0a 20 20 20 20 20 20 4f 53 56 45 #else. OSVE
a090: 52 53 49 4f 4e 49 4e 46 4f 41 20 73 49 6e 66 6f RSIONINFOA sInfo
a0a0: 3b 0a 20 20 20 20 20 20 73 49 6e 66 6f 2e 64 77 ;. sInfo.dw
a0b0: 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a OSVersionInfoSiz
a0c0: 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f e = sizeof(sInfo
a0d0: 29 3b 0a 20 20 20 20 20 20 6f 73 47 65 74 56 65 );. osGetVe
a0e0: 72 73 69 6f 6e 45 78 41 28 26 73 49 6e 66 6f 29 rsionExA(&sInfo)
a0f0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 73 ;.#endif. s
a100: 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d qlite3_os_type =
a110: 20 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72 sInfo.dwPlatfor
a120: 6d 49 64 3d 3d 56 45 52 5f 50 4c 41 54 46 4f 52 mId==VER_PLATFOR
a130: 4d 5f 57 49 4e 33 32 5f 4e 54 20 3f 20 32 20 3a M_WIN32_NT ? 2 :
a140: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 1;. }. re
a150: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6f 73 5f turn sqlite3_os_
a160: 74 79 70 65 3d 3d 32 3b 0a 20 20 7d 0a 23 65 6e type==2;. }.#en
a170: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 dif..#ifdef SQLI
a180: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a TE_WIN32_MALLOC.
a190: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e /*.** Allocate n
a1a0: 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 2e Bytes of memory.
a1b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 .*/.static void
a1c0: 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e *winMemMalloc(in
a1d0: 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41 4e t nBytes){. HAN
a1e0: 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f 69 DLE hHeap;. voi
a1f0: 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 d *p;.. winMemA
a200: 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 ssertMagic();.
a210: 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 hHeap = winMemGe
a220: 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 tHeap();. asser
a230: 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 t( hHeap!=0 );.
a240: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d assert( hHeap!=
a250: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 INVALID_HANDLE_V
a260: 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c ALUE );.#if !SQL
a270: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 ITE_OS_WINRT &&
a280: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 defined(SQLITE_W
a290: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 IN32_MALLOC_VALI
a2a0: 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 DATE). assert(
a2b0: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 osHeapValidate(h
a2c0: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e Heap, SQLITE_WIN
a2d0: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 32_HEAP_FLAGS, N
a2e0: 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 ULL) );.#endif.
a2f0: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 73 3e assert( nBytes>
a300: 3d 30 20 29 3b 0a 20 20 70 20 3d 20 6f 73 48 65 =0 );. p = osHe
a310: 61 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 apAlloc(hHeap, S
a320: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 QLITE_WIN32_HEAP
a330: 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54 29 _FLAGS, (SIZE_T)
a340: 6e 42 79 74 65 73 29 3b 0a 20 20 69 66 28 20 21 nBytes);. if( !
a350: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 p ){. sqlite3
a360: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 _log(SQLITE_NOME
a370: 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 M, "failed to He
a380: 61 70 41 6c 6c 6f 63 20 25 75 20 62 79 74 65 73 apAlloc %u bytes
a390: 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 (%lu), heap=%p"
a3a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
a3b0: 20 20 6e 42 79 74 65 73 2c 20 6f 73 47 65 74 4c nBytes, osGetL
a3c0: 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 astError(), (voi
a3d0: 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20 d*)hHeap);. }.
a3e0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a return p;.}../*
a3f0: 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79 2e .** Free memory.
a400: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 .*/.static void
a410: 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64 20 winMemFree(void
a420: 2a 70 50 72 69 6f 72 29 7b 0a 20 20 48 41 4e 44 *pPrior){. HAND
a430: 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20 77 69 6e LE hHeap;.. win
a440: 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 MemAssertMagic()
a450: 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d ;. hHeap = winM
a460: 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 emGetHeap();. a
a470: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 ssert( hHeap!=0
a480: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 );. assert( hHe
a490: 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 ap!=INVALID_HAND
a4a0: 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 LE_VALUE );.#if
a4b0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 !SQLITE_OS_WINRT
a4c0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 && defined(SQLI
a4d0: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f TE_WIN32_MALLOC_
a4e0: 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 VALIDATE). asse
a4f0: 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 rt( osHeapValida
a500: 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 te(hHeap, SQLITE
a510: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 _WIN32_HEAP_FLAG
a520: 53 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23 65 S, pPrior) );.#e
a530: 6e 64 69 66 0a 20 20 69 66 28 20 21 70 50 72 69 ndif. if( !pPri
a540: 6f 72 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 or ) return; /*
a550: 50 61 73 73 69 6e 67 20 4e 55 4c 4c 20 74 6f 20 Passing NULL to
a560: 48 65 61 70 46 72 65 65 20 69 73 20 75 6e 64 65 HeapFree is unde
a570: 66 69 6e 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 fined. */. if(
a580: 21 6f 73 48 65 61 70 46 72 65 65 28 68 48 65 61 !osHeapFree(hHea
a590: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f p, SQLITE_WIN32_
a5a0: 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 HEAP_FLAGS, pPri
a5b0: 6f 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 or) ){. sqlit
a5c0: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f e3_log(SQLITE_NO
a5d0: 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 MEM, "failed to
a5e0: 48 65 61 70 46 72 65 65 20 62 6c 6f 63 6b 20 25 HeapFree block %
a5f0: 70 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 p (%lu), heap=%p
a600: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ",.
a610: 20 20 20 70 50 72 69 6f 72 2c 20 6f 73 47 65 74 pPrior, osGet
a620: 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f LastError(), (vo
a630: 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a id*)hHeap);. }.
a640: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 }../*.** Change
a650: 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 65 the size of an e
a660: 78 69 73 74 69 6e 67 20 6d 65 6d 6f 72 79 20 61 xisting memory a
a670: 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 llocation.*/.sta
a680: 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d tic void *winMem
a690: 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 Realloc(void *pP
a6a0: 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65 73 rior, int nBytes
a6b0: 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 ){. HANDLE hHea
a6c0: 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 p;. void *p;..
a6d0: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 winMemAssertMag
a6e0: 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 ic();. hHeap =
a6f0: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b winMemGetHeap();
a700: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 . assert( hHeap
a710: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 !=0 );. assert(
a720: 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f hHeap!=INVALID_
a730: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a HANDLE_VALUE );.
a740: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 #if !SQLITE_OS_W
a750: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 INRT && defined(
a760: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c SQLITE_WIN32_MAL
a770: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 LOC_VALIDATE).
a780: 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 assert( osHeapVa
a790: 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 lidate(hHeap, SQ
a7a0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f LITE_WIN32_HEAP_
a7b0: 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 FLAGS, pPrior) )
a7c0: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 ;.#endif. asser
a7d0: 74 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a t( nBytes>=0 );.
a7e0: 20 20 69 66 28 20 21 70 50 72 69 6f 72 20 29 7b if( !pPrior ){
a7f0: 0a 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70 41 . p = osHeapA
a800: 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 lloc(hHeap, SQLI
a810: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c TE_WIN32_HEAP_FL
a820: 41 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 AGS, (SIZE_T)nBy
a830: 74 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 tes);. }else{.
a840: 20 20 20 70 20 3d 20 6f 73 48 65 61 70 52 65 41 p = osHeapReA
a850: 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 lloc(hHeap, SQLI
a860: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c TE_WIN32_HEAP_FL
a870: 41 47 53 2c 20 70 50 72 69 6f 72 2c 20 28 53 49 AGS, pPrior, (SI
a880: 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 ZE_T)nBytes);.
a890: 7d 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 }. if( !p ){.
a8a0: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 sqlite3_log(SQ
a8b0: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 LITE_NOMEM, "fai
a8c0: 6c 65 64 20 74 6f 20 25 73 20 25 75 20 62 79 74 led to %s %u byt
a8d0: 65 73 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 es (%lu), heap=%
a8e0: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 p",.
a8f0: 20 20 20 20 70 50 72 69 6f 72 20 3f 20 22 48 65 pPrior ? "He
a900: 61 70 52 65 41 6c 6c 6f 63 22 20 3a 20 22 48 65 apReAlloc" : "He
a910: 61 70 41 6c 6c 6f 63 22 2c 20 6e 42 79 74 65 73 apAlloc", nBytes
a920: 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 , osGetLastError
a930: 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 (),.
a940: 20 20 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 (void*)hHeap
a950: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 );. }. return
a960: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 p;.}../*.** Retu
a970: 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 rn the size of a
a980: 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 61 6c n outstanding al
a990: 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 62 79 74 location, in byt
a9a0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e es..*/.static in
a9b0: 74 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 t winMemSize(voi
a9c0: 64 20 2a 70 29 7b 0a 20 20 48 41 4e 44 4c 45 20 d *p){. HANDLE
a9d0: 68 48 65 61 70 3b 0a 20 20 53 49 5a 45 5f 54 20 hHeap;. SIZE_T
a9e0: 6e 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 n;.. winMemAsse
a9f0: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 rtMagic();. hHe
aa00: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 ap = winMemGetHe
aa10: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 ap();. assert(
aa20: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 hHeap!=0 );. as
aa30: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 sert( hHeap!=INV
aa40: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 ALID_HANDLE_VALU
aa50: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 E );.#if !SQLITE
aa60: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 _OS_WINRT && def
aa70: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 ined(SQLITE_WIN3
aa80: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 2_MALLOC_VALIDAT
aa90: 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 E). assert( osH
aaa0: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 eapValidate(hHea
aab0: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f p, SQLITE_WIN32_
aac0: 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c HEAP_FLAGS, NULL
aad0: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 ) );.#endif. if
aae0: 28 20 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b ( !p ) return 0;
aaf0: 0a 20 20 6e 20 3d 20 6f 73 48 65 61 70 53 69 7a . n = osHeapSiz
ab00: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f e(hHeap, SQLITE_
ab10: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 WIN32_HEAP_FLAGS
ab20: 2c 20 70 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 28 , p);. if( n==(
ab30: 53 49 5a 45 5f 54 29 2d 31 20 29 7b 0a 20 20 20 SIZE_T)-1 ){.
ab40: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c sqlite3_log(SQL
ab50: 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c ITE_NOMEM, "fail
ab60: 65 64 20 74 6f 20 48 65 61 70 53 69 7a 65 20 62 ed to HeapSize b
ab70: 6c 6f 63 6b 20 25 70 20 28 25 6c 75 29 2c 20 68 lock %p (%lu), h
ab80: 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 eap=%p",.
ab90: 20 20 20 20 20 20 20 20 20 70 2c 20 6f 73 47 65 p, osGe
aba0: 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 tLastError(), (v
abb0: 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 oid*)hHeap);.
abc0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 return 0;. }.
abd0: 20 72 65 74 75 72 6e 20 28 69 6e 74 29 6e 3b 0a return (int)n;.
abe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 6e 64 20 75 }../*.** Round u
abf0: 70 20 61 20 72 65 71 75 65 73 74 20 73 69 7a 65 p a request size
ac00: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 76 61 6c to the next val
ac10: 69 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 id allocation si
ac20: 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e ze..*/.static in
ac30: 74 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 t winMemRoundup(
ac40: 69 6e 74 20 6e 29 7b 0a 20 20 72 65 74 75 72 6e int n){. return
ac50: 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 n;.}../*.** Ini
ac60: 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 tialize this mod
ac70: 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 ule..*/.static i
ac80: 6e 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f nt winMemInit(vo
ac90: 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 id *pAppData){.
aca0: 20 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 winMemData *pWi
acb0: 6e 4d 65 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d nMemData = (winM
acc0: 65 6d 44 61 74 61 20 2a 29 70 41 70 70 44 61 74 emData *)pAppDat
acd0: 61 3b 0a 0a 20 20 69 66 28 20 21 70 57 69 6e 4d a;.. if( !pWinM
ace0: 65 6d 44 61 74 61 20 29 20 72 65 74 75 72 6e 20 emData ) return
acf0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 SQLITE_ERROR;.
ad00: 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 assert( pWinMemD
ad10: 61 74 61 2d 3e 6d 61 67 69 63 31 3d 3d 57 49 4e ata->magic1==WIN
ad20: 4d 45 4d 5f 4d 41 47 49 43 31 20 29 3b 0a 20 20 MEM_MAGIC1 );.
ad30: 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 assert( pWinMemD
ad40: 61 74 61 2d 3e 6d 61 67 69 63 32 3d 3d 57 49 4e ata->magic2==WIN
ad50: 4d 45 4d 5f 4d 41 47 49 43 32 20 29 3b 0a 0a 23 MEM_MAGIC2 );..#
ad60: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 if !SQLITE_OS_WI
ad70: 4e 52 54 20 26 26 20 53 51 4c 49 54 45 5f 57 49 NRT && SQLITE_WI
ad80: 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54 45 0a N32_HEAP_CREATE.
ad90: 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 if( !pWinMemDa
ada0: 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 ta->hHeap ){.
adb0: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 pWinMemData->hH
adc0: 65 61 70 20 3d 20 6f 73 48 65 61 70 43 72 65 61 eap = osHeapCrea
add0: 74 65 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f te(SQLITE_WIN32_
ade0: 48 45 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20 20 HEAP_FLAGS,.
adf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ae00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ae10: 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 SQLITE_WIN32_H
ae20: 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 2c 0a 20 EAP_INIT_SIZE,.
ae30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ae40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ae50: 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 SQLITE_WIN3
ae60: 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 29 2_HEAP_MAX_SIZE)
ae70: 3b 0a 20 20 20 20 69 66 28 20 21 70 57 69 6e 4d ;. if( !pWinM
ae80: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b emData->hHeap ){
ae90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c . sqlite3_l
aea0: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c og(SQLITE_NOMEM,
aeb0: 0a 20 20 20 20 20 20 20 20 20 20 22 66 61 69 6c . "fail
aec0: 65 64 20 74 6f 20 48 65 61 70 43 72 65 61 74 65 ed to HeapCreate
aed0: 20 28 25 6c 75 29 2c 20 66 6c 61 67 73 3d 25 75 (%lu), flags=%u
aee0: 2c 20 69 6e 69 74 53 69 7a 65 3d 25 75 2c 20 6d , initSize=%u, m
aef0: 61 78 53 69 7a 65 3d 25 75 22 2c 0a 20 20 20 20 axSize=%u",.
af00: 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 osGetLastE
af10: 72 72 6f 72 28 29 2c 20 53 51 4c 49 54 45 5f 57 rror(), SQLITE_W
af20: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c IN32_HEAP_FLAGS,
af30: 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 . SQLIT
af40: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 E_WIN32_HEAP_INI
af50: 54 5f 53 49 5a 45 2c 20 53 51 4c 49 54 45 5f 57 T_SIZE, SQLITE_W
af60: 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 IN32_HEAP_MAX_SI
af70: 5a 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 ZE);. retur
af80: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a n SQLITE_NOMEM;.
af90: 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 }. pWinMe
afa0: 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 mData->bOwned =
afb0: 54 52 55 45 3b 0a 20 20 20 20 61 73 73 65 72 74 TRUE;. assert
afc0: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 ( pWinMemData->b
afd0: 4f 77 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6c Owned );. }.#el
afe0: 73 65 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 se. pWinMemData
aff0: 2d 3e 68 48 65 61 70 20 3d 20 6f 73 47 65 74 50 ->hHeap = osGetP
b000: 72 6f 63 65 73 73 48 65 61 70 28 29 3b 0a 20 20 rocessHeap();.
b010: 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 if( !pWinMemData
b020: 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 73 ->hHeap ){. s
b030: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 qlite3_log(SQLIT
b040: 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 E_NOMEM,.
b050: 20 22 66 61 69 6c 65 64 20 74 6f 20 47 65 74 50 "failed to GetP
b060: 72 6f 63 65 73 73 48 65 61 70 20 28 25 6c 75 29 rocessHeap (%lu)
b070: 22 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f ", osGetLastErro
b080: 72 28 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e r());. return
b090: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 SQLITE_NOMEM;.
b0a0: 20 7d 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 }. pWinMemData
b0b0: 2d 3e 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 ->bOwned = FALSE
b0c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 57 69 ;. assert( !pWi
b0d0: 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 nMemData->bOwned
b0e0: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 );.#endif. ass
b0f0: 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 ert( pWinMemData
b100: 2d 3e 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 ->hHeap!=0 );.
b110: 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 assert( pWinMemD
b120: 61 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 ata->hHeap!=INVA
b130: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 LID_HANDLE_VALUE
b140: 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f );.#if !SQLITE_
b150: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 OS_WINRT && defi
b160: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 ned(SQLITE_WIN32
b170: 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 _MALLOC_VALIDATE
b180: 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 ). assert( osHe
b190: 61 70 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d apValidate(pWinM
b1a0: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 emData->hHeap, S
b1b0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 QLITE_WIN32_HEAP
b1c0: 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b _FLAGS, NULL) );
b1d0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e .#endif. return
b1e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f SQLITE_OK;.}../
b1f0: 2a 0a 2a 2a 20 44 65 69 6e 69 74 69 61 6c 69 7a *.** Deinitializ
b200: 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a e this module..*
b210: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 /.static void wi
b220: 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 nMemShutdown(voi
b230: 64 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20 d *pAppData){.
b240: 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e winMemData *pWin
b250: 4d 65 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 MemData = (winMe
b260: 6d 44 61 74 61 20 2a 29 70 41 70 70 44 61 74 61 mData *)pAppData
b270: 3b 0a 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 ;.. if( !pWinMe
b280: 6d 44 61 74 61 20 29 20 72 65 74 75 72 6e 3b 0a mData ) return;.
b290: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 assert( pWinMe
b2a0: 6d 44 61 74 61 2d 3e 6d 61 67 69 63 31 3d 3d 57 mData->magic1==W
b2b0: 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20 29 3b 0a INMEM_MAGIC1 );.
b2c0: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 assert( pWinMe
b2d0: 6d 44 61 74 61 2d 3e 6d 61 67 69 63 32 3d 3d 57 mData->magic2==W
b2e0: 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20 29 3b 0a INMEM_MAGIC2 );.
b2f0: 0a 20 20 69 66 28 20 70 57 69 6e 4d 65 6d 44 61 . if( pWinMemDa
b300: 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 ta->hHeap ){.
b310: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d assert( pWinMem
b320: 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 Data->hHeap!=INV
b330: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 ALID_HANDLE_VALU
b340: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 E );.#if !SQLITE
b350: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 _OS_WINRT && def
b360: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 ined(SQLITE_WIN3
b370: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 2_MALLOC_VALIDAT
b380: 45 29 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f E). assert( o
b390: 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 70 57 sHeapValidate(pW
b3a0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 inMemData->hHeap
b3b0: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 , SQLITE_WIN32_H
b3c0: 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 EAP_FLAGS, NULL)
b3d0: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 );.#endif. i
b3e0: 66 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e f( pWinMemData->
b3f0: 62 4f 77 6e 65 64 20 29 7b 0a 20 20 20 20 20 20 bOwned ){.
b400: 69 66 28 20 21 6f 73 48 65 61 70 44 65 73 74 72 if( !osHeapDestr
b410: 6f 79 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e oy(pWinMemData->
b420: 68 48 65 61 70 29 20 29 7b 0a 20 20 20 20 20 20 hHeap) ){.
b430: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 sqlite3_log(SQ
b440: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 LITE_NOMEM, "fai
b450: 6c 65 64 20 74 6f 20 48 65 61 70 44 65 73 74 72 led to HeapDestr
b460: 6f 79 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 oy (%lu), heap=%
b470: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 p",.
b480: 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 osGetLas
b490: 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a tError(), (void*
b4a0: 29 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 )pWinMemData->hH
b4b0: 65 61 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 eap);. }.
b4c0: 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d pWinMemData-
b4d0: 3e 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b >bOwned = FALSE;
b4e0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d . }. pWinM
b4f0: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 emData->hHeap =
b500: 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a NULL;. }.}../*.
b510: 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 ** Populate the
b520: 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 low-level memory
b530: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63 allocation func
b540: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 69 6e tion pointers in
b550: 0a 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 .** sqlite3Globa
b560: 6c 43 6f 6e 66 69 67 2e 6d 20 77 69 74 68 20 70 lConfig.m with p
b570: 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 72 ointers to the r
b580: 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20 outines in this
b590: 66 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 61 72 67 file. The.** arg
b5a0: 75 6d 65 6e 74 73 20 73 70 65 63 69 66 79 20 74 uments specify t
b5b0: 68 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f he block of memo
b5c0: 72 79 20 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a ry to manage..**
b5d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 .** This routine
b5e0: 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 is only called
b5f0: 62 79 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 by sqlite3_confi
b600: 67 28 29 2c 20 61 6e 64 20 74 68 65 72 65 66 6f g(), and therefo
b610: 72 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71 re.** is not req
b620: 75 69 72 65 64 20 74 6f 20 62 65 20 74 68 72 65 uired to be thre
b630: 61 64 73 61 66 65 20 28 69 74 20 69 73 20 6e 6f adsafe (it is no
b640: 74 29 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c t)..*/.const sql
b650: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 ite3_mem_methods
b660: 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 *sqlite3MemGetW
b670: 69 6e 33 32 28 76 6f 69 64 29 7b 0a 20 20 73 74 in32(void){. st
b680: 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 atic const sqlit
b690: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 77 e3_mem_methods w
b6a0: 69 6e 4d 65 6d 4d 65 74 68 6f 64 73 20 3d 20 7b inMemMethods = {
b6b0: 0a 20 20 20 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f . winMemMallo
b6c0: 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 46 72 65 c,. winMemFre
b6d0: 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 65 61 e,. winMemRea
b6e0: 6c 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d lloc,. winMem
b6f0: 53 69 7a 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d Size,. winMem
b700: 52 6f 75 6e 64 75 70 2c 0a 20 20 20 20 77 69 6e Roundup,. win
b710: 4d 65 6d 49 6e 69 74 2c 0a 20 20 20 20 77 69 6e MemInit,. win
b720: 4d 65 6d 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20 MemShutdown,.
b730: 20 26 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20 &win_mem_data.
b740: 20 7d 3b 0a 20 20 72 65 74 75 72 6e 20 26 77 69 };. return &wi
b750: 6e 4d 65 6d 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a nMemMethods;.}..
b760: 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 53 void sqlite3MemS
b770: 65 74 44 65 66 61 75 6c 74 28 76 6f 69 64 29 7b etDefault(void){
b780: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 . sqlite3_confi
b790: 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f g(SQLITE_CONFIG_
b7a0: 4d 41 4c 4c 4f 43 2c 20 73 71 6c 69 74 65 33 4d MALLOC, sqlite3M
b7b0: 65 6d 47 65 74 57 69 6e 33 32 28 29 29 3b 0a 7d emGetWin32());.}
b7c0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 .#endif /* SQLIT
b7d0: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a E_WIN32_MALLOC *
b7e0: 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 /../*.** Convert
b7f0: 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 a UTF-8 string
b800: 74 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 to Microsoft Uni
b810: 63 6f 64 65 20 28 55 54 46 2d 31 36 3f 29 2e 20 code (UTF-16?).
b820: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 .**.** Space to
b830: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 hold the returne
b840: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 d string is obta
b850: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 ined from malloc
b860: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 ..*/.static LPWS
b870: 54 52 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 TR winUtf8ToUnic
b880: 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a ode(const char *
b890: 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e zFilename){. in
b8a0: 74 20 6e 43 68 61 72 3b 0a 20 20 4c 50 57 53 54 t nChar;. LPWST
b8b0: 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b R zWideFilename;
b8c0: 0a 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 .. nChar = osMu
b8d0: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 ltiByteToWideCha
b8e0: 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 r(CP_UTF8, 0, zF
b8f0: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c ilename, -1, NUL
b900: 4c 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 43 68 L, 0);. if( nCh
b910: 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 ar==0 ){. ret
b920: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 57 69 urn 0;. }. zWi
b930: 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c deFilename = sql
b940: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 ite3MallocZero(
b950: 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28 7a 57 69 nChar*sizeof(zWi
b960: 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 deFilename[0]) )
b970: 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 46 69 6c ;. if( zWideFil
b980: 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 ename==0 ){.
b990: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 return 0;. }.
b9a0: 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 nChar = osMultiB
b9b0: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 yteToWideChar(CP
b9c0: 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e _UTF8, 0, zFilen
b9d0: 61 6d 65 2c 20 2d 31 2c 20 7a 57 69 64 65 46 69 ame, -1, zWideFi
b9e0: 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 lename,.
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ba00: 20 20 20 20 20 20 20 20 6e 43 68 61 72 29 3b 0a nChar);.
ba10: 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 if( nChar==0 )
ba20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 {. sqlite3_fr
ba30: 65 65 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 ee(zWideFilename
ba40: 29 3b 0a 20 20 20 20 7a 57 69 64 65 46 69 6c 65 );. zWideFile
ba50: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 name = 0;. }.
ba60: 72 65 74 75 72 6e 20 7a 57 69 64 65 46 69 6c 65 return zWideFile
ba70: 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 name;.}../*.** C
ba80: 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f 66 74 onvert Microsoft
ba90: 20 55 6e 69 63 6f 64 65 20 74 6f 20 55 54 46 2d Unicode to UTF-
baa0: 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 8. Space to hol
bab0: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 d the returned s
bac0: 74 72 69 6e 67 20 69 73 0a 2a 2a 20 6f 62 74 61 tring is.** obta
bad0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 ined from sqlite
bae0: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 3_malloc()..*/.s
baf0: 74 61 74 69 63 20 63 68 61 72 20 2a 77 69 6e 55 tatic char *winU
bb00: 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 4c 50 43 nicodeToUtf8(LPC
bb10: 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 WSTR zWideFilena
bb20: 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 me){. int nByte
bb30: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e ;. char *zFilen
bb40: 61 6d 65 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 ame;.. nByte =
bb50: 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 osWideCharToMult
bb60: 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30 iByte(CP_UTF8, 0
bb70: 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c , zWideFilename,
bb80: 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 -1, 0, 0, 0, 0)
bb90: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d ;. if( nByte ==
bba0: 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 0 ){. return
bbb0: 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 0;. }. zFilen
bbc0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c ame = sqlite3Mal
bbd0: 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 20 29 locZero( nByte )
bbe0: 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d ;. if( zFilenam
bbf0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 e==0 ){. retu
bc00: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 rn 0;. }. nByt
bc10: 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f e = osWideCharTo
bc20: 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46 MultiByte(CP_UTF
bc30: 38 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 8, 0, zWideFilen
bc40: 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 ame, -1, zFilena
bc50: 6d 65 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 me, nByte,.
bc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
bc70: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 29 0, 0)
bc80: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d ;. if( nByte ==
bc90: 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 0 ){. sqlite
bca0: 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 3_free(zFilename
bcb0: 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 );. zFilename
bcc0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 = 0;. }. retu
bcd0: 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a rn zFilename;.}.
bce0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 ./*.** Convert a
bcf0: 6e 20 41 4e 53 49 20 73 74 72 69 6e 67 20 74 6f n ANSI string to
bd00: 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f Microsoft Unico
bd10: 64 65 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65 de, based on the
bd20: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 63 6f 64 65 .** current code
bd30: 70 61 67 65 20 73 65 74 74 69 6e 67 73 20 66 6f page settings fo
bd40: 72 20 66 69 6c 65 20 61 70 69 73 2e 0a 2a 2a 20 r file apis..**
bd50: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c .** Space to hol
bd60: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 d the returned s
bd70: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 tring is obtaine
bd80: 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 d.** from sqlite
bd90: 33 5f 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 3_malloc..*/.sta
bda0: 74 69 63 20 4c 50 57 53 54 52 20 77 69 6e 4d 62 tic LPWSTR winMb
bdb0: 63 73 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 csToUnicode(cons
bdc0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d t char *zFilenam
bdd0: 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b e){. int nByte;
bde0: 0a 20 20 4c 50 57 53 54 52 20 7a 4d 62 63 73 46 . LPWSTR zMbcsF
bdf0: 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63 ilename;. int c
be00: 6f 64 65 70 61 67 65 20 3d 20 6f 73 41 72 65 46 odepage = osAreF
be10: 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20 ileApisANSI() ?
be20: 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 CP_ACP : CP_OEMC
be30: 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 P;.. nByte = os
be40: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 MultiByteToWideC
be50: 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c har(codepage, 0,
be60: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 zFilename, -1,
be70: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 NULL,.
be80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
be90: 20 20 20 20 20 20 30 29 2a 73 69 7a 65 6f 66 28 0)*sizeof(
bea0: 57 43 48 41 52 29 3b 0a 20 20 69 66 28 20 6e 42 WCHAR);. if( nB
beb0: 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 yte==0 ){. re
bec0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d turn 0;. }. zM
bed0: 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 bcsFilename = sq
bee0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 lite3MallocZero(
bef0: 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 4d nByte*sizeof(zM
bf00: 62 63 73 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 bcsFilename[0])
bf10: 29 3b 0a 20 20 69 66 28 20 7a 4d 62 63 73 46 69 );. if( zMbcsFi
bf20: 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 lename==0 ){.
bf30: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 return 0;. }.
bf40: 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 nByte = osMulti
bf50: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 63 ByteToWideChar(c
bf60: 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c odepage, 0, zFil
bf70: 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 4d 62 63 73 ename, -1, zMbcs
bf80: 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 Filename,.
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
bfa0: 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 29 nByte)
bfb0: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 ;. if( nByte==0
bfc0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f ){. sqlite3_
bfd0: 66 72 65 65 28 7a 4d 62 63 73 46 69 6c 65 6e 61 free(zMbcsFilena
bfe0: 6d 65 29 3b 0a 20 20 20 20 7a 4d 62 63 73 46 69 me);. zMbcsFi
bff0: 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a lename = 0;. }.
c000: 20 20 72 65 74 75 72 6e 20 7a 4d 62 63 73 46 69 return zMbcsFi
c010: 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a lename;.}../*.**
c020: 20 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f Convert Microso
c030: 66 74 20 55 6e 69 63 6f 64 65 20 74 6f 20 6d 75 ft Unicode to mu
c040: 6c 74 69 2d 62 79 74 65 20 63 68 61 72 61 63 74 lti-byte charact
c050: 65 72 20 73 74 72 69 6e 67 2c 20 62 61 73 65 64 er string, based
c060: 20 6f 6e 20 74 68 65 0a 2a 2a 20 75 73 65 72 27 on the.** user'
c070: 73 20 41 4e 53 49 20 63 6f 64 65 70 61 67 65 2e s ANSI codepage.
c080: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 .**.** Space to
c090: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 hold the returne
c0a0: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 d string is obta
c0b0: 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c ined from.** sql
c0c0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a ite3_malloc()..*
c0d0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 77 /.static char *w
c0e0: 69 6e 55 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28 inUnicodeToMbcs(
c0f0: 4c 50 43 57 53 54 52 20 7a 57 69 64 65 46 69 6c LPCWSTR zWideFil
c100: 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 ename){. int nB
c110: 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 yte;. char *zFi
c120: 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f lename;. int co
c130: 64 65 70 61 67 65 20 3d 20 6f 73 41 72 65 46 69 depage = osAreFi
c140: 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43 leApisANSI() ? C
c150: 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 P_ACP : CP_OEMCP
c160: 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 ;.. nByte = osW
c170: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 ideCharToMultiBy
c180: 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 te(codepage, 0,
c190: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d zWideFilename, -
c1a0: 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 1, 0, 0, 0, 0);.
c1b0: 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 if( nByte == 0
c1c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 ){. return 0
c1d0: 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d ;. }. zFilenam
c1e0: 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f e = sqlite3Mallo
c1f0: 63 5a 65 72 6f 28 20 6e 42 79 74 65 20 29 3b 0a cZero( nByte );.
c200: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d if( zFilename=
c210: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e =0 ){. return
c220: 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 0;. }. nByte
c230: 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 = osWideCharToMu
c240: 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61 67 65 ltiByte(codepage
c250: 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 , 0, zWideFilena
c260: 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d me, -1, zFilenam
c270: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 e,.
c280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c290: 20 20 20 6e 42 79 74 65 2c 20 30 2c 20 30 29 3b nByte, 0, 0);
c2a0: 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 . if( nByte ==
c2b0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 0 ){. sqlite3
c2c0: 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 _free(zFilename)
c2d0: 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 ;. zFilename
c2e0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 = 0;. }. retur
c2f0: 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a n zFilename;.}..
c300: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 6d 75 /*.** Convert mu
c310: 6c 74 69 62 79 74 65 20 63 68 61 72 61 63 74 65 ltibyte characte
c320: 72 20 73 74 72 69 6e 67 20 74 6f 20 55 54 46 2d r string to UTF-
c330: 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 8. Space to hol
c340: 64 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 65 d the.** returne
c350: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 d string is obta
c360: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 ined from sqlite
c370: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 3_malloc()..*/.c
c380: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e har *sqlite3_win
c390: 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 32_mbcs_to_utf8(
c3a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c const char *zFil
c3b0: 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a ename){. char *
c3c0: 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 20 zFilenameUtf8;.
c3d0: 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64 65 LPWSTR zTmpWide
c3e0: 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d 20 ;.. zTmpWide =
c3f0: 77 69 6e 4d 62 63 73 54 6f 55 6e 69 63 6f 64 65 winMbcsToUnicode
c400: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 (zFilename);. i
c410: 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 f( zTmpWide==0 )
c420: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a {. return 0;.
c430: 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 55 }. zFilenameU
c440: 74 66 38 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 tf8 = winUnicode
c450: 54 6f 55 74 66 38 28 7a 54 6d 70 57 69 64 65 29 ToUtf8(zTmpWide)
c460: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 ;. sqlite3_free
c470: 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 (zTmpWide);. re
c480: 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 55 74 turn zFilenameUt
c490: 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e f8;.}../*.** Con
c4a0: 76 65 72 74 20 55 54 46 2d 38 20 74 6f 20 6d 75 vert UTF-8 to mu
c4b0: 6c 74 69 62 79 74 65 20 63 68 61 72 61 63 74 65 ltibyte characte
c4c0: 72 20 73 74 72 69 6e 67 2e 20 20 53 70 61 63 65 r string. Space
c4d0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 0a 2a 2a to hold the .**
c4e0: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 returned string
c4f0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f is obtained fro
c500: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 m sqlite3_malloc
c510: 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c ()..*/.char *sql
c520: 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f ite3_win32_utf8_
c530: 74 6f 5f 6d 62 63 73 28 63 6f 6e 73 74 20 63 68 to_mbcs(const ch
c540: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a ar *zFilename){.
c550: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d char *zFilenam
c560: 65 4d 62 63 73 3b 0a 20 20 4c 50 57 53 54 52 20 eMbcs;. LPWSTR
c570: 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d zTmpWide;.. zTm
c580: 70 57 69 64 65 20 3d 20 77 69 6e 55 74 66 38 54 pWide = winUtf8T
c590: 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 oUnicode(zFilena
c5a0: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 me);. if( zTmpW
c5b0: 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 ide==0 ){. re
c5c0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 turn 0;. }. zF
c5d0: 69 6c 65 6e 61 6d 65 4d 62 63 73 20 3d 20 77 69 ilenameMbcs = wi
c5e0: 6e 55 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28 7a nUnicodeToMbcs(z
c5f0: 54 6d 70 57 69 64 65 29 3b 0a 20 20 73 71 6c 69 TmpWide);. sqli
c600: 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57 69 64 te3_free(zTmpWid
c610: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 e);. return zFi
c620: 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a 7d 0a 0a 2f lenameMbcs;.}../
c630: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 *.** This functi
c640: 6f 6e 20 73 65 74 73 20 74 68 65 20 64 61 74 61 on sets the data
c650: 20 64 69 72 65 63 74 6f 72 79 20 6f 72 20 74 68 directory or th
c660: 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 e temporary dire
c670: 63 74 6f 72 79 20 62 61 73 65 64 20 6f 6e 0a 2a ctory based on.*
c680: 2a 20 74 68 65 20 70 72 6f 76 69 64 65 64 20 61 * the provided a
c690: 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 65 20 74 rguments. The t
c6a0: 79 70 65 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 ype argument mus
c6b0: 74 20 62 65 20 31 20 69 6e 20 6f 72 64 65 72 20 t be 1 in order
c6c0: 74 6f 20 73 65 74 20 74 68 65 0a 2a 2a 20 64 61 to set the.** da
c6d0: 74 61 20 64 69 72 65 63 74 6f 72 79 20 6f 72 20 ta directory or
c6e0: 32 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 2 in order to se
c6f0: 74 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 t the temporary
c700: 64 69 72 65 63 74 6f 72 79 2e 20 20 54 68 65 20 directory. The
c710: 7a 56 61 6c 75 65 0a 2a 2a 20 61 72 67 75 6d 65 zValue.** argume
c720: 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f nt is the name o
c730: 66 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 f the directory
c740: 74 6f 20 75 73 65 2e 20 20 54 68 65 20 72 65 74 to use. The ret
c750: 75 72 6e 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 urn value will b
c760: 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 e.** SQLITE_OK i
c770: 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f f successful..*/
c780: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e .int sqlite3_win
c790: 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 32_set_directory
c7a0: 28 44 57 4f 52 44 20 74 79 70 65 2c 20 4c 50 43 (DWORD type, LPC
c7b0: 57 53 54 52 20 7a 56 61 6c 75 65 29 7b 0a 20 20 WSTR zValue){.
c7c0: 63 68 61 72 20 2a 2a 70 70 44 69 72 65 63 74 6f char **ppDirecto
c7d0: 72 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 ry = 0;.#ifndef
c7e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f SQLITE_OMIT_AUTO
c7f0: 49 4e 49 54 0a 20 20 69 6e 74 20 72 63 20 3d 20 INIT. int rc =
c800: 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 sqlite3_initiali
c810: 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 ze();. if( rc )
c820: 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 return rc;.#end
c830: 69 66 0a 20 20 69 66 28 20 74 79 70 65 3d 3d 53 if. if( type==S
c840: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 QLITE_WIN32_DATA
c850: 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20 _DIRECTORY_TYPE
c860: 29 7b 0a 20 20 20 20 70 70 44 69 72 65 63 74 6f ){. ppDirecto
c870: 72 79 20 3d 20 26 73 71 6c 69 74 65 33 5f 64 61 ry = &sqlite3_da
c880: 74 61 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 ta_directory;.
c890: 7d 65 6c 73 65 20 69 66 28 20 74 79 70 65 3d 3d }else if( type==
c8a0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d SQLITE_WIN32_TEM
c8b0: 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 P_DIRECTORY_TYPE
c8c0: 20 29 7b 0a 20 20 20 20 70 70 44 69 72 65 63 74 ){. ppDirect
c8d0: 6f 72 79 20 3d 20 26 73 71 6c 69 74 65 33 5f 74 ory = &sqlite3_t
c8e0: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 emp_directory;.
c8f0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 70 }. assert( !pp
c900: 44 69 72 65 63 74 6f 72 79 20 7c 7c 20 74 79 70 Directory || typ
c910: 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f e==SQLITE_WIN32_
c920: 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 DATA_DIRECTORY_T
c930: 59 50 45 0a 20 20 20 20 20 20 20 20 20 20 7c 7c YPE. ||
c940: 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 type==SQLITE_WI
c950: 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f N32_TEMP_DIRECTO
c960: 52 59 5f 54 59 50 45 0a 20 20 29 3b 0a 20 20 61 RY_TYPE. );. a
c970: 73 73 65 72 74 28 20 21 70 70 44 69 72 65 63 74 ssert( !ppDirect
c980: 6f 72 79 20 7c 7c 20 73 71 6c 69 74 65 33 4d 65 ory || sqlite3Me
c990: 6d 64 65 62 75 67 48 61 73 54 79 70 65 28 2a 70 mdebugHasType(*p
c9a0: 70 44 69 72 65 63 74 6f 72 79 2c 20 4d 45 4d 54 pDirectory, MEMT
c9b0: 59 50 45 5f 48 45 41 50 29 20 29 3b 0a 20 20 69 YPE_HEAP) );. i
c9c0: 66 28 20 70 70 44 69 72 65 63 74 6f 72 79 20 29 f( ppDirectory )
c9d0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c {. char *zVal
c9e0: 75 65 55 74 66 38 20 3d 20 30 3b 0a 20 20 20 20 ueUtf8 = 0;.
c9f0: 69 66 28 20 7a 56 61 6c 75 65 20 26 26 20 7a 56 if( zValue && zV
ca00: 61 6c 75 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 alue[0] ){.
ca10: 20 7a 56 61 6c 75 65 55 74 66 38 20 3d 20 77 69 zValueUtf8 = wi
ca20: 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a nUnicodeToUtf8(z
ca30: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66 Value);. if
ca40: 20 28 20 7a 56 61 6c 75 65 55 74 66 38 3d 3d 30 ( zValueUtf8==0
ca50: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 ){. retu
ca60: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b rn SQLITE_NOMEM;
ca70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 . }. }.
ca80: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 sqlite3_free(
ca90: 2a 70 70 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 *ppDirectory);.
caa0: 20 20 20 2a 70 70 44 69 72 65 63 74 6f 72 79 20 *ppDirectory
cab0: 3d 20 7a 56 61 6c 75 65 55 74 66 38 3b 0a 20 20 = zValueUtf8;.
cac0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
cad0: 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e OK;. }. return
cae0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d SQLITE_ERROR;.}
caf0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 ../*.** The retu
cb00: 72 6e 20 76 61 6c 75 65 20 6f 66 20 77 69 6e 47 rn value of winG
cb10: 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 0a 2a etLastErrorMsg.*
cb20: 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 * is zero if the
cb30: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 error message f
cb40: 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 65 its in the buffe
cb50: 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a r, or non-zero.*
cb60: 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20 * otherwise (if
cb70: 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 20 the message was
cb80: 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a 73 truncated)..*/.s
cb90: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 tatic int winGet
cba0: 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 44 57 4f LastErrorMsg(DWO
cbb0: 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 69 6e RD lastErrno, in
cbc0: 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 t nBuf, char *zB
cbd0: 75 66 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 uf){. /* Format
cbe0: 4d 65 73 73 61 67 65 20 72 65 74 75 72 6e 73 20 Message returns
cbf0: 30 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20 4f 0 on failure. O
cc00: 74 68 65 72 77 69 73 65 20 69 74 0a 20 20 2a 2a therwise it. **
cc10: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d returns the num
cc20: 62 65 72 20 6f 66 20 54 43 48 41 52 73 20 77 72 ber of TCHARs wr
cc30: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6f 75 74 itten to the out
cc40: 70 75 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c put. ** buffer,
cc50: 20 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20 74 excluding the t
cc60: 65 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 erminating null
cc70: 63 68 61 72 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f char.. */. DWO
cc80: 52 44 20 64 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 RD dwLen = 0;.
cc90: 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a char *zOut = 0;.
cca0: 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 . if( osIsNT()
ccb0: 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 ){.#if SQLITE_OS
ccc0: 5f 57 49 4e 52 54 0a 20 20 20 20 57 43 48 41 52 _WINRT. WCHAR
ccd0: 20 7a 54 65 6d 70 57 69 64 65 5b 53 51 4c 49 54 zTempWide[SQLIT
cce0: 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d E_WIN32_MAX_ERRM
ccf0: 53 47 5f 43 48 41 52 53 2b 31 5d 3b 0a 20 20 20 SG_CHARS+1];.
cd00: 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 dwLen = osForma
cd10: 74 4d 65 73 73 61 67 65 57 28 46 4f 52 4d 41 54 tMessageW(FORMAT
cd20: 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 _MESSAGE_FROM_SY
cd30: 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 STEM |.
cd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd50: 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 FORMAT_MESSA
cd60: 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 GE_IGNORE_INSERT
cd70: 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 S,.
cd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd90: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 NULL,.
cda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cdb0: 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 lastErrno,.
cdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cdd0: 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 0,.
cde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cdf0: 20 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 zTemp
ce00: 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 Wide,.
ce10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ce20: 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f SQLITE_WIN32_
ce30: 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41 52 53 MAX_ERRMSG_CHARS
ce40: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
ce50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0
ce60: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 4c 50 57 );.#else. LPW
ce70: 53 54 52 20 7a 54 65 6d 70 57 69 64 65 20 3d 20 STR zTempWide =
ce80: 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20 NULL;. dwLen
ce90: 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 = osFormatMessag
cea0: 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 eW(FORMAT_MESSAG
ceb0: 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45 E_ALLOCATE_BUFFE
cec0: 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 R |.
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cee0: 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f FORMAT_MESSAGE_
cef0: 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 FROM_SYSTEM |.
cf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cf10: 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 FORMA
cf20: 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 T_MESSAGE_IGNORE
cf30: 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20 _INSERTS,.
cf40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cf50: 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 NULL,.
cf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cf70: 20 20 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 lastEr
cf80: 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 rno,.
cf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cfa0: 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 0,.
cfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cfc0: 20 20 28 4c 50 57 53 54 52 29 20 26 7a 54 65 6d (LPWSTR) &zTem
cfd0: 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 pWide,.
cfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cff0: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 0,.
d000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
d010: 20 20 20 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 0);.#endif.
d020: 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 if( dwLen > 0
d030: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c ){. /* all
d040: 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20 61 ocate a buffer a
d050: 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 nd convert to UT
d060: 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 F8 */. sqli
d070: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 te3BeginBenignMa
d080: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f lloc();. zO
d090: 75 74 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 ut = winUnicodeT
d0a0: 6f 55 74 66 38 28 7a 54 65 6d 70 57 69 64 65 29 oUtf8(zTempWide)
d0b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 ;. sqlite3E
d0c0: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 ndBenignMalloc()
d0d0: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 ;.#if !SQLITE_OS
d0e0: 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 2f 2a 20 _WINRT. /*
d0f0: 66 72 65 65 20 74 68 65 20 73 79 73 74 65 6d 20 free the system
d100: 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 buffer allocated
d110: 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 by FormatMessag
d120: 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 e */. osLoc
d130: 61 6c 46 72 65 65 28 7a 54 65 6d 70 57 69 64 65 alFree(zTempWide
d140: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a );.#endif. }.
d150: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 }.#ifdef SQLIT
d160: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 E_WIN32_HAS_ANSI
d170: 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 . else{. cha
d180: 72 20 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c 3b r *zTemp = NULL;
d190: 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 . dwLen = osF
d1a0: 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 28 46 4f ormatMessageA(FO
d1b0: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c RMAT_MESSAGE_ALL
d1c0: 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 OCATE_BUFFER |.
d1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d FORM
d1f0: 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f AT_MESSAGE_FROM_
d200: 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 SYSTEM |.
d210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
d220: 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 FORMAT_MES
d230: 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 SAGE_IGNORE_INSE
d240: 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 RTS,.
d250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
d260: 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 NULL,.
d270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
d280: 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a lastErrno,.
d290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
d2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 0,.
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
d2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 4c 50 (LP
d2d0: 53 54 52 29 20 26 7a 54 65 6d 70 2c 0a 20 20 20 STR) &zTemp,.
d2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
d2f0: 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 0,.
d300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
d310: 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20 0);.
d320: 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 if( dwLen > 0
d330: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f ){. /* allo
d340: 63 61 74 65 20 61 20 62 75 66 66 65 72 20 61 6e cate a buffer an
d350: 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 d convert to UTF
d360: 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 8 */. sqlit
d370: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c e3BeginBenignMal
d380: 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 loc();. zOu
d390: 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 t = sqlite3_win3
d3a0: 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 2_mbcs_to_utf8(z
d3b0: 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c Temp);. sql
d3c0: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c ite3EndBenignMal
d3d0: 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 2f 2a 20 loc();. /*
d3e0: 66 72 65 65 20 74 68 65 20 73 79 73 74 65 6d 20 free the system
d3f0: 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 buffer allocated
d400: 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 by FormatMessag
d410: 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 e */. osLoc
d420: 61 6c 46 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 alFree(zTemp);.
d430: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a }. }.#endif.
d440: 20 20 69 66 28 20 30 20 3d 3d 20 64 77 4c 65 6e if( 0 == dwLen
d450: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f ){. sqlite3_
d460: 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a snprintf(nBuf, z
d470: 42 75 66 2c 20 22 4f 73 45 72 72 6f 72 20 30 78 Buf, "OsError 0x
d480: 25 6c 78 20 28 25 6c 75 29 22 2c 20 6c 61 73 74 %lx (%lu)", last
d490: 45 72 72 6e 6f 2c 20 6c 61 73 74 45 72 72 6e 6f Errno, lastErrno
d4a0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 );. }else{.
d4b0: 2f 2a 20 63 6f 70 79 20 61 20 6d 61 78 69 6d 75 /* copy a maximu
d4c0: 6d 20 6f 66 20 6e 42 75 66 20 63 68 61 72 73 20 m of nBuf chars
d4d0: 74 6f 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 to output buffer
d4e0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f */. sqlite3_
d4f0: 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a snprintf(nBuf, z
d500: 42 75 66 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 Buf, "%s", zOut)
d510: 3b 0a 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 ;. /* free th
d520: 65 20 55 54 46 38 20 62 75 66 66 65 72 20 2a 2f e UTF8 buffer */
d530: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 . sqlite3_fre
d540: 65 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72 e(zOut);. }. r
d550: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a eturn 0;.}../*.*
d560: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 *.** This functi
d570: 6f 6e 20 2d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 on - winLogError
d580: 41 74 4c 69 6e 65 28 29 20 2d 20 69 73 20 6f 6e AtLine() - is on
d590: 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76 ly ever called v
d5a0: 69 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 ia the macro.**
d5b0: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a winLogError()..*
d5c0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e *.** This routin
d5d0: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 e is invoked aft
d5e0: 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 er an error occu
d5f0: 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 rs in an OS func
d600: 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 6c 6f 67 73 tion..** It logs
d610: 20 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67 a message using
d620: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 sqlite3_log() c
d630: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75 ontaining the cu
d640: 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a rrent value of.*
d650: 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 * error code and
d660: 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 , if possible, t
d670: 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c he human-readabl
d680: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f e equivalent fro
d690: 6d 20 0a 2a 2a 20 46 6f 72 6d 61 74 4d 65 73 73 m .** FormatMess
d6a0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 age..**.** The f
d6b0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 irst argument pa
d6c0: 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72 ssed to the macr
d6d0: 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 o should be the
d6e0: 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a error code that.
d6f0: 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 ** will be retur
d700: 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65 ned to SQLite (e
d710: 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 .g. SQLITE_IOERR
d720: 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f _DELETE, SQLITE_
d730: 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 CANTOPEN). .** T
d740: 68 65 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e he two subsequen
d750: 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 t arguments shou
d760: 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f ld be the name o
d770: 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f f the OS functio
d780: 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 n that.** failed
d790: 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61 and the associa
d7a0: 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 ted file-system
d7b0: 70 61 74 68 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f path, if any..*/
d7c0: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4c 6f 67 45 .#define winLogE
d7d0: 72 72 6f 72 28 61 2c 62 2c 63 2c 64 29 20 20 20 rror(a,b,c,d)
d7e0: 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e winLogErrorAtLin
d7f0: 65 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45 e(a,b,c,d,__LINE
d800: 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20 77 __).static int w
d810: 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 inLogErrorAtLine
d820: 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c (. int errcode,
d830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
d840: 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72 /* SQLite er
d850: 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 44 57 ror code */. DW
d860: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 20 ORD lastErrno,
d870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
d880: 20 57 69 6e 33 32 20 6c 61 73 74 20 65 72 72 6f Win32 last erro
d890: 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 r */. const cha
d8a0: 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 r *zFunc,
d8b0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f /* Name o
d8c0: 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 f OS function th
d8d0: 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63 at failed */. c
d8e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 onst char *zPath
d8f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f , /
d900: 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f * File path asso
d910: 63 69 61 74 65 64 20 77 69 74 68 20 65 72 72 6f ciated with erro
d920: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 r */. int iLine
d930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
d940: 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 /* Source
d950: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 line number whe
d960: 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 re error occurre
d970: 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a d */.){. char z
d980: 4d 73 67 5b 35 30 30 5d 3b 20 20 20 20 20 20 20 Msg[500];
d990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 75 6d /* Hum
d9a0: 61 6e 20 72 65 61 64 61 62 6c 65 20 65 72 72 6f an readable erro
d9b0: 72 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 r text */. int
d9c0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 i;
d9d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c /* L
d9e0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a oop counter */..
d9f0: 20 20 7a 4d 73 67 5b 30 5d 20 3d 20 30 3b 0a 20 zMsg[0] = 0;.
da00: 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 winGetLastError
da10: 4d 73 67 28 6c 61 73 74 45 72 72 6e 6f 2c 20 73 Msg(lastErrno, s
da20: 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73 izeof(zMsg), zMs
da30: 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 72 g);. assert( er
da40: 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b rcode!=SQLITE_OK
da50: 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 3d );. if( zPath=
da60: 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b =0 ) zPath = "";
da70: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d 73 67 . for(i=0; zMsg
da80: 5b 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d [i] && zMsg[i]!=
da90: 27 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69 5d 21 '\r' && zMsg[i]!
daa0: 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 ='\n'; i++){}.
dab0: 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 zMsg[i] = 0;. s
dac0: 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f qlite3_log(errco
dad0: 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 77 69 de,. "os_wi
dae0: 6e 2e 63 3a 25 64 3a 20 28 25 6c 75 29 20 25 73 n.c:%d: (%lu) %s
daf0: 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 (%s) - %s",.
db00: 20 20 69 4c 69 6e 65 2c 20 6c 61 73 74 45 72 72 iLine, lastErr
db10: 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 no, zFunc, zPath
db20: 2c 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20 20 72 , zMsg. );.. r
db30: 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d eturn errcode;.}
db40: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 ../*.** The numb
db50: 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 er of times that
db60: 20 61 20 52 65 61 64 46 69 6c 65 28 29 2c 20 57 a ReadFile(), W
db70: 72 69 74 65 46 69 6c 65 28 29 2c 20 61 6e 64 20 riteFile(), and
db80: 44 65 6c 65 74 65 46 69 6c 65 28 29 0a 2a 2a 20 DeleteFile().**
db90: 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65 64 20 will be retried
dba0: 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f 63 6b following a lock
dbb0: 69 6e 67 20 65 72 72 6f 72 20 2d 20 70 72 6f 62 ing error - prob
dbc0: 61 62 6c 79 20 63 61 75 73 65 64 20 62 79 20 0a ably caused by .
dbd0: 2a 2a 20 61 6e 74 69 76 69 72 75 73 20 73 6f 66 ** antivirus sof
dbe0: 74 77 61 72 65 2e 20 20 41 6c 73 6f 20 74 68 65 tware. Also the
dbf0: 20 69 6e 69 74 69 61 6c 20 64 65 6c 61 79 20 62 initial delay b
dc00: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 efore the first
dc10: 72 65 74 72 79 2e 0a 2a 2a 20 54 68 65 20 64 65 retry..** The de
dc20: 6c 61 79 20 69 6e 63 72 65 61 73 65 73 20 6c 69 lay increases li
dc30: 6e 65 61 72 6c 79 20 77 69 74 68 20 65 61 63 68 nearly with each
dc40: 20 72 65 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 retry..*/.#ifnd
dc50: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f ef SQLITE_WIN32_
dc60: 49 4f 45 52 52 5f 52 45 54 52 59 0a 23 20 64 65 IOERR_RETRY.# de
dc70: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 fine SQLITE_WIN3
dc80: 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 20 31 30 2_IOERR_RETRY 10
dc90: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 .#endif.#ifndef
dca0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 SQLITE_WIN32_IOE
dcb0: 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 0a 23 RR_RETRY_DELAY.#
dcc0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 define SQLITE_W
dcd0: 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 IN32_IOERR_RETRY
dce0: 5f 44 45 4c 41 59 20 32 35 0a 23 65 6e 64 69 66 _DELAY 25.#endif
dcf0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49 .static int winI
dd00: 6f 65 72 72 52 65 74 72 79 20 3d 20 53 51 4c 49 oerrRetry = SQLI
dd10: 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 TE_WIN32_IOERR_R
dd20: 45 54 52 59 3b 0a 73 74 61 74 69 63 20 69 6e 74 ETRY;.static int
dd30: 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 winIoerrRetryDe
dd40: 6c 61 79 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e lay = SQLITE_WIN
dd50: 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 32_IOERR_RETRY_D
dd60: 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 ELAY;../*.** If
dd70: 61 20 52 65 61 64 46 69 6c 65 28 29 20 6f 72 20 a ReadFile() or
dd80: 57 72 69 74 65 46 69 6c 65 28 29 20 65 72 72 6f WriteFile() erro
dd90: 72 20 6f 63 63 75 72 73 2c 20 69 6e 76 6f 6b 65 r occurs, invoke
dda0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a this routine.**
ddb0: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 73 68 to see if it sh
ddc0: 6f 75 6c 64 20 62 65 20 72 65 74 72 69 65 64 2e ould be retried.
ddd0: 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 74 6f Return TRUE to
dde0: 20 72 65 74 72 79 2e 20 20 52 65 74 75 72 6e 20 retry. Return
ddf0: 46 41 4c 53 45 0a 2a 2a 20 74 6f 20 67 69 76 65 FALSE.** to give
de00: 20 75 70 20 77 69 74 68 20 61 6e 20 65 72 72 6f up with an erro
de10: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 r..*/.static int
de20: 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 69 winRetryIoerr(i
de30: 6e 74 20 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f nt *pnRetry, DWO
de40: 52 44 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44 RD *pError){. D
de50: 57 4f 52 44 20 65 20 3d 20 6f 73 47 65 74 4c 61 WORD e = osGetLa
de60: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 stError();. if(
de70: 20 2a 70 6e 52 65 74 72 79 3e 3d 77 69 6e 49 6f *pnRetry>=winIo
de80: 65 72 72 52 65 74 72 79 20 29 7b 0a 20 20 20 20 errRetry ){.
de90: 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 if( pError ){.
dea0: 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b *pError = e;
deb0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 . }. retur
dec0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 n 0;. }. if( e
ded0: 3d 3d 45 52 52 4f 52 5f 41 43 43 45 53 53 5f 44 ==ERROR_ACCESS_D
dee0: 45 4e 49 45 44 20 7c 7c 0a 20 20 20 20 20 20 65 ENIED ||. e
def0: 3d 3d 45 52 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f ==ERROR_LOCK_VIO
df00: 4c 41 54 49 4f 4e 20 7c 7c 0a 20 20 20 20 20 20 LATION ||.
df10: 65 3d 3d 45 52 52 4f 52 5f 53 48 41 52 49 4e 47 e==ERROR_SHARING
df20: 5f 56 49 4f 4c 41 54 49 4f 4e 20 29 7b 0a 20 20 _VIOLATION ){.
df30: 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f sqlite3_win32_
df40: 73 6c 65 65 70 28 77 69 6e 49 6f 65 72 72 52 65 sleep(winIoerrRe
df50: 74 72 79 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 tryDelay*(1+*pnR
df60: 65 74 72 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 etry));. ++*p
df70: 6e 52 65 74 72 79 3b 0a 20 20 20 20 72 65 74 75 nRetry;. retu
df80: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 rn 1;. }. if(
df90: 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 2a 70 pError ){. *p
dfa0: 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 Error = e;. }.
dfb0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a return 0;.}../*
dfc0: 0a 2a 2a 20 4c 6f 67 20 61 20 49 2f 4f 20 65 72 .** Log a I/O er
dfd0: 72 6f 72 20 72 65 74 72 79 20 65 70 69 73 6f 64 ror retry episod
dfe0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 e..*/.static voi
dff0: 64 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 69 6e d winLogIoerr(in
e000: 74 20 6e 52 65 74 72 79 29 7b 0a 20 20 69 66 28 t nRetry){. if(
e010: 20 6e 52 65 74 72 79 20 29 7b 0a 20 20 20 20 73 nRetry ){. s
e020: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 qlite3_log(SQLIT
e030: 45 5f 49 4f 45 52 52 2c 20 0a 20 20 20 20 20 20 E_IOERR, .
e040: 22 64 65 6c 61 79 65 64 20 25 64 6d 73 20 66 6f "delayed %dms fo
e050: 72 20 6c 6f 63 6b 2f 73 68 61 72 69 6e 67 20 63 r lock/sharing c
e060: 6f 6e 66 6c 69 63 74 22 2c 0a 20 20 20 20 20 20 onflict",.
e070: 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c winIoerrRetryDel
e080: 61 79 2a 6e 52 65 74 72 79 2a 28 6e 52 65 74 72 ay*nRetry*(nRetr
e090: 79 2b 31 29 2f 32 0a 20 20 20 20 29 3b 0a 20 20 y+1)/2. );.
e0a0: 7d 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f }.}..#if SQLITE_
e0b0: 4f 53 5f 57 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a OS_WINCE./******
e0c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
e0d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
e0e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
e0f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
e100: 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 65 63 74 ***.** This sect
e110: 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 ion contains cod
e120: 65 20 66 6f 72 20 57 69 6e 43 45 20 6f 6e 6c 79 e for WinCE only
e130: 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 ..*/.#if !define
e140: 64 28 53 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f d(SQLITE_MSVC_LO
e150: 43 41 4c 54 49 4d 45 5f 41 50 49 29 20 7c 7c 20 CALTIME_API) ||
e160: 21 53 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 !SQLITE_MSVC_LOC
e170: 41 4c 54 49 4d 45 5f 41 50 49 0a 2f 2a 0a 2a 2a ALTIME_API./*.**
e180: 20 54 68 65 20 4d 53 56 43 20 43 52 54 20 6f 6e The MSVC CRT on
e190: 20 57 69 6e 64 6f 77 73 20 43 45 20 6d 61 79 20 Windows CE may
e1a0: 6e 6f 74 20 68 61 76 65 20 61 20 6c 6f 63 61 6c not have a local
e1b0: 74 69 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e time() function.
e1c0: 20 20 53 6f 0a 2a 2a 20 63 72 65 61 74 65 20 61 So.** create a
e1d0: 20 73 75 62 73 74 69 74 75 74 65 2e 0a 2a 2f 0a substitute..*/.
e1e0: 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 #include <time.h
e1f0: 3e 0a 73 74 72 75 63 74 20 74 6d 20 2a 5f 5f 63 >.struct tm *__c
e200: 64 65 63 6c 20 6c 6f 63 61 6c 74 69 6d 65 28 63 decl localtime(c
e210: 6f 6e 73 74 20 74 69 6d 65 5f 74 20 2a 74 29 0a onst time_t *t).
e220: 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63 {. static struc
e230: 74 20 74 6d 20 79 3b 0a 20 20 46 49 4c 45 54 49 t tm y;. FILETI
e240: 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 ME uTm, lTm;. S
e250: 59 53 54 45 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 YSTEMTIME pTm;.
e260: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 sqlite3_int64 t
e270: 36 34 3b 0a 20 20 74 36 34 20 3d 20 2a 74 3b 0a 64;. t64 = *t;.
e280: 20 20 74 36 34 20 3d 20 28 74 36 34 20 2b 20 31 t64 = (t64 + 1
e290: 31 36 34 34 34 37 33 36 30 30 29 2a 31 30 30 30 1644473600)*1000
e2a0: 30 30 30 30 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f 0000;. uTm.dwLo
e2b0: 77 44 61 74 65 54 69 6d 65 20 3d 20 28 44 57 4f wDateTime = (DWO
e2c0: 52 44 29 28 74 36 34 20 26 20 30 78 46 46 46 46 RD)(t64 & 0xFFFF
e2d0: 46 46 46 46 29 3b 0a 20 20 75 54 6d 2e 64 77 48 FFFF);. uTm.dwH
e2e0: 69 67 68 44 61 74 65 54 69 6d 65 3d 20 28 44 57 ighDateTime= (DW
e2f0: 4f 52 44 29 28 74 36 34 20 3e 3e 20 33 32 29 3b ORD)(t64 >> 32);
e300: 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c . osFileTimeToL
e310: 6f 63 61 6c 46 69 6c 65 54 69 6d 65 28 26 75 54 ocalFileTime(&uT
e320: 6d 2c 26 6c 54 6d 29 3b 0a 20 20 6f 73 46 69 6c m,&lTm);. osFil
e330: 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d eTimeToSystemTim
e340: 65 28 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 e(&lTm,&pTm);.
e350: 79 2e 74 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e y.tm_year = pTm.
e360: 77 59 65 61 72 20 2d 20 31 39 30 30 3b 0a 20 20 wYear - 1900;.
e370: 79 2e 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 y.tm_mon = pTm.w
e380: 4d 6f 6e 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74 Month - 1;. y.t
e390: 6d 5f 77 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 m_wday = pTm.wDa
e3a0: 79 4f 66 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f yOfWeek;. y.tm_
e3b0: 6d 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b mday = pTm.wDay;
e3c0: 0a 20 20 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 . y.tm_hour = p
e3d0: 54 6d 2e 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d Tm.wHour;. y.tm
e3e0: 5f 6d 69 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 _min = pTm.wMinu
e3f0: 74 65 3b 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d te;. y.tm_sec =
e400: 20 70 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 pTm.wSecond;.
e410: 72 65 74 75 72 6e 20 26 79 3b 0a 7d 0a 23 65 6e return &y;.}.#en
e420: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e dif..#define HAN
e430: 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61 DLE_TO_WINFILE(a
e440: 29 20 28 77 69 6e 46 69 6c 65 2a 29 26 28 28 63 ) (winFile*)&((c
e450: 68 61 72 2a 29 61 29 5b 2d 28 69 6e 74 29 6f 66 har*)a)[-(int)of
e460: 66 73 65 74 6f 66 28 77 69 6e 46 69 6c 65 2c 68 fsetof(winFile,h
e470: 29 5d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 )]../*.** Acquir
e480: 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 e a lock on the
e490: 68 61 6e 64 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 handle h.*/.stat
e4a0: 69 63 20 76 6f 69 64 20 77 69 6e 63 65 4d 75 74 ic void winceMut
e4b0: 65 78 41 63 71 75 69 72 65 28 48 41 4e 44 4c 45 exAcquire(HANDLE
e4c0: 20 68 29 7b 0a 20 20 20 44 57 4f 52 44 20 64 77 h){. DWORD dw
e4d0: 45 72 72 3b 0a 20 20 20 64 6f 20 7b 0a 20 20 20 Err;. do {.
e4e0: 20 20 64 77 45 72 72 20 3d 20 6f 73 57 61 69 74 dwErr = osWait
e4f0: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 ForSingleObject(
e500: 68 2c 20 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20 h, INFINITE);.
e510: 20 7d 20 77 68 69 6c 65 20 28 64 77 45 72 72 20 } while (dwErr
e520: 21 3d 20 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 != WAIT_OBJECT_0
e530: 20 26 26 20 64 77 45 72 72 20 21 3d 20 57 41 49 && dwErr != WAI
e540: 54 5f 41 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a T_ABANDONED);.}.
e550: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 /*.** Release a
e560: 6c 6f 63 6b 20 61 63 71 75 69 72 65 64 20 62 79 lock acquired by
e570: 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 winceMutexAcqui
e580: 72 65 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 re().*/.#define
e590: 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 winceMutexReleas
e5a0: 65 28 68 29 20 52 65 6c 65 61 73 65 4d 75 74 65 e(h) ReleaseMute
e5b0: 78 28 68 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 x(h)../*.** Crea
e5c0: 74 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 te the mutex and
e5d0: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 75 shared memory u
e5e0: 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 sed for locking
e5f0: 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64 in the file.** d
e600: 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 0a escriptor pFile.
e610: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 */.static int wi
e620: 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f nceCreateLock(co
e630: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e nst char *zFilen
e640: 61 6d 65 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46 ame, winFile *pF
e650: 69 6c 65 29 7b 0a 20 20 4c 50 57 53 54 52 20 7a ile){. LPWSTR z
e660: 54 6f 6b 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4e Tok;. LPWSTR zN
e670: 61 6d 65 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 ame;. DWORD las
e680: 74 45 72 72 6e 6f 3b 0a 20 20 42 4f 4f 4c 20 62 tErrno;. BOOL b
e690: 4c 6f 67 67 65 64 20 3d 20 46 41 4c 53 45 3b 0a Logged = FALSE;.
e6a0: 20 20 42 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54 BOOL bInit = T
e6b0: 52 55 45 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 RUE;.. zName =
e6c0: 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 winUtf8ToUnicode
e6d0: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 (zFilename);. i
e6e0: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 f( zName==0 ){.
e6f0: 20 20 20 2f 2a 20 6f 75 74 20 6f 66 20 6d 65 6d /* out of mem
e700: 6f 72 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 ory */. retur
e710: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e n SQLITE_IOERR_N
e720: 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 OMEM;. }.. /*
e730: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c Initialize the l
e740: 6f 63 61 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f ocal lockdata */
e750: 0a 20 20 6d 65 6d 73 65 74 28 26 70 46 69 6c 65 . memset(&pFile
e760: 2d 3e 6c 6f 63 61 6c 2c 20 30 2c 20 73 69 7a 65 ->local, 0, size
e770: 6f 66 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 of(pFile->local)
e780: 29 3b 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 );.. /* Replace
e790: 20 74 68 65 20 62 61 63 6b 73 6c 61 73 68 65 73 the backslashes
e7a0: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 from the filena
e7b0: 6d 65 20 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 me and lowercase
e7c0: 20 69 74 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69 it. ** to deri
e7d0: 76 65 20 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e ve a mutex name.
e7e0: 20 2a 2f 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73 43 */. zTok = osC
e7f0: 68 61 72 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29 harLowerW(zName)
e800: 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b ;. for (;*zTok;
e810: 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20 zTok++){. if
e820: 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 (*zTok == '\\')
e830: 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d *zTok = '_';. }
e840: 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70 .. /* Create/op
e850: 65 6e 20 74 68 65 20 6e 61 6d 65 64 20 6d 75 74 en the named mut
e860: 65 78 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 ex */. pFile->h
e870: 4d 75 74 65 78 20 3d 20 6f 73 43 72 65 61 74 65 Mutex = osCreate
e880: 4d 75 74 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c MutexW(NULL, FAL
e890: 53 45 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 SE, zName);. if
e8a0: 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 (!pFile->hMutex
e8b0: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 ){. pFile->la
e8c0: 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c stErrno = osGetL
e8d0: 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 astError();.
e8e0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 sqlite3_free(zNa
e8f0: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 me);. return
e900: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 winLogError(SQLI
e910: 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d TE_IOERR, pFile-
e920: 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 >lastErrno,.
e930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
e940: 20 20 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c "winceCreateL
e950: 6f 63 6b 31 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 ock1", zFilename
e960: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 );. }.. /* Acq
e970: 75 69 72 65 20 74 68 65 20 6d 75 74 65 78 20 62 uire the mutex b
e980: 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 efore continuing
e990: 20 2a 2f 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 */. winceMutex
e9a0: 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 Acquire(pFile->h
e9b0: 4d 75 74 65 78 29 3b 0a 20 20 0a 20 20 2f 2a 20 Mutex);. . /*
e9c0: 53 69 6e 63 65 20 74 68 65 20 6e 61 6d 65 73 20 Since the names
e9d0: 6f 66 20 6e 61 6d 65 64 20 6d 75 74 65 78 65 73 of named mutexes
e9e0: 2c 20 73 65 6d 61 70 68 6f 72 65 73 2c 20 66 69 , semaphores, fi
e9f0: 6c 65 20 6d 61 70 70 69 6e 67 73 20 65 74 63 20 le mappings etc
ea00: 61 72 65 20 0a 20 20 2a 2a 20 63 61 73 65 2d 73 are . ** case-s
ea10: 65 6e 73 69 74 69 76 65 2c 20 74 61 6b 65 20 61 ensitive, take a
ea20: 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 61 74 dvantage of that
ea30: 20 62 79 20 75 70 70 65 72 63 61 73 69 6e 67 20 by uppercasing
ea40: 74 68 65 20 6d 75 74 65 78 20 6e 61 6d 65 0a 20 the mutex name.
ea50: 20 2a 2a 20 61 6e 64 20 75 73 69 6e 67 20 74 68 ** and using th
ea60: 61 74 20 61 73 20 74 68 65 20 73 68 61 72 65 64 at as the shared
ea70: 20 66 69 6c 65 6d 61 70 70 69 6e 67 20 6e 61 6d filemapping nam
ea80: 65 2e 0a 20 20 2a 2f 0a 20 20 6f 73 43 68 61 72 e.. */. osChar
ea90: 55 70 70 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 UpperW(zName);.
eaa0: 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 pFile->hShared
eab0: 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 = osCreateFileMa
eac0: 70 70 69 6e 67 57 28 49 4e 56 41 4c 49 44 5f 48 ppingW(INVALID_H
ead0: 41 4e 44 4c 45 5f 56 41 4c 55 45 2c 20 4e 55 4c ANDLE_VALUE, NUL
eae0: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 L,.
eaf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
eb00: 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 5f PAGE_
eb10: 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20 73 69 READWRITE, 0, si
eb20: 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 2c zeof(winceLock),
eb30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
eb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
eb50: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 29 3b zName);
eb60: 20 20 0a 0a 20 20 2f 2a 20 53 65 74 20 61 20 66 .. /* Set a f
eb70: 6c 61 67 20 74 68 61 74 20 69 6e 64 69 63 61 74 lag that indicat
eb80: 65 73 20 77 65 27 72 65 20 74 68 65 20 66 69 72 es we're the fir
eb90: 73 74 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 st to create the
eba0: 20 6d 65 6d 6f 72 79 20 73 6f 20 69 74 20 0a 20 memory so it .
ebb0: 20 2a 2a 20 6d 75 73 74 20 62 65 20 7a 65 72 6f ** must be zero
ebc0: 2d 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a -initialized */.
ebd0: 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 lastErrno = os
ebe0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a GetLastError();.
ebf0: 20 20 69 66 20 28 6c 61 73 74 45 72 72 6e 6f 20 if (lastErrno
ec00: 3d 3d 20 45 52 52 4f 52 5f 41 4c 52 45 41 44 59 == ERROR_ALREADY
ec10: 5f 45 58 49 53 54 53 29 7b 0a 20 20 20 20 62 49 _EXISTS){. bI
ec20: 6e 69 74 20 3d 20 46 41 4c 53 45 3b 0a 20 20 7d nit = FALSE;. }
ec30: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 .. sqlite3_free
ec40: 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49 (zName);.. /* I
ec50: 66 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69 f we succeeded i
ec60: 6e 20 6d 61 6b 69 6e 67 20 74 68 65 20 73 68 61 n making the sha
ec70: 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c red memory handl
ec80: 65 2c 20 6d 61 70 20 69 74 2e 20 2a 2f 0a 20 20 e, map it. */.
ec90: 69 66 28 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 if( pFile->hShar
eca0: 65 64 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d ed ){. pFile-
ecb0: 3e 73 68 61 72 65 64 20 3d 20 28 77 69 6e 63 65 >shared = (wince
ecc0: 4c 6f 63 6b 2a 29 6f 73 4d 61 70 56 69 65 77 4f Lock*)osMapViewO
ecd0: 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 fFile(pFile->hSh
ece0: 61 72 65 64 2c 20 0a 20 20 20 20 20 20 20 20 20 ared, .
ecf0: 20 20 20 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 FILE_MAP_REA
ed00: 44 7c 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 D|FILE_MAP_WRITE
ed10: 2c 20 30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 , 0, 0, sizeof(w
ed20: 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 inceLock));.
ed30: 2f 2a 20 49 66 20 6d 61 70 70 69 6e 67 20 66 61 /* If mapping fa
ed40: 69 6c 65 64 2c 20 63 6c 6f 73 65 20 74 68 65 20 iled, close the
ed50: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 shared memory ha
ed60: 6e 64 6c 65 20 61 6e 64 20 65 72 61 73 65 20 69 ndle and erase i
ed70: 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 46 t */. if( !pF
ed80: 69 6c 65 2d 3e 73 68 61 72 65 64 20 29 7b 0a 20 ile->shared ){.
ed90: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 pFile->last
eda0: 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 Errno = osGetLas
edb0: 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 tError();.
edc0: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 winLogError(SQLI
edd0: 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d TE_IOERR, pFile-
ede0: 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 >lastErrno,.
edf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 "w
ee00: 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 32 22 inceCreateLock2"
ee10: 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 , zFilename);.
ee20: 20 20 20 20 62 4c 6f 67 67 65 64 20 3d 20 54 52 bLogged = TR
ee30: 55 45 3b 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 UE;. osClos
ee40: 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 eHandle(pFile->h
ee50: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 Shared);. p
ee60: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 File->hShared =
ee70: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a NULL;. }. }.
ee80: 0a 20 20 2f 2a 20 49 66 20 73 68 61 72 65 64 20 . /* If shared
ee90: 6d 65 6d 6f 72 79 20 63 6f 75 6c 64 20 6e 6f 74 memory could not
eea0: 20 62 65 20 63 72 65 61 74 65 64 2c 20 74 68 65 be created, the
eeb0: 6e 20 63 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 n close the mute
eec0: 78 20 61 6e 64 20 66 61 69 6c 20 2a 2f 0a 20 20 x and fail */.
eed0: 69 66 28 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 if( pFile->hShar
eee0: 65 64 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 ed==NULL ){.
eef0: 69 66 28 20 21 62 4c 6f 67 67 65 64 20 29 7b 0a if( !bLogged ){.
ef00: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 pFile->las
ef10: 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 tErrno = lastErr
ef20: 6e 6f 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 no;. winLog
ef30: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 Error(SQLITE_IOE
ef40: 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 RR, pFile->lastE
ef50: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 rrno,.
ef60: 20 20 20 20 20 20 20 20 22 77 69 6e 63 65 43 72 "winceCr
ef70: 65 61 74 65 4c 6f 63 6b 33 22 2c 20 7a 46 69 6c eateLock3", zFil
ef80: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 4c ename);. bL
ef90: 6f 67 67 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 ogged = TRUE;.
efa0: 20 20 7d 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 }. winceMut
efb0: 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d exRelease(pFile-
efc0: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 6f 73 >hMutex);. os
efd0: 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c CloseHandle(pFil
efe0: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 e->hMutex);.
eff0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 pFile->hMutex =
f000: 4e 55 4c 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e NULL;. return
f010: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 SQLITE_IOERR;.
f020: 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 6e 69 74 69 }. . /* Initi
f030: 61 6c 69 7a 65 20 74 68 65 20 73 68 61 72 65 64 alize the shared
f040: 20 6d 65 6d 6f 72 79 20 69 66 20 77 65 27 72 65 memory if we're
f050: 20 73 75 70 70 6f 73 65 64 20 74 6f 20 2a 2f 0a supposed to */.
f060: 20 20 69 66 28 20 62 49 6e 69 74 20 29 7b 0a 20 if( bInit ){.
f070: 20 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2d memset(pFile-
f080: 3e 73 68 61 72 65 64 2c 20 30 2c 20 73 69 7a 65 >shared, 0, size
f090: 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a of(winceLock));.
f0a0: 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 }.. winceMute
f0b0: 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e xRelease(pFile->
f0c0: 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 hMutex);. retur
f0d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a n SQLITE_OK;.}..
f0e0: 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74 68 /*.** Destroy th
f0f0: 65 20 70 61 72 74 20 6f 66 20 77 69 6e 46 69 6c e part of winFil
f100: 65 20 74 68 61 74 20 64 65 61 6c 73 20 77 69 74 e that deals wit
f110: 68 20 77 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f h wince locks.*/
f120: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e .static void win
f130: 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 77 69 ceDestroyLock(wi
f140: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 nFile *pFile){.
f150: 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 4d 75 74 if (pFile->hMut
f160: 65 78 29 7b 0a 20 20 20 20 2f 2a 20 41 63 71 75 ex){. /* Acqu
f170: 69 72 65 20 74 68 65 20 6d 75 74 65 78 20 2a 2f ire the mutex */
f180: 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 41 . winceMutexA
f190: 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d cquire(pFile->hM
f1a0: 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 utex);.. /* T
f1b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f he following blo
f1c0: 63 6b 73 20 73 68 6f 75 6c 64 20 70 72 6f 62 61 cks should proba
f1d0: 62 6c 79 20 61 73 73 65 72 74 20 69 6e 20 64 65 bly assert in de
f1e0: 62 75 67 20 6d 6f 64 65 2c 20 62 75 74 20 74 68 bug mode, but th
f1f0: 65 79 0a 20 20 20 20 20 20 20 61 72 65 20 74 6f ey. are to
f200: 20 63 6c 65 61 6e 75 70 20 69 6e 20 63 61 73 65 cleanup in case
f210: 20 61 6e 79 20 6c 6f 63 6b 73 20 72 65 6d 61 69 any locks remai
f220: 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 ned open */.
f230: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c if (pFile->local
f240: 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 .nReaders){.
f250: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d pFile->shared-
f260: 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 >nReaders --;.
f270: 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c }. if (pFil
f280: 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 e->local.bReserv
f290: 65 64 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 ed){. pFile
f2a0: 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 ->shared->bReser
f2b0: 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 ved = FALSE;.
f2c0: 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 }. if (pFile
f2d0: 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 ->local.bPending
f2e0: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e ){. pFile->
f2f0: 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 shared->bPending
f300: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a = FALSE;. }.
f310: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c if (pFile->l
f320: 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 ocal.bExclusive)
f330: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 {. pFile->s
f340: 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 hared->bExclusiv
f350: 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d e = FALSE;. }
f360: 0a 0a 20 20 20 20 2f 2a 20 44 65 2d 72 65 66 65 .. /* De-refe
f370: 72 65 6e 63 65 20 61 6e 64 20 63 6c 6f 73 65 20 rence and close
f380: 6f 75 72 20 63 6f 70 79 20 6f 66 20 74 68 65 20 our copy of the
f390: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 shared memory ha
f3a0: 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 6f 73 55 6e ndle */. osUn
f3b0: 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 mapViewOfFile(pF
f3c0: 69 6c 65 2d 3e 73 68 61 72 65 64 29 3b 0a 20 20 ile->shared);.
f3d0: 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 osCloseHandle(
f3e0: 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b pFile->hShared);
f3f0: 0a 0a 20 20 20 20 2f 2a 20 44 6f 6e 65 20 77 69 .. /* Done wi
f400: 74 68 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a th the mutex */.
f410: 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 winceMutexRe
f420: 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 lease(pFile->hMu
f430: 74 65 78 29 3b 20 20 20 20 0a 20 20 20 20 6f 73 tex); . os
f440: 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c CloseHandle(pFil
f450: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 e->hMutex);.
f460: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 pFile->hMutex =
f470: 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 NULL;. }.}../*
f480: 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 .** An implement
f490: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 ation of the Loc
f4a0: 6b 46 69 6c 65 28 29 20 41 50 49 20 6f 66 20 57 kFile() API of W
f4b0: 69 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f indows for CE.*/
f4c0: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e .static BOOL win
f4d0: 63 65 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 ceLockFile(. LP
f4e0: 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 HANDLE phFile,.
f4f0: 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 DWORD dwFileOff
f500: 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 setLow,. DWORD
f510: 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 dwFileOffsetHigh
f520: 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 ,. DWORD nNumbe
f530: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f rOfBytesToLockLo
f540: 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 w,. DWORD nNumb
f550: 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 erOfBytesToLockH
f560: 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 igh.){. winFile
f570: 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 *pFile = HANDLE
f580: 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 _TO_WINFILE(phFi
f590: 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 le);. BOOL bRet
f5a0: 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 urn = FALSE;..
f5b0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 UNUSED_PARAMETER
f5c0: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 (dwFileOffsetHig
f5d0: 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 h);. UNUSED_PAR
f5e0: 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 AMETER(nNumberOf
f5f0: 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29 BytesToLockHigh)
f600: 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d ;.. if (!pFile-
f610: 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20 >hMutex) return
f620: 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 TRUE;. winceMut
f630: 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d exAcquire(pFile-
f640: 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 >hMutex);.. /*
f650: 57 61 6e 74 69 6e 67 20 61 6e 20 65 78 63 6c 75 Wanting an exclu
f660: 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 sive lock? */.
f670: 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 if (dwFileOffset
f680: 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 Low == (DWORD)SH
f690: 41 52 45 44 5f 46 49 52 53 54 0a 20 20 20 20 20 ARED_FIRST.
f6a0: 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 && nNumberOfBy
f6b0: 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 tesToLockLow ==
f6c0: 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 (DWORD)SHARED_SI
f6d0: 5a 45 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 ZE){. if (pFi
f6e0: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 le->shared->nRea
f6f0: 64 65 72 73 20 3d 3d 20 30 20 26 26 20 70 46 69 ders == 0 && pFi
f700: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 le->shared->bExc
f710: 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 lusive == 0){.
f720: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 pFile->shar
f730: 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d ed->bExclusive =
f740: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20 70 46 TRUE;. pF
f750: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c ile->local.bExcl
f760: 75 73 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 usive = TRUE;.
f770: 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 bReturn = T
f780: 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a RUE;. }. }..
f790: 20 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 61 64 /* Want a read
f7a0: 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 -only lock? */.
f7b0: 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 else if (dwFile
f7c0: 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 OffsetLow == (DW
f7d0: 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 ORD)SHARED_FIRST
f7e0: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 6e &&. n
f7f0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c NumberOfBytesToL
f800: 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 ockLow == 1){.
f810: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 if (pFile->sha
f820: 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 red->bExclusive
f830: 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 70 46 69 == 0){. pFi
f840: 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 le->local.nReade
f850: 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 rs ++;. if
f860: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 (pFile->local.nR
f870: 65 61 64 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20 eaders == 1){.
f880: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 pFile->sha
f890: 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b red->nReaders ++
f8a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
f8b0: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a bReturn = TRUE;.
f8c0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 }. }.. /*
f8d0: 57 61 6e 74 20 61 20 70 65 6e 64 69 6e 67 20 6c Want a pending l
f8e0: 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 ock? */. else i
f8f0: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c f (dwFileOffsetL
f900: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e ow == (DWORD)PEN
f910: 44 49 4e 47 5f 42 59 54 45 0a 20 20 20 20 20 20 DING_BYTE.
f920: 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f && nNumberO
f930: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 fBytesToLockLow
f940: 3d 3d 20 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66 == 1){. /* If
f950: 20 6e 6f 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b no pending lock
f960: 20 68 61 73 20 62 65 65 6e 20 61 63 71 75 69 72 has been acquir
f970: 65 64 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 ed, then acquire
f980: 20 69 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 it */. if (p
f990: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 File->shared->bP
f9a0: 65 6e 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20 ending == 0) {.
f9b0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 pFile->shar
f9c0: 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54 ed->bPending = T
f9d0: 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 RUE;. pFile
f9e0: 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 ->local.bPending
f9f0: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 = TRUE;. b
fa00: 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 Return = TRUE;.
fa10: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 }. }.. /* W
fa20: 61 6e 74 20 61 20 72 65 73 65 72 76 65 64 20 6c ant a reserved l
fa30: 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 ock? */. else i
fa40: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c f (dwFileOffsetL
fa50: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 ow == (DWORD)RES
fa60: 45 52 56 45 44 5f 42 59 54 45 0a 20 20 20 20 20 ERVED_BYTE.
fa70: 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 && nNumber
fa80: 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 OfBytesToLockLow
fa90: 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 == 1){. if (
faa0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 pFile->shared->b
fab0: 52 65 73 65 72 76 65 64 20 3d 3d 20 30 29 20 7b Reserved == 0) {
fac0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 . pFile->sh
fad0: 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 ared->bReserved
fae0: 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46 = TRUE;. pF
faf0: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 ile->local.bRese
fb00: 72 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 rved = TRUE;.
fb10: 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 bReturn = TRU
fb20: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 E;. }. }..
fb30: 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 winceMutexReleas
fb40: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 e(pFile->hMutex)
fb50: 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74 75 ;. return bRetu
fb60: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 rn;.}../*.** An
fb70: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f implementation o
fb80: 66 20 74 68 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 f the UnlockFile
fb90: 20 41 50 49 20 6f 66 20 57 69 6e 64 6f 77 73 20 API of Windows
fba0: 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63 for CE.*/.static
fbb0: 20 42 4f 4f 4c 20 77 69 6e 63 65 55 6e 6c 6f 63 BOOL winceUnloc
fbc0: 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c kFile(. LPHANDL
fbd0: 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 E phFile,. DWOR
fbe0: 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f D dwFileOffsetLo
fbf0: 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c w,. DWORD dwFil
fc00: 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 eOffsetHigh,. D
fc10: 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 WORD nNumberOfBy
fc20: 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a tesToUnlockLow,.
fc30: 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f DWORD nNumberO
fc40: 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 fBytesToUnlockHi
fc50: 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 gh.){. winFile
fc60: 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f *pFile = HANDLE_
fc70: 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c TO_WINFILE(phFil
fc80: 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 e);. BOOL bRetu
fc90: 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 rn = FALSE;.. U
fca0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 NUSED_PARAMETER(
fcb0: 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 dwFileOffsetHigh
fcc0: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 );. UNUSED_PARA
fcd0: 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 METER(nNumberOfB
fce0: 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 ytesToUnlockHigh
fcf0: 29 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 );.. if (!pFile
fd00: 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e ->hMutex) return
fd10: 20 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 TRUE;. winceMu
fd20: 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 texAcquire(pFile
fd30: 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a ->hMutex);.. /*
fd40: 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65 61 Releasing a rea
fd50: 64 65 72 20 6c 6f 63 6b 20 6f 72 20 61 6e 20 65 der lock or an e
fd60: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f xclusive lock */
fd70: 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 . if (dwFileOff
fd80: 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 setLow == (DWORD
fd90: 29 53 48 41 52 45 44 5f 46 49 52 53 54 29 7b 0a )SHARED_FIRST){.
fda0: 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20 68 61 /* Did we ha
fdb0: 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 ve an exclusive
fdc0: 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 69 66 20 lock? */. if
fdd0: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 (pFile->local.bE
fde0: 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20 xclusive){.
fdf0: 20 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f assert(nNumberO
fe00: 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f fBytesToUnlockLo
fe10: 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 w == (DWORD)SHAR
fe20: 45 44 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 ED_SIZE);.
fe30: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 pFile->local.bEx
fe40: 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b clusive = FALSE;
fe50: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 . pFile->sh
fe60: 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 ared->bExclusive
fe70: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 = FALSE;.
fe80: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a bReturn = TRUE;.
fe90: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 }.. /* Di
fea0: 64 20 77 65 20 6a 75 73 74 20 68 61 76 65 20 61 d we just have a
feb0: 20 72 65 61 64 65 72 20 6c 6f 63 6b 3f 20 2a 2f reader lock? */
fec0: 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 70 46 . else if (pF
fed0: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 ile->local.nRead
fee0: 65 72 73 29 7b 0a 20 20 20 20 20 20 61 73 73 65 ers){. asse
fef0: 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 rt(nNumberOfByte
ff00: 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 sToUnlockLow ==
ff10: 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 (DWORD)SHARED_SI
ff20: 5a 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ZE.
ff30: 7c 7c 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 || nNumberOfByte
ff40: 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 sToUnlockLow ==
ff50: 31 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 1);. pFile-
ff60: 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 >local.nReaders
ff70: 2d 2d 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46 --;. if (pF
ff80: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 ile->local.nRead
ff90: 65 72 73 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 ers == 0).
ffa0: 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d {. pFile-
ffb0: 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 >shared->nReader
ffc0: 73 20 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 s --;. }.
ffd0: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 bReturn = TR
ffe0: 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 UE;. }. }..
fff0: 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 /* Releasing a
10000 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a pending lock */.
10010 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c else if (dwFil
10020 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 eOffsetLow == (D
10030 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 WORD)PENDING_BYT
10040 45 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 E. &&
10050 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f nNumberOfBytesTo
10060 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b UnlockLow == 1){
10070 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e . if (pFile->
10080 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b local.bPending){
10090 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f . pFile->lo
100a0 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46 cal.bPending = F
100b0 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c ALSE;. pFil
100c0 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 e->shared->bPend
100d0 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 ing = FALSE;.
100e0 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 bReturn = TRU
100f0 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f E;. }. }. /
10100 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65 * Releasing a re
10110 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 served lock */.
10120 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 else if (dwFile
10130 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 OffsetLow == (DW
10140 4f 52 44 29 52 45 53 45 52 56 45 44 5f 42 59 54 ORD)RESERVED_BYT
10150 45 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 E. &&
10160 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f nNumberOfBytesTo
10170 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b UnlockLow == 1){
10180 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e . if (pFile->
10190 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29 local.bReserved)
101a0 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e {. pFile->
101b0 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 local.bReserved
101c0 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 = FALSE;. p
101d0 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 File->shared->bR
101e0 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b eserved = FALSE;
101f0 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d . bReturn =
10200 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d TRUE;. }. }
10210 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 .. winceMutexRe
10220 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 lease(pFile->hMu
10230 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 tex);. return b
10240 52 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 Return;.}./*.**
10250 45 6e 64 20 6f 66 20 74 68 65 20 73 70 65 63 69 End of the speci
10260 61 6c 20 63 6f 64 65 20 66 6f 72 20 77 69 6e 63 al code for winc
10270 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a e.**************
10280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
10290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
102a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
102b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
102c0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 .#endif /* SQLIT
102d0 45 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f E_OS_WINCE */../
102e0 2a 0a 2a 2a 20 4c 6f 63 6b 20 61 20 66 69 6c 65 *.** Lock a file
102f0 20 72 65 67 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 region..*/.stat
10300 69 63 20 42 4f 4f 4c 20 77 69 6e 4c 6f 63 6b 46 ic BOOL winLockF
10310 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 ile(. LPHANDLE
10320 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 phFile,. DWORD
10330 66 6c 61 67 73 2c 0a 20 20 44 57 4f 52 44 20 6f flags,. DWORD o
10340 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 ffsetLow,. DWOR
10350 44 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 D offsetHigh,.
10360 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f DWORD numBytesLo
10370 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 w,. DWORD numBy
10380 74 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 tesHigh.){.#if S
10390 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 QLITE_OS_WINCE.
103a0 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 /*. ** NOTE: W
103b0 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e indows CE is han
103c0 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 dled differently
103d0 20 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 here due its la
103e0 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a ck of the Win32.
103f0 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 4c ** API L
10400 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 ockFile.. */.
10410 72 65 74 75 72 6e 20 77 69 6e 63 65 4c 6f 63 6b return winceLock
10420 46 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66 66 File(phFile, off
10430 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 setLow, offsetHi
10440 67 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 gh,.
10450 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 numBy
10460 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 tesLow, numBytes
10470 48 69 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69 High);.#else. i
10480 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 f( osIsNT() ){.
10490 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 OVERLAPPED ov
104a0 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 lp;. memset(&
104b0 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 ovlp, 0, sizeof(
104c0 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 OVERLAPPED));.
104d0 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 ovlp.Offset =
104e0 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f offsetLow;. o
104f0 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d vlp.OffsetHigh =
10500 20 6f 66 66 73 65 74 48 69 67 68 3b 0a 20 20 20 offsetHigh;.
10510 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 return osLockFi
10520 6c 65 45 78 28 2a 70 68 46 69 6c 65 2c 20 66 6c leEx(*phFile, fl
10530 61 67 73 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 ags, 0, numBytes
10540 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 Low, numBytesHig
10550 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c h, &ovlp);. }el
10560 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f se{. return o
10570 73 4c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c sLockFile(*phFil
10580 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 e, offsetLow, of
10590 66 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 fsetHigh, numByt
105a0 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 esLow,.
105b0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d num
105c0 42 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a BytesHigh);. }.
105d0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 #endif.}../*.**
105e0 55 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 Unlock a file re
105f0 67 69 6f 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 gion.. */.static
10600 20 42 4f 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b 46 BOOL winUnlockF
10610 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 ile(. LPHANDLE
10620 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 phFile,. DWORD
10630 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f offsetLow,. DWO
10640 52 44 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 RD offsetHigh,.
10650 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c DWORD numBytesL
10660 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 ow,. DWORD numB
10670 79 74 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 ytesHigh.){.#if
10680 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a SQLITE_OS_WINCE.
10690 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 /*. ** NOTE:
106a0 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 Windows CE is ha
106b0 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c ndled differentl
106c0 79 20 68 65 72 65 20 64 75 65 20 69 74 73 20 6c y here due its l
106d0 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 ack of the Win32
106e0 0a 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 . ** API
106f0 55 6e 6c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f UnlockFile.. */
10700 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65 55 . return winceU
10710 6e 6c 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 nlockFile(phFile
10720 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 , offsetLow, off
10730 73 65 74 48 69 67 68 2c 0a 20 20 20 20 20 20 20 setHigh,.
10740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
10750 20 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e numBytesLow, n
10760 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 23 65 umBytesHigh);.#e
10770 6c 73 65 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 lse. if( osIsNT
10780 28 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 () ){. OVERLA
10790 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d PPED ovlp;. m
107a0 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 emset(&ovlp, 0,
107b0 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 sizeof(OVERLAPPE
107c0 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 D));. ovlp.Of
107d0 66 73 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 fset = offsetLow
107e0 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 ;. ovlp.Offse
107f0 74 48 69 67 68 20 3d 20 6f 66 66 73 65 74 48 69 tHigh = offsetHi
10800 67 68 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f gh;. return o
10810 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 sUnlockFileEx(*p
10820 68 46 69 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74 hFile, 0, numByt
10830 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 esLow, numBytesH
10840 69 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d igh, &ovlp);. }
10850 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e else{. return
10860 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a 70 osUnlockFile(*p
10870 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 hFile, offsetLow
10880 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75 , offsetHigh, nu
10890 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 mBytesLow,.
108a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
108b0 20 20 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 numBytesHigh)
108c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a ;. }.#endif.}..
108d0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /***************
108e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
108f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
10900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
10910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a **************.*
10920 2a 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70 * The next group
10930 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 of routines imp
10940 6c 65 6d 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d lement the I/O m
10950 65 74 68 6f 64 73 20 73 70 65 63 69 66 69 65 64 ethods specified
10960 0a 2a 2a 20 62 79 20 74 68 65 20 73 71 6c 69 74 .** by the sqlit
10970 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 e3_io_methods ob
10980 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ject..**********
10990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
109a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
109b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
109c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
109d0 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d ****/../*.** Som
109e0 65 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 e Microsoft comp
109f0 69 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20 ilers lack this
10a00 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 definition..*/.#
10a10 69 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 ifndef INVALID_S
10a20 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a ET_FILE_POINTER.
10a30 23 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 # define INVALID
10a40 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 _SET_FILE_POINTE
10a50 52 20 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 R ((DWORD)-1).#e
10a60 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 ndif../*.** Move
10a70 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 the current pos
10a80 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c ition of the fil
10a90 65 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 e handle passed
10aa0 61 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a as the first .**
10ab0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66 argument to off
10ac0 73 65 74 20 69 4f 66 66 73 65 74 20 77 69 74 68 set iOffset with
10ad0 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 in the file. If
10ae0 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 successful, retu
10af0 72 6e 20 30 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 rn 0. .** Otherw
10b00 69 73 65 2c 20 73 65 74 20 70 46 69 6c 65 2d 3e ise, set pFile->
10b10 6c 61 73 74 45 72 72 6e 6f 20 61 6e 64 20 72 65 lastErrno and re
10b20 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a turn non-zero..*
10b30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e /.static int win
10b40 53 65 65 6b 46 69 6c 65 28 77 69 6e 46 69 6c 65 SeekFile(winFile
10b50 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 *pFile, sqlite3
10b60 5f 69 6e 74 36 34 20 69 4f 66 66 73 65 74 29 7b _int64 iOffset){
10b70 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f .#if !SQLITE_OS_
10b80 57 49 4e 52 54 0a 20 20 4c 4f 4e 47 20 75 70 70 WINRT. LONG upp
10b90 65 72 42 69 74 73 3b 20 20 20 20 20 20 20 20 20 erBits;
10ba0 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 /* Most
10bb0 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f 66 20 sig. 32 bits of
10bc0 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 new offset */.
10bd0 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73 3b 20 LONG lowerBits;
10be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
10bf0 2f 2a 20 4c 65 61 73 74 20 73 69 67 2e 20 33 32 /* Least sig. 32
10c00 20 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 bits of new off
10c10 73 65 74 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 set */. DWORD d
10c20 77 52 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 wRet;
10c30 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 /* Valu
10c40 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 65 e returned by Se
10c50 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 2a tFilePointer() *
10c60 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 /. DWORD lastEr
10c70 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 rno;
10c80 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 /* Value ret
10c90 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61 73 74 urned by GetLast
10ca0 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 20 20 4f 53 Error() */.. OS
10cb0 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c TRACE(("SEEK fil
10cc0 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c e=%p, offset=%ll
10cd0 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 d\n", pFile->h,
10ce0 69 4f 66 66 73 65 74 29 29 3b 0a 0a 20 20 75 70 iOffset));.. up
10cf0 70 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 perBits = (LONG)
10d00 28 28 69 4f 66 66 73 65 74 3e 3e 33 32 29 20 26 ((iOffset>>32) &
10d10 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 0x7fffffff);.
10d20 6c 6f 77 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e lowerBits = (LON
10d30 47 29 28 69 4f 66 66 73 65 74 20 26 20 30 78 66 G)(iOffset & 0xf
10d40 66 66 66 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20 fffffff);.. /*
10d50 41 50 49 20 6f 64 64 69 74 79 3a 20 49 66 20 73 API oddity: If s
10d60 75 63 63 65 73 73 66 75 6c 2c 20 53 65 74 46 69 uccessful, SetFi
10d70 6c 65 50 6f 69 6e 74 65 72 28 29 20 72 65 74 75 lePointer() retu
10d80 72 6e 73 20 61 20 64 77 6f 72 64 20 0a 20 20 2a rns a dword . *
10d90 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 * containing the
10da0 20 6c 6f 77 65 72 20 33 32 2d 62 69 74 73 20 6f lower 32-bits o
10db0 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f f the new file-o
10dc0 66 66 73 65 74 2e 20 4f 72 2c 20 69 66 20 69 74 ffset. Or, if it
10dd0 20 66 61 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20 fails,. ** it
10de0 72 65 74 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f returns INVALID_
10df0 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 SET_FILE_POINTER
10e00 2e 20 48 6f 77 65 76 65 72 20 61 63 63 6f 72 64 . However accord
10e10 69 6e 67 20 74 6f 20 4d 53 44 4e 2c 20 0a 20 20 ing to MSDN, .
10e20 2a 2a 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 ** INVALID_SET_F
10e30 49 4c 45 5f 50 4f 49 4e 54 45 52 20 6d 61 79 20 ILE_POINTER may
10e40 61 6c 73 6f 20 62 65 20 61 20 76 61 6c 69 64 20 also be a valid
10e50 6e 65 77 20 6f 66 66 73 65 74 2e 20 53 6f 20 74 new offset. So t
10e60 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a o determine . *
10e70 2a 20 77 68 65 74 68 65 72 20 61 6e 20 65 72 72 * whether an err
10e80 6f 72 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 or has actually
10e90 6f 63 63 75 72 72 65 64 2c 20 69 74 20 69 73 20 occurred, it is
10ea0 61 6c 73 6f 20 6e 65 63 65 73 73 61 72 79 20 74 also necessary t
10eb0 6f 20 63 61 6c 6c 20 0a 20 20 2a 2a 20 47 65 74 o call . ** Get
10ec0 4c 61 73 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a LastError().. *
10ed0 2f 0a 20 20 64 77 52 65 74 20 3d 20 6f 73 53 65 /. dwRet = osSe
10ee0 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 tFilePointer(pFi
10ef0 6c 65 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 le->h, lowerBits
10f00 2c 20 26 75 70 70 65 72 42 69 74 73 2c 20 46 49 , &upperBits, FI
10f10 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 LE_BEGIN);.. if
10f20 28 20 28 64 77 52 65 74 3d 3d 49 4e 56 41 4c 49 ( (dwRet==INVALI
10f30 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 D_SET_FILE_POINT
10f40 45 52 0a 20 20 20 20 20 20 26 26 20 28 28 6c 61 ER. && ((la
10f50 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c stErrno = osGetL
10f60 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f astError())!=NO_
10f70 45 52 52 4f 52 29 29 20 29 7b 0a 20 20 20 20 70 ERROR)) ){. p
10f80 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 File->lastErrno
10f90 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 = lastErrno;.
10fa0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c winLogError(SQL
10fb0 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 ITE_IOERR_SEEK,
10fc0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f pFile->lastErrno
10fd0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
10fe0 20 20 22 77 69 6e 53 65 65 6b 46 69 6c 65 22 2c "winSeekFile",
10ff0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a pFile->zPath);.
11000 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 OSTRACE(("SE
11010 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 EK file=%p, rc=S
11020 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b QLITE_IOERR_SEEK
11030 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b \n", pFile->h));
11040 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 . return 1;.
11050 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 }.. OSTRACE(("
11060 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 SEEK file=%p, rc
11070 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 =SQLITE_OK\n", p
11080 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 File->h));. ret
11090 75 72 6e 20 30 3b 0a 23 65 6c 73 65 0a 20 20 2f urn 0;.#else. /
110a0 2a 0a 20 20 2a 2a 20 53 61 6d 65 20 61 73 20 61 *. ** Same as a
110b0 62 6f 76 65 2c 20 65 78 63 65 70 74 20 74 68 61 bove, except tha
110c0 74 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 t this implement
110d0 61 74 69 6f 6e 20 77 6f 72 6b 73 20 66 6f 72 20 ation works for
110e0 57 69 6e 52 54 2e 0a 20 20 2a 2f 0a 0a 20 20 4c WinRT.. */.. L
110f0 41 52 47 45 5f 49 4e 54 45 47 45 52 20 78 3b 20 ARGE_INTEGER x;
11100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
11110 2a 20 54 68 65 20 6e 65 77 20 6f 66 66 73 65 74 * The new offset
11120 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52 65 74 3b */. BOOL bRet;
11130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11140 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 /* Value r
11150 65 74 75 72 6e 65 64 20 62 79 20 53 65 74 46 69 eturned by SetFi
11160 6c 65 50 6f 69 6e 74 65 72 45 78 28 29 20 2a 2f lePointerEx() */
11170 0a 0a 20 20 78 2e 51 75 61 64 50 61 72 74 20 3d .. x.QuadPart =
11180 20 69 4f 66 66 73 65 74 3b 0a 20 20 62 52 65 74 iOffset;. bRet
11190 20 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e = osSetFilePoin
111a0 74 65 72 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 terEx(pFile->h,
111b0 78 2c 20 30 2c 20 46 49 4c 45 5f 42 45 47 49 4e x, 0, FILE_BEGIN
111c0 29 3b 0a 0a 20 20 69 66 28 21 62 52 65 74 29 7b );.. if(!bRet){
111d0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 . pFile->last
111e0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 Errno = osGetLas
111f0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 77 69 tError();. wi
11200 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 nLogError(SQLITE
11210 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46 69 _IOERR_SEEK, pFi
11220 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 le->lastErrno,.
11230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 "
11240 77 69 6e 53 65 65 6b 46 69 6c 65 22 2c 20 70 46 winSeekFile", pF
11250 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 ile->zPath);.
11260 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 OSTRACE(("SEEK
11270 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 file=%p, rc=SQLI
11280 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22 TE_IOERR_SEEK\n"
11290 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 , pFile->h));.
112a0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a return 1;. }.
112b0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 . OSTRACE(("SEE
112c0 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 K file=%p, rc=SQ
112d0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c LITE_OK\n", pFil
112e0 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e e->h));. return
112f0 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 0;.#endif.}..#i
11300 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 f SQLITE_MAX_MMA
11310 50 5f 53 49 5a 45 3e 30 0a 2f 2a 20 46 6f 72 77 P_SIZE>0./* Forw
11320 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 ard references t
11330 6f 20 56 46 53 20 68 65 6c 70 65 72 20 6d 65 74 o VFS helper met
11340 68 6f 64 73 20 75 73 65 64 20 66 6f 72 20 6d 65 hods used for me
11350 6d 6f 72 79 20 6d 61 70 70 65 64 20 66 69 6c 65 mory mapped file
11360 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 s */.static int
11370 77 69 6e 4d 61 70 66 69 6c 65 28 77 69 6e 46 69 winMapfile(winFi
11380 6c 65 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 le*, sqlite3_int
11390 36 34 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 64);.static int
113a0 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 77 69 6e winUnmapfile(win
113b0 46 69 6c 65 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a File*);.#endif..
113c0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 /*.** Close a fi
113d0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 le..**.** It is
113e0 72 65 70 6f 72 74 65 64 20 74 68 61 74 20 61 6e reported that an
113f0 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73 attempt to clos
11400 65 20 61 20 68 61 6e 64 6c 65 20 6d 69 67 68 74 e a handle might
11410 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 66 61 sometimes.** fa
11420 69 6c 2e 20 20 54 68 69 73 20 69 73 20 61 20 76 il. This is a v
11430 65 72 79 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 ery unreasonable
11440 20 72 65 73 75 6c 74 2c 20 62 75 74 20 57 69 6e result, but Win
11450 64 6f 77 73 20 69 73 20 6e 6f 74 6f 72 69 6f 75 dows is notoriou
11460 73 0a 2a 2a 20 66 6f 72 20 62 65 69 6e 67 20 75 s.** for being u
11470 6e 72 65 61 73 6f 6e 61 62 6c 65 20 73 6f 20 49 nreasonable so I
11480 20 64 6f 20 6e 6f 74 20 64 6f 75 62 74 20 74 68 do not doubt th
11490 61 74 20 69 74 20 6d 69 67 68 74 20 68 61 70 70 at it might happ
114a0 65 6e 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 63 en. If.** the c
114b0 6c 6f 73 65 20 66 61 69 6c 73 2c 20 77 65 20 70 lose fails, we p
114c0 61 75 73 65 20 66 6f 72 20 31 30 30 20 6d 69 6c ause for 100 mil
114d0 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 liseconds and tr
114e0 79 20 61 67 61 69 6e 2e 20 20 41 73 0a 2a 2a 20 y again. As.**
114f0 6d 61 6e 79 20 61 73 20 4d 58 5f 43 4c 4f 53 45 many as MX_CLOSE
11500 5f 41 54 54 45 4d 50 54 20 61 74 74 65 6d 70 74 _ATTEMPT attempt
11510 73 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 68 s to close the h
11520 61 6e 64 6c 65 20 61 72 65 20 6d 61 64 65 20 62 andle are made b
11530 65 66 6f 72 65 0a 2a 2a 20 67 69 76 69 6e 67 20 efore.** giving
11540 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 up and returning
11550 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 an error..*/.#d
11560 65 66 69 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f 41 efine MX_CLOSE_A
11570 54 54 45 4d 50 54 20 33 0a 73 74 61 74 69 63 20 TTEMPT 3.static
11580 69 6e 74 20 77 69 6e 43 6c 6f 73 65 28 73 71 6c int winClose(sql
11590 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a ite3_file *id){.
115a0 20 20 69 6e 74 20 72 63 2c 20 63 6e 74 20 3d 20 int rc, cnt =
115b0 30 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 0;. winFile *pF
115c0 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 ile = (winFile*)
115d0 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 id;.. assert( i
115e0 64 21 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 d!=0 );.#ifndef
115f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a SQLITE_OMIT_WAL.
11600 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d assert( pFile-
11610 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 23 65 6e 64 >pShm==0 );.#end
11620 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 if. assert( pFi
11630 6c 65 2d 3e 68 21 3d 4e 55 4c 4c 20 26 26 20 70 le->h!=NULL && p
11640 46 69 6c 65 2d 3e 68 21 3d 49 4e 56 41 4c 49 44 File->h!=INVALID
11650 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b _HANDLE_VALUE );
11660 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f . OSTRACE(("CLO
11670 53 45 20 66 69 6c 65 3d 25 70 5c 6e 22 2c 20 70 SE file=%p\n", p
11680 46 69 6c 65 2d 3e 68 29 29 3b 0a 0a 23 69 66 20 File->h));..#if
11690 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f SQLITE_MAX_MMAP_
116a0 53 49 5a 45 3e 30 0a 20 20 77 69 6e 55 6e 6d 61 SIZE>0. winUnma
116b0 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 23 65 pfile(pFile);.#e
116c0 6e 64 69 66 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 ndif.. do{.
116d0 72 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64 rc = osCloseHand
116e0 6c 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 le(pFile->h);.
116f0 20 20 2f 2a 20 53 69 6d 75 6c 61 74 65 49 4f 45 /* SimulateIOE
11700 72 72 6f 72 28 20 72 63 3d 30 3b 20 63 6e 74 3d rror( rc=0; cnt=
11710 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 MX_CLOSE_ATTEMPT
11720 3b 20 29 3b 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 ; ); */. }while
11730 28 20 72 63 3d 3d 30 20 26 26 20 2b 2b 63 6e 74 ( rc==0 && ++cnt
11740 20 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 < MX_CLOSE_ATTE
11750 4d 50 54 20 26 26 20 28 73 71 6c 69 74 65 33 5f MPT && (sqlite3_
11760 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 30 30 29 win32_sleep(100)
11770 2c 20 31 29 20 29 3b 0a 23 69 66 20 53 51 4c 49 , 1) );.#if SQLI
11780 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23 64 65 66 TE_OS_WINCE.#def
11790 69 6e 65 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 ine WINCE_DELETI
117a0 4f 4e 5f 41 54 54 45 4d 50 54 53 20 33 0a 20 20 ON_ATTEMPTS 3.
117b0 77 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b winceDestroyLock
117c0 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 70 (pFile);. if( p
117d0 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 File->zDeleteOnC
117e0 6c 6f 73 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 lose ){. int
117f0 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 cnt = 0;. whi
11800 6c 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 6f le(. o
11810 73 44 65 6c 65 74 65 46 69 6c 65 57 28 70 46 69 sDeleteFileW(pFi
11820 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f le->zDeleteOnClo
11830 73 65 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 se)==0. &
11840 26 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 & osGetFileAttri
11850 62 75 74 65 73 57 28 70 46 69 6c 65 2d 3e 7a 44 butesW(pFile->zD
11860 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 21 3d 30 eleteOnClose)!=0
11870 78 66 66 66 66 66 66 66 66 20 0a 20 20 20 20 20 xffffffff .
11880 20 20 20 26 26 20 63 6e 74 2b 2b 20 3c 20 57 49 && cnt++ < WI
11890 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 NCE_DELETION_ATT
118a0 45 4d 50 54 53 0a 20 20 20 20 29 7b 0a 20 20 20 EMPTS. ){.
118b0 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 sqlite3_win3
118c0 32 5f 73 6c 65 65 70 28 31 30 30 29 3b 20 20 2f 2_sleep(100); /
118d0 2a 20 57 61 69 74 20 61 20 6c 69 74 74 6c 65 20 * Wait a little
118e0 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20 61 67 before trying ag
118f0 61 69 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 ain */. }.
11900 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 sqlite3_free(pF
11910 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c ile->zDeleteOnCl
11920 6f 73 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 ose);. }.#endif
11930 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 . if( rc ){.
11940 20 70 46 69 6c 65 2d 3e 68 20 3d 20 4e 55 4c 4c pFile->h = NULL
11950 3b 0a 20 20 7d 0a 20 20 4f 70 65 6e 43 6f 75 6e ;. }. OpenCoun
11960 74 65 72 28 2d 31 29 3b 0a 20 20 4f 53 54 52 41 ter(-1);. OSTRA
11970 43 45 28 28 22 43 4c 4f 53 45 20 66 69 6c 65 3d CE(("CLOSE file=
11980 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 %p, rc=%s\n", pF
11990 69 6c 65 2d 3e 68 2c 20 72 63 20 3f 20 22 6f 6b ile->h, rc ? "ok
119a0 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a " : "failed"));.
119b0 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51 return rc ? SQ
119c0 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 LITE_OK.
119d0 20 20 20 20 3a 20 77 69 6e 4c 6f 67 45 72 72 6f : winLogErro
119e0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 r(SQLITE_IOERR_C
119f0 4c 4f 53 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 LOSE, osGetLastE
11a00 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 rror(),.
11a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11a20 20 20 22 77 69 6e 43 6c 6f 73 65 22 2c 20 70 46 "winClose", pF
11a30 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 7d 0a 0a ile->zPath);.}..
11a40 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 /*.** Read data
11a50 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f from a file into
11a60 20 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 a buffer. Retu
11a70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 rn SQLITE_OK if
11a80 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 all.** bytes wer
11a90 65 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 e read successfu
11aa0 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 lly and SQLITE_I
11ab0 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 OERR if anything
11ac0 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a goes.** wrong..
11ad0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 */.static int wi
11ae0 6e 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 nRead(. sqlite3
11af0 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 _file *id,
11b00 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 72 /* File to r
11b10 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 76 6f ead from */. vo
11b20 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 id *pBuf,
11b30 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 /* Writ
11b40 65 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 74 e content into t
11b50 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 his buffer */.
11b60 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 int amt,
11b70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 /* Nu
11b80 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f mber of bytes to
11b90 20 72 65 61 64 20 2a 2f 0a 20 20 73 71 6c 69 74 read */. sqlit
11ba0 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 e3_int64 offset
11bb0 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 /* Begin r
11bc0 65 61 64 69 6e 67 20 61 74 20 74 68 69 73 20 6f eading at this o
11bd0 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 ffset */.){.#if
11be0 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 !SQLITE_OS_WINCE
11bf0 0a 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 . OVERLAPPED ov
11c00 65 72 6c 61 70 70 65 64 3b 20 20 20 20 20 20 20 erlapped;
11c10 20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73 65 74 /* The offset
11c20 20 66 6f 72 20 52 65 61 64 46 69 6c 65 2e 20 2a for ReadFile. *
11c30 2f 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46 69 /.#endif. winFi
11c40 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e le *pFile = (win
11c50 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 66 69 File*)id; /* fi
11c60 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 44 le handle */. D
11c70 57 4f 52 44 20 6e 52 65 61 64 3b 20 20 20 20 20 WORD nRead;
11c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
11c90 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 * Number of byte
11ca0 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 s actually read
11cb0 66 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a 20 20 69 from file */. i
11cc0 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 nt nRetry = 0;
11cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
11ce0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74 72 * Number of retr
11cf0 79 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 ys */.. assert(
11d00 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 id!=0 );. asse
11d10 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61 rt( amt>0 );. a
11d20 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 30 ssert( offset>=0
11d30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f );. SimulateIO
11d40 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c Error(return SQL
11d50 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 29 3b ITE_IOERR_READ);
11d60 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 . OSTRACE(("REA
11d70 44 20 66 69 6c 65 3d 25 70 2c 20 62 75 66 66 65 D file=%p, buffe
11d80 72 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c r=%p, amount=%d,
11d90 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 6c 6f offset=%lld, lo
11da0 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 ck=%d\n",.
11db0 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 pFile->h, p
11dc0 42 75 66 2c 20 61 6d 74 2c 20 6f 66 66 73 65 74 Buf, amt, offset
11dd0 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 , pFile->locktyp
11de0 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 e));..#if SQLITE
11df0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 _MAX_MMAP_SIZE>0
11e00 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 . /* Deal with
11e10 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20 as much of this
11e20 72 65 61 64 20 72 65 71 75 65 73 74 20 61 73 20 read request as
11e30 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e possible by tran
11e40 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 sfering. ** dat
11e50 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 a from the memor
11e60 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20 y mapping using
11e70 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 memcpy(). */.
11e80 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 if( offset<pFile
11e90 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 ->mmapSize ){.
11ea0 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 if( offset+amt
11eb0 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 <= pFile->mmapS
11ec0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d ize ){. mem
11ed0 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38 20 cpy(pBuf, &((u8
11ee0 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 *)(pFile->pMapRe
11ef0 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 gion))[offset],
11f00 61 6d 74 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 amt);. OSTR
11f10 41 43 45 28 28 22 52 45 41 44 2d 4d 4d 41 50 20 ACE(("READ-MMAP
11f20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 file=%p, rc=SQLI
11f30 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d TE_OK\n", pFile-
11f40 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 >h));. retu
11f50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 rn SQLITE_OK;.
11f60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 }else{. i
11f70 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e 74 29 nt nCopy = (int)
11f80 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 (pFile->mmapSize
11f90 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 - offset);.
11fa0 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 memcpy(pBuf, &
11fb0 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 ((u8 *)(pFile->p
11fc0 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 MapRegion))[offs
11fd0 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 et], nCopy);.
11fe0 20 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20 pBuf = &((u8
11ff0 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a *)pBuf)[nCopy];.
12000 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f amt -= nCo
12010 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 py;. offset
12020 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d += nCopy;. }
12030 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 . }.#endif..#if
12040 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 SQLITE_OS_WINCE
12050 0a 20 20 69 66 28 20 77 69 6e 53 65 65 6b 46 69 . if( winSeekFi
12060 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 le(pFile, offset
12070 29 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 ) ){. OSTRACE
12080 28 28 22 52 45 41 44 20 66 69 6c 65 3d 25 70 2c (("READ file=%p,
12090 20 72 63 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 5c rc=SQLITE_FULL\
120a0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a n", pFile->h));.
120b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 return SQLIT
120c0 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 77 68 E_FULL;. }. wh
120d0 69 6c 65 28 20 21 6f 73 52 65 61 64 46 69 6c 65 ile( !osReadFile
120e0 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c (pFile->h, pBuf,
120f0 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20 30 29 amt, &nRead, 0)
12100 20 29 7b 0a 23 65 6c 73 65 0a 20 20 6d 65 6d 73 ){.#else. mems
12110 65 74 28 26 6f 76 65 72 6c 61 70 70 65 64 2c 20 et(&overlapped,
12120 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 0, sizeof(OVERLA
12130 50 50 45 44 29 29 3b 0a 20 20 6f 76 65 72 6c 61 PPED));. overla
12140 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c pped.Offset = (L
12150 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30 78 ONG)(offset & 0x
12160 66 66 66 66 66 66 66 66 29 3b 0a 20 20 6f 76 65 ffffffff);. ove
12170 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69 rlapped.OffsetHi
12180 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 gh = (LONG)((off
12190 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 set>>32) & 0x7ff
121a0 66 66 66 66 66 29 3b 0a 20 20 77 68 69 6c 65 28 fffff);. while(
121b0 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46 69 !osReadFile(pFi
121c0 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 le->h, pBuf, amt
121d0 2c 20 26 6e 52 65 61 64 2c 20 26 6f 76 65 72 6c , &nRead, &overl
121e0 61 70 70 65 64 29 20 26 26 0a 20 20 20 20 20 20 apped) &&.
121f0 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f osGetLastErro
12200 72 28 29 21 3d 45 52 52 4f 52 5f 48 41 4e 44 4c r()!=ERROR_HANDL
12210 45 5f 45 4f 46 20 29 7b 0a 23 65 6e 64 69 66 0a E_EOF ){.#endif.
12220 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 DWORD lastEr
12230 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 77 69 6e rno;. if( win
12240 52 65 74 72 79 49 6f 65 72 72 28 26 6e 52 65 74 RetryIoerr(&nRet
12250 72 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 ry, &lastErrno)
12260 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 ) continue;.
12270 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f pFile->lastErrno
12280 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 = lastErrno;.
12290 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 OSTRACE(("READ
122a0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c file=%p, rc=SQL
122b0 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 5c 6e ITE_IOERR_READ\n
122c0 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 ", pFile->h));.
122d0 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 return winLog
122e0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 Error(SQLITE_IOE
122f0 52 52 5f 52 45 41 44 2c 20 70 46 69 6c 65 2d 3e RR_READ, pFile->
12300 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 lastErrno,.
12310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12320 20 20 22 77 69 6e 52 65 61 64 22 2c 20 70 46 69 "winRead", pFi
12330 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a le->zPath);. }.
12340 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 6e 52 winLogIoerr(nR
12350 65 74 72 79 29 3b 0a 20 20 69 66 28 20 6e 52 65 etry);. if( nRe
12360 61 64 3c 28 44 57 4f 52 44 29 61 6d 74 20 29 7b ad<(DWORD)amt ){
12370 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 . /* Unread p
12380 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 arts of the buff
12390 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d er must be zero-
123a0 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 filled */. me
123b0 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70 42 mset(&((char*)pB
123c0 75 66 29 5b 6e 52 65 61 64 5d 2c 20 30 2c 20 61 uf)[nRead], 0, a
123d0 6d 74 2d 6e 52 65 61 64 29 3b 0a 20 20 20 20 4f mt-nRead);. O
123e0 53 54 52 41 43 45 28 28 22 52 45 41 44 20 66 69 STRACE(("READ fi
123f0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 le=%p, rc=SQLITE
12400 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 _IOERR_SHORT_REA
12410 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 D\n", pFile->h))
12420 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c ;. return SQL
12430 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f ITE_IOERR_SHORT_
12440 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 READ;. }.. OST
12450 52 41 43 45 28 28 22 52 45 41 44 20 66 69 6c 65 RACE(("READ file
12460 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f =%p, rc=SQLITE_O
12470 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 K\n", pFile->h))
12480 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 ;. return SQLIT
12490 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 E_OK;.}../*.** W
124a0 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 rite data from a
124b0 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 buffer into a f
124c0 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c ile. Return SQL
124d0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 ITE_OK on succes
124e0 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 s.** or some oth
124f0 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e er error code on
12500 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 failure..*/.sta
12510 74 69 63 20 69 6e 74 20 77 69 6e 57 72 69 74 65 tic int winWrite
12520 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 (. sqlite3_file
12530 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 *id,
12540 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 77 /* File to w
12550 72 69 74 65 20 69 6e 74 6f 20 2a 2f 0a 20 20 63 rite into */. c
12560 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c onst void *pBuf,
12570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
12580 2a 20 54 68 65 20 62 79 74 65 73 20 74 6f 20 62 * The bytes to b
12590 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 e written */. i
125a0 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 nt amt,
125b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
125c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 * Number of byte
125d0 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 s to write */.
125e0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 sqlite3_int64 of
125f0 66 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20 fset
12600 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 /* Offset into t
12610 68 65 20 66 69 6c 65 20 74 6f 20 62 65 67 69 6e he file to begin
12620 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a 29 writing at */.)
12630 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 {. int rc = 0;
12640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12650 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 65 /* True if e
12660 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 rror has occurre
12670 64 2c 20 65 6c 73 65 20 66 61 6c 73 65 20 2a 2f d, else false */
12680 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c . winFile *pFil
12690 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 e = (winFile*)id
126a0 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c ; /* File handl
126b0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72 e */. int nRetr
126c0 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 y = 0;
126d0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 /* Number
126e0 20 6f 66 20 72 65 74 72 69 65 73 20 2a 2f 0a 0a of retries */..
126f0 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 assert( amt>0
12700 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 );. assert( pFi
12710 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 le );. Simulate
12720 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 IOError(return S
12730 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 QLITE_IOERR_WRIT
12740 45 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 E);. SimulateDi
12750 73 6b 66 75 6c 6c 45 72 72 6f 72 28 72 65 74 75 skfullError(retu
12760 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 3b rn SQLITE_FULL);
12770 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 .. OSTRACE(("WR
12780 49 54 45 20 66 69 6c 65 3d 25 70 2c 20 62 75 66 ITE file=%p, buf
12790 66 65 72 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d 25 fer=%p, amount=%
127a0 64 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 d, offset=%lld,
127b0 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 lock=%d\n",.
127c0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c pFile->h,
127d0 20 70 42 75 66 2c 20 61 6d 74 2c 20 6f 66 66 73 pBuf, amt, offs
127e0 65 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 et, pFile->lockt
127f0 79 70 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 ype));..#if SQLI
12800 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 TE_MAX_MMAP_SIZE
12810 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 >0. /* Deal wit
12820 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 h as much of thi
12830 73 20 77 72 69 74 65 20 72 65 71 75 65 73 74 20 s write request
12840 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 as possible by t
12850 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 ransfering. **
12860 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 data from the me
12870 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 mory mapping usi
12880 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f ng memcpy(). */
12890 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 . if( offset<pF
128a0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b ile->mmapSize ){
128b0 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b . if( offset+
128c0 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d amt <= pFile->mm
128d0 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 apSize ){.
128e0 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 memcpy(&((u8 *)(
128f0 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f pFile->pMapRegio
12900 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 n))[offset], pBu
12910 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 4f f, amt);. O
12920 53 54 52 41 43 45 28 28 22 57 52 49 54 45 2d 4d STRACE(("WRITE-M
12930 4d 41 50 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d MAP file=%p, rc=
12940 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 SQLITE_OK\n", pF
12950 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 ile->h));.
12960 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
12970 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 ;. }else{.
12980 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28 int nCopy = (
12990 69 6e 74 29 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 int)(pFile->mmap
129a0 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 29 3b 0a Size - offset);.
129b0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28 memcpy(&((
129c0 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 u8 *)(pFile->pMa
129d0 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 pRegion))[offset
129e0 5d 2c 20 70 42 75 66 2c 20 6e 43 6f 70 79 29 3b ], pBuf, nCopy);
129f0 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28 . pBuf = &(
12a00 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 (u8 *)pBuf)[nCop
12a10 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d y];. amt -=
12a20 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 nCopy;. of
12a30 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 fset += nCopy;.
12a40 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a }. }.#endif.
12a50 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 .#if SQLITE_OS_W
12a60 49 4e 43 45 0a 20 20 72 63 20 3d 20 77 69 6e 53 INCE. rc = winS
12a70 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f eekFile(pFile, o
12a80 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 ffset);. if( rc
12a90 3d 3d 30 20 29 7b 0a 23 65 6c 73 65 0a 20 20 7b ==0 ){.#else. {
12aa0 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 53 51 4c .#endif.#if !SQL
12ab0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 ITE_OS_WINCE.
12ac0 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65 72 OVERLAPPED over
12ad0 6c 61 70 70 65 64 3b 20 20 20 20 20 20 20 20 2f lapped; /
12ae0 2a 20 54 68 65 20 6f 66 66 73 65 74 20 66 6f 72 * The offset for
12af0 20 57 72 69 74 65 46 69 6c 65 2e 20 2a 2f 0a 23 WriteFile. */.#
12b00 65 6e 64 69 66 0a 20 20 20 20 75 38 20 2a 61 52 endif. u8 *aR
12b10 65 6d 20 3d 20 28 75 38 20 2a 29 70 42 75 66 3b em = (u8 *)pBuf;
12b20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 /* Data
12b30 79 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65 yet to be writte
12b40 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 n */. int nRe
12b50 6d 20 3d 20 61 6d 74 3b 20 20 20 20 20 20 20 20 m = amt;
12b60 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 /* Number
12b70 20 6f 66 20 62 79 74 65 73 20 79 65 74 20 74 6f of bytes yet to
12b80 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 be written */.
12b90 20 20 20 44 57 4f 52 44 20 6e 57 72 69 74 65 3b DWORD nWrite;
12ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12bb0 20 2f 2a 20 42 79 74 65 73 20 77 72 69 74 74 65 /* Bytes writte
12bc0 6e 20 62 79 20 65 61 63 68 20 57 72 69 74 65 46 n by each WriteF
12bd0 69 6c 65 28 29 20 63 61 6c 6c 20 2a 2f 0a 20 20 ile() call */.
12be0 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e DWORD lastErrn
12bf0 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 20 20 20 o = NO_ERROR;
12c00 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 /* Value returne
12c10 64 20 62 79 20 47 65 74 4c 61 73 74 45 72 72 6f d by GetLastErro
12c20 72 28 29 20 2a 2f 0a 0a 23 69 66 20 21 53 51 4c r() */..#if !SQL
12c30 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 ITE_OS_WINCE.
12c40 20 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c 61 70 memset(&overlap
12c50 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f ped, 0, sizeof(O
12c60 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 VERLAPPED));.
12c70 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 overlapped.Offs
12c80 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 et = (LONG)(offs
12c90 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29 et & 0xffffffff)
12ca0 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 ;. overlapped
12cb0 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c .OffsetHigh = (L
12cc0 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 ONG)((offset>>32
12cd0 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b ) & 0x7fffffff);
12ce0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 77 68 69 .#endif.. whi
12cf0 6c 65 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 23 69 le( nRem>0 ){.#i
12d00 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 f SQLITE_OS_WINC
12d10 45 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73 57 E. if( !osW
12d20 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e riteFile(pFile->
12d30 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 h, aRem, nRem, &
12d40 6e 57 72 69 74 65 2c 20 30 29 20 29 7b 0a 23 65 nWrite, 0) ){.#e
12d50 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 21 6f lse. if( !o
12d60 73 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65 sWriteFile(pFile
12d70 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c ->h, aRem, nRem,
12d80 20 26 6e 57 72 69 74 65 2c 20 26 6f 76 65 72 6c &nWrite, &overl
12d90 61 70 70 65 64 29 20 29 7b 0a 23 65 6e 64 69 66 apped) ){.#endif
12da0 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 69 6e . if( win
12db0 52 65 74 72 79 49 6f 65 72 72 28 26 6e 52 65 74 RetryIoerr(&nRet
12dc0 72 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 ry, &lastErrno)
12dd0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 ) continue;.
12de0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 break;.
12df0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 }. assert(
12e00 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 6e 57 nWrite==0 || nW
12e10 72 69 74 65 3c 3d 28 44 57 4f 52 44 29 6e 52 65 rite<=(DWORD)nRe
12e20 6d 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e m );. if( n
12e30 57 72 69 74 65 3d 3d 30 20 7c 7c 20 6e 57 72 69 Write==0 || nWri
12e40 74 65 3e 28 44 57 4f 52 44 29 6e 52 65 6d 20 29 te>(DWORD)nRem )
12e50 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 {. lastEr
12e60 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 rno = osGetLastE
12e70 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 rror();.
12e80 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 break;. }.#
12e90 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 if !SQLITE_OS_WI
12ea0 4e 43 45 0a 20 20 20 20 20 20 6f 66 66 73 65 74 NCE. offset
12eb0 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 += nWrite;.
12ec0 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 overlapped.Off
12ed0 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 set = (LONG)(off
12ee0 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66 set & 0xffffffff
12ef0 29 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c 61 70 );. overlap
12f00 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d ped.OffsetHigh =
12f10 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e (LONG)((offset>
12f20 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66 >32) & 0x7ffffff
12f30 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 f);.#endif.
12f40 20 61 52 65 6d 20 2b 3d 20 6e 57 72 69 74 65 3b aRem += nWrite;
12f50 0a 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e . nRem -= n
12f60 57 72 69 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 Write;. }.
12f70 20 69 66 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 if( nRem>0 ){.
12f80 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 pFile->last
12f90 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e Errno = lastErrn
12fa0 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b o;. rc = 1;
12fb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 . }. }.. if
12fc0 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 ( rc ){. if(
12fd0 20 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 ( pFile->lastE
12fe0 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e 44 rrno==ERROR_HAND
12ff0 4c 45 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 0a 20 LE_DISK_FULL ).
13000 20 20 20 20 20 20 7c 7c 20 28 20 70 46 69 6c 65 || ( pFile
13010 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 ->lastErrno==ERR
13020 4f 52 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 29 7b OR_DISK_FULL )){
13030 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 . OSTRACE((
13040 22 57 52 49 54 45 20 66 69 6c 65 3d 25 70 2c 20 "WRITE file=%p,
13050 72 63 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e rc=SQLITE_FULL\n
13060 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 ", pFile->h));.
13070 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c return winL
13080 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 46 ogError(SQLITE_F
13090 55 4c 4c 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 ULL, pFile->last
130a0 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 Errno,.
130b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
130c0 22 77 69 6e 57 72 69 74 65 31 22 2c 20 70 46 69 "winWrite1", pFi
130d0 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 le->zPath);.
130e0 7d 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 }. OSTRACE(("
130f0 57 52 49 54 45 20 66 69 6c 65 3d 25 70 2c 20 72 WRITE file=%p, r
13100 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 c=SQLITE_IOERR_W
13110 52 49 54 45 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e RITE\n", pFile->
13120 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 h));. return
13130 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 winLogError(SQLI
13140 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 2c 20 TE_IOERR_WRITE,
13150 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f pFile->lastErrno
13160 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
13170 20 20 20 20 20 20 20 20 20 22 77 69 6e 57 72 69 "winWri
13180 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 te2", pFile->zPa
13190 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 th);. }else{.
131a0 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 6e 52 winLogIoerr(nR
131b0 65 74 72 79 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 etry);. }. OST
131c0 52 41 43 45 28 28 22 57 52 49 54 45 20 66 69 6c RACE(("WRITE fil
131d0 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f e=%p, rc=SQLITE_
131e0 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 OK\n", pFile->h)
131f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 );. return SQLI
13200 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 TE_OK;.}../*.**
13210 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e Truncate an open
13220 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 file to a speci
13230 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 fied size.*/.sta
13240 74 69 63 20 69 6e 74 20 77 69 6e 54 72 75 6e 63 tic int winTrunc
13250 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 ate(sqlite3_file
13260 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e *id, sqlite3_in
13270 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 77 69 t64 nByte){. wi
13280 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 nFile *pFile = (
13290 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a winFile*)id; /*
132a0 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 6f 62 6a File handle obj
132b0 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 ect */. int rc
132c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 = SQLITE_OK;
132d0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 /* Retu
132e0 72 6e 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73 rn code for this
132f0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 function */. D
13300 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a WORD lastErrno;.
13310 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 . assert( pFile
13320 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f );. SimulateIO
13330 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c Error(return SQL
13340 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 ITE_IOERR_TRUNCA
13350 54 45 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 TE);. OSTRACE((
13360 22 54 52 55 4e 43 41 54 45 20 66 69 6c 65 3d 25 "TRUNCATE file=%
13370 70 2c 20 73 69 7a 65 3d 25 6c 6c 64 2c 20 6c 6f p, size=%lld, lo
13380 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 ck=%d\n",.
13390 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6e pFile->h, n
133a0 42 79 74 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 Byte, pFile->loc
133b0 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 ktype));.. /* I
133c0 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20 63 f the user has c
133d0 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75 6e onfigured a chun
133e0 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 k-size for this
133f0 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74 file, truncate t
13400 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 he. ** file so
13410 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73 that it consists
13420 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e of an integer n
13430 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 umber of chunks
13440 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 (i.e. the. ** a
13450 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 ctual file size
13460 61 66 74 65 72 20 74 68 65 20 6f 70 65 72 61 74 after the operat
13470 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65 ion may be large
13480 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 r than the reque
13490 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e sted. ** size).
134a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c . */. if( pFil
134b0 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a e->szChunk>0 ){.
134c0 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 nByte = ((nB
134d0 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 yte + pFile->szC
134e0 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d hunk - 1)/pFile-
134f0 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c >szChunk) * pFil
13500 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a e->szChunk;. }.
13510 0a 20 20 2f 2a 20 53 65 74 45 6e 64 4f 66 46 69 . /* SetEndOfFi
13520 6c 65 28 29 20 72 65 74 75 72 6e 73 20 6e 6f 6e le() returns non
13530 2d 7a 65 72 6f 20 77 68 65 6e 20 73 75 63 63 65 -zero when succe
13540 73 73 66 75 6c 2c 20 6f 72 20 7a 65 72 6f 20 77 ssful, or zero w
13550 68 65 6e 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f hen it fails. */
13560 0a 20 20 69 66 28 20 77 69 6e 53 65 65 6b 46 69 . if( winSeekFi
13570 6c 65 28 70 46 69 6c 65 2c 20 6e 42 79 74 65 29 le(pFile, nByte)
13580 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e ){. rc = win
13590 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f LogError(SQLITE_
135a0 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 IOERR_TRUNCATE,
135b0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f pFile->lastErrno
135c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
135d0 20 20 20 20 20 20 20 22 77 69 6e 54 72 75 6e 63 "winTrunc
135e0 61 74 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 ate1", pFile->zP
135f0 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 ath);. }else if
13600 28 20 30 3d 3d 6f 73 53 65 74 45 6e 64 4f 66 46 ( 0==osSetEndOfF
13610 69 6c 65 28 70 46 69 6c 65 2d 3e 68 29 20 26 26 ile(pFile->h) &&
13620 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28 6c . ((l
13630 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 astErrno = osGet
13640 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 45 52 LastError())!=ER
13650 52 4f 52 5f 55 53 45 52 5f 4d 41 50 50 45 44 5f ROR_USER_MAPPED_
13660 46 49 4c 45 29 20 29 7b 0a 20 20 20 20 70 46 69 FILE) ){. pFi
13670 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 le->lastErrno =
13680 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 lastErrno;. r
13690 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 c = winLogError(
136a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 SQLITE_IOERR_TRU
136b0 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 NCATE, pFile->la
136c0 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 stErrno,.
136d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 "w
136e0 69 6e 54 72 75 6e 63 61 74 65 32 22 2c 20 70 46 inTruncate2", pF
136f0 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d ile->zPath);. }
13700 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 ..#if SQLITE_MAX
13710 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f _MMAP_SIZE>0. /
13720 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 * If the file wa
13730 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 61 s truncated to a
13740 20 73 69 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 size smaller th
13750 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 an the currently
13760 0a 20 20 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 . ** mapped reg
13770 69 6f 6e 2c 20 72 65 64 75 63 65 20 74 68 65 20 ion, reduce the
13780 65 66 66 65 63 74 69 76 65 20 6d 61 70 70 69 6e effective mappin
13790 67 20 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 g size as well.
137a0 53 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20 2a 2a SQLite will. **
137b0 20 75 73 65 20 72 65 61 64 28 29 20 61 6e 64 20 use read() and
137c0 77 72 69 74 65 28 29 20 74 6f 20 61 63 63 65 73 write() to acces
137d0 73 20 64 61 74 61 20 62 65 79 6f 6e 64 20 74 68 s data beyond th
137e0 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f is point from no
137f0 77 20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 w on.. */. if(
13800 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 pFile->pMapRegi
13810 6f 6e 20 26 26 20 6e 42 79 74 65 3c 70 46 69 6c on && nByte<pFil
13820 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 e->mmapSize ){.
13830 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 pFile->mmapSi
13840 7a 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a ze = nByte;. }.
13850 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 #endif.. OSTRAC
13860 45 28 28 22 54 52 55 4e 43 41 54 45 20 66 69 6c E(("TRUNCATE fil
13870 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 e=%p, rc=%s\n",
13880 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 pFile->h, sqlite
13890 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 3ErrName(rc)));.
138a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a return rc;.}..
138b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 #ifdef SQLITE_TE
138c0 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 ST./*.** Count t
138d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c he number of ful
138e0 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 lsyncs and norma
138f0 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69 l syncs. This i
13900 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a s used to test.*
13910 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64 * that syncs and
13920 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f fullsyncs are o
13930 63 63 75 72 69 6e 67 20 61 74 20 74 68 65 20 72 ccuring at the r
13940 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 ight times..*/.i
13950 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f nt sqlite3_sync_
13960 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 count = 0;.int s
13970 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f qlite3_fullsync_
13980 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 count = 0;.#endi
13990 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 f../*.** Make su
139a0 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f re all writes to
139b0 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 a particular fi
139c0 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 le are committed
139d0 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 to disk..*/.sta
139e0 74 69 63 20 69 6e 74 20 77 69 6e 53 79 6e 63 28 tic int winSync(
139f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 sqlite3_file *id
13a00 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 23 69 , int flags){.#i
13a10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f fndef SQLITE_NO_
13a20 53 59 4e 43 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 SYNC. /*. ** U
13a30 73 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 53 51 sed only when SQ
13a40 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 LITE_NO_SYNC is
13a50 6e 6f 74 20 64 65 66 69 6e 65 64 2e 0a 20 20 20 not defined..
13a60 2a 2f 0a 20 20 42 4f 4f 4c 20 72 63 3b 0a 23 65 */. BOOL rc;.#e
13a70 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
13a80 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 21 64 65 d(NDEBUG) || !de
13a90 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f 5f fined(SQLITE_NO_
13aa0 53 59 4e 43 29 20 7c 7c 20 5c 0a 20 20 20 20 28 SYNC) || \. (
13ab0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 defined(SQLITE_T
13ac0 45 53 54 29 20 26 26 20 64 65 66 69 6e 65 64 28 EST) && defined(
13ad0 53 51 4c 49 54 45 5f 44 45 42 55 47 29 29 0a 20 SQLITE_DEBUG)).
13ae0 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20 77 68 /*. ** Used wh
13af0 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e en SQLITE_NO_SYN
13b00 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 C is not defined
13b10 20 61 6e 64 20 62 79 20 74 68 65 20 61 73 73 65 and by the asse
13b20 72 74 28 29 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a rt() and/or. **
13b30 20 4f 53 54 52 41 43 45 28 29 20 6d 61 63 72 6f OSTRACE() macro
13b40 73 2e 0a 20 20 20 2a 2f 0a 20 20 77 69 6e 46 69 s.. */. winFi
13b50 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e le *pFile = (win
13b60 46 69 6c 65 2a 29 69 64 3b 0a 23 65 6c 73 65 0a File*)id;.#else.
13b70 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 UNUSED_PARAMET
13b80 45 52 28 69 64 29 3b 0a 23 65 6e 64 69 66 0a 0a ER(id);.#endif..
13b90 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 assert( pFile
13ba0 29 3b 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 );. /* Check th
13bb0 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 at one of SQLITE
13bc0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 _SYNC_NORMAL or
13bd0 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 FULL was passed
13be0 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 */. assert((fla
13bf0 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 gs&0x0F)==SQLITE
13c00 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 _SYNC_NORMAL.
13c10 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 || (flags&0x0
13c20 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f F)==SQLITE_SYNC_
13c30 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 FULL. );.. /*
13c40 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 Unix cannot, but
13c50 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 some systems ma
13c60 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f y return SQLITE_
13c70 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 FULL from here.
13c80 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 This. ** line i
13c90 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 s to test that d
13ca0 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 oing so does not
13cb0 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c cause any probl
13cc0 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 ems.. */. Simu
13cd0 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f lateDiskfullErro
13ce0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 r( return SQLITE
13cf0 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 4f 53 54 52 _FULL );.. OSTR
13d00 41 43 45 28 28 22 53 59 4e 43 20 66 69 6c 65 3d ACE(("SYNC file=
13d10 25 70 2c 20 66 6c 61 67 73 3d 25 78 2c 20 6c 6f %p, flags=%x, lo
13d20 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 ck=%d\n",.
13d30 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 66 pFile->h, f
13d40 6c 61 67 73 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 lags, pFile->loc
13d50 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 6e 64 65 ktype));..#ifnde
13d60 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 f SQLITE_TEST.
13d70 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 UNUSED_PARAMETER
13d80 28 66 6c 61 67 73 29 3b 0a 23 65 6c 73 65 0a 20 (flags);.#else.
13d90 20 69 66 28 20 28 66 6c 61 67 73 26 30 78 30 46 if( (flags&0x0F
13da0 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 )==SQLITE_SYNC_F
13db0 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 ULL ){. sqlit
13dc0 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e e3_fullsync_coun
13dd0 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 t++;. }. sqlit
13de0 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b e3_sync_count++;
13df0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 .#endif.. /* If
13e00 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 we compiled wit
13e10 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f h the SQLITE_NO_
13e20 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 SYNC flag, then
13e30 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a syncing is a. *
13e40 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 * no-op. */.#if
13e50 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 def SQLITE_NO_SY
13e60 4e 43 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 NC. OSTRACE(("S
13e70 59 4e 43 2d 4e 4f 50 20 66 69 6c 65 3d 25 70 2c YNC-NOP file=%p,
13e80 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 rc=SQLITE_OK\n"
13e90 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 , pFile->h));.
13ea0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
13eb0 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20 6f ;.#else. rc = o
13ec0 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 sFlushFileBuffer
13ed0 73 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 53 s(pFile->h);. S
13ee0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 imulateIOError(
13ef0 72 63 3d 46 41 4c 53 45 20 29 3b 0a 20 20 69 66 rc=FALSE );. if
13f00 28 20 72 63 20 29 7b 0a 20 20 20 20 4f 53 54 52 ( rc ){. OSTR
13f10 41 43 45 28 28 22 53 59 4e 43 20 66 69 6c 65 3d ACE(("SYNC file=
13f20 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b %p, rc=SQLITE_OK
13f30 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b \n", pFile->h));
13f40 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 . return SQLI
13f50 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a TE_OK;. }else{.
13f60 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 pFile->lastE
13f70 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 rrno = osGetLast
13f80 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 4f 53 54 Error();. OST
13f90 52 41 43 45 28 28 22 53 59 4e 43 20 66 69 6c 65 RACE(("SYNC file
13fa0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 =%p, rc=SQLITE_I
13fb0 4f 45 52 52 5f 46 53 59 4e 43 5c 6e 22 2c 20 70 OERR_FSYNC\n", p
13fc0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 File->h));. r
13fd0 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f eturn winLogErro
13fe0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 r(SQLITE_IOERR_F
13ff0 53 59 4e 43 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 SYNC, pFile->las
14000 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 tErrno,.
14010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 "
14020 77 69 6e 53 79 6e 63 22 2c 20 70 46 69 6c 65 2d winSync", pFile-
14030 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23 65 6e >zPath);. }.#en
14040 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 dif.}../*.** Det
14050 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 ermine the curre
14060 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c nt size of a fil
14070 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 e in bytes.*/.st
14080 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 atic int winFile
14090 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c Size(sqlite3_fil
140a0 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 e *id, sqlite3_i
140b0 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 nt64 *pSize){.
140c0 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d winFile *pFile =
140d0 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 (winFile*)id;.
140e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 int rc = SQLITE
140f0 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 _OK;.. assert(
14100 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 id!=0 );. asser
14110 74 28 20 70 53 69 7a 65 21 3d 30 20 29 3b 0a 20 t( pSize!=0 );.
14120 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 SimulateIOError
14130 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 (return SQLITE_I
14140 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a 20 20 4f OERR_FSTAT);. O
14150 53 54 52 41 43 45 28 28 22 53 49 5a 45 20 66 69 STRACE(("SIZE fi
14160 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25 70 5c le=%p, pSize=%p\
14170 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53 n", pFile->h, pS
14180 69 7a 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 ize));..#if SQLI
14190 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 0a TE_OS_WINRT. {.
141a0 20 20 20 20 46 49 4c 45 5f 53 54 41 4e 44 41 52 FILE_STANDAR
141b0 44 5f 49 4e 46 4f 20 69 6e 66 6f 3b 0a 20 20 20 D_INFO info;.
141c0 20 69 66 28 20 6f 73 47 65 74 46 69 6c 65 49 6e if( osGetFileIn
141d0 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c formationByHandl
141e0 65 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 46 69 eEx(pFile->h, Fi
141f0 6c 65 53 74 61 6e 64 61 72 64 49 6e 66 6f 2c 0a leStandardInfo,.
14200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
14210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
14220 20 20 20 20 20 26 69 6e 66 6f 2c 20 73 69 7a 65 &info, size
14230 6f 66 28 69 6e 66 6f 29 29 20 29 7b 0a 20 20 20 of(info)) ){.
14240 20 20 20 2a 70 53 69 7a 65 20 3d 20 69 6e 66 6f *pSize = info
14250 2e 45 6e 64 4f 66 46 69 6c 65 2e 51 75 61 64 50 .EndOfFile.QuadP
14260 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a art;. }else{.
14270 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 pFile->las
14280 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 tErrno = osGetLa
14290 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 stError();.
142a0 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f rc = winLogErro
142b0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 r(SQLITE_IOERR_F
142c0 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 STAT, pFile->las
142d0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 tErrno,.
142e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 "
142f0 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 winFileSize", pF
14300 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 ile->zPath);.
14310 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7b }. }.#else. {
14320 0a 20 20 20 20 44 57 4f 52 44 20 75 70 70 65 72 . DWORD upper
14330 42 69 74 73 3b 0a 20 20 20 20 44 57 4f 52 44 20 Bits;. DWORD
14340 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 20 20 44 lowerBits;. D
14350 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a WORD lastErrno;.
14360 0a 20 20 20 20 6c 6f 77 65 72 42 69 74 73 20 3d . lowerBits =
14370 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 28 70 osGetFileSize(p
14380 46 69 6c 65 2d 3e 68 2c 20 26 75 70 70 65 72 42 File->h, &upperB
14390 69 74 73 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 its);. *pSize
143a0 20 3d 20 28 28 28 73 71 6c 69 74 65 33 5f 69 6e = (((sqlite3_in
143b0 74 36 34 29 75 70 70 65 72 42 69 74 73 29 3c 3c t64)upperBits)<<
143c0 33 32 29 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b 32) + lowerBits;
143d0 0a 20 20 20 20 69 66 28 20 20 20 28 6c 6f 77 65 . if( (lowe
143e0 72 42 69 74 73 20 3d 3d 20 49 4e 56 41 4c 49 44 rBits == INVALID
143f0 5f 46 49 4c 45 5f 53 49 5a 45 29 0a 20 20 20 20 _FILE_SIZE).
14400 20 20 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e && ((lastErrn
14410 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 o = osGetLastErr
14420 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 or())!=NO_ERROR)
14430 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d ){. pFile-
14440 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 >lastErrno = las
14450 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 tErrno;. rc
14460 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 = winLogError(S
14470 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 QLITE_IOERR_FSTA
14480 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 T, pFile->lastEr
14490 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 rno,.
144a0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e "win
144b0 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 FileSize", pFile
144c0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a ->zPath);. }.
144d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 }.#endif. OST
144e0 52 41 43 45 28 28 22 53 49 5a 45 20 66 69 6c 65 RACE(("SIZE file
144f0 3d 25 70 2c 20 70 53 69 7a 65 3d 25 70 2c 20 2a =%p, pSize=%p, *
14500 70 53 69 7a 65 3d 25 6c 6c 64 2c 20 72 63 3d 25 pSize=%lld, rc=%
14510 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 s\n",.
14520 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53 69 7a 65 pFile->h, pSize
14530 2c 20 2a 70 53 69 7a 65 2c 20 73 71 6c 69 74 65 , *pSize, sqlite
14540 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 3ErrName(rc)));.
14550 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a return rc;.}..
14560 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46 /*.** LOCKFILE_F
14570 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 AIL_IMMEDIATELY
14580 69 73 20 75 6e 64 65 66 69 6e 65 64 20 6f 6e 20 is undefined on
14590 73 6f 6d 65 20 57 69 6e 64 6f 77 73 20 73 79 73 some Windows sys
145a0 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 tems..*/.#ifndef
145b0 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 LOCKFILE_FAIL_I
145c0 4d 4d 45 44 49 41 54 45 4c 59 0a 23 20 64 65 66 MMEDIATELY.# def
145d0 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 ine LOCKFILE_FAI
145e0 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 31 0a L_IMMEDIATELY 1.
145f0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 #endif..#ifndef
14600 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 LOCKFILE_EXCLUSI
14610 56 45 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65 VE_LOCK.# define
14620 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 LOCKFILE_EXCLUS
14630 49 56 45 5f 4c 4f 43 4b 20 32 0a 23 65 6e 64 69 IVE_LOCK 2.#endi
14640 66 0a 0a 2f 2a 0a 2a 2a 20 48 69 73 74 6f 72 69 f../*.** Histori
14650 63 61 6c 6c 79 2c 20 53 51 4c 69 74 65 20 68 61 cally, SQLite ha
14660 73 20 75 73 65 64 20 62 6f 74 68 20 74 68 65 20 s used both the
14670 4c 6f 63 6b 46 69 6c 65 20 61 6e 64 20 4c 6f 63 LockFile and Loc
14680 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e kFileEx function
14690 73 2e 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 4c s..** When the L
146a0 6f 63 6b 46 69 6c 65 20 66 75 6e 63 74 69 6f 6e ockFile function
146b0 20 77 61 73 20 75 73 65 64 2c 20 69 74 20 77 61 was used, it wa
146c0 73 20 61 6c 77 61 79 73 20 65 78 70 65 63 74 65 s always expecte
146d0 64 20 74 6f 20 66 61 69 6c 0a 2a 2a 20 69 6d 6d d to fail.** imm
146e0 65 64 69 61 74 65 6c 79 20 69 66 20 74 68 65 20 ediately if the
146f0 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 lock could not b
14700 65 20 6f 62 74 61 69 6e 65 64 2e 20 20 41 6c 73 e obtained. Als
14710 6f 2c 20 69 74 20 61 6c 77 61 79 73 20 65 78 70 o, it always exp
14720 65 63 74 65 64 20 74 6f 0a 2a 2a 20 6f 62 74 61 ected to.** obta
14730 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 in an exclusive
14740 6c 6f 63 6b 2e 20 20 54 68 65 73 65 20 66 6c 61 lock. These fla
14750 67 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 gs are used with
14760 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20 the LockFileEx
14770 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 function.** and
14780 72 65 66 6c 65 63 74 20 74 68 6f 73 65 20 65 78 reflect those ex
14790 70 65 63 74 61 74 69 6f 6e 73 3b 20 74 68 65 72 pectations; ther
147a0 65 66 6f 72 65 2c 20 74 68 65 79 20 73 68 6f 75 efore, they shou
147b0 6c 64 20 6e 6f 74 20 62 65 20 63 68 61 6e 67 65 ld not be change
147c0 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 d..*/.#ifndef SQ
147d0 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c LITE_LOCKFILE_FL
147e0 41 47 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c AGS.# define SQL
147f0 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 ITE_LOCKFILE_FLA
14800 47 53 20 20 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 GS (LOCKFILE_F
14810 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 AIL_IMMEDIATELY
14820 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 | \.
14830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
14840 20 20 20 20 20 20 4c 4f 43 4b 46 49 4c 45 5f 45 LOCKFILE_E
14850 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 23 XCLUSIVE_LOCK).#
14860 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 75 72 endif../*.** Cur
14870 72 65 6e 74 6c 79 2c 20 53 51 4c 69 74 65 20 6e rently, SQLite n
14880 65 76 65 72 20 63 61 6c 6c 73 20 74 68 65 20 4c ever calls the L
14890 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69 ockFileEx functi
148a0 6f 6e 20 77 69 74 68 6f 75 74 20 77 61 6e 74 69 on without wanti
148b0 6e 67 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 ng the.** call t
148c0 6f 20 66 61 69 6c 20 69 6d 6d 65 64 69 61 74 65 o fail immediate
148d0 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 63 ly if the lock c
148e0 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 annot be obtaine
148f0 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 d..*/.#ifndef SQ
14900 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f LITE_LOCKFILEEX_
14910 46 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20 53 FLAGS.# define S
14920 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 QLITE_LOCKFILEEX
14930 5f 46 4c 41 47 53 20 28 4c 4f 43 4b 46 49 4c 45 _FLAGS (LOCKFILE
14940 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c _FAIL_IMMEDIATEL
14950 59 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a Y).#endif../*.**
14960 20 41 63 71 75 69 72 65 20 61 20 72 65 61 64 65 Acquire a reade
14970 72 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66 65 r lock..** Diffe
14980 72 65 6e 74 20 41 50 49 20 72 6f 75 74 69 6e 65 rent API routine
14990 73 20 61 72 65 20 63 61 6c 6c 65 64 20 64 65 70 s are called dep
149a0 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 ending on whethe
149b0 72 20 6f 72 20 6e 6f 74 20 74 68 69 73 0a 2a 2a r or not this.**
149c0 20 69 73 20 57 69 6e 39 78 20 6f 72 20 57 69 6e is Win9x or Win
149d0 4e 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e NT..*/.static in
149e0 74 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b t winGetReadLock
149f0 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 (winFile *pFile)
14a00 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 4f {. int res;. O
14a10 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 4c 4f STRACE(("READ-LO
14a20 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b CK file=%p, lock
14a30 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 =%d\n", pFile->h
14a40 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 , pFile->locktyp
14a50 65 29 29 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e e));. if( osIsN
14a60 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 T() ){.#if SQLIT
14a70 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 2f E_OS_WINCE. /
14a80 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 *. ** NOTE: W
14a90 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e indows CE is han
14aa0 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 dled differently
14ab0 20 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 here due its la
14ac0 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a ck of the Win32.
14ad0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 ** API
14ae0 20 4c 6f 63 6b 46 69 6c 65 45 78 2e 0a 20 20 20 LockFileEx..
14af0 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 77 69 */. res = wi
14b00 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 nceLockFile(&pFi
14b10 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 le->h, SHARED_FI
14b20 52 53 54 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 23 RST, 0, 1, 0);.#
14b30 65 6c 73 65 0a 20 20 20 20 72 65 73 20 3d 20 77 else. res = w
14b40 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c inLockFile(&pFil
14b50 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 e->h, SQLITE_LOC
14b60 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c 20 53 KFILEEX_FLAGS, S
14b70 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a HARED_FIRST, 0,.
14b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
14b90 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a SHARED_SIZ
14ba0 45 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 E, 0);.#endif.
14bb0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f }.#ifdef SQLITE_
14bc0 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 WIN32_HAS_ANSI.
14bd0 20 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6c else{. int l
14be0 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 k;. sqlite3_r
14bf0 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 andomness(sizeof
14c00 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20 20 20 (lk), &lk);.
14c10 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 pFile->sharedLoc
14c20 6b 42 79 74 65 20 3d 20 28 73 68 6f 72 74 29 28 kByte = (short)(
14c30 28 6c 6b 20 26 20 30 78 37 66 66 66 66 66 66 66 (lk & 0x7fffffff
14c40 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d )%(SHARED_SIZE -
14c50 20 31 29 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 1));. res =
14c60 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 winLockFile(&pFi
14c70 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f le->h, SQLITE_LO
14c80 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 CKFILE_FLAGS,.
14c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
14ca0 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 SHARED_FIRST
14cb0 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f +pFile->sharedLo
14cc0 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 ckByte, 0, 1, 0)
14cd0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 ;. }.#endif. i
14ce0 66 28 20 72 65 73 20 3d 3d 20 30 20 29 7b 0a 20 f( res == 0 ){.
14cf0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 pFile->lastEr
14d00 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 rno = osGetLastE
14d10 72 72 6f 72 28 29 3b 0a 20 20 20 20 2f 2a 20 4e rror();. /* N
14d20 6f 20 6e 65 65 64 20 74 6f 20 6c 6f 67 20 61 20 o need to log a
14d30 66 61 69 6c 75 72 65 20 74 6f 20 6c 6f 63 6b 20 failure to lock
14d40 2a 2f 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 */. }. OSTRACE
14d50 28 28 22 52 45 41 44 2d 4c 4f 43 4b 20 66 69 6c (("READ-LOCK fil
14d60 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 e=%p, rc=%s\n",
14d70 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 pFile->h, sqlite
14d80 33 45 72 72 4e 61 6d 65 28 72 65 73 29 29 29 3b 3ErrName(res)));
14d90 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d . return res;.}
14da0 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20 72 ../*.** Undo a r
14db0 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 eadlock.*/.stati
14dc0 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 52 c int winUnlockR
14dd0 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 eadLock(winFile
14de0 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 *pFile){. int r
14df0 65 73 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 es;. DWORD last
14e00 45 72 72 6e 6f 3b 0a 20 20 4f 53 54 52 41 43 45 Errno;. OSTRACE
14e10 28 28 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20 66 (("READ-UNLOCK f
14e20 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 5c ile=%p, lock=%d\
14e30 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 n", pFile->h, pF
14e40 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b ile->locktype));
14e50 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 . if( osIsNT()
14e60 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e ){. res = win
14e70 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c UnlockFile(&pFil
14e80 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 e->h, SHARED_FIR
14e90 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 ST, 0, SHARED_SI
14ea0 5a 45 2c 20 30 29 3b 0a 20 20 7d 0a 23 69 66 64 ZE, 0);. }.#ifd
14eb0 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f ef SQLITE_WIN32_
14ec0 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b HAS_ANSI. else{
14ed0 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e . res = winUn
14ee0 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d lockFile(&pFile-
14ef0 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 >h, SHARED_FIRST
14f00 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f +pFile->sharedLo
14f10 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 ckByte, 0, 1, 0)
14f20 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 ;. }.#endif. i
14f30 66 28 20 72 65 73 3d 3d 30 20 26 26 20 28 28 6c f( res==0 && ((l
14f40 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 astErrno = osGet
14f50 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 45 52 LastError())!=ER
14f60 52 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 29 20 ROR_NOT_LOCKED)
14f70 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 ){. pFile->la
14f80 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 stErrno = lastEr
14f90 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 rno;. winLogE
14fa0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 rror(SQLITE_IOER
14fb0 52 5f 55 4e 4c 4f 43 4b 2c 20 70 46 69 6c 65 2d R_UNLOCK, pFile-
14fc0 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 >lastErrno,.
14fd0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e "win
14fe0 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 22 2c UnlockReadLock",
14ff0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a pFile->zPath);.
15000 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 }. OSTRACE(("
15010 52 45 41 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c 65 READ-UNLOCK file
15020 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 =%p, rc=%s\n", p
15030 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 File->h, sqlite3
15040 45 72 72 4e 61 6d 65 28 72 65 73 29 29 29 3b 0a ErrName(res)));.
15050 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a return res;.}.
15060 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 ./*.** Lock the
15070 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f file with the lo
15080 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 ck specified by
15090 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 parameter lockty
150a0 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 pe - one.** of t
150b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a he following:.**
150c0 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 .** (1) SHAR
150d0 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 ED_LOCK.** (
150e0 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 2) RESERVED_LOCK
150f0 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 .** (3) PEND
15100 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 ING_LOCK.**
15110 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f (4) EXCLUSIVE_LO
15120 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d CK.**.** Sometim
15130 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 es when requesti
15140 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 ng one lock stat
15150 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f e, additional lo
15160 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 ck states.** are
15170 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 inserted in bet
15180 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 ween. The locki
15190 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e ng might fail on
151a0 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 one of the late
151b0 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 r.** transitions
151c0 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 leaving the loc
151d0 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e k state differen
151e0 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 t from what it s
151f0 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 tarted but.** st
15200 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 ill short of its
15210 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c goal. The foll
15220 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 owing chart show
15230 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a s the allowed.**
15240 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 transitions and
15250 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e the inserted in
15260 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 termediate state
15270 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f s:.**.** UNLO
15280 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a CKED -> SHARED.*
15290 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 * SHARED -> R
152a0 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 ESERVED.** SH
152b0 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 ARED -> (PENDING
152c0 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a ) -> EXCLUSIVE.*
152d0 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e * RESERVED ->
152e0 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 (PENDING) -> EX
152f0 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 CLUSIVE.** PE
15300 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 NDING -> EXCLUSI
15310 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f VE.**.** This ro
15320 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 utine will only
15330 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e increase a lock.
15340 20 20 54 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 The winUnlock(
15350 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 ) routine.** era
15360 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 ses all locks at
15370 20 6f 6e 63 65 20 61 6e 64 20 72 65 74 75 72 6e once and return
15380 73 20 75 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 s us immediately
15390 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 to locking leve
153a0 6c 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f l 0..** It is no
153b0 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f t possible to lo
153c0 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 wer the locking
153d0 6c 65 76 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 level one step a
153e0 74 20 61 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a t a time. You.*
153f0 2a 20 6d 75 73 74 20 67 6f 20 73 74 72 61 69 67 * must go straig
15400 68 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 ht to locking le
15410 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 vel 0..*/.static
15420 20 69 6e 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c int winLock(sql
15430 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 ite3_file *id, i
15440 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 nt locktype){.
15450 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f int rc = SQLITE_
15460 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 74 75 72 6e OK; /* Return
15470 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 72 6f code from subro
15480 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 utines */. int
15490 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 res = 1;
154a0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 /* Result of
154b0 61 20 57 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 a Windows lock c
154c0 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 all */. int new
154d0 4c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20 Locktype;
154e0 2f 2a 20 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f /* Set pFile->lo
154f0 63 6b 74 79 70 65 20 74 6f 20 74 68 69 73 20 76 cktype to this v
15500 61 6c 75 65 20 62 65 66 6f 72 65 20 65 78 69 74 alue before exit
15510 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 ing */. int got
15520 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b PendingLock = 0;
15530 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 61 63 /* True if we ac
15540 71 75 69 72 65 64 20 61 20 50 45 4e 44 49 4e 47 quired a PENDING
15550 20 6c 6f 63 6b 20 74 68 69 73 20 74 69 6d 65 20 lock this time
15560 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 */. winFile *pF
15570 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 ile = (winFile*)
15580 69 64 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 id;. DWORD last
15590 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 Errno = NO_ERROR
155a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 ;.. assert( id!
155b0 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 =0 );. OSTRACE(
155c0 28 22 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 ("LOCK file=%p,
155d0 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c 20 oldLock=%d(%d),
155e0 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 newLock=%d\n",.
155f0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d pFile-
15600 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 >h, pFile->lockt
15610 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 ype, pFile->shar
15620 65 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63 6b edLockByte, lock
15630 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 type));.. /* If
15640 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 there is alread
15650 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 y a lock of this
15660 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 type or more re
15670 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 strictive on the
15680 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f . ** OsFile, do
15690 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 nothing. Don't
156a0 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b use the end_lock
156b0 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a : exit path, as.
156c0 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e ** sqlite3OsEn
156d0 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 terMutex() hasn'
156e0 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 t been called ye
156f0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 t.. */. if( pF
15700 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c ile->locktype>=l
15710 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 4f ocktype ){. O
15720 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d 48 45 STRACE(("LOCK-HE
15730 4c 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 LD file=%p, rc=S
15740 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 QLITE_OK\n", pFi
15750 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 le->h));. ret
15760 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 urn SQLITE_OK;.
15770 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 }.. /* Make su
15780 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 re the locking s
15790 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 equence is corre
157a0 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 ct. */. assert
157b0 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 ( pFile->locktyp
157c0 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f e!=NO_LOCK || lo
157d0 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c cktype==SHARED_L
157e0 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 OCK );. assert(
157f0 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 locktype!=PENDI
15800 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 NG_LOCK );. ass
15810 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 ert( locktype!=R
15820 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 ESERVED_LOCK ||
15830 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d pFile->locktype=
15840 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a =SHARED_LOCK );.
15850 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74 68 65 20 50 . /* Lock the P
15860 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 ENDING_LOCK byte
15870 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 61 if we need to a
15880 63 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47 cquire a PENDING
15890 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 lock or. ** a
158a0 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 20 49 66 SHARED lock. If
158b0 20 77 65 20 61 72 65 20 61 63 71 75 69 72 69 6e we are acquirin
158c0 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c g a SHARED lock,
158d0 20 74 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e the acquisition
158e0 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 50 45 4e of. ** the PEN
158f0 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 DING_LOCK byte i
15900 73 20 74 65 6d 70 6f 72 61 72 79 2e 0a 20 20 2a s temporary.. *
15910 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 /. newLocktype
15920 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 = pFile->locktyp
15930 65 3b 0a 20 20 69 66 28 20 20 20 28 70 46 69 6c e;. if( (pFil
15940 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f e->locktype==NO_
15950 4c 4f 43 4b 29 0a 20 20 20 20 20 7c 7c 20 28 20 LOCK). || (
15960 20 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 (locktype==EXC
15970 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 20 LUSIVE_LOCK).
15980 20 20 20 20 20 20 26 26 20 28 70 46 69 6c 65 2d && (pFile-
15990 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 >locktype==RESER
159a0 56 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a VED_LOCK)). ){.
159b0 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b int cnt = 3;
159c0 0a 20 20 20 20 77 68 69 6c 65 28 20 63 6e 74 2d . while( cnt-
159d0 2d 3e 30 20 26 26 20 28 72 65 73 20 3d 20 77 69 ->0 && (res = wi
159e0 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 nLockFile(&pFile
159f0 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b ->h, SQLITE_LOCK
15a00 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20 FILE_FLAGS,.
15a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15a30 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 PENDING_BYT
15a40 45 2c 20 30 2c 20 31 2c 20 30 29 29 3d 3d 30 20 E, 0, 1, 0))==0
15a50 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20 ){. /* Try
15a60 33 20 74 69 6d 65 73 20 74 6f 20 67 65 74 20 74 3 times to get t
15a70 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e he pending lock.
15a80 20 20 54 68 69 73 20 69 73 20 6e 65 65 64 65 64 This is needed
15a90 20 74 6f 20 77 6f 72 6b 0a 20 20 20 20 20 20 2a to work. *
15aa0 2a 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d * around problem
15ab0 73 20 63 61 75 73 65 64 20 62 79 20 69 6e 64 65 s caused by inde
15ac0 78 69 6e 67 20 61 6e 64 2f 6f 72 20 61 6e 74 69 xing and/or anti
15ad0 2d 76 69 72 75 73 20 73 6f 66 74 77 61 72 65 20 -virus software
15ae0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 57 69 6e 64 on. ** Wind
15af0 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a 20 20 20 ows systems..
15b00 20 20 20 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 ** If you are
15b10 20 75 73 69 6e 67 20 74 68 69 73 20 63 6f 64 65 using this code
15b20 20 61 73 20 61 20 6d 6f 64 65 6c 20 66 6f 72 20 as a model for
15b30 61 6c 74 65 72 6e 61 74 69 76 65 20 56 46 53 65 alternative VFSe
15b40 73 2c 20 64 6f 20 6e 6f 74 0a 20 20 20 20 20 20 s, do not.
15b50 2a 2a 20 63 6f 70 79 20 74 68 69 73 20 72 65 74 ** copy this ret
15b60 72 79 20 6c 6f 67 69 63 2e 20 20 49 74 20 69 73 ry logic. It is
15b70 20 61 20 68 61 63 6b 20 69 6e 74 65 6e 64 65 64 a hack intended
15b80 20 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c for Windows onl
15b90 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 y.. */.
15ba0 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b OSTRACE(("LOCK
15bb0 2d 50 45 4e 44 49 4e 47 2d 46 41 49 4c 20 66 69 -PENDING-FAIL fi
15bc0 6c 65 3d 25 70 2c 20 63 6f 75 6e 74 3d 25 64 2c le=%p, count=%d,
15bd0 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 rc=%s\n",.
15be0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d pFile-
15bf0 3e 68 2c 20 63 6e 74 2c 20 73 71 6c 69 74 65 33 >h, cnt, sqlite3
15c00 45 72 72 4e 61 6d 65 28 72 65 73 29 29 29 3b 0a ErrName(res)));.
15c10 20 20 20 20 20 20 69 66 28 20 63 6e 74 20 29 20 if( cnt )
15c20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c sqlite3_win32_sl
15c30 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 eep(1);. }.
15c40 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b gotPendingLock
15c50 20 3d 20 72 65 73 3b 0a 20 20 20 20 69 66 28 20 = res;. if(
15c60 21 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6c 61 !res ){. la
15c70 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c stErrno = osGetL
15c80 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 astError();.
15c90 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 }. }.. /* Acqu
15ca0 69 72 65 20 61 20 73 68 61 72 65 64 20 6c 6f 63 ire a shared loc
15cb0 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 k. */. if( loc
15cc0 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f ktype==SHARED_LO
15cd0 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 CK && res ){.
15ce0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e assert( pFile->
15cf0 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 locktype==NO_LOC
15d00 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 K );. res = w
15d10 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 inGetReadLock(pF
15d20 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72 65 ile);. if( re
15d30 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f s ){. newLo
15d40 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f cktype = SHARED_
15d50 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b LOCK;. }else{
15d60 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f . lastErrno
15d70 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f = osGetLastErro
15d80 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a r();. }. }..
15d90 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 /* Acquire a R
15da0 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20 2a ESERVED lock. *
15db0 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 /. if( locktype
15dc0 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 ==RESERVED_LOCK
15dd0 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 && res ){. as
15de0 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 sert( pFile->loc
15df0 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f ktype==SHARED_LO
15e00 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 CK );. res =
15e10 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 winLockFile(&pFi
15e20 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f le->h, SQLITE_LO
15e30 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 52 45 CKFILE_FLAGS, RE
15e40 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 SERVED_BYTE, 0,
15e50 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 1, 0);. if( r
15e60 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c es ){. newL
15e70 6f 63 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56 ocktype = RESERV
15e80 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c ED_LOCK;. }el
15e90 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 se{. lastEr
15ea0 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 rno = osGetLastE
15eb0 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 rror();. }.
15ec0 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 }.. /* Acquire
15ed0 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 a PENDING lock.
15ee0 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 */. if( lockty
15ef0 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f pe==EXCLUSIVE_LO
15f00 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 CK && res ){.
15f10 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50 newLocktype = P
15f20 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 ENDING_LOCK;.
15f30 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 gotPendingLock
15f40 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 = 0;. }.. /* A
15f50 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 cquire an EXCLUS
15f60 49 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 IVE lock. */.
15f70 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 if( locktype==EX
15f80 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 CLUSIVE_LOCK &&
15f90 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 res ){. asser
15fa0 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 t( pFile->lockty
15fb0 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 pe>=SHARED_LOCK
15fc0 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e );. res = win
15fd0 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 UnlockReadLock(p
15fe0 46 69 6c 65 29 3b 0a 20 20 20 20 72 65 73 20 3d File);. res =
15ff0 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 winLockFile(&pF
16000 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c ile->h, SQLITE_L
16010 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 53 OCKFILE_FLAGS, S
16020 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a HARED_FIRST, 0,.
16030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16040 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a SHARED_SIZ
16050 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 E, 0);. if( r
16060 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c es ){. newL
16070 6f 63 6b 74 79 70 65 20 3d 20 45 58 43 4c 55 53 ocktype = EXCLUS
16080 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 IVE_LOCK;. }e
16090 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 lse{. lastE
160a0 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 rrno = osGetLast
160b0 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 Error();. w
160c0 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 inGetReadLock(pF
160d0 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a ile);. }. }.
160e0 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 . /* If we are
160f0 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44 49 4e holding a PENDIN
16100 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75 67 68 G lock that ough
16110 74 20 74 6f 20 62 65 20 72 65 6c 65 61 73 65 64 t to be released
16120 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 6c 65 , then. ** rele
16130 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f ase it now.. */
16140 0a 20 20 69 66 28 20 67 6f 74 50 65 6e 64 69 6e . if( gotPendin
16150 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74 79 70 gLock && locktyp
16160 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 e==SHARED_LOCK )
16170 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 {. winUnlockF
16180 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50 ile(&pFile->h, P
16190 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 ENDING_BYTE, 0,
161a0 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 1, 0);. }.. /*
161b0 20 55 70 64 61 74 65 20 74 68 65 20 73 74 61 74 Update the stat
161c0 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68 61 e of the lock ha
161d0 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66 69 s held in the fi
161e0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 le descriptor th
161f0 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 en. ** return t
16200 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 72 he appropriate r
16210 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f esult code.. */
16220 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 . if( res ){.
16230 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b rc = SQLITE_OK
16240 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 ;. }else{. p
16250 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 File->lastErrno
16260 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 = lastErrno;.
16270 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 rc = SQLITE_BUS
16280 59 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 Y;. OSTRACE((
16290 22 4c 4f 43 4b 2d 46 41 49 4c 20 66 69 6c 65 3d "LOCK-FAIL file=
162a0 25 70 2c 20 77 61 6e 74 65 64 3d 25 64 2c 20 67 %p, wanted=%d, g
162b0 6f 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 ot=%d\n",.
162c0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c pFile->h,
162d0 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f locktype, newLo
162e0 63 6b 74 79 70 65 29 29 3b 0a 20 20 7d 0a 20 20 cktype));. }.
162f0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 pFile->locktype
16300 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74 79 70 = (u8)newLocktyp
16310 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c e;. OSTRACE(("L
16320 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 OCK file=%p, loc
16330 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a k=%d, rc=%s\n",.
16340 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 pFile
16350 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b ->h, pFile->lock
16360 74 79 70 65 2c 20 73 71 6c 69 74 65 33 45 72 72 type, sqlite3Err
16370 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 Name(rc)));. re
16380 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a turn rc;.}../*.*
16390 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 * This routine c
163a0 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 hecks if there i
163b0 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 s a RESERVED loc
163c0 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 k held on the sp
163d0 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 ecified.** file
163e0 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f by this or any o
163f0 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 ther process. If
16400 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 such a lock is
16410 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 held, return.**
16420 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65 72 77 non-zero, otherw
16430 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 ise zero..*/.sta
16440 74 69 63 20 69 6e 74 20 77 69 6e 43 68 65 63 6b tic int winCheck
16450 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c ReservedLock(sql
16460 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 ite3_file *id, i
16470 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 nt *pResOut){.
16480 69 6e 74 20 72 63 3b 0a 20 20 77 69 6e 46 69 6c int rc;. winFil
16490 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 e *pFile = (winF
164a0 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 ile*)id;.. Simu
164b0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 lateIOError( ret
164c0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 urn SQLITE_IOERR
164d0 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f _CHECKRESERVEDLO
164e0 43 4b 3b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 CK; );. OSTRACE
164f0 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 (("TEST-WR-LOCK
16500 66 69 6c 65 3d 25 70 2c 20 70 52 65 73 4f 75 74 file=%p, pResOut
16510 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 =%p\n", pFile->h
16520 2c 20 70 52 65 73 4f 75 74 29 29 3b 0a 0a 20 20 , pResOut));..
16530 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b assert( id!=0 );
16540 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f . if( pFile->lo
16550 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 cktype>=RESERVED
16560 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 _LOCK ){. rc
16570 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 = 1;. OSTRACE
16580 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 (("TEST-WR-LOCK
16590 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 64 20 28 file=%p, rc=%d (
165a0 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69 6c 65 local)\n", pFile
165b0 2d 3e 68 2c 20 72 63 29 29 3b 0a 20 20 7d 65 6c ->h, rc));. }el
165c0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e se{. rc = win
165d0 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d LockFile(&pFile-
165e0 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 >h, SQLITE_LOCKF
165f0 49 4c 45 45 58 5f 46 4c 41 47 53 2c 52 45 53 45 ILEEX_FLAGS,RESE
16600 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c RVED_BYTE, 0, 1,
16610 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 0);. if( rc
16620 29 7b 0a 20 20 20 20 20 20 77 69 6e 55 6e 6c 6f ){. winUnlo
16630 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 ckFile(&pFile->h
16640 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c , RESERVED_BYTE,
16650 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0, 1, 0);. }
16660 0a 20 20 20 20 72 63 20 3d 20 21 72 63 3b 0a 20 . rc = !rc;.
16670 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 OSTRACE(("TES
16680 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 T-WR-LOCK file=%
16690 70 2c 20 72 63 3d 25 64 20 28 72 65 6d 6f 74 65 p, rc=%d (remote
166a0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 )\n", pFile->h,
166b0 72 63 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 rc));. }. *pRe
166c0 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 4f 53 54 sOut = rc;. OST
166d0 52 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c RACE(("TEST-WR-L
166e0 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 70 52 65 OCK file=%p, pRe
166f0 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65 73 4f 75 sOut=%p, *pResOu
16700 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49 54 45 5f t=%d, rc=SQLITE_
16710 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 OK\n",.
16720 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 52 65 73 pFile->h, pRes
16730 4f 75 74 2c 20 2a 70 52 65 73 4f 75 74 29 29 3b Out, *pResOut));
16740 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 . return SQLITE
16750 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f _OK;.}../*.** Lo
16760 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 wer the locking
16770 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 level on file de
16780 73 63 72 69 70 74 6f 72 20 69 64 20 74 6f 20 6c scriptor id to l
16790 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 ocktype. lockty
167a0 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 pe.** must be ei
167b0 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 ther NO_LOCK or
167c0 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a SHARED_LOCK..**.
167d0 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e ** If the lockin
167e0 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 g level of the f
167f0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 ile descriptor i
16800 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 s already at or
16810 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 below.** the req
16820 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c uested locking l
16830 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 evel, this routi
16840 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a ne is a no-op..*
16850 2a 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 *.** It is not p
16860 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 ossible for this
16870 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 61 69 6c routine to fail
16880 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 if the second a
16890 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f rgument.** is NO
168a0 5f 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65 20 73 _LOCK. If the s
168b0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 econd argument i
168c0 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 74 68 s SHARED_LOCK th
168d0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a en this routine.
168e0 2a 2a 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 ** might return
168f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f SQLITE_IOERR;.*/
16900 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55 .static int winU
16910 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 nlock(sqlite3_fi
16920 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b le *id, int lock
16930 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 74 79 70 type){. int typ
16940 65 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 e;. winFile *pF
16950 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 ile = (winFile*)
16960 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 id;. int rc = S
16970 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 QLITE_OK;. asse
16980 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a rt( pFile!=0 );.
16990 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 assert( lockty
169a0 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 pe<=SHARED_LOCK
169b0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 );. OSTRACE(("U
169c0 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6f NLOCK file=%p, o
169d0 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c 20 6e ldLock=%d(%d), n
169e0 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 ewLock=%d\n",.
169f0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e pFile->
16a00 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 h, pFile->lockty
16a10 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 pe, pFile->share
16a20 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63 6b 74 dLockByte, lockt
16a30 79 70 65 29 29 3b 0a 20 20 74 79 70 65 20 3d 20 ype));. type =
16a40 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b pFile->locktype;
16a50 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 45 58 43 . if( type>=EXC
16a60 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 LUSIVE_LOCK ){.
16a70 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 winUnlockFile
16a80 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 (&pFile->h, SHAR
16a90 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 ED_FIRST, 0, SHA
16aa0 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 RED_SIZE, 0);.
16ab0 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d if( locktype==
16ac0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 21 SHARED_LOCK && !
16ad0 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 winGetReadLock(p
16ae0 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 2f File) ){. /
16af0 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 * This should ne
16b00 76 65 72 20 68 61 70 70 65 6e 2e 20 20 57 65 20 ver happen. We
16b10 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 should always be
16b20 20 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a able to. *
16b30 2a 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 * reacquire the
16b40 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 read lock */.
16b50 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 rc = winLogEr
16b60 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 ror(SQLITE_IOERR
16b70 5f 55 4e 4c 4f 43 4b 2c 20 6f 73 47 65 74 4c 61 _UNLOCK, osGetLa
16b80 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 stError(),.
16b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16ba0 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c 20 70 "winUnlock", p
16bb0 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 File->zPath);.
16bc0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 }. }. if( ty
16bd0 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 pe>=RESERVED_LOC
16be0 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f K ){. winUnlo
16bf0 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 ckFile(&pFile->h
16c00 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c , RESERVED_BYTE,
16c10 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 0, 1, 0);. }.
16c20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e if( locktype==N
16c30 4f 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d O_LOCK && type>=
16c40 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 SHARED_LOCK ){.
16c50 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 winUnlockRead
16c60 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 7d Lock(pFile);. }
16c70 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 50 45 4e . if( type>=PEN
16c80 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 DING_LOCK ){.
16c90 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 winUnlockFile(&
16ca0 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e pFile->h, PENDIN
16cb0 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 G_BYTE, 0, 1, 0)
16cc0 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c ;. }. pFile->l
16cd0 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29 6c 6f ocktype = (u8)lo
16ce0 63 6b 74 79 70 65 3b 0a 20 20 4f 53 54 52 41 43 cktype;. OSTRAC
16cf0 45 28 28 22 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d E(("UNLOCK file=
16d00 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 72 63 3d %p, lock=%d, rc=
16d10 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 %s\n",.
16d20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c pFile->h, pFil
16d30 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 73 71 6c e->locktype, sql
16d40 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 ite3ErrName(rc))
16d50 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a );. return rc;.
16d60 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 }../*.** If *pAr
16d70 67 20 69 73 20 69 6e 69 74 69 74 69 61 6c 6c 79 g is inititially
16d80 20 6e 65 67 61 74 69 76 65 20 74 68 65 6e 20 74 negative then t
16d90 68 69 73 20 69 73 20 61 20 71 75 65 72 79 2e 20 his is a query.
16da0 20 53 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a Set *pArg to.**
16db0 20 31 20 6f 72 20 30 20 64 65 70 65 6e 64 69 6e 1 or 0 dependin
16dc0 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 g on whether or
16dd0 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f 66 20 not bit mask of
16de0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 pFile->ctrlFlags
16df0 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 is set..**.** I
16e00 66 20 2a 70 41 72 67 20 69 73 20 30 20 6f 72 20 f *pArg is 0 or
16e10 31 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 6f 72 1, then clear or
16e20 20 73 65 74 20 74 68 65 20 6d 61 73 6b 20 62 69 set the mask bi
16e30 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c t of pFile->ctrl
16e40 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 Flags..*/.static
16e50 20 76 6f 69 64 20 77 69 6e 4d 6f 64 65 42 69 74 void winModeBit
16e60 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c (winFile *pFile,
16e70 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d unsigned char m
16e80 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b ask, int *pArg){
16e90 0a 20 20 69 66 28 20 2a 70 41 72 67 3c 30 20 29 . if( *pArg<0 )
16ea0 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d 20 28 70 {. *pArg = (p
16eb0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 File->ctrlFlags
16ec0 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 & mask)!=0;. }e
16ed0 6c 73 65 20 69 66 28 20 28 2a 70 41 72 67 29 3d lse if( (*pArg)=
16ee0 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d =0 ){. pFile-
16ef0 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d >ctrlFlags &= ~m
16f00 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 ask;. }else{.
16f10 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 pFile->ctrlFla
16f20 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a gs |= mask;. }.
16f30 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 }../* Forward re
16f40 66 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 ferences to VFS
16f50 68 65 6c 70 65 72 20 6d 65 74 68 6f 64 73 20 75 helper methods u
16f60 73 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 sed for temporar
16f70 79 20 66 69 6c 65 73 20 2a 2f 0a 73 74 61 74 69 y files */.stati
16f80 63 20 69 6e 74 20 77 69 6e 47 65 74 54 65 6d 70 c int winGetTemp
16f90 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 name(sqlite3_vfs
16fa0 20 2a 2c 20 63 68 61 72 20 2a 2a 29 3b 0a 73 74 *, char **);.st
16fb0 61 74 69 63 20 69 6e 74 20 77 69 6e 49 73 44 69 atic int winIsDi
16fc0 72 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 29 3b r(const void *);
16fd0 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e .static BOOL win
16fe0 49 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 IsDriveLetterAnd
16ff0 43 6f 6c 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 Colon(const char
17000 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 *);../*.** Cont
17010 72 6f 6c 20 61 6e 64 20 71 75 65 72 79 20 6f 66 rol and query of
17020 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 68 the open file h
17030 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 andle..*/.static
17040 20 69 6e 74 20 77 69 6e 46 69 6c 65 43 6f 6e 74 int winFileCont
17050 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 rol(sqlite3_file
17060 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f *id, int op, vo
17070 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 77 69 6e id *pArg){. win
17080 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 File *pFile = (w
17090 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 4f 53 inFile*)id;. OS
170a0 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 TRACE(("FCNTL fi
170b0 6c 65 3d 25 70 2c 20 6f 70 3d 25 64 2c 20 70 41 le=%p, op=%d, pA
170c0 72 67 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d rg=%p\n", pFile-
170d0 3e 68 2c 20 6f 70 2c 20 70 41 72 67 29 29 3b 0a >h, op, pArg));.
170e0 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a switch( op ){.
170f0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f case SQLITE_
17100 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a FCNTL_LOCKSTATE:
17110 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 {. *(int*)
17120 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f pArg = pFile->lo
17130 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 4f 53 cktype;. OS
17140 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 TRACE(("FCNTL fi
17150 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 le=%p, rc=SQLITE
17160 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 _OK\n", pFile->h
17170 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e ));. return
17180 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 SQLITE_OK;.
17190 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 }. case SQLIT
171a0 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a E_LAST_ERRNO: {.
171b0 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 *(int*)pAr
171c0 67 20 3d 20 28 69 6e 74 29 70 46 69 6c 65 2d 3e g = (int)pFile->
171d0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 lastErrno;.
171e0 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c OSTRACE(("FCNTL
171f0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c file=%p, rc=SQL
17200 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 ITE_OK\n", pFile
17210 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 ->h));. ret
17220 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 urn SQLITE_OK;.
17230 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 }. case SQ
17240 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b LITE_FCNTL_CHUNK
17250 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 _SIZE: {. p
17260 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 File->szChunk =
17270 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 *(int *)pArg;.
17280 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 OSTRACE(("FC
17290 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d NTL file=%p, rc=
172a0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 SQLITE_OK\n", pF
172b0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 ile->h));.
172c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
172d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 ;. }. case
172e0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 SQLITE_FCNTL_SI
172f0 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 ZE_HINT: {.
17300 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 if( pFile->szCh
17310 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 unk>0 ){.
17320 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f sqlite3_int64 o
17330 6c 64 53 7a 3b 0a 20 20 20 20 20 20 20 20 69 6e ldSz;. in
17340 74 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 t rc = winFileSi
17350 7a 65 28 69 64 2c 20 26 6f 6c 64 53 7a 29 3b 0a ze(id, &oldSz);.
17360 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d if( rc==
17370 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 SQLITE_OK ){.
17380 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 sqlite3_i
17390 6e 74 36 34 20 6e 65 77 53 7a 20 3d 20 2a 28 73 nt64 newSz = *(s
173a0 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 70 41 qlite3_int64*)pA
173b0 72 67 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 rg;. if
173c0 28 20 6e 65 77 53 7a 3e 6f 6c 64 53 7a 20 29 7b ( newSz>oldSz ){
173d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 69 6d . Sim
173e0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 ulateIOErrorBeni
173f0 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 20 gn(1);.
17400 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 rc = winTrunc
17410 61 74 65 28 69 64 2c 20 6e 65 77 53 7a 29 3b 0a ate(id, newSz);.
17420 20 20 20 20 20 20 20 20 20 20 20 20 53 69 6d 75 Simu
17430 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 lateIOErrorBenig
17440 6e 28 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 n(0);.
17450 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 }. }.
17460 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 OSTRACE(("FC
17470 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d NTL file=%p, rc=
17480 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c %s\n", pFile->h,
17490 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 sqlite3ErrName(
174a0 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 rc)));. r
174b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 eturn rc;.
174c0 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 }. OSTRACE(
174d0 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c ("FCNTL file=%p,
174e0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 rc=SQLITE_OK\n"
174f0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 , pFile->h));.
17500 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 return SQLIT
17510 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 E_OK;. }.
17520 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 case SQLITE_FCNT
17530 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b L_PERSIST_WAL: {
17540 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 . winModeBi
17550 74 28 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 t(pFile, WINFILE
17560 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28 69 _PERSIST_WAL, (i
17570 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 nt*)pArg);.
17580 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c OSTRACE(("FCNTL
17590 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c file=%p, rc=SQL
175a0 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 ITE_OK\n", pFile
175b0 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 ->h));. ret
175c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 urn SQLITE_OK;.
175d0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 }. case SQ
175e0 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 LITE_FCNTL_POWER
175f0 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 20 SAFE_OVERWRITE:
17600 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64 65 42 {. winModeB
17610 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c it(pFile, WINFIL
17620 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41 E_PSOW, (int*)pA
17630 72 67 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 rg);. OSTRA
17640 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d CE(("FCNTL file=
17650 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b %p, rc=SQLITE_OK
17660 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b \n", pFile->h));
17670 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 . return SQ
17680 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 LITE_OK;. }.
17690 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 case SQLITE_F
176a0 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a CNTL_VFSNAME: {.
176b0 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 *(char**)p
176c0 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 Arg = sqlite3_mp
176d0 72 69 6e 74 66 28 22 77 69 6e 33 32 22 29 3b 0a rintf("win32");.
176e0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 OSTRACE(("
176f0 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 FCNTL file=%p, r
17700 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 c=SQLITE_OK\n",
17710 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 pFile->h));.
17720 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
17730 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 OK;. }. ca
17740 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f se SQLITE_FCNTL_
17750 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59 3a 20 WIN32_AV_RETRY:
17760 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 20 3d {. int *a =
17770 20 28 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20 (int*)pArg;.
17780 20 20 20 69 66 28 20 61 5b 30 5d 3e 30 20 29 7b if( a[0]>0 ){
17790 0a 20 20 20 20 20 20 20 20 77 69 6e 49 6f 65 72 . winIoer
177a0 72 52 65 74 72 79 20 3d 20 61 5b 30 5d 3b 0a 20 rRetry = a[0];.
177b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 }else{.
177c0 20 20 20 20 61 5b 30 5d 20 3d 20 77 69 6e 49 6f a[0] = winIo
177d0 65 72 72 52 65 74 72 79 3b 0a 20 20 20 20 20 20 errRetry;.
177e0 7d 0a 20 20 20 20 20 20 69 66 28 20 61 5b 31 5d }. if( a[1]
177f0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 >0 ){. wi
17800 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 nIoerrRetryDelay
17810 20 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d = a[1];. }
17820 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 5b else{. a[
17830 31 5d 20 3d 20 77 69 6e 49 6f 65 72 72 52 65 74 1] = winIoerrRet
17840 72 79 44 65 6c 61 79 3b 0a 20 20 20 20 20 20 7d ryDelay;. }
17850 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 . OSTRACE((
17860 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 "FCNTL file=%p,
17870 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c rc=SQLITE_OK\n",
17880 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 pFile->h));.
17890 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 return SQLITE
178a0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 _OK;. }. c
178b0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c ase SQLITE_FCNTL
178c0 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b _TEMPFILENAME: {
178d0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 46 . char *zTF
178e0 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 ile = 0;. i
178f0 6e 74 20 72 63 20 3d 20 77 69 6e 47 65 74 54 65 nt rc = winGetTe
17900 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56 mpname(pFile->pV
17910 66 73 2c 20 26 7a 54 46 69 6c 65 29 3b 0a 20 20 fs, &zTFile);.
17920 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 if( rc==SQLI
17930 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 TE_OK ){.
17940 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d *(char**)pArg =
17950 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d zTFile;. }
17960 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 . OSTRACE((
17970 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 "FCNTL file=%p,
17980 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d rc=%s\n", pFile-
17990 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 >h, sqlite3ErrNa
179a0 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 me(rc)));.
179b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d return rc;. }
179c0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f .#if SQLITE_MAX_
179d0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 MMAP_SIZE>0.
179e0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 case SQLITE_FCNT
179f0 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 L_MMAP_SIZE: {.
17a00 20 20 20 20 20 69 36 34 20 6e 65 77 4c 69 6d 69 i64 newLimi
17a10 74 20 3d 20 2a 28 69 36 34 2a 29 70 41 72 67 3b t = *(i64*)pArg;
17a20 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 . int rc =
17a30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 SQLITE_OK;.
17a40 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71 if( newLimit>sq
17a50 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 lite3GlobalConfi
17a60 67 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20 g.mxMmap ){.
17a70 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73 newLimit = s
17a80 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 qlite3GlobalConf
17a90 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 ig.mxMmap;.
17aa0 20 7d 0a 20 20 20 20 20 20 2a 28 69 36 34 2a 29 }. *(i64*)
17ab0 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d pArg = pFile->mm
17ac0 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20 apSizeMax;.
17ad0 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 if( newLimit>=0
17ae0 20 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46 && newLimit!=pF
17af0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 ile->mmapSizeMax
17b00 20 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63 && pFile->nFetc
17b10 68 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 hOut==0 ){.
17b20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 pFile->mmapSi
17b30 7a 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74 zeMax = newLimit
17b40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 ;. if( pF
17b50 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 ile->mmapSize>0
17b60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 69 6e ){. win
17b70 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 Unmapfile(pFile)
17b80 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d ;. rc =
17b90 20 77 69 6e 4d 61 70 66 69 6c 65 28 70 46 69 6c winMapfile(pFil
17ba0 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 e, -1);.
17bb0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }. }.
17bc0 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 OSTRACE(("FCNTL
17bd0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e file=%p, rc=%s\n
17be0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c ", pFile->h, sql
17bf0 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 ite3ErrName(rc))
17c00 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 );. return
17c10 72 63 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 rc;. }.#endif
17c20 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 . }. OSTRACE((
17c30 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 "FCNTL file=%p,
17c40 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 rc=SQLITE_NOTFOU
17c50 4e 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 ND\n", pFile->h)
17c60 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 );. return SQLI
17c70 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a TE_NOTFOUND;.}..
17c80 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 /*.** Return the
17c90 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 sector size in
17ca0 62 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 bytes of the und
17cb0 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 erlying block de
17cc0 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 vice for.** the
17cd0 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 specified file.
17ce0 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 This is almost a
17cf0 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c lways 512 bytes,
17d00 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c but may be.** l
17d10 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 arger for some d
17d20 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 evices..**.** SQ
17d30 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 Lite code assume
17d40 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 s this function
17d50 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 cannot fail. It
17d60 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 also assumes tha
17d70 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 t.** if two file
17d80 73 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e s are created in
17d90 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 the same file-s
17da0 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 ystem directory
17db0 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 (i.e..** a datab
17dc0 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 ase and its jour
17dd0 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 nal file) that t
17de0 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 he sector size w
17df0 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 ill be the.** sa
17e00 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a me for both..*/.
17e10 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 static int winSe
17e20 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 ctorSize(sqlite3
17e30 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 28 76 _file *id){. (v
17e40 6f 69 64 29 69 64 3b 0a 20 20 72 65 74 75 72 6e oid)id;. return
17e50 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f SQLITE_DEFAULT_
17e60 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a SECTOR_SIZE;.}..
17e70 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 76 /*.** Return a v
17e80 65 63 74 6f 72 20 6f 66 20 64 65 76 69 63 65 20 ector of device
17e90 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2e characteristics.
17ea0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 .*/.static int w
17eb0 69 6e 44 65 76 69 63 65 43 68 61 72 61 63 74 65 inDeviceCharacte
17ec0 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f ristics(sqlite3_
17ed0 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 77 69 6e file *id){. win
17ee0 46 69 6c 65 20 2a 70 20 3d 20 28 77 69 6e 46 69 File *p = (winFi
17ef0 6c 65 2a 29 69 64 3b 0a 20 20 72 65 74 75 72 6e le*)id;. return
17f00 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e SQLITE_IOCAP_UN
17f10 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f DELETABLE_WHEN_O
17f20 50 45 4e 20 7c 0a 20 20 20 20 20 20 20 20 20 28 PEN |. (
17f30 28 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 (p->ctrlFlags &
17f40 57 49 4e 46 49 4c 45 5f 50 53 4f 57 29 3f 53 51 WINFILE_PSOW)?SQ
17f50 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 LITE_IOCAP_POWER
17f60 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 30 SAFE_OVERWRITE:0
17f70 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 57 69 6e );.}../* .** Win
17f80 64 6f 77 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 6c dows will only l
17f90 65 74 20 79 6f 75 20 63 72 65 61 74 65 20 66 69 et you create fi
17fa0 6c 65 20 76 69 65 77 20 6d 61 70 70 69 6e 67 73 le view mappings
17fb0 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74 69 6f .** on allocatio
17fc0 6e 20 73 69 7a 65 20 67 72 61 6e 75 6c 61 72 69 n size granulari
17fd0 74 79 20 62 6f 75 6e 64 61 72 69 65 73 2e 0a 2a ty boundaries..*
17fe0 2a 20 44 75 72 69 6e 67 20 73 71 6c 69 74 65 33 * During sqlite3
17ff0 5f 6f 73 5f 69 6e 69 74 28 29 20 77 65 20 64 6f _os_init() we do
18000 20 61 20 47 65 74 53 79 73 74 65 6d 49 6e 66 6f a GetSystemInfo
18010 28 29 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 ().** to get the
18020 20 67 72 61 6e 75 6c 61 72 69 74 79 20 73 69 7a granularity siz
18030 65 2e 0a 2a 2f 0a 53 59 53 54 45 4d 5f 49 4e 46 e..*/.SYSTEM_INF
18040 4f 20 77 69 6e 53 79 73 49 6e 66 6f 3b 0a 0a 23 O winSysInfo;..#
18050 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d ifndef SQLITE_OM
18060 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 48 65 IT_WAL../*.** He
18070 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 lper functions t
18080 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c o obtain and rel
18090 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62 inquish the glob
180a0 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a al mutex. The.**
180b0 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 global mutex is
180c0 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74 used to protect
180d0 20 74 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66 6f the winLockInfo
180e0 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 objects used by
180f0 20 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65 2c 20 .** this file,
18100 61 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 all of which may
18110 20 62 65 20 73 68 61 72 65 64 20 62 79 20 6d 75 be shared by mu
18120 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a ltiple threads..
18130 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 77 **.** Function w
18140 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 inShmMutexHeld()
18150 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65 is used to asse
18160 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c rt() that the gl
18170 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 obal mutex .** i
18180 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75 s held when requ
18190 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 ired. This funct
181a0 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 ion is only used
181b0 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 as part of asse
181c0 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 rt() .** stateme
181d0 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 nts. e.g..**.**
181e0 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 winShmEnterMut
181f0 65 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 ex().** asse
18200 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 rt( winShmMutexH
18210 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20 77 69 eld() );.** wi
18220 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 nShmLeaveMutex()
18230 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 .*/.static void
18240 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 winShmEnterMutex
18250 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 (void){. sqlite
18260 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 3_mutex_enter(sq
18270 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 lite3MutexAlloc(
18280 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 SQLITE_MUTEX_STA
18290 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a TIC_MASTER));.}.
182a0 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 static void winS
182b0 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69 hmLeaveMutex(voi
182c0 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 d){. sqlite3_mu
182d0 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 tex_leave(sqlite
182e0 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 3MutexAlloc(SQLI
182f0 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f TE_MUTEX_STATIC_
18300 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64 MASTER));.}.#ifd
18310 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a ef SQLITE_DEBUG.
18320 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 static int winSh
18330 6d 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29 mMutexHeld(void)
18340 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 {. return sqli
18350 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 te3_mutex_held(s
18360 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 qlite3MutexAlloc
18370 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 (SQLITE_MUTEX_ST
18380 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d ATIC_MASTER));.}
18390 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f .#endif../*.** O
183a0 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 bject used to re
183b0 70 72 65 73 65 6e 74 20 61 20 73 69 6e 67 6c 65 present a single
183c0 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64 file opened and
183d0 20 6d 6d 61 70 70 65 64 20 74 6f 20 70 72 6f 76 mmapped to prov
183e0 69 64 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65 ide.** shared me
183f0 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74 mory. When mult
18400 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c iple threads all
18410 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 reference the s
18420 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 ame.** log-summa
18430 72 79 2c 20 65 61 63 68 20 74 68 72 65 61 64 20 ry, each thread
18440 68 61 73 20 69 74 73 20 6f 77 6e 20 77 69 6e 46 has its own winF
18450 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 ile object, but
18460 74 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e they all.** poin
18470 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e t to a single in
18480 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f stance of this o
18490 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 bject. In other
184a0 20 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a 20 words, each.**
184b0 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f log-summary is o
184c0 70 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 pened only once
184d0 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a per process..**.
184e0 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 ** winShmMutexHe
184f0 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 ld() must be tru
18500 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 e when creating
18510 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a or destroying.**
18520 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 this object or
18530 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 while reading or
18540 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c writing the fol
18550 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a lowing fields:.*
18560 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a *.** nRef.*
18570 2a 20 20 20 20 20 20 70 4e 65 78 74 20 0a 2a 2a * pNext .**
18580 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e .** The followin
18590 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 g fields are rea
185a0 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 d-only after the
185b0 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 object is creat
185c0 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 ed:.** .**
185d0 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c fid.** zFil
185e0 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 ename.**.** Eith
185f0 65 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75 er winShmNode.mu
18600 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 tex must be held
18610 20 6f 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e or winShmNode.n
18620 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77 69 Ref==0 and.** wi
18630 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 nShmMutexHeld()
18640 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65 61 is true when rea
18650 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 ding or writing
18660 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a any other field.
18670 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 ** in this struc
18680 74 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75 ture..**.*/.stru
18690 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a ct winShmNode {.
186a0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 sqlite3_mutex
186b0 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 *mutex; /*
186c0 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 Mutex to access
186d0 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 this object */.
186e0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 char *zFilename
186f0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e ; /* N
18700 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 ame of the file
18710 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 68 46 69 */. winFile hFi
18720 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 le;
18730 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 /* File handle f
18740 72 6f 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a rom winOpen */..
18750 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 int szRegion;
18760 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
18770 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d Size of shared-m
18780 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f emory regions */
18790 0a 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20 . int nRegion;
187a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
187b0 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 Size of array a
187c0 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 pRegion */. str
187d0 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b 0a uct ShmRegion {.
187e0 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b HANDLE hMap;
187f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
18800 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d File handle from
18810 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 CreateFileMappi
18820 6e 67 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a ng */. void *
18830 70 4d 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67 69 pMap;. } *aRegi
18840 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 on;. DWORD last
18850 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 Errno;
18860 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 /* The Windows
18870 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c errno from the l
18880 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f ast I/O error */
18890 0a 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 .. int nRef;
188a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
188b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e 53 * Number of winS
188c0 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 hm objects point
188d0 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 ing to this */.
188e0 20 77 69 6e 53 68 6d 20 2a 70 46 69 72 73 74 3b winShm *pFirst;
188f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 /* A
18900 6c 6c 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 ll winShm object
18910 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 s pointing to th
18920 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f is */. winShmNo
18930 64 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 de *pNext;
18940 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 /* Next in li
18950 73 74 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d st of all winShm
18960 4e 6f 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a Node objects */.
18970 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 #ifdef SQLITE_DE
18980 42 55 47 0a 20 20 75 38 20 6e 65 78 74 53 68 6d BUG. u8 nextShm
18990 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 Id;
189a0 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 /* Next availab
189b0 6c 65 20 77 69 6e 53 68 6d 2e 69 64 20 76 61 6c le winShm.id val
189c0 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a ue */.#endif.};.
189d0 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 ./*.** A global
189e0 61 72 72 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e array of all win
189f0 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e ShmNode objects.
18a00 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68 .**.** The winSh
18a10 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 mMutexHeld() mus
18a20 74 20 62 65 20 74 72 75 65 20 77 68 69 6c 65 20 t be true while
18a30 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 reading or writi
18a40 6e 67 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f ng this list..*/
18a50 0a 73 74 61 74 69 63 20 77 69 6e 53 68 6d 4e 6f .static winShmNo
18a60 64 65 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 de *winShmNodeLi
18a70 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 st = 0;../*.** S
18a80 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e tructure used in
18a90 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 ternally by this
18aa0 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 VFS to record t
18ab0 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a he state of an.*
18ac0 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 * open shared me
18ad0 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e mory connection.
18ae0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f .**.** The follo
18af0 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 wing fields are
18b00 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e initialized when
18b10 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 this object is
18b20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 created and.** a
18b30 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 re read-only the
18b40 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 reafter:.**.**
18b50 20 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 winShm.pShmNod
18b60 65 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 69 e.** winShm.i
18b70 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 d.**.** All othe
18b80 72 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 r fields are rea
18b90 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20 77 69 d/write. The wi
18ba0 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d nShm.pShmNode->m
18bb0 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c utex must be hel
18bc0 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73 d.** while acces
18bd0 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72 sing any read/wr
18be0 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 ite fields..*/.s
18bf0 74 72 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a 20 truct winShm {.
18c00 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 winShmNode *pSh
18c10 6d 4e 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20 54 mNode; /* T
18c20 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 77 69 he underlying wi
18c30 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 nShmNode object
18c40 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e 65 */. winShm *pNe
18c50 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 xt;
18c60 2f 2a 20 4e 65 78 74 20 77 69 6e 53 68 6d 20 77 /* Next winShm w
18c70 69 74 68 20 74 68 65 20 73 61 6d 65 20 77 69 6e ith the same win
18c80 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 ShmNode */. u8
18c90 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20 hasMutex;
18ca0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 /* True
18cb0 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 77 if holding the w
18cc0 69 6e 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 inShmNode mutex
18cd0 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d */. u16 sharedM
18ce0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 ask;
18cf0 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 /* Mask of share
18d00 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a d locks held */.
18d10 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 u16 exclMask;
18d20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
18d30 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 Mask of exclusiv
18d40 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a e locks held */.
18d50 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 #ifdef SQLITE_DE
18d60 42 55 47 0a 20 20 75 38 20 69 64 3b 20 20 20 20 BUG. u8 id;
18d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
18d80 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63 /* Id of this c
18d90 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 69 onnection with i
18da0 74 73 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f ts winShmNode */
18db0 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a .#endif.};../*.*
18dc0 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 * Constants used
18dd0 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a for locking.*/.
18de0 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f #define WIN_SHM_
18df0 42 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49 BASE ((22+SQLI
18e00 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 TE_SHM_NLOCK)*4)
18e10 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 /* first
18e20 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 lock byte */.#d
18e30 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 44 4d efine WIN_SHM_DM
18e40 53 20 20 20 20 28 57 49 4e 5f 53 48 4d 5f 42 41 S (WIN_SHM_BA
18e50 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c SE+SQLITE_SHM_NL
18e60 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e OCK) /* deadman
18e70 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a switch */../*.*
18e80 2a 20 41 70 70 6c 79 20 61 64 76 69 73 6f 72 79 * Apply advisory
18e90 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 6e locks for all n
18ea0 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 bytes beginning
18eb0 20 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64 65 at ofst..*/.#de
18ec0 66 69 6e 65 20 5f 53 48 4d 5f 55 4e 4c 43 4b 20 fine _SHM_UNLCK
18ed0 20 31 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 1.#define _SHM_
18ee0 52 44 4c 43 4b 20 20 32 0a 23 64 65 66 69 6e 65 RDLCK 2.#define
18ef0 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 20 33 0a 73 _SHM_WRLCK 3.s
18f00 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d tatic int winShm
18f10 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 77 69 SystemLock(. wi
18f20 6e 53 68 6d 4e 6f 64 65 20 2a 70 46 69 6c 65 2c nShmNode *pFile,
18f30 20 20 20 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 /* Apply loc
18f40 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 ks to this open
18f50 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 shared-memory se
18f60 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c gment */. int l
18f70 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20 ockType,
18f80 20 2f 2a 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 /* _SHM_UNLCK,
18f90 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20 5f _SHM_RDLCK, or _
18fa0 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 SHM_WRLCK */. i
18fb0 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 nt ofst,
18fc0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 /* Offset t
18fd0 6f 20 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 o first byte to
18fe0 62 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63 6b be locked/unlock
18ff0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 ed */. int nByt
19000 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a e /*
19010 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 Number of bytes
19020 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f to lock or unlo
19030 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 ck */.){. int r
19040 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 c = 0;
19050 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 /* Result code
19060 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b form Lock/Unlock
19070 46 69 6c 65 45 78 28 29 20 2a 2f 0a 0a 20 20 2f FileEx() */.. /
19080 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 * Access to the
19090 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 winShmNode objec
190a0 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 t is serialized
190b0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f by the caller */
190c0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 . assert( sqlit
190d0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 46 e3_mutex_held(pF
190e0 69 6c 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 ile->mutex) || p
190f0 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b File->nRef==0 );
19100 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 .. OSTRACE(("SH
19110 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 M-LOCK file=%p,
19120 6c 6f 63 6b 3d 25 64 2c 20 6f 66 66 73 65 74 3d lock=%d, offset=
19130 25 64 2c 20 73 69 7a 65 3d 25 64 5c 6e 22 2c 0a %d, size=%d\n",.
19140 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 pFile
19150 2d 3e 68 46 69 6c 65 2e 68 2c 20 6c 6f 63 6b 54 ->hFile.h, lockT
19160 79 70 65 2c 20 6f 66 73 74 2c 20 6e 42 79 74 65 ype, ofst, nByte
19170 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 ));.. /* Releas
19180 65 2f 41 63 71 75 69 72 65 20 74 68 65 20 73 79 e/Acquire the sy
19190 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20 stem-level lock
191a0 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 */. if( lockTyp
191b0 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20 29 7b e==_SHM_UNLCK ){
191c0 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 55 6e 6c . rc = winUnl
191d0 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e ockFile(&pFile->
191e0 68 46 69 6c 65 2e 68 2c 20 6f 66 73 74 2c 20 30 hFile.h, ofst, 0
191f0 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d , nByte, 0);. }
19200 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 else{. /* Ini
19210 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b tialize the lock
19220 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a ing parameters *
19230 2f 0a 20 20 20 20 44 57 4f 52 44 20 64 77 46 6c /. DWORD dwFl
19240 61 67 73 20 3d 20 4c 4f 43 4b 46 49 4c 45 5f 46 ags = LOCKFILE_F
19250 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 3b AIL_IMMEDIATELY;
19260 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 . if( lockTyp
19270 65 20 3d 3d 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 e == _SHM_WRLCK
19280 29 20 64 77 46 6c 61 67 73 20 7c 3d 20 4c 4f 43 ) dwFlags |= LOC
19290 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f KFILE_EXCLUSIVE_
192a0 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 77 LOCK;. rc = w
192b0 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c inLockFile(&pFil
192c0 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 64 77 46 6c e->hFile.h, dwFl
192d0 61 67 73 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42 ags, ofst, 0, nB
192e0 79 74 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 0a yte, 0);. }. .
192f0 20 20 69 66 28 20 72 63 21 3d 20 30 20 29 7b 0a if( rc!= 0 ){.
19300 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f rc = SQLITE_
19310 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 OK;. }else{.
19320 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e pFile->lastErrn
19330 6f 20 3d 20 20 6f 73 47 65 74 4c 61 73 74 45 72 o = osGetLastEr
19340 72 6f 72 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 ror();. rc =
19350 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d SQLITE_BUSY;. }
19360 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 .. OSTRACE(("SH
19370 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 M-LOCK file=%p,
19380 66 75 6e 63 3d 25 73 2c 20 65 72 72 6e 6f 3d 25 func=%s, errno=%
19390 6c 75 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 lu, rc=%s\n",.
193a0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e pFile->
193b0 68 46 69 6c 65 2e 68 2c 20 28 6c 6f 63 6b 54 79 hFile.h, (lockTy
193c0 70 65 20 3d 3d 20 5f 53 48 4d 5f 55 4e 4c 43 4b pe == _SHM_UNLCK
193d0 29 20 3f 20 22 77 69 6e 55 6e 6c 6f 63 6b 46 69 ) ? "winUnlockFi
193e0 6c 65 22 20 3a 0a 20 20 20 20 20 20 20 20 20 20 le" :.
193f0 20 22 77 69 6e 4c 6f 63 6b 46 69 6c 65 22 2c 20 "winLockFile",
19400 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f pFile->lastErrno
19410 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 , sqlite3ErrName
19420 28 72 63 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 (rc)));.. retur
19430 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 n rc;.}../* Forw
19440 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 ard references t
19450 6f 20 56 46 53 20 6d 65 74 68 6f 64 73 20 2a 2f o VFS methods */
19460 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f .static int winO
19470 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 2a pen(sqlite3_vfs*
19480 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c ,const char*,sql
19490 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69 ite3_file*,int,i
194a0 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 nt*);.static int
194b0 20 77 69 6e 44 65 6c 65 74 65 28 73 71 6c 69 74 winDelete(sqlit
194c0 65 33 5f 76 66 73 20 2a 2c 63 6f 6e 73 74 20 63 e3_vfs *,const c
194d0 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a har*,int);../*.*
194e0 2a 20 50 75 72 67 65 20 74 68 65 20 77 69 6e 53 * Purge the winS
194f0 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 hmNodeList list
19500 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 of all entries w
19510 69 74 68 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e ith winShmNode.n
19520 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 Ref==0..**.** Th
19530 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20 is is not a VFS
19540 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 shared-memory me
19550 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74 thod; it is a ut
19560 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 ility function c
19570 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 alled.** by VFS
19580 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 shared-memory me
19590 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 thods..*/.static
195a0 20 76 6f 69 64 20 77 69 6e 53 68 6d 50 75 72 67 void winShmPurg
195b0 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 e(sqlite3_vfs *p
195c0 56 66 73 2c 20 69 6e 74 20 64 65 6c 65 74 65 46 Vfs, int deleteF
195d0 6c 61 67 29 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f lag){. winShmNo
195e0 64 65 20 2a 2a 70 70 3b 0a 20 20 77 69 6e 53 68 de **pp;. winSh
195f0 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20 61 73 73 65 mNode *p;. asse
19600 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 rt( winShmMutexH
19610 65 6c 64 28 29 20 29 3b 0a 20 20 4f 53 54 52 41 eld() );. OSTRA
19620 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45 20 70 CE(("SHM-PURGE p
19630 69 64 3d 25 6c 75 2c 20 64 65 6c 65 74 65 46 6c id=%lu, deleteFl
19640 61 67 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 ag=%d\n",.
19650 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e osGetCurren
19660 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 64 65 tProcessId(), de
19670 6c 65 74 65 46 6c 61 67 29 29 3b 0a 20 20 70 70 leteFlag));. pp
19680 20 3d 20 26 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 = &winShmNodeLi
19690 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 20 st;. while( (p
196a0 3d 20 2a 70 70 29 21 3d 30 20 29 7b 0a 20 20 20 = *pp)!=0 ){.
196b0 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 if( p->nRef==0
196c0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a ){. int i;.
196d0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 75 74 if( p->mut
196e0 65 78 20 29 7b 20 73 71 6c 69 74 65 33 5f 6d 75 ex ){ sqlite3_mu
196f0 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 tex_free(p->mute
19700 78 29 3b 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 x); }. for(
19710 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f i=0; i<p->nRegio
19720 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 n; i++){.
19730 20 42 4f 4f 4c 20 62 52 63 20 3d 20 6f 73 55 6e BOOL bRc = osUn
19740 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 2d mapViewOfFile(p-
19750 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 70 4d 61 70 >aRegion[i].pMap
19760 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 );. OSTRA
19770 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45 2d 55 CE(("SHM-PURGE-U
19780 4e 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 72 65 NMAP pid=%lu, re
19790 67 69 6f 6e 3d 25 64 2c 20 72 63 3d 25 73 5c 6e gion=%d, rc=%s\n
197a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ",.
197b0 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 osGetCurrent
197c0 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 20 ProcessId(), i,
197d0 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 bRc ? "ok" : "fa
197e0 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 iled"));.
197f0 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42 4c 45 UNUSED_VARIABLE
19800 5f 56 41 4c 55 45 28 62 52 63 29 3b 0a 20 20 20 _VALUE(bRc);.
19810 20 20 20 20 20 62 52 63 20 3d 20 6f 73 43 6c 6f bRc = osClo
19820 73 65 48 61 6e 64 6c 65 28 70 2d 3e 61 52 65 67 seHandle(p->aReg
19830 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20 20 ion[i].hMap);.
19840 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 OSTRACE(("
19850 53 48 4d 2d 50 55 52 47 45 2d 43 4c 4f 53 45 20 SHM-PURGE-CLOSE
19860 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d pid=%lu, region=
19870 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 %d, rc=%s\n",.
19880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f o
19890 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 sGetCurrentProce
198a0 73 73 49 64 28 29 2c 20 69 2c 20 62 52 63 20 3f ssId(), i, bRc ?
198b0 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 "ok" : "failed"
198c0 29 29 3b 0a 20 20 20 20 20 20 20 20 55 4e 55 53 ));. UNUS
198d0 45 44 5f 56 41 52 49 41 42 4c 45 5f 56 41 4c 55 ED_VARIABLE_VALU
198e0 45 28 62 52 63 29 3b 0a 20 20 20 20 20 20 7d 0a E(bRc);. }.
198f0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68 46 69 if( p->hFi
19900 6c 65 2e 68 21 3d 4e 55 4c 4c 20 26 26 20 70 2d le.h!=NULL && p-
19910 3e 68 46 69 6c 65 2e 68 21 3d 49 4e 56 41 4c 49 >hFile.h!=INVALI
19920 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 D_HANDLE_VALUE )
19930 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 {. Simula
19940 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 teIOErrorBenign(
19950 31 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 43 1);. winC
19960 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 lose((sqlite3_fi
19970 6c 65 20 2a 29 26 70 2d 3e 68 46 69 6c 65 29 3b le *)&p->hFile);
19980 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 . Simulat
19990 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 eIOErrorBenign(0
199a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 );. }.
199b0 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20 if( deleteFlag
199c0 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c ){. Simul
199d0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e ateIOErrorBenign
199e0 28 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c (1);. sql
199f0 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d ite3BeginBenignM
19a00 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 alloc();.
19a10 20 77 69 6e 44 65 6c 65 74 65 28 70 56 66 73 2c winDelete(pVfs,
19a20 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 p->zFilename, 0
19a30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 );. sqlit
19a40 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f e3EndBenignMallo
19a50 63 28 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d c();. Sim
19a60 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 ulateIOErrorBeni
19a70 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 gn(0);. }.
19a80 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e *pp = p->pN
19a90 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 ext;. sqlit
19aa0 65 33 5f 66 72 65 65 28 70 2d 3e 61 52 65 67 69 e3_free(p->aRegi
19ab0 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 on);. sqlit
19ac0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 e3_free(p);.
19ad0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 20 }else{. pp
19ae0 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 = &p->pNext;.
19af0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 }. }.}../*.**
19b00 4f 70 65 6e 20 74 68 65 20 73 68 61 72 65 64 2d Open the shared-
19b10 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73 6f memory area asso
19b20 63 69 61 74 65 64 20 77 69 74 68 20 64 61 74 61 ciated with data
19b30 62 61 73 65 20 66 69 6c 65 20 70 44 62 46 64 2e base file pDbFd.
19b40 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e .**.** When open
19b50 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65 64 ing a new shared
19b60 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 -memory file, if
19b70 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e no other instan
19b80 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 ces of that.** f
19b90 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c ile are currentl
19ba0 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 y open, in this
19bb0 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 process or in ot
19bc0 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74 her processes, t
19bd0 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 hen.** the file
19be0 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61 74 65 must be truncate
19bf0 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 d to zero length
19c00 20 6f 72 20 68 61 76 65 20 69 74 73 20 68 65 61 or have its hea
19c10 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a der cleared..*/.
19c20 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 static int winOp
19c30 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 77 enSharedMemory(w
19c40 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a inFile *pDbFd){.
19c50 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20 struct winShm
19c60 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 *p;
19c70 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e /* The conn
19c80 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 ection to be ope
19c90 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 ned */. struct
19ca0 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d winShmNode *pShm
19cb0 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f 2a 20 54 Node = 0; /* T
19cc0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d he underlying mm
19cd0 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 apped file */.
19ce0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 int rc;
19cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
19d00 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 /* Result cod
19d10 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 77 69 e */. struct wi
19d20 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 77 3b 20 nShmNode *pNew;
19d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 /* New
19d40 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 77 69 6e ly allocated win
19d50 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 ShmNode */. int
19d60 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 nName;
19d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
19d80 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e 61 6d 65 /* Size of zName
19d90 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 in bytes */..
19da0 61 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70 assert( pDbFd->p
19db0 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 Shm==0 ); /*
19dc0 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20 6f Not previously o
19dd0 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 pened */.. /* A
19de0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f llocate space fo
19df0 72 20 74 68 65 20 6e 65 77 20 73 71 6c 69 74 65 r the new sqlite
19e00 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e 20 20 41 3_shm object. A
19e10 6c 73 6f 20 73 70 65 63 75 6c 61 74 69 76 65 6c lso speculativel
19e20 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 y. ** allocate
19e30 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20 space for a new
19e40 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e 64 20 66 winShmNode and f
19e50 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 ilename.. */.
19e60 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f p = sqlite3Mallo
19e70 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 cZero( sizeof(*p
19e80 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 ) );. if( p==0
19e90 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f ) return SQLITE_
19ea0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 6e IOERR_NOMEM;. n
19eb0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 Name = sqlite3St
19ec0 72 6c 65 6e 33 30 28 70 44 62 46 64 2d 3e 7a 50 rlen30(pDbFd->zP
19ed0 61 74 68 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 ath);. pNew = s
19ee0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f qlite3MallocZero
19ef0 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f ( sizeof(*pShmNo
19f00 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 37 de) + nName + 17
19f10 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d );. if( pNew==
19f20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 0 ){. sqlite3
19f30 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 72 65 _free(p);. re
19f40 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 turn SQLITE_IOER
19f50 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 R_NOMEM;. }. p
19f60 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d New->zFilename =
19f70 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d (char*)&pNew[1]
19f80 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 ;. sqlite3_snpr
19f90 69 6e 74 66 28 6e 4e 61 6d 65 2b 31 35 2c 20 70 intf(nName+15, p
19fa0 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 New->zFilename,
19fb0 22 25 73 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d "%s-shm", pDbFd-
19fc0 3e 7a 50 61 74 68 29 3b 0a 20 20 73 71 6c 69 74 >zPath);. sqlit
19fd0 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 44 e3FileSuffix3(pD
19fe0 62 46 64 2d 3e 7a 50 61 74 68 2c 20 70 4e 65 77 bFd->zPath, pNew
19ff0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 20 0a 0a ->zFilename); ..
1a000 20 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73 65 65 /* Look to see
1a010 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 if there is an
1a020 65 78 69 73 74 69 6e 67 20 77 69 6e 53 68 6d 4e existing winShmN
1a030 6f 64 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 ode that can be
1a040 75 73 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f used.. ** If no
1a050 20 6d 61 74 63 68 69 6e 67 20 77 69 6e 53 68 6d matching winShm
1a060 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c 79 20 65 Node currently e
1a070 78 69 73 74 73 2c 20 63 72 65 61 74 65 20 61 20 xists, create a
1a080 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 new one.. */.
1a090 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 winShmEnterMutex
1a0a0 28 29 3b 0a 20 20 66 6f 72 28 70 53 68 6d 4e 6f ();. for(pShmNo
1a0b0 64 65 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c de = winShmNodeL
1a0c0 69 73 74 3b 20 70 53 68 6d 4e 6f 64 65 3b 20 70 ist; pShmNode; p
1a0d0 53 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e 6f 64 65 ShmNode=pShmNode
1a0e0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a ->pNext){. /*
1a0f0 20 54 42 44 20 6e 65 65 64 20 74 6f 20 63 6f 6d TBD need to com
1a100 65 20 75 70 20 77 69 74 68 20 62 65 74 74 65 72 e up with better
1a110 20 6d 61 74 63 68 20 68 65 72 65 2e 20 20 50 65 match here. Pe
1a120 72 68 61 70 73 0a 20 20 20 20 2a 2a 20 75 73 65 rhaps. ** use
1a130 20 46 49 4c 45 5f 49 44 5f 42 4f 54 48 5f 44 49 FILE_ID_BOTH_DI
1a140 52 5f 49 4e 46 4f 20 53 74 72 75 63 74 75 72 65 R_INFO Structure
1a150 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 .. */. if(
1a160 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 sqlite3StrICmp(
1a170 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e pShmNode->zFilen
1a180 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 ame, pNew->zFile
1a190 6e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b name)==0 ) break
1a1a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d ;. }. if( pShm
1a1b0 4e 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 Node ){. sqli
1a1c0 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a te3_free(pNew);.
1a1d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 68 }else{. pSh
1a1e0 6d 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a 20 20 mNode = pNew;.
1a1f0 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 pNew = 0;.
1a200 28 28 77 69 6e 46 69 6c 65 2a 29 28 26 70 53 68 ((winFile*)(&pSh
1a210 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 29 29 2d 3e mNode->hFile))->
1a220 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 h = INVALID_HAND
1a230 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20 70 53 LE_VALUE;. pS
1a240 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 hmNode->pNext =
1a250 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a winShmNodeList;.
1a260 20 20 20 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 winShmNodeLi
1a270 73 74 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 0a st = pShmNode;..
1a280 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 pShmNode->mu
1a290 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 tex = sqlite3_mu
1a2a0 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 tex_alloc(SQLITE
1a2b0 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 _MUTEX_FAST);.
1a2c0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e if( pShmNode->
1a2d0 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 mutex==0 ){.
1a2e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f rc = SQLITE_IO
1a2f0 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 ERR_NOMEM;.
1a300 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 goto shm_open_e
1a310 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 rr;. }.. r
1a320 63 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44 62 46 c = winOpen(pDbF
1a330 64 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20 20 20 d->pVfs,.
1a340 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f pShmNo
1a350 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 de->zFilename,
1a360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 /* Na
1a370 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28 me of the file (
1a380 55 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20 20 20 UTF-8) */.
1a390 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 (sqli
1a3a0 74 65 33 5f 66 69 6c 65 2a 29 26 70 53 68 6d 4e te3_file*)&pShmN
1a3b0 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f 2a 20 ode->hFile, /*
1a3c0 46 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 File handle here
1a3d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 */.
1a3e0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e SQLITE_OPEN
1a3f0 5f 57 41 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50 _WAL | SQLITE_OP
1a400 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 EN_READWRITE | S
1a410 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 QLITE_OPEN_CREAT
1a420 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 E,.
1a430 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20 0);. if(
1a440 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b SQLITE_OK!=rc ){
1a450 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f . goto shm_
1a460 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a open_err;. }.
1a470 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f . /* Check to
1a480 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 see if another
1a490 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 process is holdi
1a4a0 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 ng the dead-man
1a4b0 73 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49 switch.. ** I
1a4c0 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 f not, truncate
1a4d0 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f the file to zero
1a4e0 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 2a 2f length. . */
1a4f0 0a 20 20 20 20 69 66 28 20 77 69 6e 53 68 6d 53 . if( winShmS
1a500 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f ystemLock(pShmNo
1a510 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 de, _SHM_WRLCK,
1a520 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d WIN_SHM_DMS, 1)=
1a530 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 =SQLITE_OK ){.
1a540 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e rc = winTrun
1a550 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 cate((sqlite3_fi
1a560 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e le *)&pShmNode->
1a570 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 hFile, 0);.
1a580 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f if( rc!=SQLITE_
1a590 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 OK ){. rc
1a5a0 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 = winLogError(S
1a5b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f QLITE_IOERR_SHMO
1a5c0 50 45 4e 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 PEN, osGetLastEr
1a5d0 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 ror(),.
1a5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a5f0 22 77 69 6e 4f 70 65 6e 53 68 6d 22 2c 20 70 44 "winOpenShm", pD
1a600 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 bFd->zPath);.
1a610 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 }. }. i
1a620 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b f( rc==SQLITE_OK
1a630 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 53 68 6d ){. winShm
1a640 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e SystemLock(pShmN
1a650 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c ode, _SHM_UNLCK,
1a660 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 WIN_SHM_DMS, 1)
1a670 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e ;. rc = win
1a680 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 ShmSystemLock(pS
1a690 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c hmNode, _SHM_RDL
1a6a0 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c CK, WIN_SHM_DMS,
1a6b0 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 1);. }. i
1a6c0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d f( rc ) goto shm
1a6d0 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a 0a _open_err;. }..
1a6e0 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 /* Make the ne
1a6f0 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 w connection a c
1a700 68 69 6c 64 20 6f 66 20 74 68 65 20 77 69 6e 53 hild of the winS
1a710 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 hmNode */. p->p
1a720 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f ShmNode = pShmNo
1a730 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 de;.#ifdef SQLIT
1a740 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 E_DEBUG. p->id
1a750 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 = pShmNode->next
1a760 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a ShmId++;.#endif.
1a770 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 pShmNode->nRef
1a780 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 ++;. pDbFd->pSh
1a790 6d 20 3d 20 70 3b 0a 20 20 77 69 6e 53 68 6d 4c m = p;. winShmL
1a7a0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 eaveMutex();..
1a7b0 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63 65 /* The reference
1a7c0 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f count on pShmNo
1a7d0 64 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 de has already b
1a7e0 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 een incremented
1a7f0 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 under. ** the c
1a800 6f 76 65 72 20 6f 66 20 74 68 65 20 77 69 6e 53 over of the winS
1a810 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 20 6d hmEnterMutex() m
1a820 75 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f 69 utex and the poi
1a830 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20 20 nter from the.
1a840 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20 77 ** new (struct w
1a850 69 6e 53 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f inShm) object to
1a860 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68 61 the pShmNode ha
1a870 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20 s been set. All
1a880 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66 that is. ** lef
1a890 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69 t to do is to li
1a8a0 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 nk the new objec
1a8b0 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 t into the linke
1a8c0 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 0a d list starting.
1a8d0 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65 ** at pShmNode
1a8e0 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20 6d ->pFirst. This m
1a8f0 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69 6c ust be done whil
1a900 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70 53 e holding the pS
1a910 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a 20 hmNode->mutex .
1a920 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a ** mutex.. */.
1a930 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f sqlite3_mutex_
1a940 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e enter(pShmNode->
1a950 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 mutex);. p->pNe
1a960 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 xt = pShmNode->p
1a970 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 First;. pShmNod
1a980 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 e->pFirst = p;.
1a990 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c sqlite3_mutex_l
1a9a0 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d eave(pShmNode->m
1a9b0 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 utex);. return
1a9c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a SQLITE_OK;.. /*
1a9d0 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e Jump here on an
1a9e0 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f y error */.shm_o
1a9f0 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69 6e 53 68 pen_err:. winSh
1aa00 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d mSystemLock(pShm
1aa10 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b Node, _SHM_UNLCK
1aa20 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 , WIN_SHM_DMS, 1
1aa30 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75 72 67 65 );. winShmPurge
1aa40 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 30 29 (pDbFd->pVfs, 0)
1aa50 3b 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 ; /* This c
1aa60 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e 6f all frees pShmNo
1aa70 64 65 20 69 66 20 72 65 71 75 69 72 65 64 20 2a de if required *
1aa80 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 /. sqlite3_free
1aa90 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 (p);. sqlite3_f
1aaa0 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 77 69 6e ree(pNew);. win
1aab0 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b ShmLeaveMutex();
1aac0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a . return rc;.}.
1aad0 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 ./*.** Close a c
1aae0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 onnection to sha
1aaf0 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c red-memory. Del
1ab00 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 ete the underlyi
1ab10 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 ng .** storage i
1ab20 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20 f deleteFlag is
1ab30 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 true..*/.static
1ab40 69 6e 74 20 77 69 6e 53 68 6d 55 6e 6d 61 70 28 int winShmUnmap(
1ab50 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 . sqlite3_file
1ab60 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a *fd, /*
1ab70 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e Database holdin
1ab80 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 g shared memory
1ab90 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46 */. int deleteF
1aba0 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20 lag
1abb0 2f 2a 20 44 65 6c 65 74 65 20 61 66 74 65 72 20 /* Delete after
1abc0 63 6c 6f 73 69 6e 67 20 69 66 20 74 72 75 65 20 closing if true
1abd0 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 */.){. winFile
1abe0 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20 2f 2a *pDbFd; /*
1abf0 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e Database holdin
1ac00 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 g shared-memory
1ac10 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 3b 20 */. winShm *p;
1ac20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 /* Th
1ac30 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 e connection to
1ac40 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 77 be closed */. w
1ac50 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e inShmNode *pShmN
1ac60 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e 64 65 ode; /* The unde
1ac70 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 rlying shared-me
1ac80 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 77 mory file */. w
1ac90 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20 inShm **pp;
1aca0 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 /* For loop
1acb0 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 ing over sibling
1acc0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a connections */.
1acd0 0a 20 20 70 44 62 46 64 20 3d 20 28 77 69 6e 46 . pDbFd = (winF
1ace0 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 ile*)fd;. p = p
1acf0 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 DbFd->pShm;. if
1ad00 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 ( p==0 ) return
1ad10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 SQLITE_OK;. pSh
1ad20 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e mNode = p->pShmN
1ad30 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 ode;.. /* Remov
1ad40 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 e connection p f
1ad50 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63 rom the set of c
1ad60 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 onnections assoc
1ad70 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 iated. ** with
1ad80 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 pShmNode */. sq
1ad90 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 lite3_mutex_ente
1ada0 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 r(pShmNode->mute
1adb0 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 x);. for(pp=&pS
1adc0 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 hmNode->pFirst;
1add0 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 (*pp)!=p; pp = &
1ade0 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a (*pp)->pNext){}.
1adf0 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 *pp = p->pNext
1ae00 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 ;.. /* Free the
1ae10 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f connection p */
1ae20 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 . sqlite3_free(
1ae30 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 p);. pDbFd->pSh
1ae40 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 m = 0;. sqlite3
1ae50 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 _mutex_leave(pSh
1ae60 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a mNode->mutex);..
1ae70 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 /* If pShmNode
1ae80 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63 68 ->nRef has reach
1ae90 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 ed 0, then close
1aea0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a the underlying.
1aeb0 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f ** shared-memo
1aec0 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a ry file, too */.
1aed0 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 winShmEnterMut
1aee0 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 ex();. assert(
1aef0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 pShmNode->nRef>0
1af00 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e );. pShmNode->
1af10 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 nRef--;. if( pS
1af20 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 hmNode->nRef==0
1af30 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d 50 75 72 ){. winShmPur
1af40 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 ge(pDbFd->pVfs,
1af50 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a 20 20 7d deleteFlag);. }
1af60 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 . winShmLeaveMu
1af70 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e tex();.. return
1af80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f SQLITE_OK;.}../
1af90 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 *.** Change the
1afa0 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61 lock state for a
1afb0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 shared-memory s
1afc0 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 egment..*/.stati
1afd0 63 20 69 6e 74 20 77 69 6e 53 68 6d 4c 6f 63 6b c int winShmLock
1afe0 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 (. sqlite3_file
1aff0 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f *fd, /
1b000 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 * Database file
1b010 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 holding the shar
1b020 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 ed memory */. i
1b030 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 nt ofst,
1b040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 /* Fir
1b050 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 st lock to acqui
1b060 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f re or release */
1b070 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 . int n,
1b080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1b090 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 Number of locks
1b0a0 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 to acquire or r
1b0b0 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 elease */. int
1b0c0 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 flags
1b0d0 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 /* What t
1b0e0 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f o do with the lo
1b0f0 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 ck */.){. winFi
1b100 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e le *pDbFd = (win
1b110 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 20 File*)fd;
1b120 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 /* Connection h
1b130 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 olding shared me
1b140 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d mory */. winShm
1b150 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 *p = pDbFd->pSh
1b160 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 m;
1b170 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 /* The shared me
1b180 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 mory being locke
1b190 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 d */. winShm *p
1b1a0 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 X;
1b1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1b1c0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 For looping over
1b1d0 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f all siblings */
1b1e0 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 . winShmNode *p
1b1f0 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 ShmNode = p->pSh
1b200 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 mNode;. int rc
1b210 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 = SQLITE_OK;
1b220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1b230 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f * Result code */
1b240 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20 . u16 mask;
1b250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1b260 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b /* Mask
1b270 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b of locks to tak
1b280 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a e or release */.
1b290 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e . assert( ofst>
1b2a0 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 =0 && ofst+n<=SQ
1b2b0 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 LITE_SHM_NLOCK )
1b2c0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 ;. assert( n>=1
1b2d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c );. assert( fl
1b2e0 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d ags==(SQLITE_SHM
1b2f0 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 _LOCK | SQLITE_S
1b300 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 HM_SHARED).
1b310 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c || flags==(SQL
1b320 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 ITE_SHM_LOCK | S
1b330 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 QLITE_SHM_EXCLUS
1b340 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 IVE). || f
1b350 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 lags==(SQLITE_SH
1b360 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 M_UNLOCK | SQLIT
1b370 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 E_SHM_SHARED).
1b380 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 || flags==(
1b390 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 SQLITE_SHM_UNLOC
1b3a0 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 K | SQLITE_SHM_E
1b3b0 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61 XCLUSIVE) );. a
1b3c0 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 ssert( n==1 || (
1b3d0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 flags & SQLITE_S
1b3e0 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30 HM_EXCLUSIVE)!=0
1b3f0 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 75 );.. mask = (u
1b400 31 36 29 28 28 31 55 3c 3c 28 6f 66 73 74 2b 6e 16)((1U<<(ofst+n
1b410 29 29 20 2d 20 28 31 55 3c 3c 6f 66 73 74 29 29 )) - (1U<<ofst))
1b420 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20 ;. assert( n>1
1b430 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 || mask==(1<<ofs
1b440 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f t) );. sqlite3_
1b450 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d mutex_enter(pShm
1b460 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 Node->mutex);.
1b470 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 if( flags & SQLI
1b480 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b TE_SHM_UNLOCK ){
1b490 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b . u16 allMask
1b4a0 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 = 0; /* Mask of
1b4b0 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73 locks held by s
1b4c0 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 iblings */..
1b4d0 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73 69 /* See if any si
1b4e0 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 blings hold this
1b4f0 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 same lock */.
1b500 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 for(pX=pShmNod
1b510 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 e->pFirst; pX; p
1b520 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 X=pX->pNext){.
1b530 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20 if( pX==p )
1b540 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 continue;.
1b550 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63 assert( (pX->exc
1b560 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c lMask & (p->excl
1b570 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 Mask|p->sharedMa
1b580 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 sk))==0 );.
1b590 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e allMask |= pX->
1b5a0 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 sharedMask;.
1b5b0 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b }.. /* Unlock
1b5c0 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 the system-leve
1b5d0 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 l locks */. i
1b5e0 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 f( (mask & allMa
1b5f0 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 sk)==0 ){.
1b600 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 rc = winShmSyste
1b610 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 mLock(pShmNode,
1b620 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 _SHM_UNLCK, ofst
1b630 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e +WIN_SHM_BASE, n
1b640 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 );. }else{.
1b650 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f rc = SQLITE_
1b660 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OK;. }.. /
1b670 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c * Undo the local
1b680 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 locks */. if
1b690 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc==SQLITE_OK
1b6a0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c ){. p->excl
1b6b0 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 Mask &= ~mask;.
1b6c0 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 p->sharedMa
1b6d0 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 sk &= ~mask;.
1b6e0 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 } . }else if(
1b6f0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 flags & SQLITE_S
1b700 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 HM_SHARED ){.
1b710 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d u16 allShared =
1b720 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 0; /* Union of
1b730 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 locks held by c
1b740 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 onnections other
1b750 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 than "p" */..
1b760 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 /* Find out wh
1b770 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 ich shared locks
1b780 20 61 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c are already hel
1b790 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e d by sibling con
1b7a0 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a nections.. **
1b7b0 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 If any sibling
1b7c0 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e already holds an
1b7d0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c exclusive lock,
1b7e0 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65 go ahead and re
1b7f0 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 turn. ** SQLI
1b800 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a TE_BUSY.. */.
1b810 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e for(pX=pShmN
1b820 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b ode->pFirst; pX;
1b830 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a pX=pX->pNext){.
1b840 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 if( (pX->e
1b850 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 xclMask & mask)!
1b860 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 =0 ){. rc
1b870 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a = SQLITE_BUSY;.
1b880 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 break;.
1b890 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c }. all
1b8a0 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 Shared |= pX->sh
1b8b0 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a aredMask;. }.
1b8c0 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72 . /* Get shar
1b8d0 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 ed locks at the
1b8e0 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 system level, if
1b8f0 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 necessary */.
1b900 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 if( rc==SQLITE
1b910 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 _OK ){. if(
1b920 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 (allShared & ma
1b930 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 sk)==0 ){.
1b940 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 rc = winShmSys
1b950 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 temLock(pShmNode
1b960 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 66 , _SHM_RDLCK, of
1b970 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c st+WIN_SHM_BASE,
1b980 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 n);. }else
1b990 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 {. rc = S
1b9a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 QLITE_OK;.
1b9b0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 }. }.. /*
1b9c0 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 Get the local sh
1b9d0 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 ared locks */.
1b9e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 if( rc==SQLITE
1b9f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e _OK ){. p->
1ba00 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 sharedMask |= ma
1ba10 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 sk;. }. }els
1ba20 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 e{. /* Make s
1ba30 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 ure no sibling c
1ba40 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 onnections hold
1ba50 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 locks that will
1ba60 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a block this. *
1ba70 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 * lock. If any
1ba80 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 do, return SQLIT
1ba90 45 5f 42 55 53 59 20 72 69 67 68 74 20 61 77 61 E_BUSY right awa
1baa0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f y.. */. fo
1bab0 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 r(pX=pShmNode->p
1bac0 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 First; pX; pX=pX
1bad0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 ->pNext){.
1bae0 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 if( (pX->exclMas
1baf0 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 k & mask)!=0 ||
1bb00 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 (pX->sharedMask
1bb10 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 & mask)!=0 ){.
1bb20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 rc = SQLIT
1bb30 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 E_BUSY;.
1bb40 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 break;. }.
1bb50 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 }. . /* G
1bb60 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 et the exclusive
1bb70 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 locks at the sy
1bb80 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 stem level. The
1bb90 6e 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a n if successful.
1bba0 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b ** also mark
1bbb0 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 the local conne
1bbc0 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c ction as being l
1bbd0 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 ocked.. */.
1bbe0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 if( rc==SQLITE
1bbf0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 _OK ){. rc
1bc00 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f = winShmSystemLo
1bc10 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 ck(pShmNode, _SH
1bc20 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 M_WRLCK, ofst+WI
1bc30 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a N_SHM_BASE, n);.
1bc40 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 if( rc==SQ
1bc50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 LITE_OK ){.
1bc60 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 assert( (p->s
1bc70 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b haredMask & mask
1bc80 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 )==0 );.
1bc90 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d p->exclMask |= m
1bca0 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 ask;. }.
1bcb0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 }. }. sqlite3
1bcc0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 _mutex_leave(pSh
1bcd0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 mNode->mutex);.
1bce0 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c OSTRACE(("SHM-L
1bcf0 4f 43 4b 20 70 69 64 3d 25 6c 75 2c 20 69 64 3d OCK pid=%lu, id=
1bd00 25 64 2c 20 73 68 61 72 65 64 4d 61 73 6b 3d 25 %d, sharedMask=%
1bd10 30 33 78 2c 20 65 78 63 6c 4d 61 73 6b 3d 25 30 03x, exclMask=%0
1bd20 33 78 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 3x, rc=%s\n",.
1bd30 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 osGetCu
1bd40 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 rrentProcessId()
1bd50 2c 20 70 2d 3e 69 64 2c 20 70 2d 3e 73 68 61 72 , p->id, p->shar
1bd60 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d edMask, p->exclM
1bd70 61 73 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 ask,.
1bd80 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 sqlite3ErrName(r
1bd90 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 c)));. return r
1bda0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c c;.}../*.** Impl
1bdb0 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 ement a memory b
1bdc0 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 arrier or memory
1bdd0 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 fence on shared
1bde0 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a memory. .**.**
1bdf0 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 All loads and s
1be00 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f tores begun befo
1be10 72 65 20 74 68 65 20 62 61 72 72 69 65 72 20 6d re the barrier m
1be20 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 ust complete bef
1be30 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 ore.** any load
1be40 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61 or store begun a
1be50 66 74 65 72 20 74 68 65 20 62 61 72 72 69 65 72 fter the barrier
1be60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 ..*/.static void
1be70 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 28 0a winShmBarrier(.
1be80 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a sqlite3_file *
1be90 66 64 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 fd /* D
1bea0 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 atabase holding
1beb0 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 the shared memor
1bec0 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 y */.){. UNUSED
1bed0 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a _PARAMETER(fd);.
1bee0 20 20 2f 2a 20 4d 65 6d 6f 72 79 42 61 72 72 69 /* MemoryBarri
1bef0 65 72 28 29 3b 20 2f 2f 20 64 6f 65 73 20 6e 6f er(); // does no
1bf00 74 20 77 6f 72 6b 20 2d 2d 20 64 6f 20 6e 6f 74 t work -- do not
1bf10 20 6b 6e 6f 77 20 77 68 79 20 6e 6f 74 20 2a 2f know why not */
1bf20 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 . winShmEnterMu
1bf30 74 65 78 28 29 3b 0a 20 20 77 69 6e 53 68 6d 4c tex();. winShmL
1bf40 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a eaveMutex();.}..
1bf50 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 /*.** This funct
1bf60 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f ion is called to
1bf70 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 obtain a pointe
1bf80 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 r to region iReg
1bf90 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 ion of the .** s
1bfa0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 hared-memory ass
1bfb0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 ociated with the
1bfc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 database file f
1bfd0 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 d. Shared-memory
1bfe0 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 regions .** are
1bff0 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 numbered starti
1c000 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 ng from zero. Ea
1c010 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 ch shared-memory
1c020 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 region is szReg
1c030 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e ion .** bytes in
1c040 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 size..**.** If
1c050 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c an error occurs,
1c060 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 an error code i
1c070 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a s returned and *
1c080 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c pp is set to NUL
1c090 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 L..**.** Otherwi
1c0a0 73 65 2c 20 69 66 20 74 68 65 20 69 73 57 72 69 se, if the isWri
1c0b0 74 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 te parameter is
1c0c0 30 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 0 and the reques
1c0d0 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 ted shared-memor
1c0e0 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 y.** region has
1c0f0 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 not been allocat
1c100 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e ed (by any clien
1c110 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 t, including one
1c120 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a running in a.**
1c130 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 separate proces
1c140 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20 s), then *pp is
1c150 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 set to NULL and
1c160 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e SQLITE_OK return
1c170 65 64 2e 20 49 66 20 0a 2a 2a 20 69 73 57 72 69 ed. If .** isWri
1c180 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 te is non-zero a
1c190 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64 nd the requested
1c1a0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 shared-memory r
1c1b0 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 egion has not ye
1c1c0 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 t .** been alloc
1c1d0 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f ated, it is allo
1c1e0 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75 cated by this fu
1c1f0 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 nction..**.** If
1c200 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f the shared-memo
1c210 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c ry region has al
1c220 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 ready been alloc
1c230 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 ated or is alloc
1c240 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 ated by.** this
1c250 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65 call as describe
1c260 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 d above, then it
1c270 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 is mapped into
1c280 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a this processes .
1c290 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61 63 65 ** address space
1c2a0 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 (if it is not a
1c2b0 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20 lready), *pp is
1c2c0 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 set to point to
1c2d0 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d the mapped .** m
1c2e0 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 emory and SQLITE
1c2f0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f _OK returned..*/
1c300 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 .static int winS
1c310 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 hmMap(. sqlite3
1c320 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 _file *fd,
1c330 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 /* Hand
1c340 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 le open on datab
1c350 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e ase file */. in
1c360 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 t iRegion,
1c370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1c380 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 Region to retri
1c390 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 eve */. int szR
1c3a0 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 egion,
1c3b0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 /* Size
1c3c0 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 of regions */.
1c3d0 20 69 6e 74 20 69 73 57 72 69 74 65 2c 20 20 20 int isWrite,
1c3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1c3f0 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65 /* True to exte
1c400 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73 nd file if neces
1c410 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 sary */. void v
1c420 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 olatile **pp
1c430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 /* OUT
1c440 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 : Mapped memory
1c450 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 */.){. winFile
1c460 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c *pDbFd = (winFil
1c470 65 2a 29 66 64 3b 0a 20 20 77 69 6e 53 68 6d 20 e*)fd;. winShm
1c480 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d *p = pDbFd->pShm
1c490 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a ;. winShmNode *
1c4a0 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 pShmNode;. int
1c4b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a rc = SQLITE_OK;.
1c4c0 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 . if( !p ){.
1c4d0 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 53 68 61 rc = winOpenSha
1c4e0 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 redMemory(pDbFd)
1c4f0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 ;. if( rc!=SQ
1c500 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e LITE_OK ) return
1c510 20 72 63 3b 0a 20 20 20 20 70 20 3d 20 70 44 62 rc;. p = pDb
1c520 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 7d 0a 20 20 Fd->pShm;. }.
1c530 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 pShmNode = p->pS
1c540 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73 71 6c 69 74 hmNode;.. sqlit
1c550 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 e3_mutex_enter(p
1c560 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b ShmNode->mutex);
1c570 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52 65 67 . assert( szReg
1c580 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 ion==pShmNode->s
1c590 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e zRegion || pShmN
1c5a0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 ode->nRegion==0
1c5b0 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f );.. if( pShmNo
1c5c0 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 de->nRegion<=iRe
1c5d0 67 69 6f 6e 20 29 7b 0a 20 20 20 20 73 74 72 75 gion ){. stru
1c5e0 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 61 70 ct ShmRegion *ap
1c5f0 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f New; /
1c600 2a 20 4e 65 77 20 61 52 65 67 69 6f 6e 5b 5d 20 * New aRegion[]
1c610 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 array */. int
1c620 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67 69 6f nByte = (iRegio
1c630 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 n+1)*szRegion;
1c640 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69 /* Minimum requi
1c650 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f red file size */
1c660 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 . sqlite3_int
1c670 36 34 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20 64 sz;
1c680 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 /* Curre
1c690 6e 74 20 73 69 7a 65 20 6f 66 20 77 61 6c 2d 69 nt size of wal-i
1c6a0 6e 64 65 78 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 ndex file */..
1c6b0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 pShmNode->szRe
1c6c0 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b gion = szRegion;
1c6d0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 .. /* The req
1c6e0 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20 69 73 uested region is
1c6f0 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e 74 6f not mapped into
1c700 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 this processes
1c710 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 0a 20 address space..
1c720 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 ** Check to s
1c730 65 65 20 69 66 20 69 74 20 68 61 73 20 62 65 65 ee if it has bee
1c740 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65 n allocated (i.e
1c750 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 . if the wal-ind
1c760 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a ex file is. *
1c770 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 * large enough t
1c780 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 o contain the re
1c790 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 29 2e quested region).
1c7a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d . */. rc =
1c7b0 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 28 73 71 winFileSize((sq
1c7c0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 lite3_file *)&pS
1c7d0 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 26 hmNode->hFile, &
1c7e0 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 sz);. if( rc!
1c7f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 =SQLITE_OK ){.
1c800 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 rc = winLogE
1c810 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 rror(SQLITE_IOER
1c820 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74 R_SHMSIZE, osGet
1c830 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 LastError(),.
1c840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1c850 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 31 22 "winShmMap1"
1c860 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b , pDbFd->zPath);
1c870 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 . goto shmp
1c880 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a age_out;. }..
1c890 20 20 20 20 69 66 28 20 73 7a 3c 6e 42 79 74 65 if( sz<nByte
1c8a0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 ){. /* The
1c8b0 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 requested memor
1c8c0 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f y region does no
1c8d0 74 20 65 78 69 73 74 2e 20 49 66 20 69 73 57 72 t exist. If isWr
1c8e0 69 74 65 20 69 73 20 73 65 74 20 74 6f 0a 20 20 ite is set to.
1c8f0 20 20 20 20 2a 2a 20 7a 65 72 6f 2c 20 65 78 69 ** zero, exi
1c900 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c t early. *pp wil
1c910 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c l be set to NULL
1c920 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 and SQLITE_OK r
1c930 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 2a eturned.. *
1c940 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c 74 65 72 *. ** Alter
1c950 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 69 73 57 natively, if isW
1c960 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f rite is non-zero
1c970 2c 20 75 73 65 20 66 74 72 75 6e 63 61 74 65 28 , use ftruncate(
1c980 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 ) to allocate.
1c990 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65 ** the reque
1c9a0 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 sted memory regi
1c9b0 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 on.. */.
1c9c0 20 20 20 69 66 28 20 21 69 73 57 72 69 74 65 20 if( !isWrite
1c9d0 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f ) goto shmpage_o
1c9e0 75 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 ut;. rc = w
1c9f0 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71 6c 69 inTruncate((sqli
1ca00 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d te3_file *)&pShm
1ca10 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 6e 42 79 Node->hFile, nBy
1ca20 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 te);. if( r
1ca30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a c!=SQLITE_OK ){.
1ca40 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e rc = win
1ca50 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f LogError(SQLITE_
1ca60 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f IOERR_SHMSIZE, o
1ca70 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c sGetLastError(),
1ca80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
1ca90 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 68 "winSh
1caa0 6d 4d 61 70 32 22 2c 20 70 44 62 46 64 2d 3e 7a mMap2", pDbFd->z
1cab0 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 67 Path);. g
1cac0 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b oto shmpage_out;
1cad0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a . }. }..
1cae0 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20 72 /* Map the r
1caf0 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 equested memory
1cb00 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73 region into this
1cb10 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 processes addre
1cb20 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 ss space. */.
1cb30 20 61 70 4e 65 77 20 3d 20 28 73 74 72 75 63 74 apNew = (struct
1cb40 20 53 68 6d 52 65 67 69 6f 6e 20 2a 29 73 71 6c ShmRegion *)sql
1cb50 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 ite3_realloc(.
1cb60 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e pShmNode->
1cb70 61 52 65 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f aRegion, (iRegio
1cb80 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 61 70 4e 65 n+1)*sizeof(apNe
1cb90 77 5b 30 5d 29 0a 20 20 20 20 29 3b 0a 20 20 20 w[0]). );.
1cba0 20 69 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 if( !apNew ){.
1cbb0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 rc = SQLITE
1cbc0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 _IOERR_NOMEM;.
1cbd0 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 goto shmpage
1cbe0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 _out;. }.
1cbf0 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f pShmNode->aRegio
1cc00 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a 20 20 20 20 n = apNew;..
1cc10 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d while( pShmNode-
1cc20 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f >nRegion<=iRegio
1cc30 6e 20 29 7b 0a 20 20 20 20 20 20 48 41 4e 44 4c n ){. HANDL
1cc40 45 20 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 20 20 E hMap = NULL;
1cc50 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 2d 6d /* file-m
1cc60 61 70 70 69 6e 67 20 68 61 6e 64 6c 65 20 2a 2f apping handle */
1cc70 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 61 . void *pMa
1cc80 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 p = 0;
1cc90 20 20 20 2f 2a 20 4d 61 70 70 65 64 20 6d 65 6d /* Mapped mem
1cca0 6f 72 79 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20 ory region */.
1ccb0 20 20 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f .#if SQLITE_O
1ccc0 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 68 4d S_WINRT. hM
1ccd0 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c ap = osCreateFil
1cce0 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 eMappingFromApp(
1ccf0 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e pShmNode->hFile.
1cd00 68 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c h,. NUL
1cd10 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 L, PAGE_READWRIT
1cd20 45 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 E, nByte, NULL.
1cd30 20 20 20 20 20 29 3b 0a 23 65 6c 69 66 20 64 65 );.#elif de
1cd40 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e fined(SQLITE_WIN
1cd50 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 20 32_HAS_WIDE).
1cd60 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 hMap = osCrea
1cd70 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 70 teFileMappingW(p
1cd80 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 ShmNode->hFile.h
1cd90 2c 20 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c , . NUL
1cda0 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 L, PAGE_READWRIT
1cdb0 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c E, 0, nByte, NUL
1cdc0 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 69 66 L. );.#elif
1cdd0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f defined(SQLITE_
1cde0 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a WIN32_HAS_ANSI).
1cdf0 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 hMap = osC
1ce00 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 reateFileMapping
1ce10 41 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c A(pShmNode->hFil
1ce20 65 2e 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 e.h, .
1ce30 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 NULL, PAGE_READW
1ce40 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20 RITE, 0, nByte,
1ce50 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 NULL. );.#e
1ce60 6e 64 69 66 0a 20 20 20 20 20 20 4f 53 54 52 41 ndif. OSTRA
1ce70 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d 43 52 45 CE(("SHM-MAP-CRE
1ce80 41 54 45 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 ATE pid=%lu, reg
1ce90 69 6f 6e 3d 25 64 2c 20 73 69 7a 65 3d 25 64 2c ion=%d, size=%d,
1cea0 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 rc=%s\n",.
1ceb0 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 osGetC
1cec0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 urrentProcessId(
1ced0 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 ), pShmNode->nRe
1cee0 67 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20 20 20 gion, nByte,.
1cef0 20 20 20 20 20 20 20 20 20 20 20 20 68 4d 61 70 hMap
1cf00 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 ? "ok" : "faile
1cf10 64 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 d"));. if(
1cf20 68 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 hMap ){.
1cf30 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20 70 53 int iOffset = pS
1cf40 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a hmNode->nRegion*
1cf50 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 20 20 szRegion;.
1cf60 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69 int iOffsetShi
1cf70 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77 ft = iOffset % w
1cf80 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f inSysInfo.dwAllo
1cf90 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 cationGranularit
1cfa0 79 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 y;.#if SQLITE_OS
1cfb0 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 20 20 70 _WINRT. p
1cfc0 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f Map = osMapViewO
1cfd0 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 68 4d 61 fFileFromApp(hMa
1cfe0 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 p, FILE_MAP_WRIT
1cff0 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 E | FILE_MAP_REA
1d000 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 D,. i
1d010 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73 65 74 Offset - iOffset
1d020 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20 Shift, szRegion
1d030 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74 0a 20 + iOffsetShift.
1d040 20 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a );.#else.
1d050 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d 20 6f pMap = o
1d060 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 68 sMapViewOfFile(h
1d070 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52 Map, FILE_MAP_WR
1d080 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 ITE | FILE_MAP_R
1d090 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 EAD,.
1d0a0 20 30 2c 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 0, iOffset - iO
1d0b0 66 66 73 65 74 53 68 69 66 74 2c 20 73 7a 52 65 ffsetShift, szRe
1d0c0 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 gion + iOffsetSh
1d0d0 69 66 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 ift. );.#
1d0e0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 4f 53 endif. OS
1d0f0 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d TRACE(("SHM-MAP-
1d100 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 MAP pid=%lu, reg
1d110 69 6f 6e 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25 ion=%d, offset=%
1d120 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72 63 3d 25 d, size=%d, rc=%
1d130 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 s\n",.
1d140 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 osGetCurr
1d150 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 entProcessId(),
1d160 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f pShmNode->nRegio
1d170 6e 2c 20 69 4f 66 66 73 65 74 2c 0a 20 20 20 20 n, iOffset,.
1d180 20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 52 szR
1d190 65 67 69 6f 6e 2c 20 70 4d 61 70 20 3f 20 22 6f egion, pMap ? "o
1d1a0 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b k" : "failed"));
1d1b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 . }. i
1d1c0 66 28 20 21 70 4d 61 70 20 29 7b 0a 20 20 20 20 f( !pMap ){.
1d1d0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 pShmNode->la
1d1e0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c stErrno = osGetL
1d1f0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 astError();.
1d200 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 rc = winLogE
1d210 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 rror(SQLITE_IOER
1d220 52 5f 53 48 4d 4d 41 50 2c 20 70 53 68 6d 4e 6f R_SHMMAP, pShmNo
1d230 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 de->lastErrno,.
1d240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1d250 20 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d "winShmM
1d260 61 70 33 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 ap3", pDbFd->zPa
1d270 74 68 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 th);. if(
1d280 20 68 4d 61 70 20 29 20 6f 73 43 6c 6f 73 65 48 hMap ) osCloseH
1d290 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a 20 20 20 andle(hMap);.
1d2a0 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 goto shmpag
1d2b0 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a e_out;. }..
1d2c0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e pShmNode->
1d2d0 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 aRegion[pShmNode
1d2e0 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 20 ->nRegion].pMap
1d2f0 3d 20 70 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 = pMap;. pS
1d300 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b hmNode->aRegion[
1d310 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f pShmNode->nRegio
1d320 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d 61 70 3b 0a n].hMap = hMap;.
1d330 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e pShmNode->
1d340 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d nRegion++;. }
1d350 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 . }..shmpage_ou
1d360 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 t:. if( pShmNod
1d370 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 e->nRegion>iRegi
1d380 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f on ){. int iO
1d390 66 66 73 65 74 20 3d 20 69 52 65 67 69 6f 6e 2a ffset = iRegion*
1d3a0 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 69 6e szRegion;. in
1d3b0 74 20 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d t iOffsetShift =
1d3c0 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79 iOffset % winSy
1d3d0 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 sInfo.dwAllocati
1d3e0 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 20 onGranularity;.
1d3f0 20 20 20 63 68 61 72 20 2a 70 20 3d 20 28 63 68 char *p = (ch
1d400 61 72 20 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e 61 ar *)pShmNode->a
1d410 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 2e Region[iRegion].
1d420 70 4d 61 70 3b 0a 20 20 20 20 2a 70 70 20 3d 20 pMap;. *pp =
1d430 28 76 6f 69 64 20 2a 29 26 70 5b 69 4f 66 66 73 (void *)&p[iOffs
1d440 65 74 53 68 69 66 74 5d 3b 0a 20 20 7d 65 6c 73 etShift];. }els
1d450 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a e{. *pp = 0;.
1d460 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 }. sqlite3_mu
1d470 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f tex_leave(pShmNo
1d480 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 de->mutex);. re
1d490 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 turn rc;.}..#els
1d4a0 65 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 e.# define winSh
1d4b0 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65 66 mMap 0.# def
1d4c0 69 6e 65 20 77 69 6e 53 68 6d 4c 6f 63 6b 20 20 ine winShmLock
1d4d0 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 0.# define win
1d4e0 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64 ShmBarrier 0.# d
1d4f0 65 66 69 6e 65 20 77 69 6e 53 68 6d 55 6e 6d 61 efine winShmUnma
1d500 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 p 0.#endif /*
1d510 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f #ifndef SQLITE_O
1d520 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a MIT_WAL */../*.*
1d530 2a 20 43 6c 65 61 6e 73 20 75 70 20 74 68 65 20 * Cleans up the
1d540 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20 6f 66 mapped region of
1d550 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 the specified f
1d560 69 6c 65 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a ile, if any..*/.
1d570 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d #if SQLITE_MAX_M
1d580 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 MAP_SIZE>0.stati
1d590 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66 69 c int winUnmapfi
1d5a0 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c le(winFile *pFil
1d5b0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46 e){. assert( pF
1d5c0 69 6c 65 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 ile!=0 );. OSTR
1d5d0 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 ACE(("UNMAP-FILE
1d5e0 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d pid=%lu, pFile=
1d5f0 25 70 2c 20 68 4d 61 70 3d 25 70 2c 20 70 4d 61 %p, hMap=%p, pMa
1d600 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 pRegion=%p, ".
1d610 20 20 20 20 20 20 20 20 20 22 6d 6d 61 70 53 69 "mmapSi
1d620 7a 65 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a ze=%lld, mmapSiz
1d630 65 41 63 74 75 61 6c 3d 25 6c 6c 64 2c 20 6d 6d eActual=%lld, mm
1d640 61 70 53 69 7a 65 4d 61 78 3d 25 6c 6c 64 5c 6e apSizeMax=%lld\n
1d650 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 ",. os
1d660 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 GetCurrentProces
1d670 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 sId(), pFile, pF
1d680 69 6c 65 2d 3e 68 4d 61 70 2c 20 70 46 69 6c 65 ile->hMap, pFile
1d690 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 0a 20 20 ->pMapRegion,.
1d6a0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e pFile->
1d6b0 6d 6d 61 70 53 69 7a 65 2c 20 70 46 69 6c 65 2d mmapSize, pFile-
1d6c0 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 2c >mmapSizeActual,
1d6d0 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 pFile->mmapSize
1d6e0 4d 61 78 29 29 3b 0a 20 20 69 66 28 20 70 46 69 Max));. if( pFi
1d6f0 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29 le->pMapRegion )
1d700 7b 0a 20 20 20 20 69 66 28 20 21 6f 73 55 6e 6d {. if( !osUnm
1d710 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 apViewOfFile(pFi
1d720 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 20 le->pMapRegion)
1d730 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e ){. pFile->
1d740 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 lastErrno = osGe
1d750 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 tLastError();.
1d760 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e OSTRACE(("UN
1d770 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 MAP-FILE pid=%lu
1d780 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 4d 61 70 , pFile=%p, pMap
1d790 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 Region=%p, ".
1d7a0 20 20 20 20 20 20 20 20 20 20 20 20 22 72 63 3d "rc=
1d7b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 SQLITE_IOERR_MMA
1d7c0 50 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72 72 65 P\n", osGetCurre
1d7d0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 ntProcessId(), p
1d7e0 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 File,.
1d7f0 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 pFile->pMap
1d800 52 65 67 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20 Region));.
1d810 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 return winLogErr
1d820 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f or(SQLITE_IOERR_
1d830 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 MMAP, pFile->las
1d840 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 tErrno,.
1d850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1d860 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65 31 22 "winUnmapfile1"
1d870 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b , pFile->zPath);
1d880 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 . }. pFile
1d890 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 ->pMapRegion = 0
1d8a0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 ;. pFile->mma
1d8b0 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 pSize = 0;. p
1d8c0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 File->mmapSizeAc
1d8d0 74 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 tual = 0;. }.
1d8e0 69 66 28 20 70 46 69 6c 65 2d 3e 68 4d 61 70 21 if( pFile->hMap!
1d8f0 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 =NULL ){. if(
1d900 20 21 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 !osCloseHandle(
1d910 70 46 69 6c 65 2d 3e 68 4d 61 70 29 20 29 7b 0a pFile->hMap) ){.
1d920 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 pFile->las
1d930 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 tErrno = osGetLa
1d940 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 stError();.
1d950 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50 OSTRACE(("UNMAP
1d960 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 -FILE pid=%lu, p
1d970 46 69 6c 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70 File=%p, hMap=%p
1d980 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 , rc=SQLITE_IOER
1d990 52 5f 4d 4d 41 50 5c 6e 22 2c 0a 20 20 20 20 20 R_MMAP\n",.
1d9a0 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 osGetC
1d9b0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 urrentProcessId(
1d9c0 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d ), pFile, pFile-
1d9d0 3e 68 4d 61 70 29 29 3b 0a 20 20 20 20 20 20 72 >hMap));. r
1d9e0 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f eturn winLogErro
1d9f0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d r(SQLITE_IOERR_M
1da00 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 MAP, pFile->last
1da10 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 Errno,.
1da20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1da30 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65 32 22 2c "winUnmapfile2",
1da40 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a pFile->zPath);.
1da50 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d }. pFile-
1da60 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 >hMap = NULL;.
1da70 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e }. OSTRACE(("UN
1da80 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 MAP-FILE pid=%lu
1da90 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 , pFile=%p, rc=S
1daa0 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 QLITE_OK\n",.
1dab0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 osGetCur
1dac0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c rentProcessId(),
1dad0 20 70 46 69 6c 65 29 29 3b 0a 20 20 72 65 74 75 pFile));. retu
1dae0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a rn SQLITE_OK;.}.
1daf0 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 ./*.** Memory ma
1db00 70 20 6f 72 20 72 65 6d 61 70 20 74 68 65 20 66 p or remap the f
1db10 69 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 66 69 ile opened by fi
1db20 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70 46 le-descriptor pF
1db30 64 20 28 69 66 20 74 68 65 20 66 69 6c 65 0a 2a d (if the file.*
1db40 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6d 61 70 * is already map
1db50 70 65 64 2c 20 74 68 65 20 65 78 69 73 74 69 6e ped, the existin
1db60 67 20 6d 61 70 70 69 6e 67 20 69 73 20 72 65 70 g mapping is rep
1db70 6c 61 63 65 64 20 62 79 20 74 68 65 20 6e 65 77 laced by the new
1db80 29 2e 20 4f 72 2c 20 69 66 20 0a 2a 2a 20 74 68 ). Or, if .** th
1db90 65 72 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 ere already exis
1dba0 74 73 20 61 20 6d 61 70 70 69 6e 67 20 66 6f 72 ts a mapping for
1dbb0 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6e 64 20 this file, and
1dbc0 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 there are still
1dbd0 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 .** outstanding
1dbe0 78 46 65 74 63 68 28 29 20 72 65 66 65 72 65 6e xFetch() referen
1dbf0 63 65 73 20 74 6f 20 69 74 2c 20 74 68 69 73 20 ces to it, this
1dc00 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f function is a no
1dc10 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 -op..**.** If pa
1dc20 72 61 6d 65 74 65 72 20 6e 42 79 74 65 20 69 73 rameter nByte is
1dc30 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2c 20 74 non-negative, t
1dc40 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 65 hen it is the re
1dc50 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f 66 20 quested size of
1dc60 0a 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e 67 20 .** the mapping
1dc70 74 6f 20 63 72 65 61 74 65 2e 20 4f 74 68 65 72 to create. Other
1dc80 77 69 73 65 2c 20 69 66 20 6e 42 79 74 65 20 69 wise, if nByte i
1dc90 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f s less than zero
1dca0 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 72 , then the .** r
1dcb0 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 69 73 equested size is
1dcc0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 the size of the
1dcd0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 54 file on disk. T
1dce0 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f he actual size o
1dcf0 66 20 74 68 65 0a 2a 2a 20 63 72 65 61 74 65 64 f the.** created
1dd00 20 6d 61 70 70 69 6e 67 20 69 73 20 65 69 74 68 mapping is eith
1dd10 65 72 20 74 68 65 20 72 65 71 75 65 73 74 65 64 er the requested
1dd20 20 73 69 7a 65 20 6f 72 20 74 68 65 20 76 61 6c size or the val
1dd30 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20 0a 2a ue configured .*
1dd40 2a 20 75 73 69 6e 67 20 53 51 4c 49 54 45 5f 46 * using SQLITE_F
1dd50 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 CNTL_MMAP_SIZE,
1dd60 77 68 69 63 68 65 76 65 72 20 69 73 20 73 6d 61 whichever is sma
1dd70 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 ller..**.** SQLI
1dd80 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 TE_OK is returne
1dd90 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 d if no error oc
1dda0 63 75 72 73 20 28 65 76 65 6e 20 69 66 20 74 68 curs (even if th
1ddb0 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 e mapping is not
1ddc0 0a 2a 2a 20 72 65 63 72 65 61 74 65 64 20 61 73 .** recreated as
1ddd0 20 61 20 72 65 73 75 6c 74 20 6f 66 20 6f 75 74 a result of out
1dde0 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e standing referen
1ddf0 63 65 73 29 20 6f 72 20 61 6e 20 53 51 4c 69 74 ces) or an SQLit
1de00 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 e error.** code
1de10 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 otherwise..*/.st
1de20 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 61 70 66 atic int winMapf
1de30 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 64 ile(winFile *pFd
1de40 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 , sqlite3_int64
1de50 6e 42 79 74 65 29 7b 0a 20 20 73 71 6c 69 74 65 nByte){. sqlite
1de60 33 5f 69 6e 74 36 34 20 6e 4d 61 70 20 3d 20 6e 3_int64 nMap = n
1de70 42 79 74 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a Byte;. int rc;.
1de80 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70 3e . assert( nMap>
1de90 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e 46 65 74 63 =0 || pFd->nFetc
1dea0 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 4f 53 54 hOut==0 );. OST
1deb0 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 20 RACE(("MAP-FILE
1dec0 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 pid=%lu, pFile=%
1ded0 70 2c 20 73 69 7a 65 3d 25 6c 6c 64 5c 6e 22 2c p, size=%lld\n",
1dee0 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 . osGe
1def0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 tCurrentProcessI
1df00 64 28 29 2c 20 70 46 64 2c 20 6e 42 79 74 65 29 d(), pFd, nByte)
1df10 29 3b 0a 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e );.. if( pFd->n
1df20 46 65 74 63 68 4f 75 74 3e 30 20 29 20 72 65 74 FetchOut>0 ) ret
1df30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a urn SQLITE_OK;..
1df40 20 20 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a if( nMap<0 ){.
1df50 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 rc = winFile
1df60 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f 66 69 Size((sqlite3_fi
1df70 6c 65 2a 29 70 46 64 2c 20 26 6e 4d 61 70 29 3b le*)pFd, &nMap);
1df80 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 . if( rc ){.
1df90 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d OSTRACE(("M
1dfa0 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c AP-FILE pid=%lu,
1dfb0 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 pFile=%p, rc=SQ
1dfc0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 LITE_IOERR_FSTAT
1dfd0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 \n",.
1dfe0 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 osGetCurrent
1dff0 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 ProcessId(), pFd
1e000 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e ));. return
1e010 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 SQLITE_IOERR_FS
1e020 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 TAT;. }. }.
1e030 20 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d if( nMap>pFd->m
1e040 6d 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20 mapSizeMax ){.
1e050 20 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d nMap = pFd->mm
1e060 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 20 apSizeMax;. }.
1e070 20 6e 4d 61 70 20 26 3d 20 7e 28 73 71 6c 69 74 nMap &= ~(sqlit
1e080 65 33 5f 69 6e 74 36 34 29 28 77 69 6e 53 79 73 e3_int64)(winSys
1e090 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65 20 Info.dwPageSize
1e0a0 2d 20 31 29 3b 0a 20 0a 20 20 69 66 28 20 6e 4d - 1);. . if( nM
1e0b0 61 70 3d 3d 30 20 26 26 20 70 46 64 2d 3e 6d 6d ap==0 && pFd->mm
1e0c0 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 apSize>0 ){.
1e0d0 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 winUnmapfile(pFd
1e0e0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61 );. }. if( nMa
1e0f0 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 p!=pFd->mmapSize
1e100 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e ){. void *pN
1e110 65 77 20 3d 20 30 3b 0a 20 20 20 20 44 57 4f 52 ew = 0;. DWOR
1e120 44 20 70 72 6f 74 65 63 74 20 3d 20 50 41 47 45 D protect = PAGE
1e130 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 44 _READONLY;. D
1e140 57 4f 52 44 20 66 6c 61 67 73 20 3d 20 46 49 4c WORD flags = FIL
1e150 45 5f 4d 41 50 5f 52 45 41 44 3b 0a 0a 20 20 20 E_MAP_READ;..
1e160 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 winUnmapfile(pF
1e170 64 29 3b 0a 20 20 20 20 69 66 28 20 28 70 46 64 d);. if( (pFd
1e180 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57 49 ->ctrlFlags & WI
1e190 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 NFILE_RDONLY)==0
1e1a0 20 29 7b 0a 20 20 20 20 20 20 70 72 6f 74 65 63 ){. protec
1e1b0 74 20 3d 20 50 41 47 45 5f 52 45 41 44 57 52 49 t = PAGE_READWRI
1e1c0 54 45 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 TE;. flags
1e1d0 7c 3d 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 |= FILE_MAP_WRIT
1e1e0 45 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c E;. }.#if SQL
1e1f0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 ITE_OS_WINRT.
1e200 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 pFd->hMap = osC
1e210 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 reateFileMapping
1e220 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68 2c 20 FromApp(pFd->h,
1e230 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 20 6e NULL, protect, n
1e240 4d 61 70 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69 Map, NULL);.#eli
1e250 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 f defined(SQLITE
1e260 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 _WIN32_HAS_WIDE)
1e270 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d . pFd->hMap =
1e280 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 osCreateFileMap
1e290 70 69 6e 67 57 28 70 46 64 2d 3e 68 2c 20 4e 55 pingW(pFd->h, NU
1e2a0 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a 20 20 20 LL, protect,.
1e2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 44 57 (DW
1e2d0 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33 32 29 20 ORD)((nMap>>32)
1e2e0 26 20 30 78 66 66 66 66 66 66 66 66 29 2c 0a 20 & 0xffffffff),.
1e2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 (
1e310 44 57 4f 52 44 29 28 6e 4d 61 70 20 26 20 30 78 DWORD)(nMap & 0x
1e320 66 66 66 66 66 66 66 66 29 2c 20 4e 55 4c 4c 29 ffffffff), NULL)
1e330 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 ;.#elif defined(
1e340 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 SQLITE_WIN32_HAS
1e350 5f 41 4e 53 49 29 0a 20 20 20 20 70 46 64 2d 3e _ANSI). pFd->
1e360 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 hMap = osCreateF
1e370 69 6c 65 4d 61 70 70 69 6e 67 41 28 70 46 64 2d ileMappingA(pFd-
1e380 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 >h, NULL, protec
1e390 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 t,.
1e3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e3b0 20 20 20 28 44 57 4f 52 44 29 28 28 6e 4d 61 70 (DWORD)((nMap
1e3c0 3e 3e 33 32 29 20 26 20 30 78 66 66 66 66 66 66 >>32) & 0xffffff
1e3d0 66 66 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 ff),.
1e3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e3f0 20 20 20 20 20 28 44 57 4f 52 44 29 28 6e 4d 61 (DWORD)(nMa
1e400 70 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c p & 0xffffffff),
1e410 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 NULL);.#endif.
1e420 20 20 20 69 66 28 20 70 46 64 2d 3e 68 4d 61 70 if( pFd->hMap
1e430 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 ==NULL ){.
1e440 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d pFd->lastErrno =
1e450 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 osGetLastError(
1e460 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 );. rc = wi
1e470 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 nLogError(SQLITE
1e480 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 64 _IOERR_MMAP, pFd
1e490 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 ->lastErrno,.
1e4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e4b0 20 20 20 20 22 77 69 6e 4d 61 70 66 69 6c 65 31 "winMapfile1
1e4c0 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a ", pFd->zPath);.
1e4d0 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74 68 65 /* Log the
1e4e0 20 65 72 72 6f 72 2c 20 62 75 74 20 63 6f 6e 74 error, but cont
1e4f0 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 inue normal oper
1e500 61 74 69 6f 6e 20 75 73 69 6e 67 20 78 52 65 61 ation using xRea
1e510 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 d/xWrite */.
1e520 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d OSTRACE(("MAP-
1e530 46 49 4c 45 2d 43 52 45 41 54 45 20 70 69 64 3d FILE-CREATE pid=
1e540 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 %lu, pFile=%p, r
1e550 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 c=%s\n",.
1e560 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 osGetCur
1e570 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c rentProcessId(),
1e580 20 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72 72 pFd, sqlite3Err
1e590 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 Name(rc)));.
1e5a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
1e5b0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 OK;. }. as
1e5c0 73 65 72 74 28 20 28 6e 4d 61 70 20 25 20 77 69 sert( (nMap % wi
1e5d0 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 nSysInfo.dwPageS
1e5e0 69 7a 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 ize)==0 );. a
1e5f0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 53 49 ssert( sizeof(SI
1e600 5a 45 5f 54 29 3d 3d 73 69 7a 65 6f 66 28 73 71 ZE_T)==sizeof(sq
1e610 6c 69 74 65 33 5f 69 6e 74 36 34 29 20 7c 7c 20 lite3_int64) ||
1e620 6e 4d 61 70 3c 3d 30 78 66 66 66 66 66 66 66 66 nMap<=0xffffffff
1e630 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f );.#if SQLITE_O
1e640 53 5f 57 49 4e 52 54 0a 20 20 20 20 70 4e 65 77 S_WINRT. pNew
1e650 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 = osMapViewOfFi
1e660 6c 65 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68 leFromApp(pFd->h
1e670 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30 2c 20 28 Map, flags, 0, (
1e680 53 49 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a 23 65 SIZE_T)nMap);.#e
1e690 6c 73 65 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f lse. pNew = o
1e6a0 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 sMapViewOfFile(p
1e6b0 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c Fd->hMap, flags,
1e6c0 20 30 2c 20 30 2c 20 28 53 49 5a 45 5f 54 29 6e 0, 0, (SIZE_T)n
1e6d0 4d 61 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 Map);.#endif.
1e6e0 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 if( pNew==NULL
1e6f0 29 7b 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 ){. osClose
1e700 48 61 6e 64 6c 65 28 70 46 64 2d 3e 68 4d 61 70 Handle(pFd->hMap
1e710 29 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 68 4d );. pFd->hM
1e720 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 ap = NULL;.
1e730 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 pFd->lastErrno
1e740 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 = osGetLastError
1e750 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 ();. rc = w
1e760 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 inLogError(SQLIT
1e770 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 E_IOERR_MMAP, pF
1e780 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 d->lastErrno,.
1e790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e7a0 20 20 20 20 20 22 77 69 6e 4d 61 70 66 69 6c 65 "winMapfile
1e7b0 32 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 2", pFd->zPath);
1e7c0 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74 68 . /* Log th
1e7d0 65 20 65 72 72 6f 72 2c 20 62 75 74 20 63 6f 6e e error, but con
1e7e0 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70 65 tinue normal ope
1e7f0 72 61 74 69 6f 6e 20 75 73 69 6e 67 20 78 52 65 ration using xRe
1e800 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20 20 ad/xWrite */.
1e810 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 OSTRACE(("MAP
1e820 2d 46 49 4c 45 2d 4d 41 50 20 70 69 64 3d 25 6c -FILE-MAP pid=%l
1e830 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d u, pFile=%p, rc=
1e840 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 %s\n",.
1e850 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 osGetCurre
1e860 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 ntProcessId(), p
1e870 46 64 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 Fd, sqlite3ErrNa
1e880 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 me(rc)));.
1e890 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
1e8a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 64 2d ;. }. pFd-
1e8b0 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 70 4e >pMapRegion = pN
1e8c0 65 77 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 ew;. pFd->mma
1e8d0 70 53 69 7a 65 20 3d 20 6e 4d 61 70 3b 0a 20 20 pSize = nMap;.
1e8e0 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 pFd->mmapSizeA
1e8f0 63 74 75 61 6c 20 3d 20 6e 4d 61 70 3b 0a 20 20 ctual = nMap;.
1e900 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4d }.. OSTRACE(("M
1e910 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c AP-FILE pid=%lu,
1e920 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 pFile=%p, rc=SQ
1e930 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 LITE_OK\n",.
1e940 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 osGetCurr
1e950 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 entProcessId(),
1e960 70 46 64 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 pFd));. return
1e970 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e SQLITE_OK;.}.#en
1e980 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 dif /* SQLITE_MA
1e990 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f X_MMAP_SIZE>0 */
1e9a0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73 73 69 ../*.** If possi
1e9b0 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 20 70 6f ble, return a po
1e9c0 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70 70 69 inter to a mappi
1e9d0 6e 67 20 6f 66 20 66 69 6c 65 20 66 64 20 73 74 ng of file fd st
1e9e0 61 72 74 69 6e 67 20 61 74 20 6f 66 66 73 65 74 arting at offset
1e9f0 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20 6d 61 .** iOff. The ma
1ea00 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20 76 61 pping must be va
1ea10 6c 69 64 20 66 6f 72 20 61 74 20 6c 65 61 73 74 lid for at least
1ea20 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a 2a 0a nAmt bytes..**.
1ea30 2a 2a 20 49 66 20 73 75 63 68 20 61 20 70 6f 69 ** If such a poi
1ea40 6e 74 65 72 20 63 61 6e 20 62 65 20 6f 62 74 61 nter can be obta
1ea50 69 6e 65 64 2c 20 73 74 6f 72 65 20 69 74 20 69 ined, store it i
1ea60 6e 20 2a 70 70 20 61 6e 64 20 72 65 74 75 72 6e n *pp and return
1ea70 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f SQLITE_OK..** O
1ea80 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 r, if one cannot
1ea90 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 but no error oc
1eaa0 63 75 72 73 2c 20 73 65 74 20 2a 70 70 20 74 6f curs, set *pp to
1eab0 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 0 and return SQ
1eac0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 LITE_OK..** Fina
1ead0 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 lly, if an error
1eae0 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 72 65 74 does occur, ret
1eaf0 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 urn an SQLite er
1eb00 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20 66 69 ror code. The fi
1eb10 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 nal.** value of
1eb20 2a 70 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 *pp is undefined
1eb30 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a in this case..*
1eb40 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e *.** If this fun
1eb50 63 74 69 6f 6e 20 64 6f 65 73 20 72 65 74 75 72 ction does retur
1eb60 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20 74 68 65 n a pointer, the
1eb70 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 76 65 caller must eve
1eb80 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72 65 6c 65 ntually .** rele
1eb90 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 ase the referenc
1eba0 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 77 69 6e e by calling win
1ebb0 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f 0a 73 74 Unfetch()..*/.st
1ebc0 61 74 69 63 20 69 6e 74 20 77 69 6e 46 65 74 63 atic int winFetc
1ebd0 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a h(sqlite3_file *
1ebe0 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 69 6e fd, i64 iOff, in
1ebf0 74 20 6e 41 6d 74 2c 20 76 6f 69 64 20 2a 2a 70 t nAmt, void **p
1ec00 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d p){.#if SQLITE_M
1ec10 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 AX_MMAP_SIZE>0.
1ec20 20 77 69 6e 46 69 6c 65 20 2a 70 46 64 20 3d 20 winFile *pFd =
1ec30 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 (winFile*)fd;
1ec40 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e /* The underlyin
1ec50 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 g database file
1ec60 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 20 */.#endif. *pp
1ec70 3d 20 30 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 = 0;.. OSTRACE(
1ec80 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c ("FETCH pid=%lu,
1ec90 20 70 46 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65 pFile=%p, offse
1eca0 74 3d 25 6c 6c 64 2c 20 61 6d 6f 75 6e 74 3d 25 t=%lld, amount=%
1ecb0 64 2c 20 70 70 3d 25 70 5c 6e 22 2c 0a 20 20 20 d, pp=%p\n",.
1ecc0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 osGetCur
1ecd0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c rentProcessId(),
1ece0 20 66 64 2c 20 69 4f 66 66 2c 20 6e 41 6d 74 2c fd, iOff, nAmt,
1ecf0 20 70 70 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 pp));..#if SQLI
1ed00 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 TE_MAX_MMAP_SIZE
1ed10 3e 30 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d >0. if( pFd->mm
1ed20 61 70 53 69 7a 65 4d 61 78 3e 30 20 29 7b 0a 20 apSizeMax>0 ){.
1ed30 20 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 if( pFd->pMap
1ed40 52 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 Region==0 ){.
1ed50 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 4d int rc = winM
1ed60 61 70 66 69 6c 65 28 70 46 64 2c 20 2d 31 29 3b apfile(pFd, -1);
1ed70 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 . if( rc!=S
1ed80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 QLITE_OK ){.
1ed90 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 45 OSTRACE(("FE
1eda0 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 TCH pid=%lu, pFi
1edb0 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c le=%p, rc=%s\n",
1edc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
1edd0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 osGetCurrentPr
1ede0 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 ocessId(), pFd,
1edf0 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 sqlite3ErrName(r
1ee00 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 c)));. re
1ee10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d turn rc;. }
1ee20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 . }. if( p
1ee30 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20 Fd->mmapSize >=
1ee40 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20 iOff+nAmt ){.
1ee50 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38 20 2a *pp = &((u8 *
1ee60 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e )pFd->pMapRegion
1ee70 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70 )[iOff];. p
1ee80 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b Fd->nFetchOut++;
1ee90 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 . }. }.#endi
1eea0 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46 f.. OSTRACE(("F
1eeb0 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 ETCH pid=%lu, pF
1eec0 69 6c 65 3d 25 70 2c 20 70 70 3d 25 70 2c 20 2a ile=%p, pp=%p, *
1eed0 70 70 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 pp=%p, rc=SQLITE
1eee0 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 _OK\n",.
1eef0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 osGetCurrentP
1ef00 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64 2c 20 rocessId(), fd,
1ef10 70 70 2c 20 2a 70 70 29 29 3b 0a 20 20 72 65 74 pp, *pp));. ret
1ef20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d urn SQLITE_OK;.}
1ef30 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 ../*.** If the t
1ef40 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 hird argument is
1ef50 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 non-NULL, then
1ef60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 this function re
1ef70 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20 72 65 66 leases a .** ref
1ef80 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65 64 20 erence obtained
1ef90 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 by an earlier ca
1efa0 6c 6c 20 74 6f 20 77 69 6e 46 65 74 63 68 28 29 ll to winFetch()
1efb0 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 . The second.**
1efc0 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 argument passed
1efd0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e to this function
1efe0 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d must be the sam
1eff0 65 20 61 73 20 74 68 65 20 63 6f 72 72 65 73 70 e as the corresp
1f000 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 onding.** argume
1f010 6e 74 20 74 68 61 74 20 77 61 73 20 70 61 73 73 nt that was pass
1f020 65 64 20 74 6f 20 74 68 65 20 77 69 6e 46 65 74 ed to the winFet
1f030 63 68 28 29 20 69 6e 76 6f 63 61 74 69 6f 6e 2e ch() invocation.
1f040 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 .**.** Or, if t
1f050 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e he third argumen
1f060 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 t is NULL, then
1f070 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 this function is
1f080 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 0a 2a being called .*
1f090 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65 20 * to inform the
1f0a0 56 46 53 20 6c 61 79 65 72 20 74 68 61 74 2c 20 VFS layer that,
1f0b0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 50 4f 53 according to POS
1f0c0 49 58 2c 20 61 6e 79 20 65 78 69 73 74 69 6e 67 IX, any existing
1f0d0 20 6d 61 70 70 69 6e 67 20 0a 2a 2a 20 6d 61 79 mapping .** may
1f0e0 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c 69 64 20 now be invalid
1f0f0 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 75 6e and should be un
1f100 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 mapped..*/.stati
1f110 63 20 69 6e 74 20 77 69 6e 55 6e 66 65 74 63 68 c int winUnfetch
1f120 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 (sqlite3_file *f
1f130 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 76 6f 69 d, i64 iOff, voi
1f140 64 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 d *p){.#if SQLIT
1f150 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e E_MAX_MMAP_SIZE>
1f160 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 64 0. winFile *pFd
1f170 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b = (winFile*)fd;
1f180 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c /* The underl
1f190 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 ying database fi
1f1a0 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 70 le */.. /* If p
1f1b0 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68 65 20 65 ==0 (unmap the e
1f1c0 6e 74 69 72 65 20 66 69 6c 65 29 20 74 68 65 6e ntire file) then
1f1d0 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e there must be n
1f1e0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a 20 o outstanding .
1f1f0 20 2a 2a 20 78 46 65 74 63 68 20 72 65 66 65 72 ** xFetch refer
1f200 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20 70 21 ences. Or, if p!
1f210 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69 74 20 69 =0 (meaning it i
1f220 73 20 61 6e 20 78 46 65 74 63 68 20 72 65 66 65 s an xFetch refe
1f230 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74 68 65 rence),. ** the
1f240 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 n there must be
1f250 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 at least one out
1f260 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20 20 standing. */.
1f270 61 73 73 65 72 74 28 20 28 70 3d 3d 30 29 3d 3d assert( (p==0)==
1f280 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d (pFd->nFetchOut=
1f290 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 =0) );.. /* If
1f2a0 70 21 3d 30 2c 20 69 74 20 6d 75 73 74 20 6d 61 p!=0, it must ma
1f2b0 74 63 68 20 74 68 65 20 69 4f 66 66 20 76 61 6c tch the iOff val
1f2c0 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 ue. */. assert(
1f2d0 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28 28 75 p==0 || p==&((u
1f2e0 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 8 *)pFd->pMapReg
1f2f0 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20 ion)[iOff] );..
1f300 20 4f 53 54 52 41 43 45 28 28 22 55 4e 46 45 54 OSTRACE(("UNFET
1f310 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c CH pid=%lu, pFil
1f320 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c e=%p, offset=%ll
1f330 64 2c 20 70 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 d, p=%p\n",.
1f340 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 osGetCurr
1f350 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 entProcessId(),
1f360 70 46 64 2c 20 69 4f 66 66 2c 20 70 29 29 3b 0a pFd, iOff, p));.
1f370 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 . if( p ){.
1f380 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2d 2d pFd->nFetchOut--
1f390 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f ;. }else{. /
1f3a0 2a 20 46 49 58 4d 45 3a 20 20 49 66 20 57 69 6e * FIXME: If Win
1f3b0 64 6f 77 73 20 74 72 75 6c 79 20 61 6c 77 61 79 dows truly alway
1f3c0 73 20 70 72 65 76 65 6e 74 73 20 74 72 75 6e 63 s prevents trunc
1f3d0 61 74 69 6e 67 20 6f 72 20 64 65 6c 65 74 69 6e ating or deletin
1f3e0 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 g a. ** file
1f3f0 77 68 69 6c 65 20 61 20 6d 61 70 70 69 6e 67 20 while a mapping
1f400 69 73 20 68 65 6c 64 2c 20 74 68 65 6e 20 74 68 is held, then th
1f410 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 69 6e 55 e following winU
1f420 6e 6d 61 70 66 69 6c 65 28 29 20 63 61 6c 6c 0a nmapfile() call.
1f430 20 20 20 20 2a 2a 20 69 73 20 75 6e 6e 65 63 65 ** is unnece
1f440 73 73 61 72 79 20 63 61 6e 20 63 61 6e 20 62 65 ssary can can be
1f450 20 6f 6d 69 74 74 65 64 20 2d 20 70 6f 74 65 6e omitted - poten
1f460 74 69 61 6c 6c 79 20 69 6d 70 72 6f 76 69 6e 67 tially improving
1f470 0a 20 20 20 20 2a 2a 20 70 65 72 66 6f 72 6d 61 . ** performa
1f480 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20 77 69 6e nce. */. win
1f490 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a Unmapfile(pFd);.
1f4a0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 }.. assert( p
1f4b0 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 3d 30 Fd->nFetchOut>=0
1f4c0 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 );.#endif.. OS
1f4d0 54 52 41 43 45 28 28 22 55 4e 46 45 54 43 48 20 TRACE(("UNFETCH
1f4e0 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 pid=%lu, pFile=%
1f4f0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c p, rc=SQLITE_OK\
1f500 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f n",. o
1f510 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 sGetCurrentProce
1f520 73 73 49 64 28 29 2c 20 66 64 29 29 3b 0a 20 20 ssId(), fd));.
1f530 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
1f540 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 ;.}../*.** Here
1f550 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 ends the impleme
1f560 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 ntation of all s
1f570 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 qlite3_file meth
1f580 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a ods..**.********
1f590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 ************** E
1f5a0 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 nd sqlite3_file
1f5b0 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a Methods ********
1f5c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1f5d0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a *******.********
1f5e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1f5f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1f600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1f610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1f620 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 ******/../*.** T
1f630 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e his vector defin
1f640 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f es all the metho
1f650 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72 ds that can oper
1f660 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c ate on an.** sql
1f670 69 74 65 33 5f 66 69 6c 65 20 66 6f 72 20 77 69 ite3_file for wi
1f680 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 n32..*/.static c
1f690 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f onst sqlite3_io_
1f6a0 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d 65 74 methods winIoMet
1f6b0 68 6f 64 20 3d 20 7b 0a 20 20 33 2c 20 20 20 20 hod = {. 3,
1f6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1f6d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 /* iVe
1f6e0 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c rsion */. winCl
1f6f0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 ose,
1f700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 /* xC
1f710 6c 6f 73 65 20 2a 2f 0a 20 20 77 69 6e 52 65 61 lose */. winRea
1f720 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 d,
1f730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 /* xRe
1f740 61 64 20 2a 2f 0a 20 20 77 69 6e 57 72 69 74 65 ad */. winWrite
1f750 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
1f760 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 /* xWrit
1f770 65 20 2a 2f 0a 20 20 77 69 6e 54 72 75 6e 63 61 e */. winTrunca
1f780 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 te,
1f790 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 /* xTrunc
1f7a0 61 74 65 20 2a 2f 0a 20 20 77 69 6e 53 79 6e 63 ate */. winSync
1f7b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
1f7c0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e /* xSyn
1f7d0 63 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 53 69 c */. winFileSi
1f7e0 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 ze,
1f7f0 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 /* xFileS
1f800 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63 6b ize */. winLock
1f810 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
1f820 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 /* xLoc
1f830 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b k */. winUnlock
1f840 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
1f850 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 /* xUnloc
1f860 6b 20 2a 2f 0a 20 20 77 69 6e 43 68 65 63 6b 52 k */. winCheckR
1f870 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 eservedLock,
1f880 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b /* xCheck
1f890 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a ReservedLock */.
1f8a0 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c winFileControl
1f8b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
1f8c0 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f /* xFileContro
1f8d0 6c 20 2a 2f 0a 20 20 77 69 6e 53 65 63 74 6f 72 l */. winSector
1f8e0 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 Size,
1f8f0 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f /* xSecto
1f900 72 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 44 65 rSize */. winDe
1f910 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 viceCharacterist
1f920 69 63 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 44 ics, /* xD
1f930 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 eviceCharacteris
1f940 74 69 63 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d tics */. winShm
1f950 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 Map,
1f960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 /* xSh
1f970 6d 4d 61 70 20 2a 2f 0a 20 20 77 69 6e 53 68 6d mMap */. winShm
1f980 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 Lock,
1f990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 /* xSh
1f9a0 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 53 68 mLock */. winSh
1f9b0 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20 mBarrier,
1f9c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 /* xS
1f9d0 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20 20 77 hmBarrier */. w
1f9e0 69 6e 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20 inShmUnmap,
1f9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1fa00 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20 * xShmUnmap */.
1fa10 20 77 69 6e 46 65 74 63 68 2c 20 20 20 20 20 20 winFetch,
1fa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1fa30 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 0a 20 20 /* xFetch */.
1fa40 77 69 6e 55 6e 66 65 74 63 68 20 20 20 20 20 20 winUnfetch
1fa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1fa60 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f 0a 7d /* xUnfetch */.}
1fa70 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ;../************
1fa80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1fa90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1faa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1fab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1fac0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .***************
1fad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 ************* sq
1fae0 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 lite3_vfs method
1faf0 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a s **************
1fb00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a **************.*
1fb10 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 *.** This divisi
1fb20 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 on contains the
1fb30 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f implementation o
1fb40 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 f methods on the
1fb50 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 .** sqlite3_vfs
1fb60 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 23 69 66 20 object..*/..#if
1fb70 30 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 0./*.** Convert
1fb80 61 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 a filename from
1fb90 77 68 61 74 65 76 65 72 20 74 68 65 20 75 6e 64 whatever the und
1fba0 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e erlying operatin
1fbb0 67 20 73 79 73 74 65 6d 0a 2a 2a 20 73 75 70 70 g system.** supp
1fbc0 6f 72 74 73 20 66 6f 72 20 66 69 6c 65 6e 61 6d orts for filenam
1fbd0 65 73 20 69 6e 74 6f 20 55 54 46 2d 38 2e 20 20 es into UTF-8.
1fbe0 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 Space to hold th
1fbf0 65 20 72 65 73 75 6c 74 20 69 73 0a 2a 2a 20 6f e result is.** o
1fc00 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c btained from mal
1fc10 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65 20 loc and must be
1fc20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c freed by the cal
1fc30 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a ling function..*
1fc40 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 77 /.static char *w
1fc50 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46 inConvertToUtf8F
1fc60 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 76 6f ilename(const vo
1fc70 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a id *zFilename){.
1fc80 20 20 63 68 61 72 20 2a 7a 43 6f 6e 76 65 72 74 char *zConvert
1fc90 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 73 ed = 0;. if( os
1fca0 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 IsNT() ){. zC
1fcb0 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 55 6e onverted = winUn
1fcc0 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 46 69 6c icodeToUtf8(zFil
1fcd0 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64 ename);. }.#ifd
1fce0 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f ef SQLITE_WIN32_
1fcf0 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b HAS_ANSI. else{
1fd00 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 . zConverted
1fd10 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f = sqlite3_win32_
1fd20 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 46 69 mbcs_to_utf8(zFi
1fd30 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e lename);. }.#en
1fd40 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 dif. /* caller
1fd50 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 will handle out
1fd60 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 of memory */. r
1fd70 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 eturn zConverted
1fd80 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a ;.}.#endif../*.*
1fd90 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d * Convert a UTF-
1fda0 38 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 8 filename into
1fdb0 77 68 61 74 65 76 65 72 20 66 6f 72 6d 20 74 68 whatever form th
1fdc0 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 e underlying.**
1fdd0 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d operating system
1fde0 20 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d 65 73 wants filenames
1fdf0 20 69 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 in. Space to h
1fe00 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74 0a 2a old the result.*
1fe10 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 * is obtained fr
1fe20 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 om malloc and mu
1fe30 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 st be freed by t
1fe40 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 he calling.** fu
1fe50 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 nction..*/.stati
1fe60 63 20 76 6f 69 64 20 2a 77 69 6e 43 6f 6e 76 65 c void *winConve
1fe70 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 rtFromUtf8Filena
1fe80 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a me(const char *z
1fe90 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76 6f 69 Filename){. voi
1fea0 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 d *zConverted =
1feb0 30 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 0;. if( osIsNT(
1fec0 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 ) ){. zConver
1fed0 74 65 64 20 3d 20 77 69 6e 55 74 66 38 54 6f 55 ted = winUtf8ToU
1fee0 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 nicode(zFilename
1fef0 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 );. }.#ifdef SQ
1ff00 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 LITE_WIN32_HAS_A
1ff10 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 NSI. else{.
1ff20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 73 71 6c zConverted = sql
1ff30 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f ite3_win32_utf8_
1ff40 74 6f 5f 6d 62 63 73 28 7a 46 69 6c 65 6e 61 6d to_mbcs(zFilenam
1ff50 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 e);. }.#endif.
1ff60 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 /* caller will
1ff70 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 handle out of me
1ff80 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e mory */. return
1ff90 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a zConverted;.}..
1ffa0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 /*.** This funct
1ffb0 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d ion returns non-
1ffc0 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70 65 63 zero if the spec
1ffd0 69 66 69 65 64 20 55 54 46 2d 38 20 73 74 72 69 ified UTF-8 stri
1ffe0 6e 67 20 62 75 66 66 65 72 0a 2a 2a 20 65 6e 64 ng buffer.** end
1fff0 73 20 77 69 74 68 20 61 20 64 69 72 65 63 74 6f s with a directo
20000 72 79 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 ry separator cha
20010 72 61 63 74 65 72 20 6f 72 20 6f 6e 65 20 77 61 racter or one wa
20020 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 0a 2a s successfully.*
20030 2a 20 61 64 64 65 64 20 74 6f 20 69 74 2e 0a 2a * added to it..*
20040 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e /.static int win
20050 4d 61 6b 65 45 6e 64 49 6e 44 69 72 53 65 70 28 MakeEndInDirSep(
20060 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a int nBuf, char *
20070 7a 42 75 66 29 7b 0a 20 20 69 66 28 20 7a 42 75 zBuf){. if( zBu
20080 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 f ){. int nLe
20090 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 n = sqlite3Strle
200a0 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 20 20 69 n30(zBuf);. i
200b0 66 28 20 6e 4c 65 6e 3e 30 20 29 7b 0a 20 20 20 f( nLen>0 ){.
200c0 20 20 20 69 66 28 20 77 69 6e 49 73 44 69 72 53 if( winIsDirS
200d0 65 70 28 7a 42 75 66 5b 6e 4c 65 6e 2d 31 5d 29 ep(zBuf[nLen-1])
200e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 ){. retu
200f0 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 rn 1;. }els
20100 65 20 69 66 28 20 6e 4c 65 6e 2b 31 3c 6e 42 75 e if( nLen+1<nBu
20110 66 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 42 75 f ){. zBu
20120 66 5b 6e 4c 65 6e 5d 20 3d 20 77 69 6e 47 65 74 f[nLen] = winGet
20130 44 69 72 53 65 70 28 29 3b 0a 20 20 20 20 20 20 DirSep();.
20140 20 20 7a 42 75 66 5b 6e 4c 65 6e 2b 31 5d 20 3d zBuf[nLen+1] =
20150 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 72 '\0';. r
20160 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d eturn 1;. }
20170 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 . }. }. ret
20180 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 urn 0;.}../*.**
20190 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 Create a tempora
201a0 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 ry file name and
201b0 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c store the resul
201c0 74 69 6e 67 20 70 6f 69 6e 74 65 72 20 69 6e 74 ting pointer int
201d0 6f 20 70 7a 42 75 66 2e 0a 2a 2a 20 54 68 65 20 o pzBuf..** The
201e0 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 pointer returned
201f0 20 69 6e 20 70 7a 42 75 66 20 6d 75 73 74 20 62 in pzBuf must b
20200 65 20 66 72 65 65 64 20 76 69 61 20 73 71 6c 69 e freed via sqli
20210 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 te3_free()..*/.s
20220 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 tatic int winGet
20230 54 65 6d 70 6e 61 6d 65 28 73 71 6c 69 74 65 33 Tempname(sqlite3
20240 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 68 61 72 _vfs *pVfs, char
20250 20 2a 2a 70 7a 42 75 66 29 7b 0a 20 20 73 74 61 **pzBuf){. sta
20260 74 69 63 20 63 68 61 72 20 7a 43 68 61 72 73 5b tic char zChars[
20270 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67 ] =. "abcdefg
20280 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 hijklmnopqrstuvw
20290 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46 xyz". "ABCDEF
202a0 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 GHIJKLMNOPQRSTUV
202b0 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34 WXYZ". "01234
202c0 35 36 37 38 39 22 3b 0a 20 20 73 69 7a 65 5f 74 56789";. size_t
202d0 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 42 75 i, j;. int nBu
202e0 66 2c 20 6e 4c 65 6e 3b 0a 20 20 63 68 61 72 20 f, nLen;. char
202f0 2a 7a 42 75 66 3b 0a 0a 20 20 2f 2a 20 49 74 27 *zBuf;.. /* It'
20300 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 s odd to simulat
20310 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 e an io-error he
20320 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 re, but really t
20330 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a his is just. **
20340 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 using the io-er
20350 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 ror infrastructu
20360 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 re to test that
20370 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 SQLite handles t
20380 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f his. ** functio
20390 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f n failing. . */
203a0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 . SimulateIOErr
203b0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 or( return SQLIT
203c0 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 2f 2a E_IOERR );.. /*
203d0 20 41 6c 6c 6f 63 61 74 65 20 61 20 74 65 6d 70 Allocate a temp
203e0 6f 72 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 orary buffer to
203f0 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 79 20 store the fully
20400 71 75 61 6c 69 66 69 65 64 20 66 69 6c 65 0a 20 qualified file.
20410 20 2a 2a 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 ** name for the
20420 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e temporary file.
20430 20 20 49 66 20 74 68 69 73 20 66 61 69 6c 73 2c If this fails,
20440 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6e 74 69 we cannot conti
20450 6e 75 65 2e 0a 20 20 2a 2f 0a 20 20 6e 42 75 66 nue.. */. nBuf
20460 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e = pVfs->mxPathn
20470 61 6d 65 3b 0a 20 20 7a 42 75 66 20 3d 20 73 71 ame;. zBuf = sq
20480 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 lite3MallocZero(
20490 20 6e 42 75 66 2b 33 20 29 3b 0a 20 20 69 66 28 nBuf+3 );. if(
204a0 20 21 7a 42 75 66 20 29 7b 0a 20 20 20 20 4f 53 !zBuf ){. OS
204b0 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c TRACE(("TEMP-FIL
204c0 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f ENAME rc=SQLITE_
204d0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 IOERR_NOMEM\n"))
204e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c ;. return SQL
204f0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b ITE_IOERR_NOMEM;
20500 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 . }.. /* Figur
20510 65 20 6f 75 74 20 74 68 65 20 65 66 66 65 63 74 e out the effect
20520 69 76 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 ive temporary di
20530 72 65 63 74 6f 72 79 2e 20 20 46 69 72 73 74 2c rectory. First,
20540 20 63 68 65 63 6b 20 69 66 20 6f 6e 65 0a 20 20 check if one.
20550 2a 2a 20 68 61 73 20 62 65 65 6e 20 65 78 70 6c ** has been expl
20560 69 63 69 74 6c 79 20 73 65 74 20 62 79 20 74 68 icitly set by th
20570 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 3b 20 6f e application; o
20580 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68 therwise, use th
20590 65 20 6f 6e 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 e one. ** confi
205a0 67 75 72 65 64 20 62 79 20 74 68 65 20 6f 70 65 gured by the ope
205b0 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2e 0a 20 rating system..
205c0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 42 */. assert( nB
205d0 75 66 3e 33 30 20 29 3b 0a 20 20 69 66 28 20 73 uf>30 );. if( s
205e0 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 qlite3_temp_dire
205f0 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 73 71 6c ctory ){. sql
20600 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 ite3_snprintf(nB
20610 75 66 2d 33 30 2c 20 7a 42 75 66 2c 20 22 25 73 uf-30, zBuf, "%s
20620 22 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f ", sqlite3_temp_
20630 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 directory);.
20640 77 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 69 72 53 winMakeEndInDirS
20650 65 70 28 6e 42 75 66 2d 33 30 2c 20 7a 42 75 66 ep(nBuf-30, zBuf
20660 29 3b 0a 20 20 7d 0a 23 69 66 20 64 65 66 69 6e );. }.#if defin
20670 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 ed(__CYGWIN__).
20680 20 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 else{. stati
20690 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a c const char *az
206a0 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 Dirs[] = {.
206b0 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 0, /* getenv("
206c0 53 51 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 20 SQLITE_TMPDIR")
206d0 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 */. 0, /*
206e0 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 getenv("TMPDIR")
206f0 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a */. 0, /*
20700 20 67 65 74 65 6e 76 28 22 54 4d 50 22 29 20 2a getenv("TMP") *
20710 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 /. 0, /* g
20720 65 74 65 6e 76 28 22 54 45 4d 50 22 29 20 2a 2f etenv("TEMP") */
20730 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 . 0, /* ge
20740 74 65 6e 76 28 22 55 53 45 52 50 52 4f 46 49 4c tenv("USERPROFIL
20750 45 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 22 2f E") */. "/
20760 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20 var/tmp",.
20770 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 "/usr/tmp",.
20780 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 "/tmp",.
20790 20 20 20 22 2e 22 2c 0a 20 20 20 20 20 20 20 30 ".",. 0
207a0 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 /* List
207b0 74 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 terminator */.
207c0 20 20 7d 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 };. unsigne
207d0 64 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e d int i;. con
207e0 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 st char *zDir =
207f0 30 3b 0a 0a 20 20 20 20 69 66 28 20 21 61 7a 44 0;.. if( !azD
20800 69 72 73 5b 30 5d 20 29 20 61 7a 44 69 72 73 5b irs[0] ) azDirs[
20810 30 5d 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 0] = getenv("SQL
20820 49 54 45 5f 54 4d 50 44 49 52 22 29 3b 0a 20 20 ITE_TMPDIR");.
20830 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d if( !azDirs[1]
20840 20 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 ) azDirs[1] = g
20850 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b etenv("TMPDIR");
20860 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 . if( !azDirs
20870 5b 32 5d 20 29 20 61 7a 44 69 72 73 5b 32 5d 20 [2] ) azDirs[2]
20880 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 22 29 3b = getenv("TMP");
20890 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 . if( !azDirs
208a0 5b 33 5d 20 29 20 61 7a 44 69 72 73 5b 33 5d 20 [3] ) azDirs[3]
208b0 3d 20 67 65 74 65 6e 76 28 22 54 45 4d 50 22 29 = getenv("TEMP")
208c0 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 ;. if( !azDir
208d0 73 5b 34 5d 20 29 20 61 7a 44 69 72 73 5b 34 5d s[4] ) azDirs[4]
208e0 20 3d 20 67 65 74 65 6e 76 28 22 55 53 45 52 50 = getenv("USERP
208f0 52 4f 46 49 4c 45 22 29 3b 0a 20 20 20 20 66 6f ROFILE");. fo
20900 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 r(i=0; i<sizeof(
20910 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 azDirs)/sizeof(a
20920 7a 44 69 72 73 5b 30 5d 29 3b 20 7a 44 69 72 3d zDirs[0]); zDir=
20930 61 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20 azDirs[i++]){.
20940 20 20 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 void *zConve
20950 72 74 65 64 3b 0a 20 20 20 20 20 20 69 66 28 20 rted;. if(
20960 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e zDir==0 ) contin
20970 75 65 3b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 ue;. /* If
20980 74 68 65 20 70 61 74 68 20 73 74 61 72 74 73 20 the path starts
20990 77 69 74 68 20 61 20 64 72 69 76 65 20 6c 65 74 with a drive let
209a0 74 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 ter followed by
209b0 74 68 65 20 63 6f 6c 6f 6e 0a 20 20 20 20 20 20 the colon.
209c0 2a 2a 20 63 68 61 72 61 63 74 65 72 2c 20 61 73 ** character, as
209d0 73 75 6d 65 20 69 74 20 69 73 20 61 6c 72 65 61 sume it is alrea
209e0 64 79 20 61 20 6e 61 74 69 76 65 20 57 69 6e 33 dy a native Win3
209f0 32 20 70 61 74 68 3b 20 6f 74 68 65 72 77 69 73 2 path; otherwis
20a00 65 2c 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d e,. ** it m
20a10 75 73 74 20 62 65 20 63 6f 6e 76 65 72 74 65 64 ust be converted
20a20 20 74 6f 20 61 20 6e 61 74 69 76 65 20 57 69 6e to a native Win
20a30 33 32 20 70 61 74 68 20 76 69 61 20 74 68 65 20 32 path via the
20a40 43 79 67 77 69 6e 20 41 50 49 0a 20 20 20 20 20 Cygwin API.
20a50 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 75 73 69 ** prior to usi
20a60 6e 67 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a ng it.. */.
20a70 20 20 20 20 20 20 69 66 28 20 77 69 6e 49 73 44 if( winIsD
20a80 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c riveLetterAndCol
20a90 6f 6e 28 7a 44 69 72 29 20 29 7b 0a 20 20 20 20 on(zDir) ){.
20aa0 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d zConverted =
20ab0 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 winConvertFromU
20ac0 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 44 69 72 tf8Filename(zDir
20ad0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 );. if( !
20ae0 7a 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 zConverted ){.
20af0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f sqlite3_
20b00 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 free(zBuf);.
20b10 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 OSTRACE(("
20b20 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 TEMP-FILENAME rc
20b30 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f =SQLITE_IOERR_NO
20b40 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 MEM\n"));.
20b50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 return SQLIT
20b60 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 E_IOERR_NOMEM;.
20b70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
20b80 20 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 if( winIsDir(zC
20b90 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 onverted) ){.
20ba0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 sqlite3_s
20bb0 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 33 30 2c nprintf(nBuf-30,
20bc0 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 44 69 zBuf, "%s", zDi
20bd0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 77 69 r);. wi
20be0 6e 4d 61 6b 65 45 6e 64 49 6e 44 69 72 53 65 70 nMakeEndInDirSep
20bf0 28 6e 42 75 66 2d 33 30 2c 20 7a 42 75 66 29 3b (nBuf-30, zBuf);
20c00 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 . sqlit
20c10 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 e3_free(zConvert
20c20 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 ed);. b
20c30 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a reak;. }.
20c40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f sqlite3_
20c50 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 free(zConverted)
20c60 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 ;. }else{.
20c70 20 20 20 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 zConverte
20c80 64 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f d = sqlite3Mallo
20c90 63 5a 65 72 6f 28 20 6e 42 75 66 2b 31 20 29 3b cZero( nBuf+1 );
20ca0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 43 . if( !zC
20cb0 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20 20 onverted ){.
20cc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 sqlite3_fr
20cd0 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 ee(zBuf);.
20ce0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 OSTRACE(("TE
20cf0 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 MP-FILENAME rc=S
20d00 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 QLITE_IOERR_NOME
20d10 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 M\n"));.
20d20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
20d30 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 IOERR_NOMEM;.
20d40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 }. i
20d50 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 f( cygwin_conv_p
20d60 61 74 68 28 0a 20 20 20 20 20 20 20 20 20 20 20 ath(.
20d70 20 20 20 20 20 6f 73 49 73 4e 54 28 29 20 3f 20 osIsNT() ?
20d80 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e CCP_POSIX_TO_WIN
20d90 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54 _W : CCP_POSIX_T
20da0 4f 5f 57 49 4e 5f 41 2c 20 7a 44 69 72 2c 0a 20 O_WIN_A, zDir,.
20db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a z
20dc0 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 75 66 2b Converted, nBuf+
20dd0 31 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 1)<0 ){.
20de0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a sqlite3_free(z
20df0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 Converted);.
20e00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 sqlite3_fr
20e10 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 ee(zBuf);.
20e20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 OSTRACE(("TE
20e30 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 MP-FILENAME rc=S
20e40 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 QLITE_IOERR_CONV
20e50 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20 PATH\n"));.
20e60 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c return winL
20e70 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 ogError(SQLITE_I
20e80 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 2c 20 28 OERR_CONVPATH, (
20e90 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 DWORD)errno,.
20ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20eb0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 47 65 "winGe
20ec0 74 54 65 6d 70 6e 61 6d 65 31 22 2c 20 7a 44 69 tTempname1", zDi
20ed0 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 r);. }.
20ee0 20 20 20 20 20 20 69 66 28 20 77 69 6e 49 73 44 if( winIsD
20ef0 69 72 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 ir(zConverted) )
20f00 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 {. /* A
20f10 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 t this point, we
20f20 20 6b 6e 6f 77 20 74 68 65 20 63 61 6e 64 69 64 know the candid
20f30 61 74 65 20 64 69 72 65 63 74 6f 72 79 20 65 78 ate directory ex
20f40 69 73 74 73 20 61 6e 64 20 73 68 6f 75 6c 64 0a ists and should.
20f50 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 ** be
20f60 75 73 65 64 2e 20 20 48 6f 77 65 76 65 72 2c 20 used. However,
20f70 77 65 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 63 we may need to c
20f80 6f 6e 76 65 72 74 20 74 68 65 20 73 74 72 69 6e onvert the strin
20f90 67 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 g containing.
20fa0 20 20 20 20 20 20 20 2a 2a 20 69 74 73 20 6e 61 ** its na
20fb0 6d 65 20 69 6e 74 6f 20 55 54 46 2d 38 20 28 69 me into UTF-8 (i
20fc0 2e 65 2e 20 69 66 20 69 74 20 69 73 20 55 54 46 .e. if it is UTF
20fd0 2d 31 36 20 72 69 67 68 74 20 6e 6f 77 29 2e 0a -16 right now)..
20fe0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 */.
20ff0 20 20 20 20 20 20 20 69 66 28 20 6f 73 49 73 4e if( osIsN
21000 54 28 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 T() ){.
21010 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 20 3d char *zUtf8 =
21020 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 winUnicodeToUtf
21030 38 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 8(zConverted);.
21040 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 if( !
21050 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 20 zUtf8 ){.
21060 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 sqlite3_f
21070 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b ree(zConverted);
21080 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 . s
21090 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 qlite3_free(zBuf
210a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 );.
210b0 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d OSTRACE(("TEMP-
210c0 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 FILENAME rc=SQLI
210d0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e TE_IOERR_NOMEM\n
210e0 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 "));.
210f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 return SQLITE
21100 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 _IOERR_NOMEM;.
21110 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 }.
21120 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f sqlite3_
21130 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 33 30 snprintf(nBuf-30
21140 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 55 , zBuf, "%s", zU
21150 74 66 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20 tf8);.
21160 20 20 77 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 69 winMakeEndInDi
21170 72 53 65 70 28 6e 42 75 66 2d 33 30 2c 20 7a 42 rSep(nBuf-30, zB
21180 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 uf);.
21190 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 sqlite3_free(zU
211a0 74 66 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20 tf8);.
211b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a sqlite3_free(z
211c0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 Converted);.
211d0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 break;.
211e0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a }else{.
211f0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 sqli
21200 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 te3_snprintf(nBu
21210 66 2d 33 30 2c 20 7a 42 75 66 2c 20 22 25 73 22 f-30, zBuf, "%s"
21220 2c 20 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 , zConverted);.
21230 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 4d 61 winMa
21240 6b 65 45 6e 64 49 6e 44 69 72 53 65 70 28 6e 42 keEndInDirSep(nB
21250 75 66 2d 33 30 2c 20 7a 42 75 66 29 3b 0a 20 20 uf-30, zBuf);.
21260 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 sqlite
21270 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 3_free(zConverte
21280 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 d);.
21290 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 break;.
212a0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 }. }.
212b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 sqlite3_fre
212c0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 e(zConverted);.
212d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d }. }. }
212e0 0a 23 65 6c 69 66 20 21 53 51 4c 49 54 45 5f 4f .#elif !SQLITE_O
212f0 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 S_WINRT && !defi
21300 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a ned(__CYGWIN__).
21310 20 20 65 6c 73 65 20 69 66 28 20 6f 73 49 73 4e else if( osIsN
21320 54 28 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 T() ){. char
21330 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 4c 50 57 *zMulti;. LPW
21340 53 54 52 20 7a 57 69 64 65 50 61 74 68 20 3d 20 STR zWidePath =
21350 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 sqlite3MallocZer
21360 6f 28 20 6e 42 75 66 2a 73 69 7a 65 6f 66 28 57 o( nBuf*sizeof(W
21370 43 48 41 52 29 20 29 3b 0a 20 20 20 20 69 66 28 CHAR) );. if(
21380 20 21 7a 57 69 64 65 50 61 74 68 20 29 7b 0a 20 !zWidePath ){.
21390 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 sqlite3_fre
213a0 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f e(zBuf);. O
213b0 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 STRACE(("TEMP-FI
213c0 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 LENAME rc=SQLITE
213d0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 _IOERR_NOMEM\n")
213e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 );. return
213f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d SQLITE_IOERR_NOM
21400 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 EM;. }. if
21410 28 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57 ( osGetTempPathW
21420 28 6e 42 75 66 2c 20 7a 57 69 64 65 50 61 74 68 (nBuf, zWidePath
21430 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 )==0 ){. sq
21440 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 lite3_free(zWide
21450 50 61 74 68 29 3b 0a 20 20 20 20 20 20 73 71 6c Path);. sql
21460 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b ite3_free(zBuf);
21470 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 . OSTRACE((
21480 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 "TEMP-FILENAME r
21490 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 c=SQLITE_IOERR_G
214a0 45 54 54 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b ETTEMPPATH\n"));
214b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 . return wi
214c0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 nLogError(SQLITE
214d0 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 _IOERR_GETTEMPPA
214e0 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 TH, osGetLastErr
214f0 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 or(),.
21500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 "
21510 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 31 22 winGetTempname1"
21520 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 , 0);. }.
21530 7a 4d 75 6c 74 69 20 3d 20 77 69 6e 55 6e 69 63 zMulti = winUnic
21540 6f 64 65 54 6f 55 74 66 38 28 7a 57 69 64 65 50 odeToUtf8(zWideP
21550 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d ath);. if( zM
21560 75 6c 74 69 20 29 7b 0a 20 20 20 20 20 20 73 71 ulti ){. sq
21570 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e lite3_snprintf(n
21580 42 75 66 2d 33 30 2c 20 7a 42 75 66 2c 20 22 25 Buf-30, zBuf, "%
21590 73 22 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 s", zMulti);.
215a0 20 20 20 77 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 winMakeEndInD
215b0 69 72 53 65 70 28 6e 42 75 66 2d 33 30 2c 20 7a irSep(nBuf-30, z
215c0 42 75 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 Buf);. sqli
215d0 74 65 33 5f 66 72 65 65 28 7a 4d 75 6c 74 69 29 te3_free(zMulti)
215e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f ;. sqlite3_
215f0 66 72 65 65 28 7a 57 69 64 65 50 61 74 68 29 3b free(zWidePath);
21600 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 . }else{.
21610 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a sqlite3_free(z
21620 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 20 WidePath);.
21630 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 sqlite3_free(zB
21640 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 uf);. OSTRA
21650 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 CE(("TEMP-FILENA
21660 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 ME rc=SQLITE_IOE
21670 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 RR_NOMEM\n"));.
21680 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 return SQLI
21690 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a TE_IOERR_NOMEM;.
216a0 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 }. }.#ifdef
216b0 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 SQLITE_WIN32_HA
216c0 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 S_ANSI. else{.
216d0 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 3b 0a char *zUtf8;.
216e0 20 20 20 20 63 68 61 72 20 2a 7a 4d 62 63 73 50 char *zMbcsP
216f0 61 74 68 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c ath = sqlite3Mal
21700 6c 6f 63 5a 65 72 6f 28 20 6e 42 75 66 20 29 3b locZero( nBuf );
21710 0a 20 20 20 20 69 66 28 20 21 7a 4d 62 63 73 50 . if( !zMbcsP
21720 61 74 68 20 29 7b 0a 20 20 20 20 20 20 73 71 6c ath ){. sql
21730 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b ite3_free(zBuf);
21740 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 . OSTRACE((
21750 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 "TEMP-FILENAME r
21760 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e c=SQLITE_IOERR_N
21770 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 OMEM\n"));.
21780 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 return SQLITE_I
21790 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 OERR_NOMEM;.
217a0 7d 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 54 }. if( osGetT
217b0 65 6d 70 50 61 74 68 41 28 6e 42 75 66 2c 20 7a empPathA(nBuf, z
217c0 4d 62 63 73 50 61 74 68 29 3d 3d 30 20 29 7b 0a MbcsPath)==0 ){.
217d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 sqlite3_fr
217e0 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 ee(zBuf);.
217f0 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 OSTRACE(("TEMP-F
21800 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 ILENAME rc=SQLIT
21810 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 E_IOERR_GETTEMPP
21820 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 ATH\n"));.
21830 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 return winLogErr
21840 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f or(SQLITE_IOERR_
21850 47 45 54 54 45 4d 50 50 41 54 48 2c 20 6f 73 47 GETTEMPPATH, osG
21860 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 etLastError(),.
21870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
21880 20 20 20 20 20 20 20 20 22 77 69 6e 47 65 74 54 "winGetT
21890 65 6d 70 6e 61 6d 65 32 22 2c 20 30 29 3b 0a 20 empname2", 0);.
218a0 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 20 3d }. zUtf8 =
218b0 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d sqlite3_win32_m
218c0 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 4d 62 63 bcs_to_utf8(zMbc
218d0 73 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 sPath);. if(
218e0 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 73 zUtf8 ){. s
218f0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 qlite3_snprintf(
21900 6e 42 75 66 2d 33 30 2c 20 7a 42 75 66 2c 20 22 nBuf-30, zBuf, "
21910 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 %s", zUtf8);.
21920 20 20 20 77 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 winMakeEndInD
21930 69 72 53 65 70 28 6e 42 75 66 2d 33 30 2c 20 7a irSep(nBuf-30, z
21940 42 75 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 Buf);. sqli
21950 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b te3_free(zUtf8);
21960 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 . }else{.
21970 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a sqlite3_free(z
21980 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 Buf);. OSTR
21990 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e ACE(("TEMP-FILEN
219a0 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f AME rc=SQLITE_IO
219b0 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a ERR_NOMEM\n"));.
219c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c return SQL
219d0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b ITE_IOERR_NOMEM;
219e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 . }. }.#endi
219f0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 f /* SQLITE_WIN3
21a00 32 5f 48 41 53 5f 41 4e 53 49 20 2a 2f 0a 23 65 2_HAS_ANSI */.#e
21a10 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f ndif /* !SQLITE_
21a20 4f 53 5f 57 49 4e 52 54 20 2a 2f 0a 0a 20 20 2f OS_WINRT */.. /
21a30 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 * Check that the
21a40 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 output buffer i
21a50 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 s large enough f
21a60 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 or the temporary
21a70 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 file . ** name
21a80 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 . If it is not,
21a90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 return SQLITE_ER
21aa0 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 6e 4c 65 6e ROR.. */. nLen
21ab0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e = sqlite3Strlen
21ac0 33 30 28 7a 42 75 66 29 3b 0a 0a 20 20 69 66 28 30(zBuf);.. if(
21ad0 20 28 6e 4c 65 6e 20 2b 20 73 71 6c 69 74 65 33 (nLen + sqlite3
21ae0 53 74 72 6c 65 6e 33 30 28 53 51 4c 49 54 45 5f Strlen30(SQLITE_
21af0 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 TEMP_FILE_PREFIX
21b00 29 20 2b 20 31 38 29 20 3e 3d 20 6e 42 75 66 20 ) + 18) >= nBuf
21b10 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 ){. sqlite3_f
21b20 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 4f ree(zBuf);. O
21b30 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 STRACE(("TEMP-FI
21b40 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 LENAME rc=SQLITE
21b50 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 _ERROR\n"));.
21b60 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 return winLogEr
21b70 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 ror(SQLITE_ERROR
21b80 2c 20 30 2c 20 22 77 69 6e 47 65 74 54 65 6d 70 , 0, "winGetTemp
21b90 6e 61 6d 65 33 22 2c 20 30 29 3b 0a 20 20 7d 0a name3", 0);. }.
21ba0 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 . sqlite3_snpri
21bb0 6e 74 66 28 6e 42 75 66 2d 31 38 2d 6e 4c 65 6e ntf(nBuf-18-nLen
21bc0 2c 20 7a 42 75 66 2b 6e 4c 65 6e 2c 20 53 51 4c , zBuf+nLen, SQL
21bd0 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 ITE_TEMP_FILE_PR
21be0 45 46 49 58 29 3b 0a 0a 20 20 6a 20 3d 20 73 71 EFIX);.. j = sq
21bf0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 lite3Strlen30(zB
21c00 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 uf);. sqlite3_r
21c10 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a andomness(15, &z
21c20 42 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69 Buf[j]);. for(i
21c30 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a =0; i<15; i++, j
21c40 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d ++){. zBuf[j]
21c50 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b = (char)zChars[
21c60 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 ((unsigned char
21c70 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f )zBuf[j])%(sizeo
21c80 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a f(zChars)-1) ];.
21c90 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 }. zBuf[j] =
21ca0 30 3b 0a 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 0;. zBuf[j+1] =
21cb0 20 30 3b 0a 20 20 2a 70 7a 42 75 66 20 3d 20 7a 0;. *pzBuf = z
21cc0 42 75 66 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 Buf;.. OSTRACE(
21cd0 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 ("TEMP-FILENAME
21ce0 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 name=%s, rc=SQLI
21cf0 54 45 5f 4f 4b 5c 6e 22 2c 20 7a 42 75 66 29 29 TE_OK\n", zBuf))
21d00 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 ;. return SQLIT
21d10 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 E_OK;.}../*.** R
21d20 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 eturn TRUE if th
21d30 65 20 6e 61 6d 65 64 20 66 69 6c 65 20 69 73 20 e named file is
21d40 72 65 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f really a directo
21d50 72 79 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 ry. Return fals
21d60 65 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 73 6f e if.** it is so
21d70 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 mething other th
21d80 61 6e 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 an a directory,
21d90 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 20 61 or if there is a
21da0 6e 79 20 6b 69 6e 64 20 6f 66 20 6d 65 6d 6f 72 ny kind of memor
21db0 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 y.** allocation
21dc0 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 failure..*/.stat
21dd0 69 63 20 69 6e 74 20 77 69 6e 49 73 44 69 72 28 ic int winIsDir(
21de0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 43 6f 6e const void *zCon
21df0 76 65 72 74 65 64 29 7b 0a 20 20 44 57 4f 52 44 verted){. DWORD
21e00 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 attr;. int rc
21e10 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 = 0;. DWORD las
21e20 74 45 72 72 6e 6f 3b 0a 0a 20 20 69 66 28 20 6f tErrno;.. if( o
21e30 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 69 sIsNT() ){. i
21e40 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 nt cnt = 0;.
21e50 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 WIN32_FILE_ATTRI
21e60 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72 44 BUTE_DATA sAttrD
21e70 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 ata;. memset(
21e80 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73 &sAttrData, 0, s
21e90 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29 izeof(sAttrData)
21ea0 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28 );. while( !(
21eb0 72 63 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 rc = osGetFileAt
21ec0 74 72 69 62 75 74 65 73 45 78 57 28 28 4c 50 43 tributesExW((LPC
21ed0 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c WSTR)zConverted,
21ee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
21ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 47 65 Ge
21f00 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 tFileExInfoStand
21f10 61 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 ard,.
21f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
21f30 20 20 26 73 41 74 74 72 44 61 74 61 29 29 20 26 &sAttrData)) &
21f40 26 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 & winRetryIoerr(
21f50 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f &cnt, &lastErrno
21f60 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 21 72 ) ){}. if( !r
21f70 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 c ){. retur
21f80 6e 20 30 3b 20 2f 2a 20 49 6e 76 61 6c 69 64 20 n 0; /* Invalid
21f90 6e 61 6d 65 3f 20 2a 2f 0a 20 20 20 20 7d 0a 20 name? */. }.
21fa0 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72 44 attr = sAttrD
21fb0 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 ata.dwFileAttrib
21fc0 75 74 65 73 3b 0a 23 69 66 20 53 51 4c 49 54 45 utes;.#if SQLITE
21fd0 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d _OS_WINCE==0. }
21fe0 65 6c 73 65 7b 0a 20 20 20 20 61 74 74 72 20 3d else{. attr =
21ff0 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 osGetFileAttrib
22000 75 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f utesA((char*)zCo
22010 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 nverted);.#endif
22020 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 61 . }. return (a
22030 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c ttr!=INVALID_FIL
22040 45 5f 41 54 54 52 49 42 55 54 45 53 29 20 26 26 E_ATTRIBUTES) &&
22050 20 28 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52 (attr&FILE_ATTR
22060 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 29 IBUTE_DIRECTORY)
22070 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 ;.}../*.** Open
22080 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 a file..*/.stati
22090 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 0a 20 c int winOpen(.
220a0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 sqlite3_vfs *pV
220b0 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 55 73 fs, /* Us
220c0 65 64 20 74 6f 20 67 65 74 20 6d 61 78 69 6d 75 ed to get maximu
220d0 6d 20 70 61 74 68 20 6e 61 6d 65 20 6c 65 6e 67 m path name leng
220e0 74 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 th */. const ch
220f0 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 ar *zName,
22100 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 /* Name of the
22110 20 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f file (UTF-8) */
22120 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 . sqlite3_file
22130 2a 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 *id, /*
22140 57 72 69 74 65 20 74 68 65 20 53 51 4c 69 74 65 Write the SQLite
22150 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 file handle her
22160 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 e */. int flags
22170 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
22180 20 2f 2a 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c /* Open mode fl
22190 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f ags */. int *pO
221a0 75 74 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 utFlags
221b0 20 20 20 2f 2a 20 53 74 61 74 75 73 20 72 65 74 /* Status ret
221c0 75 72 6e 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a urn flags */.){.
221d0 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57 HANDLE h;. DW
221e0 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 ORD lastErrno;.
221f0 20 44 57 4f 52 44 20 64 77 44 65 73 69 72 65 64 DWORD dwDesired
22200 41 63 63 65 73 73 3b 0a 20 20 44 57 4f 52 44 20 Access;. DWORD
22210 64 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20 20 44 dwShareMode;. D
22220 57 4f 52 44 20 64 77 43 72 65 61 74 69 6f 6e 44 WORD dwCreationD
22230 69 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 44 57 isposition;. DW
22240 4f 52 44 20 64 77 46 6c 61 67 73 41 6e 64 41 74 ORD dwFlagsAndAt
22250 74 72 69 62 75 74 65 73 20 3d 20 30 3b 0a 23 69 tributes = 0;.#i
22260 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 f SQLITE_OS_WINC
22270 45 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20 3d E. int isTemp =
22280 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 0;.#endif. win
22290 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 File *pFile = (w
222a0 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 76 6f inFile*)id;. vo
222b0 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 20 id *zConverted;
222c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
222d0 46 69 6c 65 6e 61 6d 65 20 69 6e 20 4f 53 20 65 Filename in OS e
222e0 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e ncoding */. con
222f0 73 74 20 63 68 61 72 20 2a 7a 55 74 66 38 4e 61 st char *zUtf8Na
22300 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a 20 46 me = zName; /* F
22310 69 6c 65 6e 61 6d 65 20 69 6e 20 55 54 46 2d 38 ilename in UTF-8
22320 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 encoding */. i
22330 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f nt cnt = 0;.. /
22340 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 * If argument zP
22350 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f ath is a NULL po
22360 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 inter, this func
22370 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 tion is required
22380 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 to open. ** a
22390 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 temporary file.
223a0 55 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20 Use this buffer
223b0 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c to store the fil
223c0 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a e name in.. */.
223d0 20 20 63 68 61 72 20 2a 7a 54 6d 70 6e 61 6d 65 char *zTmpname
223e0 20 3d 20 30 3b 20 2f 2a 20 46 6f 72 20 74 65 6d = 0; /* For tem
223f0 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 2c porary filename,
22400 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 2a if necessary. *
22410 2f 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 /.. int rc = SQ
22420 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 LITE_OK;
22430 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 /* Function
22440 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 23 Return Code */.#
22450 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 if !defined(NDEB
22460 55 47 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 UG) || SQLITE_OS
22470 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 65 54 79 _WINCE. int eTy
22480 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 pe = flags&0xFFF
22490 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 FFF00; /* Type
224a0 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 of file to open
224b0 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e 74 */.#endif.. int
224c0 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20 isExclusive =
224d0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f (flags & SQLITE_
224e0 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b OPEN_EXCLUSIVE);
224f0 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 . int isDelete
22500 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 = (flags & S
22510 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 QLITE_OPEN_DELET
22520 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 EONCLOSE);. int
22530 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d 20 isCreate =
22540 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f (flags & SQLITE_
22550 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 OPEN_CREATE);.
22560 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 int isReadonly
22570 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 = (flags & SQLI
22580 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 TE_OPEN_READONLY
22590 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57 );. int isReadW
225a0 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26 rite = (flags &
225b0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 SQLITE_OPEN_REA
225c0 44 57 52 49 54 45 29 3b 0a 0a 23 69 66 6e 64 65 DWRITE);..#ifnde
225d0 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 69 f NDEBUG. int i
225e0 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 sOpenJournal = (
225f0 69 73 43 72 65 61 74 65 20 26 26 20 28 0a 20 20 isCreate && (.
22600 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c eType==SQL
22610 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f ITE_OPEN_MASTER_
22620 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c JOURNAL . ||
22630 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f eType==SQLITE_O
22640 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c PEN_MAIN_JOURNAL
22650 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d . || eType=
22660 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c =SQLITE_OPEN_WAL
22670 0a 20 20 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 . ));.#endif..
22680 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 OSTRACE(("OPEN
22690 6e 61 6d 65 3d 25 73 2c 20 70 46 69 6c 65 3d 25 name=%s, pFile=%
226a0 70 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70 4f 75 p, flags=%x, pOu
226b0 74 46 6c 61 67 73 3d 25 70 5c 6e 22 2c 0a 20 20 tFlags=%p\n",.
226c0 20 20 20 20 20 20 20 20 20 7a 55 74 66 38 4e 61 zUtf8Na
226d0 6d 65 2c 20 69 64 2c 20 66 6c 61 67 73 2c 20 70 me, id, flags, p
226e0 4f 75 74 46 6c 61 67 73 29 29 3b 0a 0a 20 20 2f OutFlags));.. /
226f0 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c * Check the foll
22700 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 owing statements
22710 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a are true: . **
22720 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 . ** (a) Exac
22730 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 tly one of the R
22740 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 EADWRITE and REA
22750 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 DONLY flags must
22760 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 be set, and .
22770 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41 ** (b) if CREA
22780 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 TE is set, then
22790 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 READWRITE must a
227a0 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a lso be set, and.
227b0 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 ** (c) if EX
227c0 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 CLUSIVE is set,
227d0 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 then CREATE must
227e0 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 also be set..
227f0 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 ** (d) if DELE
22800 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 TEONCLOSE is set
22810 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 , then CREATE mu
22820 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a st also be set..
22830 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 */. assert((i
22840 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 sReadonly==0 ||
22850 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 isReadWrite==0)
22860 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20 && (isReadWrite
22870 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b || isReadonly));
22880 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61 . assert(isCrea
22890 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 te==0 || isReadW
228a0 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 rite);. assert(
228b0 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c isExclusive==0 |
228c0 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 | isCreate);. a
228d0 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d ssert(isDelete==
228e0 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0 || isCreate);.
228f0 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 . /* The main D
22900 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c B, main journal,
22910 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 WAL file and ma
22920 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 ster journal are
22930 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 never . ** aut
22940 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 omatically delet
22950 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 ed. Nor are they
22960 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20 ever temporary
22970 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 files. */. ass
22980 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 ert( (!isDelete
22990 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 && zName) || eTy
229a0 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f pe!=SQLITE_OPEN_
229b0 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 MAIN_DB );. ass
229c0 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 ert( (!isDelete
229d0 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 && zName) || eTy
229e0 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f pe!=SQLITE_OPEN_
229f0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a MAIN_JOURNAL );.
22a00 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 assert( (!isDe
22a10 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c lete && zName) |
22a20 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f | eType!=SQLITE_
22a30 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 OPEN_MASTER_JOUR
22a40 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 NAL );. assert(
22a50 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a (!isDelete && z
22a60 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d Name) || eType!=
22a70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 SQLITE_OPEN_WAL
22a80 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 );.. /* Assert
22a90 74 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c that the upper l
22aa0 61 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 ayer has set one
22ab0 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 of the "file-ty
22ac0 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 pe" flags. */.
22ad0 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 assert( eType==S
22ae0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f QLITE_OPEN_MAIN_
22af0 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 DB || eType
22b00 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 ==SQLITE_OPEN_TE
22b10 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c MP_DB . ||
22b20 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f eType==SQLITE_O
22b30 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c PEN_MAIN_JOURNAL
22b40 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 || eType==SQLIT
22b50 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 E_OPEN_TEMP_JOUR
22b60 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 NAL . || e
22b70 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 Type==SQLITE_OPE
22b80 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c N_SUBJOURNAL |
22b90 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f | eType==SQLITE_
22ba0 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 OPEN_MASTER_JOUR
22bb0 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 NAL . || e
22bc0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 Type==SQLITE_OPE
22bd0 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c N_TRANSIENT_DB |
22be0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f | eType==SQLITE_
22bf0 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 OPEN_WAL. );..
22c00 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d assert( pFile!=
22c10 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 0 );. memset(pF
22c20 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 ile, 0, sizeof(w
22c30 69 6e 46 69 6c 65 29 29 3b 0a 20 20 70 46 69 6c inFile));. pFil
22c40 65 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 e->h = INVALID_H
22c50 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a 23 69 ANDLE_VALUE;..#i
22c60 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 f SQLITE_OS_WINR
22c70 54 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61 T. if( !zUtf8Na
22c80 6d 65 20 26 26 20 21 73 71 6c 69 74 65 33 5f 74 me && !sqlite3_t
22c90 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b emp_directory ){
22ca0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 . sqlite3_log
22cb0 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 0a 20 (SQLITE_ERROR,.
22cc0 20 20 20 20 20 20 20 22 73 71 6c 69 74 65 33 5f "sqlite3_
22cd0 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 76 temp_directory v
22ce0 61 72 69 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 ariable should b
22cf0 65 20 73 65 74 20 66 6f 72 20 57 69 6e 52 54 22 e set for WinRT"
22d00 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 );. }.#endif..
22d10 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e /* If the secon
22d20 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 d argument to th
22d30 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e is function is N
22d40 55 4c 4c 2c 20 67 65 6e 65 72 61 74 65 20 61 20 ULL, generate a
22d50 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 . ** temporary
22d60 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20 75 73 65 file name to use
22d70 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 7a 55 . */. if( !zU
22d80 74 66 38 4e 61 6d 65 20 29 7b 0a 20 20 20 20 61 tf8Name ){. a
22d90 73 73 65 72 74 28 20 69 73 44 65 6c 65 74 65 20 ssert( isDelete
22da0 26 26 20 21 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 && !isOpenJourna
22db0 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 l );. rc = wi
22dc0 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 56 66 nGetTempname(pVf
22dd0 73 2c 20 26 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 s, &zTmpname);.
22de0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 if( rc!=SQLIT
22df0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 E_OK ){. OS
22e00 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d TRACE(("OPEN nam
22e10 65 3d 25 73 2c 20 72 63 3d 25 73 22 2c 20 7a 55 e=%s, rc=%s", zU
22e20 74 66 38 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 tf8Name, sqlite3
22e30 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 ErrName(rc)));.
22e40 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a return rc;.
22e50 20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 4e }. zUtf8N
22e60 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a ame = zTmpname;.
22e70 20 20 7d 0a 0a 20 20 2f 2a 20 44 61 74 61 62 61 }.. /* Databa
22e80 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 se filenames are
22e90 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 double-zero ter
22ea0 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65 79 20 minated if they
22eb0 61 72 65 20 6e 6f 74 0a 20 20 2a 2a 20 55 52 49 are not. ** URI
22ec0 73 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 s with parameter
22ed0 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20 s. Hence, they
22ee0 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61 can always be pa
22ef0 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 ssed into. ** s
22f00 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d qlite3_uri_param
22f10 65 74 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 eter().. */. a
22f20 73 73 65 72 74 28 20 28 65 54 79 70 65 21 3d 53 ssert( (eType!=S
22f30 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f QLITE_OPEN_MAIN_
22f40 44 42 29 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 DB) || (flags &
22f50 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 SQLITE_OPEN_URI)
22f60 20 7c 7c 0a 20 20 20 20 20 20 20 7a 55 74 66 38 ||. zUtf8
22f70 4e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72 6c Name[sqlite3Strl
22f80 65 6e 33 30 28 7a 55 74 66 38 4e 61 6d 65 29 2b en30(zUtf8Name)+
22f90 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 1]==0 );.. /* C
22fa0 6f 6e 76 65 72 74 20 74 68 65 20 66 69 6c 65 6e onvert the filen
22fb0 61 6d 65 20 74 6f 20 74 68 65 20 73 79 73 74 65 ame to the syste
22fc0 6d 20 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 m encoding. */.
22fd0 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 zConverted = wi
22fe0 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 nConvertFromUtf8
22ff0 46 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38 4e 61 Filename(zUtf8Na
23000 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 me);. if( zConv
23010 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 erted==0 ){.
23020 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d sqlite3_free(zTm
23030 70 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52 pname);. OSTR
23040 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d ACE(("OPEN name=
23050 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f %s, rc=SQLITE_IO
23060 45 52 52 5f 4e 4f 4d 45 4d 22 2c 20 7a 55 74 66 ERR_NOMEM", zUtf
23070 38 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 8Name));. ret
23080 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 urn SQLITE_IOERR
23090 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 69 _NOMEM;. }.. i
230a0 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e f( winIsDir(zCon
230b0 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 73 verted) ){. s
230c0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e qlite3_free(zCon
230d0 76 65 72 74 65 64 29 3b 0a 20 20 20 20 73 71 6c verted);. sql
230e0 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 ite3_free(zTmpna
230f0 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 me);. OSTRACE
23100 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c (("OPEN name=%s,
23110 20 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f rc=SQLITE_CANTO
23120 50 45 4e 5f 49 53 44 49 52 22 2c 20 7a 55 74 66 PEN_ISDIR", zUtf
23130 38 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 8Name));. ret
23140 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f urn SQLITE_CANTO
23150 50 45 4e 5f 49 53 44 49 52 3b 0a 20 20 7d 0a 0a PEN_ISDIR;. }..
23160 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 if( isReadWrit
23170 65 20 29 7b 0a 20 20 20 20 64 77 44 65 73 69 72 e ){. dwDesir
23180 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52 edAccess = GENER
23190 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49 IC_READ | GENERI
231a0 43 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73 65 C_WRITE;. }else
231b0 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65 64 41 {. dwDesiredA
231c0 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f ccess = GENERIC_
231d0 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 READ;. }.. /*
231e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c SQLITE_OPEN_EXCL
231f0 55 53 49 56 45 20 69 73 20 75 73 65 64 20 74 6f USIVE is used to
23200 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 make sure that
23210 61 20 6e 65 77 20 66 69 6c 65 20 69 73 20 0a 20 a new file is .
23220 20 2a 2a 20 63 72 65 61 74 65 64 2e 20 53 51 4c ** created. SQL
23230 69 74 65 20 64 6f 65 73 6e 27 74 20 75 73 65 20 ite doesn't use
23240 69 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20 22 it to indicate "
23250 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 exclusive access
23260 22 20 0a 20 20 2a 2a 20 61 73 20 69 74 20 69 73 " . ** as it is
23270 20 75 73 75 61 6c 6c 79 20 75 6e 64 65 72 73 74 usually underst
23280 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 ood.. */. if(
23290 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 isExclusive ){.
232a0 20 20 20 2f 2a 20 43 72 65 61 74 65 73 20 61 20 /* Creates a
232b0 6e 65 77 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 new file, only i
232c0 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c f it does not al
232d0 72 65 61 64 79 20 65 78 69 73 74 2e 20 2a 2f 0a ready exist. */.
232e0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 /* If the fi
232f0 6c 65 20 65 78 69 73 74 73 2c 20 69 74 20 66 61 le exists, it fa
23300 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 ils. */. dwCr
23310 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f eationDispositio
23320 6e 20 3d 20 43 52 45 41 54 45 5f 4e 45 57 3b 0a n = CREATE_NEW;.
23330 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 43 72 }else if( isCr
23340 65 61 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f eate ){. /* O
23350 70 65 6e 20 65 78 69 73 74 69 6e 67 20 66 69 6c pen existing fil
23360 65 2c 20 6f 72 20 63 72 65 61 74 65 20 69 66 20 e, or create if
23370 69 74 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74 it doesn't exist
23380 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 */. dwCreati
23390 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 onDisposition =
233a0 4f 50 45 4e 5f 41 4c 57 41 59 53 3b 0a 20 20 7d OPEN_ALWAYS;. }
233b0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 else{. /* Ope
233c0 6e 73 20 61 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 ns a file, only
233d0 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 2a 2f if it exists. */
233e0 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 . dwCreationD
233f0 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 isposition = OPE
23400 4e 5f 45 58 49 53 54 49 4e 47 3b 0a 20 20 7d 0a N_EXISTING;. }.
23410 0a 20 20 64 77 53 68 61 72 65 4d 6f 64 65 20 3d . dwShareMode =
23420 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 FILE_SHARE_READ
23430 20 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 | FILE_SHARE_WR
23440 49 54 45 3b 0a 0a 20 20 69 66 28 20 69 73 44 65 ITE;.. if( isDe
23450 6c 65 74 65 20 29 7b 0a 23 69 66 20 53 51 4c 49 lete ){.#if SQLI
23460 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 TE_OS_WINCE.
23470 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 dwFlagsAndAttrib
23480 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 utes = FILE_ATTR
23490 49 42 55 54 45 5f 48 49 44 44 45 4e 3b 0a 20 20 IBUTE_HIDDEN;.
234a0 20 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 65 isTemp = 1;.#e
234b0 6c 73 65 0a 20 20 20 20 64 77 46 6c 61 67 73 41 lse. dwFlagsA
234c0 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 ndAttributes = F
234d0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 54 45 ILE_ATTRIBUTE_TE
234e0 4d 50 4f 52 41 52 59 0a 20 20 20 20 20 20 20 20 MPORARY.
234f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23500 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 41 54 | FILE_AT
23510 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e 0a 20 TRIBUTE_HIDDEN.
23520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 |
23540 46 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45 FILE_FLAG_DELETE
23550 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64 69 _ON_CLOSE;.#endi
23560 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 f. }else{. d
23570 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 wFlagsAndAttribu
23580 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 tes = FILE_ATTRI
23590 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d BUTE_NORMAL;. }
235a0 0a 20 20 2f 2a 20 52 65 70 6f 72 74 73 20 66 72 . /* Reports fr
235b0 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 65 74 20 om the internet
235c0 61 72 65 20 74 68 61 74 20 70 65 72 66 6f 72 6d are that perform
235d0 61 6e 63 65 20 69 73 20 61 6c 77 61 79 73 0a 20 ance is always.
235e0 20 2a 2a 20 62 65 74 74 65 72 20 69 66 20 46 49 ** better if FI
235f0 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 LE_FLAG_RANDOM_A
23600 43 43 45 53 53 20 69 73 20 75 73 65 64 2e 20 20 CCESS is used.
23610 54 69 63 6b 65 74 20 23 32 36 39 39 2e 20 2a 2f Ticket #2699. */
23620 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 .#if SQLITE_OS_W
23630 49 4e 43 45 0a 20 20 64 77 46 6c 61 67 73 41 6e INCE. dwFlagsAn
23640 64 41 74 74 72 69 62 75 74 65 73 20 7c 3d 20 46 dAttributes |= F
23650 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f ILE_FLAG_RANDOM_
23660 41 43 43 45 53 53 3b 0a 23 65 6e 64 69 66 0a 0a ACCESS;.#endif..
23670 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 if( osIsNT() )
23680 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f {.#if SQLITE_OS_
23690 57 49 4e 52 54 0a 20 20 20 20 43 52 45 41 54 45 WINRT. CREATE
236a0 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 FILE2_EXTENDED_P
236b0 41 52 41 4d 45 54 45 52 53 20 65 78 74 65 6e 64 ARAMETERS extend
236c0 65 64 50 61 72 61 6d 65 74 65 72 73 3b 0a 20 20 edParameters;.
236d0 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 extendedParame
236e0 74 65 72 73 2e 64 77 53 69 7a 65 20 3d 20 73 69 ters.dwSize = si
236f0 7a 65 6f 66 28 43 52 45 41 54 45 46 49 4c 45 32 zeof(CREATEFILE2
23700 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 _EXTENDED_PARAME
23710 54 45 52 53 29 3b 0a 20 20 20 20 65 78 74 65 6e TERS);. exten
23720 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 dedParameters.dw
23730 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 20 3d FileAttributes =
23740 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46 . dwF
23750 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 lagsAndAttribute
23760 73 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 s & FILE_ATTRIBU
23770 54 45 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74 TE_MASK;. ext
23780 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e endedParameters.
23790 64 77 46 69 6c 65 46 6c 61 67 73 20 3d 20 64 77 dwFileFlags = dw
237a0 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 FlagsAndAttribut
237b0 65 73 20 26 20 46 49 4c 45 5f 46 4c 41 47 5f 4d es & FILE_FLAG_M
237c0 41 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 ASK;. extende
237d0 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53 65 dParameters.dwSe
237e0 63 75 72 69 74 79 51 6f 73 46 6c 61 67 73 20 3d curityQosFlags =
237f0 20 53 45 43 55 52 49 54 59 5f 41 4e 4f 4e 59 4d SECURITY_ANONYM
23800 4f 55 53 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 OUS;. extende
23810 64 50 61 72 61 6d 65 74 65 72 73 2e 6c 70 53 65 dParameters.lpSe
23820 63 75 72 69 74 79 41 74 74 72 69 62 75 74 65 73 curityAttributes
23830 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 65 78 74 = NULL;. ext
23840 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e endedParameters.
23850 68 54 65 6d 70 6c 61 74 65 46 69 6c 65 20 3d 20 hTemplateFile =
23860 4e 55 4c 4c 3b 0a 20 20 20 20 77 68 69 6c 65 28 NULL;. while(
23870 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69 (h = osCreateFi
23880 6c 65 32 28 28 4c 50 43 57 53 54 52 29 7a 43 6f le2((LPCWSTR)zCo
23890 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 nverted,.
238a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
238b0 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64 dwDesired
238c0 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 Access,.
238d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
238e0 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 dwShareMod
238f0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 e,.
23900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23910 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f dwCreationDispo
23920 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 sition,.
23930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23940 20 20 20 20 20 20 26 65 78 74 65 6e 64 65 64 50 &extendedP
23950 61 72 61 6d 65 74 65 72 73 29 29 3d 3d 49 4e 56 arameters))==INV
23960 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 ALID_HANDLE_VALU
23970 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 E &&.
23980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23990 20 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 winRetryIoerr
239a0 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e (&cnt, &lastErrn
239b0 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 o) ){.
239c0 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a /* Noop */.
239d0 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 }.#else.
239e0 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 while( (h = osCr
239f0 65 61 74 65 46 69 6c 65 57 28 28 4c 50 43 57 53 eateFileW((LPCWS
23a00 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 TR)zConverted,.
23a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23a20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 44 dwD
23a30 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 esiredAccess,.
23a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23a50 20 20 20 20 20 20 20 20 20 20 20 20 64 77 53 68 dwSh
23a60 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 areMode, NULL,.
23a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23a80 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 43 dwC
23a90 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 reationDispositi
23aa0 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 on,.
23ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23ac0 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 dwFlagsAndAttr
23ad0 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20 ibutes,.
23ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23af0 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e NULL))==IN
23b00 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c VALID_HANDLE_VAL
23b10 55 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 UE &&.
23b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23b30 20 20 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72 winRetryIoer
23b40 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 r(&cnt, &lastErr
23b50 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 no) ){.
23b60 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f /* Noop */
23b70 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 . }.#endif.
23b80 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f }.#ifdef SQLITE_
23b90 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 WIN32_HAS_ANSI.
23ba0 20 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 else{. while
23bb0 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 ( (h = osCreateF
23bc0 69 6c 65 41 28 28 4c 50 43 53 54 52 29 7a 43 6f ileA((LPCSTR)zCo
23bd0 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 nverted,.
23be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23bf0 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64 dwDesired
23c00 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 Access,.
23c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23c20 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 dwShareMod
23c30 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 e, NULL,.
23c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23c50 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f dwCreatio
23c60 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 nDisposition,.
23c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23c80 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c dwFl
23c90 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 agsAndAttributes
23ca0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
23cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23cc0 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f NULL))==INVALID_
23cd0 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a HANDLE_VALUE &&.
23ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69 wi
23d00 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 nRetryIoerr(&cnt
23d10 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b , &lastErrno) ){
23d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
23d30 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d /* Noop */. }
23d40 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 69 . }.#endif. wi
23d50 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a nLogIoerr(cnt);.
23d60 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 . OSTRACE(("OPE
23d70 4e 20 66 69 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d N file=%p, name=
23d80 25 73 2c 20 61 63 63 65 73 73 3d 25 6c 78 2c 20 %s, access=%lx,
23d90 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 rc=%s\n", h, zUt
23da0 66 38 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 f8Name,.
23db0 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 dwDesiredAcce
23dc0 73 73 2c 20 28 68 3d 3d 49 4e 56 41 4c 49 44 5f ss, (h==INVALID_
23dd0 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 3f 20 HANDLE_VALUE) ?
23de0 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 "failed" : "ok")
23df0 29 3b 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 );.. if( h==INV
23e00 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 ALID_HANDLE_VALU
23e10 45 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e E ){. pFile->
23e20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 lastErrno = last
23e30 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f Errno;. winLo
23e40 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 gError(SQLITE_CA
23e50 4e 54 4f 50 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c NTOPEN, pFile->l
23e60 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 4f 70 astErrno, "winOp
23e70 65 6e 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b en", zUtf8Name);
23e80 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 . sqlite3_fre
23e90 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 e(zConverted);.
23ea0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 sqlite3_free(
23eb0 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 zTmpname);. i
23ec0 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 26 f( isReadWrite &
23ed0 26 20 21 69 73 45 78 63 6c 75 73 69 76 65 20 29 & !isExclusive )
23ee0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 {. return w
23ef0 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e 61 inOpen(pVfs, zNa
23f00 6d 65 2c 20 69 64 2c 20 0a 20 20 20 20 20 20 20 me, id, .
23f10 20 20 28 28 66 6c 61 67 73 7c 53 51 4c 49 54 45 ((flags|SQLITE
23f20 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 20 _OPEN_READONLY)
23f30 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 &.
23f40 20 20 20 20 20 20 20 7e 28 53 51 4c 49 54 45 5f ~(SQLITE_
23f50 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 OPEN_CREATE|SQLI
23f60 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 TE_OPEN_READWRIT
23f70 45 29 29 2c 0a 20 20 20 20 20 20 20 20 20 70 4f E)),. pO
23f80 75 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65 utFlags);. }e
23f90 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 lse{. retur
23fa0 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 n SQLITE_CANTOPE
23fb0 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 N_BKPT;. }.
23fc0 7d 0a 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61 }.. if( pOutFla
23fd0 67 73 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 gs ){. if( is
23fe0 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 ReadWrite ){.
23ff0 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 *pOutFlags =
24000 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 SQLITE_OPEN_READ
24010 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 WRITE;. }else
24020 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 {. *pOutFla
24030 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e gs = SQLITE_OPEN
24040 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d _READONLY;. }
24050 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 . }.. OSTRACE(
24060 28 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c 20 ("OPEN file=%p,
24070 6e 61 6d 65 3d 25 73 2c 20 61 63 63 65 73 73 3d name=%s, access=
24080 25 6c 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d 25 %lx, pOutFlags=%
24090 70 2c 20 2a 70 4f 75 74 46 6c 61 67 73 3d 25 64 p, *pOutFlags=%d
240a0 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 , ". "
240b0 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 rc=%s\n", h, zUt
240c0 66 38 4e 61 6d 65 2c 20 64 77 44 65 73 69 72 65 f8Name, dwDesire
240d0 64 41 63 63 65 73 73 2c 20 70 4f 75 74 46 6c 61 dAccess, pOutFla
240e0 67 73 2c 20 70 4f 75 74 46 6c 61 67 73 20 3f 0a gs, pOutFlags ?.
240f0 20 20 20 20 20 20 20 20 20 20 20 2a 70 4f 75 74 *pOut
24100 46 6c 61 67 73 20 3a 20 30 2c 20 28 68 3d 3d 49 Flags : 0, (h==I
24110 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 NVALID_HANDLE_VA
24120 4c 55 45 29 20 3f 20 22 66 61 69 6c 65 64 22 20 LUE) ? "failed"
24130 3a 20 22 6f 6b 22 29 29 3b 0a 0a 23 69 66 20 53 : "ok"));..#if S
24140 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 QLITE_OS_WINCE.
24150 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 if( isReadWrite
24160 20 26 26 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 && eType==SQLIT
24170 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a 20 E_OPEN_MAIN_DB.
24180 20 20 20 20 20 20 26 26 20 28 72 63 20 3d 20 77 && (rc = w
24190 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 7a inceCreateLock(z
241a0 4e 61 6d 65 2c 20 70 46 69 6c 65 29 29 21 3d 53 Name, pFile))!=S
241b0 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 QLITE_OK. ){.
241c0 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 osCloseHandle(
241d0 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f h);. sqlite3_
241e0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 free(zConverted)
241f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 ;. sqlite3_fr
24200 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 ee(zTmpname);.
24210 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e OSTRACE(("OPEN
24220 2d 43 45 2d 4c 4f 43 4b 20 6e 61 6d 65 3d 25 73 -CE-LOCK name=%s
24230 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 7a 4e 61 6d , rc=%s\n", zNam
24240 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d e, sqlite3ErrNam
24250 65 28 72 63 29 29 29 3b 0a 20 20 20 20 72 65 74 e(rc)));. ret
24260 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 urn rc;. }. if
24270 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 ( isTemp ){.
24280 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e pFile->zDeleteOn
24290 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72 74 Close = zConvert
242a0 65 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 ed;. }else.#end
242b0 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 if. {. sqlit
242c0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 e3_free(zConvert
242d0 65 64 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 ed);. }.. sqli
242e0 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d te3_free(zTmpnam
242f0 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 e);. pFile->pMe
24300 74 68 6f 64 20 3d 20 26 77 69 6e 49 6f 4d 65 74 thod = &winIoMet
24310 68 6f 64 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 56 hod;. pFile->pV
24320 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 46 69 fs = pVfs;. pFi
24330 6c 65 2d 3e 68 20 3d 20 68 3b 0a 20 20 69 66 28 le->h = h;. if(
24340 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 isReadonly ){.
24350 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c pFile->ctrlFl
24360 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 52 ags |= WINFILE_R
24370 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 DONLY;. }. if(
24380 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f sqlite3_uri_boo
24390 6c 65 61 6e 28 7a 4e 61 6d 65 2c 20 22 70 73 6f lean(zName, "pso
243a0 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 w", SQLITE_POWER
243b0 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 20 SAFE_OVERWRITE)
243c0 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 ){. pFile->ct
243d0 72 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49 rlFlags |= WINFI
243e0 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 70 LE_PSOW;. }. p
243f0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 File->lastErrno
24400 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20 70 46 = NO_ERROR;. pF
24410 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 ile->zPath = zNa
24420 6d 65 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d me;.#if SQLITE_M
24430 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 AX_MMAP_SIZE>0.
24440 20 70 46 69 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e pFile->hMap = N
24450 55 4c 4c 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d ULL;. pFile->pM
24460 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 apRegion = 0;.
24470 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 pFile->mmapSize
24480 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d = 0;. pFile->mm
24490 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30 apSizeActual = 0
244a0 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 ;. pFile->mmapS
244b0 69 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 izeMax = sqlite3
244c0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d GlobalConfig.szM
244d0 6d 61 70 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f map;.#endif.. O
244e0 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a penCounter(+1);.
244f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a return rc;.}..
24500 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 /*.** Delete the
24510 20 6e 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a named file..**.
24520 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 57 69 6e ** Note that Win
24530 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c dows does not al
24540 6c 6f 77 20 61 20 66 69 6c 65 20 74 6f 20 62 65 low a file to be
24550 20 64 65 6c 65 74 65 64 20 69 66 20 73 6f 6d 65 deleted if some
24560 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 other.** proces
24570 73 20 68 61 73 20 69 74 20 6f 70 65 6e 2e 20 20 s has it open.
24580 53 6f 6d 65 74 69 6d 65 73 20 61 20 76 69 72 75 Sometimes a viru
24590 73 20 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64 s scanner or ind
245a0 65 78 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a exing program.**
245b0 20 77 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 will open a jou
245c0 72 6e 61 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c rnal file shortl
245d0 79 20 61 66 74 65 72 20 69 74 20 69 73 20 63 72 y after it is cr
245e0 65 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 eated in order t
245f0 6f 20 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72 o do.** whatever
24600 20 69 74 20 64 6f 65 73 2e 20 20 57 68 69 6c 65 it does. While
24610 20 74 68 69 73 20 6f 74 68 65 72 20 70 72 6f 63 this other proc
24620 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 ess is holding t
24630 68 65 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c he.** file open,
24640 20 77 65 20 77 69 6c 6c 20 62 65 20 75 6e 61 62 we will be unab
24650 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 69 74 2e le to delete it.
24660 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 To work around
24670 20 74 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d this.** problem
24680 2c 20 77 65 20 64 65 6c 61 79 20 31 30 30 20 6d , we delay 100 m
24690 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 illiseconds and
246a0 74 72 79 20 74 6f 20 64 65 6c 65 74 65 20 61 67 try to delete ag
246b0 61 69 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d ain. Up.** to M
246c0 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d X_DELETION_ATTEM
246d0 50 54 73 20 64 65 6c 65 74 69 6f 6e 20 61 74 74 PTs deletion att
246e0 65 6d 70 74 73 20 61 72 65 20 72 75 6e 20 62 65 empts are run be
246f0 66 6f 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75 fore giving.** u
24700 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 p and returning
24710 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 an error..*/.sta
24720 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 tic int winDelet
24730 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 e(. sqlite3_vfs
24740 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 *pVfs,
24750 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 /* Not used on
24760 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 win32 */. const
24770 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 char *zFilename
24780 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f , /* Name o
24790 66 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 f file to delete
247a0 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 */. int syncDi
247b0 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 r
247c0 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e /* Not used on
247d0 20 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 win32 */.){. i
247e0 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e nt cnt = 0;. in
247f0 74 20 72 63 3b 0a 20 20 44 57 4f 52 44 20 61 74 t rc;. DWORD at
24800 74 72 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 tr;. DWORD last
24810 45 72 72 6e 6f 3b 0a 20 20 76 6f 69 64 20 2a 7a Errno;. void *z
24820 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55 Converted;. UNU
24830 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 SED_PARAMETER(pV
24840 66 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 fs);. UNUSED_PA
24850 52 41 4d 45 54 45 52 28 73 79 6e 63 44 69 72 29 RAMETER(syncDir)
24860 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 ;.. SimulateIOE
24870 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 rror(return SQLI
24880 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 TE_IOERR_DELETE)
24890 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 45 ;. OSTRACE(("DE
248a0 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 73 79 LETE name=%s, sy
248b0 6e 63 44 69 72 3d 25 64 5c 6e 22 2c 20 7a 46 69 ncDir=%d\n", zFi
248c0 6c 65 6e 61 6d 65 2c 20 73 79 6e 63 44 69 72 29 lename, syncDir)
248d0 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 );.. zConverted
248e0 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f = winConvertFro
248f0 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 mUtf8Filename(zF
24900 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 ilename);. if(
24910 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b zConverted==0 ){
24920 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44 . OSTRACE(("D
24930 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 72 ELETE name=%s, r
24940 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e c=SQLITE_IOERR_N
24950 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 OMEM\n", zFilena
24960 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e me));. return
24970 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f SQLITE_IOERR_NO
24980 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f MEM;. }. if( o
24990 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 64 sIsNT() ){. d
249a0 6f 20 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f o {.#if SQLITE_O
249b0 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 57 49 S_WINRT. WI
249c0 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 N32_FILE_ATTRIBU
249d0 54 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74 TE_DATA sAttrDat
249e0 61 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 a;. memset(
249f0 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73 &sAttrData, 0, s
24a00 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29 izeof(sAttrData)
24a10 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73 );. if ( os
24a20 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 GetFileAttribute
24a30 73 45 78 57 28 7a 43 6f 6e 76 65 72 74 65 64 2c sExW(zConverted,
24a40 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 GetFileExInfoSt
24a50 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20 20 andard,.
24a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
24a70 20 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72 &sAttr
24a80 44 61 74 61 29 20 29 7b 0a 20 20 20 20 20 20 20 Data) ){.
24a90 20 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74 attr = sAttrDat
24aa0 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 a.dwFileAttribut
24ab0 65 73 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b es;. }else{
24ac0 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 . lastErr
24ad0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 no = osGetLastEr
24ae0 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69 ror();. i
24af0 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 f( lastErrno==ER
24b00 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 ROR_FILE_NOT_FOU
24b10 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c ND. || l
24b20 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f astErrno==ERROR_
24b30 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 PATH_NOT_FOUND )
24b40 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d {. rc =
24b50 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 SQLITE_IOERR_DE
24b60 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 LETE_NOENT; /* A
24b70 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a lready gone? */.
24b80 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 }else{.
24b90 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 rc = SQ
24ba0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 LITE_ERROR;.
24bb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 }. br
24bc0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c eak;. }.#el
24bd0 73 65 0a 20 20 20 20 20 20 61 74 74 72 20 3d 20 se. attr =
24be0 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 osGetFileAttribu
24bf0 74 65 73 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 tesW(zConverted)
24c00 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 ;.#endif. i
24c10 66 20 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49 f ( attr==INVALI
24c20 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 D_FILE_ATTRIBUTE
24c30 53 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 S ){. las
24c40 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 tErrno = osGetLa
24c50 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 stError();.
24c60 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f if( lastErrno
24c70 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 ==ERROR_FILE_NOT
24c80 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20 _FOUND.
24c90 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 || lastErrno==ER
24ca0 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 ROR_PATH_NOT_FOU
24cb0 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 ND ){.
24cc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 rc = SQLITE_IOER
24cd0 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 R_DELETE_NOENT;
24ce0 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f /* Already gone?
24cf0 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 */. }els
24d00 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 e{. rc
24d10 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a = SQLITE_ERROR;.
24d20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
24d30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d break;. }
24d40 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72 . if ( attr
24d50 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f &FILE_ATTRIBUTE_
24d60 44 49 52 45 43 54 4f 52 59 20 29 7b 0a 20 20 20 DIRECTORY ){.
24d70 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 rc = SQLITE
24d80 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 _ERROR; /* Files
24d90 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 only. */.
24da0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d break;. }
24db0 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73 44 65 . if ( osDe
24dc0 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f 6e 76 65 leteFileW(zConve
24dd0 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 rted) ){.
24de0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b rc = SQLITE_OK;
24df0 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20 /* Deleted OK.
24e00 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b */. break
24e10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
24e20 69 66 20 28 20 21 77 69 6e 52 65 74 72 79 49 6f if ( !winRetryIo
24e30 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 err(&cnt, &lastE
24e40 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 rrno) ){.
24e50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 rc = SQLITE_ERR
24e60 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 OR; /* No more r
24e70 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 etries. */.
24e80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 break;.
24e90 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 28 31 29 }. } while(1)
24ea0 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c ;. }.#ifdef SQL
24eb0 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e ITE_WIN32_HAS_AN
24ec0 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 64 SI. else{. d
24ed0 6f 20 7b 0a 20 20 20 20 20 20 61 74 74 72 20 3d o {. attr =
24ee0 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 osGetFileAttrib
24ef0 75 74 65 73 41 28 7a 43 6f 6e 76 65 72 74 65 64 utesA(zConverted
24f00 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 );. if ( at
24f10 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 tr==INVALID_FILE
24f20 5f 41 54 54 52 49 42 55 54 45 53 20 29 7b 0a 20 _ATTRIBUTES ){.
24f30 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f lastErrno
24f40 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f = osGetLastErro
24f50 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 r();. if(
24f60 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f lastErrno==ERRO
24f70 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 R_FILE_NOT_FOUND
24f80 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61 73 . || las
24f90 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 tErrno==ERROR_PA
24fa0 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a TH_NOT_FOUND ){.
24fb0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 rc = S
24fc0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 QLITE_IOERR_DELE
24fd0 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 TE_NOENT; /* Alr
24fe0 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 eady gone? */.
24ff0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 }else{.
25000 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 rc = SQLI
25010 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 TE_ERROR;.
25020 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 }. brea
25030 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 k;. }.
25040 20 69 66 20 28 20 61 74 74 72 26 46 49 4c 45 5f if ( attr&FILE_
25050 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 ATTRIBUTE_DIRECT
25060 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 72 ORY ){. r
25070 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 c = SQLITE_ERROR
25080 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 2e ; /* Files only.
25090 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 */. brea
250a0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 k;. }.
250b0 20 69 66 20 28 20 6f 73 44 65 6c 65 74 65 46 69 if ( osDeleteFi
250c0 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 leA(zConverted)
250d0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 ){. rc =
250e0 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65 SQLITE_OK; /* De
250f0 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20 leted OK. */.
25100 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
25110 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 21 }. if ( !
25120 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 winRetryIoerr(&c
25130 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 nt, &lastErrno)
25140 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 ){. rc =
25150 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a SQLITE_ERROR; /*
25160 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69 65 73 No more retries
25170 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 . */. bre
25180 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 ak;. }.
25190 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a } while(1);. }.
251a0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 20 #endif. if( rc
251b0 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f && rc!=SQLITE_IO
251c0 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 ERR_DELETE_NOENT
251d0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e ){. rc = win
251e0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f LogError(SQLITE_
251f0 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 6c 61 IOERR_DELETE, la
25200 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 44 65 6c stErrno, "winDel
25210 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 ete", zFilename)
25220 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 ;. }else{. w
25230 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b inLogIoerr(cnt);
25240 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 . }. sqlite3_f
25250 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b ree(zConverted);
25260 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c . OSTRACE(("DEL
25270 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d ETE name=%s, rc=
25280 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 %s\n", zFilename
25290 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 , sqlite3ErrName
252a0 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e (rc)));. return
252b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 rc;.}../*.** Ch
252c0 65 63 6b 20 74 68 65 20 65 78 69 73 74 65 6e 63 eck the existenc
252d0 65 20 61 6e 64 20 73 74 61 74 75 73 20 6f 66 20 e and status of
252e0 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 a file..*/.stati
252f0 63 20 69 6e 74 20 77 69 6e 41 63 63 65 73 73 28 c int winAccess(
25300 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a . sqlite3_vfs *
25310 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 2f 2a pVfs, /*
25320 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e Not used on win
25330 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 32 */. const ch
25340 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 ar *zFilename,
25350 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 /* Name of fi
25360 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 le to check */.
25370 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 int flags,
25380 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 /* T
25390 79 70 65 20 6f 66 20 74 65 73 74 20 74 6f 20 6d ype of test to m
253a0 61 6b 65 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 ake on this file
253b0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f */. int *pResO
253c0 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ut
253d0 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 20 /* OUT: Result
253e0 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 */.){. DWORD at
253f0 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 tr;. int rc = 0
25400 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 ;. DWORD lastEr
25410 72 6e 6f 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f rno;. void *zCo
25420 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 nverted;. UNUSE
25430 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 D_PARAMETER(pVfs
25440 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f );.. SimulateIO
25450 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 Error( return SQ
25460 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 LITE_IOERR_ACCES
25470 53 3b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 S; );. OSTRACE(
25480 28 22 41 43 43 45 53 53 20 6e 61 6d 65 3d 25 73 ("ACCESS name=%s
25490 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70 52 65 73 , flags=%x, pRes
254a0 4f 75 74 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 Out=%p\n",.
254b0 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c zFilename,
254c0 20 66 6c 61 67 73 2c 20 70 52 65 73 4f 75 74 29 flags, pResOut)
254d0 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 );.. zConverted
254e0 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f = winConvertFro
254f0 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 mUtf8Filename(zF
25500 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 ilename);. if(
25510 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b zConverted==0 ){
25520 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 41 . OSTRACE(("A
25530 43 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20 72 CCESS name=%s, r
25540 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e c=SQLITE_IOERR_N
25550 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 OMEM\n", zFilena
25560 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e me));. return
25570 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f SQLITE_IOERR_NO
25580 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f MEM;. }. if( o
25590 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 69 sIsNT() ){. i
255a0 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 nt cnt = 0;.
255b0 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 WIN32_FILE_ATTRI
255c0 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72 44 BUTE_DATA sAttrD
255d0 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 ata;. memset(
255e0 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73 &sAttrData, 0, s
255f0 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29 izeof(sAttrData)
25600 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28 );. while( !(
25610 72 63 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 rc = osGetFileAt
25620 74 72 69 62 75 74 65 73 45 78 57 28 28 4c 50 43 tributesExW((LPC
25630 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c WSTR)zConverted,
25640 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
25650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 47 65 Ge
25660 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 tFileExInfoStand
25670 61 72 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 ard, .
25680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
25690 20 20 20 26 73 41 74 74 72 44 61 74 61 29 29 20 &sAttrData))
256a0 26 26 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 && winRetryIoerr
256b0 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e (&cnt, &lastErrn
256c0 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 72 o) ){}. if( r
256d0 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f c ){. /* Fo
256e0 72 20 61 6e 20 53 51 4c 49 54 45 5f 41 43 43 45 r an SQLITE_ACCE
256f0 53 53 5f 45 58 49 53 54 53 20 71 75 65 72 79 2c SS_EXISTS query,
25700 20 74 72 65 61 74 20 61 20 7a 65 72 6f 2d 6c 65 treat a zero-le
25710 6e 67 74 68 20 66 69 6c 65 0a 20 20 20 20 20 20 ngth file.
25720 2a 2a 20 61 73 20 69 66 20 69 74 20 64 6f 65 73 ** as if it does
25730 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20 not exist..
25740 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 20 */. if(
25750 20 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f flags==SQLITE_
25760 41 43 43 45 53 53 5f 45 58 49 53 54 53 0a 20 20 ACCESS_EXISTS.
25770 20 20 20 20 20 20 20 20 26 26 20 73 41 74 74 72 && sAttr
25780 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 48 69 Data.nFileSizeHi
25790 67 68 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 gh==0 .
257a0 20 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 && sAttrData.nF
257b0 69 6c 65 53 69 7a 65 4c 6f 77 3d 3d 30 20 29 7b ileSizeLow==0 ){
257c0 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 . attr =
257d0 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 INVALID_FILE_ATT
257e0 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d RIBUTES;. }
257f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74 else{. at
25800 74 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64 tr = sAttrData.d
25810 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b wFileAttributes;
25820 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c . }. }el
25830 73 65 7b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 se{. winLog
25840 49 6f 65 72 72 28 63 6e 74 29 3b 0a 20 20 20 20 Ioerr(cnt);.
25850 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 21 if( lastErrno!
25860 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f =ERROR_FILE_NOT_
25870 46 4f 55 4e 44 20 26 26 20 6c 61 73 74 45 72 72 FOUND && lastErr
25880 6e 6f 21 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e no!=ERROR_PATH_N
25890 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 OT_FOUND ){.
258a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 sqlite3_free
258b0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 (zConverted);.
258c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e return win
258d0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f LogError(SQLITE_
258e0 49 4f 45 52 52 5f 41 43 43 45 53 53 2c 20 6c 61 IOERR_ACCESS, la
258f0 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 41 63 63 stErrno, "winAcc
25900 65 73 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 ess",.
25910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
25920 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 zFilename);.
25930 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
25940 20 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 attr = INVALID
25950 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 _FILE_ATTRIBUTES
25960 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a ;. }. }.
25970 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 }.#ifdef SQLIT
25980 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 E_WIN32_HAS_ANSI
25990 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 61 74 74 . else{. att
259a0 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 r = osGetFileAtt
259b0 72 69 62 75 74 65 73 41 28 28 63 68 61 72 2a 29 ributesA((char*)
259c0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d zConverted);. }
259d0 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 .#endif. sqlite
259e0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 3_free(zConverte
259f0 64 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c d);. switch( fl
25a00 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20 ags ){. case
25a10 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 SQLITE_ACCESS_RE
25a20 41 44 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c AD:. case SQL
25a30 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 ITE_ACCESS_EXIST
25a40 53 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74 S:. rc = at
25a50 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 tr!=INVALID_FILE
25a60 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 _ATTRIBUTES;.
25a70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 break;. ca
25a80 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 se SQLITE_ACCESS
25a90 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20 _READWRITE:.
25aa0 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 rc = attr!=INV
25ab0 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 ALID_FILE_ATTRIB
25ac0 55 54 45 53 20 26 26 0a 20 20 20 20 20 20 20 20 UTES &&.
25ad0 20 20 20 20 20 28 61 74 74 72 20 26 20 46 49 4c (attr & FIL
25ae0 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45 41 44 E_ATTRIBUTE_READ
25af0 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20 20 20 20 ONLY)==0;.
25b00 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 break;. defau
25b10 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 lt:. assert
25b20 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 (!"Invalid flags
25b30 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d argument");. }
25b40 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 63 . *pResOut = rc
25b50 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41 43 ;. OSTRACE(("AC
25b60 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20 70 52 CESS name=%s, pR
25b70 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65 73 4f esOut=%p, *pResO
25b80 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49 54 45 ut=%d, rc=SQLITE
25b90 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 _OK\n",.
25ba0 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 52 zFilename, pR
25bb0 65 73 4f 75 74 2c 20 2a 70 52 65 73 4f 75 74 29 esOut, *pResOut)
25bc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 );. return SQLI
25bd0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 TE_OK;.}../*.**
25be0 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f Returns non-zero
25bf0 20 69 66 20 74 68 65 20 73 70 65 63 69 66 69 65 if the specifie
25c00 64 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61 72 d path name star
25c10 74 73 20 77 69 74 68 20 61 20 64 72 69 76 65 20 ts with a drive
25c20 6c 65 74 74 65 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 letter.** follow
25c30 65 64 20 62 79 20 61 20 63 6f 6c 6f 6e 20 63 68 ed by a colon ch
25c40 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 aracter..*/.stat
25c50 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 44 72 69 ic BOOL winIsDri
25c60 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e veLetterAndColon
25c70 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a (. const char *
25c80 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20 20 72 zPathname.){. r
25c90 65 74 75 72 6e 20 28 20 73 71 6c 69 74 65 33 49 eturn ( sqlite3I
25ca0 73 61 6c 70 68 61 28 7a 50 61 74 68 6e 61 6d 65 salpha(zPathname
25cb0 5b 30 5d 29 20 26 26 20 7a 50 61 74 68 6e 61 6d [0]) && zPathnam
25cc0 65 5b 31 5d 3d 3d 27 3a 27 20 29 3b 0a 7d 0a 0a e[1]==':' );.}..
25cd0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f /*.** Returns no
25ce0 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70 n-zero if the sp
25cf0 65 63 69 66 69 65 64 20 70 61 74 68 20 6e 61 6d ecified path nam
25d00 65 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 e should be used
25d10 20 76 65 72 62 61 74 69 6d 2e 20 20 49 66 0a 2a verbatim. If.*
25d20 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 * non-zero is re
25d30 74 75 72 6e 65 64 20 66 72 6f 6d 20 74 68 69 73 turned from this
25d40 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 20 63 function, the c
25d50 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 alling function
25d60 6d 75 73 74 20 73 69 6d 70 6c 79 0a 2a 2a 20 75 must simply.** u
25d70 73 65 20 74 68 65 20 70 72 6f 76 69 64 65 64 20 se the provided
25d80 70 61 74 68 20 6e 61 6d 65 20 76 65 72 62 61 74 path name verbat
25d90 69 6d 20 2d 4f 52 2d 20 72 65 73 6f 6c 76 65 20 im -OR- resolve
25da0 69 74 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 it into a full p
25db0 61 74 68 20 6e 61 6d 65 0a 2a 2a 20 75 73 69 6e ath name.** usin
25dc0 67 20 74 68 65 20 47 65 74 46 75 6c 6c 50 61 74 g the GetFullPat
25dd0 68 4e 61 6d 65 20 57 69 6e 33 32 20 41 50 49 20 hName Win32 API
25de0 66 75 6e 63 74 69 6f 6e 20 28 69 66 20 61 76 61 function (if ava
25df0 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74 ilable)..*/.stat
25e00 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 56 65 72 ic BOOL winIsVer
25e10 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 0a 20 batimPathname(.
25e20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 const char *zPa
25e30 74 68 6e 61 6d 65 0a 29 7b 0a 20 20 2f 2a 0a 20 thname.){. /*.
25e40 20 2a 2a 20 49 66 20 74 68 65 20 70 61 74 68 20 ** If the path
25e50 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69 74 68 name starts with
25e60 20 61 20 66 6f 72 77 61 72 64 20 73 6c 61 73 68 a forward slash
25e70 20 6f 72 20 61 20 62 61 63 6b 73 6c 61 73 68 2c or a backslash,
25e80 20 69 74 20 69 73 20 65 69 74 68 65 72 0a 20 20 it is either.
25e90 2a 2a 20 61 20 6c 65 67 61 6c 20 55 4e 43 20 6e ** a legal UNC n
25ea0 61 6d 65 2c 20 61 20 76 6f 6c 75 6d 65 20 72 65 ame, a volume re
25eb0 6c 61 74 69 76 65 20 70 61 74 68 2c 20 6f 72 20 lative path, or
25ec0 61 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 an absolute path
25ed0 20 6e 61 6d 65 20 69 6e 20 74 68 65 0a 20 20 2a name in the. *
25ee0 2a 20 22 55 6e 69 78 22 20 66 6f 72 6d 61 74 20 * "Unix" format
25ef0 6f 6e 20 57 69 6e 64 6f 77 73 2e 20 20 54 68 65 on Windows. The
25f00 72 65 20 69 73 20 6e 6f 20 65 61 73 79 20 77 61 re is no easy wa
25f10 79 20 74 6f 20 64 69 66 66 65 72 65 6e 74 69 61 y to differentia
25f20 74 65 20 62 65 74 77 65 65 6e 0a 20 20 2a 2a 20 te between. **
25f30 74 68 65 20 66 69 6e 61 6c 20 74 77 6f 20 63 61 the final two ca
25f40 73 65 73 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 ses; therefore,
25f50 77 65 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 we return the sa
25f60 66 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 fer return value
25f70 20 6f 66 20 54 52 55 45 0a 20 20 2a 2a 20 73 6f of TRUE. ** so
25f80 20 74 68 61 74 20 63 61 6c 6c 65 72 73 20 6f 66 that callers of
25f90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 this function w
25fa0 69 6c 6c 20 73 69 6d 70 6c 79 20 75 73 65 20 69 ill simply use i
25fb0 74 20 76 65 72 62 61 74 69 6d 2e 0a 20 20 2a 2f t verbatim.. */
25fc0 0a 20 20 69 66 20 28 20 77 69 6e 49 73 44 69 72 . if ( winIsDir
25fd0 53 65 70 28 7a 50 61 74 68 6e 61 6d 65 5b 30 5d Sep(zPathname[0]
25fe0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 ) ){. return
25ff0 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a TRUE;. }.. /*.
26000 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61 74 68 ** If the path
26010 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69 74 name starts wit
26020 68 20 61 20 6c 65 74 74 65 72 20 61 6e 64 20 61 h a letter and a
26030 20 63 6f 6c 6f 6e 20 69 74 20 69 73 20 65 69 74 colon it is eit
26040 68 65 72 20 61 20 76 6f 6c 75 6d 65 0a 20 20 2a her a volume. *
26050 2a 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 * relative path
26060 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70 or an absolute p
26070 61 74 68 2e 20 20 43 61 6c 6c 65 72 73 20 6f 66 ath. Callers of
26080 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d this function m
26090 75 73 74 20 6e 6f 74 0a 20 20 2a 2a 20 61 74 74 ust not. ** att
260a0 65 6d 70 74 20 74 6f 20 74 72 65 61 74 20 69 74 empt to treat it
260b0 20 61 73 20 61 20 72 65 6c 61 74 69 76 65 20 70 as a relative p
260c0 61 74 68 20 6e 61 6d 65 20 28 69 2e 65 2e 20 74 ath name (i.e. t
260d0 68 65 79 20 73 68 6f 75 6c 64 20 73 69 6d 70 6c hey should simpl
260e0 79 20 75 73 65 0a 20 20 2a 2a 20 69 74 20 76 65 y use. ** it ve
260f0 72 62 61 74 69 6d 29 2e 0a 20 20 2a 2f 0a 20 20 rbatim).. */.
26100 69 66 20 28 20 77 69 6e 49 73 44 72 69 76 65 4c if ( winIsDriveL
26110 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 50 etterAndColon(zP
26120 61 74 68 6e 61 6d 65 29 20 29 7b 0a 20 20 20 20 athname) ){.
26130 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d return TRUE;. }
26140 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 77 .. /*. ** If w
26150 65 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f e get to this po
26160 69 6e 74 2c 20 74 68 65 20 70 61 74 68 20 6e 61 int, the path na
26170 6d 65 20 73 68 6f 75 6c 64 20 61 6c 6d 6f 73 74 me should almost
26180 20 63 65 72 74 61 69 6e 6c 79 20 62 65 20 61 20 certainly be a
26190 70 75 72 65 6c 79 0a 20 20 2a 2a 20 72 65 6c 61 purely. ** rela
261a0 74 69 76 65 20 6f 6e 65 20 28 69 2e 65 2e 20 6e tive one (i.e. n
261b0 6f 74 20 61 20 55 4e 43 20 6e 61 6d 65 2c 20 6e ot a UNC name, n
261c0 6f 74 20 61 62 73 6f 6c 75 74 65 2c 20 61 6e 64 ot absolute, and
261d0 20 6e 6f 74 20 76 6f 6c 75 6d 65 20 72 65 6c 61 not volume rela
261e0 74 69 76 65 29 2e 0a 20 20 2a 2f 0a 20 20 72 65 tive).. */. re
261f0 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a 0a 2f turn FALSE;.}../
26200 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 *.** Turn a rela
26210 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e tive pathname in
26220 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 to a full pathna
26230 6d 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 66 me. Write the f
26240 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d 65 20 ull.** pathname
26250 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f into zOut[]. zO
26260 75 74 5b 5d 20 77 69 6c 6c 20 62 65 20 61 74 20 ut[] will be at
26270 6c 65 61 73 74 20 70 56 66 73 2d 3e 6d 78 50 61 least pVfs->mxPa
26280 74 68 6e 61 6d 65 0a 2a 2a 20 62 79 74 65 73 20 thname.** bytes
26290 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 in size..*/.stat
262a0 69 63 20 69 6e 74 20 77 69 6e 46 75 6c 6c 50 61 ic int winFullPa
262b0 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 thname(. sqlite
262c0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 3_vfs *pVfs,
262d0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 /* Point
262e0 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 er to vfs object
262f0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 */. const char
26300 20 2a 7a 52 65 6c 61 74 69 76 65 2c 20 20 20 20 *zRelative,
26310 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 /* Possibly
26320 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70 relative input p
26330 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 75 ath */. int nFu
26340 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 ll,
26350 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f /* Size o
26360 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 f output buffer
26370 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 in bytes */. ch
26380 61 72 20 2a 7a 46 75 6c 6c 20 20 20 20 20 20 20 ar *zFull
26390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f /* O
263a0 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a utput buffer */.
263b0 29 7b 0a 20 20 0a 23 69 66 20 64 65 66 69 6e 65 ){. .#if define
263c0 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 d(__CYGWIN__).
263d0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 SimulateIOError(
263e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 return SQLITE_E
263f0 52 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45 44 RROR );. UNUSED
26400 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c _PARAMETER(nFull
26410 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 46 75 );. assert( nFu
26420 6c 6c 3e 3d 70 56 66 73 2d 3e 6d 78 50 61 74 68 ll>=pVfs->mxPath
26430 6e 61 6d 65 20 29 3b 0a 20 20 69 66 20 28 20 73 name );. if ( s
26440 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 qlite3_data_dire
26450 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56 ctory && !winIsV
26460 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 erbatimPathname(
26470 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 zRelative) ){.
26480 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 /*. ** NOTE
26490 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67 : We are dealing
264a0 20 77 69 74 68 20 61 20 72 65 6c 61 74 69 76 65 with a relative
264b0 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 path name and t
264c0 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 he data. **
264d0 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 68 directory h
264e0 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68 as been set. Th
264f0 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 erefore, use it
26500 61 73 20 74 68 65 20 62 61 73 69 73 0a 20 20 20 as the basis.
26510 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f ** for co
26520 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c nverting the rel
26530 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 ative path name
26540 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 to an absolute.
26550 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 ** one
26560 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68 by prepending th
26570 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 e data directory
26580 20 61 6e 64 20 61 20 73 6c 61 73 68 2e 0a 20 20 and a slash..
26590 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a */. char *z
265a0 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c Out = sqlite3Mal
265b0 6c 6f 63 5a 65 72 6f 28 20 70 56 66 73 2d 3e 6d locZero( pVfs->m
265c0 78 50 61 74 68 6e 61 6d 65 2b 31 20 29 3b 0a 20 xPathname+1 );.
265d0 20 20 20 69 66 28 20 21 7a 4f 75 74 20 29 7b 0a if( !zOut ){.
265e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c return SQL
265f0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b ITE_IOERR_NOMEM;
26600 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 . }. if( c
26610 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 ygwin_conv_path(
26620 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e CCP_POSIX_TO_WIN
26630 5f 41 7c 43 43 50 5f 52 45 4c 41 54 49 56 45 2c _A|CCP_RELATIVE,
26640 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a 4f 75 74 zRelative, zOut
26650 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
26660 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2d pVfs-
26670 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30 >mxPathname+1)<0
26680 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 ){. sqlite
26690 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 3_free(zOut);.
266a0 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f return winLo
266b0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 gError(SQLITE_CA
266c0 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c NTOPEN_CONVPATH,
266d0 20 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 (DWORD)errno,.
266e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
266f0 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c "winFull
26700 50 61 74 68 6e 61 6d 65 31 22 2c 20 7a 52 65 6c Pathname1", zRel
26710 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 ative);. }.
26720 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e sqlite3_snprin
26730 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 tf(MIN(nFull, pV
26740 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c fs->mxPathname),
26750 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 zFull, "%s%c%s"
26760 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
26770 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 sqlite3_d
26780 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 ata_directory, w
26790 69 6e 47 65 74 44 69 72 53 65 70 28 29 2c 20 7a inGetDirSep(), z
267a0 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 Out);. sqlite
267b0 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 3_free(zOut);.
267c0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 63 }else{. if( c
267d0 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 ygwin_conv_path(
267e0 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e CCP_POSIX_TO_WIN
267f0 5f 41 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a _A, zRelative, z
26800 46 75 6c 6c 2c 20 6e 46 75 6c 6c 29 3c 30 20 29 Full, nFull)<0 )
26810 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 {. return w
26820 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 inLogError(SQLIT
26830 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 E_CANTOPEN_CONVP
26840 41 54 48 2c 20 28 44 57 4f 52 44 29 65 72 72 6e ATH, (DWORD)errn
26850 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 o,.
26860 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e "win
26870 46 75 6c 6c 50 61 74 68 6e 61 6d 65 32 22 2c 20 FullPathname2",
26880 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 zRelative);.
26890 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 }. }. return S
268a0 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 QLITE_OK;.#endif
268b0 0a 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 4f 53 ..#if (SQLITE_OS
268c0 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 _WINCE || SQLITE
268d0 5f 4f 53 5f 57 49 4e 52 54 29 20 26 26 20 21 64 _OS_WINRT) && !d
268e0 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f efined(__CYGWIN_
268f0 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 _). SimulateIOE
26900 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c rror( return SQL
26910 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 2f ITE_ERROR );. /
26920 2a 20 57 69 6e 43 45 20 68 61 73 20 6e 6f 20 63 * WinCE has no c
26930 6f 6e 63 65 70 74 20 6f 66 20 61 20 72 65 6c 61 oncept of a rela
26940 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2c 20 6f tive pathname, o
26950 72 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e 20 r so I am told.
26960 2a 2f 0a 20 20 2f 2a 20 57 69 6e 52 54 20 68 61 */. /* WinRT ha
26970 73 20 6e 6f 20 77 61 79 20 74 6f 20 63 6f 6e 76 s no way to conv
26980 65 72 74 20 61 20 72 65 6c 61 74 69 76 65 20 70 ert a relative p
26990 61 74 68 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 ath to an absolu
269a0 74 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 66 20 te one. */. if
269b0 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 ( sqlite3_data_d
269c0 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e irectory && !win
269d0 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 IsVerbatimPathna
269e0 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b me(zRelative) ){
269f0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e . /*. ** N
26a00 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c OTE: We are deal
26a10 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61 74 ing with a relat
26a20 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e ive path name an
26a30 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a d the data. *
26a40 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 * director
26a50 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 y has been set.
26a60 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 Therefore, use
26a70 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73 0a it as the basis.
26a80 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 ** for
26a90 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20 converting the
26aa0 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 relative path na
26ab0 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 me to an absolut
26ac0 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f e. ** o
26ad0 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67 ne by prepending
26ae0 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74 the data direct
26af0 6f 72 79 20 61 6e 64 20 61 20 62 61 63 6b 73 6c ory and a backsl
26b00 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 ash.. */.
26b10 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 sqlite3_snprintf
26b20 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 (MIN(nFull, pVfs
26b30 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a ->mxPathname), z
26b40 46 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a Full, "%s%c%s",.
26b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
26b60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 sqlite3_dat
26b70 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69 6e a_directory, win
26b80 47 65 74 44 69 72 53 65 70 28 29 2c 20 7a 52 65 GetDirSep(), zRe
26b90 6c 61 74 69 76 65 29 3b 0a 20 20 7d 65 6c 73 65 lative);. }else
26ba0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e {. sqlite3_sn
26bb0 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c printf(MIN(nFull
26bc0 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 , pVfs->mxPathna
26bd0 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 me), zFull, "%s"
26be0 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 , zRelative);.
26bf0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 }. return SQLIT
26c00 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 E_OK;.#endif..#i
26c10 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e f !SQLITE_OS_WIN
26c20 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 CE && !SQLITE_OS
26c30 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e _WINRT && !defin
26c40 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 ed(__CYGWIN__).
26c50 20 44 57 4f 52 44 20 6e 42 79 74 65 3b 0a 20 20 DWORD nByte;.
26c60 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 void *zConverted
26c70 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a ;. char *zOut;.
26c80 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 . /* If this pa
26c90 74 68 20 6e 61 6d 65 20 62 65 67 69 6e 73 20 77 th name begins w
26ca0 69 74 68 20 22 2f 58 3a 22 2c 20 77 68 65 72 65 ith "/X:", where
26cb0 20 22 58 22 20 69 73 20 61 6e 79 20 61 6c 70 68 "X" is any alph
26cc0 61 62 65 74 69 63 0a 20 20 2a 2a 20 63 68 61 72 abetic. ** char
26cd0 61 63 74 65 72 2c 20 64 69 73 63 61 72 64 20 74 acter, discard t
26ce0 68 65 20 69 6e 69 74 69 61 6c 20 22 2f 22 20 66 he initial "/" f
26cf0 72 6f 6d 20 74 68 65 20 70 61 74 68 6e 61 6d 65 rom the pathname
26d00 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 52 65 .. */. if( zRe
26d10 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20 26 lative[0]=='/' &
26d20 26 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 & winIsDriveLett
26d30 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 52 65 6c 61 erAndColon(zRela
26d40 74 69 76 65 2b 31 29 20 29 7b 0a 20 20 20 20 7a tive+1) ){. z
26d50 52 65 6c 61 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a Relative++;. }.
26d60 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 . /* It's odd t
26d70 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f o simulate an io
26d80 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 -error here, but
26d90 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 really this is
26da0 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 just. ** using
26db0 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 the io-error inf
26dc0 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 rastructure to t
26dd0 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 est that SQLite
26de0 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a handles this. *
26df0 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 * function faili
26e00 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f ng. This functio
26e10 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c n could fail if,
26e20 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 for example, th
26e30 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 e. ** current w
26e40 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 orking directory
26e50 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b has been unlink
26e60 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c ed.. */. Simul
26e70 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 ateIOError( retu
26e80 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 rn SQLITE_ERROR
26e90 29 3b 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65 );. if ( sqlite
26ea0 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 3_data_directory
26eb0 20 26 26 20 21 77 69 6e 49 73 56 65 72 62 61 74 && !winIsVerbat
26ec0 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 imPathname(zRela
26ed0 74 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a tive) ){. /*.
26ee0 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 ** NOTE: We
26ef0 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 are dealing with
26f00 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 a relative path
26f10 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 name and the da
26f20 74 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 ta. **
26f30 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 directory has be
26f40 65 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f en set. Therefo
26f50 72 65 2c 20 75 73 65 20 69 74 20 61 73 20 74 68 re, use it as th
26f60 65 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 e basis. **
26f70 20 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 for convert
26f80 69 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76 65 ing the relative
26f90 20 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e path name to an
26fa0 20 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a absolute. **
26fb0 20 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72 one by pr
26fc0 65 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74 epending the dat
26fd0 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 a directory and
26fe0 61 20 62 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20 a backslash..
26ff0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f */. sqlite3_
27000 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 snprintf(MIN(nFu
27010 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 ll, pVfs->mxPath
27020 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 name), zFull, "%
27030 73 25 63 25 73 22 2c 0a 20 20 20 20 20 20 20 20 s%c%s",.
27040 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c sql
27050 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 ite3_data_direct
27060 6f 72 79 2c 20 77 69 6e 47 65 74 44 69 72 53 65 ory, winGetDirSe
27070 70 28 29 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b p(), zRelative);
27080 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 . return SQLI
27090 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 7a 43 6f TE_OK;. }. zCo
270a0 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e nverted = winCon
270b0 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 vertFromUtf8File
270c0 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 3b name(zRelative);
270d0 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 . if( zConverte
270e0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 d==0 ){. retu
270f0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f rn SQLITE_IOERR_
27100 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 NOMEM;. }. if(
27110 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 osIsNT() ){.
27120 20 4c 50 57 53 54 52 20 7a 54 65 6d 70 3b 0a 20 LPWSTR zTemp;.
27130 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 nByte = osGet
27140 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c FullPathNameW((L
27150 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 PCWSTR)zConverte
27160 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 d, 0, 0, 0);.
27170 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b if( nByte==0 ){
27180 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 . sqlite3_f
27190 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b ree(zConverted);
271a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 . return wi
271b0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 nLogError(SQLITE
271c0 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 _CANTOPEN_FULLPA
271d0 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 TH, osGetLastErr
271e0 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 or(),.
271f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 "
27200 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 31 winFullPathname1
27210 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 ", zRelative);.
27220 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 2b }. nByte +
27230 3d 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d = 3;. zTemp =
27240 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 sqlite3MallocZe
27250 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 ro( nByte*sizeof
27260 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 (zTemp[0]) );.
27270 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 if( zTemp==0 )
27280 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f {. sqlite3_
27290 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 free(zConverted)
272a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 ;. return S
272b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 QLITE_IOERR_NOME
272c0 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 M;. }. nBy
272d0 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 te = osGetFullPa
272e0 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54 52 thNameW((LPCWSTR
272f0 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 )zConverted, nBy
27300 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 te, zTemp, 0);.
27310 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 if( nByte==0
27320 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 ){. sqlite3
27330 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 _free(zConverted
27340 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 );. sqlite3
27350 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 _free(zTemp);.
27360 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f return winLo
27370 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 gError(SQLITE_CA
27380 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c NTOPEN_FULLPATH,
27390 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 osGetLastError(
273a0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ),.
273b0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e "win
273c0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 32 22 2c 20 FullPathname2",
273d0 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 zRelative);.
273e0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 }. sqlite3_fr
273f0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a ee(zConverted);.
27400 20 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e 55 6e zOut = winUn
27410 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d icodeToUtf8(zTem
27420 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f p);. sqlite3_
27430 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d free(zTemp);. }
27440 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 .#ifdef SQLITE_W
27450 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 IN32_HAS_ANSI.
27460 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a else{. char *
27470 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 zTemp;. nByte
27480 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 = osGetFullPath
27490 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f NameA((char*)zCo
274a0 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 nverted, 0, 0, 0
274b0 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 );. if( nByte
274c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c ==0 ){. sql
274d0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 ite3_free(zConve
274e0 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 rted);. ret
274f0 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 urn winLogError(
27500 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f SQLITE_CANTOPEN_
27510 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c FULLPATH, osGetL
27520 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 astError(),.
27530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
27540 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 "winFullPat
27550 68 6e 61 6d 65 33 22 2c 20 7a 52 65 6c 61 74 69 hname3", zRelati
27560 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e ve);. }. n
27570 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a Byte += 3;. z
27580 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 Temp = sqlite3Ma
27590 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a llocZero( nByte*
275a0 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 sizeof(zTemp[0])
275b0 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d );. if( zTem
275c0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 p==0 ){. sq
275d0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 lite3_free(zConv
275e0 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 erted);. re
275f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 turn SQLITE_IOER
27600 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 R_NOMEM;. }.
27610 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 nByte = osGet
27620 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 FullPathNameA((c
27630 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c har*)zConverted,
27640 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 nByte, zTemp, 0
27650 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 );. if( nByte
27660 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c ==0 ){. sql
27670 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 ite3_free(zConve
27680 72 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c rted);. sql
27690 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 ite3_free(zTemp)
276a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 ;. return w
276b0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 inLogError(SQLIT
276c0 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 E_CANTOPEN_FULLP
276d0 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 ATH, osGetLastEr
276e0 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 ror(),.
276f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
27700 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 "winFullPathname
27710 34 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 4", zRelative);.
27720 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 }. sqlite
27730 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 3_free(zConverte
27740 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 73 d);. zOut = s
27750 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 qlite3_win32_mbc
27760 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29 s_to_utf8(zTemp)
27770 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 ;. sqlite3_fr
27780 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 ee(zTemp);. }.#
27790 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 4f 75 74 endif. if( zOut
277a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f ){. sqlite3_
277b0 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 snprintf(MIN(nFu
277c0 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 ll, pVfs->mxPath
277d0 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 name), zFull, "%
277e0 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 73 s", zOut);. s
277f0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 qlite3_free(zOut
27800 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 );. return SQ
27810 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 LITE_OK;. }else
27820 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c {. return SQL
27830 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b ITE_IOERR_NOMEM;
27840 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 . }.#endif.}..#
27850 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d ifndef SQLITE_OM
27860 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f IT_LOAD_EXTENSIO
27870 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 N./*.** Interfac
27880 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 es for opening a
27890 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c shared library,
278a0 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 finding entry p
278b0 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 oints.** within
278c0 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 the shared libra
278d0 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 ry, and closing
278e0 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 the shared libra
278f0 72 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 74 ry..*/./*.** Int
27900 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e erfaces for open
27910 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 ing a shared lib
27920 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e rary, finding en
27930 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 try points.** wi
27940 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 thin the shared
27950 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f library, and clo
27960 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 sing the shared
27970 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 library..*/.stat
27980 69 63 20 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 ic void *winDlOp
27990 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a en(sqlite3_vfs *
279a0 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 pVfs, const char
279b0 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 *zFilename){.
279c0 48 41 4e 44 4c 45 20 68 3b 0a 20 20 76 6f 69 64 HANDLE h;. void
279d0 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 *zConverted = w
279e0 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 inConvertFromUtf
279f0 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 8Filename(zFilen
27a00 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 ame);. UNUSED_P
27a10 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a ARAMETER(pVfs);.
27a20 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 if( zConverted
27a30 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 ==0 ){. retur
27a40 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f n 0;. }. if( o
27a50 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 sIsNT() ){.#if S
27a60 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 QLITE_OS_WINRT.
27a70 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 50 61 63 h = osLoadPac
27a80 6b 61 67 65 64 4c 69 62 72 61 72 79 28 28 4c 50 kagedLibrary((LP
27a90 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 CWSTR)zConverted
27aa0 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 , 0);.#else.
27ab0 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 h = osLoadLibrar
27ac0 79 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e yW((LPCWSTR)zCon
27ad0 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a verted);.#endif.
27ae0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 }.#ifdef SQLIT
27af0 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 E_WIN32_HAS_ANSI
27b00 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d . else{. h =
27b10 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 28 osLoadLibraryA(
27b20 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 (char*)zConverte
27b30 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 d);. }.#endif.
27b40 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 sqlite3_free(zC
27b50 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 72 65 74 onverted);. ret
27b60 75 72 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a urn (void*)h;.}.
27b70 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44 static void winD
27b80 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 lError(sqlite3_v
27b90 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 fs *pVfs, int nB
27ba0 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 uf, char *zBufOu
27bb0 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 t){. UNUSED_PAR
27bc0 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 AMETER(pVfs);.
27bd0 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d winGetLastErrorM
27be0 73 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f sg(osGetLastErro
27bf0 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 4f r(), nBuf, zBufO
27c00 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f ut);.}.static vo
27c10 69 64 20 28 2a 77 69 6e 44 6c 53 79 6d 28 73 71 id (*winDlSym(sq
27c20 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c lite3_vfs *pVfs,
27c30 76 6f 69 64 20 2a 70 48 2c 63 6f 6e 73 74 20 63 void *pH,const c
27c40 68 61 72 20 2a 7a 53 79 6d 29 29 28 76 6f 69 64 har *zSym))(void
27c50 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 ){. UNUSED_PARA
27c60 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 METER(pVfs);. r
27c70 65 74 75 72 6e 20 28 76 6f 69 64 28 2a 29 28 76 eturn (void(*)(v
27c80 6f 69 64 29 29 6f 73 47 65 74 50 72 6f 63 41 64 oid))osGetProcAd
27c90 64 72 65 73 73 41 28 28 48 41 4e 44 4c 45 29 70 dressA((HANDLE)p
27ca0 48 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61 74 H, zSym);.}.stat
27cb0 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 43 6c 6f ic void winDlClo
27cc0 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a se(sqlite3_vfs *
27cd0 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e pVfs, void *pHan
27ce0 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 dle){. UNUSED_P
27cf0 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a ARAMETER(pVfs);.
27d00 20 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79 28 osFreeLibrary(
27d10 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 29 (HANDLE)pHandle)
27d20 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 ;.}.#else /* if
27d30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 SQLITE_OMIT_LOAD
27d40 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 _EXTENSION is de
27d50 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 fined: */. #def
27d60 69 6e 65 20 77 69 6e 44 6c 4f 70 65 6e 20 20 30 ine winDlOpen 0
27d70 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c . #define winDl
27d80 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e Error 0. #defin
27d90 65 20 77 69 6e 44 6c 53 79 6d 20 20 20 30 0a 20 e winDlSym 0.
27da0 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 43 6c #define winDlCl
27db0 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f ose 0.#endif.../
27dc0 2a 0a 2a 2a 20 57 72 69 74 65 20 75 70 20 74 6f *.** Write up to
27dd0 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 nBuf bytes of r
27de0 61 6e 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20 7a andomness into z
27df0 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 Buf..*/.static i
27e00 6e 74 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 nt winRandomness
27e10 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 (sqlite3_vfs *pV
27e20 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 fs, int nBuf, ch
27e30 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69 6e 74 ar *zBuf){. int
27e40 20 6e 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 n = 0;. UNUSED
27e50 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 _PARAMETER(pVfs)
27e60 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 ;.#if defined(SQ
27e70 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 6e 20 3d LITE_TEST). n =
27e80 20 6e 42 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 nBuf;. memset(
27e90 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a zBuf, 0, nBuf);.
27ea0 23 65 6c 73 65 0a 20 20 69 66 28 20 73 69 7a 65 #else. if( size
27eb0 6f 66 28 53 59 53 54 45 4d 54 49 4d 45 29 3c 3d of(SYSTEMTIME)<=
27ec0 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 53 59 nBuf-n ){. SY
27ed0 53 54 45 4d 54 49 4d 45 20 78 3b 0a 20 20 20 20 STEMTIME x;.
27ee0 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 osGetSystemTime(
27ef0 26 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 &x);. memcpy(
27f00 26 7a 42 75 66 5b 6e 5d 2c 20 26 78 2c 20 73 69 &zBuf[n], &x, si
27f10 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 6e 20 zeof(x));. n
27f20 2b 3d 20 73 69 7a 65 6f 66 28 78 29 3b 0a 20 20 += sizeof(x);.
27f30 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44 }. if( sizeof(D
27f40 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b WORD)<=nBuf-n ){
27f50 0a 20 20 20 20 44 57 4f 52 44 20 70 69 64 20 3d . DWORD pid =
27f60 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f osGetCurrentPro
27f70 63 65 73 73 49 64 28 29 3b 0a 20 20 20 20 6d 65 cessId();. me
27f80 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 mcpy(&zBuf[n], &
27f90 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 pid, sizeof(pid)
27fa0 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 );. n += size
27fb0 6f 66 28 70 69 64 29 3b 0a 20 20 7d 0a 23 69 66 of(pid);. }.#if
27fc0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 SQLITE_OS_WINRT
27fd0 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 55 4c . if( sizeof(UL
27fe0 4f 4e 47 4c 4f 4e 47 29 3c 3d 6e 42 75 66 2d 6e ONGLONG)<=nBuf-n
27ff0 20 29 7b 0a 20 20 20 20 55 4c 4f 4e 47 4c 4f 4e ){. ULONGLON
28000 47 20 63 6e 74 20 3d 20 6f 73 47 65 74 54 69 63 G cnt = osGetTic
28010 6b 43 6f 75 6e 74 36 34 28 29 3b 0a 20 20 20 20 kCount64();.
28020 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c memcpy(&zBuf[n],
28030 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e &cnt, sizeof(cn
28040 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 t));. n += si
28050 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 23 zeof(cnt);. }.#
28060 65 6c 73 65 0a 20 20 69 66 28 20 73 69 7a 65 6f else. if( sizeo
28070 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e f(DWORD)<=nBuf-n
28080 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 63 6e ){. DWORD cn
28090 74 20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 t = osGetTickCou
280a0 6e 74 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 nt();. memcpy
280b0 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c (&zBuf[n], &cnt,
280c0 20 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20 sizeof(cnt));.
280d0 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 63 n += sizeof(c
280e0 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a nt);. }.#endif.
280f0 20 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 41 52 if( sizeof(LAR
28100 47 45 5f 49 4e 54 45 47 45 52 29 3c 3d 6e 42 75 GE_INTEGER)<=nBu
28110 66 2d 6e 20 29 7b 0a 20 20 20 20 4c 41 52 47 45 f-n ){. LARGE
28120 5f 49 4e 54 45 47 45 52 20 69 3b 0a 20 20 20 20 _INTEGER i;.
28130 6f 73 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e osQueryPerforman
28140 63 65 43 6f 75 6e 74 65 72 28 26 69 29 3b 0a 20 ceCounter(&i);.
28150 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b memcpy(&zBuf[
28160 6e 5d 2c 20 26 69 2c 20 73 69 7a 65 6f 66 28 69 n], &i, sizeof(i
28170 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a ));. n += siz
28180 65 6f 66 28 69 29 3b 0a 20 20 7d 0a 23 65 6e 64 eof(i);. }.#end
28190 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d if. return n;.}
281a0 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 .../*.** Sleep f
281b0 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c or a little whil
281c0 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 e. Return the a
281d0 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c mount of time sl
281e0 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 ept..*/.static i
281f0 6e 74 20 77 69 6e 53 6c 65 65 70 28 73 71 6c 69 nt winSleep(sqli
28200 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 te3_vfs *pVfs, i
28210 6e 74 20 6d 69 63 72 6f 73 65 63 29 7b 0a 20 20 nt microsec){.
28220 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c sqlite3_win32_sl
28230 65 65 70 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 eep((microsec+99
28240 39 29 2f 31 30 30 30 29 3b 0a 20 20 55 4e 55 53 9)/1000);. UNUS
28250 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 ED_PARAMETER(pVf
28260 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6d s);. return ((m
28270 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 icrosec+999)/100
28280 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 0)*1000;.}../*.*
28290 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 * The following
282a0 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 variable, if set
282b0 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 to a non-zero v
282c0 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 alue, is interpr
282d0 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e eted as.** the n
282e0 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 umber of seconds
282f0 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 since 1970 and
28300 69 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 is used to set t
28310 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 he result of.**
28320 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 sqlite3OsCurrent
28330 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 Time() during te
28340 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 sting..*/.#ifdef
28350 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 SQLITE_TEST.int
28360 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 sqlite3_current
28370 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 _time = 0; /* F
28380 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 ake system time
28390 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 in seconds since
283a0 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 1970. */.#endif
283b0 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 ../*.** Find the
283c0 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 current time (i
283d0 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 n Universal Coor
283e0 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 dinated Time).
283f0 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f Write into *piNo
28400 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 w.** the current
28410 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 time and date a
28420 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e s a Julian Day n
28430 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34 umber times 86_4
28440 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 00_000. In.** o
28450 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74 ther words, writ
28460 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 e into *piNow th
28470 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c e number of mill
28480 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 iseconds since t
28490 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f he Julian.** epo
284a0 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 ch of noon in Gr
284b0 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d eenwich on Novem
284c0 62 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 ber 24, 4714 B.C
284d0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 according to th
284e0 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 e.** proleptic G
284f0 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 regorian calenda
28500 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 r..**.** On succ
28510 65 73 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 ess, return SQLI
28520 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53 TE_OK. Return S
28530 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20 74 QLITE_ERROR if t
28540 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 he time and date
28550 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 .** cannot be f
28560 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 ound..*/.static
28570 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69 int winCurrentTi
28580 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f meInt64(sqlite3_
28590 76 66 73 20 2a 70 56 66 73 2c 20 73 71 6c 69 74 vfs *pVfs, sqlit
285a0 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 e3_int64 *piNow)
285b0 7b 0a 20 20 2f 2a 20 46 49 4c 45 54 49 4d 45 20 {. /* FILETIME
285c0 73 74 72 75 63 74 75 72 65 20 69 73 20 61 20 36 structure is a 6
285d0 34 2d 62 69 74 20 76 61 6c 75 65 20 72 65 70 72 4-bit value repr
285e0 65 73 65 6e 74 69 6e 67 20 74 68 65 20 6e 75 6d esenting the num
285f0 62 65 72 20 6f 66 20 0a 20 20 20 20 20 31 30 30 ber of . 100
28600 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65 -nanosecond inte
28610 72 76 61 6c 73 20 73 69 6e 63 65 20 4a 61 6e 75 rvals since Janu
28620 61 72 79 20 31 2c 20 31 36 30 31 20 28 3d 20 4a ary 1, 1601 (= J
28630 44 20 32 33 30 35 38 31 33 2e 35 29 2e 20 0a 20 D 2305813.5). .
28640 20 2a 2f 0a 20 20 46 49 4c 45 54 49 4d 45 20 66 */. FILETIME f
28650 74 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 t;. static cons
28660 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 t sqlite3_int64
28670 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 winFiletimeEpoch
28680 20 3d 20 32 33 30 35 38 31 33 35 2a 28 73 71 6c = 23058135*(sql
28690 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 ite3_int64)86400
286a0 30 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 00;.#ifdef SQLIT
286b0 45 5f 54 45 53 54 0a 20 20 73 74 61 74 69 63 20 E_TEST. static
286c0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e const sqlite3_in
286d0 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20 t64 unixEpoch =
286e0 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65 24405875*(sqlite
286f0 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 3_int64)8640000;
28700 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 32 5e 33 .#endif. /* 2^3
28710 32 20 2d 20 74 6f 20 61 76 6f 69 64 20 75 73 65 2 - to avoid use
28720 20 6f 66 20 4c 4c 20 61 6e 64 20 77 61 72 6e 69 of LL and warni
28730 6e 67 73 20 69 6e 20 67 63 63 20 2a 2f 0a 20 20 ngs in gcc */.
28740 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c static const sql
28750 69 74 65 33 5f 69 6e 74 36 34 20 6d 61 78 33 32 ite3_int64 max32
28760 42 69 74 56 61 6c 75 65 20 3d 20 0a 20 20 20 20 BitValue = .
28770 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 (sqlite3_int64
28780 29 32 30 30 30 30 30 30 30 30 30 20 2b 20 28 73 )2000000000 + (s
28790 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30 qlite3_int64)200
287a0 30 30 30 30 30 30 30 20 2b 0a 20 20 20 20 20 20 0000000 +.
287b0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 (sqlite3_int64)2
287c0 39 34 39 36 37 32 39 36 3b 0a 0a 23 69 66 20 53 94967296;..#if S
287d0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 QLITE_OS_WINCE.
287e0 20 53 59 53 54 45 4d 54 49 4d 45 20 74 69 6d 65 SYSTEMTIME time
287f0 3b 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54 ;. osGetSystemT
28800 69 6d 65 28 26 74 69 6d 65 29 3b 0a 20 20 2f 2a ime(&time);. /*
28810 20 69 66 20 53 79 73 74 65 6d 54 69 6d 65 54 6f if SystemTimeTo
28820 46 69 6c 65 54 69 6d 65 28 29 20 66 61 69 6c 73 FileTime() fails
28830 2c 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 , it returns zer
28840 6f 2e 20 2a 2f 0a 20 20 69 66 20 28 21 6f 73 53 o. */. if (!osS
28850 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 ystemTimeToFileT
28860 69 6d 65 28 26 74 69 6d 65 2c 26 66 74 29 29 7b ime(&time,&ft)){
28870 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 . return SQLI
28880 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 TE_ERROR;. }.#e
28890 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73 74 65 lse. osGetSyste
288a0 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 28 mTimeAsFileTime(
288b0 20 26 66 74 20 29 3b 0a 23 65 6e 64 69 66 0a 0a &ft );.#endif..
288c0 20 20 2a 70 69 4e 6f 77 20 3d 20 77 69 6e 46 69 *piNow = winFi
288d0 6c 65 74 69 6d 65 45 70 6f 63 68 20 2b 0a 20 20 letimeEpoch +.
288e0 20 20 20 20 20 20 20 20 20 20 28 28 28 28 73 71 ((((sq
288f0 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 lite3_int64)ft.d
28900 77 48 69 67 68 44 61 74 65 54 69 6d 65 29 2a 6d wHighDateTime)*m
28910 61 78 33 32 42 69 74 56 61 6c 75 65 29 20 2b 20 ax32BitValue) +
28920 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
28930 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 (sqlite3_int64)f
28940 74 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 29 t.dwLowDateTime)
28950 2f 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 /(sqlite3_int64)
28960 31 30 30 30 30 3b 0a 0a 23 69 66 64 65 66 20 53 10000;..#ifdef S
28970 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 QLITE_TEST. if(
28980 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 sqlite3_current
28990 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69 _time ){. *pi
289a0 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69 Now = 1000*(sqli
289b0 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65 te3_int64)sqlite
289c0 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b 3_current_time +
289d0 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a unixEpoch;. }.
289e0 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f #endif. UNUSED_
289f0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b PARAMETER(pVfs);
28a00 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 . return SQLITE
28a10 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 _OK;.}../*.** Fi
28a20 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 nd the current t
28a30 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 ime (in Universa
28a40 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 l Coordinated Ti
28a50 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a me). Write the.
28a60 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 ** current time
28a70 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 and date as a Ju
28a80 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 lian Day number
28a90 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a into *prNow and.
28aa0 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 ** return 0. Re
28ab0 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 turn 1 if the ti
28ac0 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e me and date cann
28ad0 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a ot be found..*/.
28ae0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 75 static int winCu
28af0 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 rrentTime(sqlite
28b00 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f 75 3_vfs *pVfs, dou
28b10 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 69 ble *prNow){. i
28b20 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 nt rc;. sqlite3
28b30 5f 69 6e 74 36 34 20 69 3b 0a 20 20 72 63 20 3d _int64 i;. rc =
28b40 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 winCurrentTimeI
28b50 6e 74 36 34 28 70 56 66 73 2c 20 26 69 29 3b 0a nt64(pVfs, &i);.
28b60 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 if( !rc ){.
28b70 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 *prNow = i/8640
28b80 30 30 30 30 2e 30 3b 0a 20 20 7d 0a 20 20 72 65 0000.0;. }. re
28b90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a turn rc;.}../*.*
28ba0 2a 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68 * The idea is th
28bb0 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e at this function
28bc0 20 77 6f 72 6b 73 20 6c 69 6b 65 20 61 20 63 6f works like a co
28bd0 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 mbination of.**
28be0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 61 GetLastError() a
28bf0 6e 64 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 nd FormatMessage
28c00 28 29 20 6f 6e 20 57 69 6e 64 6f 77 73 20 28 6f () on Windows (o
28c10 72 20 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a 20 73 r errno and.** s
28c20 74 72 65 72 72 6f 72 5f 72 28 29 20 6f 6e 20 55 trerror_r() on U
28c30 6e 69 78 29 2e 20 41 66 74 65 72 20 61 6e 20 65 nix). After an e
28c40 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 rror is returned
28c50 20 62 79 20 61 6e 20 4f 53 0a 2a 2a 20 66 75 6e by an OS.** fun
28c60 63 74 69 6f 6e 2c 20 53 51 4c 69 74 65 20 63 61 ction, SQLite ca
28c70 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f lls this functio
28c80 6e 20 77 69 74 68 20 7a 42 75 66 20 70 6f 69 6e n with zBuf poin
28c90 74 69 6e 67 20 74 6f 0a 2a 2a 20 61 20 62 75 66 ting to.** a buf
28ca0 66 65 72 20 6f 66 20 6e 42 75 66 20 62 79 74 65 fer of nBuf byte
28cb0 73 2e 20 54 68 65 20 4f 53 20 6c 61 79 65 72 20 s. The OS layer
28cc0 73 68 6f 75 6c 64 20 70 6f 70 75 6c 61 74 65 20 should populate
28cd0 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 20 77 69 the.** buffer wi
28ce0 74 68 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 th a nul-termina
28cf0 74 65 64 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 ted UTF-8 encode
28d00 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a d error message.
28d10 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 ** describing th
28d20 65 20 6c 61 73 74 20 49 4f 20 65 72 72 6f 72 20 e last IO error
28d30 74 6f 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 to have occurred
28d40 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c within the call
28d50 69 6e 67 0a 2a 2a 20 74 68 72 65 61 64 2e 0a 2a ing.** thread..*
28d60 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f *.** If the erro
28d70 72 20 6d 65 73 73 61 67 65 20 69 73 20 74 6f 6f r message is too
28d80 20 6c 61 72 67 65 20 66 6f 72 20 74 68 65 20 73 large for the s
28d90 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 2c 0a upplied buffer,.
28da0 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 ** it should be
28db0 74 72 75 6e 63 61 74 65 64 2e 20 54 68 65 20 72 truncated. The r
28dc0 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 78 eturn value of x
28dd0 47 65 74 4c 61 73 74 45 72 72 6f 72 0a 2a 2a 20 GetLastError.**
28de0 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65 is zero if the e
28df0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69 74 rror message fit
28e00 73 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 2c s in the buffer,
28e10 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 or non-zero.**
28e20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20 74 68 otherwise (if th
28e30 65 20 6d 65 73 73 61 67 65 20 77 61 73 20 74 72 e message was tr
28e40 75 6e 63 61 74 65 64 29 2e 20 49 66 20 6e 6f 6e uncated). If non
28e50 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 -zero is returne
28e60 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 d,.** then it is
28e70 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 not necessary t
28e80 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 o include the nu
28e90 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 63 68 61 l-terminator cha
28ea0 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 74 68 65 racter.** in the
28eb0 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 0a output buffer..
28ec0 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70 70 6c 79 **.** Not supply
28ed0 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 ing an error mes
28ee0 73 61 67 65 20 77 69 6c 6c 20 68 61 76 65 20 6e sage will have n
28ef0 6f 20 61 64 76 65 72 73 65 20 65 66 66 65 63 74 o adverse effect
28f00 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74 65 2e 20 49 .** on SQLite. I
28f10 74 20 69 73 20 66 69 6e 65 20 74 6f 20 68 61 76 t is fine to hav
28f20 65 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 e an implementat
28f30 69 6f 6e 20 74 68 61 74 20 6e 65 76 65 72 0a 2a ion that never.*
28f40 2a 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 * returns an err
28f50 6f 72 20 6d 65 73 73 61 67 65 3a 0a 2a 2a 0a 2a or message:.**.*
28f60 2a 20 20 20 69 6e 74 20 78 47 65 74 4c 61 73 74 * int xGetLast
28f70 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 Error(sqlite3_vf
28f80 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 s *pVfs, int nBu
28f90 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a f, char *zBuf){.
28fa0 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 7a 42 ** assert(zB
28fb0 75 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a 2a 2a uf[0]=='\0');.**
28fc0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 2a return 0;.*
28fd0 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 * }.**.** Howe
28fe0 76 65 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 ver if an error
28ff0 6d 65 73 73 61 67 65 20 69 73 20 73 75 70 70 6c message is suppl
29000 69 65 64 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 ied, it will be
29010 69 6e 63 6f 72 70 6f 72 61 74 65 64 0a 2a 2a 20 incorporated.**
29020 62 79 20 73 71 6c 69 74 65 20 69 6e 74 6f 20 74 by sqlite into t
29030 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 he error message
29040 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 available to th
29050 65 20 75 73 65 72 20 75 73 69 6e 67 0a 2a 2a 20 e user using.**
29060 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 sqlite3_errmsg()
29070 2c 20 70 6f 73 73 69 62 6c 79 20 6d 61 6b 69 6e , possibly makin
29080 67 20 49 4f 20 65 72 72 6f 72 73 20 65 61 73 69 g IO errors easi
29090 65 72 20 74 6f 20 64 65 62 75 67 2e 0a 2a 2f 0a er to debug..*/.
290a0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 static int winGe
290b0 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 tLastError(sqlit
290c0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e e3_vfs *pVfs, in
290d0 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 t nBuf, char *zB
290e0 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 uf){. UNUSED_PA
290f0 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 RAMETER(pVfs);.
29100 20 72 65 74 75 72 6e 20 77 69 6e 47 65 74 4c 61 return winGetLa
29110 73 74 45 72 72 6f 72 4d 73 67 28 6f 73 47 65 74 stErrorMsg(osGet
29120 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 6e 42 75 LastError(), nBu
29130 66 2c 20 7a 42 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a f, zBuf);.}../*.
29140 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e ** Initialize an
29150 64 20 64 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 d deinitialize t
29160 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 he operating sys
29170 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a tem interface..*
29180 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 /.int sqlite3_os
29190 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 73 _init(void){. s
291a0 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 tatic sqlite3_vf
291b0 73 20 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20 20 s winVfs = {.
291c0 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 3,
291d0 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f /* iVersio
291e0 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 n */. sizeof(
291f0 77 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a winFile), /*
29200 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 szOsFile */.
29210 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 SQLITE_WIN32_MA
29220 58 5f 50 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a X_PATH_BYTES, /*
29230 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 mxPathname */.
29240 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 0,
29250 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 /* pNext
29260 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 22 2c */. "win32",
29270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
29280 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 zName */. 0,
29290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
292a0 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f /* pAppData */
292b0 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20 . winOpen,
292c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 /* xOp
292d0 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c en */. winDel
292e0 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f ete, /
292f0 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 * xDelete */.
29300 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20 20 winAccess,
29310 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 /* xAccess
29320 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 */. winFullP
29330 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 athname, /*
29340 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f xFullPathname */
29350 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 . winDlOpen,
29360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c /* xDl
29370 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 Open */. winD
29380 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 lError,
29390 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a /* xDlError */.
293a0 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20 winDlSym,
293b0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 /* xDlS
293c0 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43 ym */. winDlC
293d0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f lose, /
293e0 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 * xDlClose */.
293f0 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c winRandomness,
29400 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f /* xRando
29410 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e mness */. win
29420 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 Sleep,
29430 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 /* xSleep */.
29440 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d winCurrentTim
29450 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72 e, /* xCurr
29460 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77 entTime */. w
29470 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 inGetLastError,
29480 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 /* xGetLastE
29490 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43 rror */. winC
294a0 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c urrentTimeInt64,
294b0 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 /* xCurrentTime
294c0 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e Int64 */. win
294d0 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 SetSystemCall,
294e0 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d 43 /* xSetSystemC
294f0 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 all */. winGe
29500 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 tSystemCall,
29510 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61 6c /* xGetSystemCal
29520 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74 l */. winNext
29530 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a SystemCall, /*
29540 20 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c xNextSystemCall
29550 20 2a 2f 0a 20 20 7d 3b 0a 23 69 66 20 64 65 66 */. };.#if def
29560 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 ined(SQLITE_WIN3
29570 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 73 74 2_HAS_WIDE). st
29580 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 atic sqlite3_vfs
29590 20 77 69 6e 4c 6f 6e 67 50 61 74 68 56 66 73 20 winLongPathVfs
295a0 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20 = {. 3,
295b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
295c0 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 iVersion */.
295d0 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c sizeof(winFile),
295e0 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 /* szOsFile
295f0 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f 57 */. SQLITE_W
29600 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42 59 INNT_MAX_PATH_BY
29610 54 45 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e 61 TES, /* mxPathna
29620 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 me */. 0,
29630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
29640 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 * pNext */. "
29650 77 69 6e 33 32 2d 6c 6f 6e 67 70 61 74 68 22 2c win32-longpath",
29660 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a /* zName */.
29670 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 0,
29680 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 /* pApp
29690 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f Data */. winO
296a0 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 pen,
296b0 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 /* xOpen */.
296c0 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 winDelete,
296d0 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 /* xDelete
296e0 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73 */. winAcces
296f0 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 s, /*
29700 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 xAccess */. w
29710 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 inFullPathname,
29720 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 /* xFullPath
29730 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44 name */. winD
29740 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 lOpen,
29750 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 /* xDlOpen */.
29760 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20 winDlError,
29770 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 /* xDlEr
29780 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c ror */. winDl
29790 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 Sym,
297a0 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 /* xDlSym */.
297b0 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20 winDlClose,
297c0 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 /* xDlClos
297d0 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 e */. winRand
297e0 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a omness, /*
297f0 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a xRandomness */.
29800 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 winSleep,
29810 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 /* xSle
29820 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 ep */. winCur
29830 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f rentTime, /
29840 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a * xCurrentTime *
29850 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74 /. winGetLast
29860 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47 Error, /* xG
29870 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 etLastError */.
29880 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d winCurrentTim
29890 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72 eInt64, /* xCurr
298a0 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a entTimeInt64 */.
298b0 20 20 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d winSetSystem
298c0 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65 74 Call, /* xSet
298d0 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 SystemCall */.
298e0 20 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 winGetSystemCa
298f0 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74 53 79 ll, /* xGetSy
29900 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 stemCall */.
29910 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c winNextSystemCal
29920 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 l, /* xNextSys
29930 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a temCall */. };.
29940 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 75 #endif.. /* Dou
29950 62 6c 65 2d 63 68 65 63 6b 20 74 68 61 74 20 74 ble-check that t
29960 68 65 20 61 53 79 73 63 61 6c 6c 5b 5d 20 61 72 he aSyscall[] ar
29970 72 61 79 20 68 61 73 20 62 65 65 6e 20 63 6f 6e ray has been con
29980 73 74 72 75 63 74 65 64 0a 20 20 2a 2a 20 63 6f structed. ** co
29990 72 72 65 63 74 6c 79 2e 20 20 53 65 65 20 74 69 rrectly. See ti
299a0 63 6b 65 74 20 5b 62 62 33 61 38 36 65 38 39 30 cket [bb3a86e890
299b0 63 38 65 39 36 61 62 5d 20 2a 2f 0a 20 20 61 73 c8e96ab] */. as
299c0 73 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 sert( ArraySize(
299d0 61 53 79 73 63 61 6c 6c 29 3d 3d 37 36 20 29 3b aSyscall)==76 );
299e0 0a 0a 20 20 2f 2a 20 67 65 74 20 6d 65 6d 6f 72 .. /* get memor
299f0 79 20 6d 61 70 20 61 6c 6c 6f 63 61 74 69 6f 6e y map allocation
29a00 20 67 72 61 6e 75 6c 61 72 69 74 79 20 2a 2f 0a granularity */.
29a10 20 20 6d 65 6d 73 65 74 28 26 77 69 6e 53 79 73 memset(&winSys
29a20 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 Info, 0, sizeof(
29a30 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 3b 0a 23 SYSTEM_INFO));.#
29a40 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e if SQLITE_OS_WIN
29a50 52 54 0a 20 20 6f 73 47 65 74 4e 61 74 69 76 65 RT. osGetNative
29a60 53 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53 SystemInfo(&winS
29a70 79 73 49 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 ysInfo);.#else.
29a80 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66 6f osGetSystemInfo
29a90 28 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 (&winSysInfo);.#
29aa0 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 endif. assert(
29ab0 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c winSysInfo.dwAll
29ac0 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 ocationGranulari
29ad0 74 79 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 ty>0 );. assert
29ae0 28 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 ( winSysInfo.dwP
29af0 61 67 65 53 69 7a 65 3e 30 20 29 3b 0a 0a 20 20 ageSize>0 );..
29b00 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 sqlite3_vfs_regi
29b10 73 74 65 72 28 26 77 69 6e 56 66 73 2c 20 31 29 ster(&winVfs, 1)
29b20 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 ;..#if defined(S
29b30 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f QLITE_WIN32_HAS_
29b40 57 49 44 45 29 0a 20 20 73 71 6c 69 74 65 33 5f WIDE). sqlite3_
29b50 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 77 69 vfs_register(&wi
29b60 6e 4c 6f 6e 67 50 61 74 68 56 66 73 2c 20 30 29 nLongPathVfs, 0)
29b70 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 ;.#endif.. retu
29b80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d rn SQLITE_OK; .}
29b90 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 ..int sqlite3_os
29ba0 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a 23 69 66 _end(void){ .#if
29bb0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 SQLITE_OS_WINRT
29bc0 0a 20 20 69 66 28 20 73 6c 65 65 70 4f 62 6a 21 . if( sleepObj!
29bd0 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 6f 73 43 =NULL ){. osC
29be0 6c 6f 73 65 48 61 6e 64 6c 65 28 73 6c 65 65 70 loseHandle(sleep
29bf0 4f 62 6a 29 3b 0a 20 20 20 20 73 6c 65 65 70 4f Obj);. sleepO
29c00 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 23 bj = NULL;. }.#
29c10 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 endif. return S
29c20 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e QLITE_OK;.}..#en
29c30 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 dif /* SQLITE_OS
29c40 5f 57 49 4e 20 2a 2f 0a _WIN */.