/ Hex Artifact Content
Login

Artifact e93a6858b4ab880ce91cbc95af14975ef53b6369:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 55 6e 69 78 20 73 79 73  ific to Unix sys
01b0: 74 65 6d 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  tems..*/.#includ
01c0: 65 20 22 6f 73 2e 68 22 20 20 20 20 20 20 20 20  e "os.h"        
01d0: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 66 69 72    /* Must be fir
01e0: 73 74 20 74 6f 20 65 6e 61 62 6c 65 20 6c 61 72  st to enable lar
01f0: 67 65 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20  ge file support 
0200: 2a 2f 0a 23 69 66 20 4f 53 5f 55 4e 49 58 20 20  */.#if OS_UNIX  
0210: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0220: 68 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64  his file is used
0230: 20 6f 6e 20 75 6e 69 78 20 6f 6e 6c 79 20 2a 2f   on unix only */
0240: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
0250: 65 49 6e 74 2e 68 22 0a 0a 0a 23 69 6e 63 6c 75  eInt.h"...#inclu
0260: 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63  de <time.h>.#inc
0270: 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 23  lude <errno.h>.#
0280: 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e  include <unistd.
0290: 68 3e 0a 23 69 66 6e 64 65 66 20 4f 5f 4c 41 52  h>.#ifndef O_LAR
02a0: 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20  GEFILE.# define 
02b0: 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65  O_LARGEFILE 0.#e
02c0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
02d0: 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23  TE_DISABLE_LFS.#
02e0: 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49   undef O_LARGEFI
02f0: 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41  LE.# define O_LA
0300: 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66  RGEFILE 0.#endif
0310: 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c  .#ifndef O_NOFOL
0320: 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4e  LOW.# define O_N
0330: 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64 69 66  OFOLLOW 0.#endif
0340: 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e 41 52  .#ifndef O_BINAR
0350: 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42 49 4e  Y.# define O_BIN
0360: 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ARY 0.#endif../*
0370: 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50 20 63 6f  .** The DJGPP co
0380: 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65  mpiler environme
0390: 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20  nt looks mostly 
03a0: 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75 74 20 69  like Unix, but i
03b0: 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65 20 66  t.** lacks the f
03c0: 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61  cntl() system ca
03d0: 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66 69 6e 65  ll.  So redefine
03e0: 20 66 63 6e 74 6c 28 29 20 74 6f 20 62 65 20 73   fcntl() to be s
03f0: 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74  omething.** that
0400: 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73   always succeeds
0410: 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  .  This means th
0420: 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20  at locking does 
0430: 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64 65 72 0a  not occur under.
0440: 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75 74 20 69  ** DJGPP.  But i
0450: 74 73 20 44 4f 53 20 2d 20 77 68 61 74 20 64 69  ts DOS - what di
0460: 64 20 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f  d you expect?.*/
0470: 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f  .#ifdef __DJGPP_
0480: 5f 0a 23 20 64 65 66 69 6e 65 20 66 63 6e 74 6c  _.# define fcntl
0490: 28 41 2c 42 2c 43 29 20 30 0a 23 65 6e 64 69 66  (A,B,C) 0.#endif
04a0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 75  ../*.** Macros u
04b0: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
04c0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
04d0: 74 6f 20 75 73 65 20 74 68 72 65 61 64 73 2e 20  to use threads. 
04e0: 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 55   The.** SQLITE_U
04f0: 4e 49 58 5f 54 48 52 45 41 44 53 20 6d 61 63 72  NIX_THREADS macr
0500: 6f 20 69 73 20 64 65 66 69 6e 65 64 20 69 66 20  o is defined if 
0510: 77 65 20 61 72 65 20 73 79 6e 63 68 72 6f 6e 69  we are synchroni
0520: 7a 69 6e 67 20 66 6f 72 0a 2a 2a 20 50 6f 73 69  zing for.** Posi
0530: 78 20 74 68 72 65 61 64 73 20 61 6e 64 20 53 51  x threads and SQ
0540: 4c 49 54 45 5f 57 33 32 5f 54 48 52 45 41 44 53  LITE_W32_THREADS
0550: 20 69 73 20 64 65 66 69 6e 65 64 20 69 66 20 77   is defined if w
0560: 65 20 61 72 65 0a 2a 2a 20 73 79 6e 63 68 72 6f  e are.** synchro
0570: 6e 69 7a 69 6e 67 20 75 73 69 6e 67 20 57 69 6e  nizing using Win
0580: 33 32 20 74 68 72 65 61 64 73 2e 0a 2a 2f 0a 23  32 threads..*/.#
0590: 69 66 20 64 65 66 69 6e 65 64 28 54 48 52 45 41  if defined(THREA
05a0: 44 53 41 46 45 29 20 26 26 20 54 48 52 45 41 44  DSAFE) && THREAD
05b0: 53 41 46 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c  SAFE.# include <
05c0: 70 74 68 72 65 61 64 2e 68 3e 0a 23 20 64 65 66  pthread.h>.# def
05d0: 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  ine SQLITE_UNIX_
05e0: 54 48 52 45 41 44 53 20 31 0a 23 65 6e 64 69 66  THREADS 1.#endif
05f0: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65  .../*.** Include
0600: 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f   code that is co
0610: 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a  mmon to all os_*
0620: 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63  .c files.*/.#inc
0630: 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e  lude "os_common.
0640: 68 22 0a 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20  h".../*.** Here 
0650: 69 73 20 74 68 65 20 64 69 72 74 20 6f 6e 20 50  is the dirt on P
0660: 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f  OSIX advisory lo
0670: 63 6b 73 3a 20 20 41 4e 53 49 20 53 54 44 20 31  cks:  ANSI STD 1
0680: 30 30 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20  003.1 (1996).** 
0690: 73 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20  section 6.5.2.2 
06a0: 6c 69 6e 65 73 20 34 38 33 20 74 68 72 6f 75 67  lines 483 throug
06b0: 68 20 34 39 30 20 73 70 65 63 69 66 79 20 74 68  h 490 specify th
06c0: 61 74 20 77 68 65 6e 20 61 20 70 72 6f 63 65 73  at when a proces
06d0: 73 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c 65  s.** sets or cle
06e0: 61 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74  ars a lock, that
06f0: 20 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65 72 72   operation overr
0700: 69 64 65 73 20 61 6e 79 20 70 72 69 6f 72 20 6c  ides any prior l
0710: 6f 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20 74  ocks set.** by t
0720: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e  he same process.
0730: 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 65 78    It does not ex
0740: 70 6c 69 63 69 74 6c 79 20 73 61 79 20 73 6f 2c  plicitly say so,
0750: 20 62 75 74 20 74 68 69 73 20 69 6d 70 6c 69 65   but this implie
0760: 73 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f 76 65  s.** that it ove
0770: 72 72 69 64 65 73 20 6c 6f 63 6b 73 20 73 65 74  rrides locks set
0780: 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f   by the same pro
0790: 63 65 73 73 20 75 73 69 6e 67 20 61 20 64 69 66  cess using a dif
07a0: 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64  ferent.** file d
07b0: 65 73 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73  escriptor.  Cons
07c0: 69 64 65 72 20 74 68 69 73 20 74 65 73 74 20 63  ider this test c
07d0: 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ase:.**.**      
07e0: 20 69 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e 28   int fd1 = open(
07f0: 22 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57  "./file1", O_RDW
0800: 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29  R|O_CREAT, 0644)
0810: 3b 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66  ;.**       int f
0820: 64 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c  d2 = open("./fil
0830: 65 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52  e2", O_RDWR|O_CR
0840: 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a  EAT, 0644);.**.*
0850: 2a 20 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65  * Suppose ./file
0860: 31 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72  1 and ./file2 ar
0870: 65 20 72 65 61 6c 6c 79 20 74 68 65 20 73 61 6d  e really the sam
0880: 65 20 66 69 6c 65 20 28 62 65 63 61 75 73 65 0a  e file (because.
0890: 2a 2a 20 6f 6e 65 20 69 73 20 61 20 68 61 72 64  ** one is a hard
08a0: 20 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e   or symbolic lin
08b0: 6b 20 74 6f 20 74 68 65 20 6f 74 68 65 72 29 20  k to the other) 
08c0: 74 68 65 6e 20 69 66 20 79 6f 75 20 73 65 74 0a  then if you set.
08d0: 2a 2a 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ** an exclusive 
08e0: 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65  lock on fd1, the
08f0: 6e 20 74 72 79 20 74 6f 20 67 65 74 20 61 6e 20  n try to get an 
0900: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a  exclusive lock.*
0910: 2a 20 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f 72  * on fd2, it wor
0920: 6b 73 2e 20 20 49 20 77 6f 75 6c 64 20 68 61 76  ks.  I would hav
0930: 65 20 65 78 70 65 63 74 65 64 20 74 68 65 20 73  e expected the s
0940: 65 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a  econd lock to.**
0950: 20 66 61 69 6c 20 73 69 6e 63 65 20 74 68 65 72   fail since ther
0960: 65 20 77 61 73 20 61 6c 72 65 61 64 79 20 61 20  e was already a 
0970: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
0980: 20 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20   due to fd1..** 
0990: 42 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e  But not so.  Sin
09a0: 63 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61  ce both locks ca
09b0: 6d 65 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65  me from the same
09c0: 20 70 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a   process, the.**
09d0: 20 73 65 63 6f 6e 64 20 6f 76 65 72 72 69 64 65   second override
09e0: 73 20 74 68 65 20 66 69 72 73 74 2c 20 65 76 65  s the first, eve
09f0: 6e 20 74 68 6f 75 67 68 20 74 68 65 79 20 77 65  n though they we
0a00: 72 65 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a  re on different.
0a10: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
0a20: 6f 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69  ors opened on di
0a30: 66 66 65 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d  fferent file nam
0a40: 65 73 2e 0a 2a 2a 0a 2a 2a 20 42 75 6d 6d 65 72  es..**.** Bummer
0a50: 2e 20 20 49 66 20 79 6f 75 20 61 73 6b 20 6d 65  .  If you ask me
0a60: 2c 20 74 68 69 73 20 69 73 20 62 72 6f 6b 65 6e  , this is broken
0a70: 2e 20 20 42 61 64 6c 79 20 62 72 6f 6b 65 6e 2e  .  Badly broken.
0a80: 20 20 49 74 20 6d 65 61 6e 73 0a 2a 2a 20 74 68    It means.** th
0a90: 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65  at we cannot use
0aa0: 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20   POSIX locks to 
0ab0: 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65  synchronize file
0ac0: 20 61 63 63 65 73 73 20 61 6d 6f 6e 67 0a 2a 2a   access among.**
0ad0: 20 63 6f 6d 70 65 74 69 6e 67 20 74 68 72 65 61   competing threa
0ae0: 64 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70  ds of the same p
0af0: 72 6f 63 65 73 73 2e 20 20 50 4f 53 49 58 20 6c  rocess.  POSIX l
0b00: 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66  ocks will work f
0b10: 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72  ine.** to synchr
0b20: 6f 6e 69 7a 65 20 61 63 63 65 73 73 20 66 6f 72  onize access for
0b30: 20 74 68 72 65 61 64 73 20 69 6e 20 73 65 70 61   threads in sepa
0b40: 72 61 74 65 20 70 72 6f 63 65 73 73 65 73 2c 20  rate processes, 
0b50: 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61  but not.** threa
0b60: 64 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 61  ds within the sa
0b70: 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  me process..**.*
0b80: 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
0b90: 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51   the problem, SQ
0ba0: 4c 69 74 65 20 68 61 73 20 74 6f 20 6d 61 6e 61  Lite has to mana
0bb0: 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e  ge file locks in
0bc0: 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69  ternally.** on i
0bd0: 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65  ts own.  Wheneve
0be0: 72 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  r a new database
0bf0: 20 69 73 20 6f 70 65 6e 65 64 2c 20 77 65 20 68   is opened, we h
0c00: 61 76 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a  ave to find the.
0c10: 2a 2a 20 73 70 65 63 69 66 69 63 20 69 6e 6f 64  ** specific inod
0c20: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
0c30: 65 20 66 69 6c 65 20 28 74 68 65 20 69 6e 6f 64  e file (the inod
0c40: 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
0c50: 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76  by the.** st_dev
0c60: 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c   and st_ino fiel
0c70: 64 73 20 6f 66 20 74 68 65 20 73 74 61 74 20 73  ds of the stat s
0c80: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 66 73  tructure that fs
0c90: 74 61 74 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a  tat() fills in).
0ca0: 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72  ** and check for
0cb0: 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79 20 65   locks already e
0cc0: 78 69 73 74 69 6e 67 20 6f 6e 20 74 68 61 74 20  xisting on that 
0cd0: 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63  inode.  When loc
0ce0: 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65 61 74 65  ks are.** create
0cf0: 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77 65  d or removed, we
0d00: 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74   have to look at
0d10: 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61   our own interna
0d20: 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 0a  l record of the.
0d30: 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20  ** locks to see 
0d40: 69 66 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  if another threa
0d50: 64 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79  d has previously
0d60: 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74   set a lock on t
0d70: 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64  hat same.** inod
0d80: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 73 46  e..**.** The OsF
0d90: 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 66 6f  ile structure fo
0da0: 72 20 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f  r POSIX is no lo
0db0: 6e 67 65 72 20 6a 75 73 74 20 61 6e 20 69 6e 74  nger just an int
0dc0: 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73  eger file.** des
0dd0: 63 72 69 70 74 6f 72 2e 20 20 49 74 20 69 73 20  criptor.  It is 
0de0: 6e 6f 77 20 61 20 73 74 72 75 63 74 75 72 65 20  now a structure 
0df0: 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 69  that holds the i
0e00: 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64  nteger file.** d
0e10: 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20 61 20  escriptor and a 
0e20: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
0e30: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
0e40: 72 69 62 65 73 20 74 68 65 20 69 6e 74 65 72 6e  ribes the intern
0e50: 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74  al.** locks on t
0e60: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
0e70: 20 69 6e 6f 64 65 2e 20 20 54 68 65 72 65 20 69   inode.  There i
0e80: 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74  s one locking st
0e90: 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 69  ructure.** per i
0ea0: 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74 68 65 20  node, so if the 
0eb0: 73 61 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f 70  same inode is op
0ec0: 65 6e 65 64 20 74 77 69 63 65 2c 20 62 6f 74 68  ened twice, both
0ed0: 20 4f 73 46 69 6c 65 20 73 74 72 75 63 74 75 72   OsFile structur
0ee0: 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74  es.** point to t
0ef0: 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20  he same locking 
0f00: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
0f10: 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
0f20: 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65 66  e keeps.** a ref
0f30: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f  erence count (so
0f40: 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68   we will know wh
0f50: 65 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74 29  en to delete it)
0f60: 20 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20   and a "cnt".** 
0f70: 66 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c 73  field that tells
0f80: 20 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61 6c   us its internal
0f90: 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20 63   lock status.  c
0fa0: 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a  nt==0 means the.
0fb0: 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  ** file is unloc
0fc0: 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65  ked.  cnt==-1 me
0fd0: 61 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61 73  ans the file has
0fe0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
0ff0: 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61  ck..** cnt>0 mea
1000: 6e 73 20 74 68 65 72 65 20 61 72 65 20 63 6e 74  ns there are cnt
1010: 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e   shared locks on
1020: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
1030: 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
1040: 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61  lock or unlock a
1050: 20 66 69 6c 65 20 66 69 72 73 74 20 63 68 65 63   file first chec
1060: 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a  ks the locking.*
1070: 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  * structure.  Th
1080: 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d  e fcntl() system
1090: 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e   call is only in
10a0: 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20 0a  voked to set a .
10b0: 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66  ** POSIX lock if
10c0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f   the internal lo
10d0: 63 6b 20 73 74 72 75 63 74 75 72 65 20 74 72 61  ck structure tra
10e0: 6e 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65 6e  nsitions between
10f0: 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64  .** a locked and
1100: 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61   an unlocked sta
1110: 74 65 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 34 2d 4a  te..**.** 2004-J
1120: 61 6e 2d 31 31 3a 0a 2a 2a 20 4d 6f 72 65 20 72  an-11:.** More r
1130: 65 63 65 6e 74 20 64 69 73 63 6f 76 65 72 69 65  ecent discoverie
1140: 73 20 61 62 6f 75 74 20 50 4f 53 49 58 20 61 64  s about POSIX ad
1150: 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 20 20 28  visory locks.  (
1160: 54 68 65 20 6d 6f 72 65 0a 2a 2a 20 49 20 64 69  The more.** I di
1170: 73 63 6f 76 65 72 2c 20 74 68 65 20 6d 6f 72 65  scover, the more
1180: 20 49 20 72 65 61 6c 69 7a 65 20 74 68 65 20 61   I realize the a
1190: 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20   POSIX advisory 
11a0: 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 61 6e 20  locks are.** an 
11b0: 61 62 6f 6d 69 6e 61 74 69 6f 6e 2e 29 0a 2a 2a  abomination.).**
11c0: 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73 65  .** If you close
11d0: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
11e0: 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74  or that points t
11f0: 6f 20 61 20 66 69 6c 65 20 74 68 61 74 20 68 61  o a file that ha
1200: 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20  s locks,.** all 
1210: 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20 66 69  locks on that fi
1220: 6c 65 20 74 68 61 74 20 61 72 65 20 6f 77 6e 65  le that are owne
1230: 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74  d by the current
1240: 20 70 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20   process are.** 
1250: 72 65 6c 65 61 73 65 64 2e 20 20 54 6f 20 77 6f  released.  To wo
1260: 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70  rk around this p
1270: 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20 4f 73 46  roblem, each OsF
1280: 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  ile structure co
1290: 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e  ntains.** a poin
12a0: 74 65 72 20 74 6f 20 61 6e 20 6f 70 65 6e 43 6e  ter to an openCn
12b0: 74 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  t structure.  Th
12c0: 65 72 65 20 69 73 20 6f 6e 65 20 6f 70 65 6e 43  ere is one openC
12d0: 6e 74 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  nt structure.** 
12e0: 70 65 72 20 6f 70 65 6e 20 69 6e 6f 64 65 2c 20  per open inode, 
12f0: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
1300: 20 6d 75 6c 74 69 70 6c 65 20 4f 73 46 69 6c 65   multiple OsFile
1310: 73 20 63 61 6e 20 70 6f 69 6e 74 20 74 6f 20 61  s can point to a
1320: 20 73 69 6e 67 6c 65 0a 2a 2a 20 6f 70 65 6e 43   single.** openC
1330: 6e 74 2e 20 20 57 68 65 6e 20 61 6e 20 61 74 74  nt.  When an att
1340: 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
1350: 63 6c 6f 73 65 20 61 6e 20 4f 73 46 69 6c 65 2c  close an OsFile,
1360: 20 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a   if there are.**
1370: 20 6f 74 68 65 72 20 4f 73 46 69 6c 65 73 20 6f   other OsFiles o
1380: 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  pen on the same 
1390: 69 6e 6f 64 65 20 74 68 61 74 20 61 72 65 20 68  inode that are h
13a0: 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74 68  olding locks, th
13b0: 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f  e call.** to clo
13c0: 73 65 28 29 20 74 68 65 20 66 69 6c 65 20 64 65  se() the file de
13d0: 73 63 72 69 70 74 6f 72 20 69 73 20 64 65 66 65  scriptor is defe
13e0: 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6f  rred until all o
13f0: 66 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65 61  f the locks clea
1400: 72 2e 0a 2a 2a 20 54 68 65 20 6f 70 65 6e 43 6e  r..** The openCn
1410: 74 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70  t structure keep
1420: 73 20 61 20 6c 69 73 74 20 6f 66 20 66 69 6c 65  s a list of file
1430: 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 68 61   descriptors tha
1440: 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20  t need to.** be 
1450: 63 6c 6f 73 65 64 20 61 6e 64 20 74 68 61 74 20  closed and that 
1460: 6c 69 73 74 20 69 73 20 77 61 6c 6b 65 64 20 28  list is walked (
1470: 61 6e 64 20 63 6c 65 61 72 65 64 29 20 77 68 65  and cleared) whe
1480: 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a  n the last lock.
1490: 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a  ** clears..**.**
14a0: 20 46 69 72 73 74 2c 20 75 6e 64 65 72 20 4c 69   First, under Li
14b0: 6e 75 78 20 74 68 72 65 61 64 73 2c 20 62 65 63  nux threads, bec
14c0: 61 75 73 65 20 65 61 63 68 20 74 68 72 65 61 64  ause each thread
14d0: 20 68 61 73 20 61 20 73 65 70 61 72 61 74 65 0a   has a separate.
14e0: 2a 2a 20 70 72 6f 63 65 73 73 20 49 44 2c 20 6c  ** process ID, l
14f0: 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20 69  ock operations i
1500: 6e 20 6f 6e 65 20 74 68 72 65 61 64 20 64 6f 20  n one thread do 
1510: 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 6c 6f 63  not override loc
1520: 6b 73 0a 2a 2a 20 74 6f 20 74 68 65 20 73 61 6d  ks.** to the sam
1530: 65 20 66 69 6c 65 20 69 6e 20 6f 74 68 65 72 20  e file in other 
1540: 74 68 72 65 61 64 73 2e 20 20 4c 69 6e 75 78 20  threads.  Linux 
1550: 74 68 72 65 61 64 73 20 62 65 68 61 76 65 20 6c  threads behave l
1560: 69 6b 65 0a 2a 2a 20 73 65 70 61 72 61 74 65 20  ike.** separate 
1570: 70 72 6f 63 65 73 73 65 73 20 69 6e 20 74 68 69  processes in thi
1580: 73 20 72 65 73 70 65 63 74 2e 20 20 42 75 74 2c  s respect.  But,
1590: 20 69 66 20 79 6f 75 20 63 6c 6f 73 65 20 61 20   if you close a 
15a0: 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
15b0: 6f 72 20 69 6e 20 6c 69 6e 75 78 20 74 68 72 65  or in linux thre
15c0: 61 64 73 2c 20 61 6c 6c 20 6c 6f 63 6b 73 20 61  ads, all locks a
15d0: 72 65 20 63 6c 65 61 72 65 64 2c 20 65 76 65 6e  re cleared, even
15e0: 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 6e 20 6f 74 68   locks.** on oth
15f0: 65 72 20 74 68 72 65 61 64 73 20 61 6e 64 20 65  er threads and e
1600: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 6f  ven though the o
1610: 74 68 65 72 20 74 68 72 65 61 64 73 20 68 61 76  ther threads hav
1620: 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 70  e different.** p
1630: 72 6f 63 65 73 73 20 49 44 73 2e 20 20 4c 69 6e  rocess IDs.  Lin
1640: 75 78 20 74 68 72 65 61 64 73 20 69 73 20 69 6e  ux threads is in
1650: 63 6f 6e 73 69 73 74 65 6e 74 20 69 6e 20 74 68  consistent in th
1660: 69 73 20 72 65 73 70 65 63 74 2e 0a 2a 2a 20 28  is respect..** (
1670: 49 27 6d 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f  I'm beginning to
1680: 20 74 68 69 6e 6b 20 74 68 61 74 20 6c 69 6e 75   think that linu
1690: 78 20 74 68 72 65 61 64 73 20 69 73 20 61 6e 20  x threads is an 
16a0: 61 62 6f 6d 69 6e 61 74 69 6f 6e 20 74 6f 6f 2e  abomination too.
16b0: 29 0a 2a 2a 20 54 68 65 20 63 6f 6e 73 65 71 75  ).** The consequ
16c0: 65 6e 63 65 20 6f 66 20 74 68 69 73 20 61 6c 6c  ence of this all
16d0: 20 69 73 20 74 68 61 74 20 74 68 65 20 68 61 73   is that the has
16e0: 68 20 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20  h table for the 
16f0: 6c 6f 63 6b 49 6e 66 6f 0a 2a 2a 20 73 74 72 75  lockInfo.** stru
1700: 63 74 75 72 65 20 68 61 73 20 74 6f 20 69 6e 63  cture has to inc
1710: 6c 75 64 65 20 74 68 65 20 70 72 6f 63 65 73 73  lude the process
1720: 20 69 64 20 61 73 20 70 61 72 74 20 6f 66 20 69   id as part of i
1730: 74 73 20 6b 65 79 20 62 65 63 61 75 73 65 0a 2a  ts key because.*
1740: 2a 20 6c 6f 63 6b 73 20 69 6e 20 64 69 66 66 65  * locks in diffe
1750: 72 65 6e 74 20 74 68 72 65 61 64 73 20 61 72 65  rent threads are
1760: 20 74 72 65 61 74 65 64 20 61 73 20 64 69 73 74   treated as dist
1770: 69 6e 63 74 2e 20 20 42 75 74 20 74 68 65 20 0a  inct.  But the .
1780: 2a 2a 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63  ** openCnt struc
1790: 74 75 72 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20  ture should not 
17a0: 69 6e 63 6c 75 64 65 20 74 68 65 20 70 72 6f 63  include the proc
17b0: 65 73 73 20 69 64 20 69 6e 20 69 74 73 0a 2a 2a  ess id in its.**
17c0: 20 6b 65 79 20 62 65 63 61 75 73 65 20 63 6c 6f   key because clo
17d0: 73 65 28 29 20 63 6c 65 61 72 73 20 6c 6f 63 6b  se() clears lock
17e0: 20 6f 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 2c   on all threads,
17f0: 20 6e 6f 74 20 6a 75 73 74 20 74 68 65 20 63 75   not just the cu
1800: 72 72 65 6e 74 0a 2a 2a 20 74 68 72 65 61 64 2e  rrent.** thread.
1810: 20 20 57 65 72 65 20 69 74 20 6e 6f 74 20 66 6f    Were it not fo
1820: 72 20 74 68 69 73 20 67 6f 6f 66 69 6e 65 73 73  r this goofiness
1830: 20 69 6e 20 6c 69 6e 75 78 20 74 68 72 65 61 64   in linux thread
1840: 73 2c 20 77 65 20 63 6f 75 6c 64 0a 2a 2a 20 63  s, we could.** c
1850: 6f 6d 62 69 6e 65 20 74 68 65 20 6c 6f 63 6b 49  ombine the lockI
1860: 6e 66 6f 20 61 6e 64 20 6f 70 65 6e 43 6e 74 20  nfo and openCnt 
1870: 73 74 72 75 63 74 75 72 65 73 20 69 6e 74 6f 20  structures into 
1880: 61 20 73 69 6e 67 6c 65 20 73 74 72 75 63 74 75  a single structu
1890: 72 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e  re..*/../*.** An
18a0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
18b0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
18c0: 74 75 72 65 20 73 65 72 76 65 73 20 61 73 20 74  ture serves as t
18d0: 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74  he key used.** t
18e0: 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69  o locate a parti
18f0: 63 75 6c 61 72 20 6c 6f 63 6b 49 6e 66 6f 20 73  cular lockInfo s
1900: 74 72 75 63 74 75 72 65 20 67 69 76 65 6e 20 69  tructure given i
1910: 74 73 20 69 6e 6f 64 65 2e 20 20 4e 6f 74 65 0a  ts inode.  Note.
1920: 2a 2a 20 74 68 61 74 20 77 65 20 68 61 76 65 20  ** that we have 
1930: 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 70  to include the p
1940: 72 6f 63 65 73 73 20 49 44 20 61 73 20 70 61 72  rocess ID as par
1950: 74 20 6f 66 20 74 68 65 20 6b 65 79 2e 20 20 4f  t of the key.  O
1960: 6e 20 73 6f 6d 65 0a 2a 2a 20 74 68 72 65 61 64  n some.** thread
1970: 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ing implementati
1980: 6f 6e 73 20 28 65 78 3a 20 6c 69 6e 75 78 29 2c  ons (ex: linux),
1990: 20 65 61 63 68 20 74 68 72 65 61 64 20 68 61 73   each thread has
19a0: 20 61 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 70   a separate.** p
19b0: 72 6f 63 65 73 73 20 49 44 2e 0a 2a 2f 0a 73 74  rocess ID..*/.st
19c0: 72 75 63 74 20 6c 6f 63 6b 4b 65 79 20 7b 0a 20  ruct lockKey {. 
19d0: 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20 2f 2a   dev_t dev;   /*
19e0: 20 44 65 76 69 63 65 20 6e 75 6d 62 65 72 20 2a   Device number *
19f0: 2f 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20  /.  ino_t ino;  
1a00: 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72   /* Inode number
1a10: 20 2a 2f 0a 20 20 70 69 64 5f 74 20 70 69 64 3b   */.  pid_t pid;
1a20: 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 49 44     /* Process ID
1a30: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e   */.};../*.** An
1a40: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
1a50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
1a60: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
1a70: 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a  d for each open.
1a80: 2a 2a 20 69 6e 6f 64 65 20 6f 6e 20 65 61 63 68  ** inode on each
1a90: 20 74 68 72 65 61 64 20 77 69 74 68 20 61 20 64   thread with a d
1aa0: 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73  ifferent process
1ab0: 20 49 44 2e 20 20 28 54 68 72 65 61 64 73 20 68   ID.  (Threads h
1ac0: 61 76 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74  ave.** different
1ad0: 20 70 72 6f 63 65 73 73 20 49 44 73 20 6f 6e 20   process IDs on 
1ae0: 6c 69 6e 75 78 2c 20 62 75 74 20 6e 6f 74 20 6f  linux, but not o
1af0: 6e 20 6d 6f 73 74 20 6f 74 68 65 72 20 75 6e 69  n most other uni
1b00: 78 65 73 2e 29 0a 2a 2a 0a 2a 2a 20 41 20 73 69  xes.).**.** A si
1b10: 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68  ngle inode can h
1b20: 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c  ave multiple fil
1b30: 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73  e descriptors, s
1b40: 6f 20 65 61 63 68 20 4f 73 46 69 6c 65 0a 2a 2a  o each OsFile.**
1b50: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
1b60: 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
1b70: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
1b80: 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e 64 20  this object and 
1b90: 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b  this.** object k
1ba0: 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f 66 20  eeps a count of 
1bb0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 4f 73  the number of Os
1bc0: 46 69 6c 65 73 20 70 6f 69 6e 74 69 6e 67 20 74  Files pointing t
1bd0: 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  o it..*/.struct 
1be0: 6c 6f 63 6b 49 6e 66 6f 20 7b 0a 20 20 73 74 72  lockInfo {.  str
1bf0: 75 63 74 20 6c 6f 63 6b 4b 65 79 20 6b 65 79 3b  uct lockKey key;
1c00: 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20    /* The lookup 
1c10: 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  key */.  int cnt
1c20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1c30: 20 30 3a 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 2d   0: unlocked.  -
1c40: 31 3a 20 77 72 69 74 65 20 6c 6f 63 6b 2e 20 20  1: write lock.  
1c50: 31 2e 2e 2e 3a 20 72 65 61 64 20 6c 6f 63 6b 2e  1...: read lock.
1c60: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
1c70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1c80: 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73  mber of pointers
1c90: 20 74 6f 20 74 68 69 73 20 73 74 72 75 63 74 75   to this structu
1ca0: 72 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  re */.};../*.** 
1cb0: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
1cc0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
1cd0: 75 63 74 75 72 65 20 73 65 72 76 65 73 20 61 73  ucture serves as
1ce0: 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a   the key used.**
1cf0: 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72   to locate a par
1d00: 74 69 63 75 6c 61 72 20 6f 70 65 6e 43 6e 74 20  ticular openCnt 
1d10: 73 74 72 75 63 74 75 72 65 20 67 69 76 65 6e 20  structure given 
1d20: 69 74 73 20 69 6e 6f 64 65 2e 20 20 54 68 69 73  its inode.  This
1d30: 0a 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20  .** is the same 
1d40: 61 73 20 74 68 65 20 6c 6f 63 6b 4b 65 79 20 65  as the lockKey e
1d50: 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 70  xcept that the p
1d60: 72 6f 63 65 73 73 20 49 44 20 69 73 20 6f 6d 69  rocess ID is omi
1d70: 74 74 65 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  tted..*/.struct 
1d80: 6f 70 65 6e 4b 65 79 20 7b 0a 20 20 64 65 76 5f  openKey {.  dev_
1d90: 74 20 64 65 76 3b 20 20 20 2f 2a 20 44 65 76 69  t dev;   /* Devi
1da0: 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ce number */.  i
1db0: 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 2f 2a 20 49  no_t ino;   /* I
1dc0: 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 7d  node number */.}
1dd0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
1de0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
1df0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
1e00: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  is allocated for
1e10: 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e   each open.** in
1e20: 6f 64 65 2e 20 20 54 68 69 73 20 73 74 72 75 63  ode.  This struc
1e30: 74 75 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b  ture keeps track
1e40: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
1e50: 66 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 0a  f locks on that.
1e60: 2a 2a 20 69 6e 6f 64 65 2e 20 20 49 66 20 61 20  ** inode.  If a 
1e70: 63 6c 6f 73 65 20 69 73 20 61 74 74 65 6d 70 74  close is attempt
1e80: 65 64 20 61 67 61 69 6e 73 74 20 61 6e 20 69 6e  ed against an in
1e90: 6f 64 65 20 74 68 61 74 20 69 73 20 68 6f 6c 64  ode that is hold
1ea0: 69 6e 67 0a 2a 2a 20 6c 6f 63 6b 73 2c 20 74 68  ing.** locks, th
1eb0: 65 20 63 6c 6f 73 65 20 69 73 20 64 65 66 65 72  e close is defer
1ec0: 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6c 6f  red until all lo
1ed0: 63 6b 73 20 63 6c 65 61 72 20 62 79 20 61 64 64  cks clear by add
1ee0: 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  ing the.** file 
1ef0: 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65  descriptor to be
1f00: 20 63 6c 6f 73 65 64 20 74 6f 20 74 68 65 20 70   closed to the p
1f10: 65 6e 64 69 6e 67 20 6c 69 73 74 2e 0a 2a 2f 0a  ending list..*/.
1f20: 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 7b  struct openCnt {
1f30: 0a 20 20 73 74 72 75 63 74 20 6f 70 65 6e 4b 65  .  struct openKe
1f40: 79 20 6b 65 79 3b 20 20 20 2f 2a 20 54 68 65 20  y key;   /* The 
1f50: 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20  lookup key */.  
1f60: 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
1f70: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1f80: 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  of pointers to t
1f90: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
1fa0: 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20  .  int nLock;   
1fb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1fc0: 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  er of outstandin
1fd0: 67 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 69 6e 74  g locks */.  int
1fe0: 20 6e 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20   nPending;      
1ff0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2000: 70 65 6e 64 69 6e 67 20 63 6c 6f 73 65 28 29 20  pending close() 
2010: 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20  operations */.  
2020: 69 6e 74 20 2a 61 50 65 6e 64 69 6e 67 3b 20 20  int *aPending;  
2030: 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65        /* Malloce
2040: 64 20 73 70 61 63 65 20 68 6f 6c 64 69 6e 67 20  d space holding 
2050: 66 64 27 73 20 61 77 61 69 74 69 6e 67 20 61 20  fd's awaiting a 
2060: 63 6c 6f 73 65 28 29 20 2a 2f 0a 7d 3b 0a 0a 2f  close() */.};../
2070: 2a 20 0a 2a 2a 20 54 68 65 73 65 20 68 61 73 68  * .** These hash
2080: 20 74 61 62 6c 65 20 6d 61 70 73 20 69 6e 6f 64   table maps inod
2090: 65 73 20 61 6e 64 20 70 72 6f 63 65 73 73 20 49  es and process I
20a0: 44 73 20 69 6e 74 6f 20 6c 6f 63 6b 49 6e 66 6f  Ds into lockInfo
20b0: 20 61 6e 64 20 6f 70 65 6e 43 6e 74 0a 2a 2a 20   and openCnt.** 
20c0: 73 74 72 75 63 74 75 72 65 73 2e 20 20 41 63 63  structures.  Acc
20d0: 65 73 73 20 74 6f 20 74 68 65 73 65 20 68 61 73  ess to these has
20e0: 68 20 74 61 62 6c 65 73 20 6d 75 73 74 20 62 65  h tables must be
20f0: 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 61 20   protected by a 
2100: 6d 75 74 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  mutex..*/.static
2110: 20 48 61 73 68 20 6c 6f 63 6b 48 61 73 68 20 3d   Hash lockHash =
2120: 20 7b 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 42   { SQLITE_HASH_B
2130: 49 4e 41 52 59 2c 20 30 2c 20 30 2c 20 30 2c 20  INARY, 0, 0, 0, 
2140: 30 2c 20 30 20 7d 3b 0a 73 74 61 74 69 63 20 48  0, 0 };.static H
2150: 61 73 68 20 6f 70 65 6e 48 61 73 68 20 3d 20 7b  ash openHash = {
2160: 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 42 49 4e   SQLITE_HASH_BIN
2170: 41 52 59 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  ARY, 0, 0, 0, 0,
2180: 20 30 20 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c   0 };../*.** Rel
2190: 65 61 73 65 20 61 20 6c 6f 63 6b 49 6e 66 6f 20  ease a lockInfo 
21a0: 73 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f  structure previo
21b0: 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62  usly allocated b
21c0: 79 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29  y findLockInfo()
21d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
21e0: 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f   releaseLockInfo
21f0: 28 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f  (struct lockInfo
2200: 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 70 4c 6f 63   *pLock){.  pLoc
2210: 6b 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  k->nRef--;.  if(
2220: 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 3d 3d 30 20   pLock->nRef==0 
2230: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61  ){.    sqlite3Ha
2240: 73 68 49 6e 73 65 72 74 28 26 6c 6f 63 6b 48 61  shInsert(&lockHa
2250: 73 68 2c 20 26 70 4c 6f 63 6b 2d 3e 6b 65 79 2c  sh, &pLock->key,
2260: 20 73 69 7a 65 6f 66 28 70 4c 6f 63 6b 2d 3e 6b   sizeof(pLock->k
2270: 65 79 29 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ey), 0);.    sql
2280: 69 74 65 46 72 65 65 28 70 4c 6f 63 6b 29 3b 0a  iteFree(pLock);.
2290: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c    }.}../*.** Rel
22a0: 65 61 73 65 20 61 20 6f 70 65 6e 43 6e 74 20 73  ease a openCnt s
22b0: 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f 75  tructure previou
22c0: 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  sly allocated by
22d0: 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e   findLockInfo().
22e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
22f0: 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 73  releaseOpenCnt(s
2300: 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70  truct openCnt *p
2310: 4f 70 65 6e 29 7b 0a 20 20 70 4f 70 65 6e 2d 3e  Open){.  pOpen->
2320: 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 4f  nRef--;.  if( pO
2330: 70 65 6e 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  pen->nRef==0 ){.
2340: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49      sqlite3HashI
2350: 6e 73 65 72 74 28 26 6f 70 65 6e 48 61 73 68 2c  nsert(&openHash,
2360: 20 26 70 4f 70 65 6e 2d 3e 6b 65 79 2c 20 73 69   &pOpen->key, si
2370: 7a 65 6f 66 28 70 4f 70 65 6e 2d 3e 6b 65 79 29  zeof(pOpen->key)
2380: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
2390: 46 72 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e  Free(pOpen->aPen
23a0: 64 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  ding);.    sqlit
23b0: 65 46 72 65 65 28 70 4f 70 65 6e 29 3b 0a 20 20  eFree(pOpen);.  
23c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  }.}../*.** Given
23d0: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
23e0: 6f 72 2c 20 6c 6f 63 61 74 65 20 6c 6f 63 6b 49  or, locate lockI
23f0: 6e 66 6f 20 61 6e 64 20 6f 70 65 6e 43 6e 74 20  nfo and openCnt 
2400: 73 74 72 75 63 74 75 72 65 73 20 74 68 61 74 0a  structures that.
2410: 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74 68 61  ** describes tha
2420: 74 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  t file descripto
2430: 72 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  r.  Create a new
2440: 20 6f 6e 65 73 20 69 66 20 6e 65 63 65 73 73 61   ones if necessa
2450: 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74 75  ry.  The.** retu
2460: 72 6e 20 76 61 6c 75 65 73 20 6d 69 67 68 74 20  rn values might 
2470: 62 65 20 75 6e 73 65 74 20 69 66 20 61 6e 20 65  be unset if an e
2480: 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  rror occurs..**.
2490: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
24a0: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a  mber of errors..
24b0: 2a 2f 0a 69 6e 74 20 66 69 6e 64 4c 6f 63 6b 49  */.int findLockI
24c0: 6e 66 6f 28 0a 20 20 69 6e 74 20 66 64 2c 20 20  nfo(.  int fd,  
24d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e0: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
24f0: 64 65 73 63 72 69 70 74 6f 72 20 75 73 65 64 20  descriptor used 
2500: 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20  in the key */.  
2510: 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20  struct lockInfo 
2520: 2a 2a 70 70 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20  **ppLock,    /* 
2530: 52 65 74 75 72 6e 20 74 68 65 20 6c 6f 63 6b 49  Return the lockI
2540: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 68 65  nfo structure he
2550: 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6f  re */.  struct o
2560: 70 65 6e 43 6e 74 20 2a 2a 70 70 4f 70 65 6e 20  penCnt **ppOpen 
2570: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
2580: 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72  openCnt structur
2590: 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
25a0: 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20  nt rc;.  struct 
25b0: 6c 6f 63 6b 4b 65 79 20 6b 65 79 31 3b 0a 20 20  lockKey key1;.  
25c0: 73 74 72 75 63 74 20 6f 70 65 6e 4b 65 79 20 6b  struct openKey k
25d0: 65 79 32 3b 0a 20 20 73 74 72 75 63 74 20 73 74  ey2;.  struct st
25e0: 61 74 20 73 74 61 74 62 75 66 3b 0a 20 20 73 74  at statbuf;.  st
25f0: 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70  ruct lockInfo *p
2600: 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20 6f  Lock;.  struct o
2610: 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 0a 20  penCnt *pOpen;. 
2620: 20 72 63 20 3d 20 66 73 74 61 74 28 66 64 2c 20   rc = fstat(fd, 
2630: 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66 28  &statbuf);.  if(
2640: 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20   rc!=0 ) return 
2650: 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 6b 65 79  1;.  memset(&key
2660: 31 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79  1, 0, sizeof(key
2670: 31 29 29 3b 0a 20 20 6b 65 79 31 2e 64 65 76 20  1));.  key1.dev 
2680: 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76  = statbuf.st_dev
2690: 3b 0a 20 20 6b 65 79 31 2e 69 6e 6f 20 3d 20 73  ;.  key1.ino = s
26a0: 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 20  tatbuf.st_ino;. 
26b0: 20 6b 65 79 31 2e 70 69 64 20 3d 20 67 65 74 70   key1.pid = getp
26c0: 69 64 28 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  id();.  memset(&
26d0: 6b 65 79 32 2c 20 30 2c 20 73 69 7a 65 6f 66 28  key2, 0, sizeof(
26e0: 6b 65 79 32 29 29 3b 0a 20 20 6b 65 79 32 2e 64  key2));.  key2.d
26f0: 65 76 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f  ev = statbuf.st_
2700: 64 65 76 3b 0a 20 20 6b 65 79 32 2e 69 6e 6f 20  dev;.  key2.ino 
2710: 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f  = statbuf.st_ino
2720: 3b 0a 20 20 70 4c 6f 63 6b 20 3d 20 28 73 74 72  ;.  pLock = (str
2730: 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 2a 29 73 71  uct lockInfo*)sq
2740: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 6c  lite3HashFind(&l
2750: 6f 63 6b 48 61 73 68 2c 20 26 6b 65 79 31 2c 20  ockHash, &key1, 
2760: 73 69 7a 65 6f 66 28 6b 65 79 31 29 29 3b 0a 20  sizeof(key1));. 
2770: 20 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20 29 7b   if( pLock==0 ){
2780: 0a 20 20 20 20 73 74 72 75 63 74 20 6c 6f 63 6b  .    struct lock
2790: 49 6e 66 6f 20 2a 70 4f 6c 64 3b 0a 20 20 20 20  Info *pOld;.    
27a0: 70 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65 4d 61  pLock = sqliteMa
27b0: 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28  llocRaw( sizeof(
27c0: 2a 70 4c 6f 63 6b 29 20 29 3b 0a 20 20 20 20 69  *pLock) );.    i
27d0: 66 28 20 70 4c 6f 63 6b 3d 3d 30 20 29 20 72 65  f( pLock==0 ) re
27e0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 70 4c 6f 63  turn 1;.    pLoc
27f0: 6b 2d 3e 6b 65 79 20 3d 20 6b 65 79 31 3b 0a 20  k->key = key1;. 
2800: 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 20 3d     pLock->nRef =
2810: 20 31 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63   1;.    pLock->c
2820: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 4f 6c 64  nt = 0;.    pOld
2830: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
2840: 73 65 72 74 28 26 6c 6f 63 6b 48 61 73 68 2c 20  sert(&lockHash, 
2850: 26 70 4c 6f 63 6b 2d 3e 6b 65 79 2c 20 73 69 7a  &pLock->key, siz
2860: 65 6f 66 28 6b 65 79 31 29 2c 20 70 4c 6f 63 6b  eof(key1), pLock
2870: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 21  );.    if( pOld!
2880: 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
2890: 72 74 28 20 70 4f 6c 64 3d 3d 70 4c 6f 63 6b 20  rt( pOld==pLock 
28a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  );.      sqliteF
28b0: 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  ree(pLock);.    
28c0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
28d0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
28e0: 4c 6f 63 6b 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  Lock->nRef++;.  
28f0: 7d 0a 20 20 2a 70 70 4c 6f 63 6b 20 3d 20 70 4c  }.  *ppLock = pL
2900: 6f 63 6b 3b 0a 20 20 70 4f 70 65 6e 20 3d 20 28  ock;.  pOpen = (
2910: 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 2a 29  struct openCnt*)
2920: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
2930: 26 6f 70 65 6e 48 61 73 68 2c 20 26 6b 65 79 32  &openHash, &key2
2940: 2c 20 73 69 7a 65 6f 66 28 6b 65 79 32 29 29 3b  , sizeof(key2));
2950: 0a 20 20 69 66 28 20 70 4f 70 65 6e 3d 3d 30 20  .  if( pOpen==0 
2960: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 6f 70  ){.    struct op
2970: 65 6e 43 6e 74 20 2a 70 4f 6c 64 3b 0a 20 20 20  enCnt *pOld;.   
2980: 20 70 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 4d   pOpen = sqliteM
2990: 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66  allocRaw( sizeof
29a0: 28 2a 70 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20  (*pOpen) );.    
29b0: 69 66 28 20 70 4f 70 65 6e 3d 3d 30 20 29 7b 0a  if( pOpen==0 ){.
29c0: 20 20 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63        releaseLoc
29d0: 6b 49 6e 66 6f 28 70 4c 6f 63 6b 29 3b 0a 20 20  kInfo(pLock);.  
29e0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
29f0: 20 20 7d 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 6b    }.    pOpen->k
2a00: 65 79 20 3d 20 6b 65 79 32 3b 0a 20 20 20 20 70  ey = key2;.    p
2a10: 4f 70 65 6e 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  Open->nRef = 1;.
2a20: 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b      pOpen->nLock
2a30: 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 65 6e 2d   = 0;.    pOpen-
2a40: 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20  >nPending = 0;. 
2a50: 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69     pOpen->aPendi
2a60: 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70 4f 6c 64  ng = 0;.    pOld
2a70: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
2a80: 73 65 72 74 28 26 6f 70 65 6e 48 61 73 68 2c 20  sert(&openHash, 
2a90: 26 70 4f 70 65 6e 2d 3e 6b 65 79 2c 20 73 69 7a  &pOpen->key, siz
2aa0: 65 6f 66 28 6b 65 79 32 29 2c 20 70 4f 70 65 6e  eof(key2), pOpen
2ab0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 21  );.    if( pOld!
2ac0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
2ad0: 72 74 28 20 70 4f 6c 64 3d 3d 70 4f 70 65 6e 20  rt( pOld==pOpen 
2ae0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  );.      sqliteF
2af0: 72 65 65 28 70 4f 70 65 6e 29 3b 0a 20 20 20 20  ree(pOpen);.    
2b00: 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66    releaseLockInf
2b10: 6f 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  o(pLock);.      
2b20: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
2b30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4f 70    }else{.    pOp
2b40: 65 6e 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a  en->nRef++;.  }.
2b50: 20 20 2a 70 70 4f 70 65 6e 20 3d 20 70 4f 70 65    *ppOpen = pOpe
2b60: 6e 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  n;.  return 0;.}
2b70: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
2b80: 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 0a 2a 2f  he named file.*/
2b90: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 44 65  .int sqlite3OsDe
2ba0: 6c 65 74 65 28 63 6f 6e 73 74 20 63 68 61 72 20  lete(const char 
2bb0: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 75  *zFilename){.  u
2bc0: 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29  nlink(zFilename)
2bd0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2be0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
2bf0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
2c00: 65 20 6e 61 6d 65 64 20 66 69 6c 65 20 65 78 69  e named file exi
2c10: 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sts..*/.int sqli
2c20: 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28  te3OsFileExists(
2c30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
2c40: 65 6e 61 6d 65 29 7b 0a 20 20 72 65 74 75 72 6e  ename){.  return
2c50: 20 61 63 63 65 73 73 28 7a 46 69 6c 65 6e 61 6d   access(zFilenam
2c60: 65 2c 20 30 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  e, 0)==0;.}../*.
2c70: 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70  ** Attempt to op
2c80: 65 6e 20 61 20 66 69 6c 65 20 66 6f 72 20 62 6f  en a file for bo
2c90: 74 68 20 72 65 61 64 69 6e 67 20 61 6e 64 20 77  th reading and w
2ca0: 72 69 74 69 6e 67 2e 20 20 49 66 20 74 68 61 74  riting.  If that
2cb0: 0a 2a 2a 20 66 61 69 6c 73 2c 20 74 72 79 20 6f  .** fails, try o
2cc0: 70 65 6e 69 6e 67 20 69 74 20 72 65 61 64 2d 6f  pening it read-o
2cd0: 6e 6c 79 2e 20 20 49 66 20 74 68 65 20 66 69 6c  nly.  If the fil
2ce0: 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
2cf0: 2c 0a 2a 2a 20 74 72 79 20 74 6f 20 63 72 65 61  ,.** try to crea
2d00: 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  te it..**.** On 
2d10: 73 75 63 63 65 73 73 2c 20 61 20 68 61 6e 64 6c  success, a handl
2d20: 65 20 66 6f 72 20 74 68 65 20 6f 70 65 6e 20 66  e for the open f
2d30: 69 6c 65 20 69 73 20 77 72 69 74 74 65 6e 20 74  ile is written t
2d40: 6f 20 2a 69 64 0a 2a 2a 20 61 6e 64 20 2a 70 52  o *id.** and *pR
2d50: 65 61 64 6f 6e 6c 79 20 69 73 20 73 65 74 20 74  eadonly is set t
2d60: 6f 20 30 20 69 66 20 74 68 65 20 66 69 6c 65 20  o 0 if the file 
2d70: 77 61 73 20 6f 70 65 6e 65 64 20 66 6f 72 20 72  was opened for r
2d80: 65 61 64 69 6e 67 20 61 6e 64 0a 2a 2a 20 77 72  eading and.** wr
2d90: 69 74 69 6e 67 20 6f 72 20 31 20 69 66 20 74 68  iting or 1 if th
2da0: 65 20 66 69 6c 65 20 77 61 73 20 6f 70 65 6e 65  e file was opene
2db0: 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 54 68  d read-only.  Th
2dc0: 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  e function retur
2dd0: 6e 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e  ns.** SQLITE_OK.
2de0: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72  .**.** On failur
2df0: 65 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  e, the function 
2e00: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43  returns SQLITE_C
2e10: 41 4e 54 4f 50 45 4e 20 61 6e 64 20 6c 65 61 76  ANTOPEN and leav
2e20: 65 73 0a 2a 2a 20 2a 69 64 20 61 6e 64 20 2a 70  es.** *id and *p
2e30: 52 65 61 64 6f 6e 6c 79 20 75 6e 63 68 61 6e 67  Readonly unchang
2e40: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
2e50: 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74  e3OsOpenReadWrit
2e60: 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e(.  const char 
2e70: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 4f 73  *zFilename,.  Os
2e80: 46 69 6c 65 20 2a 69 64 2c 0a 20 20 69 6e 74 20  File *id,.  int 
2e90: 2a 70 52 65 61 64 6f 6e 6c 79 0a 29 7b 0a 20 20  *pReadonly.){.  
2ea0: 69 6e 74 20 72 63 3b 0a 20 20 69 64 2d 3e 64 69  int rc;.  id->di
2eb0: 72 66 64 20 3d 20 2d 31 3b 0a 20 20 69 64 2d 3e  rfd = -1;.  id->
2ec0: 66 64 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e  fd = open(zFilen
2ed0: 61 6d 65 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52  ame, O_RDWR|O_CR
2ee0: 45 41 54 7c 4f 5f 4c 41 52 47 45 46 49 4c 45 7c  EAT|O_LARGEFILE|
2ef0: 4f 5f 42 49 4e 41 52 59 2c 20 30 36 34 34 29 3b  O_BINARY, 0644);
2f00: 0a 20 20 69 66 28 20 69 64 2d 3e 66 64 3c 30 20  .  if( id->fd<0 
2f10: 29 7b 0a 20 20 20 20 69 64 2d 3e 66 64 20 3d 20  ){.    id->fd = 
2f20: 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  open(zFilename, 
2f30: 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 4c 41 52 47 45  O_RDONLY|O_LARGE
2f40: 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a  FILE|O_BINARY);.
2f50: 20 20 20 20 69 66 28 20 69 64 2d 3e 66 64 3c 30      if( id->fd<0
2f60: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2f70: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
2f80: 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 52  ; .    }.    *pR
2f90: 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 7d  eadonly = 1;.  }
2fa0: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 52 65 61 64  else{.    *pRead
2fb0: 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  only = 0;.  }.  
2fc0: 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75  sqlite3OsEnterMu
2fd0: 74 65 78 28 29 3b 0a 20 20 72 63 20 3d 20 66 69  tex();.  rc = fi
2fe0: 6e 64 4c 6f 63 6b 49 6e 66 6f 28 69 64 2d 3e 66  ndLockInfo(id->f
2ff0: 64 2c 20 26 69 64 2d 3e 70 4c 6f 63 6b 2c 20 26  d, &id->pLock, &
3000: 69 64 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 73 71  id->pOpen);.  sq
3010: 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65  lite3OsLeaveMute
3020: 78 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  x();.  if( rc ){
3030: 0a 20 20 20 20 63 6c 6f 73 65 28 69 64 2d 3e 66  .    close(id->f
3040: 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  d);.    return S
3050: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
3060: 0a 20 20 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20  .  id->locked = 
3070: 30 3b 0a 20 20 54 52 41 43 45 33 28 22 4f 50 45  0;.  TRACE3("OPE
3080: 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c  N    %-3d %s\n",
3090: 20 69 64 2d 3e 66 64 2c 20 7a 46 69 6c 65 6e 61   id->fd, zFilena
30a0: 6d 65 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74  me);.  OpenCount
30b0: 65 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e  er(+1);.  return
30c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
30d0: 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
30e0: 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65   open a new file
30f0: 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61   for exclusive a
3100: 63 63 65 73 73 20 62 79 20 74 68 69 73 20 70 72  ccess by this pr
3110: 6f 63 65 73 73 2e 0a 2a 2a 20 54 68 65 20 66 69  ocess..** The fi
3120: 6c 65 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  le will be opene
3130: 64 20 66 6f 72 20 62 6f 74 68 20 72 65 61 64 69  d for both readi
3140: 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67 2e 20  ng and writing. 
3150: 20 54 6f 20 61 76 6f 69 64 0a 2a 2a 20 61 20 70   To avoid.** a p
3160: 6f 74 65 6e 74 69 61 6c 20 73 65 63 75 72 69 74  otential securit
3170: 79 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 6f  y problem, we do
3180: 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 66   not allow the f
3190: 69 6c 65 20 74 6f 20 68 61 76 65 0a 2a 2a 20 70  ile to have.** p
31a0: 72 65 76 69 6f 75 73 6c 79 20 65 78 69 73 74 65  reviously existe
31b0: 64 2e 20 20 4e 6f 72 20 64 6f 20 77 65 20 61 6c  d.  Nor do we al
31c0: 6c 6f 77 20 74 68 65 20 66 69 6c 65 20 74 6f 20  low the file to 
31d0: 62 65 20 61 20 73 79 6d 62 6f 6c 69 63 0a 2a 2a  be a symbolic.**
31e0: 20 6c 69 6e 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   link..**.** If 
31f0: 64 65 6c 46 6c 61 67 20 69 73 20 74 72 75 65 2c  delFlag is true,
3200: 20 74 68 65 6e 20 6d 61 6b 65 20 61 72 72 61 6e   then make arran
3210: 67 65 6d 65 6e 74 73 20 74 6f 20 61 75 74 6f 6d  gements to autom
3220: 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 0a  atically delete.
3230: 2a 2a 20 74 68 65 20 66 69 6c 65 20 77 68 65 6e  ** the file when
3240: 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
3250: 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c  *.** On success,
3260: 20 77 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   write the file 
3270: 68 61 6e 64 6c 65 20 69 6e 74 6f 20 2a 69 64 20  handle into *id 
3280: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
3290: 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66  E_OK..**.** On f
32a0: 61 69 6c 75 72 65 2c 20 72 65 74 75 72 6e 20 53  ailure, return S
32b0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a  QLITE_CANTOPEN..
32c0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73  */.int sqlite3Os
32d0: 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 63 6f  OpenExclusive(co
32e0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
32f0: 61 6d 65 2c 20 4f 73 46 69 6c 65 20 2a 69 64 2c  ame, OsFile *id,
3300: 20 69 6e 74 20 64 65 6c 46 6c 61 67 29 7b 0a 20   int delFlag){. 
3310: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61   int rc;.  if( a
3320: 63 63 65 73 73 28 7a 46 69 6c 65 6e 61 6d 65 2c  ccess(zFilename,
3330: 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65   0)==0 ){.    re
3340: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
3350: 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 69 64 2d 3e  OPEN;.  }.  id->
3360: 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 69 64  dirfd = -1;.  id
3370: 2d 3e 66 64 20 3d 20 6f 70 65 6e 28 7a 46 69 6c  ->fd = open(zFil
3380: 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  ename,.         
3390: 20 20 20 20 20 20 20 4f 5f 52 44 57 52 7c 4f 5f         O_RDWR|O_
33a0: 43 52 45 41 54 7c 4f 5f 45 58 43 4c 7c 4f 5f 4e  CREAT|O_EXCL|O_N
33b0: 4f 46 4f 4c 4c 4f 57 7c 4f 5f 4c 41 52 47 45 46  OFOLLOW|O_LARGEF
33c0: 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 36  ILE|O_BINARY, 06
33d0: 30 30 29 3b 0a 20 20 69 66 28 20 69 64 2d 3e 66  00);.  if( id->f
33e0: 64 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  d<0 ){.    retur
33f0: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
3400: 4e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  N;.  }.  sqlite3
3410: 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  OsEnterMutex();.
3420: 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49    rc = findLockI
3430: 6e 66 6f 28 69 64 2d 3e 66 64 2c 20 26 69 64 2d  nfo(id->fd, &id-
3440: 3e 70 4c 6f 63 6b 2c 20 26 69 64 2d 3e 70 4f 70  >pLock, &id->pOp
3450: 65 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  en);.  sqlite3Os
3460: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
3470: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 63 6c  if( rc ){.    cl
3480: 6f 73 65 28 69 64 2d 3e 66 64 29 3b 0a 20 20 20  ose(id->fd);.   
3490: 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d   unlink(zFilenam
34a0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
34b0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
34c0: 0a 20 20 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20  .  id->locked = 
34d0: 30 3b 0a 20 20 69 66 28 20 64 65 6c 46 6c 61 67  0;.  if( delFlag
34e0: 20 29 7b 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a   ){.    unlink(z
34f0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20  Filename);.  }. 
3500: 20 54 52 41 43 45 33 28 22 4f 50 45 4e 2d 45 58   TRACE3("OPEN-EX
3510: 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 69 64 2d   %-3d %s\n", id-
3520: 3e 66 64 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  >fd, zFilename);
3530: 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b  .  OpenCounter(+
3540: 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  1);.  return SQL
3550: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
3560: 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e   Attempt to open
3570: 20 61 20 6e 65 77 20 66 69 6c 65 20 66 6f 72 20   a new file for 
3580: 72 65 61 64 2d 6f 6e 6c 79 20 61 63 63 65 73 73  read-only access
3590: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65  ..**.** On succe
35a0: 73 73 2c 20 77 72 69 74 65 20 74 68 65 20 66 69  ss, write the fi
35b0: 6c 65 20 68 61 6e 64 6c 65 20 69 6e 74 6f 20 2a  le handle into *
35c0: 69 64 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  id and return SQ
35d0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f  LITE_OK..**.** O
35e0: 6e 20 66 61 69 6c 75 72 65 2c 20 72 65 74 75 72  n failure, retur
35f0: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
3600: 4e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  N..*/.int sqlite
3610: 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28  3OsOpenReadOnly(
3620: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
3630: 65 6e 61 6d 65 2c 20 4f 73 46 69 6c 65 20 2a 69  ename, OsFile *i
3640: 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  d){.  int rc;.  
3650: 69 64 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a  id->dirfd = -1;.
3660: 20 20 69 64 2d 3e 66 64 20 3d 20 6f 70 65 6e 28    id->fd = open(
3670: 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44 4f  zFilename, O_RDO
3680: 4e 4c 59 7c 4f 5f 4c 41 52 47 45 46 49 4c 45 7c  NLY|O_LARGEFILE|
3690: 4f 5f 42 49 4e 41 52 59 29 3b 0a 20 20 69 66 28  O_BINARY);.  if(
36a0: 20 69 64 2d 3e 66 64 3c 30 20 29 7b 0a 20 20 20   id->fd<0 ){.   
36b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
36c0: 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 73  ANTOPEN;.  }.  s
36d0: 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74  qlite3OsEnterMut
36e0: 65 78 28 29 3b 0a 20 20 72 63 20 3d 20 66 69 6e  ex();.  rc = fin
36f0: 64 4c 6f 63 6b 49 6e 66 6f 28 69 64 2d 3e 66 64  dLockInfo(id->fd
3700: 2c 20 26 69 64 2d 3e 70 4c 6f 63 6b 2c 20 26 69  , &id->pLock, &i
3710: 64 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 73 71 6c  d->pOpen);.  sql
3720: 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78  ite3OsLeaveMutex
3730: 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  ();.  if( rc ){.
3740: 20 20 20 20 63 6c 6f 73 65 28 69 64 2d 3e 66 64      close(id->fd
3750: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
3760: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
3770: 20 20 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20 30    id->locked = 0
3780: 3b 0a 20 20 54 52 41 43 45 33 28 22 4f 50 45 4e  ;.  TRACE3("OPEN
3790: 2d 52 4f 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20  -RO %-3d %s\n", 
37a0: 69 64 2d 3e 66 64 2c 20 7a 46 69 6c 65 6e 61 6d  id->fd, zFilenam
37b0: 65 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65  e);.  OpenCounte
37c0: 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  r(+1);.  return 
37d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
37e0: 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f  .** Attempt to o
37f0: 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72  pen a file descr
3800: 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 64 69  iptor for the di
3810: 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e  rectory that con
3820: 74 61 69 6e 73 20 61 0a 2a 2a 20 66 69 6c 65 2e  tains a.** file.
3830: 20 20 54 68 69 73 20 66 69 6c 65 20 64 65 73 63    This file desc
3840: 72 69 70 74 6f 72 20 63 61 6e 20 62 65 20 75 73  riptor can be us
3850: 65 64 20 74 6f 20 66 73 79 6e 63 28 29 20 74 68  ed to fsync() th
3860: 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 69  e directory.** i
3870: 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20  n order to make 
3880: 73 75 72 65 20 74 68 65 20 63 72 65 61 74 69 6f  sure the creatio
3890: 6e 20 6f 66 20 61 20 6e 65 77 20 66 69 6c 65 20  n of a new file 
38a0: 69 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74  is actually writ
38b0: 74 65 6e 0a 2a 2a 20 74 6f 20 64 69 73 6b 2e 0a  ten.** to disk..
38c0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
38d0: 6e 65 20 69 73 20 6f 6e 6c 79 20 6d 65 61 6e 69  ne is only meani
38e0: 6e 67 66 75 6c 20 66 6f 72 20 55 6e 69 78 2e 20  ngful for Unix. 
38f0: 20 49 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75   It is a no-op u
3900: 6e 64 65 72 0a 2a 2a 20 77 69 6e 64 6f 77 73 20  nder.** windows 
3910: 73 69 6e 63 65 20 77 69 6e 64 6f 77 73 20 64 6f  since windows do
3920: 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 68  es not support h
3930: 61 72 64 20 6c 69 6e 6b 73 2e 0a 2a 2a 0a 2a 2a  ard links..**.**
3940: 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 61 20 68   On success, a h
3950: 61 6e 64 6c 65 20 66 6f 72 20 61 20 70 72 65 76  andle for a prev
3960: 69 6f 75 73 6c 79 20 6f 70 65 6e 20 66 69 6c 65  iously open file
3970: 20 69 73 20 61 74 20 2a 69 64 20 69 73 0a 2a 2a   is at *id is.**
3980: 20 75 70 64 61 74 65 64 20 77 69 74 68 20 74 68   updated with th
3990: 65 20 6e 65 77 20 64 69 72 65 63 74 6f 72 79 20  e new directory 
39a0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
39b0: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  and SQLITE_OK is
39c0: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  .** returned..**
39d0: 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20  .** On failure, 
39e0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  the function ret
39f0: 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 41 4e 54  urns SQLITE_CANT
3a00: 4f 50 45 4e 20 61 6e 64 20 6c 65 61 76 65 73 0a  OPEN and leaves.
3a10: 2a 2a 20 2a 69 64 20 75 6e 63 68 61 6e 67 65 64  ** *id unchanged
3a20: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
3a30: 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  OsOpenDirectory(
3a40: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3a50: 44 69 72 6e 61 6d 65 2c 0a 20 20 4f 73 46 69 6c  Dirname,.  OsFil
3a60: 65 20 2a 69 64 0a 29 7b 0a 20 20 69 66 28 20 69  e *id.){.  if( i
3a70: 64 2d 3e 66 64 3c 30 20 29 7b 0a 20 20 20 20 2f  d->fd<0 ){.    /
3a80: 2a 20 44 6f 20 6e 6f 74 20 6f 70 65 6e 20 74 68  * Do not open th
3a90: 65 20 64 69 72 65 63 74 6f 72 79 20 69 66 20 74  e directory if t
3aa0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
3ab0: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6c 72   file is not alr
3ac0: 65 61 64 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  eady.    ** open
3ad0: 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
3ae0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
3af0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69  .  }.  assert( i
3b00: 64 2d 3e 64 69 72 66 64 3c 30 20 29 3b 0a 20 20  d->dirfd<0 );.  
3b10: 69 64 2d 3e 64 69 72 66 64 20 3d 20 6f 70 65 6e  id->dirfd = open
3b20: 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f  (zDirname, O_RDO
3b30: 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 36  NLY|O_BINARY, 06
3b40: 34 34 29 3b 0a 20 20 69 66 28 20 69 64 2d 3e 64  44);.  if( id->d
3b50: 69 72 66 64 3c 30 20 29 7b 0a 20 20 20 20 72 65  irfd<0 ){.    re
3b60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
3b70: 4f 50 45 4e 3b 20 0a 20 20 7d 0a 20 20 54 52 41  OPEN; .  }.  TRA
3b80: 43 45 33 28 22 4f 50 45 4e 44 49 52 20 25 2d 33  CE3("OPENDIR %-3
3b90: 64 20 25 73 5c 6e 22 2c 20 69 64 2d 3e 64 69 72  d %s\n", id->dir
3ba0: 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29 3b 0a 20  fd, zDirname);. 
3bb0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
3bc0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  K;.}../*.** Crea
3bd0: 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  te a temporary f
3be0: 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66  ile name in zBuf
3bf0: 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20  .  zBuf must be 
3c00: 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 0a 2a 2a  big enough to.**
3c10: 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 53   hold at least S
3c20: 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53  QLITE_TEMPNAME_S
3c30: 49 5a 45 20 63 68 61 72 61 63 74 65 72 73 2e 0a  IZE characters..
3c40: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73  */.int sqlite3Os
3c50: 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 63 68 61  TempFileName(cha
3c60: 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74  r *zBuf){.  stat
3c70: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
3c80: 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  zDirs[] = {.    
3c90: 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20   "/var/tmp",.   
3ca0: 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20    "/usr/tmp",.  
3cb0: 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20     "/tmp",.     
3cc0: 22 2e 22 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74  ".",.  };.  stat
3cd0: 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ic unsigned char
3ce0: 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20   zChars[] =.    
3cf0: 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
3d00: 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20  pqrstuvwxyz".   
3d10: 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
3d20: 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20  OPQRSTUVWXYZ".  
3d30: 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a    "0123456789";.
3d40: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74    int i, j;.  st
3d50: 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
3d60: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
3d70: 72 20 3d 20 22 2e 22 3b 0a 20 20 66 6f 72 28 69  r = ".";.  for(i
3d80: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44  =0; i<sizeof(azD
3d90: 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69  irs)/sizeof(azDi
3da0: 72 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  rs[0]); i++){.  
3db0: 20 20 69 66 28 20 73 74 61 74 28 61 7a 44 69 72    if( stat(azDir
3dc0: 73 5b 69 5d 2c 20 26 62 75 66 29 20 29 20 63 6f  s[i], &buf) ) co
3dd0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
3de0: 21 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f  !S_ISDIR(buf.st_
3df0: 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e 75 65  mode) ) continue
3e00: 3b 0a 20 20 20 20 69 66 28 20 61 63 63 65 73 73  ;.    if( access
3e10: 28 61 7a 44 69 72 73 5b 69 5d 2c 20 30 37 29 20  (azDirs[i], 07) 
3e20: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
3e30: 7a 44 69 72 20 3d 20 61 7a 44 69 72 73 5b 69 5d  zDir = azDirs[i]
3e40: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
3e50: 0a 20 20 64 6f 7b 0a 20 20 20 20 73 70 72 69 6e  .  do{.    sprin
3e60: 74 66 28 7a 42 75 66 2c 20 22 25 73 2f 22 54 45  tf(zBuf, "%s/"TE
3e70: 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20  MP_FILE_PREFIX, 
3e80: 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20 73  zDir);.    j = s
3e90: 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20  trlen(zBuf);.   
3ea0: 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65   sqlite3Randomne
3eb0: 73 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29  ss(15, &zBuf[j])
3ec0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
3ed0: 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a  <15; i++, j++){.
3ee0: 20 20 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20        zBuf[j] = 
3ef0: 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28  (char)zChars[ ((
3f00: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42  unsigned char)zB
3f10: 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a  uf[j])%(sizeof(z
3f20: 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20  Chars)-1) ];.   
3f30: 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d   }.    zBuf[j] =
3f40: 20 30 3b 0a 20 20 7d 77 68 69 6c 65 28 20 61 63   0;.  }while( ac
3f50: 63 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20  cess(zBuf,0)==0 
3f60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
3f70: 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  TE_OK; .}../*.**
3f80: 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a   Close a file..*
3f90: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 43  /.int sqlite3OsC
3fa0: 6c 6f 73 65 28 4f 73 46 69 6c 65 20 2a 69 64 29  lose(OsFile *id)
3fb0: 7b 0a 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  {.  sqlite3OsUnl
3fc0: 6f 63 6b 28 69 64 29 3b 0a 20 20 69 66 28 20 69  ock(id);.  if( i
3fd0: 64 2d 3e 64 69 72 66 64 3e 3d 30 20 29 20 63 6c  d->dirfd>=0 ) cl
3fe0: 6f 73 65 28 69 64 2d 3e 64 69 72 66 64 29 3b 0a  ose(id->dirfd);.
3ff0: 20 20 69 64 2d 3e 64 69 72 66 64 20 3d 20 2d 31    id->dirfd = -1
4000: 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74  ;.  sqlite3OsEnt
4010: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28  erMutex();.  if(
4020: 20 69 64 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63   id->pOpen->nLoc
4030: 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  k ){.    /* If t
4040: 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
4050: 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e  ding locks, do n
4060: 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73  ot actually clos
4070: 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a  e the file just.
4080: 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75      ** yet becau
4090: 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c  se that would cl
40a0: 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e  ear those locks.
40b0: 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74    Instead, add t
40c0: 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64  he file.    ** d
40d0: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 4f 70  escriptor to pOp
40e0: 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49  en->aPending.  I
40f0: 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  t will be automa
4100: 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77  tically closed w
4110: 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  hen.    ** the l
4120: 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61  ast lock is clea
4130: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
4140: 69 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20 73  int *aNew;.    s
4150: 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70  truct openCnt *p
4160: 4f 70 65 6e 20 3d 20 69 64 2d 3e 70 4f 70 65 6e  Open = id->pOpen
4170: 3b 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65  ;.    pOpen->nPe
4180: 6e 64 69 6e 67 2b 2b 3b 0a 20 20 20 20 61 4e 65  nding++;.    aNe
4190: 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  w = sqliteReallo
41a0: 63 28 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69  c( pOpen->aPendi
41b0: 6e 67 2c 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64  ng, pOpen->nPend
41c0: 69 6e 67 2a 73 69 7a 65 6f 66 28 69 6e 74 29 20  ing*sizeof(int) 
41d0: 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d  );.    if( aNew=
41e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
41f0: 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  f a malloc fails
4200: 2c 20 6a 75 73 74 20 6c 65 61 6b 20 74 68 65 20  , just leak the 
4210: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
4220: 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
4230: 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64      pOpen->aPend
4240: 69 6e 67 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20  ing = aNew;.    
4250: 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e    pOpen->aPendin
4260: 67 5b 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e  g[pOpen->nPendin
4270: 67 2d 31 5d 20 3d 20 69 64 2d 3e 66 64 3b 0a 20  g-1] = id->fd;. 
4280: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
4290: 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e    /* There are n
42a0: 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  o outstanding lo
42b0: 63 6b 73 20 73 6f 20 77 65 20 63 61 6e 20 63 6c  cks so we can cl
42c0: 6f 73 65 20 74 68 65 20 66 69 6c 65 20 69 6d 6d  ose the file imm
42d0: 65 64 69 61 74 65 6c 79 20 2a 2f 0a 20 20 20 20  ediately */.    
42e0: 63 6c 6f 73 65 28 69 64 2d 3e 66 64 29 3b 0a 20  close(id->fd);. 
42f0: 20 7d 0a 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b   }.  releaseLock
4300: 49 6e 66 6f 28 69 64 2d 3e 70 4c 6f 63 6b 29 3b  Info(id->pLock);
4310: 0a 20 20 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e  .  releaseOpenCn
4320: 74 28 69 64 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20  t(id->pOpen);.  
4330: 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75  sqlite3OsLeaveMu
4340: 74 65 78 28 29 3b 0a 20 20 54 52 41 43 45 32 28  tex();.  TRACE2(
4350: 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22  "CLOSE   %-3d\n"
4360: 2c 20 69 64 2d 3e 66 64 29 3b 0a 20 20 4f 70 65  , id->fd);.  Ope
4370: 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20  nCounter(-1);.  
4380: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
4390: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
43a0: 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65  data from a file
43b0: 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20   into a buffer. 
43c0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
43d0: 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65  K if all.** byte
43e0: 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63  s were read succ
43f0: 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c  essfully and SQL
4400: 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79  ITE_IOERR if any
4410: 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
4420: 6f 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ong..*/.int sqli
4430: 74 65 33 4f 73 52 65 61 64 28 4f 73 46 69 6c 65  te3OsRead(OsFile
4440: 20 2a 69 64 2c 20 76 6f 69 64 20 2a 70 42 75 66   *id, void *pBuf
4450: 2c 20 69 6e 74 20 61 6d 74 29 7b 0a 20 20 69 6e  , int amt){.  in
4460: 74 20 67 6f 74 3b 0a 20 20 53 69 6d 75 6c 61 74  t got;.  Simulat
4470: 65 49 4f 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  eIOError(SQLITE_
4480: 49 4f 45 52 52 29 3b 0a 20 20 54 49 4d 45 52 5f  IOERR);.  TIMER_
4490: 53 54 41 52 54 3b 0a 20 20 67 6f 74 20 3d 20 72  START;.  got = r
44a0: 65 61 64 28 69 64 2d 3e 66 64 2c 20 70 42 75 66  ead(id->fd, pBuf
44b0: 2c 20 61 6d 74 29 3b 0a 20 20 54 49 4d 45 52 5f  , amt);.  TIMER_
44c0: 45 4e 44 3b 0a 20 20 54 52 41 43 45 34 28 22 52  END;.  TRACE4("R
44d0: 45 41 44 20 20 20 20 25 2d 33 64 20 25 37 64 20  EAD    %-3d %7d 
44e0: 25 64 5c 6e 22 2c 20 69 64 2d 3e 66 64 2c 20 6c  %d\n", id->fd, l
44f0: 61 73 74 5f 70 61 67 65 2c 20 65 6c 61 70 73 65  ast_page, elapse
4500: 29 3b 0a 20 20 53 45 45 4b 28 30 29 3b 0a 20 20  );.  SEEK(0);.  
4510: 2f 2a 20 69 66 28 20 67 6f 74 3c 30 20 29 20 67  /* if( got<0 ) g
4520: 6f 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 69 66 28  ot = 0; */.  if(
4530: 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20   got==amt ){.   
4540: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
4550: 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
4560: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
4570: 45 52 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ERR;.  }.}../*.*
4580: 2a 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f  * Write data fro
4590: 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20  m a buffer into 
45a0: 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20  a file.  Return 
45b0: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
45c0: 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20  cess.** or some 
45d0: 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
45e0: 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a   on failure..*/.
45f0: 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 57 72 69  int sqlite3OsWri
4600: 74 65 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 63  te(OsFile *id, c
4610: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c  onst void *pBuf,
4620: 20 69 6e 74 20 61 6d 74 29 7b 0a 20 20 69 6e 74   int amt){.  int
4630: 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20 53 69   wrote = 0;.  Si
4640: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51  mulateIOError(SQ
4650: 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 54  LITE_IOERR);.  T
4660: 49 4d 45 52 5f 53 54 41 52 54 3b 0a 20 20 77 68  IMER_START;.  wh
4670: 69 6c 65 28 20 61 6d 74 3e 30 20 26 26 20 28 77  ile( amt>0 && (w
4680: 72 6f 74 65 20 3d 20 77 72 69 74 65 28 69 64 2d  rote = write(id-
4690: 3e 66 64 2c 20 70 42 75 66 2c 20 61 6d 74 29 29  >fd, pBuf, amt))
46a0: 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d  >0 ){.    amt -=
46b0: 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66   wrote;.    pBuf
46c0: 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75 66   = &((char*)pBuf
46d0: 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20  )[wrote];.  }.  
46e0: 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 54 52 41  TIMER_END;.  TRA
46f0: 43 45 34 28 22 57 52 49 54 45 20 20 20 25 2d 33  CE4("WRITE   %-3
4700: 64 20 25 37 64 20 25 64 5c 6e 22 2c 20 69 64 2d  d %7d %d\n", id-
4710: 3e 66 64 2c 20 6c 61 73 74 5f 70 61 67 65 2c 20  >fd, last_page, 
4720: 65 6c 61 70 73 65 29 3b 0a 20 20 53 45 45 4b 28  elapse);.  SEEK(
4730: 30 29 3b 0a 20 20 69 66 28 20 61 6d 74 3e 30 20  0);.  if( amt>0 
4740: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
4750: 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20  LITE_FULL;.  }. 
4760: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
4770: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  K;.}../*.** Move
4780: 20 74 68 65 20 72 65 61 64 2f 77 72 69 74 65 20   the read/write 
4790: 70 6f 69 6e 74 65 72 20 69 6e 20 61 20 66 69 6c  pointer in a fil
47a0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
47b0: 33 4f 73 53 65 65 6b 28 4f 73 46 69 6c 65 20 2a  3OsSeek(OsFile *
47c0: 69 64 2c 20 6f 66 66 5f 74 20 6f 66 66 73 65 74  id, off_t offset
47d0: 29 7b 0a 20 20 53 45 45 4b 28 6f 66 66 73 65 74  ){.  SEEK(offset
47e0: 2f 31 30 32 34 20 2b 20 31 29 3b 0a 20 20 6c 73  /1024 + 1);.  ls
47f0: 65 65 6b 28 69 64 2d 3e 66 64 2c 20 6f 66 66 73  eek(id->fd, offs
4800: 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20  et, SEEK_SET);. 
4810: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
4820: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  K;.}../*.** Make
4830: 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73   sure all writes
4840: 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72   to a particular
4850: 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74   file are commit
4860: 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ted to disk..**.
4870: 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61  ** Under Unix, a
4880: 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68  lso make sure th
4890: 61 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  at the directory
48a0: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66   entry for the f
48b0: 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ile.** has been 
48c0: 63 72 65 61 74 65 64 20 62 79 20 66 73 79 6e 63  created by fsync
48d0: 2d 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f  -ing the directo
48e0: 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ry that contains
48f0: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66   the file..** If
4900: 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68   we do not do th
4910: 69 73 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e  is and we encoun
4920: 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c  ter a power fail
4930: 75 72 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f  ure, the directo
4940: 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20  ry.** entry for 
4950: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
4960: 74 20 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65  t not exist afte
4970: 72 20 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68  r we reboot.  Th
4980: 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65  e next.** SQLite
4990: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 66   to access the f
49a0: 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f  ile will not kno
49b0: 77 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  w that the journ
49c0: 61 6c 20 65 78 69 73 74 73 20 28 62 65 63 61 75  al exists (becau
49d0: 73 65 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74  se.** the direct
49e0: 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68  ory entry for th
49f0: 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65  e journal was ne
4a00: 76 65 72 20 63 72 65 61 74 65 64 29 20 61 6e 64  ver created) and
4a10: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
4a20: 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c  .** will not rol
4a30: 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c  l back - possibl
4a40: 79 20 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74  y leading to dat
4a50: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
4a60: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
4a70: 4f 73 53 79 6e 63 28 4f 73 46 69 6c 65 20 2a 69  OsSync(OsFile *i
4a80: 64 29 7b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d){.  SimulateIO
4a90: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
4aa0: 52 52 29 3b 0a 20 20 54 52 41 43 45 32 28 22 53  RR);.  TRACE2("S
4ab0: 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20  YNC    %-3d\n", 
4ac0: 69 64 2d 3e 66 64 29 3b 0a 20 20 69 66 28 20 66  id->fd);.  if( f
4ad0: 73 79 6e 63 28 69 64 2d 3e 66 64 29 20 29 7b 0a  sync(id->fd) ){.
4ae0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
4af0: 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 65 6c 73 65  E_IOERR;.  }else
4b00: 7b 0a 20 20 20 20 69 66 28 20 69 64 2d 3e 64 69  {.    if( id->di
4b10: 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  rfd>=0 ){.      
4b20: 54 52 41 43 45 32 28 22 44 49 52 53 59 4e 43 20  TRACE2("DIRSYNC 
4b30: 25 2d 33 64 5c 6e 22 2c 20 69 64 2d 3e 64 69 72  %-3d\n", id->dir
4b40: 66 64 29 3b 0a 20 20 20 20 20 20 66 73 79 6e 63  fd);.      fsync
4b50: 28 69 64 2d 3e 64 69 72 66 64 29 3b 0a 20 20 20  (id->dirfd);.   
4b60: 20 20 20 63 6c 6f 73 65 28 69 64 2d 3e 64 69 72     close(id->dir
4b70: 66 64 29 3b 20 20 2f 2a 20 4f 6e 6c 79 20 6e 65  fd);  /* Only ne
4b80: 65 64 20 74 6f 20 73 79 6e 63 20 6f 6e 63 65 2c  ed to sync once,
4b90: 20 73 6f 20 63 6c 6f 73 65 20 74 68 65 20 64 69   so close the di
4ba0: 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20 20  rectory */.     
4bb0: 20 69 64 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b   id->dirfd = -1;
4bc0: 20 20 20 20 2f 2a 20 77 68 65 6e 20 77 65 20 61      /* when we a
4bd0: 72 65 20 64 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20  re done. */.    
4be0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  }.    return SQL
4bf0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ITE_OK;.  }.}../
4c00: 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e  *.** Truncate an
4c10: 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20   open file to a 
4c20: 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a  specified size.*
4c30: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 54  /.int sqlite3OsT
4c40: 72 75 6e 63 61 74 65 28 4f 73 46 69 6c 65 20 2a  runcate(OsFile *
4c50: 69 64 2c 20 6f 66 66 5f 74 20 6e 42 79 74 65 29  id, off_t nByte)
4c60: 7b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  {.  SimulateIOEr
4c70: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
4c80: 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 72 75  );.  return ftru
4c90: 6e 63 61 74 65 28 69 64 2d 3e 66 64 2c 20 6e 42  ncate(id->fd, nB
4ca0: 79 74 65 29 3d 3d 30 20 3f 20 53 51 4c 49 54 45  yte)==0 ? SQLITE
4cb0: 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45  _OK : SQLITE_IOE
4cc0: 52 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74  RR;.}../*.** Det
4cd0: 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65  ermine the curre
4ce0: 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c  nt size of a fil
4cf0: 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 69 6e  e in bytes.*/.in
4d00: 74 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  t sqlite3OsFileS
4d10: 69 7a 65 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20  ize(OsFile *id, 
4d20: 6f 66 66 5f 74 20 2a 70 53 69 7a 65 29 7b 0a 20  off_t *pSize){. 
4d30: 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
4d40: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
4d50: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
4d60: 29 3b 0a 20 20 69 66 28 20 66 73 74 61 74 28 69  );.  if( fstat(i
4d70: 64 2d 3e 66 64 2c 20 26 62 75 66 29 21 3d 30 20  d->fd, &buf)!=0 
4d80: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
4d90: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a  LITE_IOERR;.  }.
4da0: 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e 73    *pSize = buf.s
4db0: 74 5f 73 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e  t_size;.  return
4dc0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
4dd0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
4de0: 20 73 74 61 74 75 73 20 6f 66 20 74 68 65 20 6c   status of the l
4df0: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
4e00: 22 69 64 22 20 74 6f 20 62 65 20 61 20 72 65 61  "id" to be a rea
4e10: 64 6c 6f 63 6b 2e 0a 2a 2a 20 49 66 20 74 68 65  dlock..** If the
4e20: 20 66 69 6c 65 20 77 61 73 20 77 72 69 74 65 20   file was write 
4e30: 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 74 68 69  locked, then thi
4e40: 73 20 72 65 64 75 63 65 73 20 74 68 65 20 6c 6f  s reduces the lo
4e50: 63 6b 20 74 6f 20 61 20 72 65 61 64 2e 0a 2a 2a  ck to a read..**
4e60: 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73   If the file was
4e70: 20 72 65 61 64 20 6c 6f 63 6b 65 64 2c 20 74 68   read locked, th
4e80: 65 6e 20 74 68 69 73 20 61 63 71 75 69 72 65 73  en this acquires
4e90: 20 61 20 6e 65 77 20 72 65 61 64 20 6c 6f 63 6b   a new read lock
4ea0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
4eb0: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
4ec0: 65 73 73 20 61 6e 64 20 53 51 4c 49 54 45 5f 42  ess and SQLITE_B
4ed0: 55 53 59 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20  USY on failure. 
4ee0: 20 49 66 20 74 68 69 73 0a 2a 2a 20 6c 69 62 72   If this.** libr
4ef0: 61 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64  ary was compiled
4f00: 20 77 69 74 68 20 6c 61 72 67 65 20 66 69 6c 65   with large file
4f10: 20 73 75 70 70 6f 72 74 20 28 4c 46 53 29 20 62   support (LFS) b
4f20: 75 74 20 4c 46 53 20 69 73 20 6e 6f 74 0a 2a 2a  ut LFS is not.**
4f30: 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68   available on th
4f40: 65 20 68 6f 73 74 2c 20 74 68 65 6e 20 61 6e 20  e host, then an 
4f50: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 69 73 20  SQLITE_NOLFS is 
4f60: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
4f70: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 4c 6f   sqlite3OsReadLo
4f80: 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a  ck(OsFile *id){.
4f90: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
4fa0: 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28  te3OsEnterMutex(
4fb0: 29 3b 0a 20 20 69 66 28 20 69 64 2d 3e 70 4c 6f  );.  if( id->pLo
4fc0: 63 6b 2d 3e 63 6e 74 3e 30 20 29 7b 0a 20 20 20  ck->cnt>0 ){.   
4fd0: 20 69 66 28 20 21 69 64 2d 3e 6c 6f 63 6b 65 64   if( !id->locked
4fe0: 20 29 7b 0a 20 20 20 20 20 20 69 64 2d 3e 70 4c   ){.      id->pL
4ff0: 6f 63 6b 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20  ock->cnt++;.    
5000: 20 20 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20 31    id->locked = 1
5010: 3b 0a 20 20 20 20 20 20 69 64 2d 3e 70 4f 70 65  ;.      id->pOpe
5020: 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  n->nLock++;.    
5030: 7d 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  }.    rc = SQLIT
5040: 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  E_OK;.  }else if
5050: 28 20 69 64 2d 3e 6c 6f 63 6b 65 64 20 7c 7c 20  ( id->locked || 
5060: 69 64 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d  id->pLock->cnt==
5070: 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
5080: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20  flock lock;.    
5090: 69 6e 74 20 73 3b 0a 20 20 20 20 6c 6f 63 6b 2e  int s;.    lock.
50a0: 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
50b0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65  ;.    lock.l_whe
50c0: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
50d0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
50e0: 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20   = lock.l_len = 
50f0: 30 4c 3b 0a 20 20 20 20 73 20 3d 20 66 63 6e 74  0L;.    s = fcnt
5100: 6c 28 69 64 2d 3e 66 64 2c 20 46 5f 53 45 54 4c  l(id->fd, F_SETL
5110: 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69  K, &lock);.    i
5120: 66 28 20 73 21 3d 30 20 29 7b 0a 20 20 20 20 20  f( s!=0 ){.     
5130: 20 72 63 20 3d 20 28 65 72 72 6e 6f 3d 3d 45 49   rc = (errno==EI
5140: 4e 56 41 4c 29 20 3f 20 53 51 4c 49 54 45 5f 4e  NVAL) ? SQLITE_N
5150: 4f 4c 46 53 20 3a 20 53 51 4c 49 54 45 5f 42 55  OLFS : SQLITE_BU
5160: 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  SY;.    }else{. 
5170: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
5180: 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 21  _OK;.      if( !
5190: 69 64 2d 3e 6c 6f 63 6b 65 64 20 29 7b 0a 20 20  id->locked ){.  
51a0: 20 20 20 20 20 20 69 64 2d 3e 70 4f 70 65 6e 2d        id->pOpen-
51b0: 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20  >nLock++;.      
51c0: 20 20 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20 31    id->locked = 1
51d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
51e0: 69 64 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d  id->pLock->cnt =
51f0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
5200: 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
5210: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 73  TE_BUSY;.  }.  s
5220: 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74  qlite3OsLeaveMut
5230: 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ex();.  return r
5240: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
5250: 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ge the lock stat
5260: 75 73 20 74 6f 20 62 65 20 61 6e 20 65 78 63 6c  us to be an excl
5270: 75 73 69 76 65 20 6f 72 20 77 72 69 74 65 20 6c  usive or write l
5280: 6f 63 6b 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ock.  Return.** 
5290: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
52a0: 63 65 73 73 20 61 6e 64 20 53 51 4c 49 54 45 5f  cess and SQLITE_
52b0: 42 55 53 59 20 6f 6e 20 61 20 66 61 69 6c 75 72  BUSY on a failur
52c0: 65 2e 20 20 49 66 20 74 68 69 73 0a 2a 2a 20 6c  e.  If this.** l
52d0: 69 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69  ibrary was compi
52e0: 6c 65 64 20 77 69 74 68 20 6c 61 72 67 65 20 66  led with large f
52f0: 69 6c 65 20 73 75 70 70 6f 72 74 20 28 4c 46 53  ile support (LFS
5300: 29 20 62 75 74 20 4c 46 53 20 69 73 20 6e 6f 74  ) but LFS is not
5310: 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  .** available on
5320: 20 74 68 65 20 68 6f 73 74 2c 20 74 68 65 6e 20   the host, then 
5330: 61 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20  an SQLITE_NOLFS 
5340: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
5350: 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 57 72 69  int sqlite3OsWri
5360: 74 65 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69  teLock(OsFile *i
5370: 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  d){.  int rc;.  
5380: 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75  sqlite3OsEnterMu
5390: 74 65 78 28 29 3b 0a 20 20 69 66 28 20 69 64 2d  tex();.  if( id-
53a0: 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 7c  >pLock->cnt==0 |
53b0: 7c 20 28 69 64 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e  | (id->pLock->cn
53c0: 74 3d 3d 31 20 26 26 20 69 64 2d 3e 6c 6f 63 6b  t==1 && id->lock
53d0: 65 64 3d 3d 31 29 20 29 7b 0a 20 20 20 20 73 74  ed==1) ){.    st
53e0: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
53f0: 0a 20 20 20 20 69 6e 74 20 73 3b 0a 20 20 20 20  .    int s;.    
5400: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
5410: 57 52 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e  WRLCK;.    lock.
5420: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
5430: 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  SET;.    lock.l_
5440: 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c  start = lock.l_l
5450: 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 73 20 3d  en = 0L;.    s =
5460: 20 66 63 6e 74 6c 28 69 64 2d 3e 66 64 2c 20 46   fcntl(id->fd, F
5470: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a  _SETLK, &lock);.
5480: 20 20 20 20 69 66 28 20 73 21 3d 30 20 29 7b 0a      if( s!=0 ){.
5490: 20 20 20 20 20 20 72 63 20 3d 20 28 65 72 72 6e        rc = (errn
54a0: 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f 20 53 51 4c  o==EINVAL) ? SQL
54b0: 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c 49  ITE_NOLFS : SQLI
54c0: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c  TE_BUSY;.    }el
54d0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
54e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
54f0: 69 66 28 20 21 69 64 2d 3e 6c 6f 63 6b 65 64 20  if( !id->locked 
5500: 29 7b 0a 20 20 20 20 20 20 20 20 69 64 2d 3e 70  ){.        id->p
5510: 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  Open->nLock++;. 
5520: 20 20 20 20 20 20 20 69 64 2d 3e 6c 6f 63 6b 65         id->locke
5530: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  d = 1;.      }. 
5540: 20 20 20 20 20 69 64 2d 3e 70 4c 6f 63 6b 2d 3e       id->pLock->
5550: 63 6e 74 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  cnt = -1;.    }.
5560: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
5570: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
5580: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c 65   }.  sqlite3OsLe
5590: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  aveMutex();.  re
55a0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
55b0: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 67 69 76  * Unlock the giv
55c0: 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
55d0: 6f 72 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65  or.  If the file
55e0: 20 64 65 73 63 72 69 70 74 6f 72 20 77 61 73 0a   descriptor was.
55f0: 2a 2a 20 6e 6f 74 20 70 72 65 76 69 6f 75 73 6c  ** not previousl
5600: 79 20 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 74  y locked, then t
5610: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
5620: 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 74 68 69 73   no-op.  If this
5630: 0a 2a 2a 20 6c 69 62 72 61 72 79 20 77 61 73 20  .** library was 
5640: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 6c 61  compiled with la
5650: 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f 72 74  rge file support
5660: 20 28 4c 46 53 29 20 62 75 74 20 4c 46 53 20 69   (LFS) but LFS i
5670: 73 20 6e 6f 74 0a 2a 2a 20 61 76 61 69 6c 61 62  s not.** availab
5680: 6c 65 20 6f 6e 20 74 68 65 20 68 6f 73 74 2c 20  le on the host, 
5690: 74 68 65 6e 20 61 6e 20 53 51 4c 49 54 45 5f 4e  then an SQLITE_N
56a0: 4f 4c 46 53 20 69 73 20 72 65 74 75 72 6e 65 64  OLFS is returned
56b0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
56c0: 4f 73 55 6e 6c 6f 63 6b 28 4f 73 46 69 6c 65 20  OsUnlock(OsFile 
56d0: 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  *id){.  int rc;.
56e0: 20 20 69 66 28 20 21 69 64 2d 3e 6c 6f 63 6b 65    if( !id->locke
56f0: 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d ) return SQLIT
5700: 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 4f  E_OK;.  sqlite3O
5710: 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  sEnterMutex();. 
5720: 20 61 73 73 65 72 74 28 20 69 64 2d 3e 70 4c 6f   assert( id->pLo
5730: 63 6b 2d 3e 63 6e 74 21 3d 30 20 29 3b 0a 20 20  ck->cnt!=0 );.  
5740: 69 66 28 20 69 64 2d 3e 70 4c 6f 63 6b 2d 3e 63  if( id->pLock->c
5750: 6e 74 3e 31 20 29 7b 0a 20 20 20 20 69 64 2d 3e  nt>1 ){.    id->
5760: 70 4c 6f 63 6b 2d 3e 63 6e 74 2d 2d 3b 0a 20 20  pLock->cnt--;.  
5770: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
5780: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
5790: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
57a0: 3b 0a 20 20 20 20 69 6e 74 20 73 3b 0a 20 20 20  ;.    int s;.   
57b0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
57c0: 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b  _UNLCK;.    lock
57d0: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
57e0: 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  _SET;.    lock.l
57f0: 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f  _start = lock.l_
5800: 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 73 20  len = 0L;.    s 
5810: 3d 20 66 63 6e 74 6c 28 69 64 2d 3e 66 64 2c 20  = fcntl(id->fd, 
5820: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b  F_SETLK, &lock);
5830: 0a 20 20 20 20 69 66 28 20 73 21 3d 30 20 29 7b  .    if( s!=0 ){
5840: 0a 20 20 20 20 20 20 72 63 20 3d 20 28 65 72 72  .      rc = (err
5850: 6e 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f 20 53 51  no==EINVAL) ? SQ
5860: 4c 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c  LITE_NOLFS : SQL
5870: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65  ITE_BUSY;.    }e
5880: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
5890: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
58a0: 20 69 64 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 20   id->pLock->cnt 
58b0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
58c0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
58d0: 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63  OK ){.    /* Dec
58e0: 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74  rement the count
58f0: 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73   of locks agains
5900: 74 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c 65  t this same file
5910: 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20 20  .  When the.    
5920: 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73  ** count reaches
5930: 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79   zero, close any
5940: 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63   other file desc
5950: 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63 6c  riptors whose cl
5960: 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 64  ose.    ** was d
5970: 65 66 65 72 72 65 64 20 62 65 63 61 75 73 65 20  eferred because 
5980: 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  of outstanding l
5990: 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ocks..    */.   
59a0: 20 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20   struct openCnt 
59b0: 2a 70 4f 70 65 6e 20 3d 20 69 64 2d 3e 70 4f 70  *pOpen = id->pOp
59c0: 65 6e 3b 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 6e  en;.    pOpen->n
59d0: 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61 73 73 65  Lock--;.    asse
59e0: 72 74 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b  rt( pOpen->nLock
59f0: 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  >=0 );.    if( p
5a00: 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 26  Open->nLock==0 &
5a10: 26 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e  & pOpen->nPendin
5a20: 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  g>0 ){.      int
5a30: 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
5a40: 30 3b 20 69 3c 70 4f 70 65 6e 2d 3e 6e 50 65 6e  0; i<pOpen->nPen
5a50: 64 69 6e 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ding; i++){.    
5a60: 20 20 20 20 63 6c 6f 73 65 28 70 4f 70 65 6e 2d      close(pOpen-
5a70: 3e 61 50 65 6e 64 69 6e 67 5b 69 5d 29 3b 0a 20  >aPending[i]);. 
5a80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
5a90: 69 74 65 46 72 65 65 28 70 4f 70 65 6e 2d 3e 61  iteFree(pOpen->a
5aa0: 50 65 6e 64 69 6e 67 29 3b 0a 20 20 20 20 20 20  Pending);.      
5ab0: 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20  pOpen->nPending 
5ac0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e  = 0;.      pOpen
5ad0: 2d 3e 61 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a  ->aPending = 0;.
5ae0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
5af0: 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28  te3OsLeaveMutex(
5b00: 29 3b 0a 20 20 69 64 2d 3e 6c 6f 63 6b 65 64 20  );.  id->locked 
5b10: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
5b20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 69  ;.}../*.** Get i
5b30: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 73 65  nformation to se
5b40: 65 64 20 74 68 65 20 72 61 6e 64 6f 6d 20 6e 75  ed the random nu
5b50: 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 20  mber generator. 
5b60: 20 54 68 65 20 73 65 65 64 0a 2a 2a 20 69 73 20   The seed.** is 
5b70: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
5b80: 20 62 75 66 66 65 72 20 7a 42 75 66 5b 32 35 36   buffer zBuf[256
5b90: 5d 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  ].  The calling 
5ba0: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 0a 2a 2a  function must.**
5bb0: 20 73 75 70 70 6c 79 20 61 20 73 75 66 66 69 63   supply a suffic
5bc0: 69 65 6e 74 6c 79 20 6c 61 72 67 65 20 62 75 66  iently large buf
5bd0: 66 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  fer..*/.int sqli
5be0: 74 65 33 4f 73 52 61 6e 64 6f 6d 53 65 65 64 28  te3OsRandomSeed(
5bf0: 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 2f  char *zBuf){.  /
5c00: 2a 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 69  * We have to ini
5c10: 74 69 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20  tialize zBuf to 
5c20: 70 72 65 76 65 6e 74 20 76 61 6c 67 72 69 6e 64  prevent valgrind
5c30: 20 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a   from reporting.
5c40: 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54 68    ** errors.  Th
5c50: 65 20 72 65 70 6f 72 74 73 20 69 73 73 75 65 64  e reports issued
5c60: 20 62 79 20 76 61 6c 67 72 69 6e 64 20 61 72 65   by valgrind are
5c70: 20 69 6e 63 6f 72 72 65 63 74 20 2d 20 77 65 20   incorrect - we 
5c80: 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65  would.  ** prefe
5c90: 72 20 74 68 61 74 20 74 68 65 20 72 61 6e 64 6f  r that the rando
5ca0: 6d 6e 65 73 73 20 62 65 20 69 6e 63 72 65 61 73  mness be increas
5cb0: 65 64 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65  ed by making use
5cc0: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69   of the.  ** uni
5cd0: 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65  nitialized space
5ce0: 20 69 6e 20 7a 42 75 66 20 2d 20 62 75 74 20 76   in zBuf - but v
5cf0: 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 73 20 74  algrind errors t
5d00: 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a  end to worry.  *
5d10: 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e 20 20 52  * some users.  R
5d20: 61 74 68 65 72 20 74 68 61 6e 20 61 72 67 75 65  ather than argue
5d30: 2c 20 69 74 20 73 65 65 6d 73 20 65 61 73 69 65  , it seems easie
5d40: 72 20 6a 75 73 74 20 74 6f 20 69 6e 69 74 69 61  r just to initia
5d50: 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77 68  lize.  ** the wh
5d60: 6f 6c 65 20 61 72 72 61 79 20 61 6e 64 20 73 69  ole array and si
5d70: 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c 20  lence valgrind, 
5d80: 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61  even if that mea
5d90: 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65  ns less randomne
5da0: 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72  ss.  ** in the r
5db0: 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a  andom seed..  **
5dc0: 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65 73 74 69  .  ** When testi
5dd0: 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  ng, initializing
5de0: 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20   zBuf[] to zero 
5df0: 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54  is all we do.  T
5e00: 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74  hat means.  ** t
5e10: 68 61 74 20 77 65 20 61 6c 77 61 79 73 20 75 73  hat we always us
5e20: 65 20 74 68 65 20 73 61 6d 65 20 72 61 6e 64 6f  e the same rando
5e30: 6d 20 6e 75 6d 62 65 72 20 73 65 71 75 65 6e 63  m number sequenc
5e40: 65 2e 2a 20 54 68 69 73 20 6d 61 6b 65 73 20 74  e.* This makes t
5e50: 68 65 0a 20 20 2a 2a 20 74 65 73 74 73 20 72 65  he.  ** tests re
5e60: 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  peatable..  */. 
5e70: 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c   memset(zBuf, 0,
5e80: 20 32 35 36 29 3b 0a 23 69 66 20 21 64 65 66 69   256);.#if !defi
5e90: 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
5ea0: 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 70 69 64  .  {.    int pid
5eb0: 3b 0a 20 20 20 20 74 69 6d 65 28 28 74 69 6d 65  ;.    time((time
5ec0: 5f 74 2a 29 7a 42 75 66 29 3b 0a 20 20 20 20 70  _t*)zBuf);.    p
5ed0: 69 64 20 3d 20 67 65 74 70 69 64 28 29 3b 0a 20  id = getpid();. 
5ee0: 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
5ef0: 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29 5d 2c  sizeof(time_t)],
5f00: 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69   &pid, sizeof(pi
5f10: 64 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  d));.  }.#endif.
5f20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5f30: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65  OK;.}../*.** Sle
5f40: 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20  ep for a little 
5f50: 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74  while.  Return t
5f60: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d  he amount of tim
5f70: 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20  e slept..*/.int 
5f80: 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 69  sqlite3OsSleep(i
5f90: 6e 74 20 6d 73 29 7b 0a 23 69 66 20 64 65 66 69  nt ms){.#if defi
5fa0: 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29  ned(HAVE_USLEEP)
5fb0: 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50 0a   && HAVE_USLEEP.
5fc0: 20 20 75 73 6c 65 65 70 28 6d 73 2a 31 30 30 30    usleep(ms*1000
5fd0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 73 3b 0a  );.  return ms;.
5fe0: 23 65 6c 73 65 0a 20 20 73 6c 65 65 70 28 28 6d  #else.  sleep((m
5ff0: 73 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 20 20  s+999)/1000);.  
6000: 72 65 74 75 72 6e 20 31 30 30 30 2a 28 28 6d 73  return 1000*((ms
6010: 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 23 65 6e  +999)/1000);.#en
6020: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  dif.}../*.** Sta
6030: 74 69 63 20 76 61 72 69 61 62 6c 65 73 20 75 73  tic variables us
6040: 65 64 20 66 6f 72 20 74 68 72 65 61 64 20 73 79  ed for thread sy
6050: 6e 63 68 72 6f 6e 69 7a 61 74 69 6f 6e 0a 2a 2f  nchronization.*/
6060: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 4d 75  .static int inMu
6070: 74 65 78 20 3d 20 30 3b 0a 73 74 61 74 69 63 20  tex = 0;.static 
6080: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20  pthread_mutex_t 
6090: 6d 75 74 65 78 20 3d 20 50 54 48 52 45 41 44 5f  mutex = PTHREAD_
60a0: 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45  MUTEX_INITIALIZE
60b0: 52 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  R;../*.** The fo
60c0: 6c 6c 6f 77 69 6e 67 20 70 61 69 72 20 6f 66 20  llowing pair of 
60d0: 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
60e0: 74 20 6d 75 74 75 61 6c 20 65 78 63 6c 75 73 69  t mutual exclusi
60f0: 6f 6e 20 66 6f 72 0a 2a 2a 20 6d 75 6c 74 69 2d  on for.** multi-
6100: 74 68 72 65 61 64 65 64 20 70 72 6f 63 65 73 73  threaded process
6110: 65 73 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67  es.  Only a sing
6120: 6c 65 20 74 68 72 65 61 64 20 69 73 20 61 6c 6c  le thread is all
6130: 6f 77 65 64 20 74 6f 0a 2a 2a 20 65 78 65 63 75  owed to.** execu
6140: 74 65 64 20 63 6f 64 65 20 74 68 61 74 20 69 73  ted code that is
6150: 20 73 75 72 72 6f 75 6e 64 65 64 20 62 79 20 45   surrounded by E
6160: 6e 74 65 72 4d 75 74 65 78 28 29 20 61 6e 64 20  nterMutex() and 
6170: 4c 65 61 76 65 4d 75 74 65 78 28 29 2e 0a 2a 2a  LeaveMutex()..**
6180: 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73 65 73 20  .** SQLite uses 
6190: 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 4d 75  only a single Mu
61a0: 74 65 78 2e 20 20 54 68 65 72 65 20 69 73 20 6e  tex.  There is n
61b0: 6f 74 20 6d 75 63 68 20 63 72 69 74 69 63 61 6c  ot much critical
61c0: 0a 2a 2a 20 63 6f 64 65 20 61 6e 64 20 77 68 61  .** code and wha
61d0: 74 20 6c 69 74 74 6c 65 20 74 68 65 72 65 20 69  t little there i
61e0: 73 20 65 78 65 63 75 74 65 73 20 71 75 69 63 6b  s executes quick
61f0: 6c 79 20 61 6e 64 20 77 69 74 68 6f 75 74 20 62  ly and without b
6200: 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64  locking..*/.void
6210: 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d   sqlite3OsEnterM
6220: 75 74 65 78 28 29 7b 0a 23 69 66 64 65 66 20 53  utex(){.#ifdef S
6230: 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41  QLITE_UNIX_THREA
6240: 44 53 0a 20 20 70 74 68 72 65 61 64 5f 6d 75 74  DS.  pthread_mut
6250: 65 78 5f 6c 6f 63 6b 28 26 6d 75 74 65 78 29 3b  ex_lock(&mutex);
6260: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
6270: 28 20 21 69 6e 4d 75 74 65 78 20 29 3b 0a 20 20  ( !inMutex );.  
6280: 69 6e 4d 75 74 65 78 20 3d 20 31 3b 0a 7d 0a 76  inMutex = 1;.}.v
6290: 6f 69 64 20 73 71 6c 69 74 65 33 4f 73 4c 65 61  oid sqlite3OsLea
62a0: 76 65 4d 75 74 65 78 28 29 7b 0a 20 20 61 73 73  veMutex(){.  ass
62b0: 65 72 74 28 20 69 6e 4d 75 74 65 78 20 29 3b 0a  ert( inMutex );.
62c0: 20 20 69 6e 4d 75 74 65 78 20 3d 20 30 3b 0a 23    inMutex = 0;.#
62d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49  ifdef SQLITE_UNI
62e0: 58 5f 54 48 52 45 41 44 53 0a 20 20 70 74 68 72  X_THREADS.  pthr
62f0: 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  ead_mutex_unlock
6300: 28 26 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69 66  (&mutex);.#endif
6310: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61  .}../*.** Turn a
6320: 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
6330: 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70  me into a full p
6340: 61 74 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e  athname.  Return
6350: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
6360: 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
6370: 6d 65 20 73 74 6f 72 65 64 20 69 6e 20 73 70 61  me stored in spa
6380: 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ce obtained from
6390: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e   sqliteMalloc().
63a0: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
63b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70  function is resp
63c0: 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65 65  onsible for free
63d0: 69 6e 67 20 74 68 69 73 20 73 70 61 63 65 20 6f  ing this space o
63e0: 6e 63 65 20 69 74 0a 2a 2a 20 69 73 20 6e 6f 20  nce it.** is no 
63f0: 6c 6f 6e 67 65 72 20 6e 65 65 64 65 64 2e 0a 2a  longer needed..*
6400: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4f  /.char *sqlite3O
6410: 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 63 6f  sFullPathname(co
6420: 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74  nst char *zRelat
6430: 69 76 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46  ive){.  char *zF
6440: 75 6c 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a  ull = 0;.  if( z
6450: 52 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27  Relative[0]=='/'
6460: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
6470: 65 74 53 74 72 69 6e 67 28 26 7a 46 75 6c 6c 2c  etString(&zFull,
6480: 20 7a 52 65 6c 61 74 69 76 65 2c 20 28 63 68 61   zRelative, (cha
6490: 72 2a 29 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  r*)0);.  }else{.
64a0: 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30      char zBuf[50
64b0: 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  00];.    sqlite3
64c0: 53 65 74 53 74 72 69 6e 67 28 26 7a 46 75 6c 6c  SetString(&zFull
64d0: 2c 20 67 65 74 63 77 64 28 7a 42 75 66 2c 20 73  , getcwd(zBuf, s
64e0: 69 7a 65 6f 66 28 7a 42 75 66 29 29 2c 20 22 2f  izeof(zBuf)), "/
64f0: 22 2c 20 7a 52 65 6c 61 74 69 76 65 2c 0a 20 20  ", zRelative,.  
6500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6510: 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 7d    (char*)0);.  }
6520: 0a 20 20 72 65 74 75 72 6e 20 7a 46 75 6c 6c 3b  .  return zFull;
6530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
6540: 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
6550: 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f  , if set to a no
6560: 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 62 65  n-zero value, be
6570: 63 6f 6d 65 73 20 74 68 65 20 72 65 73 75 6c 74  comes the result
6580: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 66 72 6f  .** returned fro
6590: 6d 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65  m sqlite3OsCurre
65a0: 6e 74 54 69 6d 65 28 29 2e 20 20 54 68 69 73 20  ntTime().  This 
65b0: 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
65c0: 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ing..*/.#ifdef S
65d0: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
65e0: 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
65f0: 69 6d 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ime = 0;.#endif.
6600: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
6610: 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
6620: 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
6630: 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
6640: 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72  rite the.** curr
6650: 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
6660: 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
6670: 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  y number into *p
6680: 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75  rNow and.** retu
6690: 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20  rn 0.  Return 1 
66a0: 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
66b0: 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66  date cannot be f
66c0: 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ound..*/.int sql
66d0: 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d  ite3OsCurrentTim
66e0: 65 28 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29  e(double *prNow)
66f0: 7b 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20  {.  time_t t;.  
6700: 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70 72 4e  time(&t);.  *prN
6710: 6f 77 20 3d 20 74 2f 38 36 34 30 30 2e 30 20 2b  ow = t/86400.0 +
6720: 20 32 34 34 30 35 38 37 2e 35 3b 0a 23 69 66 64   2440587.5;.#ifd
6730: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
6740: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72   if( sqlite3_cur
6750: 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20  rent_time ){.   
6760: 20 2a 70 72 4e 6f 77 20 3d 20 73 71 6c 69 74 65   *prNow = sqlite
6770: 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 2f 38  3_current_time/8
6780: 36 34 30 30 2e 30 20 2b 20 32 34 34 30 35 38 37  6400.0 + 2440587
6790: 2e 35 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  .5;.  }.#endif. 
67a0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 65   return 0;.}..#e
67b0: 6e 64 69 66 20 2f 2a 20 4f 53 5f 55 4e 49 58 20  ndif /* OS_UNIX 
67c0: 2a 2f 0a                                         */.