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 77 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 6e 63 6c liteInt.h".#incl
01d0: 75 64 65 20 22 6f 73 2e 68 22 0a 23 69 66 20 4f ude "os.h".#if O
01e0: 53 5f 57 49 4e 20 20 20 20 20 20 20 20 20 20 20 S_WIN
01f0: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 69 6c 65 /* This file
0200: 20 69 73 20 75 73 65 64 20 66 6f 72 20 77 69 6e is used for win
0210: 64 6f 77 73 20 6f 6e 6c 79 20 2a 2f 0a 0a 23 69 dows only */..#i
0220: 6e 63 6c 75 64 65 20 3c 77 69 6e 62 61 73 65 2e nclude <winbase.
0230: 68 3e 0a 0a 23 69 66 64 65 66 20 5f 5f 43 59 47 h>..#ifdef __CYG
0240: 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65 20 WIN__.# include
0250: 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a 23 <sys/cygwin.h>.#
0260: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 endif../*.** Mac
0270: 72 6f 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 ros used to dete
0280: 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 rmine whether or
0290: 20 6e 6f 74 20 74 6f 20 75 73 65 20 74 68 72 65 not to use thre
02a0: 61 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 ads..*/.#if defi
02b0: 6e 65 64 28 54 48 52 45 41 44 53 41 46 45 29 20 ned(THREADSAFE)
02c0: 26 26 20 54 48 52 45 41 44 53 41 46 45 0a 23 20 && THREADSAFE.#
02d0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 33 define SQLITE_W3
02e0: 32 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e 64 2_THREADS 1.#end
02f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 if../*.** Includ
0300: 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 63 e code that is c
0310: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f ommon to all os_
0320: 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e *.c files.*/.#in
0330: 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e clude "os_common
0340: 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f .h"../*.** Do no
0350: 74 20 69 6e 63 6c 75 64 65 20 61 6e 79 20 6f 66 t include any of
0360: 20 74 68 65 20 46 69 6c 65 20 49 2f 4f 20 69 6e the File I/O in
0370: 74 65 72 66 61 63 65 20 70 72 6f 63 65 64 75 72 terface procedur
0380: 65 73 20 69 66 20 74 68 65 0a 2a 2a 20 53 51 4c es if the.** SQL
0390: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 ITE_OMIT_DISKIO
03a0: 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64 macro is defined
03b0: 20 28 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 (indicating tha
03c0: 74 20 74 68 65 72 65 20 64 61 74 61 62 61 73 65 t there database
03d0: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 69 6e 2d 6d .** will be in-m
03e0: 65 6d 6f 72 79 20 6f 6e 6c 79 29 0a 2a 2f 0a 23 emory only).*/.#
03f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d ifndef SQLITE_OM
0400: 49 54 5f 44 49 53 4b 49 4f 0a 0a 2f 2a 0a 2a 2a IT_DISKIO../*.**
0410: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 The following v
0420: 61 72 69 61 62 6c 65 20 69 73 20 28 6e 6f 72 6d ariable is (norm
0430: 61 6c 6c 79 29 20 73 65 74 20 6f 6e 63 65 20 61 ally) set once a
0440: 6e 64 20 6e 65 76 65 72 20 63 68 61 6e 67 65 73 nd never changes
0450: 0a 2a 2a 20 74 68 65 72 65 61 66 74 65 72 2e 20 .** thereafter.
0460: 20 49 74 20 72 65 63 6f 72 64 73 20 77 68 65 74 It records whet
0470: 68 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6e her the operatin
0480: 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39 g system is Win9
0490: 35 0a 2a 2a 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 5.** or WinNT..*
04a0: 2a 0a 2a 2a 20 30 3a 20 20 20 4f 70 65 72 61 74 *.** 0: Operat
04b0: 69 6e 67 20 73 79 73 74 65 6d 20 75 6e 6b 6e 6f ing system unkno
04c0: 77 6e 2e 0a 2a 2a 20 31 3a 20 20 20 4f 70 65 72 wn..** 1: Oper
04d0: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20 ating system is
04e0: 57 69 6e 39 35 2e 0a 2a 2a 20 32 3a 20 20 20 4f Win95..** 2: O
04f0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 perating system
0500: 69 73 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 is WinNT..**.**
0510: 49 6e 20 6f 72 64 65 72 20 74 6f 20 66 61 63 69 In order to faci
0520: 6c 69 74 61 74 65 20 74 65 73 74 69 6e 67 20 6f litate testing o
0530: 6e 20 61 20 57 69 6e 4e 54 20 73 79 73 74 65 6d n a WinNT system
0540: 2c 20 74 68 65 20 74 65 73 74 20 66 69 78 74 75 , the test fixtu
0550: 72 65 0a 2a 2a 20 63 61 6e 20 6d 61 6e 75 61 6c re.** can manual
0560: 6c 79 20 73 65 74 20 74 68 69 73 20 76 61 6c 75 ly set this valu
0570: 65 20 74 6f 20 31 20 74 6f 20 65 6d 75 6c 61 74 e to 1 to emulat
0580: 65 20 57 69 6e 39 38 20 62 65 68 61 76 69 6f 72 e Win98 behavior
0590: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 ..*/.int sqlite3
05a0: 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 0a 2f _os_type = 0;../
05b0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 *.** Return true
05c0: 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 77 (non-zero) if w
05d0: 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 75 6e e are running un
05e0: 64 65 72 20 57 69 6e 4e 54 2c 20 57 69 6e 32 4b der WinNT, Win2K
05f0: 20 6f 72 20 57 69 6e 58 50 2e 0a 2a 2a 20 52 65 or WinXP..** Re
0600: 74 75 72 6e 20 66 61 6c 73 65 20 28 7a 65 72 6f turn false (zero
0610: 29 20 66 6f 72 20 57 69 6e 39 35 2c 20 57 69 6e ) for Win95, Win
0620: 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e 0a 2a 2a 98, or WinME..**
0630: 0a 2a 2a 20 48 65 72 65 20 69 73 20 61 6e 20 69 .** Here is an i
0640: 6e 74 65 72 65 73 74 69 6e 67 20 6f 62 73 65 72 nteresting obser
0650: 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39 35 2c 20 vation: Win95,
0660: 57 69 6e 39 38 2c 20 61 6e 64 20 57 69 6e 4d 45 Win98, and WinME
0670: 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20 4c 6f 63 lack.** the Loc
0680: 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e 20 20 kFileEx() API.
0690: 42 75 74 20 77 65 20 63 61 6e 20 73 74 69 6c 6c But we can still
06a0: 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b statically link
06b0: 20 61 67 61 69 6e 73 74 20 74 68 61 74 0a 2a 2a against that.**
06c0: 20 41 50 49 20 61 73 20 6c 6f 6e 67 20 61 73 20 API as long as
06d0: 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c 20 69 74 we don't call it
06e0: 20 77 69 6e 20 72 75 6e 6e 69 6e 67 20 57 69 6e win running Win
06f0: 39 35 2f 39 38 2f 4d 45 2e 20 20 41 20 63 61 6c 95/98/ME. A cal
0700: 6c 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75 l to.** this rou
0710: 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 tine is used to
0720: 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 determine if the
0730: 20 68 6f 73 74 20 69 73 20 57 69 6e 39 35 2f 39 host is Win95/9
0740: 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e 54 8/ME or.** WinNT
0750: 2f 32 4b 2f 58 50 20 73 6f 20 74 68 61 74 20 77 /2K/XP so that w
0760: 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 74 e will know whet
0770: 68 65 72 20 6f 72 20 6e 6f 74 20 77 65 20 63 61 her or not we ca
0780: 6e 20 73 61 66 65 6c 79 20 63 61 6c 6c 0a 2a 2a n safely call.**
0790: 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 the LockFileEx(
07a0: 29 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74 69 63 ) API..*/.static
07b0: 20 69 6e 74 20 69 73 4e 54 28 76 6f 69 64 29 7b int isNT(void){
07c0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6f . if( sqlite3_o
07d0: 73 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 s_type==0 ){.
07e0: 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 20 73 OSVERSIONINFO s
07f0: 49 6e 66 6f 3b 0a 20 20 20 20 73 49 6e 66 6f 2e Info;. sInfo.
0800: 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53 dwOSVersionInfoS
0810: 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e ize = sizeof(sIn
0820: 66 6f 29 3b 0a 20 20 20 20 47 65 74 56 65 72 73 fo);. GetVers
0830: 69 6f 6e 45 78 28 26 73 49 6e 66 6f 29 3b 0a 20 ionEx(&sInfo);.
0840: 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 sqlite3_os_ty
0850: 70 65 20 3d 20 73 49 6e 66 6f 2e 64 77 50 6c 61 pe = sInfo.dwPla
0860: 74 66 6f 72 6d 49 64 3d 3d 56 45 52 5f 50 4c 41 tformId==VER_PLA
0870: 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54 20 3f TFORM_WIN32_NT ?
0880: 20 32 20 3a 20 31 3b 0a 20 20 7d 0a 20 20 72 65 2 : 1;. }. re
0890: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6f 73 5f turn sqlite3_os_
08a0: 74 79 70 65 3d 3d 32 3b 0a 7d 0a 0a 2f 2a 0a 2a type==2;.}../*.*
08b0: 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d * Convert a UTF-
08c0: 38 20 73 74 72 69 6e 67 20 74 6f 20 55 54 46 2d 8 string to UTF-
08d0: 33 32 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 32. Space to ho
08e0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 ld the returned
08f0: 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 string.** is obt
0900: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 ained from sqlit
0910: 65 4d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 eMalloc..*/.stat
0920: 69 63 20 57 43 48 41 52 20 2a 75 74 66 38 54 6f ic WCHAR *utf8To
0930: 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 Unicode(const ch
0940: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a ar *zFilename){.
0950: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 57 int nByte;. W
0960: 43 48 41 52 20 2a 7a 57 69 64 65 46 69 6c 65 6e CHAR *zWideFilen
0970: 61 6d 65 3b 0a 0a 20 20 69 66 28 20 21 69 73 4e ame;.. if( !isN
0980: 54 28 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 T() ){. retur
0990: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 n 0;. }. nByte
09a0: 20 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 = MultiByteToWi
09b0: 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 deChar(CP_UTF8,
09c0: 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 0, zFilename, -1
09d0: 2c 20 4e 55 4c 4c 2c 20 30 29 2a 73 69 7a 65 6f , NULL, 0)*sizeo
09e0: 66 28 57 43 48 41 52 29 3b 0a 20 20 7a 57 69 64 f(WCHAR);. zWid
09f0: 65 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 eFilename = sqli
0a00: 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a teMalloc( nByte*
0a10: 73 69 7a 65 6f 66 28 7a 57 69 64 65 46 69 6c 65 sizeof(zWideFile
0a20: 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 name[0]) );. if
0a30: 28 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3d ( zWideFilename=
0a40: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e =0 ){. return
0a50: 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 0;. }. nByte
0a60: 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 = MultiByteToWid
0a70: 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30 eChar(CP_UTF8, 0
0a80: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c , zFilename, -1,
0a90: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 zWideFilename,
0aa0: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 6e 42 nByte);. if( nB
0ab0: 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 yte==0 ){. sq
0ac0: 6c 69 74 65 46 72 65 65 28 7a 57 69 64 65 46 69 liteFree(zWideFi
0ad0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 57 69 lename);. zWi
0ae0: 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a deFilename = 0;.
0af0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 57 69 }. return zWi
0b00: 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f deFilename;.}../
0b10: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 55 54 46 *.** Convert UTF
0b20: 2d 33 32 20 74 6f 20 55 54 46 2d 38 2e 20 20 53 -32 to UTF-8. S
0b30: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 pace to hold the
0b40: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 returned string
0b50: 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 is.** obtained
0b60: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f from sqliteMallo
0b70: 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 c()..*/.static c
0b80: 68 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f 55 74 har *unicodeToUt
0b90: 66 38 28 63 6f 6e 73 74 20 57 43 48 41 52 20 2a f8(const WCHAR *
0ba0: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a zWideFilename){.
0bb0: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 int nByte;. c
0bc0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a har *zFilename;.
0bd0: 0a 20 20 6e 42 79 74 65 20 3d 20 57 69 64 65 43 . nByte = WideC
0be0: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 harToMultiByte(C
0bf0: 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 P_UTF8, 0, zWide
0c00: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c Filename, -1, 0,
0c10: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7a 46 69 0, 0, 0);. zFi
0c20: 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 4d lename = sqliteM
0c30: 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a alloc( nByte );.
0c40: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d if( zFilename=
0c50: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e =0 ){. return
0c60: 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 0;. }. nByte
0c70: 3d 20 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 = WideCharToMult
0c80: 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30 iByte(CP_UTF8, 0
0c90: 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c , zWideFilename,
0ca0: 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 -1, zFilename,
0cb0: 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20 nByte,.
0cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0cd0: 20 20 20 20 20 30 2c 20 30 29 3b 0a 20 20 69 66 0, 0);. if
0ce0: 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a ( nByte == 0 ){.
0cf0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a sqliteFree(z
0d00: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a Filename);. z
0d10: 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 Filename = 0;.
0d20: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 }. return zFile
0d30: 6e 61 6d 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 name;.}.../*.**
0d40: 44 65 6c 65 74 65 20 74 68 65 20 6e 61 6d 65 64 Delete the named
0d50: 20 66 69 6c 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c file.*/.int sql
0d60: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 63 6f 6e ite3OsDelete(con
0d70: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 st char *zFilena
0d80: 6d 65 29 7b 0a 20 20 57 43 48 41 52 20 2a 7a 57 me){. WCHAR *zW
0d90: 69 64 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 ide = utf8ToUnic
0da0: 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a ode(zFilename);.
0db0: 20 20 69 66 28 20 7a 57 69 64 65 20 29 7b 0a 20 if( zWide ){.
0dc0: 20 20 20 44 65 6c 65 74 65 46 69 6c 65 57 28 7a DeleteFileW(z
0dd0: 57 69 64 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 Wide);. sqlit
0de0: 65 46 72 65 65 28 7a 57 69 64 65 29 3b 0a 20 20 eFree(zWide);.
0df0: 7d 65 6c 73 65 7b 0a 20 20 20 20 44 65 6c 65 74 }else{. Delet
0e00: 65 46 69 6c 65 41 28 7a 46 69 6c 65 6e 61 6d 65 eFileA(zFilename
0e10: 29 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 32 28 );. }. TRACE2(
0e20: 22 44 45 4c 45 54 45 20 5c 22 25 73 5c 22 5c 6e "DELETE \"%s\"\n
0e30: 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 ", zFilename);.
0e40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
0e50: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 K;.}../*.** Retu
0e60: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6e rn TRUE if the n
0e70: 61 6d 65 64 20 66 69 6c 65 20 65 78 69 73 74 73 amed file exists
0e80: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 ..*/.int sqlite3
0e90: 4f 73 46 69 6c 65 45 78 69 73 74 73 28 63 6f 6e OsFileExists(con
0ea0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 st char *zFilena
0eb0: 6d 65 29 7b 0a 20 20 69 6e 74 20 65 78 69 73 74 me){. int exist
0ec0: 73 20 3d 20 30 3b 0a 20 20 57 43 48 41 52 20 2a s = 0;. WCHAR *
0ed0: 7a 57 69 64 65 20 3d 20 75 74 66 38 54 6f 55 6e zWide = utf8ToUn
0ee0: 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 icode(zFilename)
0ef0: 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 20 29 7b ;. if( zWide ){
0f00: 0a 20 20 20 20 65 78 69 73 74 73 20 3d 20 47 65 . exists = Ge
0f10: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 tFileAttributesW
0f20: 28 7a 57 69 64 65 29 20 21 3d 20 30 78 66 66 66 (zWide) != 0xfff
0f30: 66 66 66 66 66 3b 0a 20 20 20 20 73 71 6c 69 74 fffff;. sqlit
0f40: 65 46 72 65 65 28 7a 57 69 64 65 29 3b 0a 20 20 eFree(zWide);.
0f50: 7d 65 6c 73 65 7b 0a 20 20 20 20 65 78 69 73 74 }else{. exist
0f60: 73 20 3d 20 47 65 74 46 69 6c 65 41 74 74 72 69 s = GetFileAttri
0f70: 62 75 74 65 73 41 28 7a 46 69 6c 65 6e 61 6d 65 butesA(zFilename
0f80: 29 20 21 3d 20 30 78 66 66 66 66 66 66 66 66 3b ) != 0xffffffff;
0f90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 78 . }. return ex
0fa0: 69 73 74 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 ists;.}../*.** A
0fb0: 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61 ttempt to open a
0fc0: 20 66 69 6c 65 20 66 6f 72 20 62 6f 74 68 20 72 file for both r
0fd0: 65 61 64 69 6e 67 20 61 6e 64 20 77 72 69 74 69 eading and writi
0fe0: 6e 67 2e 20 20 49 66 20 74 68 61 74 0a 2a 2a 20 ng. If that.**
0ff0: 66 61 69 6c 73 2c 20 74 72 79 20 6f 70 65 6e 69 fails, try openi
1000: 6e 67 20 69 74 20 72 65 61 64 2d 6f 6e 6c 79 2e ng it read-only.
1010: 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 64 6f If the file do
1020: 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 0a 2a 2a es not exist,.**
1030: 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 69 try to create i
1040: 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 t..**.** On succ
1050: 65 73 73 2c 20 61 20 68 61 6e 64 6c 65 20 66 6f ess, a handle fo
1060: 72 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 r the open file
1070: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 69 is written to *i
1080: 64 0a 2a 2a 20 61 6e 64 20 2a 70 52 65 61 64 6f d.** and *pReado
1090: 6e 6c 79 20 69 73 20 73 65 74 20 74 6f 20 30 20 nly is set to 0
10a0: 69 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 if the file was
10b0: 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 69 opened for readi
10c0: 6e 67 20 61 6e 64 0a 2a 2a 20 77 72 69 74 69 6e ng and.** writin
10d0: 67 20 6f 72 20 31 20 69 66 20 74 68 65 20 66 69 g or 1 if the fi
10e0: 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 72 65 le was opened re
10f0: 61 64 2d 6f 6e 6c 79 2e 20 20 54 68 65 20 66 75 ad-only. The fu
1100: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a nction returns.*
1110: 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a * SQLITE_OK..**.
1120: 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74 ** On failure, t
1130: 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 he function retu
1140: 72 6e 73 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f rns SQLITE_CANTO
1150: 50 45 4e 20 61 6e 64 20 6c 65 61 76 65 73 0a 2a PEN and leaves.*
1160: 2a 20 2a 69 64 20 61 6e 64 20 2a 70 52 65 61 64 * *id and *pRead
1170: 6f 6e 6c 79 20 75 6e 63 68 61 6e 67 65 64 2e 0a only unchanged..
1180: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 */.int sqlite3Os
1190: 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 0a 20 OpenReadWrite(.
11a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 const char *zFi
11b0: 6c 65 6e 61 6d 65 2c 0a 20 20 4f 73 46 69 6c 65 lename,. OsFile
11c0: 20 2a 69 64 2c 0a 20 20 69 6e 74 20 2a 70 52 65 *id,. int *pRe
11d0: 61 64 6f 6e 6c 79 0a 29 7b 0a 20 20 48 41 4e 44 adonly.){. HAND
11e0: 4c 45 20 68 3b 0a 20 20 57 43 48 41 52 20 2a 7a LE h;. WCHAR *z
11f0: 57 69 64 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 Wide = utf8ToUni
1200: 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b code(zFilename);
1210: 0a 20 20 61 73 73 65 72 74 28 20 21 69 64 2d 3e . assert( !id->
1220: 69 73 4f 70 65 6e 20 29 3b 0a 20 20 69 66 28 20 isOpen );. if(
1230: 7a 57 69 64 65 20 29 7b 0a 20 20 20 20 68 20 3d zWide ){. h =
1240: 20 43 72 65 61 74 65 46 69 6c 65 57 28 7a 57 69 CreateFileW(zWi
1250: 64 65 2c 0a 20 20 20 20 20 20 20 47 45 4e 45 52 de,. GENER
1260: 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49 IC_READ | GENERI
1270: 43 5f 57 52 49 54 45 2c 0a 20 20 20 20 20 20 20 C_WRITE,.
1280: 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20 FILE_SHARE_READ
1290: 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 | FILE_SHARE_WRI
12a0: 54 45 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 2c TE,. NULL,
12b0: 0a 20 20 20 20 20 20 20 4f 50 45 4e 5f 41 4c 57 . OPEN_ALW
12c0: 41 59 53 2c 0a 20 20 20 20 20 20 20 46 49 4c 45 AYS,. FILE
12d0: 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 _ATTRIBUTE_NORMA
12e0: 4c 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 L | FILE_FLAG_RA
12f0: 4e 44 4f 4d 5f 41 43 43 45 53 53 2c 0a 20 20 20 NDOM_ACCESS,.
1300: 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a NULL. );.
1310: 20 20 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c if( h==INVAL
1320: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 ID_HANDLE_VALUE
1330: 29 7b 0a 20 20 20 20 20 20 68 20 3d 20 43 72 65 ){. h = Cre
1340: 61 74 65 46 69 6c 65 57 28 7a 57 69 64 65 2c 0a ateFileW(zWide,.
1350: 20 20 20 20 20 20 20 20 20 47 45 4e 45 52 49 43 GENERIC
1360: 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20 _READ,.
1370: 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 2c FILE_SHARE_READ,
1380: 0a 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a . NULL,.
1390: 20 20 20 20 20 20 20 20 20 4f 50 45 4e 5f 41 4c OPEN_AL
13a0: 57 41 59 53 2c 0a 20 20 20 20 20 20 20 20 20 46 WAYS,. F
13b0: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f ILE_ATTRIBUTE_NO
13c0: 52 4d 41 4c 20 7c 20 46 49 4c 45 5f 46 4c 41 47 RMAL | FILE_FLAG
13d0: 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 2c 0a _RANDOM_ACCESS,.
13e0: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20 20 NULL.
13f0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 );. if(
1400: 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 h==INVALID_HAND
1410: 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 LE_VALUE ){.
1420: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a sqliteFree(z
1430: 57 69 64 65 29 3b 0a 20 20 20 20 20 20 20 20 72 Wide);. r
1440: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e eturn SQLITE_CAN
1450: 54 4f 50 45 4e 3b 0a 20 20 20 20 20 20 7d 0a 20 TOPEN;. }.
1460: 20 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c 79 20 *pReadonly
1470: 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a = 1;. }else{.
1480: 20 20 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c 79 *pReadonly
1490: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 = 0;. }.
14a0: 73 71 6c 69 74 65 46 72 65 65 28 7a 57 69 64 65 sqliteFree(zWide
14b0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 );. }else{.
14c0: 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 41 28 h = CreateFileA(
14d0: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 zFilename,.
14e0: 20 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20 7c GENERIC_READ |
14f0: 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 2c 0a GENERIC_WRITE,.
1500: 20 20 20 20 20 20 20 46 49 4c 45 5f 53 48 41 52 FILE_SHAR
1510: 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f 53 48 E_READ | FILE_SH
1520: 41 52 45 5f 57 52 49 54 45 2c 0a 20 20 20 20 20 ARE_WRITE,.
1530: 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 4f NULL,. O
1540: 50 45 4e 5f 41 4c 57 41 59 53 2c 0a 20 20 20 20 PEN_ALWAYS,.
1550: 20 20 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 FILE_ATTRIBUT
1560: 45 5f 4e 4f 52 4d 41 4c 20 7c 20 46 49 4c 45 5f E_NORMAL | FILE_
1570: 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 FLAG_RANDOM_ACCE
1580: 53 53 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 0a SS,. NULL.
1590: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 68 );. if( h
15a0: 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 ==INVALID_HANDLE
15b0: 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 20 20 _VALUE ){.
15c0: 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 41 28 h = CreateFileA(
15d0: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 zFilename,.
15e0: 20 20 20 20 47 45 4e 45 52 49 43 5f 52 45 41 44 GENERIC_READ
15f0: 2c 0a 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f ,. FILE_
1600: 53 48 41 52 45 5f 52 45 41 44 2c 0a 20 20 20 20 SHARE_READ,.
1610: 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 NULL,.
1620: 20 20 20 20 4f 50 45 4e 5f 41 4c 57 41 59 53 2c OPEN_ALWAYS,
1630: 0a 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 41 . FILE_A
1640: 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 20 TTRIBUTE_NORMAL
1650: 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 | FILE_FLAG_RAND
1660: 4f 4d 5f 41 43 43 45 53 53 2c 0a 20 20 20 20 20 OM_ACCESS,.
1670: 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 NULL. )
1680: 3b 0a 20 20 20 20 20 20 69 66 28 20 68 3d 3d 49 ;. if( h==I
1690: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 NVALID_HANDLE_VA
16a0: 4c 55 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 LUE ){. r
16b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e eturn SQLITE_CAN
16c0: 54 4f 50 45 4e 3b 0a 20 20 20 20 20 20 7d 0a 20 TOPEN;. }.
16d0: 20 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c 79 20 *pReadonly
16e0: 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a = 1;. }else{.
16f0: 20 20 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c 79 *pReadonly
1700: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a = 0;. }. }.
1710: 20 20 69 64 2d 3e 68 20 3d 20 68 3b 0a 20 20 69 id->h = h;. i
1720: 64 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f d->locktype = NO
1730: 5f 4c 4f 43 4b 3b 0a 20 20 69 64 2d 3e 73 68 61 _LOCK;. id->sha
1740: 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 30 3b redLockByte = 0;
1750: 0a 20 20 69 64 2d 3e 69 73 4f 70 65 6e 20 3d 20 . id->isOpen =
1760: 31 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 1;. OpenCounter
1770: 28 2b 31 29 3b 0a 20 20 54 52 41 43 45 33 28 22 (+1);. TRACE3("
1780: 4f 50 45 4e 20 52 2f 57 20 25 64 20 5c 22 25 73 OPEN R/W %d \"%s
1790: 5c 22 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e \"\n", h, zFilen
17a0: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 ame);. return S
17b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a QLITE_OK;.}.../*
17c0: 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f .** Attempt to o
17d0: 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 20 66 pen a new file f
17e0: 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 or exclusive acc
17f0: 65 73 73 20 62 79 20 74 68 69 73 20 70 72 6f 63 ess by this proc
1800: 65 73 73 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 ess..** The file
1810: 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 will be opened
1820: 66 6f 72 20 62 6f 74 68 20 72 65 61 64 69 6e 67 for both reading
1830: 20 61 6e 64 20 77 72 69 74 69 6e 67 2e 20 20 54 and writing. T
1840: 6f 20 61 76 6f 69 64 0a 2a 2a 20 61 20 70 6f 74 o avoid.** a pot
1850: 65 6e 74 69 61 6c 20 73 65 63 75 72 69 74 79 20 ential security
1860: 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 6f 20 6e problem, we do n
1870: 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 66 69 6c ot allow the fil
1880: 65 20 74 6f 20 68 61 76 65 0a 2a 2a 20 70 72 65 e to have.** pre
1890: 76 69 6f 75 73 6c 79 20 65 78 69 73 74 65 64 2e viously existed.
18a0: 20 20 4e 6f 72 20 64 6f 20 77 65 20 61 6c 6c 6f Nor do we allo
18b0: 77 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 w the file to be
18c0: 20 61 20 73 79 6d 62 6f 6c 69 63 0a 2a 2a 20 6c a symbolic.** l
18d0: 69 6e 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 ink..**.** If de
18e0: 6c 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 lFlag is true, t
18f0: 68 65 6e 20 6d 61 6b 65 20 61 72 72 61 6e 67 65 hen make arrange
1900: 6d 65 6e 74 73 20 74 6f 20 61 75 74 6f 6d 61 74 ments to automat
1910: 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 0a 2a 2a ically delete.**
1920: 20 74 68 65 20 66 69 6c 65 20 77 68 65 6e 20 69 the file when i
1930: 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a t is closed..**.
1940: 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 77 ** On success, w
1950: 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 68 61 rite the file ha
1960: 6e 64 6c 65 20 69 6e 74 6f 20 2a 69 64 20 61 6e ndle into *id an
1970: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f d return SQLITE_
1980: 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 OK..**.** On fai
1990: 6c 75 72 65 2c 20 72 65 74 75 72 6e 20 53 51 4c lure, return SQL
19a0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a 2f ITE_CANTOPEN..*/
19b0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 4f 70 .int sqlite3OsOp
19c0: 65 6e 45 78 63 6c 75 73 69 76 65 28 63 6f 6e 73 enExclusive(cons
19d0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d t char *zFilenam
19e0: 65 2c 20 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 e, OsFile *id, i
19f0: 6e 74 20 64 65 6c 46 6c 61 67 29 7b 0a 20 20 48 nt delFlag){. H
1a00: 41 4e 44 4c 45 20 68 3b 0a 20 20 69 6e 74 20 66 ANDLE h;. int f
1a10: 69 6c 65 66 6c 61 67 73 3b 0a 20 20 57 43 48 41 ileflags;. WCHA
1a20: 52 20 2a 7a 57 69 64 65 20 3d 20 75 74 66 38 54 R *zWide = utf8T
1a30: 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 oUnicode(zFilena
1a40: 6d 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 me);. assert( !
1a50: 69 64 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20 id->isOpen );.
1a60: 69 66 28 20 64 65 6c 46 6c 61 67 20 29 7b 0a 20 if( delFlag ){.
1a70: 20 20 20 66 69 6c 65 66 6c 61 67 73 20 3d 20 46 fileflags = F
1a80: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 54 45 ILE_ATTRIBUTE_TE
1a90: 4d 50 4f 52 41 52 59 20 7c 20 46 49 4c 45 5f 46 MPORARY | FILE_F
1aa0: 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 LAG_RANDOM_ACCES
1ab0: 53 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 S .
1ac0: 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 46 | FILE_F
1ad0: 4c 41 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c LAG_DELETE_ON_CL
1ae0: 4f 53 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 OSE;. }else{.
1af0: 20 20 66 69 6c 65 66 6c 61 67 73 20 3d 20 46 49 fileflags = FI
1b00: 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 LE_FLAG_RANDOM_A
1b10: 43 43 45 53 53 3b 0a 20 20 7d 0a 20 20 69 66 28 CCESS;. }. if(
1b20: 20 7a 57 69 64 65 20 29 7b 0a 20 20 20 20 68 20 zWide ){. h
1b30: 3d 20 43 72 65 61 74 65 46 69 6c 65 57 28 7a 57 = CreateFileW(zW
1b40: 69 64 65 2c 0a 20 20 20 20 20 20 20 47 45 4e 45 ide,. GENE
1b50: 52 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 RIC_READ | GENER
1b60: 49 43 5f 57 52 49 54 45 2c 0a 20 20 20 20 20 20 IC_WRITE,.
1b70: 20 30 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0,. NULL,
1b80: 0a 20 20 20 20 20 20 20 43 52 45 41 54 45 5f 41 . CREATE_A
1b90: 4c 57 41 59 53 2c 0a 20 20 20 20 20 20 20 66 69 LWAYS,. fi
1ba0: 6c 65 66 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 leflags,.
1bb0: 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a 20 20 20 20 NULL. );.
1bc0: 73 71 6c 69 74 65 46 72 65 65 28 7a 57 69 64 65 sqliteFree(zWide
1bd0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 );. }else{.
1be0: 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 41 28 h = CreateFileA(
1bf0: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 zFilename,.
1c00: 20 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20 7c GENERIC_READ |
1c10: 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 2c 0a GENERIC_WRITE,.
1c20: 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 0,.
1c30: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 43 52 NULL,. CR
1c40: 45 41 54 45 5f 41 4c 57 41 59 53 2c 0a 20 20 20 EATE_ALWAYS,.
1c50: 20 20 20 20 66 69 6c 65 66 6c 61 67 73 2c 0a 20 fileflags,.
1c60: 20 20 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20 29 NULL. )
1c70: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 68 3d 3d 49 ;. }. if( h==I
1c80: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 NVALID_HANDLE_VA
1c90: 4c 55 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 LUE ){. retur
1ca0: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 n SQLITE_CANTOPE
1cb0: 4e 3b 0a 20 20 7d 0a 20 20 69 64 2d 3e 68 20 3d N;. }. id->h =
1cc0: 20 68 3b 0a 20 20 69 64 2d 3e 6c 6f 63 6b 74 79 h;. id->lockty
1cd0: 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 pe = NO_LOCK;.
1ce0: 69 64 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 id->sharedLockBy
1cf0: 74 65 20 3d 20 30 3b 0a 20 20 69 64 2d 3e 69 73 te = 0;. id->is
1d00: 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 4f 70 65 6e Open = 1;. Open
1d10: 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 54 Counter(+1);. T
1d20: 52 41 43 45 33 28 22 4f 50 45 4e 20 45 58 20 25 RACE3("OPEN EX %
1d30: 64 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 68 2c 20 d \"%s\"\n", h,
1d40: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 65 zFilename);. re
1d50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a turn SQLITE_OK;.
1d60: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 }../*.** Attempt
1d70: 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 to open a new f
1d80: 69 6c 65 20 66 6f 72 20 72 65 61 64 2d 6f 6e 6c ile for read-onl
1d90: 79 20 61 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 y access..**.**
1da0: 4f 6e 20 73 75 63 63 65 73 73 2c 20 77 72 69 74 On success, writ
1db0: 65 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c e the file handl
1dc0: 65 20 69 6e 74 6f 20 2a 69 64 20 61 6e 64 20 72 e into *id and r
1dd0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e eturn SQLITE_OK.
1de0: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 .**.** On failur
1df0: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 e, return SQLITE
1e00: 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a 2f 0a 69 6e _CANTOPEN..*/.in
1e10: 74 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 t sqlite3OsOpenR
1e20: 65 61 64 4f 6e 6c 79 28 63 6f 6e 73 74 20 63 68 eadOnly(const ch
1e30: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f ar *zFilename, O
1e40: 73 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20 48 41 sFile *id){. HA
1e50: 4e 44 4c 45 20 68 3b 0a 20 20 57 43 48 41 52 20 NDLE h;. WCHAR
1e60: 2a 7a 57 69 64 65 20 3d 20 75 74 66 38 54 6f 55 *zWide = utf8ToU
1e70: 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 nicode(zFilename
1e80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69 64 );. assert( !id
1e90: 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20 69 66 ->isOpen );. if
1ea0: 28 20 7a 57 69 64 65 20 29 7b 0a 20 20 20 20 68 ( zWide ){. h
1eb0: 20 3d 20 43 72 65 61 74 65 46 69 6c 65 57 28 7a = CreateFileW(z
1ec0: 57 69 64 65 2c 0a 20 20 20 20 20 20 20 47 45 4e Wide,. GEN
1ed0: 45 52 49 43 5f 52 45 41 44 2c 0a 20 20 20 20 20 ERIC_READ,.
1ee0: 20 20 30 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 0,. NULL
1ef0: 2c 0a 20 20 20 20 20 20 20 4f 50 45 4e 5f 45 58 ,. OPEN_EX
1f00: 49 53 54 49 4e 47 2c 0a 20 20 20 20 20 20 20 46 ISTING,. F
1f10: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f ILE_ATTRIBUTE_NO
1f20: 52 4d 41 4c 20 7c 20 46 49 4c 45 5f 46 4c 41 47 RMAL | FILE_FLAG
1f30: 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 2c 0a _RANDOM_ACCESS,.
1f40: 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20 NULL.
1f50: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 );. sqliteFre
1f60: 65 28 7a 57 69 64 65 29 3b 0a 20 20 7d 65 6c 73 e(zWide);. }els
1f70: 65 7b 0a 20 20 20 20 68 20 3d 20 43 72 65 61 74 e{. h = Creat
1f80: 65 46 69 6c 65 41 28 7a 46 69 6c 65 6e 61 6d 65 eFileA(zFilename
1f90: 2c 0a 20 20 20 20 20 20 20 47 45 4e 45 52 49 43 ,. GENERIC
1fa0: 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 30 2c _READ,. 0,
1fb0: 0a 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 . NULL,.
1fc0: 20 20 20 20 20 4f 50 45 4e 5f 45 58 49 53 54 49 OPEN_EXISTI
1fd0: 4e 47 2c 0a 20 20 20 20 20 20 20 46 49 4c 45 5f NG,. FILE_
1fe0: 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c ATTRIBUTE_NORMAL
1ff0: 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e | FILE_FLAG_RAN
2000: 44 4f 4d 5f 41 43 43 45 53 53 2c 0a 20 20 20 20 DOM_ACCESS,.
2010: 20 20 20 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a 20 NULL. );.
2020: 20 7d 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 }. if( h==INVA
2030: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 LID_HANDLE_VALUE
2040: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 ){. return S
2050: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a QLITE_CANTOPEN;.
2060: 20 20 7d 0a 20 20 69 64 2d 3e 68 20 3d 20 68 3b }. id->h = h;
2070: 0a 20 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 20 . id->locktype
2080: 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 69 64 2d = NO_LOCK;. id-
2090: 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 >sharedLockByte
20a0: 3d 20 30 3b 0a 20 20 69 64 2d 3e 69 73 4f 70 65 = 0;. id->isOpe
20b0: 6e 20 3d 20 31 3b 0a 20 20 4f 70 65 6e 43 6f 75 n = 1;. OpenCou
20c0: 6e 74 65 72 28 2b 31 29 3b 0a 20 20 54 52 41 43 nter(+1);. TRAC
20d0: 45 33 28 22 4f 50 45 4e 20 52 4f 20 25 64 20 5c E3("OPEN RO %d \
20e0: 22 25 73 5c 22 5c 6e 22 2c 20 68 2c 20 7a 46 69 "%s\"\n", h, zFi
20f0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 lename);. retur
2100: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a n SQLITE_OK;.}..
2110: 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f /*.** Attempt to
2120: 20 6f 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73 open a file des
2130: 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 criptor for the
2140: 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 directory that c
2150: 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 66 69 6c ontains a.** fil
2160: 65 2e 20 20 54 68 69 73 20 66 69 6c 65 20 64 65 e. This file de
2170: 73 63 72 69 70 74 6f 72 20 63 61 6e 20 62 65 20 scriptor can be
2180: 75 73 65 64 20 74 6f 20 66 73 79 6e 63 28 29 20 used to fsync()
2190: 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a the directory.**
21a0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b in order to mak
21b0: 65 20 73 75 72 65 20 74 68 65 20 63 72 65 61 74 e sure the creat
21c0: 69 6f 6e 20 6f 66 20 61 20 6e 65 77 20 66 69 6c ion of a new fil
21d0: 65 20 69 73 20 61 63 74 75 61 6c 6c 79 20 77 72 e is actually wr
21e0: 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 64 69 73 6b itten.** to disk
21f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 ..**.** This rou
2200: 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 6d 65 61 tine is only mea
2210: 6e 69 6e 67 66 75 6c 20 66 6f 72 20 55 6e 69 78 ningful for Unix
2220: 2e 20 20 49 74 20 69 73 20 61 20 6e 6f 2d 6f 70 . It is a no-op
2230: 20 75 6e 64 65 72 0a 2a 2a 20 77 69 6e 64 6f 77 under.** window
2240: 73 20 73 69 6e 63 65 20 77 69 6e 64 6f 77 73 20 s since windows
2250: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 does not support
2260: 20 68 61 72 64 20 6c 69 6e 6b 73 2e 0a 2a 2a 0a hard links..**.
2270: 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 61 ** On success, a
2280: 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 20 70 72 handle for a pr
2290: 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 20 66 69 eviously open fi
22a0: 6c 65 20 69 73 20 61 74 20 2a 69 64 20 69 73 0a le is at *id is.
22b0: 2a 2a 20 75 70 64 61 74 65 64 20 77 69 74 68 20 ** updated with
22c0: 74 68 65 20 6e 65 77 20 64 69 72 65 63 74 6f 72 the new director
22d0: 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f y file descripto
22e0: 72 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 r and SQLITE_OK
22f0: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a is.** returned..
2300: 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65 **.** On failure
2310: 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 , the function r
2320: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 41 eturns SQLITE_CA
2330: 4e 54 4f 50 45 4e 20 61 6e 64 20 6c 65 61 76 65 NTOPEN and leave
2340: 73 0a 2a 2a 20 2a 69 64 20 75 6e 63 68 61 6e 67 s.** *id unchang
2350: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 ed..*/.int sqlit
2360: 65 33 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 e3OsOpenDirector
2370: 79 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 y(. const char
2380: 2a 7a 44 69 72 6e 61 6d 65 2c 0a 20 20 4f 73 46 *zDirname,. OsF
2390: 69 6c 65 20 2a 69 64 0a 29 7b 0a 20 20 72 65 74 ile *id.){. ret
23a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d urn SQLITE_OK;.}
23b0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 ../*.** If the f
23c0: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 ollowing global
23d0: 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20 variable points
23e0: 74 6f 20 61 20 73 74 72 69 6e 67 20 77 68 69 63 to a string whic
23f0: 68 20 69 73 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 h is the.** name
2400: 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79 2c of a directory,
2410: 20 74 68 65 6e 20 74 68 61 74 20 64 69 72 65 63 then that direc
2420: 74 6f 72 79 20 77 69 6c 6c 20 62 65 20 75 73 65 tory will be use
2430: 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 74 65 d to store.** te
2440: 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a mporary files..*
2450: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f /.char *sqlite3_
2460: 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d temp_directory =
2470: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 0;../*.** Creat
2480: 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 e a temporary fi
2490: 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e le name in zBuf.
24a0: 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20 62 zBuf must be b
24b0: 69 67 20 65 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20 ig enough to.**
24c0: 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 53 51 hold at least SQ
24d0: 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 LITE_TEMPNAME_SI
24e0: 5a 45 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a ZE characters..*
24f0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 54 /.int sqlite3OsT
2500: 65 6d 70 46 69 6c 65 4e 61 6d 65 28 63 68 61 72 empFileName(char
2510: 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69 *zBuf){. stati
2520: 63 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 c char zChars[]
2530: 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67 68 69 =. "abcdefghi
2540: 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 jklmnopqrstuvwxy
2550: 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 z". "ABCDEFGH
2560: 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 IJKLMNOPQRSTUVWX
2570: 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 YZ". "0123456
2580: 37 38 39 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 789";. int i, j
2590: 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 50 61 ;. char zTempPa
25a0: 74 68 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 th[SQLITE_TEMPNA
25b0: 4d 45 5f 53 49 5a 45 5d 3b 0a 20 20 69 66 28 20 ME_SIZE];. if(
25c0: 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 sqlite3_temp_dir
25d0: 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 73 74 ectory ){. st
25e0: 72 6e 63 70 79 28 7a 54 65 6d 70 50 61 74 68 2c rncpy(zTempPath,
25f0: 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 sqlite3_temp_di
2600: 72 65 63 74 6f 72 79 2c 20 53 51 4c 49 54 45 5f rectory, SQLITE_
2610: 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 2d 33 30 TEMPNAME_SIZE-30
2620: 29 3b 0a 20 20 20 20 7a 54 65 6d 70 50 61 74 68 );. zTempPath
2630: 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 [SQLITE_TEMPNAME
2640: 5f 53 49 5a 45 2d 33 30 5d 20 3d 20 30 3b 0a 20 _SIZE-30] = 0;.
2650: 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e 54 28 }else if( isNT(
2660: 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a ) ){. char *z
2670: 4d 75 6c 74 69 3b 0a 20 20 20 20 57 43 48 41 52 Multi;. WCHAR
2680: 20 7a 57 69 64 65 50 61 74 68 5b 53 51 4c 49 54 zWidePath[SQLIT
2690: 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d E_TEMPNAME_SIZE]
26a0: 3b 0a 20 20 20 20 47 65 74 54 65 6d 70 50 61 74 ;. GetTempPat
26b0: 68 57 28 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 hW(SQLITE_TEMPNA
26c0: 4d 45 5f 53 49 5a 45 2d 33 30 2c 20 7a 57 69 64 ME_SIZE-30, zWid
26d0: 65 50 61 74 68 29 3b 0a 20 20 20 20 7a 4d 75 6c ePath);. zMul
26e0: 74 69 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 ti = unicodeToUt
26f0: 66 38 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 f8(zWidePath);.
2700: 20 20 20 69 66 28 20 7a 4d 75 6c 74 69 20 29 7b if( zMulti ){
2710: 0a 20 20 20 20 20 20 73 74 72 6e 63 70 79 28 7a . strncpy(z
2720: 54 65 6d 70 50 61 74 68 2c 20 7a 4d 75 6c 74 69 TempPath, zMulti
2730: 2c 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d , SQLITE_TEMPNAM
2740: 45 5f 53 49 5a 45 2d 33 30 29 3b 0a 20 20 20 20 E_SIZE-30);.
2750: 20 20 7a 54 65 6d 70 50 61 74 68 5b 53 51 4c 49 zTempPath[SQLI
2760: 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 TE_TEMPNAME_SIZE
2770: 2d 33 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 -30] = 0;.
2780: 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 75 6c 74 sqliteFree(zMult
2790: 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 i);. }. }els
27a0: 65 7b 0a 20 20 20 20 47 65 74 54 65 6d 70 50 61 e{. GetTempPa
27b0: 74 68 41 28 53 51 4c 49 54 45 5f 54 45 4d 50 4e thA(SQLITE_TEMPN
27c0: 41 4d 45 5f 53 49 5a 45 2d 33 30 2c 20 7a 54 65 AME_SIZE-30, zTe
27d0: 6d 70 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 66 mpPath);. }. f
27e0: 6f 72 28 69 3d 73 74 72 6c 65 6e 28 7a 54 65 6d or(i=strlen(zTem
27f0: 70 50 61 74 68 29 3b 20 69 3e 30 20 26 26 20 7a pPath); i>0 && z
2800: 54 65 6d 70 50 61 74 68 5b 69 2d 31 5d 3d 3d 27 TempPath[i-1]=='
2810: 5c 5c 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 7a 54 \\'; i--){}. zT
2820: 65 6d 70 50 61 74 68 5b 69 5d 20 3d 20 30 3b 0a empPath[i] = 0;.
2830: 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 73 for(;;){. s
2840: 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 73 printf(zBuf, "%s
2850: 5c 5c 22 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 \\"TEMP_FILE_PRE
2860: 46 49 58 2c 20 7a 54 65 6d 70 50 61 74 68 29 3b FIX, zTempPath);
2870: 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e 28 . j = strlen(
2880: 7a 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 zBuf);. sqlit
2890: 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c e3Randomness(15,
28a0: 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 &zBuf[j]);.
28b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 for(i=0; i<15; i
28c0: 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 ++, j++){.
28d0: 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 zBuf[j] = (char)
28e0: 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e zChars[ ((unsign
28f0: 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 ed char)zBuf[j])
2900: 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 %(sizeof(zChars)
2910: 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 -1) ];. }.
2920: 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 zBuf[j] = 0;.
2930: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 4f 73 if( !sqlite3Os
2940: 46 69 6c 65 45 78 69 73 74 73 28 7a 42 75 66 29 FileExists(zBuf)
2950: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 ) break;. }.
2960: 54 52 41 43 45 32 28 22 54 45 4d 50 20 46 49 4c TRACE2("TEMP FIL
2970: 45 4e 41 4d 45 3a 20 25 73 5c 6e 22 2c 20 7a 42 ENAME: %s\n", zB
2980: 75 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 uf);. return SQ
2990: 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a LITE_OK; .}../*.
29a0: 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e ** Close a file.
29b0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f .*/.int sqlite3O
29c0: 73 43 6c 6f 73 65 28 4f 73 46 69 6c 65 20 2a 69 sClose(OsFile *i
29d0: 64 29 7b 0a 20 20 69 66 28 20 69 64 2d 3e 69 73 d){. if( id->is
29e0: 4f 70 65 6e 20 29 7b 0a 20 20 20 20 54 52 41 43 Open ){. TRAC
29f0: 45 32 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c E2("CLOSE %d\n",
2a00: 20 69 64 2d 3e 68 29 3b 0a 20 20 20 20 43 6c 6f id->h);. Clo
2a10: 73 65 48 61 6e 64 6c 65 28 69 64 2d 3e 68 29 3b seHandle(id->h);
2a20: 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 . OpenCounter
2a30: 28 2d 31 29 3b 0a 20 20 20 20 69 64 2d 3e 69 73 (-1);. id->is
2a40: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 Open = 0;. }.
2a50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
2a60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 ;.}../*.** Read
2a70: 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 data from a file
2a80: 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 into a buffer.
2a90: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f Return SQLITE_O
2aa0: 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 K if all.** byte
2ab0: 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63 s were read succ
2ac0: 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c essfully and SQL
2ad0: 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 ITE_IOERR if any
2ae0: 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 thing goes.** wr
2af0: 6f 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 ong..*/.int sqli
2b00: 74 65 33 4f 73 52 65 61 64 28 4f 73 46 69 6c 65 te3OsRead(OsFile
2b10: 20 2a 69 64 2c 20 76 6f 69 64 20 2a 70 42 75 66 *id, void *pBuf
2b20: 2c 20 69 6e 74 20 61 6d 74 29 7b 0a 20 20 44 57 , int amt){. DW
2b30: 4f 52 44 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 ORD got;. asser
2b40: 74 28 20 69 64 2d 3e 69 73 4f 70 65 6e 20 29 3b t( id->isOpen );
2b50: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 . SimulateIOErr
2b60: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 or(SQLITE_IOERR)
2b70: 3b 0a 20 20 54 52 41 43 45 33 28 22 52 45 41 44 ;. TRACE3("READ
2b80: 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 %d lock=%d\n",
2b90: 69 64 2d 3e 68 2c 20 69 64 2d 3e 6c 6f 63 6b 74 id->h, id->lockt
2ba0: 79 70 65 29 3b 0a 20 20 69 66 28 20 21 52 65 61 ype);. if( !Rea
2bb0: 64 46 69 6c 65 28 69 64 2d 3e 68 2c 20 70 42 75 dFile(id->h, pBu
2bc0: 66 2c 20 61 6d 74 2c 20 26 67 6f 74 2c 20 30 29 f, amt, &got, 0)
2bd0: 20 29 7b 0a 20 20 20 20 67 6f 74 20 3d 20 30 3b ){. got = 0;
2be0: 0a 20 20 7d 0a 20 20 69 66 28 20 67 6f 74 3d 3d . }. if( got==
2bf0: 28 44 57 4f 52 44 29 61 6d 74 20 29 7b 0a 20 20 (DWORD)amt ){.
2c00: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
2c10: 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 OK;. }else{.
2c20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 return SQLITE_I
2c30: 4f 45 52 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a OERR;. }.}../*.
2c40: 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66 72 ** Write data fr
2c50: 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f om a buffer into
2c60: 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e a file. Return
2c70: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 SQLITE_OK on su
2c80: 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 ccess.** or some
2c90: 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 other error cod
2ca0: 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f e on failure..*/
2cb0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 57 72 .int sqlite3OsWr
2cc0: 69 74 65 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 ite(OsFile *id,
2cd0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 const void *pBuf
2ce0: 2c 20 69 6e 74 20 61 6d 74 29 7b 0a 20 20 69 6e , int amt){. in
2cf0: 74 20 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52 t rc = 0;. DWOR
2d00: 44 20 77 72 6f 74 65 3b 0a 20 20 61 73 73 65 72 D wrote;. asser
2d10: 74 28 20 69 64 2d 3e 69 73 4f 70 65 6e 20 29 3b t( id->isOpen );
2d20: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 . SimulateIOErr
2d30: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 or(SQLITE_IOERR)
2d40: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b ;. SimulateDisk
2d50: 66 75 6c 6c 45 72 72 6f 72 3b 0a 20 20 54 52 41 fullError;. TRA
2d60: 43 45 33 28 22 57 52 49 54 45 20 25 64 20 6c 6f CE3("WRITE %d lo
2d70: 63 6b 3d 25 64 5c 6e 22 2c 20 69 64 2d 3e 68 2c ck=%d\n", id->h,
2d80: 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 29 3b 0a id->locktype);.
2d90: 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 assert( amt>0
2da0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 61 6d 74 3e );. while( amt>
2db0: 30 20 26 26 20 28 72 63 20 3d 20 57 72 69 74 65 0 && (rc = Write
2dc0: 46 69 6c 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 File(id->h, pBuf
2dd0: 2c 20 61 6d 74 2c 20 26 77 72 6f 74 65 2c 20 30 , amt, &wrote, 0
2de0: 29 29 21 3d 30 20 26 26 20 77 72 6f 74 65 3e 30 ))!=0 && wrote>0
2df0: 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 ){. amt -= w
2e00: 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d rote;. pBuf =
2e10: 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b &((char*)pBuf)[
2e20: 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 69 66 wrote];. }. if
2e30: 28 20 21 72 63 20 7c 7c 20 61 6d 74 3e 28 69 6e ( !rc || amt>(in
2e40: 74 29 77 72 6f 74 65 20 29 7b 0a 20 20 20 20 72 t)wrote ){. r
2e50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c eturn SQLITE_FUL
2e60: 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 L;. }. return
2e70: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a SQLITE_OK;.}../*
2e80: 0a 2a 2a 20 53 6f 6d 65 20 6d 69 63 72 6f 73 6f .** Some microso
2e90: 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63 ft compilers lac
2ea0: 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74 69 6f k this definitio
2eb0: 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e n..*/.#ifndef IN
2ec0: 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 VALID_SET_FILE_P
2ed0: 4f 49 4e 54 45 52 0a 23 20 64 65 66 69 6e 65 20 OINTER.# define
2ee0: 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 INVALID_SET_FILE
2ef0: 5f 50 4f 49 4e 54 45 52 20 28 28 44 57 4f 52 44 _POINTER ((DWORD
2f00: 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a )-1).#endif../*.
2f10: 2a 2a 20 4d 6f 76 65 20 74 68 65 20 72 65 61 64 ** Move the read
2f20: 2f 77 72 69 74 65 20 70 6f 69 6e 74 65 72 20 69 /write pointer i
2f30: 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 n a file..*/.int
2f40: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 4f sqlite3OsSeek(O
2f50: 73 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f sFile *id, i64 o
2f60: 66 66 73 65 74 29 7b 0a 20 20 4c 4f 4e 47 20 75 ffset){. LONG u
2f70: 70 70 65 72 42 69 74 73 20 3d 20 6f 66 66 73 65 pperBits = offse
2f80: 74 3e 3e 33 32 3b 0a 20 20 4c 4f 4e 47 20 6c 6f t>>32;. LONG lo
2f90: 77 65 72 42 69 74 73 20 3d 20 6f 66 66 73 65 74 werBits = offset
2fa0: 20 26 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20 & 0xffffffff;.
2fb0: 20 44 57 4f 52 44 20 72 63 3b 0a 20 20 61 73 73 DWORD rc;. ass
2fc0: 65 72 74 28 20 69 64 2d 3e 69 73 4f 70 65 6e 20 ert( id->isOpen
2fd0: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 );.#ifdef SQLITE
2fe0: 5f 54 45 53 54 0a 20 20 69 66 28 20 6f 66 66 73 _TEST. if( offs
2ff0: 65 74 20 29 20 53 69 6d 75 6c 61 74 65 44 69 73 et ) SimulateDis
3000: 6b 66 75 6c 6c 45 72 72 6f 72 0a 23 65 6e 64 69 kfullError.#endi
3010: 66 0a 20 20 53 45 45 4b 28 6f 66 66 73 65 74 2f f. SEEK(offset/
3020: 31 30 32 34 20 2b 20 31 29 3b 0a 20 20 72 63 20 1024 + 1);. rc
3030: 3d 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 = SetFilePointer
3040: 28 69 64 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74 (id->h, lowerBit
3050: 73 2c 20 26 75 70 70 65 72 42 69 74 73 2c 20 46 s, &upperBits, F
3060: 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 20 20 54 52 ILE_BEGIN);. TR
3070: 41 43 45 33 28 22 53 45 45 4b 20 25 64 20 25 6c ACE3("SEEK %d %l
3080: 6c 64 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 6f 66 ld\n", id->h, of
3090: 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d fset);. if( rc=
30a0: 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c =INVALID_SET_FIL
30b0: 45 5f 50 4f 49 4e 54 45 52 20 26 26 20 47 65 74 E_POINTER && Get
30c0: 4c 61 73 74 45 72 72 6f 72 28 29 21 3d 4e 4f 5f LastError()!=NO_
30d0: 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 72 65 74 ERROR ){. ret
30e0: 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b urn SQLITE_FULL;
30f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 . }. return SQ
3100: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a LITE_OK;.}../*.*
3110: 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 * Make sure all
3120: 77 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 writes to a part
3130: 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 icular file are
3140: 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 committed to dis
3150: 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 k..*/.int sqlite
3160: 33 4f 73 53 79 6e 63 28 4f 73 46 69 6c 65 20 2a 3OsSync(OsFile *
3170: 69 64 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 id, int dataOnly
3180: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 64 2d ){. assert( id-
3190: 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20 54 52 41 >isOpen );. TRA
31a0: 43 45 33 28 22 53 59 4e 43 20 25 64 20 6c 6f 63 CE3("SYNC %d loc
31b0: 6b 3d 25 64 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 k=%d\n", id->h,
31c0: 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 id->locktype);.
31d0: 20 69 66 28 20 46 6c 75 73 68 46 69 6c 65 42 75 if( FlushFileBu
31e0: 66 66 65 72 73 28 69 64 2d 3e 68 29 20 29 7b 0a ffers(id->h) ){.
31f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 return SQLIT
3200: 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 E_OK;. }else{.
3210: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 return SQLITE
3220: 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f _IOERR;. }.}../
3230: 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 69 *.** Sync the di
3240: 72 65 63 74 6f 72 79 20 7a 44 69 72 6e 61 6d 65 rectory zDirname
3250: 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f . This is a no-o
3260: 70 20 6f 6e 20 6f 70 65 72 61 74 69 6e 67 20 73 p on operating s
3270: 79 73 74 65 6d 73 20 6f 74 68 65 72 0a 2a 2a 20 ystems other.**
3280: 74 68 61 6e 20 55 4e 49 58 2e 0a 2a 2f 0a 69 6e than UNIX..*/.in
3290: 74 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 44 t sqlite3OsSyncD
32a0: 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 irectory(const c
32b0: 68 61 72 20 2a 7a 44 69 72 6e 61 6d 65 29 7b 0a har *zDirname){.
32c0: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f SimulateIOErro
32d0: 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b r(SQLITE_IOERR);
32e0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 . return SQLITE
32f0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 _OK;.}../*.** Tr
3300: 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 uncate an open f
3310: 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 ile to a specifi
3320: 65 64 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 ed size.*/.int s
3330: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 qlite3OsTruncate
3340: 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 (OsFile *id, i64
3350: 20 6e 42 79 74 65 29 7b 0a 20 20 4c 4f 4e 47 20 nByte){. LONG
3360: 75 70 70 65 72 42 69 74 73 20 3d 20 6e 42 79 74 upperBits = nByt
3370: 65 3e 3e 33 32 3b 0a 20 20 61 73 73 65 72 74 28 e>>32;. assert(
3380: 20 69 64 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 id->isOpen );.
3390: 20 54 52 41 43 45 33 28 22 54 52 55 4e 43 41 54 TRACE3("TRUNCAT
33a0: 45 20 25 64 20 25 6c 6c 64 5c 6e 22 2c 20 69 64 E %d %lld\n", id
33b0: 2d 3e 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 53 ->h, nByte);. S
33c0: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 imulateIOError(S
33d0: 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 QLITE_IOERR);.
33e0: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 69 SetFilePointer(i
33f0: 64 2d 3e 68 2c 20 6e 42 79 74 65 2c 20 26 75 70 d->h, nByte, &up
3400: 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f 42 45 perBits, FILE_BE
3410: 47 49 4e 29 3b 0a 20 20 53 65 74 45 6e 64 4f 66 GIN);. SetEndOf
3420: 46 69 6c 65 28 69 64 2d 3e 68 29 3b 0a 20 20 72 File(id->h);. r
3430: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b eturn SQLITE_OK;
3440: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d .}../*.** Determ
3450: 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 ine the current
3460: 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 size of a file i
3470: 6e 20 62 79 74 65 73 0a 2a 2f 0a 69 6e 74 20 73 n bytes.*/.int s
3480: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 qlite3OsFileSize
3490: 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 (OsFile *id, i64
34a0: 20 2a 70 53 69 7a 65 29 7b 0a 20 20 44 57 4f 52 *pSize){. DWOR
34b0: 44 20 75 70 70 65 72 42 69 74 73 2c 20 6c 6f 77 D upperBits, low
34c0: 65 72 42 69 74 73 3b 0a 20 20 61 73 73 65 72 74 erBits;. assert
34d0: 28 20 69 64 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a ( id->isOpen );.
34e0: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f SimulateIOErro
34f0: 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b r(SQLITE_IOERR);
3500: 0a 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 47 . lowerBits = G
3510: 65 74 46 69 6c 65 53 69 7a 65 28 69 64 2d 3e 68 etFileSize(id->h
3520: 2c 20 26 75 70 70 65 72 42 69 74 73 29 3b 0a 20 , &upperBits);.
3530: 20 2a 70 53 69 7a 65 20 3d 20 28 28 28 69 36 34 *pSize = (((i64
3540: 29 75 70 70 65 72 42 69 74 73 29 3c 3c 33 32 29 )upperBits)<<32)
3550: 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 + lowerBits;.
3560: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
3570: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 ;.}../*.** Acqui
3580: 72 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b re a reader lock
3590: 2e 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 41 ..** Different A
35a0: 50 49 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 PI routines are
35b0: 63 61 6c 6c 65 64 20 64 65 70 65 6e 64 69 6e 67 called depending
35c0: 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e on whether or n
35d0: 6f 74 20 74 68 69 73 0a 2a 2a 20 69 73 20 57 69 ot this.** is Wi
35e0: 6e 39 35 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f n95 or WinNT..*/
35f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 52 .static int getR
3600: 65 61 64 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a eadLock(OsFile *
3610: 69 64 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a id){. int res;.
3620: 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a if( isNT() ){.
3630: 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f OVERLAPPED o
3640: 76 6c 70 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 vlp;. ovlp.Of
3650: 66 73 65 74 20 3d 20 53 48 41 52 45 44 5f 46 49 fset = SHARED_FI
3660: 52 53 54 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 RST;. ovlp.Of
3670: 66 73 65 74 48 69 67 68 20 3d 20 30 3b 0a 20 20 fsetHigh = 0;.
3680: 20 20 6f 76 6c 70 2e 68 45 76 65 6e 74 20 3d 20 ovlp.hEvent =
3690: 30 3b 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f 63 0;. res = Loc
36a0: 6b 46 69 6c 65 45 78 28 69 64 2d 3e 68 2c 20 4c kFileEx(id->h, L
36b0: 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d OCKFILE_FAIL_IMM
36c0: 45 44 49 41 54 45 4c 59 2c 20 30 2c 20 53 48 41 EDIATELY, 0, SHA
36d0: 52 45 44 5f 53 49 5a 45 2c 30 2c 26 6f 76 6c 70 RED_SIZE,0,&ovlp
36e0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 );. }else{.
36f0: 69 6e 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 int lk;. sqli
3700: 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 te3Randomness(si
3710: 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a zeof(lk), &lk);.
3720: 20 20 20 20 69 64 2d 3e 73 68 61 72 65 64 4c 6f id->sharedLo
3730: 63 6b 42 79 74 65 20 3d 20 28 6c 6b 20 26 20 30 ckByte = (lk & 0
3740: 78 37 66 66 66 66 66 66 66 29 25 28 53 48 41 52 x7fffffff)%(SHAR
3750: 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 ED_SIZE - 1);.
3760: 20 20 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 res = LockFile
3770: 28 69 64 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 (id->h, SHARED_F
3780: 49 52 53 54 2b 69 64 2d 3e 73 68 61 72 65 64 4c IRST+id->sharedL
3790: 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 ockByte, 0, 1, 0
37a0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 );. }. return
37b0: 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e res;.}../*.** Un
37c0: 64 6f 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f do a readlock.*/
37d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 6c 6f .static int unlo
37e0: 63 6b 52 65 61 64 4c 6f 63 6b 28 4f 73 46 69 6c ckReadLock(OsFil
37f0: 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 65 e *id){. int re
3800: 73 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 s;. if( isNT()
3810: 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 55 6e 6c ){. res = Unl
3820: 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20 53 ockFile(id->h, S
3830: 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 HARED_FIRST, 0,
3840: 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b SHARED_SIZE, 0);
3850: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 . }else{. re
3860: 73 20 3d 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 69 s = UnlockFile(i
3870: 64 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 d->h, SHARED_FIR
3880: 53 54 20 2b 20 69 64 2d 3e 73 68 61 72 65 64 4c ST + id->sharedL
3890: 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 ockByte, 0, 1, 0
38a0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 );. }. return
38b0: 72 65 73 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 res;.}..#ifndef
38c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 SQLITE_OMIT_PAGE
38d0: 52 5f 50 52 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 R_PRAGMAS./*.**
38e0: 43 68 65 63 6b 20 74 68 61 74 20 61 20 67 69 76 Check that a giv
38f0: 65 6e 20 70 61 74 68 6e 61 6d 65 20 69 73 20 61 en pathname is a
3900: 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 69 directory and i
3910: 73 20 77 72 69 74 61 62 6c 65 20 0a 2a 2a 0a 2a s writable .**.*
3920: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 49 /.int sqlite3OsI
3930: 73 44 69 72 57 72 69 74 61 62 6c 65 28 63 68 61 sDirWritable(cha
3940: 72 20 2a 7a 44 69 72 6e 61 6d 65 29 7b 0a 20 20 r *zDirname){.
3950: 69 6e 74 20 66 69 6c 65 41 74 74 72 3b 0a 20 20 int fileAttr;.
3960: 57 43 48 41 52 20 2a 7a 57 69 64 65 3b 0a 20 20 WCHAR *zWide;.
3970: 69 66 28 20 7a 44 69 72 6e 61 6d 65 3d 3d 30 20 if( zDirname==0
3980: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 ) return 0;. if
3990: 28 20 21 69 73 4e 54 28 29 20 26 26 20 73 74 72 ( !isNT() && str
39a0: 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3e 4d 41 len(zDirname)>MA
39b0: 58 5f 50 41 54 48 20 29 20 72 65 74 75 72 6e 20 X_PATH ) return
39c0: 30 3b 0a 20 20 7a 57 69 64 65 20 3d 20 75 74 66 0;. zWide = utf
39d0: 38 54 6f 55 6e 69 63 6f 64 65 28 7a 44 69 72 6e 8ToUnicode(zDirn
39e0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 ame);. if( zWid
39f0: 65 20 29 7b 0a 20 20 20 20 66 69 6c 65 41 74 74 e ){. fileAtt
3a00: 72 20 3d 20 47 65 74 46 69 6c 65 41 74 74 72 69 r = GetFileAttri
3a10: 62 75 74 65 73 57 28 7a 57 69 64 65 29 3b 0a 20 butesW(zWide);.
3a20: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 57 sqliteFree(zW
3a30: 69 64 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 ide);. }else{.
3a40: 20 20 20 66 69 6c 65 41 74 74 72 20 3d 20 47 65 fileAttr = Ge
3a50: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 tFileAttributesA
3a60: 28 7a 44 69 72 6e 61 6d 65 29 3b 0a 20 20 7d 0a (zDirname);. }.
3a70: 20 20 69 66 28 20 66 69 6c 65 41 74 74 72 20 3d if( fileAttr =
3a80: 3d 20 30 78 66 66 66 66 66 66 66 66 20 29 20 72 = 0xffffffff ) r
3a90: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 eturn 0;. if( (
3aa0: 66 69 6c 65 41 74 74 72 20 26 20 46 49 4c 45 5f fileAttr & FILE_
3ab0: 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 ATTRIBUTE_DIRECT
3ac0: 4f 52 59 29 20 21 3d 20 46 49 4c 45 5f 41 54 54 ORY) != FILE_ATT
3ad0: 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 RIBUTE_DIRECTORY
3ae0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 ){. return 0
3af0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 ;. }. return 1
3b00: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 ;.}.#endif /* SQ
3b10: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f LITE_OMIT_PAGER_
3b20: 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 2f 2a 0a 2a PRAGMAS */../*.*
3b30: 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 * Lock the file
3b40: 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 with the lock sp
3b50: 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d ecified by param
3b60: 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 eter locktype -
3b70: 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f one.** of the fo
3b80: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 llowing:.**.**
3b90: 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f (1) SHARED_LO
3ba0: 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 CK.** (2) RE
3bb0: 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 SERVED_LOCK.**
3bc0: 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c (3) PENDING_L
3bd0: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 OCK.** (4) E
3be0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a XCLUSIVE_LOCK.**
3bf0: 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 .** Sometimes wh
3c00: 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e en requesting on
3c10: 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 e lock state, ad
3c20: 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 ditional lock st
3c30: 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 ates.** are inse
3c40: 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e rted in between.
3c50: 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 The locking mi
3c60: 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 ght fail on one
3c70: 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 of the later.**
3c80: 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 transitions leav
3c90: 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 ing the lock sta
3ca0: 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f te different fro
3cb0: 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 m what it starte
3cc0: 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 d but.** still s
3cd0: 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c hort of its goal
3ce0: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 . The following
3cf0: 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 chart shows the
3d00: 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e allowed.** tran
3d10: 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 sitions and the
3d20: 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 inserted interme
3d30: 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a diate states:.**
3d40: 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 .** UNLOCKED
3d50: 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 -> SHARED.**
3d60: 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 SHARED -> RESERV
3d70: 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 ED.** SHARED
3d80: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 -> (PENDING) ->
3d90: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 EXCLUSIVE.**
3da0: 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e RESERVED -> (PEN
3db0: 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 DING) -> EXCLUSI
3dc0: 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 VE.** PENDING
3dd0: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a -> EXCLUSIVE.**
3de0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 .** This routine
3df0: 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 will only incre
3e00: 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 54 68 65 ase a lock. The
3e10: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b sqlite3OsUnlock
3e20: 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 () routine.** er
3e30: 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 ases all locks a
3e40: 74 20 6f 6e 63 65 20 61 6e 64 20 72 65 74 75 72 t once and retur
3e50: 6e 73 20 75 73 20 69 6d 6d 65 64 69 61 74 65 6c ns us immediatel
3e60: 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 y to locking lev
3e70: 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20 6e el 0..** It is n
3e80: 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c ot possible to l
3e90: 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 ower the locking
3ea0: 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74 65 70 20 level one step
3eb0: 61 74 20 61 20 74 69 6d 65 2e 20 20 59 6f 75 0a at a time. You.
3ec0: 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74 72 61 69 ** must go strai
3ed0: 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c ght to locking l
3ee0: 65 76 65 6c 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 evel 0..*/.int s
3ef0: 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 4f 73 46 qlite3OsLock(OsF
3f00: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 ile *id, int loc
3f10: 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 ktype){. int rc
3f20: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 = SQLITE_OK;
3f30: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 /* Return code
3f40: 66 72 6f 6d 20 73 75 62 72 6f 75 74 69 6e 65 73 from subroutines
3f50: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 */. int res =
3f60: 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 1; /*
3f70: 52 65 73 75 6c 74 20 6f 66 20 61 20 77 69 6e 64 Result of a wind
3f80: 6f 77 73 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a 2f ows lock call */
3f90: 0a 20 20 69 6e 74 20 6e 65 77 4c 6f 63 6b 74 79 . int newLockty
3fa0: 70 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74 pe; /* Set
3fb0: 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 20 74 6f id->locktype to
3fc0: 20 74 68 69 73 20 76 61 6c 75 65 20 62 65 66 6f this value befo
3fd0: 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 20 20 re exiting */.
3fe0: 69 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f int gotPendingLo
3ff0: 63 6b 20 3d 20 30 3b 2f 2a 20 54 72 75 65 20 69 ck = 0;/* True i
4000: 66 20 77 65 20 61 63 71 75 69 72 65 64 20 61 20 f we acquired a
4010: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 69 PENDING lock thi
4020: 73 20 74 69 6d 65 20 2a 2f 0a 0a 20 20 61 73 73 s time */.. ass
4030: 65 72 74 28 20 69 64 2d 3e 69 73 4f 70 65 6e 20 ert( id->isOpen
4040: 29 3b 0a 20 20 54 52 41 43 45 35 28 22 4c 4f 43 );. TRACE5("LOC
4050: 4b 20 25 64 20 25 64 20 77 61 73 20 25 64 28 25 K %d %d was %d(%
4060: 64 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 d)\n",.
4070: 20 69 64 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 id->h, locktype
4080: 2c 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 , id->locktype,
4090: 69 64 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 id->sharedLockBy
40a0: 74 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 te);.. /* If th
40b0: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 ere is already a
40c0: 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 lock of this ty
40d0: 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 pe or more restr
40e0: 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 ictive on the.
40f0: 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f ** OsFile, do no
4100: 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 thing. Don't use
4110: 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 the end_lock: e
4120: 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a xit path, as. *
4130: 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 * sqlite3OsEnter
4140: 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 Mutex() hasn't b
4150: 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a een called yet..
4160: 20 20 2a 2f 0a 20 20 69 66 28 20 69 64 2d 3e 6c */. if( id->l
4170: 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 ocktype>=locktyp
4180: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 e ){. return
4190: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a SQLITE_OK;. }..
41a0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 /* Make sure t
41b0: 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 he locking seque
41c0: 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 nce is correct.
41d0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 64 */. assert( id
41e0: 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c ->locktype!=NO_L
41f0: 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d OCK || locktype=
4200: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a =SHARED_LOCK );.
4210: 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 assert( lockty
4220: 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b pe!=PENDING_LOCK
4230: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f );. assert( lo
4240: 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45 44 cktype!=RESERVED
4250: 5f 4c 4f 43 4b 20 7c 7c 20 69 64 2d 3e 6c 6f 63 _LOCK || id->loc
4260: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f ktype==SHARED_LO
4270: 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b CK );.. /* Lock
4280: 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 the PENDING_LOC
4290: 4b 20 62 79 74 65 20 69 66 20 77 65 20 6e 65 65 K byte if we nee
42a0: 64 20 74 6f 20 61 63 71 75 69 72 65 20 61 20 50 d to acquire a P
42b0: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 ENDING lock or.
42c0: 20 2a 2a 20 61 20 53 48 41 52 45 44 20 6c 6f 63 ** a SHARED loc
42d0: 6b 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 63 k. If we are ac
42e0: 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 quiring a SHARED
42f0: 20 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71 75 69 lock, the acqui
4300: 73 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 sition of. ** t
4310: 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 he PENDING_LOCK
4320: 62 79 74 65 20 69 73 20 74 65 6d 70 6f 72 61 72 byte is temporar
4330: 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 y.. */. newLoc
4340: 6b 74 79 70 65 20 3d 20 69 64 2d 3e 6c 6f 63 6b ktype = id->lock
4350: 74 79 70 65 3b 0a 20 20 69 66 28 20 69 64 2d 3e type;. if( id->
4360: 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 locktype==NO_LOC
4370: 4b 0a 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 K. || (locktyp
4380: 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 e==EXCLUSIVE_LOC
4390: 4b 20 26 26 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 K && id->locktyp
43a0: 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b e==RESERVED_LOCK
43b0: 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 ). ){. int c
43c0: 6e 74 20 3d 20 33 3b 0a 20 20 20 20 77 68 69 6c nt = 3;. whil
43d0: 65 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72 e( cnt-->0 && (r
43e0: 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 69 64 es = LockFile(id
43f0: 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 ->h, PENDING_BYT
4400: 45 2c 20 30 2c 20 31 2c 20 30 29 29 3d 3d 30 20 E, 0, 1, 0))==0
4410: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20 ){. /* Try
4420: 33 20 74 69 6d 65 73 20 74 6f 20 67 65 74 20 74 3 times to get t
4430: 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e he pending lock.
4440: 20 20 54 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f The pending lo
4450: 63 6b 20 6d 69 67 68 74 20 62 65 0a 20 20 20 20 ck might be.
4460: 20 20 2a 2a 20 68 65 6c 64 20 62 79 20 61 6e 6f ** held by ano
4470: 74 68 65 72 20 72 65 61 64 65 72 20 70 72 6f 63 ther reader proc
4480: 65 73 73 20 77 68 6f 20 77 69 6c 6c 20 72 65 6c ess who will rel
4490: 65 61 73 65 20 69 74 20 6d 6f 6d 65 6e 74 61 72 ease it momentar
44a0: 69 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 ily.. */.
44b0: 20 20 20 20 54 52 41 43 45 32 28 22 63 6f 75 6c TRACE2("coul
44c0: 64 20 6e 6f 74 20 67 65 74 20 61 20 50 45 4e 44 d not get a PEND
44d0: 49 4e 47 20 6c 6f 63 6b 2e 20 63 6e 74 3d 25 64 ING lock. cnt=%d
44e0: 5c 6e 22 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20 \n", cnt);.
44f0: 20 53 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 7d Sleep(1);. }
4500: 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c . gotPendingL
4510: 6f 63 6b 20 3d 20 72 65 73 3b 0a 20 20 7d 0a 0a ock = res;. }..
4520: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 73 /* Acquire a s
4530: 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f 0a hared lock. */.
4540: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d if( locktype==
4550: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 72 SHARED_LOCK && r
4560: 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 es ){. assert
4570: 28 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d ( id->locktype==
4580: 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 NO_LOCK );. r
4590: 65 73 20 3d 20 67 65 74 52 65 61 64 4c 6f 63 6b es = getReadLock
45a0: 28 69 64 29 3b 0a 20 20 20 20 69 66 28 20 72 65 (id);. if( re
45b0: 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f s ){. newLo
45c0: 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f cktype = SHARED_
45d0: 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a LOCK;. }. }.
45e0: 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 . /* Acquire a
45f0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20 RESERVED lock.
4600: 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 */. if( locktyp
4610: 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b e==RESERVED_LOCK
4620: 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 && res ){. a
4630: 73 73 65 72 74 28 20 69 64 2d 3e 6c 6f 63 6b 74 ssert( id->lockt
4640: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b ype==SHARED_LOCK
4650: 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f );. res = Lo
4660: 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20 52 45 ckFile(id->h, RE
4670: 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 SERVED_BYTE, 0,
4680: 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 1, 0);. if( r
4690: 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c es ){. newL
46a0: 6f 63 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56 ocktype = RESERV
46b0: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 ED_LOCK;. }.
46c0: 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 }.. /* Acquire
46d0: 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a a PENDING lock.
46e0: 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 */. if( lockt
46f0: 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c ype==EXCLUSIVE_L
4700: 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 OCK && res ){.
4710: 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 newLocktype =
4720: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 PENDING_LOCK;.
4730: 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b gotPendingLock
4740: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 = 0;. }.. /*
4750: 41 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 Acquire an EXCLU
4760: 53 49 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 SIVE lock. */.
4770: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 if( locktype==E
4780: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 XCLUSIVE_LOCK &&
4790: 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 res ){. asse
47a0: 72 74 28 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 rt( id->locktype
47b0: 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b >=SHARED_LOCK );
47c0: 0a 20 20 20 20 72 65 73 20 3d 20 75 6e 6c 6f 63 . res = unloc
47d0: 6b 52 65 61 64 4c 6f 63 6b 28 69 64 29 3b 0a 20 kReadLock(id);.
47e0: 20 20 20 54 52 41 43 45 32 28 22 75 6e 72 65 61 TRACE2("unrea
47f0: 64 6c 6f 63 6b 20 3d 20 25 64 5c 6e 22 2c 20 72 dlock = %d\n", r
4800: 65 73 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 4c es);. res = L
4810: 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20 53 ockFile(id->h, S
4820: 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 HARED_FIRST, 0,
4830: 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b SHARED_SIZE, 0);
4840: 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a . if( res ){.
4850: 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 newLocktyp
4860: 65 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f e = EXCLUSIVE_LO
4870: 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 CK;. }else{.
4880: 20 20 20 20 20 54 52 41 43 45 32 28 22 65 72 72 TRACE2("err
4890: 6f 72 2d 63 6f 64 65 20 3d 20 25 64 5c 6e 22 2c or-code = %d\n",
48a0: 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 GetLastError())
48b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f ;. }. }.. /
48c0: 2a 20 49 66 20 77 65 20 61 72 65 20 68 6f 6c 64 * If we are hold
48d0: 69 6e 67 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f ing a PENDING lo
48e0: 63 6b 20 74 68 61 74 20 6f 75 67 68 74 20 74 6f ck that ought to
48f0: 20 62 65 20 72 65 6c 65 61 73 65 64 2c 20 74 68 be released, th
4900: 65 6e 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65 20 en. ** release
4910: 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 it now.. */. i
4920: 66 28 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 f( gotPendingLoc
4930: 6b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 k && locktype==S
4940: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 HARED_LOCK ){.
4950: 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 69 64 2d UnlockFile(id-
4960: 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 >h, PENDING_BYTE
4970: 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a , 0, 1, 0);. }.
4980: 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 . /* Update the
4990: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 6c 6f state of the lo
49a0: 63 6b 20 68 61 73 20 68 65 6c 64 20 69 6e 20 74 ck has held in t
49b0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 he file descript
49c0: 6f 72 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 74 or then. ** ret
49d0: 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 urn the appropri
49e0: 61 74 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e ate result code.
49f0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 20 . */. if( res
4a00: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 ){. rc = SQLI
4a10: 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a TE_OK;. }else{.
4a20: 20 20 20 20 54 52 41 43 45 34 28 22 4c 4f 43 4b TRACE4("LOCK
4a30: 20 46 41 49 4c 45 44 20 25 64 20 74 72 79 69 6e FAILED %d tryin
4a40: 67 20 66 6f 72 20 25 64 20 62 75 74 20 67 6f 74 g for %d but got
4a50: 20 25 64 5c 6e 22 2c 20 69 64 2d 3e 68 2c 0a 20 %d\n", id->h,.
4a60: 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 lockty
4a70: 70 65 2c 20 6e 65 77 4c 6f 63 6b 74 79 70 65 29 pe, newLocktype)
4a80: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 ;. rc = SQLIT
4a90: 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 69 64 E_BUSY;. }. id
4aa0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6e 65 77 ->locktype = new
4ab0: 4c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 Locktype;. retu
4ac0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 rn rc;.}../*.**
4ad0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 This routine che
4ae0: 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 cks if there is
4af0: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 a RESERVED lock
4b00: 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 held on the spec
4b10: 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 ified.** file by
4b20: 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 this or any oth
4b30: 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 er process. If s
4b40: 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 uch a lock is he
4b50: 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f ld, return.** no
4b60: 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 n-zero, otherwis
4b70: 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 e zero..*/.int s
4b80: 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 qlite3OsCheckRes
4b90: 65 72 76 65 64 4c 6f 63 6b 28 4f 73 46 69 6c 65 ervedLock(OsFile
4ba0: 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b *id){. int rc;
4bb0: 0a 20 20 61 73 73 65 72 74 28 20 69 64 2d 3e 69 . assert( id->i
4bc0: 73 4f 70 65 6e 20 29 3b 0a 20 20 69 66 28 20 69 sOpen );. if( i
4bd0: 64 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 d->locktype>=RES
4be0: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 ERVED_LOCK ){.
4bf0: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 54 52 rc = 1;. TR
4c00: 41 43 45 33 28 22 54 45 53 54 20 57 52 2d 4c 4f ACE3("TEST WR-LO
4c10: 43 4b 20 25 64 20 25 64 20 28 6c 6f 63 61 6c 29 CK %d %d (local)
4c20: 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 72 63 29 3b \n", id->h, rc);
4c30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 . }else{. rc
4c40: 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e = LockFile(id->
4c50: 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 h, RESERVED_BYTE
4c60: 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 , 0, 1, 0);.
4c70: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 if( rc ){.
4c80: 55 6e 6c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68 UnlockFile(id->h
4c90: 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c , RESERVED_BYTE,
4ca0: 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0, 1, 0);. }
4cb0: 0a 20 20 20 20 72 63 20 3d 20 21 72 63 3b 0a 20 . rc = !rc;.
4cc0: 20 20 20 54 52 41 43 45 33 28 22 54 45 53 54 20 TRACE3("TEST
4cd0: 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 28 72 WR-LOCK %d %d (r
4ce0: 65 6d 6f 74 65 29 5c 6e 22 2c 20 69 64 2d 3e 68 emote)\n", id->h
4cf0: 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 , rc);. }. ret
4d00: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a urn rc;.}../*.**
4d10: 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 Lower the locki
4d20: 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 ng level on file
4d30: 20 64 65 73 63 72 69 70 74 6f 72 20 69 64 20 74 descriptor id t
4d40: 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 o locktype. loc
4d50: 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 ktype.** must be
4d60: 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 either NO_LOCK
4d70: 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a or SHARED_LOCK..
4d80: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 **.** If the loc
4d90: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 king level of th
4da0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f e file descripto
4db0: 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 r is already at
4dc0: 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 or below.** the
4dd0: 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e requested lockin
4de0: 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f g level, this ro
4df0: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 utine is a no-op
4e00: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e 6f ..**.** It is no
4e10: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 t possible for t
4e20: 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 his routine to f
4e30: 61 69 6c 20 69 66 20 74 68 65 20 73 65 63 6f 6e ail if the secon
4e40: 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 d argument.** is
4e50: 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74 68 NO_LOCK. If th
4e60: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e e second argumen
4e70: 74 20 69 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b t is SHARED_LOCK
4e80: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 then this routi
4e90: 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74 75 ne.** might retu
4ea0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b rn SQLITE_IOERR;
4eb0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f .*/.int sqlite3O
4ec0: 73 55 6e 6c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a sUnlock(OsFile *
4ed0: 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 id, int locktype
4ee0: 29 7b 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 ){. int type;.
4ef0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 int rc = SQLITE
4f00: 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 69 _OK;. assert( i
4f10: 64 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20 61 d->isOpen );. a
4f20: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c ssert( locktype<
4f30: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a =SHARED_LOCK );.
4f40: 20 20 54 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b TRACE5("UNLOCK
4f50: 20 25 64 20 74 6f 20 25 64 20 77 61 73 20 25 64 %d to %d was %d
4f60: 28 25 64 29 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 (%d)\n", id->h,
4f70: 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 locktype,.
4f80: 20 20 20 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 id->locktype
4f90: 2c 20 69 64 2d 3e 73 68 61 72 65 64 4c 6f 63 6b , id->sharedLock
4fa0: 42 79 74 65 29 3b 0a 20 20 74 79 70 65 20 3d 20 Byte);. type =
4fb0: 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 id->locktype;.
4fc0: 69 66 28 20 74 79 70 65 3e 3d 45 58 43 4c 55 53 if( type>=EXCLUS
4fd0: 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 IVE_LOCK ){.
4fe0: 55 6e 6c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68 UnlockFile(id->h
4ff0: 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 , SHARED_FIRST,
5000: 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 0, SHARED_SIZE,
5010: 30 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 0);. if( lock
5020: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 type==SHARED_LOC
5030: 4b 20 26 26 20 21 67 65 74 52 65 61 64 4c 6f 63 K && !getReadLoc
5040: 6b 28 69 64 29 20 29 7b 0a 20 20 20 20 20 20 2f k(id) ){. /
5050: 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 * This should ne
5060: 76 65 72 20 68 61 70 70 65 6e 2e 20 20 57 65 20 ver happen. We
5070: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 should always be
5080: 20 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a able to. *
5090: 2a 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 * reacquire the
50a0: 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 read lock */.
50b0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 rc = SQLITE_I
50c0: 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a OERR;. }. }.
50d0: 20 20 69 66 28 20 74 79 70 65 3e 3d 52 45 53 45 if( type>=RESE
50e0: 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 RVED_LOCK ){.
50f0: 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e UnlockFile(id->
5100: 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 h, RESERVED_BYTE
5110: 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a , 0, 1, 0);. }.
5120: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d if( locktype==
5130: 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e NO_LOCK && type>
5140: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a =SHARED_LOCK ){.
5150: 20 20 20 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f unlockReadLo
5160: 63 6b 28 69 64 29 3b 0a 20 20 7d 0a 20 20 69 66 ck(id);. }. if
5170: 28 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f ( type>=PENDING_
5180: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f LOCK ){. Unlo
5190: 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20 50 45 ckFile(id->h, PE
51a0: 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 NDING_BYTE, 0, 1
51b0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 64 2d 3e , 0);. }. id->
51c0: 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 locktype = lockt
51d0: 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 ype;. return rc
51e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 ;.}../*.** Turn
51f0: 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e a relative pathn
5200: 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 ame into a full
5210: 70 61 74 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 pathname. Retur
5220: 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 n a pointer.** t
5230: 6f 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e o the full pathn
5240: 61 6d 65 20 73 74 6f 72 65 64 20 69 6e 20 73 70 ame stored in sp
5250: 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f ace obtained fro
5260: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 m sqliteMalloc()
5270: 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 ..** The calling
5280: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 function is res
5290: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65 ponsible for fre
52a0: 65 69 6e 67 20 74 68 69 73 20 73 70 61 63 65 20 eing this space
52b0: 6f 6e 63 65 20 69 74 0a 2a 2a 20 69 73 20 6e 6f once it.** is no
52c0: 20 6c 6f 6e 67 65 72 20 6e 65 65 64 65 64 2e 0a longer needed..
52d0: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 */.char *sqlite3
52e0: 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 63 OsFullPathname(c
52f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 onst char *zRela
5300: 74 69 76 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a tive){. char *z
5310: 4e 6f 74 55 73 65 64 3b 0a 20 20 63 68 61 72 20 NotUsed;. char
5320: 2a 7a 46 75 6c 6c 3b 0a 20 20 57 43 48 41 52 20 *zFull;. WCHAR
5330: 2a 7a 57 69 64 65 3b 0a 20 20 69 6e 74 20 6e 42 *zWide;. int nB
5340: 79 74 65 3b 0a 23 69 66 64 65 66 20 5f 5f 43 59 yte;.#ifdef __CY
5350: 47 57 49 4e 5f 5f 0a 20 20 6e 42 79 74 65 20 3d GWIN__. nByte =
5360: 20 73 74 72 6c 65 6e 28 7a 52 65 6c 61 74 69 76 strlen(zRelativ
5370: 65 29 20 2b 20 4d 41 58 5f 50 41 54 48 20 2b 20 e) + MAX_PATH +
5380: 31 30 30 31 3b 0a 20 20 7a 46 75 6c 6c 20 3d 20 1001;. zFull =
5390: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 sqliteMalloc( nB
53a0: 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46 75 yte );. if( zFu
53b0: 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 ll==0 ) return 0
53c0: 3b 0a 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63 ;. if( cygwin_c
53d0: 6f 6e 76 5f 74 6f 5f 66 75 6c 6c 5f 77 69 6e 33 onv_to_full_win3
53e0: 32 5f 70 61 74 68 28 7a 52 65 6c 61 74 69 76 65 2_path(zRelative
53f0: 2c 20 7a 46 75 6c 6c 29 20 29 20 72 65 74 75 72 , zFull) ) retur
5400: 6e 20 30 3b 0a 23 65 6c 73 65 0a 20 20 7a 57 69 n 0;.#else. zWi
5410: 64 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f de = utf8ToUnico
5420: 64 65 28 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 de(zRelative);.
5430: 20 69 66 28 20 7a 57 69 64 65 20 29 7b 0a 20 20 if( zWide ){.
5440: 20 20 57 43 48 41 52 20 2a 7a 54 65 6d 70 2c 20 WCHAR *zTemp,
5450: 2a 7a 4e 6f 74 55 73 65 64 57 3b 0a 20 20 20 20 *zNotUsedW;.
5460: 6e 42 79 74 65 20 3d 20 47 65 74 46 75 6c 6c 50 nByte = GetFullP
5470: 61 74 68 4e 61 6d 65 57 28 7a 57 69 64 65 2c 20 athNameW(zWide,
5480: 30 2c 20 30 2c 20 26 7a 4e 6f 74 55 73 65 64 57 0, 0, &zNotUsedW
5490: 29 20 2b 20 31 3b 0a 20 20 20 20 7a 54 65 6d 70 ) + 1;. zTemp
54a0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 = sqliteMalloc(
54b0: 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 nByte*sizeof(zT
54c0: 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 emp[0]) );. i
54d0: 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 20 72 65 f( zTemp==0 ) re
54e0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 47 65 74 46 turn 0;. GetF
54f0: 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 7a 57 69 ullPathNameW(zWi
5500: 64 65 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 de, nByte, zTemp
5510: 2c 20 26 7a 4e 6f 74 55 73 65 64 57 29 3b 0a 20 , &zNotUsedW);.
5520: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 57 sqliteFree(zW
5530: 69 64 65 29 3b 0a 20 20 20 20 7a 46 75 6c 6c 20 ide);. zFull
5540: 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 = unicodeToUtf8(
5550: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 zTemp);. sqli
5560: 74 65 46 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 teFree(zTemp);.
5570: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 42 79 74 }else{. nByt
5580: 65 20 3d 20 47 65 74 46 75 6c 6c 50 61 74 68 4e e = GetFullPathN
5590: 61 6d 65 41 28 7a 52 65 6c 61 74 69 76 65 2c 20 ameA(zRelative,
55a0: 30 2c 20 30 2c 20 26 7a 4e 6f 74 55 73 65 64 29 0, 0, &zNotUsed)
55b0: 20 2b 20 31 3b 0a 20 20 20 20 7a 46 75 6c 6c 20 + 1;. zFull
55c0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 = sqliteMalloc(
55d0: 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 46 75 nByte*sizeof(zFu
55e0: 6c 6c 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 ll[0]) );. if
55f0: 28 20 7a 46 75 6c 6c 3d 3d 30 20 29 20 72 65 74 ( zFull==0 ) ret
5600: 75 72 6e 20 30 3b 0a 20 20 20 20 47 65 74 46 75 urn 0;. GetFu
5610: 6c 6c 50 61 74 68 4e 61 6d 65 41 28 7a 52 65 6c llPathNameA(zRel
5620: 61 74 69 76 65 2c 20 6e 42 79 74 65 2c 20 7a 46 ative, nByte, zF
5630: 75 6c 6c 2c 20 26 7a 4e 6f 74 55 73 65 64 29 3b ull, &zNotUsed);
5640: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 . }.#endif. re
5650: 74 75 72 6e 20 7a 46 75 6c 6c 3b 0a 7d 0a 0a 23 turn zFull;.}..#
5660: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f endif /* SQLITE_
5670: 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a 2f OMIT_DISKIO */./
5680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
56a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
56b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
56c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 45 ***********.** E
56d0: 76 65 72 79 74 68 69 6e 67 20 61 62 6f 76 65 20 verything above
56e0: 64 65 61 6c 73 20 77 69 74 68 20 66 69 6c 65 20 deals with file
56f0: 49 2f 4f 2e 20 20 45 76 65 72 79 74 68 69 6e 67 I/O. Everything
5700: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 64 65 that follows de
5710: 61 6c 73 0a 2a 2a 20 77 69 74 68 20 6f 74 68 65 als.** with othe
5720: 72 20 6d 69 73 63 65 6c 6c 61 6e 6f 75 73 20 61 r miscellanous a
5730: 73 70 65 63 74 73 20 6f 66 20 74 68 65 20 6f 70 spects of the op
5740: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 erating system i
5750: 6e 74 65 72 66 61 63 65 0a 2a 2a 2a 2a 2a 2a 2a nterface.*******
5760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
57a0: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 *****/../*.** Ge
57b0: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f t information to
57c0: 20 73 65 65 64 20 74 68 65 20 72 61 6e 64 6f 6d seed the random
57d0: 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f number generato
57e0: 72 2e 20 20 54 68 65 20 73 65 65 64 0a 2a 2a 20 r. The seed.**
57f0: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 is written into
5800: 74 68 65 20 62 75 66 66 65 72 20 7a 42 75 66 5b the buffer zBuf[
5810: 32 35 36 5d 2e 20 20 54 68 65 20 63 61 6c 6c 69 256]. The calli
5820: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 ng function must
5830: 0a 2a 2a 20 73 75 70 70 6c 79 20 61 20 73 75 66 .** supply a suf
5840: 66 69 63 69 65 6e 74 6c 79 20 6c 61 72 67 65 20 ficiently large
5850: 62 75 66 66 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 buffer..*/.int s
5860: 71 6c 69 74 65 33 4f 73 52 61 6e 64 6f 6d 53 65 qlite3OsRandomSe
5870: 65 64 28 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a ed(char *zBuf){.
5880: 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20 /* We have to
5890: 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20 initialize zBuf
58a0: 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72 to prevent valgr
58b0: 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69 ind from reporti
58c0: 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20 ng. ** errors.
58d0: 20 54 68 65 20 72 65 70 6f 72 74 73 20 69 73 73 The reports iss
58e0: 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20 ued by valgrind
58f0: 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20 are incorrect -
5900: 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 we would. ** pr
5910: 65 66 65 72 20 74 68 61 74 20 74 68 65 20 72 61 efer that the ra
5920: 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72 ndomness be incr
5930: 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20 eased by making
5940: 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 use of the. **
5950: 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 uninitialized sp
5960: 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75 ace in zBuf - bu
5970: 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 t valgrind error
5980: 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a s tend to worry.
5990: 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e ** some users.
59a0: 20 20 52 61 74 68 65 72 20 74 68 61 6e 20 61 72 Rather than ar
59b0: 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61 gue, it seems ea
59c0: 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69 sier just to ini
59d0: 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65 tialize. ** the
59e0: 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64 whole array and
59f0: 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e silence valgrin
5a00: 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 d, even if that
5a10: 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f means less rando
5a20: 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68 mness. ** in th
5a30: 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 e random seed..
5a40: 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65 **. ** When te
5a50: 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a sting, initializ
5a60: 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 ing zBuf[] to ze
5a70: 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e ro is all we do.
5a80: 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a That means. *
5a90: 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61 79 73 * that we always
5aa0: 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 61 use the same ra
5ab0: 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75 ndom number sequ
5ac0: 65 6e 63 65 2e 2a 20 54 68 69 73 20 6d 61 6b 65 ence.* This make
5ad0: 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73 s the. ** tests
5ae0: 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a repeatable.. *
5af0: 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c /. memset(zBuf,
5b00: 20 30 2c 20 32 35 36 29 3b 0a 20 20 47 65 74 53 0, 256);. GetS
5b10: 79 73 74 65 6d 54 69 6d 65 28 28 4c 50 53 59 53 ystemTime((LPSYS
5b20: 54 45 4d 54 49 4d 45 29 7a 42 75 66 29 3b 0a 20 TEMTIME)zBuf);.
5b30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
5b40: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 K;.}../*.** Slee
5b50: 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 p for a little w
5b60: 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 hile. Return th
5b70: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 e amount of time
5b80: 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 slept..*/.int s
5b90: 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 69 6e qlite3OsSleep(in
5ba0: 74 20 6d 73 29 7b 0a 20 20 53 6c 65 65 70 28 6d t ms){. Sleep(m
5bb0: 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 73 3b s);. return ms;
5bc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 74 69 63 .}../*.** Static
5bd0: 20 76 61 72 69 61 62 6c 65 73 20 75 73 65 64 20 variables used
5be0: 66 6f 72 20 74 68 72 65 61 64 20 73 79 6e 63 68 for thread synch
5bf0: 72 6f 6e 69 7a 61 74 69 6f 6e 0a 2a 2f 0a 73 74 ronization.*/.st
5c00: 61 74 69 63 20 69 6e 74 20 69 6e 4d 75 74 65 78 atic int inMutex
5c10: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c = 0;.#ifdef SQL
5c20: 49 54 45 5f 57 33 32 5f 54 48 52 45 41 44 53 0a ITE_W32_THREADS.
5c30: 20 20 73 74 61 74 69 63 20 43 52 49 54 49 43 41 static CRITICA
5c40: 4c 5f 53 45 43 54 49 4f 4e 20 63 73 3b 0a 23 65 L_SECTION cs;.#e
5c50: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 ndif../*.** The
5c60: 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 69 72 20 6f following pair o
5c70: 66 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d f routine implem
5c80: 65 6e 74 20 6d 75 74 75 61 6c 20 65 78 63 6c 75 ent mutual exclu
5c90: 73 69 6f 6e 20 66 6f 72 0a 2a 2a 20 6d 75 6c 74 sion for.** mult
5ca0: 69 2d 74 68 72 65 61 64 65 64 20 70 72 6f 63 65 i-threaded proce
5cb0: 73 73 65 73 2e 20 20 4f 6e 6c 79 20 61 20 73 69 sses. Only a si
5cc0: 6e 67 6c 65 20 74 68 72 65 61 64 20 69 73 20 61 ngle thread is a
5cd0: 6c 6c 6f 77 65 64 20 74 6f 0a 2a 2a 20 65 78 65 llowed to.** exe
5ce0: 63 75 74 65 64 20 63 6f 64 65 20 74 68 61 74 20 cuted code that
5cf0: 69 73 20 73 75 72 72 6f 75 6e 64 65 64 20 62 79 is surrounded by
5d00: 20 45 6e 74 65 72 4d 75 74 65 78 28 29 20 61 6e EnterMutex() an
5d10: 64 20 4c 65 61 76 65 4d 75 74 65 78 28 29 2e 0a d LeaveMutex()..
5d20: 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73 65 **.** SQLite use
5d30: 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 s only a single
5d40: 4d 75 74 65 78 2e 20 20 54 68 65 72 65 20 69 73 Mutex. There is
5d50: 20 6e 6f 74 20 6d 75 63 68 20 63 72 69 74 69 63 not much critic
5d60: 61 6c 0a 2a 2a 20 63 6f 64 65 20 61 6e 64 20 77 al.** code and w
5d70: 68 61 74 20 6c 69 74 74 6c 65 20 74 68 65 72 65 hat little there
5d80: 20 69 73 20 65 78 65 63 75 74 65 73 20 71 75 69 is executes qui
5d90: 63 6b 6c 79 20 61 6e 64 20 77 69 74 68 6f 75 74 ckly and without
5da0: 20 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 76 6f blocking..*/.vo
5db0: 69 64 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 id sqlite3OsEnte
5dc0: 72 4d 75 74 65 78 28 29 7b 0a 23 69 66 64 65 66 rMutex(){.#ifdef
5dd0: 20 53 51 4c 49 54 45 5f 57 33 32 5f 54 48 52 45 SQLITE_W32_THRE
5de0: 41 44 53 0a 20 20 73 74 61 74 69 63 20 69 6e 74 ADS. static int
5df0: 20 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 77 isInit = 0;. w
5e00: 68 69 6c 65 28 20 21 69 73 49 6e 69 74 20 29 7b hile( !isInit ){
5e10: 0a 20 20 20 20 73 74 61 74 69 63 20 6c 6f 6e 67 . static long
5e20: 20 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 69 lock = 0;. i
5e30: 66 28 20 49 6e 74 65 72 6c 6f 63 6b 65 64 49 6e f( InterlockedIn
5e40: 63 72 65 6d 65 6e 74 28 26 6c 6f 63 6b 29 3d 3d crement(&lock)==
5e50: 31 20 29 7b 0a 20 20 20 20 20 20 49 6e 69 74 69 1 ){. Initi
5e60: 61 6c 69 7a 65 43 72 69 74 69 63 61 6c 53 65 63 alizeCriticalSec
5e70: 74 69 6f 6e 28 26 63 73 29 3b 0a 20 20 20 20 20 tion(&cs);.
5e80: 20 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 isInit = 1;.
5e90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 53 6c }else{. Sl
5ea0: 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 eep(1);. }.
5eb0: 7d 0a 20 20 45 6e 74 65 72 43 72 69 74 69 63 61 }. EnterCritica
5ec0: 6c 53 65 63 74 69 6f 6e 28 26 63 73 29 3b 0a 23 lSection(&cs);.#
5ed0: 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 endif. assert(
5ee0: 21 69 6e 4d 75 74 65 78 20 29 3b 0a 20 20 69 6e !inMutex );. in
5ef0: 4d 75 74 65 78 20 3d 20 31 3b 0a 7d 0a 76 6f 69 Mutex = 1;.}.voi
5f00: 64 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 d sqlite3OsLeave
5f10: 4d 75 74 65 78 28 29 7b 0a 20 20 61 73 73 65 72 Mutex(){. asser
5f20: 74 28 20 69 6e 4d 75 74 65 78 20 29 3b 0a 20 20 t( inMutex );.
5f30: 69 6e 4d 75 74 65 78 20 3d 20 30 3b 0a 23 69 66 inMutex = 0;.#if
5f40: 64 65 66 20 53 51 4c 49 54 45 5f 57 33 32 5f 54 def SQLITE_W32_T
5f50: 48 52 45 41 44 53 0a 20 20 4c 65 61 76 65 43 72 HREADS. LeaveCr
5f60: 69 74 69 63 61 6c 53 65 63 74 69 6f 6e 28 26 63 iticalSection(&c
5f70: 73 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a s);.#endif.}../*
5f80: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e .** The followin
5f90: 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 g variable, if s
5fa0: 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f et to a non-zero
5fb0: 20 76 61 6c 75 65 2c 20 62 65 63 6f 6d 65 73 20 value, becomes
5fc0: 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 72 65 the result.** re
5fd0: 74 75 72 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 turned from sqli
5fe0: 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 te3OsCurrentTime
5ff0: 28 29 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 (). This is use
6000: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 2e 0a 2a d for testing..*
6010: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f /.#ifdef SQLITE_
6020: 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 TEST.int sqlite3
6030: 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 _current_time =
6040: 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 0;.#endif../*.**
6050: 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e Find the curren
6060: 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 t time (in Unive
6070: 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 rsal Coordinated
6080: 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 Time). Write t
6090: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 he.** current ti
60a0: 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 me and date as a
60b0: 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 Julian Day numb
60c0: 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 er into *prNow a
60d0: 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 nd.** return 0.
60e0: 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 Return 1 if the
60f0: 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 time and date c
6100: 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a annot be found..
6110: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 */.int sqlite3Os
6120: 43 75 72 72 65 6e 74 54 69 6d 65 28 64 6f 75 62 CurrentTime(doub
6130: 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 46 49 le *prNow){. FI
6140: 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20 2f 2a 20 LETIME ft;. /*
6150: 46 49 4c 45 54 49 4d 45 20 73 74 72 75 63 74 75 FILETIME structu
6160: 72 65 20 69 73 20 61 20 36 34 2d 62 69 74 20 76 re is a 64-bit v
6170: 61 6c 75 65 20 72 65 70 72 65 73 65 6e 74 69 6e alue representin
6180: 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 g the number of
6190: 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f 73 65 . 100-nanose
61a0: 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73 20 73 cond intervals s
61b0: 69 6e 63 65 20 4a 61 6e 75 61 72 79 20 31 2c 20 ince January 1,
61c0: 31 36 30 31 20 28 3d 20 4a 44 20 32 33 30 35 38 1601 (= JD 23058
61d0: 31 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a 20 20 64 13.5). . */. d
61e0: 6f 75 62 6c 65 20 6e 6f 77 3b 0a 20 20 47 65 74 ouble now;. Get
61f0: 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 SystemTimeAsFile
6200: 54 69 6d 65 28 20 26 66 74 20 29 3b 0a 20 20 6e Time( &ft );. n
6210: 6f 77 20 3d 20 28 28 64 6f 75 62 6c 65 29 66 74 ow = ((double)ft
6220: 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 29 .dwHighDateTime)
6230: 20 2a 20 34 32 39 34 39 36 37 32 39 36 2e 30 3b * 4294967296.0;
6240: 20 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 28 6e 6f . *prNow = (no
6250: 77 20 2b 20 66 74 2e 64 77 4c 6f 77 44 61 74 65 w + ft.dwLowDate
6260: 54 69 6d 65 29 2f 38 36 34 30 30 30 30 30 30 30 Time)/8640000000
6270: 30 30 2e 30 20 2b 20 32 33 30 35 38 31 33 2e 35 00.0 + 2305813.5
6280: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ;.#ifdef SQLITE_
6290: 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 TEST. if( sqlit
62a0: 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 e3_current_time
62b0: 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 ){. *prNow =
62c0: 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f sqlite3_current_
62d0: 74 69 6d 65 2f 38 36 34 30 30 2e 30 20 2b 20 32 time/86400.0 + 2
62e0: 34 34 30 35 38 37 2e 35 3b 0a 20 20 7d 0a 23 65 440587.5;. }.#e
62f0: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 30 3b ndif. return 0;
6300: 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 .}..#endif /* OS
6310: 5f 57 49 4e 20 2a 2f 0a _WIN */.