0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65 /*.** 2001 Septe
0010: 6d 62 65 72 20 31 36 0a 2a 2a 0a 2a 2a 20 54 68 mber 16.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 ms copyright to
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a . In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d sing:.**.** M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 nd not evil..**
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 May you find
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 forgiveness for
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 give others..**
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 aking more than
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a you give..**.***
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 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a ***********.**.*
0180: 2a 20 54 68 69 73 20 66 69 6c 65 20 63 6f 6e 74 * This file cont
0190: 61 69 6e 73 20 63 6f 64 65 20 74 68 61 74 20 69 ains code that i
01a0: 73 20 73 70 65 63 69 66 69 63 20 74 6f 20 70 61 s specific to pa
01b0: 72 74 69 63 75 6c 61 72 20 6f 70 65 72 61 74 69 rticular operati
01c0: 6e 67 0a 2a 2a 20 73 79 73 74 65 6d 73 2e 20 20 ng.** systems.
01d0: 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 74 The purpose of t
01e0: 68 69 73 20 66 69 6c 65 20 69 73 20 74 6f 20 70 his file is to p
01f0: 72 6f 76 69 64 65 20 61 20 75 6e 69 66 6f 72 6d rovide a uniform
0200: 20 61 62 73 74 72 61 63 74 69 6f 6e 0a 2a 2a 20 abstraction.**
0210: 6f 6e 20 77 68 69 63 68 20 74 68 65 20 72 65 73 on which the res
0220: 74 20 6f 66 20 53 51 4c 69 74 65 20 63 61 6e 20 t of SQLite can
0230: 6f 70 65 72 61 74 65 2e 0a 2a 2f 0a 23 69 6e 63 operate..*/.#inc
0240: 6c 75 64 65 20 22 6f 73 2e 68 22 20 20 20 20 20 lude "os.h"
0250: 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 /* Must be
0260: 66 69 72 73 74 20 74 6f 20 65 6e 61 62 6c 65 20 first to enable
0270: 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f large file suppo
0280: 72 74 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 rt */.#include "
0290: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69 sqliteInt.h"..#i
02a0: 66 20 4f 53 5f 55 4e 49 58 0a 23 20 69 6e 63 6c f OS_UNIX.# incl
02b0: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 20 69 ude <time.h>.# i
02c0: 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e nclude <errno.h>
02d0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 .# include <unis
02e0: 74 64 2e 68 3e 0a 23 20 69 66 6e 64 65 66 20 4f td.h>.# ifndef O
02f0: 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 20 64 65 _LARGEFILE.# de
0300: 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 fine O_LARGEFILE
0310: 20 30 0a 23 20 65 6e 64 69 66 0a 23 20 69 66 64 0.# endif.# ifd
0320: 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c ef SQLITE_DISABL
0330: 45 5f 4c 46 53 0a 23 20 20 75 6e 64 65 66 20 4f E_LFS.# undef O
0340: 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 20 64 65 _LARGEFILE.# de
0350: 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 fine O_LARGEFILE
0360: 20 30 0a 23 20 65 6e 64 69 66 0a 23 20 69 66 6e 0.# endif.# ifn
0370: 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 def O_NOFOLLOW.#
0380: 20 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c define O_NOFOL
0390: 4c 4f 57 20 30 0a 23 20 65 6e 64 69 66 0a 23 20 LOW 0.# endif.#
03a0: 69 66 6e 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a ifndef O_BINARY.
03b0: 23 20 20 64 65 66 69 6e 65 20 4f 5f 42 49 4e 41 # define O_BINA
03c0: 52 59 20 30 0a 23 20 65 6e 64 69 66 0a 23 65 6e RY 0.# endif.#en
03d0: 64 69 66 0a 0a 0a 23 69 66 20 4f 53 5f 57 49 4e dif...#if OS_WIN
03e0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 77 69 6e 62 .# include <winb
03f0: 61 73 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 ase.h>.#endif..#
0400: 69 66 20 4f 53 5f 4d 41 43 0a 23 20 69 6e 63 6c if OS_MAC.# incl
0410: 75 64 65 20 3c 65 78 74 72 61 73 2e 68 3e 0a 23 ude <extras.h>.#
0420: 20 69 6e 63 6c 75 64 65 20 3c 70 61 74 68 32 66 include <path2f
0430: 73 73 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 ss.h>.# include
0440: 3c 54 65 78 74 55 74 69 6c 73 2e 68 3e 0a 23 20 <TextUtils.h>.#
0450: 69 6e 63 6c 75 64 65 20 3c 46 69 6e 64 65 72 52 include <FinderR
0460: 65 67 69 73 74 72 79 2e 68 3e 0a 23 20 69 6e 63 egistry.h>.# inc
0470: 6c 75 64 65 20 3c 46 6f 6c 64 65 72 73 2e 68 3e lude <Folders.h>
0480: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 54 69 6d 65 .# include <Time
0490: 72 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c r.h>.# include <
04a0: 4f 53 55 74 69 6c 73 2e 68 3e 0a 23 65 6e 64 69 OSUtils.h>.#endi
04b0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 f../*.** The DJG
04c0: 50 50 20 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69 PP compiler envi
04d0: 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f ronment looks mo
04e0: 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20 stly like Unix,
04f0: 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 but it.** lacks
0500: 74 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 the fcntl() syst
0510: 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64 em call. So red
0520: 65 66 69 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f efine fcntl() to
0530: 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a be something.**
0540: 20 74 68 61 74 20 61 6c 77 61 79 73 20 73 75 63 that always suc
0550: 63 65 65 64 73 2e 20 20 54 68 69 73 20 6d 65 61 ceeds. This mea
0560: 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20 ns that locking
0570: 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 does not occur u
0580: 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 nder.** DJGPP.
0590: 42 75 74 20 69 74 73 20 44 4f 53 20 2d 20 77 68 But its DOS - wh
05a0: 61 74 20 64 69 64 20 79 6f 75 20 65 78 70 65 63 at did you expec
05b0: 74 3f 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44 t?.*/.#ifdef __D
05c0: 4a 47 50 50 5f 5f 0a 23 20 64 65 66 69 6e 65 20 JGPP__.# define
05d0: 66 63 6e 74 6c 28 41 2c 42 2c 43 29 20 30 0a 23 fcntl(A,B,C) 0.#
05e0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 endif../*.** Mac
05f0: 72 6f 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 ros used to dete
0600: 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 rmine whether or
0610: 20 6e 6f 74 20 74 6f 20 75 73 65 20 74 68 72 65 not to use thre
0620: 61 64 73 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c ads. The.** SQL
0630: 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 ITE_UNIX_THREADS
0640: 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 macro is define
0650: 64 20 69 66 20 77 65 20 61 72 65 20 73 79 6e 63 d if we are sync
0660: 68 72 6f 6e 69 7a 69 6e 67 20 66 6f 72 0a 2a 2a hronizing for.**
0670: 20 50 6f 73 69 78 20 74 68 72 65 61 64 73 20 61 Posix threads a
0680: 6e 64 20 53 51 4c 49 54 45 5f 57 33 32 5f 54 48 nd SQLITE_W32_TH
0690: 52 45 41 44 53 20 69 73 20 64 65 66 69 6e 65 64 READS is defined
06a0: 20 69 66 20 77 65 20 61 72 65 0a 2a 2a 20 73 79 if we are.** sy
06b0: 6e 63 68 72 6f 6e 69 7a 69 6e 67 20 75 73 69 6e nchronizing usin
06c0: 67 20 57 69 6e 33 32 20 74 68 72 65 61 64 73 2e g Win32 threads.
06d0: 0a 2a 2f 0a 23 69 66 20 4f 53 5f 55 4e 49 58 20 .*/.#if OS_UNIX
06e0: 26 26 20 64 65 66 69 6e 65 64 28 54 48 52 45 41 && defined(THREA
06f0: 44 53 41 46 45 29 20 26 26 20 54 48 52 45 41 44 DSAFE) && THREAD
0700: 53 41 46 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c SAFE.# include <
0710: 70 74 68 72 65 61 64 2e 68 3e 0a 23 20 64 65 66 pthread.h>.# def
0720: 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f ine SQLITE_UNIX_
0730: 54 48 52 45 41 44 53 20 31 0a 23 65 6e 64 69 66 THREADS 1.#endif
0740: 0a 23 69 66 20 4f 53 5f 57 49 4e 20 26 26 20 64 .#if OS_WIN && d
0750: 65 66 69 6e 65 64 28 54 48 52 45 41 44 53 41 46 efined(THREADSAF
0760: 45 29 20 26 26 20 54 48 52 45 41 44 53 41 46 45 E) && THREADSAFE
0770: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 .# define SQLITE
0780: 5f 57 33 32 5f 54 48 52 45 41 44 53 20 31 0a 23 _W32_THREADS 1.#
0790: 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 4d 41 43 endif.#if OS_MAC
07a0: 20 26 26 20 64 65 66 69 6e 65 64 28 54 48 52 45 && defined(THRE
07b0: 41 44 53 41 46 45 29 20 26 26 20 54 48 52 45 41 ADSAFE) && THREA
07c0: 44 53 41 46 45 0a 23 20 69 6e 63 6c 75 64 65 20 DSAFE.# include
07d0: 3c 4d 75 6c 74 69 70 72 6f 63 65 73 73 69 6e 67 <Multiprocessing
07e0: 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c .h>.# define SQL
07f0: 49 54 45 5f 4d 41 43 4f 53 5f 4d 55 4c 54 49 54 ITE_MACOS_MULTIT
0800: 41 53 4b 49 4e 47 20 31 0a 23 65 6e 64 69 66 0a ASKING 1.#endif.
0810: 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f ./*.** Macros fo
0820: 72 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 74 72 r performance tr
0830: 61 63 69 6e 67 2e 20 20 4e 6f 72 6d 61 6c 6c 79 acing. Normally
0840: 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a 23 turned off.*/.#
0850: 69 66 20 30 0a 73 74 61 74 69 63 20 69 6e 74 20 if 0.static int
0860: 6c 61 73 74 5f 70 61 67 65 20 3d 20 30 3b 0a 5f last_page = 0;._
0870: 5f 69 6e 6c 69 6e 65 5f 5f 20 75 6e 73 69 67 6e _inline__ unsign
0880: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 69 6e 74 ed long long int
0890: 20 68 77 74 69 6d 65 28 76 6f 69 64 29 7b 0a 20 hwtime(void){.
08a0: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c unsigned long l
08b0: 6f 6e 67 20 69 6e 74 20 78 3b 0a 20 20 5f 5f 61 ong int x;. __a
08c0: 73 6d 5f 5f 28 22 72 64 74 73 63 5c 6e 5c 74 22 sm__("rdtsc\n\t"
08d0: 0a 20 20 20 20 20 20 20 20 20 20 22 6d 6f 76 20 . "mov
08e0: 25 25 65 64 78 2c 20 25 25 65 63 78 5c 6e 5c 74 %%edx, %%ecx\n\t
08f0: 22 0a 20 20 20 20 20 20 20 20 20 20 3a 22 3d 41 ". :"=A
0900: 22 20 28 78 29 29 3b 0a 20 20 72 65 74 75 72 6e " (x));. return
0910: 20 78 3b 0a 7d 0a 73 74 61 74 69 63 20 75 6e 73 x;.}.static uns
0920: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 igned long long
0930: 69 6e 74 20 67 5f 73 74 61 72 74 3b 0a 73 74 61 int g_start;.sta
0940: 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 tic unsigned int
0950: 20 65 6c 61 70 73 65 3b 0a 23 64 65 66 69 6e 65 elapse;.#define
0960: 20 54 49 4d 45 52 5f 53 54 41 52 54 20 20 20 20 TIMER_START
0970: 20 20 20 67 5f 73 74 61 72 74 3d 68 77 74 69 6d g_start=hwtim
0980: 65 28 29 0a 23 64 65 66 69 6e 65 20 54 49 4d 45 e().#define TIME
0990: 52 5f 45 4e 44 20 20 20 20 20 20 20 20 20 65 6c R_END el
09a0: 61 70 73 65 3d 68 77 74 69 6d 65 28 29 2d 67 5f apse=hwtime()-g_
09b0: 73 74 61 72 74 0a 23 64 65 66 69 6e 65 20 53 45 start.#define SE
09c0: 45 4b 28 58 29 20 20 20 20 20 20 20 20 20 20 20 EK(X)
09d0: 6c 61 73 74 5f 70 61 67 65 3d 28 58 29 0a 23 64 last_page=(X).#d
09e0: 65 66 69 6e 65 20 54 52 41 43 45 31 28 58 29 20 efine TRACE1(X)
09f0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 fprintf(
0a00: 73 74 64 65 72 72 2c 58 29 0a 23 64 65 66 69 6e stderr,X).#defin
0a10: 65 20 54 52 41 43 45 32 28 58 2c 59 29 20 20 20 e TRACE2(X,Y)
0a20: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 fprintf(stde
0a30: 72 72 2c 58 2c 59 29 0a 23 64 65 66 69 6e 65 20 rr,X,Y).#define
0a40: 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 20 20 20 TRACE3(X,Y,Z)
0a50: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 fprintf(stderr
0a60: 2c 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 ,X,Y,Z).#define
0a70: 54 52 41 43 45 34 28 58 2c 59 2c 5a 2c 41 29 20 TRACE4(X,Y,Z,A)
0a80: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 fprintf(stderr
0a90: 2c 58 2c 59 2c 5a 2c 41 29 0a 23 64 65 66 69 6e ,X,Y,Z,A).#defin
0aa0: 65 20 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c 41 e TRACE5(X,Y,Z,A
0ab0: 2c 42 29 20 66 70 72 69 6e 74 66 28 73 74 64 65 ,B) fprintf(stde
0ac0: 72 72 2c 58 2c 59 2c 5a 2c 41 2c 42 29 0a 23 65 rr,X,Y,Z,A,B).#e
0ad0: 6c 73 65 0a 23 64 65 66 69 6e 65 20 54 49 4d 45 lse.#define TIME
0ae0: 52 5f 53 54 41 52 54 0a 23 64 65 66 69 6e 65 20 R_START.#define
0af0: 54 49 4d 45 52 5f 45 4e 44 0a 23 64 65 66 69 6e TIMER_END.#defin
0b00: 65 20 53 45 45 4b 28 58 29 0a 23 64 65 66 69 6e e SEEK(X).#defin
0b10: 65 20 54 52 41 43 45 31 28 58 29 0a 23 64 65 66 e TRACE1(X).#def
0b20: 69 6e 65 20 54 52 41 43 45 32 28 58 2c 59 29 0a ine TRACE2(X,Y).
0b30: 23 64 65 66 69 6e 65 20 54 52 41 43 45 33 28 58 #define TRACE3(X
0b40: 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 54 52 ,Y,Z).#define TR
0b50: 41 43 45 34 28 58 2c 59 2c 5a 2c 41 29 0a 23 64 ACE4(X,Y,Z,A).#d
0b60: 65 66 69 6e 65 20 54 52 41 43 45 35 28 58 2c 59 efine TRACE5(X,Y
0b70: 2c 5a 2c 41 2c 42 29 0a 23 65 6e 64 69 66 0a 0a ,Z,A,B).#endif..
0b80: 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a 2f 2a 0a .#if OS_UNIX./*.
0b90: 2a 2a 20 48 65 72 65 20 69 73 20 74 68 65 20 64 ** Here is the d
0ba0: 69 72 74 20 6f 6e 20 50 4f 53 49 58 20 61 64 76 irt on POSIX adv
0bb0: 69 73 6f 72 79 20 6c 6f 63 6b 73 3a 20 20 41 4e isory locks: AN
0bc0: 53 49 20 53 54 44 20 31 30 30 33 2e 31 20 28 31 SI STD 1003.1 (1
0bd0: 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 996).** section
0be0: 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38 6.5.2.2 lines 48
0bf0: 33 20 74 68 72 6f 75 67 68 20 34 39 30 20 73 70 3 through 490 sp
0c00: 65 63 69 66 79 20 74 68 61 74 20 77 68 65 6e 20 ecify that when
0c10: 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74 a process.** set
0c20: 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c 6f s or clears a lo
0c30: 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74 69 ck, that operati
0c40: 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79 on overrides any
0c50: 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74 prior locks set
0c60: 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65 20 .** by the same
0c70: 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f 65 process. It doe
0c80: 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79 s not explicitly
0c90: 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68 69 say so, but thi
0ca0: 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61 s implies.** tha
0cb0: 74 20 69 74 20 6f 76 65 72 72 69 64 65 73 20 6c t it overrides l
0cc0: 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68 65 20 ocks set by the
0cd0: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73 69 same process usi
0ce0: 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a ng a different.*
0cf0: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f * file descripto
0d00: 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69 r. Consider thi
0d10: 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a s test case:.**.
0d20: 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 31 ** int fd1
0d30: 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31 = open("./file1
0d40: 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 ", O_RDWR|O_CREA
0d50: 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20 T, 0644);.**
0d60: 20 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70 65 int fd2 = ope
0d70: 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 n("./file2", O_R
0d80: 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 DWR|O_CREAT, 064
0d90: 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 4);.**.** Suppos
0da0: 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f e ./file1 and ./
0db0: 66 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c 79 file2 are really
0dc0: 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 28 the same file (
0dd0: 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 because.** one i
0de0: 73 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d 62 s a hard or symb
0df0: 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65 olic link to the
0e00: 20 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66 20 other) then if
0e10: 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78 you set.** an ex
0e20: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 clusive lock on
0e30: 66 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74 6f fd1, then try to
0e40: 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 get an exclusiv
0e50: 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 e lock.** on fd2
0e60: 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20 77 , it works. I w
0e70: 6f 75 6c 64 20 68 61 76 65 20 65 78 70 65 63 74 ould have expect
0e80: 65 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f ed the second lo
0e90: 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 ck to.** fail si
0ea0: 6e 63 65 20 74 68 65 72 65 20 77 61 73 20 61 6c nce there was al
0eb0: 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 ready a lock on
0ec0: 74 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f 20 the file due to
0ed0: 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 fd1..** But not
0ee0: 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68 20 so. Since both
0ef0: 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20 locks came from
0f00: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 the same process
0f10: 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 , the.** second
0f20: 6f 76 65 72 72 69 64 65 73 20 74 68 65 20 66 69 overrides the fi
0f30: 72 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 rst, even though
0f40: 20 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64 69 they were on di
0f50: 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 fferent.** file
0f60: 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e descriptors open
0f70: 65 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 20 ed on different
0f80: 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a file names..**.*
0f90: 2a 20 42 75 6d 6d 65 72 2e 20 20 49 66 20 79 6f * Bummer. If yo
0fa0: 75 20 61 73 6b 20 6d 65 2c 20 74 68 69 73 20 69 u ask me, this i
0fb0: 73 20 62 72 6f 6b 65 6e 2e 20 20 42 61 64 6c 79 s broken. Badly
0fc0: 20 62 72 6f 6b 65 6e 2e 20 20 49 74 20 6d 65 61 broken. It mea
0fd0: 6e 73 0a 2a 2a 20 74 68 61 74 20 77 65 20 63 61 ns.** that we ca
0fe0: 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49 58 20 6c nnot use POSIX l
0ff0: 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e ocks to synchron
1000: 69 7a 65 20 66 69 6c 65 20 61 63 63 65 73 73 20 ize file access
1010: 61 6d 6f 6e 67 0a 2a 2a 20 63 6f 6d 70 65 74 69 among.** competi
1020: 6e 67 20 74 68 72 65 61 64 73 20 6f 66 20 74 68 ng threads of th
1030: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 e same process.
1040: 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c POSIX locks wil
1050: 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 l work fine.** t
1060: 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63 o synchronize ac
1070: 63 65 73 73 20 66 6f 72 20 74 68 72 65 61 64 73 cess for threads
1080: 20 69 6e 20 73 65 70 61 72 61 74 65 20 70 72 6f in separate pro
1090: 63 65 73 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a cesses, but not.
10a0: 2a 2a 20 74 68 72 65 61 64 73 20 77 69 74 68 69 ** threads withi
10b0: 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 n the same proce
10c0: 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 ss..**.** To wor
10d0: 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 70 72 6f k around the pro
10e0: 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20 68 61 73 blem, SQLite has
10f0: 20 74 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65 20 to manage file
1100: 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79 locks internally
1110: 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 .** on its own.
1120: 20 57 68 65 6e 65 76 65 72 20 61 20 6e 65 77 20 Whenever a new
1130: 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e database is open
1140: 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66 ed, we have to f
1150: 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 ind the.** speci
1160: 66 69 63 20 69 6e 6f 64 65 20 6f 66 20 74 68 65 fic inode of the
1170: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 database file (
1180: 74 68 65 20 69 6e 6f 64 65 20 69 73 20 64 65 74 the inode is det
1190: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 0a 2a ermined by the.*
11a0: 2a 20 73 74 5f 64 65 76 20 61 6e 64 20 73 74 5f * st_dev and st_
11b0: 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68 ino fields of th
11c0: 65 20 73 74 61 74 20 73 74 72 75 63 74 75 72 65 e stat structure
11d0: 20 74 68 61 74 20 66 73 74 61 74 28 29 20 66 69 that fstat() fi
11e0: 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 lls in).** and c
11f0: 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61 heck for locks a
1200: 6c 72 65 61 64 79 20 65 78 69 73 74 69 6e 67 20 lready existing
1210: 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65 2e 20 20 on that inode.
1220: 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a When locks are.*
1230: 2a 20 63 72 65 61 74 65 64 20 6f 72 20 72 65 6d * created or rem
1240: 6f 76 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f oved, we have to
1250: 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e look at our own
1260: 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 internal record
1270: 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 of the.** locks
1280: 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 to see if anoth
1290: 65 72 20 74 68 72 65 61 64 20 68 61 73 20 70 72 er thread has pr
12a0: 65 76 69 6f 75 73 6c 79 20 73 65 74 20 61 20 6c eviously set a l
12b0: 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d 65 ock on that same
12c0: 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a .** inode..**.**
12d0: 20 54 68 65 20 4f 73 46 69 6c 65 20 73 74 72 75 The OsFile stru
12e0: 63 74 75 72 65 20 66 6f 72 20 50 4f 53 49 58 20 cture for POSIX
12f0: 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 is no longer jus
1300: 74 20 61 6e 20 69 6e 74 65 67 65 72 20 66 69 6c t an integer fil
1310: 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 2e e.** descriptor.
1320: 20 20 49 74 20 69 73 20 6e 6f 77 20 61 20 73 74 It is now a st
1330: 72 75 63 74 75 72 65 20 74 68 61 74 20 68 6f 6c ructure that hol
1340: 64 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 66 ds the integer f
1350: 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f ile.** descripto
1360: 72 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 r and a pointer
1370: 74 6f 20 61 20 73 74 72 75 63 74 75 72 65 20 74 to a structure t
1380: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 hat describes th
1390: 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f e internal.** lo
13a0: 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 cks on the corre
13b0: 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65 2e 20 sponding inode.
13c0: 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f There is one lo
13d0: 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 0a cking structure.
13e0: 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20 73 6f ** per inode, so
13f0: 20 69 66 20 74 68 65 20 73 61 6d 65 20 69 6e 6f if the same ino
1400: 64 65 20 69 73 20 6f 70 65 6e 65 64 20 74 77 69 de is opened twi
1410: 63 65 2c 20 62 6f 74 68 20 4f 73 46 69 6c 65 20 ce, both OsFile
1420: 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f structures.** po
1430: 69 6e 74 20 74 6f 20 74 68 65 20 73 61 6d 65 20 int to the same
1440: 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 locking structur
1450: 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 e. The locking
1460: 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 0a structure keeps.
1470: 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 ** a reference c
1480: 6f 75 6e 74 20 28 73 6f 20 77 65 20 77 69 6c 6c ount (so we will
1490: 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20 64 65 know when to de
14a0: 6c 65 74 65 20 69 74 29 20 61 6e 64 20 61 20 22 lete it) and a "
14b0: 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68 cnt".** field th
14c0: 61 74 20 74 65 6c 6c 73 20 75 73 20 69 74 73 20 at tells us its
14d0: 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 internal lock st
14e0: 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 atus. cnt==0 me
14f0: 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 ans the.** file
1500: 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e is unlocked. cn
1510: 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68 65 20 t==-1 means the
1520: 66 69 6c 65 20 68 61 73 20 61 6e 20 65 78 63 6c file has an excl
1530: 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 usive lock..** c
1540: 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68 65 72 65 nt>0 means there
1550: 20 61 72 65 20 63 6e 74 20 73 68 61 72 65 64 20 are cnt shared
1560: 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c locks on the fil
1570: 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 e..**.** Any att
1580: 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 empt to lock or
1590: 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 66 69 unlock a file fi
15a0: 72 73 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c rst checks the l
15b0: 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 ocking.** struct
15c0: 75 72 65 2e 20 20 54 68 65 20 66 63 6e 74 6c 28 ure. The fcntl(
15d0: 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 69 73 ) system call is
15e0: 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f only invoked to
15f0: 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58 set a .** POSIX
1600: 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 69 6e 74 lock if the int
1610: 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63 ernal lock struc
1620: 74 75 72 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 ture transitions
1630: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f between.** a lo
1640: 63 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f cked and an unlo
1650: 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a cked state..**.*
1660: 2a 20 32 30 30 34 2d 4a 61 6e 2d 31 31 3a 0a 2a * 2004-Jan-11:.*
1670: 2a 20 4d 6f 72 65 20 72 65 63 65 6e 74 20 64 69 * More recent di
1680: 73 63 6f 76 65 72 69 65 73 20 61 62 6f 75 74 20 scoveries about
1690: 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c POSIX advisory l
16a0: 6f 63 6b 73 2e 20 20 28 54 68 65 20 6d 6f 72 65 ocks. (The more
16b0: 0a 2a 2a 20 49 20 64 69 73 63 6f 76 65 72 2c 20 .** I discover,
16c0: 74 68 65 20 6d 6f 72 65 20 49 20 72 65 61 6c 69 the more I reali
16d0: 7a 65 20 74 68 65 20 61 20 50 4f 53 49 58 20 61 ze the a POSIX a
16e0: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72 dvisory locks ar
16f0: 65 0a 2a 2a 20 61 6e 20 61 62 6f 6d 69 6e 61 74 e.** an abominat
1700: 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 49 66 20 79 ion.).**.** If y
1710: 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c 65 20 ou close a file
1720: 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20 descriptor that
1730: 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 69 6c 65 points to a file
1740: 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c that has locks,
1750: 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e .** all locks on
1760: 20 74 68 61 74 20 66 69 6c 65 20 74 68 61 74 20 that file that
1770: 61 72 65 20 6f 77 6e 65 64 20 62 79 20 74 68 65 are owned by the
1780: 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 current process
1790: 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64 are.** released
17a0: 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e . To work aroun
17b0: 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20 d this problem,
17c0: 65 61 63 68 20 4f 73 46 69 6c 65 20 73 74 72 75 each OsFile stru
17d0: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a cture contains.*
17e0: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 * a pointer to a
17f0: 6e 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 n openCnt struct
1800: 75 72 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f ure. There is o
1810: 6e 65 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 ne openCnt struc
1820: 74 75 72 65 0a 2a 2a 20 70 65 72 20 6f 70 65 6e ture.** per open
1830: 20 69 6e 6f 64 65 2c 20 77 68 69 63 68 20 6d 65 inode, which me
1840: 61 6e 73 20 74 68 61 74 20 6d 75 6c 74 69 70 6c ans that multipl
1850: 65 20 4f 73 46 69 6c 65 73 20 63 61 6e 20 70 6f e OsFiles can po
1860: 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 0a int to a single.
1870: 2a 2a 20 6f 70 65 6e 43 6e 74 2e 20 20 57 68 65 ** openCnt. Whe
1880: 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 n an attempt is
1890: 6d 61 64 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e made to close an
18a0: 20 4f 73 46 69 6c 65 2c 20 69 66 20 74 68 65 72 OsFile, if ther
18b0: 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20 4f e are.** other O
18c0: 73 46 69 6c 65 73 20 6f 70 65 6e 20 6f 6e 20 74 sFiles open on t
18d0: 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 74 68 he same inode th
18e0: 61 74 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c at are holding l
18f0: 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a ocks, the call.*
1900: 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65 * to close() the
1910: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 file descriptor
1920: 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 is deferred unt
1930: 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f il all of the lo
1940: 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 cks clear..** Th
1950: 65 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 e openCnt struct
1960: 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69 73 74 ure keeps a list
1970: 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69 70 of file descrip
1980: 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 tors that need t
1990: 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20 61 o.** be closed a
19a0: 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69 73 20 nd that list is
19b0: 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65 61 walked (and clea
19c0: 72 65 64 29 20 77 68 65 6e 20 74 68 65 20 6c 61 red) when the la
19d0: 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 st lock.** clear
19e0: 73 2e 0a 2a 2a 0a 2a 2a 20 46 69 72 73 74 2c 20 s..**.** First,
19f0: 75 6e 64 65 72 20 4c 69 6e 75 78 20 74 68 72 65 under Linux thre
1a00: 61 64 73 2c 20 62 65 63 61 75 73 65 20 65 61 63 ads, because eac
1a10: 68 20 74 68 72 65 61 64 20 68 61 73 20 61 20 73 h thread has a s
1a20: 65 70 61 72 61 74 65 0a 2a 2a 20 70 72 6f 63 65 eparate.** proce
1a30: 73 73 20 49 44 2c 20 6c 6f 63 6b 20 6f 70 65 72 ss ID, lock oper
1a40: 61 74 69 6f 6e 73 20 69 6e 20 6f 6e 65 20 74 68 ations in one th
1a50: 72 65 61 64 20 64 6f 20 6e 6f 74 20 6f 76 65 72 read do not over
1a60: 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 74 6f ride locks.** to
1a70: 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 69 the same file i
1a80: 6e 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 2e n other threads.
1a90: 20 20 4c 69 6e 75 78 20 74 68 72 65 61 64 73 20 Linux threads
1aa0: 62 65 68 61 76 65 20 6c 69 6b 65 0a 2a 2a 20 73 behave like.** s
1ab0: 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 65 eparate processe
1ac0: 73 20 69 6e 20 74 68 69 73 20 72 65 73 70 65 63 s in this respec
1ad0: 74 2e 20 20 42 75 74 2c 20 69 66 20 79 6f 75 20 t. But, if you
1ae0: 63 6c 6f 73 65 20 61 20 66 69 6c 65 0a 2a 2a 20 close a file.**
1af0: 64 65 73 63 72 69 70 74 6f 72 20 69 6e 20 6c 69 descriptor in li
1b00: 6e 75 78 20 74 68 72 65 61 64 73 2c 20 61 6c 6c nux threads, all
1b10: 20 6c 6f 63 6b 73 20 61 72 65 20 63 6c 65 61 72 locks are clear
1b20: 65 64 2c 20 65 76 65 6e 20 6c 6f 63 6b 73 0a 2a ed, even locks.*
1b30: 2a 20 6f 6e 20 6f 74 68 65 72 20 74 68 72 65 61 * on other threa
1b40: 64 73 20 61 6e 64 20 65 76 65 6e 20 74 68 6f 75 ds and even thou
1b50: 67 68 20 74 68 65 20 6f 74 68 65 72 20 74 68 72 gh the other thr
1b60: 65 61 64 73 20 68 61 76 65 20 64 69 66 66 65 72 eads have differ
1b70: 65 6e 74 0a 2a 2a 20 70 72 6f 63 65 73 73 20 49 ent.** process I
1b80: 44 73 2e 20 20 4c 69 6e 75 78 20 74 68 72 65 61 Ds. Linux threa
1b90: 64 73 20 69 73 20 69 6e 63 6f 6e 73 69 73 74 65 ds is inconsiste
1ba0: 6e 74 20 69 6e 20 74 68 69 73 20 72 65 73 70 65 nt in this respe
1bb0: 63 74 2e 0a 2a 2a 20 28 49 27 6d 20 62 65 67 69 ct..** (I'm begi
1bc0: 6e 6e 69 6e 67 20 74 6f 20 74 68 69 6e 6b 20 74 nning to think t
1bd0: 68 61 74 20 6c 69 6e 75 78 20 74 68 72 65 61 64 hat linux thread
1be0: 73 20 69 73 20 61 6e 20 61 62 6f 6d 69 6e 61 74 s is an abominat
1bf0: 69 6f 6e 20 74 6f 6f 2e 29 0a 2a 2a 20 54 68 65 ion too.).** The
1c00: 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 6f 66 20 consequence of
1c10: 74 68 69 73 20 61 6c 6c 20 69 73 20 74 68 61 74 this all is that
1c20: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 the hash table
1c30: 66 6f 72 20 74 68 65 20 6c 6f 63 6b 49 6e 66 6f for the lockInfo
1c40: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 68 61 .** structure ha
1c50: 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 s to include the
1c60: 20 70 72 6f 63 65 73 73 20 69 64 20 61 73 20 70 process id as p
1c70: 61 72 74 20 6f 66 20 69 74 73 20 6b 65 79 20 62 art of its key b
1c80: 65 63 61 75 73 65 0a 2a 2a 20 6c 6f 63 6b 73 20 ecause.** locks
1c90: 69 6e 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 in different thr
1ca0: 65 61 64 73 20 61 72 65 20 74 72 65 61 74 65 64 eads are treated
1cb0: 20 61 73 20 64 69 73 74 69 6e 63 74 2e 20 20 42 as distinct. B
1cc0: 75 74 20 74 68 65 20 0a 2a 2a 20 6f 70 65 6e 43 ut the .** openC
1cd0: 6e 74 20 73 74 72 75 63 74 75 72 65 20 73 68 6f nt structure sho
1ce0: 75 6c 64 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 uld not include
1cf0: 74 68 65 20 70 72 6f 63 65 73 73 20 69 64 20 69 the process id i
1d00: 6e 20 69 74 73 0a 2a 2a 20 6b 65 79 20 62 65 63 n its.** key bec
1d10: 61 75 73 65 20 63 6c 6f 73 65 28 29 20 63 6c 65 ause close() cle
1d20: 61 72 73 20 6c 6f 63 6b 20 6f 6e 20 61 6c 6c 20 ars lock on all
1d30: 74 68 72 65 61 64 73 2c 20 6e 6f 74 20 6a 75 73 threads, not jus
1d40: 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a t the current.**
1d50: 20 74 68 72 65 61 64 2e 20 20 57 65 72 65 20 69 thread. Were i
1d60: 74 20 6e 6f 74 20 66 6f 72 20 74 68 69 73 20 67 t not for this g
1d70: 6f 6f 66 69 6e 65 73 73 20 69 6e 20 6c 69 6e 75 oofiness in linu
1d80: 78 20 74 68 72 65 61 64 73 2c 20 77 65 20 63 6f x threads, we co
1d90: 75 6c 64 0a 2a 2a 20 63 6f 6d 62 69 6e 65 20 74 uld.** combine t
1da0: 68 65 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 he lockInfo and
1db0: 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 openCnt structur
1dc0: 65 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 es into a single
1dd0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 0a structure..*/..
1de0: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 /*.** An instanc
1df0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 e of the followi
1e00: 6e 67 20 73 74 72 75 63 74 75 72 65 20 73 65 72 ng structure ser
1e10: 76 65 73 20 61 73 20 74 68 65 20 6b 65 79 20 75 ves as the key u
1e20: 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 sed.** to locate
1e30: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6c 6f a particular lo
1e40: 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 ckInfo structure
1e50: 20 67 69 76 65 6e 20 69 74 73 20 69 6e 6f 64 65 given its inode
1e60: 2e 20 20 4e 6f 74 65 0a 2a 2a 20 74 68 61 74 20 . Note.** that
1e70: 77 65 20 68 61 76 65 20 74 6f 20 69 6e 63 6c 75 we have to inclu
1e80: 64 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 49 de the process I
1e90: 44 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 D as part of the
1ea0: 20 6b 65 79 2e 20 20 4f 6e 20 73 6f 6d 65 0a 2a key. On some.*
1eb0: 2a 20 74 68 72 65 61 64 69 6e 67 20 69 6d 70 6c * threading impl
1ec0: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 28 65 78 3a ementations (ex:
1ed0: 20 6c 69 6e 75 78 29 2c 20 65 61 63 68 20 74 68 linux), each th
1ee0: 72 65 61 64 20 68 61 73 20 61 20 73 65 70 61 72 read has a separ
1ef0: 61 74 65 0a 2a 2a 20 70 72 6f 63 65 73 73 20 49 ate.** process I
1f00: 44 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6c 6f 63 D..*/.struct loc
1f10: 6b 4b 65 79 20 7b 0a 20 20 64 65 76 5f 74 20 64 kKey {. dev_t d
1f20: 65 76 3b 20 20 20 2f 2a 20 44 65 76 69 63 65 20 ev; /* Device
1f30: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 6f 5f number */. ino_
1f40: 74 20 69 6e 6f 3b 20 20 20 2f 2a 20 49 6e 6f 64 t ino; /* Inod
1f50: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 70 69 e number */. pi
1f60: 64 5f 74 20 70 69 64 3b 20 20 20 2f 2a 20 50 72 d_t pid; /* Pr
1f70: 6f 63 65 73 73 20 49 44 20 2a 2f 0a 7d 3b 0a 0a ocess ID */.};..
1f80: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 /*.** An instanc
1f90: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 e of the followi
1fa0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 ng structure is
1fb0: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 allocated for ea
1fc0: 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 ch open.** inode
1fd0: 20 6f 6e 20 65 61 63 68 20 74 68 72 65 61 64 20 on each thread
1fe0: 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 with a different
1ff0: 20 70 72 6f 63 65 73 73 20 49 44 2e 20 20 28 54 process ID. (T
2000: 68 72 65 61 64 73 20 68 61 76 65 0a 2a 2a 20 64 hreads have.** d
2010: 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 ifferent process
2020: 20 49 44 73 20 6f 6e 20 6c 69 6e 75 78 2c 20 62 IDs on linux, b
2030: 75 74 20 6e 6f 74 20 6f 6e 20 6d 6f 73 74 20 6f ut not on most o
2040: 74 68 65 72 20 75 6e 69 78 65 73 2e 29 0a 2a 2a ther unixes.).**
2050: 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f .** A single ino
2060: 64 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 de can have mult
2070: 69 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 iple file descri
2080: 70 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20 4f ptors, so each O
2090: 73 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 sFile.** structu
20a0: 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f re contains a po
20b0: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 inter to an inst
20c0: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a ance of this obj
20d0: 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 ect and this.**
20e0: 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20 63 object keeps a c
20f0: 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 ount of the numb
2100: 65 72 20 6f 66 20 4f 73 46 69 6c 65 73 20 70 6f er of OsFiles po
2110: 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f inting to it..*/
2120: 0a 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f .struct lockInfo
2130: 20 7b 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b {. struct lock
2140: 4b 65 79 20 6b 65 79 3b 20 20 2f 2a 20 54 68 65 Key key; /* The
2150: 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 lookup key */.
2160: 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 int cnt;
2170: 20 20 20 20 20 20 2f 2a 20 30 3a 20 75 6e 6c 6f /* 0: unlo
2180: 63 6b 65 64 2e 20 20 2d 31 3a 20 77 72 69 74 65 cked. -1: write
2190: 20 6c 6f 63 6b 2e 20 20 31 2e 2e 2e 3a 20 72 65 lock. 1...: re
21a0: 61 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 6e ad lock. */. in
21b0: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 t nRef;
21c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 /* Number of
21d0: 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69 73 pointers to this
21e0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 7d 3b structure */.};
21f0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 ../*.** An insta
2200: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f nce of the follo
2210: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 73 wing structure s
2220: 65 72 76 65 73 20 61 73 20 74 68 65 20 6b 65 79 erves as the key
2230: 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 used.** to loca
2240: 74 65 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 te a particular
2250: 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 openCnt structur
2260: 65 20 67 69 76 65 6e 20 69 74 73 20 69 6e 6f 64 e given its inod
2270: 65 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 74 e. This.** is t
2280: 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 6c he same as the l
2290: 6f 63 6b 4b 65 79 20 65 78 63 65 70 74 20 74 68 ockKey except th
22a0: 61 74 20 74 68 65 20 70 72 6f 63 65 73 73 20 49 at the process I
22b0: 44 20 69 73 20 6f 6d 69 74 74 65 64 2e 0a 2a 2f D is omitted..*/
22c0: 0a 73 74 72 75 63 74 20 6f 70 65 6e 4b 65 79 20 .struct openKey
22d0: 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20 {. dev_t dev;
22e0: 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65 /* Device numbe
22f0: 72 20 2a 2f 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f r */. ino_t ino
2300: 3b 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d ; /* Inode num
2310: 62 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a ber */.};../*.**
2320: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 An instance of
2330: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 the following st
2340: 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 ructure is alloc
2350: 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70 ated for each op
2360: 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 54 68 en.** inode. Th
2370: 69 73 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 is structure kee
2380: 70 73 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 ps track of the
2390: 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 number of locks
23a0: 6f 6e 20 74 68 61 74 0a 2a 2a 20 69 6e 6f 64 65 on that.** inode
23b0: 2e 20 20 49 66 20 61 20 63 6c 6f 73 65 20 69 73 . If a close is
23c0: 20 61 74 74 65 6d 70 74 65 64 20 61 67 61 69 6e attempted again
23d0: 73 74 20 61 6e 20 69 6e 6f 64 65 20 74 68 61 74 st an inode that
23e0: 20 69 73 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6c is holding.** l
23f0: 6f 63 6b 73 2c 20 74 68 65 20 63 6c 6f 73 65 20 ocks, the close
2400: 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 is deferred unti
2410: 6c 20 61 6c 6c 20 6c 6f 63 6b 73 20 63 6c 65 61 l all locks clea
2420: 72 20 62 79 20 61 64 64 69 6e 67 20 74 68 65 0a r by adding the.
2430: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 ** file descript
2440: 6f 72 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 or to be closed
2450: 74 6f 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c to the pending l
2460: 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6f ist..*/.struct o
2470: 70 65 6e 43 6e 74 20 7b 0a 20 20 73 74 72 75 63 penCnt {. struc
2480: 74 20 6f 70 65 6e 4b 65 79 20 6b 65 79 3b 20 20 t openKey key;
2490: 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b /* The lookup k
24a0: 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 ey */. int nRef
24b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a ; /*
24c0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 Number of point
24d0: 65 72 73 20 74 6f 20 74 68 69 73 20 73 74 72 75 ers to this stru
24e0: 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e cture */. int n
24f0: 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 Lock;
2500: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 /* Number of ou
2510: 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 tstanding locks
2520: 2a 2f 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e */. int nPendin
2530: 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 g; /* Nu
2540: 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67 20 mber of pending
2550: 63 6c 6f 73 65 28 29 20 6f 70 65 72 61 74 69 6f close() operatio
2560: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 ns */. int *aPe
2570: 6e 64 69 6e 67 3b 20 20 20 20 20 20 20 20 2f 2a nding; /*
2580: 20 4d 61 6c 6c 6f 63 65 64 20 73 70 61 63 65 20 Malloced space
2590: 68 6f 6c 64 69 6e 67 20 66 64 27 73 20 61 77 61 holding fd's awa
25a0: 69 74 69 6e 67 20 61 20 63 6c 6f 73 65 28 29 20 iting a close()
25b0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 */.};../* .** Th
25c0: 65 73 65 20 68 61 73 68 20 74 61 62 6c 65 20 6d ese hash table m
25d0: 61 70 73 20 69 6e 6f 64 65 73 20 61 6e 64 20 70 aps inodes and p
25e0: 72 6f 63 65 73 73 20 49 44 73 20 69 6e 74 6f 20 rocess IDs into
25f0: 6c 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 6f 70 65 lockInfo and ope
2600: 6e 43 6e 74 0a 2a 2a 20 73 74 72 75 63 74 75 72 nCnt.** structur
2610: 65 73 2e 20 20 41 63 63 65 73 73 20 74 6f 20 74 es. Access to t
2620: 68 65 73 65 20 68 61 73 68 20 74 61 62 6c 65 73 hese hash tables
2630: 20 6d 75 73 74 20 62 65 20 70 72 6f 74 65 63 74 must be protect
2640: 65 64 20 62 79 20 61 20 6d 75 74 65 78 2e 0a 2a ed by a mutex..*
2650: 2f 0a 73 74 61 74 69 63 20 48 61 73 68 20 6c 6f /.static Hash lo
2660: 63 6b 48 61 73 68 20 3d 20 7b 20 53 51 4c 49 54 ckHash = { SQLIT
2670: 45 5f 48 41 53 48 5f 42 49 4e 41 52 59 2c 20 30 E_HASH_BINARY, 0
2680: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a , 0, 0, 0, 0 };.
2690: 73 74 61 74 69 63 20 48 61 73 68 20 6f 70 65 6e static Hash open
26a0: 48 61 73 68 20 3d 20 7b 20 53 51 4c 49 54 45 5f Hash = { SQLITE_
26b0: 48 41 53 48 5f 42 49 4e 41 52 59 2c 20 30 2c 20 HASH_BINARY, 0,
26c0: 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 0a 2f 0, 0, 0, 0 };../
26d0: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c *.** Release a l
26e0: 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75 72 ockInfo structur
26f0: 65 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c e previously all
2700: 6f 63 61 74 65 64 20 62 79 20 66 69 6e 64 4c 6f ocated by findLo
2710: 63 6b 49 6e 66 6f 28 29 2e 0a 2a 2f 0a 73 74 61 ckInfo()..*/.sta
2720: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 tic void release
2730: 4c 6f 63 6b 49 6e 66 6f 28 73 74 72 75 63 74 20 LockInfo(struct
2740: 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 29 lockInfo *pLock)
2750: 7b 0a 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 2d {. pLock->nRef-
2760: 2d 3b 0a 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e -;. if( pLock->
2770: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 nRef==0 ){. s
2780: 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 qliteHashInsert(
2790: 26 6c 6f 63 6b 48 61 73 68 2c 20 26 70 4c 6f 63 &lockHash, &pLoc
27a0: 6b 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f 66 28 70 k->key, sizeof(p
27b0: 4c 6f 63 6b 2d 3e 6b 65 79 29 2c 20 30 29 3b 0a Lock->key), 0);.
27c0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 sqliteFree(p
27d0: 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a Lock);. }.}../*
27e0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6f 70 .** Release a op
27f0: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20 enCnt structure
2800: 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 previously alloc
2810: 61 74 65 64 20 62 79 20 66 69 6e 64 4c 6f 63 6b ated by findLock
2820: 49 6e 66 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 Info()..*/.stati
2830: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4f 70 c void releaseOp
2840: 65 6e 43 6e 74 28 73 74 72 75 63 74 20 6f 70 65 enCnt(struct ope
2850: 6e 43 6e 74 20 2a 70 4f 70 65 6e 29 7b 0a 20 20 nCnt *pOpen){.
2860: 70 4f 70 65 6e 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 pOpen->nRef--;.
2870: 20 69 66 28 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 if( pOpen->nRef
2880: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 ==0 ){. sqlit
2890: 65 48 61 73 68 49 6e 73 65 72 74 28 26 6f 70 65 eHashInsert(&ope
28a0: 6e 48 61 73 68 2c 20 26 70 4f 70 65 6e 2d 3e 6b nHash, &pOpen->k
28b0: 65 79 2c 20 73 69 7a 65 6f 66 28 70 4f 70 65 6e ey, sizeof(pOpen
28c0: 2d 3e 6b 65 79 29 2c 20 30 29 3b 0a 20 20 20 20 ->key), 0);.
28d0: 73 71 6c 69 74 65 46 72 65 65 28 70 4f 70 65 6e sqliteFree(pOpen
28e0: 2d 3e 61 50 65 6e 64 69 6e 67 29 3b 0a 20 20 20 ->aPending);.
28f0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4f 70 65 sqliteFree(pOpe
2900: 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a n);. }.}../*.**
2910: 20 47 69 76 65 6e 20 61 20 66 69 6c 65 20 64 65 Given a file de
2920: 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65 scriptor, locate
2930: 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 6f 70 lockInfo and op
2940: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 73 enCnt structures
2950: 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 that.** describ
2960: 65 73 20 74 68 61 74 20 66 69 6c 65 20 64 65 73 es that file des
2970: 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61 74 65 criptor. Create
2980: 20 61 20 6e 65 77 20 6f 6e 65 73 20 69 66 20 6e a new ones if n
2990: 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a ecessary. The.*
29a0: 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 * return values
29b0: 6d 69 67 68 74 20 62 65 20 75 6e 73 65 74 20 69 might be unset i
29c0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 f an error occur
29d0: 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 s..**.** Return
29e0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 the number of er
29f0: 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 66 69 6e rors..*/.int fin
2a00: 64 4c 6f 63 6b 49 6e 66 6f 28 0a 20 20 69 6e 74 dLockInfo(. int
2a10: 20 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 fd,
2a20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 /* The
2a30: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 file descriptor
2a40: 20 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79 used in the key
2a50: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 */. struct loc
2a60: 6b 49 6e 66 6f 20 2a 2a 70 70 4c 6f 63 6b 2c 20 kInfo **ppLock,
2a70: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 /* Return the
2a80: 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 lockInfo struct
2a90: 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 ure here */. st
2aa0: 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 2a 70 ruct openCnt **p
2ab0: 70 4f 70 65 6e 20 20 20 2f 2a 20 52 65 74 75 72 pOpen /* Retur
2ac0: 6e 20 74 68 65 20 6f 70 65 6e 43 6e 74 20 73 74 n the openCnt st
2ad0: 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a ructure here */.
2ae0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 ){. int rc;. s
2af0: 74 72 75 63 74 20 6c 6f 63 6b 4b 65 79 20 6b 65 truct lockKey ke
2b00: 79 31 3b 0a 20 20 73 74 72 75 63 74 20 6f 70 65 y1;. struct ope
2b10: 6e 4b 65 79 20 6b 65 79 32 3b 0a 20 20 73 74 72 nKey key2;. str
2b20: 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66 uct stat statbuf
2b30: 3b 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 ;. struct lockI
2b40: 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 0a 20 20 73 74 nfo *pLock;. st
2b50: 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f ruct openCnt *pO
2b60: 70 65 6e 3b 0a 20 20 72 63 20 3d 20 66 73 74 61 pen;. rc = fsta
2b70: 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b t(fd, &statbuf);
2b80: 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 . if( rc!=0 ) r
2b90: 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 eturn 1;. memse
2ba0: 74 28 26 6b 65 79 31 2c 20 30 2c 20 73 69 7a 65 t(&key1, 0, size
2bb0: 6f 66 28 6b 65 79 31 29 29 3b 0a 20 20 6b 65 79 of(key1));. key
2bc0: 31 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66 2e 1.dev = statbuf.
2bd0: 73 74 5f 64 65 76 3b 0a 20 20 6b 65 79 31 2e 69 st_dev;. key1.i
2be0: 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f no = statbuf.st_
2bf0: 69 6e 6f 3b 0a 20 20 6b 65 79 31 2e 70 69 64 20 ino;. key1.pid
2c00: 3d 20 67 65 74 70 69 64 28 29 3b 0a 20 20 6d 65 = getpid();. me
2c10: 6d 73 65 74 28 26 6b 65 79 32 2c 20 30 2c 20 73 mset(&key2, 0, s
2c20: 69 7a 65 6f 66 28 6b 65 79 32 29 29 3b 0a 20 20 izeof(key2));.
2c30: 6b 65 79 32 2e 64 65 76 20 3d 20 73 74 61 74 62 key2.dev = statb
2c40: 75 66 2e 73 74 5f 64 65 76 3b 0a 20 20 6b 65 79 uf.st_dev;. key
2c50: 32 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e 2.ino = statbuf.
2c60: 73 74 5f 69 6e 6f 3b 0a 20 20 70 4c 6f 63 6b 20 st_ino;. pLock
2c70: 3d 20 28 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e = (struct lockIn
2c80: 66 6f 2a 29 73 71 6c 69 74 65 48 61 73 68 46 69 fo*)sqliteHashFi
2c90: 6e 64 28 26 6c 6f 63 6b 48 61 73 68 2c 20 26 6b nd(&lockHash, &k
2ca0: 65 79 31 2c 20 73 69 7a 65 6f 66 28 6b 65 79 31 ey1, sizeof(key1
2cb0: 29 29 3b 0a 20 20 69 66 28 20 70 4c 6f 63 6b 3d ));. if( pLock=
2cc0: 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 =0 ){. struct
2cd0: 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4f 6c 64 3b lockInfo *pOld;
2ce0: 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 73 71 6c . pLock = sql
2cf0: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 iteMallocRaw( si
2d00: 7a 65 6f 66 28 2a 70 4c 6f 63 6b 29 20 29 3b 0a zeof(*pLock) );.
2d10: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 if( pLock==0
2d20: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 ) return 1;.
2d30: 20 70 4c 6f 63 6b 2d 3e 6b 65 79 20 3d 20 6b 65 pLock->key = ke
2d40: 79 31 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6e y1;. pLock->n
2d50: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 4c 6f Ref = 1;. pLo
2d60: 63 6b 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 ck->cnt = 0;.
2d70: 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 48 61 pOld = sqliteHa
2d80: 73 68 49 6e 73 65 72 74 28 26 6c 6f 63 6b 48 61 shInsert(&lockHa
2d90: 73 68 2c 20 26 70 4c 6f 63 6b 2d 3e 6b 65 79 2c sh, &pLock->key,
2da0: 20 73 69 7a 65 6f 66 28 6b 65 79 31 29 2c 20 70 sizeof(key1), p
2db0: 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 Lock);. if( p
2dc0: 4f 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 Old!=0 ){.
2dd0: 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 4c assert( pOld==pL
2de0: 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 73 71 6c ock );. sql
2df0: 69 74 65 46 72 65 65 28 70 4c 6f 63 6b 29 3b 0a iteFree(pLock);.
2e00: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a return 1;.
2e10: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 }. }else{.
2e20: 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 2b 2b pLock->nRef++
2e30: 3b 0a 20 20 7d 0a 20 20 2a 70 70 4c 6f 63 6b 20 ;. }. *ppLock
2e40: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 70 4f 70 65 6e = pLock;. pOpen
2e50: 20 3d 20 28 73 74 72 75 63 74 20 6f 70 65 6e 43 = (struct openC
2e60: 6e 74 2a 29 73 71 6c 69 74 65 48 61 73 68 46 69 nt*)sqliteHashFi
2e70: 6e 64 28 26 6f 70 65 6e 48 61 73 68 2c 20 26 6b nd(&openHash, &k
2e80: 65 79 32 2c 20 73 69 7a 65 6f 66 28 6b 65 79 32 ey2, sizeof(key2
2e90: 29 29 3b 0a 20 20 69 66 28 20 70 4f 70 65 6e 3d ));. if( pOpen=
2ea0: 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 =0 ){. struct
2eb0: 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 6c 64 3b 0a openCnt *pOld;.
2ec0: 20 20 20 20 70 4f 70 65 6e 20 3d 20 73 71 6c 69 pOpen = sqli
2ed0: 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a teMallocRaw( siz
2ee0: 65 6f 66 28 2a 70 4f 70 65 6e 29 20 29 3b 0a 20 eof(*pOpen) );.
2ef0: 20 20 20 69 66 28 20 70 4f 70 65 6e 3d 3d 30 20 if( pOpen==0
2f00: 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 ){. release
2f10: 4c 6f 63 6b 49 6e 66 6f 28 70 4c 6f 63 6b 29 3b LockInfo(pLock);
2f20: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b . return 1;
2f30: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 70 65 6e . }. pOpen
2f40: 2d 3e 6b 65 79 20 3d 20 6b 65 79 32 3b 0a 20 20 ->key = key2;.
2f50: 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 20 3d 20 pOpen->nRef =
2f60: 31 3b 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 1;. pOpen->nL
2f70: 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 ock = 0;. pOp
2f80: 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30 en->nPending = 0
2f90: 3b 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 ;. pOpen->aPe
2fa0: 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70 nding = 0;. p
2fb0: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 48 61 73 68 Old = sqliteHash
2fc0: 49 6e 73 65 72 74 28 26 6f 70 65 6e 48 61 73 68 Insert(&openHash
2fd0: 2c 20 26 70 4f 70 65 6e 2d 3e 6b 65 79 2c 20 73 , &pOpen->key, s
2fe0: 69 7a 65 6f 66 28 6b 65 79 32 29 2c 20 70 4f 70 izeof(key2), pOp
2ff0: 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c en);. if( pOl
3000: 64 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 d!=0 ){. as
3010: 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 4f 70 65 sert( pOld==pOpe
3020: 6e 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 n );. sqlit
3030: 65 46 72 65 65 28 70 4f 70 65 6e 29 3b 0a 20 20 eFree(pOpen);.
3040: 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 releaseLockI
3050: 6e 66 6f 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 nfo(pLock);.
3060: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 return 1;.
3070: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 }. }else{. p
3080: 4f 70 65 6e 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 Open->nRef++;.
3090: 7d 0a 20 20 2a 70 70 4f 70 65 6e 20 3d 20 70 4f }. *ppOpen = pO
30a0: 70 65 6e 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b pen;. return 0;
30b0: 0a 7d 0a 0a 23 65 6e 64 69 66 20 20 2f 2a 2a 20 .}..#endif /**
30c0: 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c POSIX advisory l
30d0: 6f 63 6b 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 ock work-around
30e0: 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 **/../*.** If we
30f0: 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 74 68 compile with th
3100: 65 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6d 61 e SQLITE_TEST ma
3110: 63 72 6f 20 73 65 74 2c 20 74 68 65 6e 20 74 68 cro set, then th
3120: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 e following bloc
3130: 6b 0a 2a 2a 20 6f 66 20 63 6f 64 65 20 77 69 6c k.** of code wil
3140: 6c 20 67 69 76 65 20 75 73 20 74 68 65 20 61 62 l give us the ab
3150: 69 6c 69 74 79 20 74 6f 20 73 69 6d 75 6c 61 74 ility to simulat
3160: 65 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 e a disk I/O err
3170: 6f 72 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 or. This.** is
3180: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 used for testing
3190: 20 74 68 65 20 49 2f 4f 20 72 65 63 6f 76 65 72 the I/O recover
31a0: 79 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 23 69 66 64 y logic..*/.#ifd
31b0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 ef SQLITE_TEST.i
31c0: 6e 74 20 73 71 6c 69 74 65 5f 69 6f 5f 65 72 72 nt sqlite_io_err
31d0: 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 30 3b 0a or_pending = 0;.
31e0: 23 64 65 66 69 6e 65 20 53 69 6d 75 6c 61 74 65 #define Simulate
31f0: 49 4f 45 72 72 6f 72 28 41 29 20 20 5c 0a 20 20 IOError(A) \.
3200: 20 69 66 28 20 73 71 6c 69 74 65 5f 69 6f 5f 65 if( sqlite_io_e
3210: 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 29 20 5c rror_pending ) \
3220: 0a 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 . if( sqlite
3230: 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e _io_error_pendin
3240: 67 2d 2d 20 3d 3d 20 31 20 29 7b 20 6c 6f 63 61 g-- == 1 ){ loca
3250: 6c 5f 69 6f 65 72 72 28 29 3b 20 72 65 74 75 72 l_ioerr(); retur
3260: 6e 20 41 3b 20 7d 0a 73 74 61 74 69 63 20 76 6f n A; }.static vo
3270: 69 64 20 6c 6f 63 61 6c 5f 69 6f 65 72 72 28 29 id local_ioerr()
3280: 7b 0a 20 20 73 71 6c 69 74 65 5f 69 6f 5f 65 72 {. sqlite_io_er
3290: 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 30 3b ror_pending = 0;
32a0: 20 20 2f 2a 20 52 65 61 6c 6c 79 20 6a 75 73 74 /* Really just
32b0: 20 61 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20 a place to set
32c0: 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 2a 2f 0a a breakpoint */.
32d0: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 }.#else.#define
32e0: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 SimulateIOError(
32f0: 41 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a A).#endif../*.**
3300: 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 6b When testing, k
3310: 65 65 70 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 eep a count of t
3320: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 70 65 he number of ope
3330: 6e 20 66 69 6c 65 73 2e 0a 2a 2f 0a 23 69 66 64 n files..*/.#ifd
3340: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 ef SQLITE_TEST.i
3350: 6e 74 20 73 71 6c 69 74 65 5f 6f 70 65 6e 5f 66 nt sqlite_open_f
3360: 69 6c 65 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 ile_count = 0;.#
3370: 64 65 66 69 6e 65 20 4f 70 65 6e 43 6f 75 6e 74 define OpenCount
3380: 65 72 28 58 29 20 20 73 71 6c 69 74 65 5f 6f 70 er(X) sqlite_op
3390: 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 2b 3d 28 en_file_count+=(
33a0: 58 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 X).#else.#define
33b0: 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 58 29 0a OpenCounter(X).
33c0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 #endif.../*.** D
33d0: 65 6c 65 74 65 20 74 68 65 20 6e 61 6d 65 64 20 elete the named
33e0: 66 69 6c 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 file.*/.int sqli
33f0: 74 65 4f 73 44 65 6c 65 74 65 28 63 6f 6e 73 74 teOsDelete(const
3400: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 char *zFilename
3410: 29 7b 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a 20 ){.#if OS_UNIX.
3420: 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d unlink(zFilenam
3430: 65 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f e);.#endif.#if O
3440: 53 5f 57 49 4e 0a 20 20 44 65 6c 65 74 65 46 69 S_WIN. DeleteFi
3450: 6c 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 le(zFilename);.#
3460: 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 4d 41 43 endif.#if OS_MAC
3470: 0a 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e . unlink(zFilen
3480: 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 ame);.#endif. r
3490: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b eturn SQLITE_OK;
34a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e .}../*.** Return
34b0: 20 54 52 55 45 20 69 66 20 74 68 65 20 6e 61 6d TRUE if the nam
34c0: 65 64 20 66 69 6c 65 20 65 78 69 73 74 73 2e 0a ed file exists..
34d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 46 */.int sqliteOsF
34e0: 69 6c 65 45 78 69 73 74 73 28 63 6f 6e 73 74 20 ileExists(const
34f0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 char *zFilename)
3500: 7b 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a 20 20 {.#if OS_UNIX.
3510: 72 65 74 75 72 6e 20 61 63 63 65 73 73 28 7a 46 return access(zF
3520: 69 6c 65 6e 61 6d 65 2c 20 30 29 3d 3d 30 3b 0a ilename, 0)==0;.
3530: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 49 #endif.#if OS_WI
3540: 4e 0a 20 20 72 65 74 75 72 6e 20 47 65 74 46 69 N. return GetFi
3550: 6c 65 41 74 74 72 69 62 75 74 65 73 28 7a 46 69 leAttributes(zFi
3560: 6c 65 6e 61 6d 65 29 20 21 3d 20 30 78 66 66 66 lename) != 0xfff
3570: 66 66 66 66 66 3b 0a 23 65 6e 64 69 66 0a 23 69 fffff;.#endif.#i
3580: 66 20 4f 53 5f 4d 41 43 0a 20 20 72 65 74 75 72 f OS_MAC. retur
3590: 6e 20 61 63 63 65 73 73 28 7a 46 69 6c 65 6e 61 n access(zFilena
35a0: 6d 65 2c 20 30 29 3d 3d 30 3b 0a 23 65 6e 64 69 me, 0)==0;.#endi
35b0: 66 0a 7d 0a 0a 0a 23 69 66 20 30 20 2f 2a 20 4e f.}...#if 0 /* N
35c0: 4f 54 20 55 53 45 44 20 2a 2f 0a 2f 2a 0a 2a 2a OT USED */./*.**
35d0: 20 43 68 61 6e 67 65 20 74 68 65 20 6e 61 6d 65 Change the name
35e0: 20 6f 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 of an existing
35f0: 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c file..*/.int sql
3600: 69 74 65 4f 73 46 69 6c 65 52 65 6e 61 6d 65 28 iteOsFileRename(
3610: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 6c 64 const char *zOld
3620: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 Name, const char
3630: 20 2a 7a 4e 65 77 4e 61 6d 65 29 7b 0a 23 69 66 *zNewName){.#if
3640: 20 4f 53 5f 55 4e 49 58 0a 20 20 69 66 28 20 6c OS_UNIX. if( l
3650: 69 6e 6b 28 7a 4f 6c 64 4e 61 6d 65 2c 20 7a 4e ink(zOldName, zN
3660: 65 77 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 72 ewName) ){. r
3670: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 eturn SQLITE_ERR
3680: 4f 52 3b 0a 20 20 7d 0a 20 20 75 6e 6c 69 6e 6b OR;. }. unlink
3690: 28 7a 4f 6c 64 4e 61 6d 65 29 3b 0a 20 20 72 65 (zOldName);. re
36a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a turn SQLITE_OK;.
36b0: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 49 #endif.#if OS_WI
36c0: 4e 0a 20 20 69 66 28 20 21 4d 6f 76 65 46 69 6c N. if( !MoveFil
36d0: 65 28 7a 4f 6c 64 4e 61 6d 65 2c 20 7a 4e 65 77 e(zOldName, zNew
36e0: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 72 65 74 Name) ){. ret
36f0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 urn SQLITE_ERROR
3700: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 ;. }. return S
3710: 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 QLITE_OK;.#endif
3720: 0a 23 69 66 20 4f 53 5f 4d 41 43 0a 20 20 2f 2a .#if OS_MAC. /*
3730: 2a 2a 2a 20 46 49 58 20 4d 45 20 2a 2a 2a 2f 0a *** FIX ME ***/.
3740: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
3750: 45 52 52 4f 52 3b 0a 23 65 6e 64 69 66 0a 7d 0a ERROR;.#endif.}.
3760: 23 65 6e 64 69 66 20 2f 2a 20 4e 4f 54 20 55 53 #endif /* NOT US
3770: 45 44 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 ED */../*.** Att
3780: 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 66 empt to open a f
3790: 69 6c 65 20 66 6f 72 20 62 6f 74 68 20 72 65 61 ile for both rea
37a0: 64 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67 ding and writing
37b0: 2e 20 20 49 66 20 74 68 61 74 0a 2a 2a 20 66 61 . If that.** fa
37c0: 69 6c 73 2c 20 74 72 79 20 6f 70 65 6e 69 6e 67 ils, try opening
37d0: 20 69 74 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 it read-only.
37e0: 49 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 If the file does
37f0: 20 6e 6f 74 20 65 78 69 73 74 2c 0a 2a 2a 20 74 not exist,.** t
3800: 72 79 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e ry to create it.
3810: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 .**.** On succes
3820: 73 2c 20 61 20 68 61 6e 64 6c 65 20 66 6f 72 20 s, a handle for
3830: 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 69 73 the open file is
3840: 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 69 64 0a written to *id.
3850: 2a 2a 20 61 6e 64 20 2a 70 52 65 61 64 6f 6e 6c ** and *pReadonl
3860: 79 20 69 73 20 73 65 74 20 74 6f 20 30 20 69 66 y is set to 0 if
3870: 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 6f 70 the file was op
3880: 65 6e 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 ened for reading
3890: 20 61 6e 64 0a 2a 2a 20 77 72 69 74 69 6e 67 20 and.** writing
38a0: 6f 72 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 or 1 if the file
38b0: 20 77 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64 was opened read
38c0: 2d 6f 6e 6c 79 2e 20 20 54 68 65 20 66 75 6e 63 -only. The func
38d0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 tion returns.**
38e0: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a SQLITE_OK..**.**
38f0: 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74 68 65 On failure, the
3900: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e function return
3910: 73 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 s SQLITE_CANTOPE
3920: 4e 20 61 6e 64 20 6c 65 61 76 65 73 0a 2a 2a 20 N and leaves.**
3930: 2a 69 64 20 61 6e 64 20 2a 70 52 65 61 64 6f 6e *id and *pReadon
3940: 6c 79 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f ly unchanged..*/
3950: 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 4f 70 65 .int sqliteOsOpe
3960: 6e 52 65 61 64 57 72 69 74 65 28 0a 20 20 63 6f nReadWrite(. co
3970: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e nst char *zFilen
3980: 61 6d 65 2c 0a 20 20 4f 73 46 69 6c 65 20 2a 69 ame,. OsFile *i
3990: 64 2c 0a 20 20 69 6e 74 20 2a 70 52 65 61 64 6f d,. int *pReado
39a0: 6e 6c 79 0a 29 7b 0a 23 69 66 20 4f 53 5f 55 4e nly.){.#if OS_UN
39b0: 49 58 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 IX. int rc;. i
39c0: 64 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 d->dirfd = -1;.
39d0: 20 69 64 2d 3e 66 64 20 3d 20 6f 70 65 6e 28 7a id->fd = open(z
39e0: 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44 57 52 Filename, O_RDWR
39f0: 7c 4f 5f 43 52 45 41 54 7c 4f 5f 4c 41 52 47 45 |O_CREAT|O_LARGE
3a00: 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 FILE|O_BINARY, 0
3a10: 36 34 34 29 3b 0a 20 20 69 66 28 20 69 64 2d 3e 644);. if( id->
3a20: 66 64 3c 30 20 29 7b 0a 23 69 66 64 65 66 20 45 fd<0 ){.#ifdef E
3a30: 49 53 44 49 52 0a 20 20 20 20 69 66 28 20 65 72 ISDIR. if( er
3a40: 72 6e 6f 3d 3d 45 49 53 44 49 52 20 29 7b 0a 20 rno==EISDIR ){.
3a50: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 return SQLI
3a60: 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 TE_CANTOPEN;.
3a70: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 64 }.#endif. id
3a80: 2d 3e 66 64 20 3d 20 6f 70 65 6e 28 7a 46 69 6c ->fd = open(zFil
3a90: 65 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c ename, O_RDONLY|
3aa0: 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 O_LARGEFILE|O_BI
3ab0: 4e 41 52 59 29 3b 0a 20 20 20 20 69 66 28 20 69 NARY);. if( i
3ac0: 64 2d 3e 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 d->fd<0 ){.
3ad0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 return SQLITE_C
3ae0: 41 4e 54 4f 50 45 4e 3b 20 0a 20 20 20 20 7d 0a ANTOPEN; . }.
3af0: 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c 79 20 3d *pReadonly =
3b00: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 1;. }else{.
3b10: 20 2a 70 52 65 61 64 6f 6e 6c 79 20 3d 20 30 3b *pReadonly = 0;
3b20: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 4f 73 45 . }. sqliteOsE
3b30: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 72 nterMutex();. r
3b40: 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f c = findLockInfo
3b50: 28 69 64 2d 3e 66 64 2c 20 26 69 64 2d 3e 70 4c (id->fd, &id->pL
3b60: 6f 63 6b 2c 20 26 69 64 2d 3e 70 4f 70 65 6e 29 ock, &id->pOpen)
3b70: 3b 0a 20 20 73 71 6c 69 74 65 4f 73 4c 65 61 76 ;. sqliteOsLeav
3b80: 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 eMutex();. if(
3b90: 72 63 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 28 rc ){. close(
3ba0: 69 64 2d 3e 66 64 29 3b 0a 20 20 20 20 72 65 74 id->fd);. ret
3bb0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d urn SQLITE_NOMEM
3bc0: 3b 0a 20 20 7d 0a 20 20 69 64 2d 3e 6c 6f 63 6b ;. }. id->lock
3bd0: 65 64 20 3d 20 30 3b 0a 20 20 54 52 41 43 45 33 ed = 0;. TRACE3
3be0: 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25 ("OPEN %-3d %
3bf0: 73 5c 6e 22 2c 20 69 64 2d 3e 66 64 2c 20 7a 46 s\n", id->fd, zF
3c00: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 4f 70 65 6e ilename);. Open
3c10: 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 72 Counter(+1);. r
3c20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b eturn SQLITE_OK;
3c30: 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 .#endif.#if OS_W
3c40: 49 4e 0a 20 20 48 41 4e 44 4c 45 20 68 20 3d 20 IN. HANDLE h =
3c50: 43 72 65 61 74 65 46 69 6c 65 28 7a 46 69 6c 65 CreateFile(zFile
3c60: 6e 61 6d 65 2c 0a 20 20 20 20 20 47 45 4e 45 52 name,. GENER
3c70: 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49 IC_READ | GENERI
3c80: 43 5f 57 52 49 54 45 2c 0a 20 20 20 20 20 46 49 C_WRITE,. FI
3c90: 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20 7c 20 LE_SHARE_READ |
3ca0: 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54 45 FILE_SHARE_WRITE
3cb0: 2c 0a 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 ,. NULL,.
3cc0: 20 20 4f 50 45 4e 5f 41 4c 57 41 59 53 2c 0a 20 OPEN_ALWAYS,.
3cd0: 20 20 20 20 46 49 4c 45 5f 41 54 54 52 49 42 55 FILE_ATTRIBU
3ce0: 54 45 5f 4e 4f 52 4d 41 4c 20 7c 20 46 49 4c 45 TE_NORMAL | FILE
3cf0: 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 _FLAG_RANDOM_ACC
3d00: 45 53 53 2c 0a 20 20 20 20 20 4e 55 4c 4c 0a 20 ESS,. NULL.
3d10: 20 29 3b 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 );. if( h==INV
3d20: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 ALID_HANDLE_VALU
3d30: 45 20 29 7b 0a 20 20 20 20 68 20 3d 20 43 72 65 E ){. h = Cre
3d40: 61 74 65 46 69 6c 65 28 7a 46 69 6c 65 6e 61 6d ateFile(zFilenam
3d50: 65 2c 0a 20 20 20 20 20 20 20 47 45 4e 45 52 49 e,. GENERI
3d60: 43 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 46 C_READ,. F
3d70: 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 2c 0a ILE_SHARE_READ,.
3d80: 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 NULL,.
3d90: 20 20 20 20 4f 50 45 4e 5f 41 4c 57 41 59 53 2c OPEN_ALWAYS,
3da0: 0a 20 20 20 20 20 20 20 46 49 4c 45 5f 41 54 54 . FILE_ATT
3db0: 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 20 7c 20 RIBUTE_NORMAL |
3dc0: 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d FILE_FLAG_RANDOM
3dd0: 5f 41 43 43 45 53 53 2c 0a 20 20 20 20 20 20 20 _ACCESS,.
3de0: 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a 20 20 20 20 NULL. );.
3df0: 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 if( h==INVALID_H
3e00: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 ANDLE_VALUE ){.
3e10: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 return SQLI
3e20: 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 TE_CANTOPEN;.
3e30: 20 7d 0a 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c }. *pReadonl
3e40: 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a y = 1;. }else{.
3e50: 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c 79 20 3d *pReadonly =
3e60: 20 30 3b 0a 20 20 7d 0a 20 20 69 64 2d 3e 68 20 0;. }. id->h
3e70: 3d 20 68 3b 0a 20 20 69 64 2d 3e 6c 6f 63 6b 65 = h;. id->locke
3e80: 64 20 3d 20 30 3b 0a 20 20 4f 70 65 6e 43 6f 75 d = 0;. OpenCou
3e90: 6e 74 65 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 nter(+1);. retu
3ea0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 rn SQLITE_OK;.#e
3eb0: 6e 64 69 66 0a 23 69 66 20 4f 53 5f 4d 41 43 0a ndif.#if OS_MAC.
3ec0: 20 20 46 53 53 70 65 63 20 66 73 53 70 65 63 3b FSSpec fsSpec;
3ed0: 0a 23 20 69 66 64 65 66 20 5f 4c 41 52 47 45 5f .# ifdef _LARGE_
3ee0: 46 49 4c 45 0a 20 20 48 46 53 55 6e 69 53 74 72 FILE. HFSUniStr
3ef0: 32 35 35 20 64 66 4e 61 6d 65 3b 0a 20 20 46 53 255 dfName;. FS
3f00: 52 65 66 20 66 73 52 65 66 3b 0a 20 20 69 66 28 Ref fsRef;. if(
3f10: 20 5f 5f 70 61 74 68 32 66 73 73 28 7a 46 69 6c __path2fss(zFil
3f20: 65 6e 61 6d 65 2c 20 26 66 73 53 70 65 63 29 20 ename, &fsSpec)
3f30: 21 3d 20 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 != noErr ){.
3f40: 69 66 28 20 48 43 72 65 61 74 65 28 66 73 53 70 if( HCreate(fsSp
3f50: 65 63 2e 76 52 65 66 4e 75 6d 2c 20 66 73 53 70 ec.vRefNum, fsSp
3f60: 65 63 2e 70 61 72 49 44 2c 20 66 73 53 70 65 63 ec.parID, fsSpec
3f70: 2e 6e 61 6d 65 2c 20 27 53 51 4c 49 27 2c 20 63 .name, 'SQLI', c
3f80: 44 6f 63 75 6d 65 6e 74 46 69 6c 65 29 20 21 3d DocumentFile) !=
3f90: 20 6e 6f 45 72 72 20 29 0a 20 20 20 20 20 20 72 noErr ). r
3fa0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e eturn SQLITE_CAN
3fb0: 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 69 66 28 TOPEN;. }. if(
3fc0: 20 46 53 70 4d 61 6b 65 46 53 52 65 66 28 26 66 FSpMakeFSRef(&f
3fd0: 73 53 70 65 63 2c 20 26 66 73 52 65 66 29 20 21 sSpec, &fsRef) !
3fe0: 3d 20 6e 6f 45 72 72 20 29 0a 20 20 20 20 72 65 = noErr ). re
3ff0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 turn SQLITE_CANT
4000: 4f 50 45 4e 3b 0a 20 20 46 53 47 65 74 44 61 74 OPEN;. FSGetDat
4010: 61 46 6f 72 6b 4e 61 6d 65 28 26 64 66 4e 61 6d aForkName(&dfNam
4020: 65 29 3b 0a 20 20 69 66 28 20 46 53 4f 70 65 6e e);. if( FSOpen
4030: 46 6f 72 6b 28 26 66 73 52 65 66 2c 20 64 66 4e Fork(&fsRef, dfN
4040: 61 6d 65 2e 6c 65 6e 67 74 68 2c 20 64 66 4e 61 ame.length, dfNa
4050: 6d 65 2e 75 6e 69 63 6f 64 65 2c 0a 20 20 20 20 me.unicode,.
4060: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 73 52 fsR
4070: 64 57 72 53 68 50 65 72 6d 2c 20 26 28 69 64 2d dWrShPerm, &(id-
4080: 3e 72 65 66 4e 75 6d 29 29 20 21 3d 20 6e 6f 45 >refNum)) != noE
4090: 72 72 20 29 7b 0a 20 20 20 20 69 66 28 20 46 53 rr ){. if( FS
40a0: 4f 70 65 6e 46 6f 72 6b 28 26 66 73 52 65 66 2c OpenFork(&fsRef,
40b0: 20 64 66 4e 61 6d 65 2e 6c 65 6e 67 74 68 2c 20 dfName.length,
40c0: 64 66 4e 61 6d 65 2e 75 6e 69 63 6f 64 65 2c 0a dfName.unicode,.
40d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
40e0: 20 20 20 66 73 52 64 57 72 50 65 72 6d 2c 20 26 fsRdWrPerm, &
40f0: 28 69 64 2d 3e 72 65 66 4e 75 6d 29 29 20 21 3d (id->refNum)) !=
4100: 20 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20 noErr ){.
4110: 69 66 20 28 46 53 4f 70 65 6e 46 6f 72 6b 28 26 if (FSOpenFork(&
4120: 66 73 52 65 66 2c 20 64 66 4e 61 6d 65 2e 6c 65 fsRef, dfName.le
4130: 6e 67 74 68 2c 20 64 66 4e 61 6d 65 2e 75 6e 69 ngth, dfName.uni
4140: 63 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 code,.
4150: 20 20 20 20 20 20 20 20 20 66 73 52 64 50 65 72 fsRdPer
4160: 6d 2c 20 26 28 69 64 2d 3e 72 65 66 4e 75 6d 29 m, &(id->refNum)
4170: 29 20 21 3d 20 6e 6f 45 72 72 20 29 0a 20 20 20 ) != noErr ).
4180: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 return SQLI
4190: 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 TE_CANTOPEN;.
41a0: 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 20 20 else.
41b0: 2a 70 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a *pReadonly = 1;.
41c0: 20 20 20 20 7d 20 65 6c 73 65 0a 20 20 20 20 20 } else.
41d0: 20 2a 70 52 65 61 64 6f 6e 6c 79 20 3d 20 30 3b *pReadonly = 0;
41e0: 0a 20 20 7d 20 65 6c 73 65 0a 20 20 20 20 2a 70 . } else. *p
41f0: 52 65 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a 23 20 Readonly = 0;.#
4200: 65 6c 73 65 0a 20 20 5f 5f 70 61 74 68 32 66 73 else. __path2fs
4210: 73 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66 73 s(zFilename, &fs
4220: 53 70 65 63 29 3b 0a 20 20 69 66 28 20 21 73 71 Spec);. if( !sq
4230: 6c 69 74 65 4f 73 46 69 6c 65 45 78 69 73 74 73 liteOsFileExists
4240: 28 7a 46 69 6c 65 6e 61 6d 65 29 20 29 7b 0a 20 (zFilename) ){.
4250: 20 20 20 69 66 28 20 48 43 72 65 61 74 65 28 66 if( HCreate(f
4260: 73 53 70 65 63 2e 76 52 65 66 4e 75 6d 2c 20 66 sSpec.vRefNum, f
4270: 73 53 70 65 63 2e 70 61 72 49 44 2c 20 66 73 53 sSpec.parID, fsS
4280: 70 65 63 2e 6e 61 6d 65 2c 20 27 53 51 4c 49 27 pec.name, 'SQLI'
4290: 2c 20 63 44 6f 63 75 6d 65 6e 74 46 69 6c 65 29 , cDocumentFile)
42a0: 20 21 3d 20 6e 6f 45 72 72 20 29 0a 20 20 20 20 != noErr ).
42b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
42c0: 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 CANTOPEN;. }.
42d0: 69 66 28 20 48 4f 70 65 6e 44 46 28 66 73 53 70 if( HOpenDF(fsSp
42e0: 65 63 2e 76 52 65 66 4e 75 6d 2c 20 66 73 53 70 ec.vRefNum, fsSp
42f0: 65 63 2e 70 61 72 49 44 2c 20 66 73 53 70 65 63 ec.parID, fsSpec
4300: 2e 6e 61 6d 65 2c 20 66 73 52 64 57 72 53 68 50 .name, fsRdWrShP
4310: 65 72 6d 2c 20 26 28 69 64 2d 3e 72 65 66 4e 75 erm, &(id->refNu
4320: 6d 29 29 20 21 3d 20 6e 6f 45 72 72 20 29 7b 0a m)) != noErr ){.
4330: 20 20 20 20 69 66 28 20 48 4f 70 65 6e 44 46 28 if( HOpenDF(
4340: 66 73 53 70 65 63 2e 76 52 65 66 4e 75 6d 2c 20 fsSpec.vRefNum,
4350: 66 73 53 70 65 63 2e 70 61 72 49 44 2c 20 66 73 fsSpec.parID, fs
4360: 53 70 65 63 2e 6e 61 6d 65 2c 20 66 73 52 64 57 Spec.name, fsRdW
4370: 72 50 65 72 6d 2c 20 26 28 69 64 2d 3e 72 65 66 rPerm, &(id->ref
4380: 4e 75 6d 29 29 20 21 3d 20 6e 6f 45 72 72 20 29 Num)) != noErr )
4390: 7b 0a 20 20 20 20 20 20 69 66 28 20 48 4f 70 65 {. if( HOpe
43a0: 6e 44 46 28 66 73 53 70 65 63 2e 76 52 65 66 4e nDF(fsSpec.vRefN
43b0: 75 6d 2c 20 66 73 53 70 65 63 2e 70 61 72 49 44 um, fsSpec.parID
43c0: 2c 20 66 73 53 70 65 63 2e 6e 61 6d 65 2c 20 66 , fsSpec.name, f
43d0: 73 52 64 50 65 72 6d 2c 20 26 28 69 64 2d 3e 72 sRdPerm, &(id->r
43e0: 65 66 4e 75 6d 29 29 20 21 3d 20 6e 6f 45 72 72 efNum)) != noErr
43f0: 20 29 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 ). retur
4400: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 n SQLITE_CANTOPE
4410: 4e 3b 0a 20 20 20 20 20 20 65 6c 73 65 0a 20 20 N;. else.
4420: 20 20 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c 79 *pReadonly
4430: 20 3d 20 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65 = 1;. } else
4440: 0a 20 20 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c . *pReadonl
4450: 79 20 3d 20 30 3b 0a 20 20 7d 20 65 6c 73 65 0a y = 0;. } else.
4460: 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c 79 20 3d *pReadonly =
4470: 20 30 3b 0a 23 20 65 6e 64 69 66 0a 20 20 69 66 0;.# endif. if
4480: 28 20 48 4f 70 65 6e 52 46 28 66 73 53 70 65 63 ( HOpenRF(fsSpec
4490: 2e 76 52 65 66 4e 75 6d 2c 20 66 73 53 70 65 63 .vRefNum, fsSpec
44a0: 2e 70 61 72 49 44 2c 20 66 73 53 70 65 63 2e 6e .parID, fsSpec.n
44b0: 61 6d 65 2c 20 66 73 52 64 57 72 53 68 50 65 72 ame, fsRdWrShPer
44c0: 6d 2c 20 26 28 69 64 2d 3e 72 65 66 4e 75 6d 52 m, &(id->refNumR
44d0: 46 29 29 20 21 3d 20 6e 6f 45 72 72 29 7b 0a 20 F)) != noErr){.
44e0: 20 20 20 69 64 2d 3e 72 65 66 4e 75 6d 52 46 20 id->refNumRF
44f0: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 64 2d 3e = -1;. }. id->
4500: 6c 6f 63 6b 65 64 20 3d 20 30 3b 0a 20 20 69 64 locked = 0;. id
4510: 2d 3e 64 65 6c 4f 6e 43 6c 6f 73 65 20 3d 20 30 ->delOnClose = 0
4520: 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 ;. OpenCounter(
4530: 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 +1);. return SQ
4540: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a LITE_OK;.#endif.
4550: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 }.../*.** Attemp
4560: 74 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 t to open a new
4570: 66 69 6c 65 20 66 6f 72 20 65 78 63 6c 75 73 69 file for exclusi
4580: 76 65 20 61 63 63 65 73 73 20 62 79 20 74 68 69 ve access by thi
4590: 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 20 54 68 s process..** Th
45a0: 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f e file will be o
45b0: 70 65 6e 65 64 20 66 6f 72 20 62 6f 74 68 20 72 pened for both r
45c0: 65 61 64 69 6e 67 20 61 6e 64 20 77 72 69 74 69 eading and writi
45d0: 6e 67 2e 20 20 54 6f 20 61 76 6f 69 64 0a 2a 2a ng. To avoid.**
45e0: 20 61 20 70 6f 74 65 6e 74 69 61 6c 20 73 65 63 a potential sec
45f0: 75 72 69 74 79 20 70 72 6f 62 6c 65 6d 2c 20 77 urity problem, w
4600: 65 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 e do not allow t
4610: 68 65 20 66 69 6c 65 20 74 6f 20 68 61 76 65 0a he file to have.
4620: 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 65 78 ** previously ex
4630: 69 73 74 65 64 2e 20 20 4e 6f 72 20 64 6f 20 77 isted. Nor do w
4640: 65 20 61 6c 6c 6f 77 20 74 68 65 20 66 69 6c 65 e allow the file
4650: 20 74 6f 20 62 65 20 61 20 73 79 6d 62 6f 6c 69 to be a symboli
4660: 63 0a 2a 2a 20 6c 69 6e 6b 2e 0a 2a 2a 0a 2a 2a c.** link..**.**
4670: 20 49 66 20 64 65 6c 46 6c 61 67 20 69 73 20 74 If delFlag is t
4680: 72 75 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 rue, then make a
4690: 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 61 rrangements to a
46a0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c utomatically del
46b0: 65 74 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 ete.** the file
46c0: 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 when it is close
46d0: 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 d..**.** On succ
46e0: 65 73 73 2c 20 77 72 69 74 65 20 74 68 65 20 66 ess, write the f
46f0: 69 6c 65 20 68 61 6e 64 6c 65 20 69 6e 74 6f 20 ile handle into
4700: 2a 69 64 20 61 6e 64 20 72 65 74 75 72 6e 20 53 *id and return S
4710: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 QLITE_OK..**.**
4720: 4f 6e 20 66 61 69 6c 75 72 65 2c 20 72 65 74 75 On failure, retu
4730: 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 rn SQLITE_CANTOP
4740: 45 4e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 EN..*/.int sqlit
4750: 65 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 eOsOpenExclusive
4760: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 (const char *zFi
4770: 6c 65 6e 61 6d 65 2c 20 4f 73 46 69 6c 65 20 2a lename, OsFile *
4780: 69 64 2c 20 69 6e 74 20 64 65 6c 46 6c 61 67 29 id, int delFlag)
4790: 7b 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a 20 20 {.#if OS_UNIX.
47a0: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61 63 int rc;. if( ac
47b0: 63 65 73 73 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 cess(zFilename,
47c0: 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 0)==0 ){. ret
47d0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f urn SQLITE_CANTO
47e0: 50 45 4e 3b 0a 20 20 7d 0a 20 20 69 64 2d 3e 64 PEN;. }. id->d
47f0: 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 69 64 2d irfd = -1;. id-
4800: 3e 66 64 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 >fd = open(zFile
4810: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 name,.
4820: 20 20 20 20 20 20 4f 5f 52 44 57 52 7c 4f 5f 43 O_RDWR|O_C
4830: 52 45 41 54 7c 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f REAT|O_EXCL|O_NO
4840: 46 4f 4c 4c 4f 57 7c 4f 5f 4c 41 52 47 45 46 49 FOLLOW|O_LARGEFI
4850: 4c 45 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 36 30 LE|O_BINARY, 060
4860: 30 29 3b 0a 20 20 69 66 28 20 69 64 2d 3e 66 64 0);. if( id->fd
4870: 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e <0 ){. return
4880: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e SQLITE_CANTOPEN
4890: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 4f 73 ;. }. sqliteOs
48a0: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 EnterMutex();.
48b0: 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 rc = findLockInf
48c0: 6f 28 69 64 2d 3e 66 64 2c 20 26 69 64 2d 3e 70 o(id->fd, &id->p
48d0: 4c 6f 63 6b 2c 20 26 69 64 2d 3e 70 4f 70 65 6e Lock, &id->pOpen
48e0: 29 3b 0a 20 20 73 71 6c 69 74 65 4f 73 4c 65 61 );. sqliteOsLea
48f0: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 veMutex();. if(
4900: 20 72 63 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 rc ){. close
4910: 28 69 64 2d 3e 66 64 29 3b 0a 20 20 20 20 75 6e (id->fd);. un
4920: 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b link(zFilename);
4930: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 . return SQLI
4940: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 TE_NOMEM;. }.
4950: 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20 30 3b 0a id->locked = 0;.
4960: 20 20 69 66 28 20 64 65 6c 46 6c 61 67 20 29 7b if( delFlag ){
4970: 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c . unlink(zFil
4980: 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 54 52 ename);. }. TR
4990: 41 43 45 33 28 22 4f 50 45 4e 2d 45 58 20 25 2d ACE3("OPEN-EX %-
49a0: 33 64 20 25 73 5c 6e 22 2c 20 69 64 2d 3e 66 64 3d %s\n", id->fd
49b0: 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 , zFilename);.
49c0: 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b OpenCounter(+1);
49d0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 . return SQLITE
49e0: 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 _OK;.#endif.#if
49f0: 4f 53 5f 57 49 4e 0a 20 20 48 41 4e 44 4c 45 20 OS_WIN. HANDLE
4a00: 68 3b 0a 20 20 69 6e 74 20 66 69 6c 65 66 6c 61 h;. int filefla
4a10: 67 73 3b 0a 20 20 69 66 28 20 64 65 6c 46 6c 61 gs;. if( delFla
4a20: 67 20 29 7b 0a 20 20 20 20 66 69 6c 65 66 6c 61 g ){. filefla
4a30: 67 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 gs = FILE_ATTRIB
4a40: 55 54 45 5f 54 45 4d 50 4f 52 41 52 59 20 7c 20 UTE_TEMPORARY |
4a50: 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d FILE_FLAG_RANDOM
4a60: 5f 41 43 43 45 53 53 20 0a 20 20 20 20 20 20 20 _ACCESS .
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 |
4a80: 46 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45 FILE_FLAG_DELETE
4a90: 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 20 20 7d 65 6c _ON_CLOSE;. }el
4aa0: 73 65 7b 0a 20 20 20 20 66 69 6c 65 66 6c 61 67 se{. fileflag
4ab0: 73 20 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 s = FILE_FLAG_RA
4ac0: 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 20 20 7d NDOM_ACCESS;. }
4ad0: 0a 20 20 68 20 3d 20 43 72 65 61 74 65 46 69 6c . h = CreateFil
4ae0: 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 e(zFilename,.
4af0: 20 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20 7c GENERIC_READ |
4b00: 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 2c 0a GENERIC_WRITE,.
4b10: 20 20 20 20 20 30 2c 0a 20 20 20 20 20 4e 55 4c 0,. NUL
4b20: 4c 2c 0a 20 20 20 20 20 43 52 45 41 54 45 5f 41 L,. CREATE_A
4b30: 4c 57 41 59 53 2c 0a 20 20 20 20 20 66 69 6c 65 LWAYS,. file
4b40: 66 6c 61 67 73 2c 0a 20 20 20 20 20 4e 55 4c 4c flags,. NULL
4b50: 0a 20 20 29 3b 0a 20 20 69 66 28 20 68 3d 3d 49 . );. if( h==I
4b60: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 NVALID_HANDLE_VA
4b70: 4c 55 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 LUE ){. retur
4b80: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 n SQLITE_CANTOPE
4b90: 4e 3b 0a 20 20 7d 0a 20 20 69 64 2d 3e 68 20 3d N;. }. id->h =
4ba0: 20 68 3b 0a 20 20 69 64 2d 3e 6c 6f 63 6b 65 64 h;. id->locked
4bb0: 20 3d 20 30 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e = 0;. OpenCoun
4bc0: 74 65 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 ter(+1);. retur
4bd0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e n SQLITE_OK;.#en
4be0: 64 69 66 0a 23 69 66 20 4f 53 5f 4d 41 43 0a 20 dif.#if OS_MAC.
4bf0: 20 46 53 53 70 65 63 20 66 73 53 70 65 63 3b 0a FSSpec fsSpec;.
4c00: 23 20 69 66 64 65 66 20 5f 4c 41 52 47 45 5f 46 # ifdef _LARGE_F
4c10: 49 4c 45 0a 20 20 48 46 53 55 6e 69 53 74 72 32 ILE. HFSUniStr2
4c20: 35 35 20 64 66 4e 61 6d 65 3b 0a 20 20 46 53 52 55 dfName;. FSR
4c30: 65 66 20 66 73 52 65 66 3b 0a 20 20 5f 5f 70 61 ef fsRef;. __pa
4c40: 74 68 32 66 73 73 28 7a 46 69 6c 65 6e 61 6d 65 th2fss(zFilename
4c50: 2c 20 26 66 73 53 70 65 63 29 3b 0a 20 20 69 66 , &fsSpec);. if
4c60: 28 20 48 43 72 65 61 74 65 28 66 73 53 70 65 63 ( HCreate(fsSpec
4c70: 2e 76 52 65 66 4e 75 6d 2c 20 66 73 53 70 65 63 .vRefNum, fsSpec
4c80: 2e 70 61 72 49 44 2c 20 66 73 53 70 65 63 2e 6e .parID, fsSpec.n
4c90: 61 6d 65 2c 20 27 53 51 4c 49 27 2c 20 63 44 6f ame, 'SQLI', cDo
4ca0: 63 75 6d 65 6e 74 46 69 6c 65 29 20 21 3d 20 6e cumentFile) != n
4cb0: 6f 45 72 72 20 29 0a 20 20 20 20 72 65 74 75 72 oErr ). retur
4cc0: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 n SQLITE_CANTOPE
4cd0: 4e 3b 0a 20 20 69 66 28 20 46 53 70 4d 61 6b 65 N;. if( FSpMake
4ce0: 46 53 52 65 66 28 26 66 73 53 70 65 63 2c 20 26 FSRef(&fsSpec, &
4cf0: 66 73 52 65 66 29 20 21 3d 20 6e 6f 45 72 72 20 fsRef) != noErr
4d00: 29 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c ). return SQL
4d10: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 ITE_CANTOPEN;.
4d20: 46 53 47 65 74 44 61 74 61 46 6f 72 6b 4e 61 6d FSGetDataForkNam
4d30: 65 28 26 64 66 4e 61 6d 65 29 3b 0a 20 20 69 66 e(&dfName);. if
4d40: 28 20 46 53 4f 70 65 6e 46 6f 72 6b 28 26 66 73 ( FSOpenFork(&fs
4d50: 52 65 66 2c 20 64 66 4e 61 6d 65 2e 6c 65 6e 67 Ref, dfName.leng
4d60: 74 68 2c 20 64 66 4e 61 6d 65 2e 75 6e 69 63 6f th, dfName.unico
4d70: 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 de,.
4d80: 20 20 20 20 20 66 73 52 64 57 72 50 65 72 6d 2c fsRdWrPerm,
4d90: 20 26 28 69 64 2d 3e 72 65 66 4e 75 6d 29 29 20 &(id->refNum))
4da0: 21 3d 20 6e 6f 45 72 72 20 29 0a 20 20 20 20 72 != noErr ). r
4db0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e eturn SQLITE_CAN
4dc0: 54 4f 50 45 4e 3b 0a 23 20 65 6c 73 65 0a 20 20 TOPEN;.# else.
4dd0: 5f 5f 70 61 74 68 32 66 73 73 28 7a 46 69 6c 65 __path2fss(zFile
4de0: 6e 61 6d 65 2c 20 26 66 73 53 70 65 63 29 3b 0a name, &fsSpec);.
4df0: 20 20 69 66 28 20 48 43 72 65 61 74 65 28 66 73 if( HCreate(fs
4e00: 53 70 65 63 2e 76 52 65 66 4e 75 6d 2c 20 66 73 Spec.vRefNum, fs
4e10: 53 70 65 63 2e 70 61 72 49 44 2c 20 66 73 53 70 Spec.parID, fsSp
4e20: 65 63 2e 6e 61 6d 65 2c 20 27 53 51 4c 49 27 2c ec.name, 'SQLI',
4e30: 20 63 44 6f 63 75 6d 65 6e 74 46 69 6c 65 29 20 cDocumentFile)
4e40: 21 3d 20 6e 6f 45 72 72 20 29 0a 20 20 20 20 72 != noErr ). r
4e50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e eturn SQLITE_CAN
4e60: 54 4f 50 45 4e 3b 0a 20 20 69 66 28 20 48 4f 70 TOPEN;. if( HOp
4e70: 65 6e 44 46 28 66 73 53 70 65 63 2e 76 52 65 66 enDF(fsSpec.vRef
4e80: 4e 75 6d 2c 20 66 73 53 70 65 63 2e 70 61 72 49 Num, fsSpec.parI
4e90: 44 2c 20 66 73 53 70 65 63 2e 6e 61 6d 65 2c 20 D, fsSpec.name,
4ea0: 66 73 52 64 57 72 50 65 72 6d 2c 20 26 28 69 64 fsRdWrPerm, &(id
4eb0: 2d 3e 72 65 66 4e 75 6d 29 29 20 21 3d 20 6e 6f ->refNum)) != no
4ec0: 45 72 72 20 29 0a 20 20 20 20 72 65 74 75 72 6e Err ). return
4ed0: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e SQLITE_CANTOPEN
4ee0: 3b 0a 23 20 65 6e 64 69 66 0a 20 20 69 64 2d 3e ;.# endif. id->
4ef0: 72 65 66 4e 75 6d 52 46 20 3d 20 2d 31 3b 0a 20 refNumRF = -1;.
4f00: 20 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20 30 3b id->locked = 0;
4f10: 0a 20 20 69 64 2d 3e 64 65 6c 4f 6e 43 6c 6f 73 . id->delOnClos
4f20: 65 20 3d 20 64 65 6c 46 6c 61 67 3b 0a 20 20 69 e = delFlag;. i
4f30: 66 20 28 64 65 6c 46 6c 61 67 29 0a 20 20 20 20 f (delFlag).
4f40: 69 64 2d 3e 70 61 74 68 54 6f 44 65 6c 20 3d 20 id->pathToDel =
4f50: 73 71 6c 69 74 65 4f 73 46 75 6c 6c 50 61 74 68 sqliteOsFullPath
4f60: 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b name(zFilename);
4f70: 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b . OpenCounter(+
4f80: 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 1);. return SQL
4f90: 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d ITE_OK;.#endif.}
4fa0: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 ../*.** Attempt
4fb0: 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 to open a new fi
4fc0: 6c 65 20 66 6f 72 20 72 65 61 64 2d 6f 6e 6c 79 le for read-only
4fd0: 20 61 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 4f access..**.** O
4fe0: 6e 20 73 75 63 63 65 73 73 2c 20 77 72 69 74 65 n success, write
4ff0: 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 the file handle
5000: 20 69 6e 74 6f 20 2a 69 64 20 61 6e 64 20 72 65 into *id and re
5010: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a turn SQLITE_OK..
5020: 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65 **.** On failure
5030: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f , return SQLITE_
5040: 43 41 4e 54 4f 50 45 4e 2e 0a 2a 2f 0a 69 6e 74 CANTOPEN..*/.int
5050: 20 73 71 6c 69 74 65 4f 73 4f 70 65 6e 52 65 61 sqliteOsOpenRea
5060: 64 4f 6e 6c 79 28 63 6f 6e 73 74 20 63 68 61 72 dOnly(const char
5070: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 73 46 *zFilename, OsF
5080: 69 6c 65 20 2a 69 64 29 7b 0a 23 69 66 20 4f 53 ile *id){.#if OS
5090: 5f 55 4e 49 58 0a 20 20 69 6e 74 20 72 63 3b 0a _UNIX. int rc;.
50a0: 20 20 69 64 2d 3e 64 69 72 66 64 20 3d 20 2d 31 id->dirfd = -1
50b0: 3b 0a 20 20 69 64 2d 3e 66 64 20 3d 20 6f 70 65 ;. id->fd = ope
50c0: 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 n(zFilename, O_R
50d0: 44 4f 4e 4c 59 7c 4f 5f 4c 41 52 47 45 46 49 4c DONLY|O_LARGEFIL
50e0: 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 20 20 69 E|O_BINARY);. i
50f0: 66 28 20 69 64 2d 3e 66 64 3c 30 20 29 7b 0a 20 f( id->fd<0 ){.
5100: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 return SQLITE
5110: 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 _CANTOPEN;. }.
5120: 20 73 71 6c 69 74 65 4f 73 45 6e 74 65 72 4d 75 sqliteOsEnterMu
5130: 74 65 78 28 29 3b 0a 20 20 72 63 20 3d 20 66 69 tex();. rc = fi
5140: 6e 64 4c 6f 63 6b 49 6e 66 6f 28 69 64 2d 3e 66 ndLockInfo(id->f
5150: 64 2c 20 26 69 64 2d 3e 70 4c 6f 63 6b 2c 20 26 d, &id->pLock, &
5160: 69 64 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 73 71 id->pOpen);. sq
5170: 6c 69 74 65 4f 73 4c 65 61 76 65 4d 75 74 65 78 liteOsLeaveMutex
5180: 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a ();. if( rc ){.
5190: 20 20 20 20 63 6c 6f 73 65 28 69 64 2d 3e 66 64 close(id->fd
51a0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 );. return SQ
51b0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a LITE_NOMEM;. }.
51c0: 20 20 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20 30 id->locked = 0
51d0: 3b 0a 20 20 54 52 41 43 45 33 28 22 4f 50 45 4e ;. TRACE3("OPEN
51e0: 2d 52 4f 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 -RO %-3d %s\n",
51f0: 69 64 2d 3e 66 64 2c 20 7a 46 69 6c 65 6e 61 6d id->fd, zFilenam
5200: 65 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 e);. OpenCounte
5210: 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 r(+1);. return
5220: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 SQLITE_OK;.#endi
5230: 66 0a 23 69 66 20 4f 53 5f 57 49 4e 0a 20 20 48 f.#if OS_WIN. H
5240: 41 4e 44 4c 45 20 68 20 3d 20 43 72 65 61 74 65 ANDLE h = Create
5250: 46 69 6c 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 0a File(zFilename,.
5260: 20 20 20 20 20 47 45 4e 45 52 49 43 5f 52 45 41 GENERIC_REA
5270: 44 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 D,. 0,.
5280: 4e 55 4c 4c 2c 0a 20 20 20 20 20 4f 50 45 4e 5f NULL,. OPEN_
5290: 45 58 49 53 54 49 4e 47 2c 0a 20 20 20 20 20 46 EXISTING,. F
52a0: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f ILE_ATTRIBUTE_NO
52b0: 52 4d 41 4c 20 7c 20 46 49 4c 45 5f 46 4c 41 47 RMAL | FILE_FLAG
52c0: 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 2c 0a _RANDOM_ACCESS,.
52d0: 20 20 20 20 20 4e 55 4c 4c 0a 20 20 29 3b 0a 20 NULL. );.
52e0: 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f if( h==INVALID_
52f0: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a HANDLE_VALUE ){.
5300: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 return SQLIT
5310: 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a E_CANTOPEN;. }.
5320: 20 20 69 64 2d 3e 68 20 3d 20 68 3b 0a 20 20 69 id->h = h;. i
5330: 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20 30 3b 0a 20 d->locked = 0;.
5340: 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 OpenCounter(+1)
5350: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 ;. return SQLIT
5360: 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 E_OK;.#endif.#if
5370: 20 4f 53 5f 4d 41 43 0a 20 20 46 53 53 70 65 63 OS_MAC. FSSpec
5380: 20 66 73 53 70 65 63 3b 0a 23 20 69 66 64 65 66 fsSpec;.# ifdef
5390: 20 5f 4c 41 52 47 45 5f 46 49 4c 45 0a 20 20 48 _LARGE_FILE. H
53a0: 46 53 55 6e 69 53 74 72 32 35 35 20 64 66 4e 61 FSUniStr255 dfNa
53b0: 6d 65 3b 0a 20 20 46 53 52 65 66 20 66 73 52 65 me;. FSRef fsRe
53c0: 66 3b 0a 20 20 69 66 28 20 5f 5f 70 61 74 68 32 f;. if( __path2
53d0: 66 73 73 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 fss(zFilename, &
53e0: 66 73 53 70 65 63 29 20 21 3d 20 6e 6f 45 72 72 fsSpec) != noErr
53f0: 20 29 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 ). return SQ
5400: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 LITE_CANTOPEN;.
5410: 20 69 66 28 20 46 53 70 4d 61 6b 65 46 53 52 65 if( FSpMakeFSRe
5420: 66 28 26 66 73 53 70 65 63 2c 20 26 66 73 52 65 f(&fsSpec, &fsRe
5430: 66 29 20 21 3d 20 6e 6f 45 72 72 20 29 0a 20 20 f) != noErr ).
5440: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
5450: 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 46 53 47 65 CANTOPEN;. FSGe
5460: 74 44 61 74 61 46 6f 72 6b 4e 61 6d 65 28 26 64 tDataForkName(&d
5470: 66 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 46 53 fName);. if( FS
5480: 4f 70 65 6e 46 6f 72 6b 28 26 66 73 52 65 66 2c OpenFork(&fsRef,
5490: 20 64 66 4e 61 6d 65 2e 6c 65 6e 67 74 68 2c 20 dfName.length,
54a0: 64 66 4e 61 6d 65 2e 75 6e 69 63 6f 64 65 2c 0a dfName.unicode,.
54b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
54c0: 20 66 73 52 64 50 65 72 6d 2c 20 26 28 69 64 2d fsRdPerm, &(id-
54d0: 3e 72 65 66 4e 75 6d 29 29 20 21 3d 20 6e 6f 45 >refNum)) != noE
54e0: 72 72 20 29 0a 20 20 20 20 72 65 74 75 72 6e 20 rr ). return
54f0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b SQLITE_CANTOPEN;
5500: 0a 23 20 65 6c 73 65 0a 20 20 5f 5f 70 61 74 68 .# else. __path
5510: 32 66 73 73 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 2fss(zFilename,
5520: 26 66 73 53 70 65 63 29 3b 0a 20 20 69 66 28 20 &fsSpec);. if(
5530: 48 4f 70 65 6e 44 46 28 66 73 53 70 65 63 2e 76 HOpenDF(fsSpec.v
5540: 52 65 66 4e 75 6d 2c 20 66 73 53 70 65 63 2e 70 RefNum, fsSpec.p
5550: 61 72 49 44 2c 20 66 73 53 70 65 63 2e 6e 61 6d arID, fsSpec.nam
5560: 65 2c 20 66 73 52 64 50 65 72 6d 2c 20 26 28 69 e, fsRdPerm, &(i
5570: 64 2d 3e 72 65 66 4e 75 6d 29 29 20 21 3d 20 6e d->refNum)) != n
5580: 6f 45 72 72 20 29 0a 20 20 20 20 72 65 74 75 72 oErr ). retur
5590: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 n SQLITE_CANTOPE
55a0: 4e 3b 0a 23 20 65 6e 64 69 66 0a 20 20 69 66 28 N;.# endif. if(
55b0: 20 48 4f 70 65 6e 52 46 28 66 73 53 70 65 63 2e HOpenRF(fsSpec.
55c0: 76 52 65 66 4e 75 6d 2c 20 66 73 53 70 65 63 2e vRefNum, fsSpec.
55d0: 70 61 72 49 44 2c 20 66 73 53 70 65 63 2e 6e 61 parID, fsSpec.na
55e0: 6d 65 2c 20 66 73 52 64 57 72 53 68 50 65 72 6d me, fsRdWrShPerm
55f0: 2c 20 26 28 69 64 2d 3e 72 65 66 4e 75 6d 52 46 , &(id->refNumRF
5600: 29 29 20 21 3d 20 6e 6f 45 72 72 29 7b 0a 20 20 )) != noErr){.
5610: 20 20 69 64 2d 3e 72 65 66 4e 75 6d 52 46 20 3d id->refNumRF =
5620: 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 64 2d 3e 6c -1;. }. id->l
5630: 6f 63 6b 65 64 20 3d 20 30 3b 0a 20 20 69 64 2d ocked = 0;. id-
5640: 3e 64 65 6c 4f 6e 43 6c 6f 73 65 20 3d 20 30 3b >delOnClose = 0;
5650: 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b . OpenCounter(+
5660: 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 1);. return SQL
5670: 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d ITE_OK;.#endif.}
5680: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 ../*.** Attempt
5690: 74 6f 20 6f 70 65 6e 20 61 20 66 69 6c 65 20 64 to open a file d
56a0: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 escriptor for th
56b0: 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 e directory that
56c0: 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 66 contains a.** f
56d0: 69 6c 65 2e 20 20 54 68 69 73 20 66 69 6c 65 20 ile. This file
56e0: 64 65 73 63 72 69 70 74 6f 72 20 63 61 6e 20 62 descriptor can b
56f0: 65 20 75 73 65 64 20 74 6f 20 66 73 79 6e 63 28 e used to fsync(
5700: 29 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a ) the directory.
5710: 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d ** in order to m
5720: 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 72 65 ake sure the cre
5730: 61 74 69 6f 6e 20 6f 66 20 61 20 6e 65 77 20 66 ation of a new f
5740: 69 6c 65 20 69 73 20 61 63 74 75 61 6c 6c 79 20 ile is actually
5750: 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 64 69 written.** to di
5760: 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 sk..**.** This r
5770: 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 6d outine is only m
5780: 65 61 6e 69 6e 67 66 75 6c 20 66 6f 72 20 55 6e eaningful for Un
5790: 69 78 2e 20 20 49 74 20 69 73 20 61 20 6e 6f 2d ix. It is a no-
57a0: 6f 70 20 75 6e 64 65 72 0a 2a 2a 20 77 69 6e 64 op under.** wind
57b0: 6f 77 73 20 73 69 6e 63 65 20 77 69 6e 64 6f 77 ows since window
57c0: 73 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f s does not suppo
57d0: 72 74 20 68 61 72 64 20 6c 69 6e 6b 73 2e 0a 2a rt hard links..*
57e0: 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c *.** On success,
57f0: 20 61 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 20 a handle for a
5800: 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 20 previously open
5810: 66 69 6c 65 20 69 73 20 61 74 20 2a 69 64 20 69 file is at *id i
5820: 73 0a 2a 2a 20 75 70 64 61 74 65 64 20 77 69 74 s.** updated wit
5830: 68 20 74 68 65 20 6e 65 77 20 64 69 72 65 63 74 h the new direct
5840: 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 ory file descrip
5850: 74 6f 72 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f tor and SQLITE_O
5860: 4b 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 K is.** returned
5870: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 ..**.** On failu
5880: 72 65 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e re, the function
5890: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f returns SQLITE_
58a0: 43 41 4e 54 4f 50 45 4e 20 61 6e 64 20 6c 65 61 CANTOPEN and lea
58b0: 76 65 73 0a 2a 2a 20 2a 69 64 20 75 6e 63 68 61 ves.** *id uncha
58c0: 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c nged..*/.int sql
58d0: 69 74 65 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f iteOsOpenDirecto
58e0: 72 79 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 ry(. const char
58f0: 20 2a 7a 44 69 72 6e 61 6d 65 2c 0a 20 20 4f 73 *zDirname,. Os
5900: 46 69 6c 65 20 2a 69 64 0a 29 7b 0a 23 69 66 20 File *id.){.#if
5910: 4f 53 5f 55 4e 49 58 0a 20 20 69 66 28 20 69 64 OS_UNIX. if( id
5920: 2d 3e 66 64 3c 30 20 29 7b 0a 20 20 20 20 2f 2a ->fd<0 ){. /*
5930: 20 44 6f 20 6e 6f 74 20 6f 70 65 6e 20 74 68 65 Do not open the
5940: 20 64 69 72 65 63 74 6f 72 79 20 69 66 20 74 68 directory if th
5950: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 e corresponding
5960: 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 file is not alre
5970: 61 64 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 2e ady. ** open.
5980: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 */. return S
5990: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a QLITE_CANTOPEN;.
59a0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 64 }. assert( id
59b0: 2d 3e 64 69 72 66 64 3c 30 20 29 3b 0a 20 20 69 ->dirfd<0 );. i
59c0: 64 2d 3e 64 69 72 66 64 20 3d 20 6f 70 65 6e 28 d->dirfd = open(
59d0: 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e zDirname, O_RDON
59e0: 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 36 34 LY|O_BINARY, 064
59f0: 34 29 3b 0a 20 20 69 66 28 20 69 64 2d 3e 64 69 4);. if( id->di
5a00: 72 66 64 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 rfd<0 ){. ret
5a10: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f urn SQLITE_CANTO
5a20: 50 45 4e 3b 20 0a 20 20 7d 0a 20 20 54 52 41 43 PEN; . }. TRAC
5a30: 45 33 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 E3("OPENDIR %-3d
5a40: 20 25 73 5c 6e 22 2c 20 69 64 2d 3e 64 69 72 66 %s\n", id->dirf
5a50: 64 2c 20 7a 44 69 72 6e 61 6d 65 29 3b 0a 23 65 d, zDirname);.#e
5a60: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 ndif. return SQ
5a70: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a LITE_OK;.}../*.*
5a80: 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 * If the followi
5a90: 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 ng global variab
5aa0: 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 le points to a s
5ab0: 74 72 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 tring which is t
5ac0: 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 he.** name of a
5ad0: 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 directory, then
5ae0: 74 68 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 that directory w
5af0: 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 ill be used to s
5b00: 74 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 tore.** temporar
5b10: 79 20 66 69 6c 65 73 2e 0a 2a 2f 0a 63 6f 6e 73 y files..*/.cons
5b20: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 5f 74 t char *sqlite_t
5b30: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 emp_directory =
5b40: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 0;../*.** Create
5b50: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c a temporary fil
5b60: 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 e name in zBuf.
5b70: 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20 62 69 zBuf must be bi
5b80: 67 20 65 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20 68 g enough to.** h
5b90: 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 53 51 4c old at least SQL
5ba0: 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a ITE_TEMPNAME_SIZ
5bb0: 45 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f E characters..*/
5bc0: 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 54 65 6d .int sqliteOsTem
5bd0: 70 46 69 6c 65 4e 61 6d 65 28 63 68 61 72 20 2a pFileName(char *
5be0: 7a 42 75 66 29 7b 0a 23 69 66 20 4f 53 5f 55 4e zBuf){.#if OS_UN
5bf0: 49 58 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 IX. static cons
5c00: 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d t char *azDirs[]
5c10: 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 = {. 0,.
5c20: 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 "/var/tmp",.
5c30: 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 "/usr/tmp",.
5c40: 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 "/tmp",.
5c50: 20 22 2e 22 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 ".",. };. sta
5c60: 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68 61 tic unsigned cha
5c70: 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 r zChars[] =.
5c80: 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e "abcdefghijklmn
5c90: 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 opqrstuvwxyz".
5ca0: 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d "ABCDEFGHIJKLM
5cb0: 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 NOPQRSTUVWXYZ".
5cc0: 20 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b "0123456789";
5cd0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 . int i, j;. s
5ce0: 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a truct stat buf;.
5cf0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 const char *zD
5d00: 69 72 20 3d 20 22 2e 22 3b 0a 20 20 61 7a 44 69 ir = ".";. azDi
5d10: 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65 5f 74 rs[0] = sqlite_t
5d20: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 emp_directory;.
5d30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 for(i=0; i<size
5d40: 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f of(azDirs)/sizeo
5d50: 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 69 2b f(azDirs[0]); i+
5d60: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 7a 44 69 +){. if( azDi
5d70: 72 73 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 rs[i]==0 ) conti
5d80: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 74 61 nue;. if( sta
5d90: 74 28 61 7a 44 69 72 73 5b 69 5d 2c 20 26 62 75 t(azDirs[i], &bu
5da0: 66 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 f) ) continue;.
5db0: 20 20 20 69 66 28 20 21 53 5f 49 53 44 49 52 28 if( !S_ISDIR(
5dc0: 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63 buf.st_mode) ) c
5dd0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 ontinue;. if(
5de0: 20 61 63 63 65 73 73 28 61 7a 44 69 72 73 5b 69 access(azDirs[i
5df0: 5d 2c 20 30 37 29 20 29 20 63 6f 6e 74 69 6e 75 ], 07) ) continu
5e00: 65 3b 0a 20 20 20 20 7a 44 69 72 20 3d 20 61 7a e;. zDir = az
5e10: 44 69 72 73 5b 69 5d 3b 0a 20 20 20 20 62 72 65 Dirs[i];. bre
5e20: 61 6b 3b 0a 20 20 7d 0a 20 20 64 6f 7b 0a 20 20 ak;. }. do{.
5e30: 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 sprintf(zBuf,
5e40: 22 25 73 2f 22 54 45 4d 50 5f 46 49 4c 45 5f 50 "%s/"TEMP_FILE_P
5e50: 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20 REFIX, zDir);.
5e60: 20 20 6a 20 3d 20 73 74 72 6c 65 6e 28 7a 42 75 j = strlen(zBu
5e70: 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 52 61 f);. sqliteRa
5e80: 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 ndomness(15, &zB
5e90: 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 uf[j]);. for(
5ea0: 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 i=0; i<15; i++,
5eb0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 j++){. zBuf
5ec0: 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 [j] = (char)zCha
5ed0: 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 rs[ ((unsigned c
5ee0: 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 har)zBuf[j])%(si
5ef0: 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 zeof(zChars)-1)
5f00: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 ];. }. zBu
5f10: 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 77 68 69 f[j] = 0;. }whi
5f20: 6c 65 28 20 61 63 63 65 73 73 28 7a 42 75 66 2c le( access(zBuf,
5f30: 30 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0)==0 );.#endif.
5f40: 23 69 66 20 4f 53 5f 57 49 4e 0a 20 20 73 74 61 #if OS_WIN. sta
5f50: 74 69 63 20 63 68 61 72 20 7a 43 68 61 72 73 5b tic char zChars[
5f60: 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67 ] =. "abcdefg
5f70: 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 hijklmnopqrstuvw
5f80: 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46 xyz". "ABCDEF
5f90: 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 GHIJKLMNOPQRSTUV
5fa0: 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34 WXYZ". "01234
5fb0: 35 36 37 38 39 22 3b 0a 20 20 69 6e 74 20 69 2c 56789";. int i,
5fc0: 20 6a 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 j;. const char
5fd0: 20 2a 7a 44 69 72 3b 0a 20 20 63 68 61 72 20 7a *zDir;. char z
5fe0: 54 65 6d 70 50 61 74 68 5b 53 51 4c 49 54 45 5f TempPath[SQLITE_
5ff0: 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a TEMPNAME_SIZE];.
6000: 20 20 69 66 28 20 73 71 6c 69 74 65 5f 74 65 6d if( sqlite_tem
6010: 70 5f 64 69 72 65 63 74 6f 72 79 3d 3d 30 20 29 p_directory==0 )
6020: 7b 0a 20 20 20 20 47 65 74 54 65 6d 70 50 61 74 {. GetTempPat
6030: 68 28 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d h(SQLITE_TEMPNAM
6040: 45 5f 53 49 5a 45 2d 33 30 2c 20 7a 54 65 6d 70 E_SIZE-30, zTemp
6050: 50 61 74 68 29 3b 0a 20 20 20 20 66 6f 72 28 69 Path);. for(i
6060: 3d 73 74 72 6c 65 6e 28 7a 54 65 6d 70 50 61 74 =strlen(zTempPat
6070: 68 29 3b 20 69 3e 30 20 26 26 20 7a 54 65 6d 70 h); i>0 && zTemp
6080: 50 61 74 68 5b 69 2d 31 5d 3d 3d 27 5c 5c 27 3b Path[i-1]=='\\';
6090: 20 69 2d 2d 29 7b 7d 0a 20 20 20 20 7a 54 65 6d i--){}. zTem
60a0: 70 50 61 74 68 5b 69 5d 20 3d 20 30 3b 0a 20 20 pPath[i] = 0;.
60b0: 20 20 7a 44 69 72 20 3d 20 7a 54 65 6d 70 50 61 zDir = zTempPa
60c0: 74 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 th;. }else{.
60d0: 20 7a 44 69 72 20 3d 20 73 71 6c 69 74 65 5f 74 zDir = sqlite_t
60e0: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 emp_directory;.
60f0: 20 7d 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 }. for(;;){.
6100: 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 sprintf(zBuf,
6110: 22 25 73 5c 5c 22 54 45 4d 50 5f 46 49 4c 45 5f "%s\\"TEMP_FILE_
6120: 50 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20 PREFIX, zDir);.
6130: 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e 28 7a 42 j = strlen(zB
6140: 75 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 52 uf);. sqliteR
6150: 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a andomness(15, &z
6160: 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 Buf[j]);. for
6170: 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c (i=0; i<15; i++,
6180: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75 j++){. zBu
6190: 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 f[j] = (char)zCh
61a0: 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 ars[ ((unsigned
61b0: 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 char)zBuf[j])%(s
61c0: 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 izeof(zChars)-1)
61d0: 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 ];. }. zB
61e0: 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 69 uf[j] = 0;. i
61f0: 66 28 20 21 73 71 6c 69 74 65 4f 73 46 69 6c 65 f( !sqliteOsFile
6200: 45 78 69 73 74 73 28 7a 42 75 66 29 20 29 20 62 Exists(zBuf) ) b
6210: 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 reak;. }.#endif
6220: 0a 23 69 66 20 4f 53 5f 4d 41 43 0a 20 20 73 74 .#if OS_MAC. st
6230: 61 74 69 63 20 63 68 61 72 20 7a 43 68 61 72 73 atic char zChars
6240: 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66 [] =. "abcdef
6250: 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 ghijklmnopqrstuv
6260: 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45 wxyz". "ABCDE
6270: 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 FGHIJKLMNOPQRSTU
6280: 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33 VWXYZ". "0123
6290: 34 35 36 37 38 39 22 3b 0a 20 20 69 6e 74 20 69 456789";. int i
62a0: 2c 20 6a 3b 0a 20 20 63 68 61 72 20 2a 7a 44 69 , j;. char *zDi
62b0: 72 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 50 r;. char zTempP
62c0: 61 74 68 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e ath[SQLITE_TEMPN
62d0: 41 4d 45 5f 53 49 5a 45 5d 3b 0a 20 20 63 68 61 AME_SIZE];. cha
62e0: 72 20 7a 64 69 72 4e 61 6d 65 5b 33 32 5d 3b 0a r zdirName[32];.
62f0: 20 20 43 49 6e 66 6f 50 42 52 65 63 20 69 6e 66 CInfoPBRec inf
6300: 6f 52 65 63 3b 0a 20 20 53 74 72 33 31 20 64 69 oRec;. Str31 di
6310: 72 4e 61 6d 65 3b 0a 20 20 6d 65 6d 73 65 74 28 rName;. memset(
6320: 26 69 6e 66 6f 52 65 63 2c 20 30 2c 20 73 69 7a &infoRec, 0, siz
6330: 65 6f 66 28 69 6e 66 6f 52 65 63 29 29 3b 0a 20 eof(infoRec));.
6340: 20 6d 65 6d 73 65 74 28 7a 54 65 6d 70 50 61 74 memset(zTempPat
6350: 68 2c 20 30 2c 20 53 51 4c 49 54 45 5f 54 45 4d h, 0, SQLITE_TEM
6360: 50 4e 41 4d 45 5f 53 49 5a 45 29 3b 0a 20 20 69 PNAME_SIZE);. i
6370: 66 28 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 64 f( sqlite_temp_d
6380: 69 72 65 63 74 6f 72 79 21 3d 30 20 29 7b 0a 20 irectory!=0 ){.
6390: 20 20 20 7a 44 69 72 20 3d 20 73 71 6c 69 74 65 zDir = sqlite
63a0: 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b _temp_directory;
63b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 46 69 6e . }else if( Fin
63c0: 64 46 6f 6c 64 65 72 28 6b 4f 6e 53 79 73 74 65 dFolder(kOnSyste
63d0: 6d 44 69 73 6b 2c 20 6b 54 65 6d 70 6f 72 61 72 mDisk, kTemporar
63e0: 79 46 6f 6c 64 65 72 54 79 70 65 2c 20 20 6b 43 yFolderType, kC
63f0: 72 65 61 74 65 46 6f 6c 64 65 72 2c 0a 20 20 20 reateFolder,.
6400: 20 20 20 20 26 28 69 6e 66 6f 52 65 63 2e 64 69 &(infoRec.di
6410: 72 49 6e 66 6f 2e 69 6f 56 52 65 66 4e 75 6d 29 rInfo.ioVRefNum)
6420: 2c 20 26 28 69 6e 66 6f 52 65 63 2e 64 69 72 49 , &(infoRec.dirI
6430: 6e 66 6f 2e 69 6f 44 72 50 61 72 49 44 29 29 20 nfo.ioDrParID))
6440: 3d 3d 20 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 == noErr ){.
6450: 69 6e 66 6f 52 65 63 2e 64 69 72 49 6e 66 6f 2e infoRec.dirInfo.
6460: 69 6f 4e 61 6d 65 50 74 72 20 3d 20 64 69 72 4e ioNamePtr = dirN
6470: 61 6d 65 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 ame;. do{.
6480: 20 20 20 69 6e 66 6f 52 65 63 2e 64 69 72 49 6e infoRec.dirIn
6490: 66 6f 2e 69 6f 46 44 69 72 49 6e 64 65 78 20 3d fo.ioFDirIndex =
64a0: 20 2d 31 3b 0a 20 20 20 20 20 20 69 6e 66 6f 52 -1;. infoR
64b0: 65 63 2e 64 69 72 49 6e 66 6f 2e 69 6f 44 72 44 ec.dirInfo.ioDrD
64c0: 69 72 49 44 20 3d 20 69 6e 66 6f 52 65 63 2e 64 irID = infoRec.d
64d0: 69 72 49 6e 66 6f 2e 69 6f 44 72 50 61 72 49 44 irInfo.ioDrParID
64e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 50 42 47 65 ;. if( PBGe
64f0: 74 43 61 74 49 6e 66 6f 53 79 6e 63 28 26 69 6e tCatInfoSync(&in
6500: 66 6f 52 65 63 29 20 3d 3d 20 6e 6f 45 72 72 20 foRec) == noErr
6510: 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 70 79 50 ){. CopyP
6520: 61 73 63 61 6c 53 74 72 69 6e 67 54 6f 43 28 64 ascalStringToC(d
6530: 69 72 4e 61 6d 65 2c 20 7a 64 69 72 4e 61 6d 65 irName, zdirName
6540: 29 3b 0a 20 20 20 20 20 20 20 20 69 20 3d 20 73 );. i = s
6550: 74 72 6c 65 6e 28 7a 64 69 72 4e 61 6d 65 29 3b trlen(zdirName);
6560: 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 . memmove
6570: 28 26 28 7a 54 65 6d 70 50 61 74 68 5b 69 2b 31 (&(zTempPath[i+1
6580: 5d 29 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20 73 ]), zTempPath, s
6590: 74 72 6c 65 6e 28 7a 54 65 6d 70 50 61 74 68 29 trlen(zTempPath)
65a0: 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72 63 70 );. strcp
65b0: 79 28 7a 54 65 6d 70 50 61 74 68 2c 20 7a 64 69 y(zTempPath, zdi
65c0: 72 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 rName);.
65d0: 7a 54 65 6d 70 50 61 74 68 5b 69 5d 20 3d 20 27 zTempPath[i] = '
65e0: 3a 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b :';. }else{
65f0: 0a 20 20 20 20 20 20 20 20 2a 7a 54 65 6d 70 50 . *zTempP
6600: 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 ath = 0;.
6610: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a break;. }.
6620: 20 20 20 20 7d 20 77 68 69 6c 65 28 20 69 6e 66 } while( inf
6630: 6f 52 65 63 2e 64 69 72 49 6e 66 6f 2e 69 6f 44 oRec.dirInfo.ioD
6640: 72 44 69 72 49 44 20 21 3d 20 66 73 52 74 44 69 rDirID != fsRtDi
6650: 72 49 44 20 29 3b 0a 20 20 20 20 7a 44 69 72 20 rID );. zDir
6660: 3d 20 7a 54 65 6d 70 50 61 74 68 3b 0a 20 20 7d = zTempPath;. }
6670: 0a 20 20 69 66 28 20 7a 44 69 72 5b 30 5d 3d 3d . if( zDir[0]==
6680: 30 20 29 7b 0a 20 20 20 20 67 65 74 63 77 64 28 0 ){. getcwd(
6690: 7a 54 65 6d 70 50 61 74 68 2c 20 53 51 4c 49 54 zTempPath, SQLIT
66a0: 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 2d E_TEMPNAME_SIZE-
66b0: 32 34 29 3b 0a 20 20 20 20 7a 44 69 72 20 3d 20 24);. zDir =
66c0: 7a 54 65 6d 70 50 61 74 68 3b 0a 20 20 7d 0a 20 zTempPath;. }.
66d0: 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 73 70 for(;;){. sp
66e0: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 73 22 rintf(zBuf, "%s"
66f0: 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 TEMP_FILE_PREFIX
6700: 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d , zDir);. j =
6710: 20 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 strlen(zBuf);.
6720: 20 20 20 73 71 6c 69 74 65 52 61 6e 64 6f 6d 6e sqliteRandomn
6730: 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d ess(15, &zBuf[j]
6740: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 );. for(i=0;
6750: 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b i<15; i++, j++){
6760: 0a 20 20 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d . zBuf[j] =
6770: 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28 (char)zChars[ (
6780: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a (unsigned char)z
6790: 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 Buf[j])%(sizeof(
67a0: 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 zChars)-1) ];.
67b0: 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 }. zBuf[j]
67c0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 73 71 = 0;. if( !sq
67d0: 6c 69 74 65 4f 73 46 69 6c 65 45 78 69 73 74 73 liteOsFileExists
67e0: 28 7a 42 75 66 29 20 29 20 62 72 65 61 6b 3b 0a (zBuf) ) break;.
67f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 }.#endif. ret
6800: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a urn SQLITE_OK; .
6810: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 }../*.** Close a
6820: 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 file..*/.int sq
6830: 6c 69 74 65 4f 73 43 6c 6f 73 65 28 4f 73 46 69 liteOsClose(OsFi
6840: 6c 65 20 2a 69 64 29 7b 0a 23 69 66 20 4f 53 5f le *id){.#if OS_
6850: 55 4e 49 58 0a 20 20 73 71 6c 69 74 65 4f 73 55 UNIX. sqliteOsU
6860: 6e 6c 6f 63 6b 28 69 64 29 3b 0a 20 20 69 66 28 nlock(id);. if(
6870: 20 69 64 2d 3e 64 69 72 66 64 3e 3d 30 20 29 20 id->dirfd>=0 )
6880: 63 6c 6f 73 65 28 69 64 2d 3e 64 69 72 66 64 29 close(id->dirfd)
6890: 3b 0a 20 20 69 64 2d 3e 64 69 72 66 64 20 3d 20 ;. id->dirfd =
68a0: 2d 31 3b 0a 20 20 73 71 6c 69 74 65 4f 73 45 6e -1;. sqliteOsEn
68b0: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 terMutex();. if
68c0: 28 20 69 64 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f ( id->pOpen->nLo
68d0: 63 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 ck ){. /* If
68e0: 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 there are outsta
68f0: 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 nding locks, do
6900: 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f not actually clo
6910: 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 se the file just
6920: 0a 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 . ** yet beca
6930: 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 use that would c
6940: 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 lear those locks
6950: 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 . Instead, add
6960: 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 the file. **
6970: 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 4f descriptor to pO
6980: 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 pen->aPending.
6990: 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d It will be autom
69a0: 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 atically closed
69b0: 77 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 when. ** the
69c0: 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 last lock is cle
69d0: 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 ared.. */.
69e0: 20 69 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20 int *aNew;.
69f0: 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a struct openCnt *
6a00: 70 4f 70 65 6e 20 3d 20 69 64 2d 3e 70 4f 70 65 pOpen = id->pOpe
6a10: 6e 3b 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 n;. pOpen->nP
6a20: 65 6e 64 69 6e 67 2b 2b 3b 0a 20 20 20 20 61 4e ending++;. aN
6a30: 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c ew = sqliteReall
6a40: 6f 63 28 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 oc( pOpen->aPend
6a50: 69 6e 67 2c 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e ing, pOpen->nPen
6a60: 64 69 6e 67 2a 73 69 7a 65 6f 66 28 69 6e 74 29 ding*sizeof(int)
6a70: 20 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 );. if( aNew
6a80: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 ==0 ){. /*
6a90: 49 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c If a malloc fail
6aa0: 73 2c 20 6a 75 73 74 20 6c 65 61 6b 20 74 68 65 s, just leak the
6ab0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 file descriptor
6ac0: 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 */. }else{.
6ad0: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e pOpen->aPen
6ae0: 64 69 6e 67 20 3d 20 61 4e 65 77 3b 0a 20 20 20 ding = aNew;.
6af0: 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 pOpen->aPendi
6b00: 6e 67 5b 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 ng[pOpen->nPendi
6b10: 6e 67 2d 31 5d 20 3d 20 69 64 2d 3e 66 64 3b 0a ng-1] = id->fd;.
6b20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 }. }else{.
6b30: 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 /* There are
6b40: 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c no outstanding l
6b50: 6f 63 6b 73 20 73 6f 20 77 65 20 63 61 6e 20 63 ocks so we can c
6b60: 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 69 6d lose the file im
6b70: 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 20 20 20 mediately */.
6b80: 20 63 6c 6f 73 65 28 69 64 2d 3e 66 64 29 3b 0a close(id->fd);.
6b90: 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4c 6f 63 }. releaseLoc
6ba0: 6b 49 6e 66 6f 28 69 64 2d 3e 70 4c 6f 63 6b 29 kInfo(id->pLock)
6bb0: 3b 0a 20 20 72 65 6c 65 61 73 65 4f 70 65 6e 43 ;. releaseOpenC
6bc0: 6e 74 28 69 64 2d 3e 70 4f 70 65 6e 29 3b 0a 20 nt(id->pOpen);.
6bd0: 20 73 71 6c 69 74 65 4f 73 4c 65 61 76 65 4d 75 sqliteOsLeaveMu
6be0: 74 65 78 28 29 3b 0a 20 20 54 52 41 43 45 32 28 tex();. TRACE2(
6bf0: 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 "CLOSE %-3d\n"
6c00: 2c 20 69 64 2d 3e 66 64 29 3b 0a 20 20 4f 70 65 , id->fd);. Ope
6c10: 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 nCounter(-1);.
6c20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
6c30: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f ;.#endif.#if OS_
6c40: 57 49 4e 0a 20 20 43 6c 6f 73 65 48 61 6e 64 6c WIN. CloseHandl
6c50: 65 28 69 64 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e e(id->h);. Open
6c60: 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 72 Counter(-1);. r
6c70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b eturn SQLITE_OK;
6c80: 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 4d .#endif.#if OS_M
6c90: 41 43 0a 20 20 69 66 28 20 69 64 2d 3e 72 65 66 AC. if( id->ref
6ca0: 4e 75 6d 52 46 21 3d 2d 31 20 29 0a 20 20 20 20 NumRF!=-1 ).
6cb0: 46 53 43 6c 6f 73 65 28 69 64 2d 3e 72 65 66 4e FSClose(id->refN
6cc0: 75 6d 52 46 29 3b 0a 23 20 69 66 64 65 66 20 5f umRF);.# ifdef _
6cd0: 4c 41 52 47 45 5f 46 49 4c 45 0a 20 20 46 53 43 LARGE_FILE. FSC
6ce0: 6c 6f 73 65 46 6f 72 6b 28 69 64 2d 3e 72 65 66 loseFork(id->ref
6cf0: 4e 75 6d 29 3b 0a 23 20 65 6c 73 65 0a 20 20 46 Num);.# else. F
6d00: 53 43 6c 6f 73 65 28 69 64 2d 3e 72 65 66 4e 75 SClose(id->refNu
6d10: 6d 29 3b 0a 23 20 65 6e 64 69 66 0a 20 20 69 66 m);.# endif. if
6d20: 28 20 69 64 2d 3e 64 65 6c 4f 6e 43 6c 6f 73 65 ( id->delOnClose
6d30: 20 29 7b 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 69 ){. unlink(i
6d40: 64 2d 3e 70 61 74 68 54 6f 44 65 6c 29 3b 0a 20 d->pathToDel);.
6d50: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 69 64 sqliteFree(id
6d60: 2d 3e 70 61 74 68 54 6f 44 65 6c 29 3b 0a 20 20 ->pathToDel);.
6d70: 7d 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 }. OpenCounter(
6d80: 2d 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 -1);. return SQ
6d90: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a LITE_OK;.#endif.
6da0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 }../*.** Read da
6db0: 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 ta from a file i
6dc0: 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52 nto a buffer. R
6dd0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 eturn SQLITE_OK
6de0: 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 if all.** bytes
6df0: 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73 were read succes
6e00: 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 sfully and SQLIT
6e10: 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68 E_IOERR if anyth
6e20: 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e ing goes.** wron
6e30: 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 g..*/.int sqlite
6e40: 4f 73 52 65 61 64 28 4f 73 46 69 6c 65 20 2a 69 OsRead(OsFile *i
6e50: 64 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 d, void *pBuf, i
6e60: 6e 74 20 61 6d 74 29 7b 0a 23 69 66 20 4f 53 5f nt amt){.#if OS_
6e70: 55 4e 49 58 0a 20 20 69 6e 74 20 67 6f 74 3b 0a UNIX. int got;.
6e80: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f SimulateIOErro
6e90: 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b r(SQLITE_IOERR);
6ea0: 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a . TIMER_START;.
6eb0: 20 20 67 6f 74 20 3d 20 72 65 61 64 28 69 64 2d got = read(id-
6ec0: 3e 66 64 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b >fd, pBuf, amt);
6ed0: 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 . TIMER_END;.
6ee0: 54 52 41 43 45 34 28 22 52 45 41 44 20 20 20 20 TRACE4("READ
6ef0: 25 2d 33 64 20 25 37 64 20 25 64 5c 6e 22 2c 20 %-3d %7d %d\n",
6f00: 69 64 2d 3e 66 64 2c 20 6c 61 73 74 5f 70 61 67 id->fd, last_pag
6f10: 65 2c 20 65 6c 61 70 73 65 29 3b 0a 20 20 53 45 e, elapse);. SE
6f20: 45 4b 28 30 29 3b 0a 20 20 2f 2a 20 69 66 28 20 EK(0);. /* if(
6f30: 67 6f 74 3c 30 20 29 20 67 6f 74 20 3d 20 30 3b got<0 ) got = 0;
6f40: 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61 */. if( got==a
6f50: 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e mt ){. return
6f60: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 SQLITE_OK;. }e
6f70: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 lse{. return
6f80: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 SQLITE_IOERR;.
6f90: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f }.#endif.#if OS_
6fa0: 57 49 4e 0a 20 20 44 57 4f 52 44 20 67 6f 74 3b WIN. DWORD got;
6fb0: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 . SimulateIOErr
6fc0: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 or(SQLITE_IOERR)
6fd0: 3b 0a 20 20 54 52 41 43 45 32 28 22 52 45 41 44 ;. TRACE2("READ
6fe0: 20 25 64 5c 6e 22 2c 20 6c 61 73 74 5f 70 61 67 %d\n", last_pag
6ff0: 65 29 3b 0a 20 20 69 66 28 20 21 52 65 61 64 46 e);. if( !ReadF
7000: 69 6c 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c ile(id->h, pBuf,
7010: 20 61 6d 74 2c 20 26 67 6f 74 2c 20 30 29 20 29 amt, &got, 0) )
7020: 7b 0a 20 20 20 20 67 6f 74 20 3d 20 30 3b 0a 20 {. got = 0;.
7030: 20 7d 0a 20 20 69 66 28 20 67 6f 74 3d 3d 28 44 }. if( got==(D
7040: 57 4f 52 44 29 61 6d 74 20 29 7b 0a 20 20 20 20 WORD)amt ){.
7050: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
7060: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 ;. }else{. r
7070: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 eturn SQLITE_IOE
7080: 52 52 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 RR;. }.#endif.#
7090: 69 66 20 4f 53 5f 4d 41 43 0a 20 20 69 6e 74 20 if OS_MAC. int
70a0: 67 6f 74 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 got;. SimulateI
70b0: 4f 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f OError(SQLITE_IO
70c0: 45 52 52 29 3b 0a 20 20 54 52 41 43 45 32 28 22 ERR);. TRACE2("
70d0: 52 45 41 44 20 25 64 5c 6e 22 2c 20 6c 61 73 74 READ %d\n", last
70e0: 5f 70 61 67 65 29 3b 0a 23 20 69 66 64 65 66 20 _page);.# ifdef
70f0: 5f 4c 41 52 47 45 5f 46 49 4c 45 0a 20 20 46 53 _LARGE_FILE. FS
7100: 52 65 61 64 46 6f 72 6b 28 69 64 2d 3e 72 65 66 ReadFork(id->ref
7110: 4e 75 6d 2c 20 66 73 41 74 4d 61 72 6b 2c 20 30 Num, fsAtMark, 0
7120: 2c 20 28 42 79 74 65 43 6f 75 6e 74 29 61 6d 74 , (ByteCount)amt
7130: 2c 20 70 42 75 66 2c 20 28 42 79 74 65 43 6f 75 , pBuf, (ByteCou
7140: 6e 74 2a 29 26 67 6f 74 29 3b 0a 23 20 65 6c 73 nt*)&got);.# els
7150: 65 0a 20 20 67 6f 74 20 3d 20 61 6d 74 3b 0a 20 e. got = amt;.
7160: 20 46 53 52 65 61 64 28 69 64 2d 3e 72 65 66 4e FSRead(id->refN
7170: 75 6d 2c 20 26 67 6f 74 2c 20 70 42 75 66 29 3b um, &got, pBuf);
7180: 0a 23 20 65 6e 64 69 66 0a 20 20 69 66 28 20 67 .# endif. if( g
7190: 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72 ot==amt ){. r
71a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b eturn SQLITE_OK;
71b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 . }else{. re
71c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 turn SQLITE_IOER
71d0: 52 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a R;. }.#endif.}.
71e0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 ./*.** Write dat
71f0: 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 a from a buffer
7200: 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 into a file. Re
7210: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f turn SQLITE_OK o
7220: 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 n success.** or
7230: 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 some other error
7240: 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 code on failure
7250: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 4f ..*/.int sqliteO
7260: 73 57 72 69 74 65 28 4f 73 46 69 6c 65 20 2a 69 sWrite(OsFile *i
7270: 64 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 d, const void *p
7280: 42 75 66 2c 20 69 6e 74 20 61 6d 74 29 7b 0a 23 Buf, int amt){.#
7290: 69 66 20 4f 53 5f 55 4e 49 58 0a 20 20 69 6e 74 if OS_UNIX. int
72a0: 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20 53 69 wrote = 0;. Si
72b0: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51 mulateIOError(SQ
72c0: 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 54 LITE_IOERR);. T
72d0: 49 4d 45 52 5f 53 54 41 52 54 3b 0a 20 20 77 68 IMER_START;. wh
72e0: 69 6c 65 28 20 61 6d 74 3e 30 20 26 26 20 28 77 ile( amt>0 && (w
72f0: 72 6f 74 65 20 3d 20 77 72 69 74 65 28 69 64 2d rote = write(id-
7300: 3e 66 64 2c 20 70 42 75 66 2c 20 61 6d 74 29 29 >fd, pBuf, amt))
7310: 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d >0 ){. amt -=
7320: 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 wrote;. pBuf
7330: 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 = &((char*)pBuf
7340: 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 )[wrote];. }.
7350: 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 54 52 41 TIMER_END;. TRA
7360: 43 45 34 28 22 57 52 49 54 45 20 20 20 25 2d 33 CE4("WRITE %-3
7370: 64 20 25 37 64 20 25 64 5c 6e 22 2c 20 69 64 2d d %7d %d\n", id-
7380: 3e 66 64 2c 20 6c 61 73 74 5f 70 61 67 65 2c 20 >fd, last_page,
7390: 65 6c 61 70 73 65 29 3b 0a 20 20 53 45 45 4b 28 elapse);. SEEK(
73a0: 30 29 3b 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 0);. if( amt>0
73b0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 ){. return SQ
73c0: 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 LITE_FULL;. }.
73d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
73e0: 4b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 K;.#endif.#if OS
73f0: 5f 57 49 4e 0a 20 20 69 6e 74 20 72 63 3b 0a 20 _WIN. int rc;.
7400: 20 44 57 4f 52 44 20 77 72 6f 74 65 3b 0a 20 20 DWORD wrote;.
7410: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 SimulateIOError(
7420: 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 SQLITE_IOERR);.
7430: 20 54 52 41 43 45 32 28 22 57 52 49 54 45 20 25 TRACE2("WRITE %
7440: 64 5c 6e 22 2c 20 6c 61 73 74 5f 70 61 67 65 29 d\n", last_page)
7450: 3b 0a 20 20 77 68 69 6c 65 28 20 61 6d 74 3e 30 ;. while( amt>0
7460: 20 26 26 20 28 72 63 20 3d 20 57 72 69 74 65 46 && (rc = WriteF
7470: 69 6c 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c ile(id->h, pBuf,
7480: 20 61 6d 74 2c 20 26 77 72 6f 74 65 2c 20 30 29 amt, &wrote, 0)
7490: 29 21 3d 30 20 26 26 20 77 72 6f 74 65 3e 30 20 )!=0 && wrote>0
74a0: 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 ){. amt -= wr
74b0: 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 ote;. pBuf =
74c0: 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77 &((char*)pBuf)[w
74d0: 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 rote];. }. if(
74e0: 20 21 72 63 20 7c 7c 20 61 6d 74 3e 28 69 6e 74 !rc || amt>(int
74f0: 29 77 72 6f 74 65 20 29 7b 0a 20 20 20 20 72 65 )wrote ){. re
7500: 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c turn SQLITE_FULL
7510: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 ;. }. return S
7520: 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 QLITE_OK;.#endif
7530: 0a 23 69 66 20 4f 53 5f 4d 41 43 0a 20 20 4f 53 .#if OS_MAC. OS
7540: 45 72 72 20 6f 73 65 72 72 3b 0a 20 20 69 6e 74 Err oserr;. int
7550: 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20 53 69 wrote = 0;. Si
7560: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51 mulateIOError(SQ
7570: 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 54 LITE_IOERR);. T
7580: 52 41 43 45 32 28 22 57 52 49 54 45 20 25 64 5c RACE2("WRITE %d\
7590: 6e 22 2c 20 6c 61 73 74 5f 70 61 67 65 29 3b 0a n", last_page);.
75a0: 20 20 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 29 while( amt>0 )
75b0: 7b 0a 23 20 69 66 64 65 66 20 5f 4c 41 52 47 45 {.# ifdef _LARGE
75c0: 5f 46 49 4c 45 0a 20 20 20 20 6f 73 65 72 72 20 _FILE. oserr
75d0: 3d 20 46 53 57 72 69 74 65 46 6f 72 6b 28 69 64 = FSWriteFork(id
75e0: 2d 3e 72 65 66 4e 75 6d 2c 20 66 73 41 74 4d 61 ->refNum, fsAtMa
75f0: 72 6b 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 rk, 0,.
7600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 (
7610: 42 79 74 65 43 6f 75 6e 74 29 61 6d 74 2c 20 70 ByteCount)amt, p
7620: 42 75 66 2c 20 28 42 79 74 65 43 6f 75 6e 74 2a Buf, (ByteCount*
7630: 29 26 77 72 6f 74 65 29 3b 0a 23 20 65 6c 73 65 )&wrote);.# else
7640: 0a 20 20 20 20 77 72 6f 74 65 20 3d 20 61 6d 74 . wrote = amt
7650: 3b 0a 20 20 20 20 6f 73 65 72 72 20 3d 20 46 53 ;. oserr = FS
7660: 57 72 69 74 65 28 69 64 2d 3e 72 65 66 4e 75 6d Write(id->refNum
7670: 2c 20 26 77 72 6f 74 65 2c 20 70 42 75 66 29 3b , &wrote, pBuf);
7680: 0a 23 20 65 6e 64 69 66 0a 20 20 20 20 69 66 28 .# endif. if(
7690: 20 77 72 6f 74 65 20 3d 3d 20 30 20 7c 7c 20 6f wrote == 0 || o
76a0: 73 65 72 72 20 21 3d 20 6e 6f 45 72 72 29 0a 20 serr != noErr).
76b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
76c0: 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 amt -= wrote;.
76d0: 20 20 70 42 75 66 20 3d 20 26 28 28 63 68 61 72 pBuf = &((char
76e0: 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a *)pBuf)[wrote];.
76f0: 20 20 7d 0a 20 20 69 66 28 20 6f 73 65 72 72 20 }. if( oserr
7700: 21 3d 20 6e 6f 45 72 72 20 7c 7c 20 61 6d 74 3e != noErr || amt>
7710: 77 72 6f 74 65 20 29 7b 0a 20 20 20 20 72 65 74 wrote ){. ret
7720: 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b urn SQLITE_FULL;
7730: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 . }. return SQ
7740: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a LITE_OK;.#endif.
7750: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 }../*.** Move th
7760: 65 20 72 65 61 64 2f 77 72 69 74 65 20 70 6f 69 e read/write poi
7770: 6e 74 65 72 20 69 6e 20 61 20 66 69 6c 65 2e 0a nter in a file..
7780: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 53 */.int sqliteOsS
7790: 65 65 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 eek(OsFile *id,
77a0: 6f 66 66 5f 74 20 6f 66 66 73 65 74 29 7b 0a 20 off_t offset){.
77b0: 20 53 45 45 4b 28 6f 66 66 73 65 74 2f 31 30 32 SEEK(offset/102
77c0: 34 20 2b 20 31 29 3b 0a 23 69 66 20 4f 53 5f 55 4 + 1);.#if OS_U
77d0: 4e 49 58 0a 20 20 6c 73 65 65 6b 28 69 64 2d 3e NIX. lseek(id->
77e0: 66 64 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b fd, offset, SEEK
77f0: 5f 53 45 54 29 3b 0a 20 20 72 65 74 75 72 6e 20 _SET);. return
7800: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 SQLITE_OK;.#endi
7810: 66 0a 23 69 66 20 4f 53 5f 57 49 4e 0a 20 20 7b f.#if OS_WIN. {
7820: 0a 20 20 20 20 4c 4f 4e 47 20 75 70 70 65 72 42 . LONG upperB
7830: 69 74 73 20 3d 20 6f 66 66 73 65 74 3e 3e 33 32 its = offset>>32
7840: 3b 0a 20 20 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 ;. LONG lower
7850: 42 69 74 73 20 3d 20 6f 66 66 73 65 74 20 26 20 Bits = offset &
7860: 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20 20 20 0xffffffff;.
7870: 44 57 4f 52 44 20 72 63 3b 0a 20 20 20 20 72 63 DWORD rc;. rc
7880: 20 3d 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 = SetFilePointe
7890: 72 28 69 64 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 r(id->h, lowerBi
78a0: 74 73 2c 20 26 75 70 70 65 72 42 69 74 73 2c 20 ts, &upperBits,
78b0: 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 20 20 20 FILE_BEGIN);.
78c0: 20 2f 2a 20 54 52 41 43 45 33 28 22 53 45 45 4b /* TRACE3("SEEK
78d0: 20 72 63 3d 30 78 25 78 20 75 70 70 65 72 3d 30 rc=0x%x upper=0
78e0: 78 25 78 5c 6e 22 2c 20 72 63 2c 20 75 70 70 65 x%x\n", rc, uppe
78f0: 72 42 69 74 73 29 3b 20 2a 2f 0a 20 20 7d 0a 20 rBits); */. }.
7900: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
7910: 4b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 K;.#endif.#if OS
7920: 5f 4d 41 43 0a 20 20 7b 0a 20 20 20 20 6f 66 66 _MAC. {. off
7930: 5f 74 20 63 75 72 53 69 7a 65 3b 0a 20 20 20 20 _t curSize;.
7940: 69 66 28 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 if( sqliteOsFile
7950: 53 69 7a 65 28 69 64 2c 20 26 63 75 72 53 69 7a Size(id, &curSiz
7960: 65 29 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 e) != SQLITE_OK
7970: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 ){. return
7980: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 SQLITE_IOERR;.
7990: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 66 66 73 }. if( offs
79a0: 65 74 20 3e 3d 20 63 75 72 53 69 7a 65 20 29 7b et >= curSize ){
79b0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 . if( sqlit
79c0: 65 4f 73 54 72 75 6e 63 61 74 65 28 69 64 2c 20 eOsTruncate(id,
79d0: 6f 66 66 73 65 74 2b 31 29 20 21 3d 20 53 51 4c offset+1) != SQL
79e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 ITE_OK ){.
79f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
7a00: 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 7d 0a 20 IOERR;. }.
7a10: 20 20 20 7d 0a 23 20 69 66 64 65 66 20 5f 4c 41 }.# ifdef _LA
7a20: 52 47 45 5f 46 49 4c 45 0a 20 20 20 20 69 66 28 RGE_FILE. if(
7a30: 20 46 53 53 65 74 46 6f 72 6b 50 6f 73 69 74 69 FSSetForkPositi
7a40: 6f 6e 28 69 64 2d 3e 72 65 66 4e 75 6d 2c 20 66 on(id->refNum, f
7a50: 73 46 72 6f 6d 53 74 61 72 74 2c 20 6f 66 66 73 sFromStart, offs
7a60: 65 74 29 20 21 3d 20 6e 6f 45 72 72 20 29 7b 0a et) != noErr ){.
7a70: 23 20 65 6c 73 65 0a 20 20 20 20 69 66 28 20 53 # else. if( S
7a80: 65 74 46 50 6f 73 28 69 64 2d 3e 72 65 66 4e 75 etFPos(id->refNu
7a90: 6d 2c 20 66 73 46 72 6f 6d 53 74 61 72 74 2c 20 m, fsFromStart,
7aa0: 6f 66 66 73 65 74 29 20 21 3d 20 6e 6f 45 72 72 offset) != noErr
7ab0: 20 29 7b 0a 23 20 65 6e 64 69 66 0a 20 20 20 20 ){.# endif.
7ac0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
7ad0: 49 4f 45 52 52 3b 0a 20 20 20 20 7d 65 6c 73 65 IOERR;. }else
7ae0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 {. return S
7af0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a QLITE_OK;. }.
7b00: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a }.#endif.}../*
7b10: 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c .** Make sure al
7b20: 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20 70 61 l writes to a pa
7b30: 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72 rticular file ar
7b40: 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 e committed to d
7b50: 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 isk..**.** Under
7b60: 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 Unix, also make
7b70: 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64 sure that the d
7b80: 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 irectory entry f
7b90: 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 or the file.** h
7ba0: 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 as been created
7bb0: 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 by fsync-ing the
7bc0: 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 directory that
7bd0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c contains the fil
7be0: 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e e..** If we do n
7bf0: 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77 ot do this and w
7c00: 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f e encounter a po
7c10: 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 wer failure, the
7c20: 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e directory.** en
7c30: 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 try for the jour
7c40: 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 nal might not ex
7c50: 69 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62 ist after we reb
7c60: 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a oot. The next.*
7c70: 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65 * SQLite to acce
7c80: 73 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c ss the file will
7c90: 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 not know that t
7ca0: 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 he journal exist
7cb0: 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 s (because.** th
7cc0: 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 e directory entr
7cd0: 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 y for the journa
7ce0: 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61 l was never crea
7cf0: 74 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61 ted) and the tra
7d00: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c nsaction.** will
7d10: 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d not roll back -
7d20: 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e possibly leadin
7d30: 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f g to database co
7d40: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 rruption..*/.int
7d50: 20 73 71 6c 69 74 65 4f 73 53 79 6e 63 28 4f 73 sqliteOsSync(Os
7d60: 46 69 6c 65 20 2a 69 64 29 7b 0a 23 69 66 20 4f File *id){.#if O
7d70: 53 5f 55 4e 49 58 0a 20 20 53 69 6d 75 6c 61 74 S_UNIX. Simulat
7d80: 65 49 4f 45 72 72 6f 72 28 53 51 4c 49 54 45 5f eIOError(SQLITE_
7d90: 49 4f 45 52 52 29 3b 0a 20 20 54 52 41 43 45 32 IOERR);. TRACE2
7da0: 28 22 53 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e ("SYNC %-3d\n
7db0: 22 2c 20 69 64 2d 3e 66 64 29 3b 0a 20 20 69 66 ", id->fd);. if
7dc0: 28 20 66 73 79 6e 63 28 69 64 2d 3e 66 64 29 20 ( fsync(id->fd)
7dd0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 ){. return SQ
7de0: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 65 LITE_IOERR;. }e
7df0: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 69 64 2d lse{. if( id-
7e00: 3e 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 >dirfd>=0 ){.
7e10: 20 20 20 54 52 41 43 45 32 28 22 44 49 52 53 59 TRACE2("DIRSY
7e20: 4e 43 20 25 2d 33 64 5c 6e 22 2c 20 69 64 2d 3e NC %-3d\n", id->
7e30: 64 69 72 66 64 29 3b 0a 20 20 20 20 20 20 66 73 dirfd);. fs
7e40: 79 6e 63 28 69 64 2d 3e 64 69 72 66 64 29 3b 0a ync(id->dirfd);.
7e50: 20 20 20 20 20 20 63 6c 6f 73 65 28 69 64 2d 3e close(id->
7e60: 64 69 72 66 64 29 3b 20 20 2f 2a 20 4f 6e 6c 79 dirfd); /* Only
7e70: 20 6e 65 65 64 20 74 6f 20 73 79 6e 63 20 6f 6e need to sync on
7e80: 63 65 2c 20 73 6f 20 63 6c 6f 73 65 20 74 68 65 ce, so close the
7e90: 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 directory */.
7ea0: 20 20 20 20 69 64 2d 3e 64 69 72 66 64 20 3d 20 id->dirfd =
7eb0: 2d 31 3b 20 20 20 20 2f 2a 20 77 68 65 6e 20 77 -1; /* when w
7ec0: 65 20 61 72 65 20 64 6f 6e 65 2e 20 2a 2f 0a 20 e are done. */.
7ed0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 }. return
7ee0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 23 SQLITE_OK;. }.#
7ef0: 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 49 4e endif.#if OS_WIN
7f00: 0a 20 20 69 66 28 20 46 6c 75 73 68 46 69 6c 65 . if( FlushFile
7f10: 42 75 66 66 65 72 73 28 69 64 2d 3e 68 29 20 29 Buffers(id->h) )
7f20: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c {. return SQL
7f30: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b ITE_OK;. }else{
7f40: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 . return SQLI
7f50: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 23 65 TE_IOERR;. }.#e
7f60: 6e 64 69 66 0a 23 69 66 20 4f 53 5f 4d 41 43 0a ndif.#if OS_MAC.
7f70: 23 20 69 66 64 65 66 20 5f 4c 41 52 47 45 5f 46 # ifdef _LARGE_F
7f80: 49 4c 45 0a 20 20 69 66 28 20 46 53 46 6c 75 73 ILE. if( FSFlus
7f90: 68 46 6f 72 6b 28 69 64 2d 3e 72 65 66 4e 75 6d hFork(id->refNum
7fa0: 29 20 21 3d 20 6e 6f 45 72 72 20 29 7b 0a 23 20 ) != noErr ){.#
7fb0: 65 6c 73 65 0a 20 20 50 61 72 61 6d 42 6c 6f 63 else. ParamBloc
7fc0: 6b 52 65 63 20 70 61 72 61 6d 73 3b 0a 20 20 6d kRec params;. m
7fd0: 65 6d 73 65 74 28 26 70 61 72 61 6d 73 2c 20 30 emset(¶ms, 0
7fe0: 2c 20 73 69 7a 65 6f 66 28 50 61 72 61 6d 42 6c , sizeof(ParamBl
7ff0: 6f 63 6b 52 65 63 29 29 3b 0a 20 20 70 61 72 61 ockRec));. para
8000: 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f 52 65 66 ms.ioParam.ioRef
8010: 4e 75 6d 20 3d 20 69 64 2d 3e 72 65 66 4e 75 6d Num = id->refNum
8020: 3b 0a 20 20 69 66 28 20 50 42 46 6c 75 73 68 46 ;. if( PBFlushF
8030: 69 6c 65 53 79 6e 63 28 26 70 61 72 61 6d 73 29 ileSync(¶ms)
8040: 20 21 3d 20 6e 6f 45 72 72 20 29 7b 0a 23 20 65 != noErr ){.# e
8050: 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 ndif. return
8060: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 SQLITE_IOERR;.
8070: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 }else{. retur
8080: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d n SQLITE_OK;. }
8090: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a .#endif.}../*.**
80a0: 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 Truncate an ope
80b0: 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 n file to a spec
80c0: 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 69 6e ified size.*/.in
80d0: 74 20 73 71 6c 69 74 65 4f 73 54 72 75 6e 63 61 t sqliteOsTrunca
80e0: 74 65 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 6f te(OsFile *id, o
80f0: 66 66 5f 74 20 6e 42 79 74 65 29 7b 0a 20 20 53 ff_t nByte){. S
8100: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 imulateIOError(S
8110: 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 23 69 QLITE_IOERR);.#i
8120: 66 20 4f 53 5f 55 4e 49 58 0a 20 20 72 65 74 75 f OS_UNIX. retu
8130: 72 6e 20 66 74 72 75 6e 63 61 74 65 28 69 64 2d rn ftruncate(id-
8140: 3e 66 64 2c 20 6e 42 79 74 65 29 3d 3d 30 20 3f >fd, nByte)==0 ?
8150: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c SQLITE_OK : SQL
8160: 49 54 45 5f 49 4f 45 52 52 3b 0a 23 65 6e 64 69 ITE_IOERR;.#endi
8170: 66 0a 23 69 66 20 4f 53 5f 57 49 4e 0a 20 20 7b f.#if OS_WIN. {
8180: 0a 20 20 20 20 4c 4f 4e 47 20 75 70 70 65 72 42 . LONG upperB
8190: 69 74 73 20 3d 20 6e 42 79 74 65 3e 3e 33 32 3b its = nByte>>32;
81a0: 0a 20 20 20 20 53 65 74 46 69 6c 65 50 6f 69 6e . SetFilePoin
81b0: 74 65 72 28 69 64 2d 3e 68 2c 20 6e 42 79 74 65 ter(id->h, nByte
81c0: 2c 20 26 75 70 70 65 72 42 69 74 73 2c 20 46 49 , &upperBits, FI
81d0: 4c 45 5f 42 45 47 49 4e 29 3b 0a 20 20 20 20 53 LE_BEGIN);. S
81e0: 65 74 45 6e 64 4f 66 46 69 6c 65 28 69 64 2d 3e etEndOfFile(id->
81f0: 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e h);. }. return
8200: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 SQLITE_OK;.#end
8210: 69 66 0a 23 69 66 20 4f 53 5f 4d 41 43 0a 23 20 if.#if OS_MAC.#
8220: 69 66 64 65 66 20 5f 4c 41 52 47 45 5f 46 49 4c ifdef _LARGE_FIL
8230: 45 0a 20 20 69 66 28 20 46 53 53 65 74 46 6f 72 E. if( FSSetFor
8240: 6b 53 69 7a 65 28 69 64 2d 3e 72 65 66 4e 75 6d kSize(id->refNum
8250: 2c 20 66 73 46 72 6f 6d 53 74 61 72 74 2c 20 6e , fsFromStart, n
8260: 42 79 74 65 29 20 21 3d 20 6e 6f 45 72 72 29 7b Byte) != noErr){
8270: 0a 23 20 65 6c 73 65 0a 20 20 69 66 28 20 53 65 .# else. if( Se
8280: 74 45 4f 46 28 69 64 2d 3e 72 65 66 4e 75 6d 2c tEOF(id->refNum,
8290: 20 6e 42 79 74 65 29 20 21 3d 20 6e 6f 45 72 72 nByte) != noErr
82a0: 20 29 7b 0a 23 20 65 6e 64 69 66 0a 20 20 20 20 ){.# endif.
82b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f return SQLITE_IO
82c0: 45 52 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 ERR;. }else{.
82d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
82e0: 4f 4b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d OK;. }.#endif.}
82f0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e ../*.** Determin
8300: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 e the current si
8310: 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 ze of a file in
8320: 62 79 74 65 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c bytes.*/.int sql
8330: 69 74 65 4f 73 46 69 6c 65 53 69 7a 65 28 4f 73 iteOsFileSize(Os
8340: 46 69 6c 65 20 2a 69 64 2c 20 6f 66 66 5f 74 20 File *id, off_t
8350: 2a 70 53 69 7a 65 29 7b 0a 23 69 66 20 4f 53 5f *pSize){.#if OS_
8360: 55 4e 49 58 0a 20 20 73 74 72 75 63 74 20 73 74 UNIX. struct st
8370: 61 74 20 62 75 66 3b 0a 20 20 53 69 6d 75 6c 61 at buf;. Simula
8380: 74 65 49 4f 45 72 72 6f 72 28 53 51 4c 49 54 45 teIOError(SQLITE
8390: 5f 49 4f 45 52 52 29 3b 0a 20 20 69 66 28 20 66 _IOERR);. if( f
83a0: 73 74 61 74 28 69 64 2d 3e 66 64 2c 20 26 62 75 stat(id->fd, &bu
83b0: 66 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 f)!=0 ){. ret
83c0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 urn SQLITE_IOERR
83d0: 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d ;. }. *pSize =
83e0: 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 buf.st_size;.
83f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
8400: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f ;.#endif.#if OS_
8410: 57 49 4e 0a 20 20 44 57 4f 52 44 20 75 70 70 65 WIN. DWORD uppe
8420: 72 42 69 74 73 2c 20 6c 6f 77 65 72 42 69 74 73 rBits, lowerBits
8430: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 ;. SimulateIOEr
8440: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 ror(SQLITE_IOERR
8450: 29 3b 0a 20 20 6c 6f 77 65 72 42 69 74 73 20 3d );. lowerBits =
8460: 20 47 65 74 46 69 6c 65 53 69 7a 65 28 69 64 2d GetFileSize(id-
8470: 3e 68 2c 20 26 75 70 70 65 72 42 69 74 73 29 3b >h, &upperBits);
8480: 0a 20 20 2a 70 53 69 7a 65 20 3d 20 28 28 28 6f . *pSize = (((o
8490: 66 66 5f 74 29 75 70 70 65 72 42 69 74 73 29 3c ff_t)upperBits)<
84a0: 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69 74 73 <32) + lowerBits
84b0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 ;. return SQLIT
84c0: 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 E_OK;.#endif.#if
84d0: 20 4f 53 5f 4d 41 43 0a 23 20 69 66 64 65 66 20 OS_MAC.# ifdef
84e0: 5f 4c 41 52 47 45 5f 46 49 4c 45 0a 20 20 69 66 _LARGE_FILE. if
84f0: 28 20 46 53 47 65 74 46 6f 72 6b 53 69 7a 65 28 ( FSGetForkSize(
8500: 69 64 2d 3e 72 65 66 4e 75 6d 2c 20 70 53 69 7a id->refNum, pSiz
8510: 65 29 20 21 3d 20 6e 6f 45 72 72 29 7b 0a 23 20 e) != noErr){.#
8520: 65 6c 73 65 0a 20 20 69 66 28 20 47 65 74 45 4f else. if( GetEO
8530: 46 28 69 64 2d 3e 72 65 66 4e 75 6d 2c 20 70 53 F(id->refNum, pS
8540: 69 7a 65 29 20 21 3d 20 6e 6f 45 72 72 20 29 7b ize) != noErr ){
8550: 0a 23 20 65 6e 64 69 66 0a 20 20 20 20 72 65 74 .# endif. ret
8560: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 urn SQLITE_IOERR
8570: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 ;. }else{. r
8580: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b eturn SQLITE_OK;
8590: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 . }.#endif.}..#
85a0: 69 66 20 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20 if OS_WIN./*.**
85b0: 52 65 74 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e Return true (non
85c0: 2d 7a 65 72 6f 29 20 69 66 20 77 65 20 61 72 65 -zero) if we are
85d0: 20 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57 running under W
85e0: 69 6e 4e 54 2c 20 57 69 6e 32 4b 20 6f 72 20 57 inNT, Win2K or W
85f0: 69 6e 58 50 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 inXP..** Return
8600: 66 61 6c 73 65 20 28 7a 65 72 6f 29 20 66 6f 72 false (zero) for
8610: 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 6f Win95, Win98, o
8620: 72 20 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 r WinME..**.** H
8630: 65 72 65 20 69 73 20 61 6e 20 69 6e 74 65 72 65 ere is an intere
8640: 73 74 69 6e 67 20 6f 62 73 65 72 76 61 74 69 6f sting observatio
8650: 6e 3a 20 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 n: Win95, Win98
8660: 2c 20 61 6e 64 20 57 69 6e 4d 45 20 6c 61 63 6b , and WinME lack
8670: 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 .** the LockFile
8680: 45 78 28 29 20 41 50 49 2e 20 20 42 75 74 20 77 Ex() API. But w
8690: 65 20 63 61 6e 20 73 74 69 6c 6c 20 73 74 61 74 e can still stat
86a0: 69 63 61 6c 6c 79 20 6c 69 6e 6b 20 61 67 61 69 ically link agai
86b0: 6e 73 74 20 74 68 61 74 0a 2a 2a 20 41 50 49 20 nst that.** API
86c0: 61 73 20 6c 6f 6e 67 20 61 73 20 77 65 20 64 6f as long as we do
86d0: 6e 27 74 20 63 61 6c 6c 20 69 74 20 77 69 6e 20 n't call it win
86e0: 72 75 6e 6e 69 6e 67 20 57 69 6e 39 35 2f 39 38 running Win95/98
86f0: 2f 4d 45 2e 20 20 41 20 63 61 6c 6c 20 74 6f 0a /ME. A call to.
8700: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 ** this routine
8710: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 is used to deter
8720: 6d 69 6e 65 20 69 66 20 74 68 65 20 68 6f 73 74 mine if the host
8730: 20 69 73 20 57 69 6e 39 35 2f 39 38 2f 4d 45 20 is Win95/98/ME
8740: 6f 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58 or.** WinNT/2K/X
8750: 50 20 73 6f 20 74 68 61 74 20 77 65 20 77 69 6c P so that we wil
8760: 6c 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f l know whether o
8770: 72 20 6e 6f 74 20 77 65 20 63 61 6e 20 73 61 66 r not we can saf
8780: 65 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74 68 65 20 ely call.** the
8790: 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 LockFileEx() API
87a0: 2e 0a 2a 2f 0a 69 6e 74 20 69 73 4e 54 28 76 6f ..*/.int isNT(vo
87b0: 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e id){. static in
87c0: 74 20 6f 73 54 79 70 65 20 3d 20 30 3b 20 20 20 t osType = 0;
87d0: 2f 2a 20 30 3d 75 6e 6b 6e 6f 77 6e 20 31 3d 77 /* 0=unknown 1=w
87e0: 69 6e 39 35 20 32 3d 77 69 6e 4e 54 20 2a 2f 0a in95 2=winNT */.
87f0: 20 20 69 66 28 20 6f 73 54 79 70 65 3d 3d 30 20 if( osType==0
8800: 29 7b 0a 20 20 20 20 4f 53 56 45 52 53 49 4f 4e ){. OSVERSION
8810: 49 4e 46 4f 20 73 49 6e 66 6f 3b 0a 20 20 20 20 INFO sInfo;.
8820: 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72 73 69 6f sInfo.dwOSVersio
8830: 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73 69 7a 65 nInfoSize = size
8840: 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20 20 20 47 of(sInfo);. G
8850: 65 74 56 65 72 73 69 6f 6e 45 78 28 26 73 49 6e etVersionEx(&sIn
8860: 66 6f 29 3b 0a 20 20 20 20 6f 73 54 79 70 65 20 fo);. osType
8870: 3d 20 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f = sInfo.dwPlatfo
8880: 72 6d 49 64 3d 3d 56 45 52 5f 50 4c 41 54 46 4f rmId==VER_PLATFO
8890: 52 4d 5f 57 49 4e 33 32 5f 4e 54 20 3f 20 32 20 RM_WIN32_NT ? 2
88a0: 3a 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 : 1;. }. retur
88b0: 6e 20 6f 73 54 79 70 65 3d 3d 32 3b 0a 7d 0a 23 n osType==2;.}.#
88c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e endif../*.** Win
88d0: 64 6f 77 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e dows file lockin
88e0: 67 20 6e 6f 74 65 73 3a 20 20 5b 73 69 6d 69 6c g notes: [simil
88f0: 61 72 20 69 73 73 75 65 73 20 61 70 70 6c 79 20 ar issues apply
8900: 74 6f 20 4d 61 63 4f 53 5d 0a 2a 2a 0a 2a 2a 20 to MacOS].**.**
8910: 57 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 4c 6f We cannot use Lo
8920: 63 6b 46 69 6c 65 45 78 28 29 20 6f 72 20 55 6e ckFileEx() or Un
8930: 6c 6f 63 6b 46 69 6c 65 45 78 28 29 20 6f 6e 20 lockFileEx() on
8940: 57 69 6e 39 35 2f 39 38 2f 4d 45 20 62 65 63 61 Win95/98/ME beca
8950: 75 73 65 0a 2a 2a 20 74 68 6f 73 65 20 66 75 6e use.** those fun
8960: 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 61 ctions are not a
8970: 76 61 69 6c 61 62 6c 65 2e 20 20 53 6f 20 77 65 vailable. So we
8980: 20 75 73 65 20 6f 6e 6c 79 20 4c 6f 63 6b 46 69 use only LockFi
8990: 6c 65 28 29 20 61 6e 64 0a 2a 2a 20 55 6e 6c 6f le() and.** Unlo
89a0: 63 6b 46 69 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 ckFile()..**.**
89b0: 4c 6f 63 6b 46 69 6c 65 28 29 20 70 72 65 76 65 LockFile() preve
89c0: 6e 74 73 20 6e 6f 74 20 6a 75 73 74 20 77 72 69 nts not just wri
89d0: 74 69 6e 67 20 62 75 74 20 61 6c 73 6f 20 72 65 ting but also re
89e0: 61 64 69 6e 67 20 62 79 20 6f 74 68 65 72 20 70 ading by other p
89f0: 72 6f 63 65 73 73 65 73 2e 0a 2a 2a 20 28 54 68 rocesses..** (Th
8a00: 69 73 20 69 73 20 61 20 64 65 73 69 67 6e 20 65 is is a design e
8a10: 72 72 6f 72 20 6f 6e 20 74 68 65 20 70 61 72 74 rror on the part
8a20: 20 6f 66 20 57 69 6e 64 6f 77 73 2c 20 62 75 74 of Windows, but
8a30: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e there is nothin
8a40: 67 0a 2a 2a 20 77 65 20 63 61 6e 20 64 6f 20 61 g.** we can do a
8a50: 62 6f 75 74 20 74 68 61 74 2e 29 20 20 53 6f 20 bout that.) So
8a60: 74 68 65 20 72 65 67 69 6f 6e 20 75 73 65 64 20 the region used
8a70: 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 for locking is a
8a80: 74 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 t the.** end of
8a90: 74 68 65 20 66 69 6c 65 20 77 68 65 72 65 20 69 the file where i
8aa0: 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f t is unlikely to
8ab0: 20 65 76 65 72 20 69 6e 74 65 72 66 65 72 65 20 ever interfere
8ac0: 77 69 74 68 20 61 6e 0a 2a 2a 20 61 63 74 75 61 with an.** actua
8ad0: 6c 20 72 65 61 64 20 61 74 74 65 6d 70 74 2e 0a l read attempt..
8ae0: 2a 2a 0a 2a 2a 20 41 20 64 61 74 61 62 61 73 65 **.** A database
8af0: 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 6f 62 read lock is ob
8b00: 74 61 69 6e 65 64 20 62 79 20 6c 6f 63 6b 69 6e tained by lockin
8b10: 67 20 61 20 73 69 6e 67 6c 65 20 72 61 6e 64 6f g a single rando
8b20: 6d 6c 79 2d 63 68 6f 73 65 6e 20 0a 2a 2a 20 62 mly-chosen .** b
8b30: 79 74 65 20 6f 75 74 20 6f 66 20 61 20 73 70 65 yte out of a spe
8b40: 63 69 66 69 63 20 72 61 6e 67 65 20 6f 66 20 62 cific range of b
8b50: 79 74 65 73 2e 20 54 68 65 20 6c 6f 63 6b 20 62 ytes. The lock b
8b60: 79 74 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 yte is obtained
8b70: 61 74 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 73 6f at .** random so
8b80: 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 72 65 two separate re
8b90: 61 64 65 72 73 20 63 61 6e 20 70 72 6f 62 61 62 aders can probab
8ba0: 6c 79 20 61 63 63 65 73 73 20 74 68 65 20 66 69 ly access the fi
8bb0: 6c 65 20 61 74 20 74 68 65 20 0a 2a 2a 20 73 61 le at the .** sa
8bc0: 6d 65 20 74 69 6d 65 2c 20 75 6e 6c 65 73 73 20 me time, unless
8bd0: 74 68 65 79 20 61 72 65 20 75 6e 6c 75 63 6b 79 they are unlucky
8be0: 20 61 6e 64 20 63 68 6f 6f 73 65 20 74 68 65 20 and choose the
8bf0: 73 61 6d 65 20 6c 6f 63 6b 20 62 79 74 65 2e 0a same lock byte..
8c00: 2a 2a 20 41 20 64 61 74 61 62 61 73 65 20 77 72 ** A database wr
8c10: 69 74 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 ite lock is obta
8c20: 69 6e 65 64 20 62 79 20 6c 6f 63 6b 69 6e 67 20 ined by locking
8c30: 61 6c 6c 20 62 79 74 65 73 20 69 6e 20 74 68 65 all bytes in the
8c40: 20 72 61 6e 67 65 2e 0a 2a 2a 20 54 68 65 72 65 range..** There
8c50: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 6f 6e 65 can only be one
8c60: 20 77 72 69 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 writer..**.** A
8c70: 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 lock is obtaine
8c80: 64 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 62 d on the first b
8c90: 79 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 yte of the lock
8ca0: 72 61 6e 67 65 20 62 65 66 6f 72 65 20 61 63 71 range before acq
8cb0: 75 69 72 69 6e 67 0a 2a 2a 20 65 69 74 68 65 72 uiring.** either
8cc0: 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 72 20 a read lock or
8cd0: 61 20 77 72 69 74 65 20 6c 6f 63 6b 2e 20 20 54 a write lock. T
8ce0: 68 69 73 20 70 72 65 76 65 6e 74 73 20 74 77 6f his prevents two
8cf0: 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a processes from.
8d00: 2a 2a 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f ** attempting to
8d10: 20 67 65 74 20 61 20 6c 6f 63 6b 20 61 74 20 61 get a lock at a
8d20: 20 73 61 6d 65 20 74 69 6d 65 2e 20 20 54 68 65 same time. The
8d30: 20 73 65 6d 61 6e 74 69 63 73 20 6f 66 20 0a 2a semantics of .*
8d40: 2a 20 73 71 6c 69 74 65 4f 73 52 65 61 64 4c 6f * sqliteOsReadLo
8d50: 63 6b 28 29 20 72 65 71 75 69 72 65 20 74 68 61 ck() require tha
8d60: 74 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6c t if there is al
8d70: 72 65 61 64 79 20 61 20 77 72 69 74 65 20 6c 6f ready a write lo
8d80: 63 6b 2c 20 74 68 61 74 0a 2a 2a 20 6c 6f 63 6b ck, that.** lock
8d90: 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e is converted in
8da0: 74 6f 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 to a read lock a
8db0: 74 6f 6d 69 63 61 6c 6c 79 2e 20 20 54 68 65 20 tomically. The
8dc0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 72 73 lock on the firs
8dd0: 74 0a 2a 2a 20 62 79 74 65 20 61 6c 6c 6f 77 73 t.** byte allows
8de0: 20 75 73 20 74 6f 20 64 72 6f 70 20 74 68 65 20 us to drop the
8df0: 6f 6c 64 20 77 72 69 74 65 20 6c 6f 63 6b 20 61 old write lock a
8e00: 6e 64 20 67 65 74 20 74 68 65 20 72 65 61 64 20 nd get the read
8e10: 6c 6f 63 6b 20 77 69 74 68 6f 75 74 0a 2a 2a 20 lock without.**
8e20: 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 another process
8e30: 6a 75 6d 70 69 6e 67 20 69 6e 74 6f 20 74 68 65 jumping into the
8e40: 20 6d 69 64 64 6c 65 20 61 6e 64 20 6d 65 73 73 middle and mess
8e50: 69 6e 67 20 75 73 20 75 70 2e 20 20 54 68 65 20 ing us up. The
8e60: 73 61 6d 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 same.** argument
8e70: 20 61 70 70 6c 69 65 73 20 74 6f 20 73 71 6c 69 applies to sqli
8e80: 74 65 4f 73 57 72 69 74 65 4c 6f 63 6b 28 29 2e teOsWriteLock().
8e90: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 57 69 6e 4e 54 2f .**.** On WinNT/
8ea0: 32 4b 2f 58 50 20 73 79 73 74 65 6d 73 2c 20 4c 2K/XP systems, L
8eb0: 6f 63 6b 46 69 6c 65 45 78 28 29 20 61 6e 64 20 ockFileEx() and
8ec0: 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 29 20 61 UnlockFileEx() a
8ed0: 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 0a 2a 2a re available,.**
8ee0: 20 77 68 69 63 68 20 6d 65 61 6e 73 20 77 65 20 which means we
8ef0: 63 61 6e 20 75 73 65 20 72 65 61 64 65 72 2f 77 can use reader/w
8f00: 72 69 74 65 72 20 6c 6f 63 6b 73 2e 20 20 57 68 riter locks. Wh
8f10: 65 6e 20 72 65 61 64 65 72 20 77 72 69 74 65 72 en reader writer
8f20: 20 6c 6f 63 6b 73 0a 2a 2a 20 61 72 65 20 75 73 locks.** are us
8f30: 65 64 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 ed, the lock is
8f40: 70 6c 61 63 65 64 20 6f 6e 20 74 68 65 20 73 61 placed on the sa
8f50: 6d 65 20 72 61 6e 67 65 20 6f 66 20 62 79 74 65 me range of byte
8f60: 73 20 74 68 61 74 20 69 73 20 75 73 65 64 0a 2a s that is used.*
8f70: 2a 20 66 6f 72 20 70 72 6f 62 61 62 69 6c 69 73 * for probabilis
8f80: 74 69 63 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 57 tic locking in W
8f90: 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 48 65 6e in95/98/ME. Hen
8fa0: 63 65 2c 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 ce, the locking
8fb0: 73 63 68 65 6d 65 0a 2a 2a 20 77 69 6c 6c 20 73 scheme.** will s
8fc0: 75 70 70 6f 72 74 20 74 77 6f 20 6f 72 20 6d 6f upport two or mo
8fd0: 72 65 20 57 69 6e 39 35 20 72 65 61 64 65 72 73 re Win95 readers
8fe0: 20 6f 72 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 or two or more
8ff0: 57 69 6e 4e 54 20 72 65 61 64 65 72 73 2e 0a 2a WinNT readers..*
9000: 2a 20 42 75 74 20 61 20 73 69 6e 67 6c 65 20 57 * But a single W
9010: 69 6e 39 35 20 72 65 61 64 65 72 20 77 69 6c 6c in95 reader will
9020: 20 6c 6f 63 6b 20 6f 75 74 20 61 6c 6c 20 57 69 lock out all Wi
9030: 6e 4e 54 20 72 65 61 64 65 72 73 20 61 6e 64 20 nNT readers and
9040: 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 57 69 6e 4e a single.** WinN
9050: 54 20 72 65 61 64 65 72 20 77 69 6c 6c 20 6c 6f T reader will lo
9060: 63 6b 20 6f 75 74 20 61 6c 6c 20 6f 74 68 65 72 ck out all other
9070: 20 57 69 6e 39 35 20 72 65 61 64 65 72 73 2e 0a Win95 readers..
9080: 2a 2a 0a 2a 2a 20 4e 6f 74 65 3a 20 4f 6e 20 4d **.** Note: On M
9090: 61 63 4f 53 20 77 65 20 75 73 65 20 74 68 65 20 acOS we use the
90a0: 72 65 73 6f 75 72 63 65 20 66 6f 72 6b 20 66 6f resource fork fo
90b0: 72 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a r locking..**.**
90c0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 23 The following #
90d0: 64 65 66 69 6e 65 73 20 73 70 65 63 69 66 79 20 defines specify
90e0: 74 68 65 20 72 61 6e 67 65 20 6f 66 20 62 79 74 the range of byt
90f0: 65 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b es used for lock
9100: 69 6e 67 2e 0a 2a 2a 20 4e 5f 4c 4f 43 4b 42 59 ing..** N_LOCKBY
9110: 54 45 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 TE is the number
9120: 20 6f 66 20 62 79 74 65 73 20 61 76 61 69 6c 61 of bytes availa
9130: 62 6c 65 20 66 6f 72 20 64 6f 69 6e 67 20 74 68 ble for doing th
9140: 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 20 54 68 e locking..** Th
9150: 65 20 66 69 72 73 74 20 62 79 74 65 20 75 73 65 e first byte use
9160: 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6c 6f d to hold the lo
9170: 63 6b 20 77 68 69 6c 65 20 74 68 65 20 6c 6f 63 ck while the loc
9180: 6b 20 69 73 20 63 68 61 6e 67 69 6e 67 20 64 6f k is changing do
9190: 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 75 6e 74 20 es.** not count
91a0: 74 6f 77 61 72 64 20 74 68 69 73 20 6e 75 6d 62 toward this numb
91b0: 65 72 2e 20 20 46 49 52 53 54 5f 4c 4f 43 4b 42 er. FIRST_LOCKB
91c0: 59 54 45 20 69 73 20 74 68 65 20 61 64 64 72 65 YTE is the addre
91d0: 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69 72 ss of.** the fir
91e0: 73 74 20 62 79 74 65 20 69 6e 20 74 68 65 20 72 st byte in the r
91f0: 61 6e 67 65 20 6f 66 20 62 79 74 65 73 20 75 73 ange of bytes us
9200: 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 2e 0a ed for locking..
9210: 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 4c 4f 43 */.#define N_LOC
9220: 4b 42 59 54 45 20 20 20 20 20 20 20 31 30 32 33 KBYTE 1023
9230: 39 0a 23 69 66 20 4f 53 5f 4d 41 43 0a 23 20 64 9.#if OS_MAC.# d
9240: 65 66 69 6e 65 20 46 49 52 53 54 5f 4c 4f 43 4b efine FIRST_LOCK
9250: 42 59 54 45 20 20 20 28 30 78 30 30 30 66 66 66 BYTE (0x000fff
9260: 66 66 20 2d 20 4e 5f 4c 4f 43 4b 42 59 54 45 29 ff - N_LOCKBYTE)
9270: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 .#else.# define
9280: 46 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45 20 20 FIRST_LOCKBYTE
9290: 20 28 30 78 66 66 66 66 66 66 66 66 20 2d 20 4e (0xffffffff - N
92a0: 5f 4c 4f 43 4b 42 59 54 45 29 0a 23 65 6e 64 69 _LOCKBYTE).#endi
92b0: 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 f../*.** Change
92c0: 74 68 65 20 73 74 61 74 75 73 20 6f 66 20 74 68 the status of th
92d0: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 e lock on the fi
92e0: 6c 65 20 22 69 64 22 20 74 6f 20 62 65 20 61 20 le "id" to be a
92f0: 72 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 20 49 66 20 readlock..** If
9300: 74 68 65 20 66 69 6c 65 20 77 61 73 20 77 72 69 the file was wri
9310: 74 65 20 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 te locked, then
9320: 74 68 69 73 20 72 65 64 75 63 65 73 20 74 68 65 this reduces the
9330: 20 6c 6f 63 6b 20 74 6f 20 61 20 72 65 61 64 2e lock to a read.
9340: 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 .** If the file
9350: 77 61 73 20 72 65 61 64 20 6c 6f 63 6b 65 64 2c was read locked,
9360: 20 74 68 65 6e 20 74 68 69 73 20 61 63 71 75 69 then this acqui
9370: 72 65 73 20 61 20 6e 65 77 20 72 65 61 64 20 6c res a new read l
9380: 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 ock..**.** Retur
9390: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 n SQLITE_OK on s
93a0: 75 63 63 65 73 73 20 61 6e 64 20 53 51 4c 49 54 uccess and SQLIT
93b0: 45 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c 75 72 E_BUSY on failur
93c0: 65 2e 20 20 49 66 20 74 68 69 73 0a 2a 2a 20 6c e. If this.** l
93d0: 69 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69 ibrary was compi
93e0: 6c 65 64 20 77 69 74 68 20 6c 61 72 67 65 20 66 led with large f
93f0: 69 6c 65 20 73 75 70 70 6f 72 74 20 28 4c 46 53 ile support (LFS
9400: 29 20 62 75 74 20 4c 46 53 20 69 73 20 6e 6f 74 ) but LFS is not
9410: 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e .** available on
9420: 20 74 68 65 20 68 6f 73 74 2c 20 74 68 65 6e 20 the host, then
9430: 61 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 an SQLITE_NOLFS
9440: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a is returned..*/.
9450: 69 6e 74 20 73 71 6c 69 74 65 4f 73 52 65 61 64 int sqliteOsRead
9460: 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 29 Lock(OsFile *id)
9470: 7b 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a 20 20 {.#if OS_UNIX.
9480: 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 int rc;. sqlite
9490: 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a OsEnterMutex();.
94a0: 20 20 69 66 28 20 69 64 2d 3e 70 4c 6f 63 6b 2d if( id->pLock-
94b0: 3e 63 6e 74 3e 30 20 29 7b 0a 20 20 20 20 69 66 >cnt>0 ){. if
94c0: 28 20 21 69 64 2d 3e 6c 6f 63 6b 65 64 20 29 7b ( !id->locked ){
94d0: 0a 20 20 20 20 20 20 69 64 2d 3e 70 4c 6f 63 6b . id->pLock
94e0: 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 ->cnt++;. i
94f0: 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20 31 3b 0a 20 d->locked = 1;.
9500: 20 20 20 20 20 69 64 2d 3e 70 4f 70 65 6e 2d 3e id->pOpen->
9510: 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 nLock++;. }.
9520: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f rc = SQLITE_O
9530: 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 K;. }else if( i
9540: 64 2d 3e 6c 6f 63 6b 65 64 20 7c 7c 20 69 64 2d d->locked || id-
9550: 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 >pLock->cnt==0 )
9560: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f {. struct flo
9570: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 69 6e 74 ck lock;. int
9580: 20 73 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 s;. lock.l_t
9590: 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 ype = F_RDLCK;.
95a0: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 lock.l_whence
95b0: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 = SEEK_SET;.
95c0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 lock.l_start =
95d0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b lock.l_len = 0L;
95e0: 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 69 . s = fcntl(i
95f0: 64 2d 3e 66 64 2c 20 46 5f 53 45 54 4c 4b 2c 20 d->fd, F_SETLK,
9600: 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 &lock);. if(
9610: 73 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 s!=0 ){. rc
9620: 20 3d 20 28 65 72 72 6e 6f 3d 3d 45 49 4e 56 41 = (errno==EINVA
9630: 4c 29 20 3f 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 L) ? SQLITE_NOLF
9640: 53 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b S : SQLITE_BUSY;
9650: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 . }else{.
9660: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b rc = SQLITE_OK
9670: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 69 64 2d ;. if( !id-
9680: 3e 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 >locked ){.
9690: 20 20 20 69 64 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c id->pOpen->nL
96a0: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 ock++;. i
96b0: 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20 31 3b 0a 20 d->locked = 1;.
96c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 64 2d }. id-
96d0: 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 31 3b >pLock->cnt = 1;
96e0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a . }. }else{.
96f0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f rc = SQLITE_
9700: 42 55 53 59 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 BUSY;. }. sqli
9710: 74 65 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 teOsLeaveMutex()
9720: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 ;. return rc;.#
9730: 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 49 4e endif.#if OS_WIN
9740: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 . int rc;. if(
9750: 20 69 64 2d 3e 6c 6f 63 6b 65 64 3e 30 20 29 7b id->locked>0 ){
9760: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 . rc = SQLITE
9770: 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 _OK;. }else{.
9780: 20 20 69 6e 74 20 6c 6b 3b 0a 20 20 20 20 69 6e int lk;. in
9790: 74 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 63 t res;. int c
97a0: 6e 74 20 3d 20 31 30 30 3b 0a 20 20 20 20 73 71 nt = 100;. sq
97b0: 6c 69 74 65 52 61 6e 64 6f 6d 6e 65 73 73 28 73 liteRandomness(s
97c0: 69 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b izeof(lk), &lk);
97d0: 0a 20 20 20 20 6c 6b 20 3d 20 28 6c 6b 20 26 20 . lk = (lk &
97e0: 30 78 37 66 66 66 66 66 66 66 29 25 4e 5f 4c 4f 0x7fffffff)%N_LO
97f0: 43 4b 42 59 54 45 20 2b 20 31 3b 0a 20 20 20 20 CKBYTE + 1;.
9800: 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e 30 20 26 while( cnt-->0 &
9810: 26 20 28 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c & (res = LockFil
9820: 65 28 69 64 2d 3e 68 2c 20 46 49 52 53 54 5f 4c e(id->h, FIRST_L
9830: 4f 43 4b 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 OCKBYTE, 0, 1, 0
9840: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 ))==0 ){. S
9850: 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 leep(1);. }.
9860: 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 if( res ){.
9870: 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 69 UnlockFile(i
9880: 64 2d 3e 68 2c 20 46 49 52 53 54 5f 4c 4f 43 4b d->h, FIRST_LOCK
9890: 42 59 54 45 2b 31 2c 20 30 2c 20 4e 5f 4c 4f 43 BYTE+1, 0, N_LOC
98a0: 4b 42 59 54 45 2c 20 30 29 3b 0a 20 20 20 20 20 KBYTE, 0);.
98b0: 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 if( isNT() ){.
98c0: 20 20 20 20 20 20 20 4f 56 45 52 4c 41 50 50 45 OVERLAPPE
98d0: 44 20 6f 76 6c 70 3b 0a 20 20 20 20 20 20 20 20 D ovlp;.
98e0: 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 46 49 ovlp.Offset = FI
98f0: 52 53 54 5f 4c 4f 43 4b 42 59 54 45 2b 31 3b 0a RST_LOCKBYTE+1;.
9900: 20 20 20 20 20 20 20 20 6f 76 6c 70 2e 4f 66 66 ovlp.Off
9910: 73 65 74 48 69 67 68 20 3d 20 30 3b 0a 20 20 20 setHigh = 0;.
9920: 20 20 20 20 20 6f 76 6c 70 2e 68 45 76 65 6e 74 ovlp.hEvent
9930: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 = 0;. re
9940: 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 45 78 28 69 s = LockFileEx(i
9950: 64 2d 3e 68 2c 20 4c 4f 43 4b 46 49 4c 45 5f 46 d->h, LOCKFILE_F
9960: 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 2c AIL_IMMEDIATELY,
9970: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
9980: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 4e 0, N
9990: 5f 4c 4f 43 4b 42 59 54 45 2c 20 30 2c 20 26 6f _LOCKBYTE, 0, &o
99a0: 76 6c 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 vlp);. }els
99b0: 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d e{. res =
99c0: 20 4c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c LockFile(id->h,
99d0: 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45 2b FIRST_LOCKBYTE+
99e0: 6c 6b 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 lk, 0, 1, 0);.
99f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 55 6e 6c 6f }. Unlo
9a00: 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20 46 49 ckFile(id->h, FI
9a10: 52 53 54 5f 4c 4f 43 4b 42 59 54 45 2c 20 30 2c RST_LOCKBYTE, 0,
9a20: 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 1, 0);. }.
9a30: 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 if( res ){.
9a40: 20 20 20 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20 id->locked =
9a50: 6c 6b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 lk;. rc = S
9a60: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 QLITE_OK;. }e
9a70: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 lse{. rc =
9a80: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 SQLITE_BUSY;.
9a90: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 }. }. return
9aa0: 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f rc;.#endif.#if O
9ab0: 53 5f 4d 41 43 0a 20 20 69 6e 74 20 72 63 3b 0a S_MAC. int rc;.
9ac0: 20 20 69 66 28 20 69 64 2d 3e 6c 6f 63 6b 65 64 if( id->locked
9ad0: 3e 30 20 7c 7c 20 69 64 2d 3e 72 65 66 4e 75 6d >0 || id->refNum
9ae0: 52 46 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 RF == -1 ){.
9af0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a rc = SQLITE_OK;.
9b00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 }else{. int
9b10: 20 6c 6b 3b 0a 20 20 20 20 4f 53 45 72 72 20 72 lk;. OSErr r
9b20: 65 73 3b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 es;. int cnt
9b30: 3d 20 35 3b 0a 20 20 20 20 50 61 72 61 6d 42 6c = 5;. ParamBl
9b40: 6f 63 6b 52 65 63 20 70 61 72 61 6d 73 3b 0a 20 ockRec params;.
9b50: 20 20 20 73 71 6c 69 74 65 52 61 6e 64 6f 6d 6e sqliteRandomn
9b60: 65 73 73 28 73 69 7a 65 6f 66 28 6c 6b 29 2c 20 ess(sizeof(lk),
9b70: 26 6c 6b 29 3b 0a 20 20 20 20 6c 6b 20 3d 20 28 &lk);. lk = (
9b80: 6c 6b 20 26 20 30 78 37 66 66 66 66 66 66 66 29 lk & 0x7fffffff)
9b90: 25 4e 5f 4c 4f 43 4b 42 59 54 45 20 2b 20 31 3b %N_LOCKBYTE + 1;
9ba0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 61 72 . memset(&par
9bb0: 61 6d 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 ams, 0, sizeof(p
9bc0: 61 72 61 6d 73 29 29 3b 0a 20 20 20 20 70 61 72 arams));. par
9bd0: 61 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f 52 65 ams.ioParam.ioRe
9be0: 66 4e 75 6d 20 3d 20 69 64 2d 3e 72 65 66 4e 75 fNum = id->refNu
9bf0: 6d 52 46 3b 0a 20 20 20 20 70 61 72 61 6d 73 2e mRF;. params.
9c00: 69 6f 50 61 72 61 6d 2e 69 6f 50 6f 73 4d 6f 64 ioParam.ioPosMod
9c10: 65 20 3d 20 66 73 46 72 6f 6d 53 74 61 72 74 3b e = fsFromStart;
9c20: 0a 20 20 20 20 70 61 72 61 6d 73 2e 69 6f 50 61 . params.ioPa
9c30: 72 61 6d 2e 69 6f 50 6f 73 4f 66 66 73 65 74 20 ram.ioPosOffset
9c40: 3d 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45 = FIRST_LOCKBYTE
9c50: 3b 0a 20 20 20 20 70 61 72 61 6d 73 2e 69 6f 50 ;. params.ioP
9c60: 61 72 61 6d 2e 69 6f 52 65 71 43 6f 75 6e 74 20 aram.ioReqCount
9c70: 3d 20 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 = 1;. while(
9c80: 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65 73 20 cnt-->0 && (res
9c90: 3d 20 50 42 4c 6f 63 6b 52 61 6e 67 65 53 79 6e = PBLockRangeSyn
9ca0: 63 28 26 70 61 72 61 6d 73 29 29 21 3d 6e 6f 45 c(¶ms))!=noE
9cb0: 72 72 20 29 7b 0a 20 20 20 20 20 20 55 49 6e 74 rr ){. UInt
9cc0: 33 32 20 66 69 6e 61 6c 54 69 63 6b 73 3b 0a 20 32 finalTicks;.
9cd0: 20 20 20 20 20 44 65 6c 61 79 28 31 2c 20 26 66 Delay(1, &f
9ce0: 69 6e 61 6c 54 69 63 6b 73 29 3b 20 2f 2a 20 31 inalTicks); /* 1
9cf0: 2f 36 30 20 73 65 63 20 2a 2f 0a 20 20 20 20 7d /60 sec */. }
9d00: 0a 20 20 20 20 69 66 28 20 72 65 73 20 3d 3d 20 . if( res ==
9d10: 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20 70 noErr ){. p
9d20: 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f arams.ioParam.io
9d30: 50 6f 73 4f 66 66 73 65 74 20 3d 20 46 49 52 53 PosOffset = FIRS
9d40: 54 5f 4c 4f 43 4b 42 59 54 45 2b 31 3b 0a 20 20 T_LOCKBYTE+1;.
9d50: 20 20 20 20 70 61 72 61 6d 73 2e 69 6f 50 61 72 params.ioPar
9d60: 61 6d 2e 69 6f 52 65 71 43 6f 75 6e 74 20 3d 20 am.ioReqCount =
9d70: 4e 5f 4c 4f 43 4b 42 59 54 45 3b 0a 20 20 20 20 N_LOCKBYTE;.
9d80: 20 20 50 42 55 6e 6c 6f 63 6b 52 61 6e 67 65 53 PBUnlockRangeS
9d90: 79 6e 63 28 26 70 61 72 61 6d 73 29 3b 0a 20 20 ync(¶ms);.
9da0: 20 20 20 20 70 61 72 61 6d 73 2e 69 6f 50 61 72 params.ioPar
9db0: 61 6d 2e 69 6f 50 6f 73 4f 66 66 73 65 74 20 3d am.ioPosOffset =
9dc0: 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45 2b FIRST_LOCKBYTE+
9dd0: 6c 6b 3b 0a 20 20 20 20 20 20 70 61 72 61 6d 73 lk;. params
9de0: 2e 69 6f 50 61 72 61 6d 2e 69 6f 52 65 71 43 6f .ioParam.ioReqCo
9df0: 75 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 unt = 1;. r
9e00: 65 73 20 3d 20 50 42 4c 6f 63 6b 52 61 6e 67 65 es = PBLockRange
9e10: 53 79 6e 63 28 26 70 61 72 61 6d 73 29 3b 0a 20 Sync(¶ms);.
9e20: 20 20 20 20 20 70 61 72 61 6d 73 2e 69 6f 50 61 params.ioPa
9e30: 72 61 6d 2e 69 6f 50 6f 73 4f 66 66 73 65 74 20 ram.ioPosOffset
9e40: 3d 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45 = FIRST_LOCKBYTE
9e50: 3b 0a 20 20 20 20 20 20 70 61 72 61 6d 73 2e 69 ;. params.i
9e60: 6f 50 61 72 61 6d 2e 69 6f 52 65 71 43 6f 75 6e oParam.ioReqCoun
9e70: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 50 42 55 t = 1;. PBU
9e80: 6e 6c 6f 63 6b 52 61 6e 67 65 53 79 6e 63 28 26 nlockRangeSync(&
9e90: 70 61 72 61 6d 73 29 3b 0a 20 20 20 20 7d 0a 20 params);. }.
9ea0: 20 20 20 69 66 28 20 72 65 73 20 3d 3d 20 6e 6f if( res == no
9eb0: 45 72 72 20 29 7b 0a 20 20 20 20 20 20 69 64 2d Err ){. id-
9ec0: 3e 6c 6f 63 6b 65 64 20 3d 20 6c 6b 3b 0a 20 20 >locked = lk;.
9ed0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f rc = SQLITE_
9ee0: 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 OK;. }else{.
9ef0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 rc = SQLITE
9f00: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 7d _BUSY;. }. }
9f10: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 . return rc;.#e
9f20: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 ndif.}../*.** Ch
9f30: 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 ange the lock st
9f40: 61 74 75 73 20 74 6f 20 62 65 20 61 6e 20 65 78 atus to be an ex
9f50: 63 6c 75 73 69 76 65 20 6f 72 20 77 72 69 74 65 clusive or write
9f60: 20 6c 6f 63 6b 2e 20 20 52 65 74 75 72 6e 0a 2a lock. Return.*
9f70: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 * SQLITE_OK on s
9f80: 75 63 63 65 73 73 20 61 6e 64 20 53 51 4c 49 54 uccess and SQLIT
9f90: 45 5f 42 55 53 59 20 6f 6e 20 61 20 66 61 69 6c E_BUSY on a fail
9fa0: 75 72 65 2e 20 20 49 66 20 74 68 69 73 0a 2a 2a ure. If this.**
9fb0: 20 6c 69 62 72 61 72 79 20 77 61 73 20 63 6f 6d library was com
9fc0: 70 69 6c 65 64 20 77 69 74 68 20 6c 61 72 67 65 piled with large
9fd0: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 28 4c file support (L
9fe0: 46 53 29 20 62 75 74 20 4c 46 53 20 69 73 20 6e FS) but LFS is n
9ff0: 6f 74 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 ot.** available
a000: 6f 6e 20 74 68 65 20 68 6f 73 74 2c 20 74 68 65 on the host, the
a010: 6e 20 61 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 n an SQLITE_NOLF
a020: 53 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a S is returned..*
a030: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 57 72 /.int sqliteOsWr
a040: 69 74 65 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a iteLock(OsFile *
a050: 69 64 29 7b 0a 23 69 66 20 4f 53 5f 55 4e 49 58 id){.#if OS_UNIX
a060: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c . int rc;. sql
a070: 69 74 65 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 iteOsEnterMutex(
a080: 29 3b 0a 20 20 69 66 28 20 69 64 2d 3e 70 4c 6f );. if( id->pLo
a090: 63 6b 2d 3e 63 6e 74 3d 3d 30 20 7c 7c 20 28 69 ck->cnt==0 || (i
a0a0: 64 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 31 d->pLock->cnt==1
a0b0: 20 26 26 20 69 64 2d 3e 6c 6f 63 6b 65 64 3d 3d && id->locked==
a0c0: 31 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 1) ){. struct
a0d0: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 flock lock;.
a0e0: 20 69 6e 74 20 73 3b 0a 20 20 20 20 6c 6f 63 6b int s;. lock
a0f0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 .l_type = F_WRLC
a100: 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 K;. lock.l_wh
a110: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b ence = SEEK_SET;
a120: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 . lock.l_star
a130: 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d t = lock.l_len =
a140: 20 30 4c 3b 0a 20 20 20 20 73 20 3d 20 66 63 6e 0L;. s = fcn
a150: 74 6c 28 69 64 2d 3e 66 64 2c 20 46 5f 53 45 54 tl(id->fd, F_SET
a160: 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 LK, &lock);.
a170: 69 66 28 20 73 21 3d 30 20 29 7b 0a 20 20 20 20 if( s!=0 ){.
a180: 20 20 72 63 20 3d 20 28 65 72 72 6e 6f 3d 3d 45 rc = (errno==E
a190: 49 4e 56 41 4c 29 20 3f 20 53 51 4c 49 54 45 5f INVAL) ? SQLITE_
a1a0: 4e 4f 4c 46 53 20 3a 20 53 51 4c 49 54 45 5f 42 NOLFS : SQLITE_B
a1b0: 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a USY;. }else{.
a1c0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 rc = SQLIT
a1d0: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 E_OK;. if(
a1e0: 21 69 64 2d 3e 6c 6f 63 6b 65 64 20 29 7b 0a 20 !id->locked ){.
a1f0: 20 20 20 20 20 20 20 69 64 2d 3e 70 4f 70 65 6e id->pOpen
a200: 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 ->nLock++;.
a210: 20 20 20 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20 id->locked =
a220: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 1;. }.
a230: 20 69 64 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 20 id->pLock->cnt
a240: 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 = -1;. }. }e
a250: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 lse{. rc = SQ
a260: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 LITE_BUSY;. }.
a270: 20 73 71 6c 69 74 65 4f 73 4c 65 61 76 65 4d 75 sqliteOsLeaveMu
a280: 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 tex();. return
a290: 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f rc;.#endif.#if O
a2a0: 53 5f 57 49 4e 0a 20 20 69 6e 74 20 72 63 3b 0a S_WIN. int rc;.
a2b0: 20 20 69 66 28 20 69 64 2d 3e 6c 6f 63 6b 65 64 if( id->locked
a2c0: 3c 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 <0 ){. rc = S
a2d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 QLITE_OK;. }els
a2e0: 65 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a e{. int res;.
a2f0: 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 31 30 int cnt = 10
a300: 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 63 6e 0;. while( cn
a310: 74 2d 2d 3e 30 20 26 26 20 28 72 65 73 20 3d 20 t-->0 && (res =
a320: 4c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20 LockFile(id->h,
a330: 46 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45 2c 20 FIRST_LOCKBYTE,
a340: 30 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 0, 1, 0))==0 ){.
a350: 20 20 20 20 20 20 53 6c 65 65 70 28 31 29 3b 0a Sleep(1);.
a360: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65 }. if( re
a370: 73 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 s ){. if( i
a380: 64 2d 3e 6c 6f 63 6b 65 64 3e 30 20 29 7b 0a 20 d->locked>0 ){.
a390: 20 20 20 20 20 20 20 69 66 28 20 69 73 4e 54 28 if( isNT(
a3a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 55 ) ){. U
a3b0: 6e 6c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c nlockFile(id->h,
a3c0: 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45 2b FIRST_LOCKBYTE+
a3d0: 31 2c 20 30 2c 20 4e 5f 4c 4f 43 4b 42 59 54 45 1, 0, N_LOCKBYTE
a3e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 , 0);. }e
a3f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 lse{. r
a400: 65 73 20 3d 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 es = UnlockFile(
a410: 69 64 2d 3e 68 2c 20 46 49 52 53 54 5f 4c 4f 43 id->h, FIRST_LOC
a420: 4b 42 59 54 45 20 2b 20 69 64 2d 3e 6c 6f 63 6b KBYTE + id->lock
a430: 65 64 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 ed, 0, 1, 0);.
a440: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a }. }.
a450: 20 20 20 20 20 20 69 66 28 20 72 65 73 20 29 7b if( res ){
a460: 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 4c . res = L
a470: 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20 46 ockFile(id->h, F
a480: 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45 2b 31 2c IRST_LOCKBYTE+1,
a490: 20 30 2c 20 4e 5f 4c 4f 43 4b 42 59 54 45 2c 20 0, N_LOCKBYTE,
a4a0: 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0);. }else{
a4b0: 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 30 . res = 0
a4c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
a4d0: 55 6e 6c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68 UnlockFile(id->h
a4e0: 2c 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45 , FIRST_LOCKBYTE
a4f0: 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 , 0, 1, 0);.
a500: 7d 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b }. if( res ){
a510: 0a 20 20 20 20 20 20 69 64 2d 3e 6c 6f 63 6b 65 . id->locke
a520: 64 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 63 d = -1;. rc
a530: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 = SQLITE_OK;.
a540: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 }else{. r
a550: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b c = SQLITE_BUSY;
a560: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 . }. }. ret
a570: 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 urn rc;.#endif.#
a580: 69 66 20 4f 53 5f 4d 41 43 0a 20 20 69 6e 74 20 if OS_MAC. int
a590: 72 63 3b 0a 20 20 69 66 28 20 69 64 2d 3e 6c 6f rc;. if( id->lo
a5a0: 63 6b 65 64 3c 30 20 7c 7c 20 69 64 2d 3e 72 65 cked<0 || id->re
a5b0: 66 4e 75 6d 52 46 20 3d 3d 20 2d 31 20 29 7b 0a fNumRF == -1 ){.
a5c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f rc = SQLITE_
a5d0: 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 OK;. }else{.
a5e0: 20 4f 53 45 72 72 20 72 65 73 3b 0a 20 20 20 20 OSErr res;.
a5f0: 69 6e 74 20 63 6e 74 20 3d 20 35 3b 0a 20 20 20 int cnt = 5;.
a600: 20 50 61 72 61 6d 42 6c 6f 63 6b 52 65 63 20 70 ParamBlockRec p
a610: 61 72 61 6d 73 3b 0a 20 20 20 20 6d 65 6d 73 65 arams;. memse
a620: 74 28 26 70 61 72 61 6d 73 2c 20 30 2c 20 73 69 t(¶ms, 0, si
a630: 7a 65 6f 66 28 70 61 72 61 6d 73 29 29 3b 0a 20 zeof(params));.
a640: 20 20 20 70 61 72 61 6d 73 2e 69 6f 50 61 72 61 params.ioPara
a650: 6d 2e 69 6f 52 65 66 4e 75 6d 20 3d 20 69 64 2d m.ioRefNum = id-
a660: 3e 72 65 66 4e 75 6d 52 46 3b 0a 20 20 20 20 70 >refNumRF;. p
a670: 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f arams.ioParam.io
a680: 50 6f 73 4d 6f 64 65 20 3d 20 66 73 46 72 6f 6d PosMode = fsFrom
a690: 53 74 61 72 74 3b 0a 20 20 20 20 70 61 72 61 6d Start;. param
a6a0: 73 2e 69 6f 50 61 72 61 6d 2e 69 6f 50 6f 73 4f s.ioParam.ioPosO
a6b0: 66 66 73 65 74 20 3d 20 46 49 52 53 54 5f 4c 4f ffset = FIRST_LO
a6c0: 43 4b 42 59 54 45 3b 0a 20 20 20 20 70 61 72 61 CKBYTE;. para
a6d0: 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f 52 65 71 ms.ioParam.ioReq
a6e0: 43 6f 75 6e 74 20 3d 20 31 3b 0a 20 20 20 20 77 Count = 1;. w
a6f0: 68 69 6c 65 28 20 63 6e 74 2d 2d 3e 30 20 26 26 hile( cnt-->0 &&
a700: 20 28 72 65 73 20 3d 20 50 42 4c 6f 63 6b 52 61 (res = PBLockRa
a710: 6e 67 65 53 79 6e 63 28 26 70 61 72 61 6d 73 29 ngeSync(¶ms)
a720: 29 21 3d 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 )!=noErr ){.
a730: 20 20 55 49 6e 74 33 32 20 66 69 6e 61 6c 54 69 UInt32 finalTi
a740: 63 6b 73 3b 0a 20 20 20 20 20 20 44 65 6c 61 79 cks;. Delay
a750: 28 31 2c 20 26 66 69 6e 61 6c 54 69 63 6b 73 29 (1, &finalTicks)
a760: 3b 20 2f 2a 20 31 2f 36 30 20 73 65 63 20 2a 2f ; /* 1/60 sec */
a770: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 . }. if( r
a780: 65 73 20 3d 3d 20 6e 6f 45 72 72 20 29 7b 0a 20 es == noErr ){.
a790: 20 20 20 20 20 70 61 72 61 6d 73 2e 69 6f 50 61 params.ioPa
a7a0: 72 61 6d 2e 69 6f 50 6f 73 4f 66 66 73 65 74 20 ram.ioPosOffset
a7b0: 3d 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45 = FIRST_LOCKBYTE
a7c0: 20 2b 20 69 64 2d 3e 6c 6f 63 6b 65 64 3b 0a 20 + id->locked;.
a7d0: 20 20 20 20 20 70 61 72 61 6d 73 2e 69 6f 50 61 params.ioPa
a7e0: 72 61 6d 2e 69 6f 52 65 71 43 6f 75 6e 74 20 3d ram.ioReqCount =
a7f0: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 64 1;. if( id
a800: 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 0a 20 20 20 ->locked==0 .
a810: 20 20 20 20 20 20 20 20 20 7c 7c 20 50 42 55 6e || PBUn
a820: 6c 6f 63 6b 52 61 6e 67 65 53 79 6e 63 28 26 70 lockRangeSync(&p
a830: 61 72 61 6d 73 29 3d 3d 6e 6f 45 72 72 20 29 7b arams)==noErr ){
a840: 0a 20 20 20 20 20 20 20 20 70 61 72 61 6d 73 2e . params.
a850: 69 6f 50 61 72 61 6d 2e 69 6f 50 6f 73 4f 66 66 ioParam.ioPosOff
a860: 73 65 74 20 3d 20 46 49 52 53 54 5f 4c 4f 43 4b set = FIRST_LOCK
a870: 42 59 54 45 2b 31 3b 0a 20 20 20 20 20 20 20 20 BYTE+1;.
a880: 70 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 params.ioParam.i
a890: 6f 52 65 71 43 6f 75 6e 74 20 3d 20 4e 5f 4c 4f oReqCount = N_LO
a8a0: 43 4b 42 59 54 45 3b 0a 20 20 20 20 20 20 20 20 CKBYTE;.
a8b0: 72 65 73 20 3d 20 50 42 4c 6f 63 6b 52 61 6e 67 res = PBLockRang
a8c0: 65 53 79 6e 63 28 26 70 61 72 61 6d 73 29 3b 0a eSync(¶ms);.
a8d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 }else{.
a8e0: 20 20 20 20 20 72 65 73 20 3d 20 61 66 70 52 61 res = afpRa
a8f0: 6e 67 65 4e 6f 74 4c 6f 63 6b 65 64 3b 0a 20 20 ngeNotLocked;.
a900: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61 72 61 }. para
a910: 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f 50 6f 73 ms.ioParam.ioPos
a920: 4f 66 66 73 65 74 20 3d 20 46 49 52 53 54 5f 4c Offset = FIRST_L
a930: 4f 43 4b 42 59 54 45 3b 0a 20 20 20 20 20 20 70 OCKBYTE;. p
a940: 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f arams.ioParam.io
a950: 52 65 71 43 6f 75 6e 74 20 3d 20 31 3b 0a 20 20 ReqCount = 1;.
a960: 20 20 20 20 50 42 55 6e 6c 6f 63 6b 52 61 6e 67 PBUnlockRang
a970: 65 53 79 6e 63 28 26 70 61 72 61 6d 73 29 3b 0a eSync(¶ms);.
a980: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65 }. if( re
a990: 73 20 3d 3d 20 6e 6f 45 72 72 20 29 7b 0a 20 20 s == noErr ){.
a9a0: 20 20 20 20 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d id->locked =
a9b0: 20 2d 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 -1;. rc =
a9c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d SQLITE_OK;. }
a9d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d else{. rc =
a9e0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 SQLITE_BUSY;.
a9f0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e }. }. return
aa00: 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f rc;.#endif.}../
aa10: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 *.** Unlock the
aa20: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 given file descr
aa30: 69 70 74 6f 72 2e 20 20 49 66 20 74 68 65 20 66 iptor. If the f
aa40: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 ile descriptor w
aa50: 61 73 0a 2a 2a 20 6e 6f 74 20 70 72 65 76 69 6f as.** not previo
aa60: 75 73 6c 79 20 6c 6f 63 6b 65 64 2c 20 74 68 65 usly locked, the
aa70: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 n this routine i
aa80: 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 74 s a no-op. If t
aa90: 68 69 73 0a 2a 2a 20 6c 69 62 72 61 72 79 20 77 his.** library w
aaa0: 61 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 as compiled with
aab0: 20 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70 large file supp
aac0: 6f 72 74 20 28 4c 46 53 29 20 62 75 74 20 4c 46 ort (LFS) but LF
aad0: 53 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 76 61 69 S is not.** avai
aae0: 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 68 6f 73 lable on the hos
aaf0: 74 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c 49 54 t, then an SQLIT
ab00: 45 5f 4e 4f 4c 46 53 20 69 73 20 72 65 74 75 72 E_NOLFS is retur
ab10: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 ned..*/.int sqli
ab20: 74 65 4f 73 55 6e 6c 6f 63 6b 28 4f 73 46 69 6c teOsUnlock(OsFil
ab30: 65 20 2a 69 64 29 7b 0a 23 69 66 20 4f 53 5f 55 e *id){.#if OS_U
ab40: 4e 49 58 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 NIX. int rc;.
ab50: 69 66 28 20 21 69 64 2d 3e 6c 6f 63 6b 65 64 20 if( !id->locked
ab60: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f ) return SQLITE_
ab70: 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 4f 73 45 6e OK;. sqliteOsEn
ab80: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 terMutex();. as
ab90: 73 65 72 74 28 20 69 64 2d 3e 70 4c 6f 63 6b 2d sert( id->pLock-
aba0: 3e 63 6e 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 >cnt!=0 );. if(
abb0: 20 69 64 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 3e id->pLock->cnt>
abc0: 31 20 29 7b 0a 20 20 20 20 69 64 2d 3e 70 4c 6f 1 ){. id->pLo
abd0: 63 6b 2d 3e 63 6e 74 2d 2d 3b 0a 20 20 20 20 72 ck->cnt--;. r
abe0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 c = SQLITE_OK;.
abf0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 72 75 }else{. stru
ac00: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 ct flock lock;.
ac10: 20 20 20 69 6e 74 20 73 3b 0a 20 20 20 20 6c 6f int s;. lo
ac20: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e ck.l_type = F_UN
ac30: 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f LCK;. lock.l_
ac40: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 whence = SEEK_SE
ac50: 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 T;. lock.l_st
ac60: 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e art = lock.l_len
ac70: 20 3d 20 30 4c 3b 0a 20 20 20 20 73 20 3d 20 66 = 0L;. s = f
ac80: 63 6e 74 6c 28 69 64 2d 3e 66 64 2c 20 46 5f 53 cntl(id->fd, F_S
ac90: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 ETLK, &lock);.
aca0: 20 20 69 66 28 20 73 21 3d 30 20 29 7b 0a 20 20 if( s!=0 ){.
acb0: 20 20 20 20 72 63 20 3d 20 28 65 72 72 6e 6f 3d rc = (errno=
acc0: 3d 45 49 4e 56 41 4c 29 20 3f 20 53 51 4c 49 54 =EINVAL) ? SQLIT
acd0: 45 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c 49 54 45 E_NOLFS : SQLITE
ace0: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 _BUSY;. }else
acf0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c {. rc = SQL
ad00: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 64 ITE_OK;. id
ad10: 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 30 ->pLock->cnt = 0
ad20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 ;. }. }. if
ad30: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc==SQLITE_OK
ad40: 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d ){. /* Decrem
ad50: 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 ent the count of
ad60: 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74 locks against t
ad70: 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 his same file.
ad80: 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 When the. **
ad90: 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 count reaches ze
ada0: 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 ro, close any ot
adb0: 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 her file descrip
adc0: 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 tors whose close
add0: 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65 . ** was defe
ade0: 72 72 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 rred because of
adf0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b outstanding lock
ae00: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 s.. */. st
ae10: 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f ruct openCnt *pO
ae20: 70 65 6e 20 3d 20 69 64 2d 3e 70 4f 70 65 6e 3b pen = id->pOpen;
ae30: 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 . pOpen->nLoc
ae40: 6b 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 k--;. assert(
ae50: 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30 pOpen->nLock>=0
ae60: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 65 );. if( pOpe
ae70: 6e 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 n->nLock==0 && p
ae80: 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3e 30 Open->nPending>0
ae90: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b ){. int i;
aea0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 . for(i=0;
aeb0: 69 3c 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e i<pOpen->nPendin
aec0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 g; i++){.
aed0: 20 63 6c 6f 73 65 28 70 4f 70 65 6e 2d 3e 61 50 close(pOpen->aP
aee0: 65 6e 64 69 6e 67 5b 69 5d 29 3b 0a 20 20 20 20 ending[i]);.
aef0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 }. sqlite
af00: 46 72 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e Free(pOpen->aPen
af10: 64 69 6e 67 29 3b 0a 20 20 20 20 20 20 70 4f 70 ding);. pOp
af20: 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30 en->nPending = 0
af30: 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 ;. pOpen->a
af40: 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 Pending = 0;.
af50: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 4f }. }. sqliteO
af60: 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 sLeaveMutex();.
af70: 20 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20 30 3b id->locked = 0;
af80: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 . return rc;.#e
af90: 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 49 4e 0a ndif.#if OS_WIN.
afa0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 int rc;. if(
afb0: 69 64 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 7b id->locked==0 ){
afc0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 . rc = SQLITE
afd0: 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 _OK;. }else if(
afe0: 20 69 73 4e 54 28 29 20 7c 7c 20 69 64 2d 3e 6c isNT() || id->l
aff0: 6f 63 6b 65 64 3c 30 20 29 7b 0a 20 20 20 20 55 ocked<0 ){. U
b000: 6e 6c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c nlockFile(id->h,
b010: 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45 2b FIRST_LOCKBYTE+
b020: 31 2c 20 30 2c 20 4e 5f 4c 4f 43 4b 42 59 54 45 1, 0, N_LOCKBYTE
b030: 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 , 0);. rc = S
b040: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 64 QLITE_OK;. id
b050: 2d 3e 6c 6f 63 6b 65 64 20 3d 20 30 3b 0a 20 20 ->locked = 0;.
b060: 7d 65 6c 73 65 7b 0a 20 20 20 20 55 6e 6c 6f 63 }else{. Unloc
b070: 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20 46 49 52 kFile(id->h, FIR
b080: 53 54 5f 4c 4f 43 4b 42 59 54 45 2b 69 64 2d 3e ST_LOCKBYTE+id->
b090: 6c 6f 63 6b 65 64 2c 20 30 2c 20 31 2c 20 30 29 locked, 0, 1, 0)
b0a0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 ;. rc = SQLIT
b0b0: 45 5f 4f 4b 3b 0a 20 20 20 20 69 64 2d 3e 6c 6f E_OK;. id->lo
b0c0: 63 6b 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 cked = 0;. }.
b0d0: 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 return rc;.#endi
b0e0: 66 0a 23 69 66 20 4f 53 5f 4d 41 43 0a 20 20 69 f.#if OS_MAC. i
b0f0: 6e 74 20 72 63 3b 0a 20 20 50 61 72 61 6d 42 6c nt rc;. ParamBl
b100: 6f 63 6b 52 65 63 20 70 61 72 61 6d 73 3b 0a 20 ockRec params;.
b110: 20 6d 65 6d 73 65 74 28 26 70 61 72 61 6d 73 2c memset(¶ms,
b120: 20 30 2c 20 73 69 7a 65 6f 66 28 70 61 72 61 6d 0, sizeof(param
b130: 73 29 29 3b 0a 20 20 70 61 72 61 6d 73 2e 69 6f s));. params.io
b140: 50 61 72 61 6d 2e 69 6f 52 65 66 4e 75 6d 20 3d Param.ioRefNum =
b150: 20 69 64 2d 3e 72 65 66 4e 75 6d 52 46 3b 0a 20 id->refNumRF;.
b160: 20 70 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d 2e params.ioParam.
b170: 69 6f 50 6f 73 4d 6f 64 65 20 3d 20 66 73 46 72 ioPosMode = fsFr
b180: 6f 6d 53 74 61 72 74 3b 0a 20 20 69 66 28 20 69 omStart;. if( i
b190: 64 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 7c 7c 20 d->locked==0 ||
b1a0: 69 64 2d 3e 72 65 66 4e 75 6d 52 46 20 3d 3d 20 id->refNumRF ==
b1b0: 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 -1 ){. rc = S
b1c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 QLITE_OK;. }els
b1d0: 65 20 69 66 28 20 69 64 2d 3e 6c 6f 63 6b 65 64 e if( id->locked
b1e0: 3c 30 20 29 7b 0a 20 20 20 20 70 61 72 61 6d 73 <0 ){. params
b1f0: 2e 69 6f 50 61 72 61 6d 2e 69 6f 50 6f 73 4f 66 .ioParam.ioPosOf
b200: 66 73 65 74 20 3d 20 46 49 52 53 54 5f 4c 4f 43 fset = FIRST_LOC
b210: 4b 42 59 54 45 2b 31 3b 0a 20 20 20 20 70 61 72 KBYTE+1;. par
b220: 61 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f 52 65 ams.ioParam.ioRe
b230: 71 43 6f 75 6e 74 20 3d 20 4e 5f 4c 4f 43 4b 42 qCount = N_LOCKB
b240: 59 54 45 3b 0a 20 20 20 20 50 42 55 6e 6c 6f 63 YTE;. PBUnloc
b250: 6b 52 61 6e 67 65 53 79 6e 63 28 26 70 61 72 61 kRangeSync(¶
b260: 6d 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 ms);. rc = SQ
b270: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 64 2d LITE_OK;. id-
b280: 3e 6c 6f 63 6b 65 64 20 3d 20 30 3b 0a 20 20 7d >locked = 0;. }
b290: 65 6c 73 65 7b 0a 20 20 20 20 70 61 72 61 6d 73 else{. params
b2a0: 2e 69 6f 50 61 72 61 6d 2e 69 6f 50 6f 73 4f 66 .ioParam.ioPosOf
b2b0: 66 73 65 74 20 3d 20 46 49 52 53 54 5f 4c 4f 43 fset = FIRST_LOC
b2c0: 4b 42 59 54 45 2b 69 64 2d 3e 6c 6f 63 6b 65 64 KBYTE+id->locked
b2d0: 3b 0a 20 20 20 20 70 61 72 61 6d 73 2e 69 6f 50 ;. params.ioP
b2e0: 61 72 61 6d 2e 69 6f 52 65 71 43 6f 75 6e 74 20 aram.ioReqCount
b2f0: 3d 20 31 3b 0a 20 20 20 20 50 42 55 6e 6c 6f 63 = 1;. PBUnloc
b300: 6b 52 61 6e 67 65 53 79 6e 63 28 26 70 61 72 61 kRangeSync(¶
b310: 6d 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 ms);. rc = SQ
b320: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 64 2d LITE_OK;. id-
b330: 3e 6c 6f 63 6b 65 64 20 3d 20 30 3b 0a 20 20 7d >locked = 0;. }
b340: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 . return rc;.#e
b350: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 ndif.}../*.** Ge
b360: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f t information to
b370: 20 73 65 65 64 20 74 68 65 20 72 61 6e 64 6f 6d seed the random
b380: 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f number generato
b390: 72 2e 20 20 54 68 65 20 73 65 65 64 0a 2a 2a 20 r. The seed.**
b3a0: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 is written into
b3b0: 74 68 65 20 62 75 66 66 65 72 20 7a 42 75 66 5b the buffer zBuf[
b3c0: 32 35 36 5d 2e 20 20 54 68 65 20 63 61 6c 6c 69 256]. The calli
b3d0: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 ng function must
b3e0: 0a 2a 2a 20 73 75 70 70 6c 79 20 61 20 73 75 66 .** supply a suf
b3f0: 66 69 63 69 65 6e 74 6c 79 20 6c 61 72 67 65 20 ficiently large
b400: 62 75 66 66 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 buffer..*/.int s
b410: 71 6c 69 74 65 4f 73 52 61 6e 64 6f 6d 53 65 65 qliteOsRandomSee
b420: 64 28 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 d(char *zBuf){.
b430: 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20 69 /* We have to i
b440: 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20 74 nitialize zBuf t
b450: 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72 69 o prevent valgri
b460: 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e nd from reportin
b470: 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20 g. ** errors.
b480: 54 68 65 20 72 65 70 6f 72 74 73 20 69 73 73 75 The reports issu
b490: 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20 61 ed by valgrind a
b4a0: 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20 77 re incorrect - w
b4b0: 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65 e would. ** pre
b4c0: 66 65 72 20 74 68 61 74 20 74 68 65 20 72 61 6e fer that the ran
b4d0: 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72 65 domness be incre
b4e0: 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20 75 ased by making u
b4f0: 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75 se of the. ** u
b500: 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61 ninitialized spa
b510: 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75 74 ce in zBuf - but
b520: 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 73 valgrind errors
b530: 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20 tend to worry.
b540: 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e 20 ** some users.
b550: 20 52 61 74 68 65 72 20 74 68 61 6e 20 61 72 67 Rather than arg
b560: 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61 73 ue, it seems eas
b570: 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69 74 ier just to init
b580: 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20 ialize. ** the
b590: 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64 20 whole array and
b5a0: 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e 64 silence valgrind
b5b0: 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d , even if that m
b5c0: 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d eans less random
b5d0: 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 ness. ** in the
b5e0: 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20 random seed..
b5f0: 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65 73 **. ** When tes
b600: 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69 ting, initializi
b610: 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72 ng zBuf[] to zer
b620: 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20 o is all we do.
b630: 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a That means. **
b640: 20 74 68 61 74 20 77 65 20 61 6c 77 61 79 73 20 that we always
b650: 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 61 6e use the same ran
b660: 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75 65 dom number seque
b670: 6e 63 65 2e 2a 20 54 68 69 73 20 6d 61 6b 65 73 nce.* This makes
b680: 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73 20 the. ** tests
b690: 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f repeatable.. */
b6a0: 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 . memset(zBuf,
b6b0: 30 2c 20 32 35 36 29 3b 0a 23 69 66 20 4f 53 5f 0, 256);.#if OS_
b6c0: 55 4e 49 58 20 26 26 20 21 64 65 66 69 6e 65 64 UNIX && !defined
b6d0: 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 (SQLITE_TEST).
b6e0: 7b 0a 20 20 20 20 69 6e 74 20 70 69 64 3b 0a 20 {. int pid;.
b6f0: 20 20 20 74 69 6d 65 28 28 74 69 6d 65 5f 74 2a time((time_t*
b700: 29 7a 42 75 66 29 3b 0a 20 20 20 20 70 69 64 20 )zBuf);. pid
b710: 3d 20 67 65 74 70 69 64 28 29 3b 0a 20 20 20 20 = getpid();.
b720: 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a memcpy(&zBuf[siz
b730: 65 6f 66 28 74 69 6d 65 5f 74 29 5d 2c 20 26 70 eof(time_t)], &p
b740: 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29 id, sizeof(pid))
b750: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 ;. }.#endif.#if
b760: 20 4f 53 5f 57 49 4e 20 26 26 20 21 64 65 66 69 OS_WIN && !defi
b770: 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 ned(SQLITE_TEST)
b780: 0a 20 20 47 65 74 53 79 73 74 65 6d 54 69 6d 65 . GetSystemTime
b790: 28 28 4c 50 53 59 53 54 45 4d 54 49 4d 45 29 7a ((LPSYSTEMTIME)z
b7a0: 42 75 66 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 Buf);.#endif.#if
b7b0: 20 4f 53 5f 4d 41 43 0a 20 20 7b 0a 20 20 20 20 OS_MAC. {.
b7c0: 69 6e 74 20 70 69 64 3b 0a 20 20 20 20 4d 69 63 int pid;. Mic
b7d0: 72 6f 73 65 63 6f 6e 64 73 28 28 55 6e 73 69 67 roseconds((Unsig
b7e0: 6e 65 64 57 69 64 65 2a 29 7a 42 75 66 29 3b 0a nedWide*)zBuf);.
b7f0: 20 20 20 20 70 69 64 20 3d 20 67 65 74 70 69 64 pid = getpid
b800: 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 ();. memcpy(&
b810: 7a 42 75 66 5b 73 69 7a 65 6f 66 28 55 6e 73 69 zBuf[sizeof(Unsi
b820: 67 6e 65 64 57 69 64 65 29 5d 2c 20 26 70 69 64 gnedWide)], &pid
b830: 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a , sizeof(pid));.
b840: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 }.#endif. ret
b850: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d urn SQLITE_OK;.}
b860: 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f ../*.** Sleep fo
b870: 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 r a little while
b880: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d . Return the am
b890: 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 ount of time sle
b8a0: 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 pt..*/.int sqlit
b8b0: 65 4f 73 53 6c 65 65 70 28 69 6e 74 20 6d 73 29 eOsSleep(int ms)
b8c0: 7b 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a 23 69 {.#if OS_UNIX.#i
b8d0: 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 f defined(HAVE_U
b8e0: 53 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 SLEEP) && HAVE_U
b8f0: 53 4c 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d SLEEP. usleep(m
b900: 73 2a 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72 s*1000);. retur
b910: 6e 20 6d 73 3b 0a 23 65 6c 73 65 0a 20 20 73 6c n ms;.#else. sl
b920: 65 65 70 28 28 6d 73 2b 39 39 39 29 2f 31 30 30 eep((ms+999)/100
b930: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 30 30 0);. return 100
b940: 30 2a 28 28 6d 73 2b 39 39 39 29 2f 31 30 30 30 0*((ms+999)/1000
b950: 29 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 );.#endif.#endif
b960: 0a 23 69 66 20 4f 53 5f 57 49 4e 0a 20 20 53 6c .#if OS_WIN. Sl
b970: 65 65 70 28 6d 73 29 3b 0a 20 20 72 65 74 75 72 eep(ms);. retur
b980: 6e 20 6d 73 3b 0a 23 65 6e 64 69 66 0a 23 69 66 n ms;.#endif.#if
b990: 20 4f 53 5f 4d 41 43 0a 20 20 55 49 6e 74 33 32 OS_MAC. UInt32
b9a0: 20 66 69 6e 61 6c 54 69 63 6b 73 3b 0a 20 20 55 finalTicks;. U
b9b0: 49 6e 74 33 32 20 74 69 63 6b 73 20 3d 20 28 28 Int32 ticks = ((
b9c0: 28 55 49 6e 74 33 32 29 6d 73 2b 31 36 29 2a 33 (UInt32)ms+16)*3
b9d0: 29 2f 35 30 3b 20 20 2f 2a 20 31 2f 36 30 20 73 )/50; /* 1/60 s
b9e0: 65 63 20 70 65 72 20 74 69 63 6b 20 2a 2f 0a 20 ec per tick */.
b9f0: 20 44 65 6c 61 79 28 74 69 63 6b 73 2c 20 26 66 Delay(ticks, &f
ba00: 69 6e 61 6c 54 69 63 6b 73 29 3b 0a 20 20 72 65 inalTicks);. re
ba10: 74 75 72 6e 20 28 69 6e 74 29 28 28 74 69 63 6b turn (int)((tick
ba20: 73 2a 35 30 29 2f 33 29 3b 0a 23 65 6e 64 69 66 s*50)/3);.#endif
ba30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 74 69 63 .}../*.** Static
ba40: 20 76 61 72 69 61 62 6c 65 73 20 75 73 65 64 20 variables used
ba50: 66 6f 72 20 74 68 72 65 61 64 20 73 79 6e 63 68 for thread synch
ba60: 72 6f 6e 69 7a 61 74 69 6f 6e 0a 2a 2f 0a 73 74 ronization.*/.st
ba70: 61 74 69 63 20 69 6e 74 20 69 6e 4d 75 74 65 78 atic int inMutex
ba80: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c = 0;.#ifdef SQL
ba90: 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 ITE_UNIX_THREADS
baa0: 0a 20 20 73 74 61 74 69 63 20 70 74 68 72 65 61 . static pthrea
bab0: 64 5f 6d 75 74 65 78 5f 74 20 6d 75 74 65 78 20 d_mutex_t mutex
bac0: 3d 20 50 54 48 52 45 41 44 5f 4d 55 54 45 58 5f = PTHREAD_MUTEX_
bad0: 49 4e 49 54 49 41 4c 49 5a 45 52 3b 0a 23 65 6e INITIALIZER;.#en
bae0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 dif.#ifdef SQLIT
baf0: 45 5f 57 33 32 5f 54 48 52 45 41 44 53 0a 20 20 E_W32_THREADS.
bb00: 73 74 61 74 69 63 20 43 52 49 54 49 43 41 4c 5f static CRITICAL_
bb10: 53 45 43 54 49 4f 4e 20 63 73 3b 0a 23 65 6e 64 SECTION cs;.#end
bb20: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 if.#ifdef SQLITE
bb30: 5f 4d 41 43 4f 53 5f 4d 55 4c 54 49 54 41 53 4b _MACOS_MULTITASK
bb40: 49 4e 47 0a 20 20 73 74 61 74 69 63 20 4d 50 43 ING. static MPC
bb50: 72 69 74 69 63 61 6c 52 65 67 69 6f 6e 49 44 20 riticalRegionID
bb60: 63 72 69 74 69 63 61 6c 52 65 67 69 6f 6e 3b 0a criticalRegion;.
bb70: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 #endif../*.** Th
bb80: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 69 72 e following pair
bb90: 20 6f 66 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c of routine impl
bba0: 65 6d 65 6e 74 20 6d 75 74 75 61 6c 20 65 78 63 ement mutual exc
bbb0: 6c 75 73 69 6f 6e 20 66 6f 72 0a 2a 2a 20 6d 75 lusion for.** mu
bbc0: 6c 74 69 2d 74 68 72 65 61 64 65 64 20 70 72 6f lti-threaded pro
bbd0: 63 65 73 73 65 73 2e 20 20 4f 6e 6c 79 20 61 20 cesses. Only a
bbe0: 73 69 6e 67 6c 65 20 74 68 72 65 61 64 20 69 73 single thread is
bbf0: 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 2a 2a 20 65 allowed to.** e
bc00: 78 65 63 75 74 65 64 20 63 6f 64 65 20 74 68 61 xecuted code tha
bc10: 74 20 69 73 20 73 75 72 72 6f 75 6e 64 65 64 20 t is surrounded
bc20: 62 79 20 45 6e 74 65 72 4d 75 74 65 78 28 29 20 by EnterMutex()
bc30: 61 6e 64 20 4c 65 61 76 65 4d 75 74 65 78 28 29 and LeaveMutex()
bc40: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75 ..**.** SQLite u
bc50: 73 65 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c ses only a singl
bc60: 65 20 4d 75 74 65 78 2e 20 20 54 68 65 72 65 20 e Mutex. There
bc70: 69 73 20 6e 6f 74 20 6d 75 63 68 20 63 72 69 74 is not much crit
bc80: 69 63 61 6c 0a 2a 2a 20 63 6f 64 65 20 61 6e 64 ical.** code and
bc90: 20 77 68 61 74 20 6c 69 74 74 6c 65 20 74 68 65 what little the
bca0: 72 65 20 69 73 20 65 78 65 63 75 74 65 73 20 71 re is executes q
bcb0: 75 69 63 6b 6c 79 20 61 6e 64 20 77 69 74 68 6f uickly and witho
bcc0: 75 74 20 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a ut blocking..*/.
bcd0: 76 6f 69 64 20 73 71 6c 69 74 65 4f 73 45 6e 74 void sqliteOsEnt
bce0: 65 72 4d 75 74 65 78 28 29 7b 0a 23 69 66 64 65 erMutex(){.#ifde
bcf0: 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 f SQLITE_UNIX_TH
bd00: 52 45 41 44 53 0a 20 20 70 74 68 72 65 61 64 5f READS. pthread_
bd10: 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 6d 75 74 65 mutex_lock(&mute
bd20: 78 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 x);.#endif.#ifde
bd30: 66 20 53 51 4c 49 54 45 5f 57 33 32 5f 54 48 52 f SQLITE_W32_THR
bd40: 45 41 44 53 0a 20 20 73 74 61 74 69 63 20 69 6e EADS. static in
bd50: 74 20 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 t isInit = 0;.
bd60: 77 68 69 6c 65 28 20 21 69 73 49 6e 69 74 20 29 while( !isInit )
bd70: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 6c 6f 6e {. static lon
bd80: 67 20 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 g lock = 0;.
bd90: 69 66 28 20 49 6e 74 65 72 6c 6f 63 6b 65 64 49 if( InterlockedI
bda0: 6e 63 72 65 6d 65 6e 74 28 26 6c 6f 63 6b 29 3d ncrement(&lock)=
bdb0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 49 6e 69 74 =1 ){. Init
bdc0: 69 61 6c 69 7a 65 43 72 69 74 69 63 61 6c 53 65 ializeCriticalSe
bdd0: 63 74 69 6f 6e 28 26 63 73 29 3b 0a 20 20 20 20 ction(&cs);.
bde0: 20 20 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 isInit = 1;.
bdf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 53 }else{. S
be00: 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 leep(1);. }.
be10: 20 7d 0a 20 20 45 6e 74 65 72 43 72 69 74 69 63 }. EnterCritic
be20: 61 6c 53 65 63 74 69 6f 6e 28 26 63 73 29 3b 0a alSection(&cs);.
be30: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 #endif.#ifdef SQ
be40: 4c 49 54 45 5f 4d 41 43 4f 53 5f 4d 55 4c 54 49 LITE_MACOS_MULTI
be50: 54 41 53 4b 49 4e 47 0a 20 20 73 74 61 74 69 63 TASKING. static
be60: 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20 6e 6f volatile int no
be70: 74 49 6e 69 74 20 3d 20 31 3b 0a 20 20 69 66 28 tInit = 1;. if(
be80: 20 6e 6f 74 49 6e 69 74 20 29 7b 0a 20 20 20 20 notInit ){.
be90: 69 66 28 20 6e 6f 74 49 6e 69 74 20 3d 3d 20 32 if( notInit == 2
bea0: 20 29 20 2f 2a 20 61 73 20 63 6c 6f 73 65 20 61 ) /* as close a
beb0: 73 20 79 6f 75 20 63 61 6e 20 67 65 74 20 74 6f s you can get to
bec0: 20 74 68 72 65 61 64 20 73 61 66 65 20 69 6e 69 thread safe ini
bed0: 74 20 2a 2f 0a 20 20 20 20 20 20 4d 50 59 69 65 t */. MPYie
bee0: 6c 64 28 29 3b 0a 20 20 20 20 65 6c 73 65 7b 0a ld();. else{.
bef0: 20 20 20 20 20 20 6e 6f 74 49 6e 69 74 20 3d 20 notInit =
bf00: 32 3b 0a 20 20 20 20 20 20 4d 50 43 72 65 61 74 2;. MPCreat
bf10: 65 43 72 69 74 69 63 61 6c 52 65 67 69 6f 6e 28 eCriticalRegion(
bf20: 26 63 72 69 74 69 63 61 6c 52 65 67 69 6f 6e 29 &criticalRegion)
bf30: 3b 0a 20 20 20 20 20 20 6e 6f 74 49 6e 69 74 20 ;. notInit
bf40: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 = 0;. }. }.
bf50: 20 4d 50 45 6e 74 65 72 43 72 69 74 69 63 61 6c MPEnterCritical
bf60: 52 65 67 69 6f 6e 28 63 72 69 74 69 63 61 6c 52 Region(criticalR
bf70: 65 67 69 6f 6e 2c 20 6b 44 75 72 61 74 69 6f 6e egion, kDuration
bf80: 46 6f 72 65 76 65 72 29 3b 0a 23 65 6e 64 69 66 Forever);.#endif
bf90: 0a 20 20 61 73 73 65 72 74 28 20 21 69 6e 4d 75 . assert( !inMu
bfa0: 74 65 78 20 29 3b 0a 20 20 69 6e 4d 75 74 65 78 tex );. inMutex
bfb0: 20 3d 20 31 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c = 1;.}.void sql
bfc0: 69 74 65 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 iteOsLeaveMutex(
bfd0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 4d ){. assert( inM
bfe0: 75 74 65 78 20 29 3b 0a 20 20 69 6e 4d 75 74 65 utex );. inMute
bff0: 78 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 x = 0;.#ifdef SQ
c000: 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 LITE_UNIX_THREAD
c010: 53 0a 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 S. pthread_mute
c020: 78 5f 75 6e 6c 6f 63 6b 28 26 6d 75 74 65 78 29 x_unlock(&mutex)
c030: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 ;.#endif.#ifdef
c040: 53 51 4c 49 54 45 5f 57 33 32 5f 54 48 52 45 41 SQLITE_W32_THREA
c050: 44 53 0a 20 20 4c 65 61 76 65 43 72 69 74 69 63 DS. LeaveCritic
c060: 61 6c 53 65 63 74 69 6f 6e 28 26 63 73 29 3b 0a alSection(&cs);.
c070: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 #endif.#ifdef SQ
c080: 4c 49 54 45 5f 4d 41 43 4f 53 5f 4d 55 4c 54 49 LITE_MACOS_MULTI
c090: 54 41 53 4b 49 4e 47 0a 20 20 4d 50 45 78 69 74 TASKING. MPExit
c0a0: 43 72 69 74 69 63 61 6c 52 65 67 69 6f 6e 28 63 CriticalRegion(c
c0b0: 72 69 74 69 63 61 6c 52 65 67 69 6f 6e 29 3b 0a riticalRegion);.
c0c0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 #endif.}../*.**
c0d0: 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20 Turn a relative
c0e0: 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 pathname into a
c0f0: 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20 full pathname.
c100: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 Return a pointer
c110: 0a 2a 2a 20 74 6f 20 74 68 65 20 66 75 6c 6c 20 .** to the full
c120: 70 61 74 68 6e 61 6d 65 20 73 74 6f 72 65 64 20 pathname stored
c130: 69 6e 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 in space obtaine
c140: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c d from sqliteMal
c150: 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 65 20 63 61 loc()..** The ca
c160: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 lling function i
c170: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f s responsible fo
c180: 72 20 66 72 65 65 69 6e 67 20 74 68 69 73 20 73 r freeing this s
c190: 70 61 63 65 20 6f 6e 63 65 20 69 74 0a 2a 2a 20 pace once it.**
c1a0: 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 65 is no longer nee
c1b0: 64 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 ded..*/.char *sq
c1c0: 6c 69 74 65 4f 73 46 75 6c 6c 50 61 74 68 6e 61 liteOsFullPathna
c1d0: 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a me(const char *z
c1e0: 52 65 6c 61 74 69 76 65 29 7b 0a 23 69 66 20 4f Relative){.#if O
c1f0: 53 5f 55 4e 49 58 0a 20 20 63 68 61 72 20 2a 7a S_UNIX. char *z
c200: 46 75 6c 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20 Full = 0;. if(
c210: 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f zRelative[0]=='/
c220: 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 ' ){. sqliteS
c230: 65 74 53 74 72 69 6e 67 28 26 7a 46 75 6c 6c 2c etString(&zFull,
c240: 20 7a 52 65 6c 61 74 69 76 65 2c 20 28 63 68 61 zRelative, (cha
c250: 72 2a 29 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a r*)0);. }else{.
c260: 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 char zBuf[50
c270: 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 00];. sqliteS
c280: 65 74 53 74 72 69 6e 67 28 26 7a 46 75 6c 6c 2c etString(&zFull,
c290: 20 67 65 74 63 77 64 28 7a 42 75 66 2c 20 73 69 getcwd(zBuf, si
c2a0: 7a 65 6f 66 28 7a 42 75 66 29 29 2c 20 22 2f 22 zeof(zBuf)), "/"
c2b0: 2c 20 7a 52 65 6c 61 74 69 76 65 2c 0a 20 20 20 , zRelative,.
c2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c2d0: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 7d 0a (char*)0);. }.
c2e0: 20 20 72 65 74 75 72 6e 20 7a 46 75 6c 6c 3b 0a return zFull;.
c2f0: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 49 #endif.#if OS_WI
c300: 4e 0a 20 20 63 68 61 72 20 2a 7a 4e 6f 74 55 73 N. char *zNotUs
c310: 65 64 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c ed;. char *zFul
c320: 6c 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a l;. int nByte;.
c330: 20 20 6e 42 79 74 65 20 3d 20 47 65 74 46 75 6c nByte = GetFul
c340: 6c 50 61 74 68 4e 61 6d 65 28 7a 52 65 6c 61 74 lPathName(zRelat
c350: 69 76 65 2c 20 30 2c 20 30 2c 20 26 7a 4e 6f 74 ive, 0, 0, &zNot
c360: 55 73 65 64 29 20 2b 20 31 3b 0a 20 20 7a 46 75 Used) + 1;. zFu
c370: 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f ll = sqliteMallo
c380: 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 c( nByte );. if
c390: 28 20 7a 46 75 6c 6c 3d 3d 30 20 29 20 72 65 74 ( zFull==0 ) ret
c3a0: 75 72 6e 20 30 3b 0a 20 20 47 65 74 46 75 6c 6c urn 0;. GetFull
c3b0: 50 61 74 68 4e 61 6d 65 28 7a 52 65 6c 61 74 69 PathName(zRelati
c3c0: 76 65 2c 20 6e 42 79 74 65 2c 20 7a 46 75 6c 6c ve, nByte, zFull
c3d0: 2c 20 26 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20 , &zNotUsed);.
c3e0: 72 65 74 75 72 6e 20 7a 46 75 6c 6c 3b 0a 23 65 return zFull;.#e
c3f0: 6e 64 69 66 0a 23 69 66 20 4f 53 5f 4d 41 43 0a ndif.#if OS_MAC.
c400: 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 3d 20 char *zFull =
c410: 30 3b 0a 20 20 69 66 28 20 7a 52 65 6c 61 74 69 0;. if( zRelati
c420: 76 65 5b 30 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20 ve[0]==':' ){.
c430: 20 20 63 68 61 72 20 7a 42 75 66 5b 5f 4d 41 58 char zBuf[_MAX
c440: 5f 50 41 54 48 2b 31 5d 3b 0a 20 20 20 20 73 71 _PATH+1];. sq
c450: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 7a liteSetString(&z
c460: 46 75 6c 6c 2c 20 67 65 74 63 77 64 28 7a 42 75 Full, getcwd(zBu
c470: 66 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 29 f, sizeof(zBuf))
c480: 2c 20 26 28 7a 52 65 6c 61 74 69 76 65 5b 31 5d , &(zRelative[1]
c490: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ),.
c4a0: 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 (char*)0)
c4b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 ;. }else{. i
c4c0: 66 28 20 73 74 72 63 68 72 28 7a 52 65 6c 61 74 f( strchr(zRelat
c4d0: 69 76 65 2c 20 27 3a 27 29 20 29 7b 0a 20 20 20 ive, ':') ){.
c4e0: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 sqliteSetStri
c4f0: 6e 67 28 26 7a 46 75 6c 6c 2c 20 7a 52 65 6c 61 ng(&zFull, zRela
c500: 74 69 76 65 2c 20 28 63 68 61 72 2a 29 30 29 3b tive, (char*)0);
c510: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 . }else{.
c520: 63 68 61 72 20 7a 42 75 66 5b 5f 4d 41 58 5f 50 char zBuf[_MAX_P
c530: 41 54 48 2b 31 5d 3b 0a 20 20 20 20 20 20 73 71 ATH+1];. sq
c540: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 7a liteSetString(&z
c550: 46 75 6c 6c 2c 20 67 65 74 63 77 64 28 7a 42 75 Full, getcwd(zBu
c560: 66 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 29 f, sizeof(zBuf))
c570: 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20 28 63 68 , zRelative, (ch
c580: 61 72 2a 29 30 29 3b 0a 20 20 20 20 7d 0a 20 20 ar*)0);. }.
c590: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 75 6c 6c }. return zFull
c5a0: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a ;.#endif.}../*.*
c5b0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 * The following
c5c0: 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 variable, if set
c5d0: 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 to a non-zero v
c5e0: 61 6c 75 65 2c 20 62 65 63 6f 6d 65 73 20 74 68 alue, becomes th
c5f0: 65 20 72 65 73 75 6c 74 0a 2a 2a 20 72 65 74 75 e result.** retu
c600: 72 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 rned from sqlite
c610: 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 2e OsCurrentTime().
c620: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 This is used f
c630: 6f 72 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 or testing..*/.#
c640: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 ifdef SQLITE_TES
c650: 54 0a 69 6e 74 20 73 71 6c 69 74 65 5f 63 75 72 T.int sqlite_cur
c660: 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 0a 23 rent_time = 0;.#
c670: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e endif../*.** Fin
c680: 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 d the current ti
c690: 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c me (in Universal
c6a0: 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d Coordinated Tim
c6b0: 65 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a e). Write the.*
c6c0: 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 * current time a
c6d0: 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c nd date as a Jul
c6e0: 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69 ian Day number i
c6f0: 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a nto *prNow and.*
c700: 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 * return 0. Ret
c710: 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d urn 1 if the tim
c720: 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f e and date canno
c730: 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 t be found..*/.i
c740: 6e 74 20 73 71 6c 69 74 65 4f 73 43 75 72 72 65 nt sqliteOsCurre
c750: 6e 74 54 69 6d 65 28 64 6f 75 62 6c 65 20 2a 70 ntTime(double *p
c760: 72 4e 6f 77 29 7b 0a 23 69 66 20 4f 53 5f 55 4e rNow){.#if OS_UN
c770: 49 58 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 IX. time_t t;.
c780: 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70 72 time(&t);. *pr
c790: 4e 6f 77 20 3d 20 74 2f 38 36 34 30 30 2e 30 20 Now = t/86400.0
c7a0: 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a 23 65 6e + 2440587.5;.#en
c7b0: 64 69 66 0a 23 69 66 20 4f 53 5f 57 49 4e 0a 20 dif.#if OS_WIN.
c7c0: 20 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20 FILETIME ft;.
c7d0: 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75 /* FILETIME stru
c7e0: 63 74 75 72 65 20 69 73 20 61 20 36 34 2d 62 69 cture is a 64-bi
c7f0: 74 20 76 61 6c 75 65 20 72 65 70 72 65 73 65 6e t value represen
c800: 74 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 ting the number
c810: 6f 66 20 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e of . 100-nan
c820: 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c osecond interval
c830: 73 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79 20 s since January
c840: 31 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32 33 1, 1601 (= JD 23
c850: 30 35 38 31 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a 05813.5). . */.
c860: 20 20 64 6f 75 62 6c 65 20 6e 6f 77 3b 0a 20 20 double now;.
c870: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 GetSystemTimeAsF
c880: 69 6c 65 54 69 6d 65 28 20 26 66 74 20 29 3b 0a ileTime( &ft );.
c890: 20 20 6e 6f 77 20 3d 20 28 28 64 6f 75 62 6c 65 now = ((double
c8a0: 29 66 74 2e 64 77 48 69 67 68 44 61 74 65 54 69 )ft.dwHighDateTi
c8b0: 6d 65 29 20 2a 20 34 32 39 34 39 36 37 32 39 36 me) * 4294967296
c8c0: 2e 30 3b 20 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 .0; . *prNow =
c8d0: 28 6e 6f 77 20 2b 20 66 74 2e 64 77 4c 6f 77 44 (now + ft.dwLowD
c8e0: 61 74 65 54 69 6d 65 29 2f 38 36 34 30 30 30 30 ateTime)/8640000
c8f0: 30 30 30 30 30 2e 30 20 2b 20 32 33 30 35 38 31 00000.0 + 230581
c900: 33 2e 35 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 3.5;.#endif.#ifd
c910: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 ef SQLITE_TEST.
c920: 20 69 66 28 20 73 71 6c 69 74 65 5f 63 75 72 72 if( sqlite_curr
c930: 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 ent_time ){.
c940: 2a 70 72 4e 6f 77 20 3d 20 73 71 6c 69 74 65 5f *prNow = sqlite_
c950: 63 75 72 72 65 6e 74 5f 74 69 6d 65 2f 38 36 34 current_time/864
c960: 30 30 2e 30 20 2b 20 32 34 34 30 35 38 37 2e 35 00.0 + 2440587.5
c970: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 ;. }.#endif. r
c980: 65 74 75 72 6e 20 30 3b 0a 7d 0a eturn 0;.}.