/ Hex Artifact Content
Login

Artifact bf192a86b9aa5ca3889613fde9bac084274f5eed:


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 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
01d0: 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68 22 0a  #include "os.h".
01e0: 23 69 66 20 4f 53 5f 55 4e 49 58 20 20 20 20 20  #if OS_UNIX     
01f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
0200: 20 66 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e   file is used on
0210: 20 75 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f   unix only */../
0220: 2a 20 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  * #define SQLITE
0230: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
0240: 53 54 59 4c 45 20 30 20 2a 2f 0a 0a 2f 2a 0a 2a  STYLE 0 */../*.*
0250: 2a 20 54 68 65 73 65 20 23 64 65 66 69 6e 65 73  * These #defines
0260: 20 73 68 6f 75 6c 64 20 65 6e 61 62 6c 65 20 3e   should enable >
0270: 32 47 42 20 66 69 6c 65 20 73 75 70 70 6f 72 74  2GB file support
0280: 20 6f 6e 20 50 6f 73 69 78 20 69 66 20 74 68 65   on Posix if the
0290: 0a 2a 2a 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f  .** underlying o
02a0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
02b0: 73 75 70 70 6f 72 74 73 20 69 74 2e 20 20 49 66  supports it.  If
02c0: 20 74 68 65 20 4f 53 20 6c 61 63 6b 73 0a 2a 2a   the OS lacks.**
02d0: 20 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70   large file supp
02e0: 6f 72 74 2c 20 74 68 65 73 65 20 73 68 6f 75 6c  ort, these shoul
02f0: 64 20 62 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2a 0a  d be no-ops..**.
0300: 2a 2a 20 4c 61 72 67 65 20 66 69 6c 65 20 73 75  ** Large file su
0310: 70 70 6f 72 74 20 63 61 6e 20 62 65 20 64 69 73  pport can be dis
0320: 61 62 6c 65 64 20 75 73 69 6e 67 20 74 68 65 20  abled using the 
0330: 2d 44 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  -DSQLITE_DISABLE
0340: 5f 4c 46 53 20 73 77 69 74 63 68 0a 2a 2a 20 6f  _LFS switch.** o
0350: 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 63  n the compiler c
0360: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20 20 54 68  ommand line.  Th
0370: 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
0380: 69 66 20 79 6f 75 20 61 72 65 20 63 6f 6d 70 69  if you are compi
0390: 6c 69 6e 67 0a 2a 2a 20 6f 6e 20 61 20 72 65 63  ling.** on a rec
03a0: 65 6e 74 20 6d 61 63 68 69 6e 65 20 28 65 78 3a  ent machine (ex:
03b0: 20 52 65 64 48 61 74 20 37 2e 32 29 20 62 75 74   RedHat 7.2) but
03c0: 20 79 6f 75 20 77 61 6e 74 20 79 6f 75 72 20 63   you want your c
03d0: 6f 64 65 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 6f  ode to work.** o
03e0: 6e 20 61 6e 20 6f 6c 64 65 72 20 6d 61 63 68 69  n an older machi
03f0: 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20 36  ne (ex: RedHat 6
0400: 2e 30 29 2e 20 20 49 66 20 79 6f 75 20 63 6f 6d  .0).  If you com
0410: 70 69 6c 65 20 6f 6e 20 52 65 64 48 61 74 20 37  pile on RedHat 7
0420: 2e 32 0a 2a 2a 20 77 69 74 68 6f 75 74 20 74 68  .2.** without th
0430: 69 73 20 6f 70 74 69 6f 6e 2c 20 4c 46 53 20 69  is option, LFS i
0440: 73 20 65 6e 61 62 6c 65 2e 20 20 42 75 74 20 4c  s enable.  But L
0450: 46 53 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  FS does not exis
0460: 74 20 69 6e 20 74 68 65 20 6b 65 72 6e 65 6c 0a  t in the kernel.
0470: 2a 2a 20 69 6e 20 52 65 64 48 61 74 20 36 2e 30  ** in RedHat 6.0
0480: 2c 20 73 6f 20 74 68 65 20 63 6f 64 65 20 77 6f  , so the code wo
0490: 6e 27 74 20 77 6f 72 6b 2e 20 20 48 65 6e 63 65  n't work.  Hence
04a0: 2c 20 66 6f 72 20 6d 61 78 69 6d 75 6d 20 62 69  , for maximum bi
04b0: 6e 61 72 79 0a 2a 2a 20 70 6f 72 74 61 62 69 6c  nary.** portabil
04c0: 69 74 79 20 79 6f 75 20 73 68 6f 75 6c 64 20 6f  ity you should o
04d0: 6d 69 74 20 4c 46 53 2e 0a 2a 2f 0a 23 69 66 6e  mit LFS..*/.#ifn
04e0: 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
04f0: 4c 45 5f 4c 46 53 0a 23 20 64 65 66 69 6e 65 20  LE_LFS.# define 
0500: 5f 4c 41 52 47 45 5f 46 49 4c 45 20 20 20 20 20  _LARGE_FILE     
0510: 20 20 31 0a 23 20 69 66 6e 64 65 66 20 5f 46 49    1.# ifndef _FI
0520: 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 0a 23  LE_OFFSET_BITS.#
0530: 20 20 20 64 65 66 69 6e 65 20 5f 46 49 4c 45 5f     define _FILE_
0540: 4f 46 46 53 45 54 5f 42 49 54 53 20 36 34 0a 23  OFFSET_BITS 64.#
0550: 20 65 6e 64 69 66 0a 23 20 64 65 66 69 6e 65 20   endif.# define 
0560: 5f 4c 41 52 47 45 46 49 4c 45 5f 53 4f 55 52 43  _LARGEFILE_SOURC
0570: 45 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  E 1.#endif../*.*
0580: 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 63 6c 75  * standard inclu
0590: 64 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a 23 69 6e  de files..*/.#in
05a0: 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73  clude <sys/types
05b0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
05c0: 73 2f 73 74 61 74 2e 68 3e 0a 23 69 6e 63 6c 75  s/stat.h>.#inclu
05d0: 64 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 69 6e  de <fcntl.h>.#in
05e0: 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e  clude <unistd.h>
05f0: 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e  .#include <time.
0600: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
0610: 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  /time.h>.#includ
0620: 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69 66 64  e <errno.h>.#ifd
0630: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
0640: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23  _LOCKING_STYLE.#
0650: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63  include <sys/ioc
0660: 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  tl.h>.#include <
0670: 73 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 69 6e  sys/param.h>.#in
0680: 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6f 75 6e 74  clude <sys/mount
0690: 2e 68 3e 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .h>.#endif /* SQ
06a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
06b0: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a  ING_STYLE */../*
06c0: 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 74 6f  .** If we are to
06d0: 20 62 65 20 74 68 72 65 61 64 2d 73 61 66 65 2c   be thread-safe,
06e0: 20 69 6e 63 6c 75 64 65 20 74 68 65 20 70 74 68   include the pth
06f0: 72 65 61 64 73 20 68 65 61 64 65 72 20 61 6e 64  reads header and
0700: 20 64 65 66 69 6e 65 0a 2a 2a 20 74 68 65 20 53   define.** the S
0710: 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41  QLITE_UNIX_THREA
0720: 44 53 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66  DS macro..*/.#if
0730: 6e 64 65 66 20 54 48 52 45 41 44 53 41 46 45 0a  ndef THREADSAFE.
0740: 23 20 64 65 66 69 6e 65 20 54 48 52 45 41 44 53  # define THREADS
0750: 41 46 45 20 31 0a 23 65 6e 64 69 66 0a 23 69 66  AFE 1.#endif.#if
0760: 20 54 48 52 45 41 44 53 41 46 45 0a 23 20 69 6e   THREADSAFE.# in
0770: 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e 68  clude <pthread.h
0780: 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  >.# define SQLIT
0790: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 31  E_UNIX_THREADS 1
07a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
07b0: 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f  efault permissio
07c0: 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ns when creating
07d0: 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a 23   a new file.*/.#
07e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45  ifndef SQLITE_DE
07f0: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
0800: 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20  SSIONS.# define 
0810: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
0820: 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20  ILE_PERMISSIONS 
0830: 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0644.#endif../*.
0840: 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70 70 6f  ** Maximum suppo
0850: 72 74 65 64 20 70 61 74 68 2d 6c 65 6e 67 74 68  rted path-length
0860: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58  ..*/.#define MAX
0870: 5f 50 41 54 48 4e 41 4d 45 20 35 31 32 0a 0a 0a  _PATHNAME 512...
0880: 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 78 46 69  /*.** The unixFi
0890: 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20  le structure is 
08a0: 73 75 62 63 6c 61 73 73 20 6f 66 20 4f 73 46 69  subclass of OsFi
08b0: 6c 65 20 73 70 65 63 69 66 69 63 20 66 6f 72 20  le specific for 
08c0: 74 68 65 20 75 6e 69 78 0a 2a 2a 20 70 72 6f 74  the unix.** prot
08d0: 61 62 69 6c 69 74 79 20 6c 61 79 65 72 2e 0a 2a  ability layer..*
08e0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
08f0: 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69   unixFile unixFi
0900: 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46  le;.struct unixF
0910: 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ile {.  sqlite3_
0920: 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74  io_methods const
0930: 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41   *pMethod;  /* A
0940: 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
0950: 65 6e 74 72 79 20 2a 2f 0a 20 20 73 74 72 75 63  entry */.  struc
0960: 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e  t openCnt *pOpen
0970: 3b 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f  ;    /* Info abo
0980: 75 74 20 61 6c 6c 20 6f 70 65 6e 20 66 64 27 73  ut all open fd's
0990: 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a   on this inode *
09a0: 2f 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49  /.  struct lockI
09b0: 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 20 20 20 2f 2a  nfo *pLock;   /*
09c0: 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b   Info about lock
09d0: 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20  s on this inode 
09e0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
09f0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
0a00: 53 54 59 4c 45 0a 20 20 76 6f 69 64 20 2a 6c 6f  STYLE.  void *lo
0a10: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20  ckingContext;   
0a20: 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74 79    /* Locking sty
0a30: 6c 65 20 73 70 65 63 69 66 69 63 20 73 74 61 74  le specific stat
0a40: 65 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53  e */.#endif /* S
0a50: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
0a60: 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 20 20  KING_STYLE */.  
0a70: 69 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20 20  int h;          
0a80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0a90: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
0aa0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
0ab0: 68 61 72 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20  har locktype;   
0ac0: 2f 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20 6c  /* The type of l
0ad0: 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 69 73  ock held on this
0ae0: 20 66 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65   fd */.  unsigne
0af0: 64 20 63 68 61 72 20 69 73 4f 70 65 6e 3b 20 20  d char isOpen;  
0b00: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65     /* True if ne
0b10: 65 64 73 20 74 6f 20 62 65 20 63 6c 6f 73 65 64  eds to be closed
0b20: 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64 3b   */.  int dirfd;
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b40: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
0b50: 6f 72 20 66 6f 72 20 74 68 65 20 64 69 72 65 63  or for the direc
0b60: 74 6f 72 79 20 2a 2f 0a 20 20 69 36 34 20 6f 66  tory */.  i64 of
0b70: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
0b80: 20 20 20 20 2f 2a 20 53 65 65 6b 20 6f 66 66 73      /* Seek offs
0b90: 65 74 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  et */.#ifdef SQL
0ba0: 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53  ITE_UNIX_THREADS
0bb0: 0a 20 20 70 74 68 72 65 61 64 5f 74 20 74 69 64  .  pthread_t tid
0bc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0bd0: 54 68 65 20 74 68 72 65 61 64 20 74 68 61 74 20  The thread that 
0be0: 22 6f 77 6e 73 22 20 74 68 69 73 20 4f 73 46 69  "owns" this OsFi
0bf0: 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  le */.#endif.};.
0c00: 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20  ../*.** Provide 
0c10: 74 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20 6f  the ability to o
0c20: 76 65 72 72 69 64 65 20 73 6f 6d 65 20 4f 53 2d  verride some OS-
0c30: 6c 61 79 65 72 20 66 75 6e 63 74 69 6f 6e 73 20  layer functions 
0c40: 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e  during.** testin
0c50: 67 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  g.  This is used
0c60: 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 4f 53 20   to simulate OS 
0c70: 63 72 61 73 68 65 73 20 74 6f 20 76 65 72 69 66  crashes to verif
0c80: 79 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6d 6d 69  y that .** commi
0c90: 74 73 20 61 72 65 20 61 74 6f 6d 69 63 20 65 76  ts are atomic ev
0ca0: 65 6e 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  en in the event 
0cb0: 6f 66 20 61 6e 20 4f 53 20 63 72 61 73 68 2e 0a  of an OS crash..
0cc0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
0cd0: 5f 43 52 41 53 48 5f 54 45 53 54 0a 20 20 65 78  _CRASH_TEST.  ex
0ce0: 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
0cf0: 43 72 61 73 68 54 65 73 74 45 6e 61 62 6c 65 3b  CrashTestEnable;
0d00: 0a 20 20 69 6e 74 20 73 71 6c 69 74 65 33 43 72  .  int sqlite3Cr
0d10: 61 73 68 46 69 6c 65 57 72 61 70 28 73 71 6c 69  ashFileWrap(sqli
0d20: 74 65 33 5f 66 69 6c 65 20 2a 2c 20 63 6f 6e 73  te3_file *, cons
0d30: 74 20 63 68 61 72 20 2a 2c 20 73 71 6c 69 74 65  t char *, sqlite
0d40: 33 5f 66 69 6c 65 20 2a 2a 29 3b 0a 20 20 73 74  3_file **);.  st
0d50: 61 74 69 63 20 69 6e 74 20 43 52 41 53 48 5f 54  atic int CRASH_T
0d60: 45 53 54 5f 4f 56 45 52 52 49 44 45 28 63 6f 6e  EST_OVERRIDE(con
0d70: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20  st char *zFile, 
0d80: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 2a 70  sqlite3_file **p
0d90: 49 64 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 20  Id, int rc){.   
0da0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
0db0: 4f 4b 20 26 26 20 73 71 6c 69 74 65 33 43 72 61  OK && sqlite3Cra
0dc0: 73 68 54 65 73 74 45 6e 61 62 6c 65 20 29 7b 0a  shTestEnable ){.
0dd0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
0de0: 65 33 43 72 61 73 68 46 69 6c 65 57 72 61 70 28  e3CrashFileWrap(
0df0: 2a 70 49 64 2c 20 7a 46 69 6c 65 2c 20 70 49 64  *pId, zFile, pId
0e00: 29 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ); .    }.    re
0e10: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6c  turn rc;.  }.#el
0e20: 73 65 0a 23 20 64 65 66 69 6e 65 20 43 52 41 53  se.# define CRAS
0e30: 48 5f 54 45 53 54 5f 4f 56 45 52 52 49 44 45 28  H_TEST_OVERRIDE(
0e40: 41 2c 42 2c 43 29 20 43 0a 23 65 6e 64 69 66 0a  A,B,C) C.#endif.
0e50: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20  ../*.** Include 
0e60: 63 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d  code that is com
0e70: 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e  mon to all os_*.
0e80: 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c  c files.*/.#incl
0e90: 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68  ude "os_common.h
0ea0: 22 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20  "../*.** Do not 
0eb0: 69 6e 63 6c 75 64 65 20 61 6e 79 20 6f 66 20 74  include any of t
0ec0: 68 65 20 46 69 6c 65 20 49 2f 4f 20 69 6e 74 65  he File I/O inte
0ed0: 72 66 61 63 65 20 70 72 6f 63 65 64 75 72 65 73  rface procedures
0ee0: 20 69 66 20 74 68 65 0a 2a 2a 20 53 51 4c 49 54   if the.** SQLIT
0ef0: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 6d 61  E_OMIT_DISKIO ma
0f00: 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64 20 28  cro is defined (
0f10: 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
0f20: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
0f30: 77 69 6c 6c 20 62 65 20 69 6e 2d 6d 65 6d 6f 72  will be in-memor
0f40: 79 20 6f 6e 6c 79 29 0a 2a 2f 0a 23 69 66 6e 64  y only).*/.#ifnd
0f50: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
0f60: 49 53 4b 49 4f 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  ISKIO.../*.** De
0f70: 66 69 6e 65 20 76 61 72 69 6f 75 73 20 6d 61 63  fine various mac
0f80: 72 6f 73 20 74 68 61 74 20 61 72 65 20 6d 69 73  ros that are mis
0f90: 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20 73  sing from some s
0fa0: 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64  ystems..*/.#ifnd
0fb0: 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23  ef O_LARGEFILE.#
0fc0: 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46   define O_LARGEF
0fd0: 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  ILE 0.#endif.#if
0fe0: 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
0ff0: 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20 4f  LE_LFS.# undef O
1000: 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66  _LARGEFILE.# def
1010: 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20  ine O_LARGEFILE 
1020: 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  0.#endif.#ifndef
1030: 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65   O_NOFOLLOW.# de
1040: 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20  fine O_NOFOLLOW 
1050: 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  0.#endif.#ifndef
1060: 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65 66 69   O_BINARY.# defi
1070: 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23 65  ne O_BINARY 0.#e
1080: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
1090: 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20 65  DJGPP compiler e
10a0: 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73  nvironment looks
10b0: 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69   mostly like Uni
10c0: 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63  x, but it.** lac
10d0: 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20 73  ks the fcntl() s
10e0: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20  ystem call.  So 
10f0: 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 29  redefine fcntl()
1100: 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67   to be something
1110: 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73 20  .** that always 
1120: 73 75 63 63 65 65 64 73 2e 20 20 54 68 69 73 20  succeeds.  This 
1130: 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69  means that locki
1140: 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  ng does not occu
1150: 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50  r under.** DJGPP
1160: 2e 20 20 42 75 74 20 69 74 27 73 20 44 4f 53 20  .  But it's DOS 
1170: 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75 20 65  - what did you e
1180: 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65 66  xpect?.*/.#ifdef
1190: 20 5f 5f 44 4a 47 50 50 5f 5f 0a 23 20 64 65 66   __DJGPP__.# def
11a0: 69 6e 65 20 66 63 6e 74 6c 28 41 2c 42 2c 43 29  ine fcntl(A,B,C)
11b0: 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
11c0: 20 54 68 65 20 74 68 72 65 61 64 69 64 20 6d 61   The threadid ma
11d0: 63 72 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f 20  cro resolves to 
11e0: 74 68 65 20 74 68 72 65 61 64 2d 69 64 20 6f 72  the thread-id or
11f0: 20 74 6f 20 30 2e 20 20 55 73 65 64 20 66 6f 72   to 0.  Used for
1200: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
1210: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
1220: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1230: 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 23 64  _UNIX_THREADS.#d
1240: 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 70  efine threadid p
1250: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65  thread_self().#e
1260: 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65  lse.#define thre
1270: 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  adid 0.#endif../
1280: 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 63 68 65 63  *.** Set or chec
1290: 6b 20 74 68 65 20 4f 73 46 69 6c 65 2e 74 69 64  k the OsFile.tid
12a0: 20 66 69 65 6c 64 2e 20 20 54 68 69 73 20 66 69   field.  This fi
12b0: 65 6c 64 20 69 73 20 73 65 74 20 77 68 65 6e 20  eld is set when 
12c0: 61 6e 20 4f 73 46 69 6c 65 0a 2a 2a 20 69 73 20  an OsFile.** is 
12d0: 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 20 41  first opened.  A
12e0: 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 75 73  ll subsequent us
12f0: 65 73 20 6f 66 20 74 68 65 20 4f 73 46 69 6c 65  es of the OsFile
1300: 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
1310: 0a 2a 2a 20 73 61 6d 65 20 74 68 72 65 61 64 20  .** same thread 
1320: 69 73 20 6f 70 65 72 61 74 69 6e 67 20 6f 6e 20  is operating on 
1330: 74 68 65 20 4f 73 46 69 6c 65 2e 20 20 53 6f 6d  the OsFile.  Som
1340: 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
1350: 65 6d 73 20 64 6f 0a 2a 2a 20 6e 6f 74 20 61 6c  ems do.** not al
1360: 6c 6f 77 20 6c 6f 63 6b 73 20 74 6f 20 62 65 20  low locks to be 
1370: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 6f 74  overridden by ot
1380: 68 65 72 20 74 68 72 65 61 64 73 20 61 6e 64 20  her threads and 
1390: 74 68 61 74 20 72 65 73 74 72 69 63 74 69 6f 6e  that restriction
13a0: 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 73  .** means that s
13b0: 71 6c 69 74 65 33 2a 20 64 61 74 61 62 61 73 65  qlite3* database
13c0: 20 68 61 6e 64 6c 65 73 20 63 61 6e 6e 6f 74 20   handles cannot 
13d0: 62 65 20 6d 6f 76 65 64 20 66 72 6f 6d 20 6f 6e  be moved from on
13e0: 65 20 74 68 72 65 61 64 0a 2a 2a 20 74 6f 20 61  e thread.** to a
13f0: 6e 6f 74 68 65 72 2e 20 20 54 68 69 73 20 6c 6f  nother.  This lo
1400: 67 69 63 20 6d 61 6b 65 73 20 73 75 72 65 20 61  gic makes sure a
1410: 20 75 73 65 72 20 64 6f 65 73 20 6e 6f 74 20 74   user does not t
1420: 72 79 20 74 6f 20 64 6f 20 74 68 61 74 0a 2a 2a  ry to do that.**
1430: 20 62 79 20 6d 69 73 74 61 6b 65 2e 0a 2a 2a 0a   by mistake..**.
1440: 2a 2a 20 56 65 72 73 69 6f 6e 20 33 2e 33 2e 31  ** Version 3.3.1
1450: 20 28 32 30 30 36 2d 30 31 2d 31 35 29 3a 20 20   (2006-01-15):  
1460: 4f 73 46 69 6c 65 73 20 63 61 6e 20 62 65 20 6d  OsFiles can be m
1470: 6f 76 65 64 20 66 72 6f 6d 20 6f 6e 65 20 74 68  oved from one th
1480: 72 65 61 64 20 74 6f 0a 2a 2a 20 61 6e 6f 74 68  read to.** anoth
1490: 65 72 20 61 73 20 6c 6f 6e 67 20 61 73 20 77 65  er as long as we
14a0: 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20   are running on 
14b0: 61 20 73 79 73 74 65 6d 20 74 68 61 74 20 73 75  a system that su
14c0: 70 70 6f 72 74 73 20 74 68 72 65 61 64 73 0a 2a  pports threads.*
14d0: 2a 20 6f 76 65 72 72 69 64 69 6e 67 20 65 61 63  * overriding eac
14e0: 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20 28  h others locks (
14f0: 77 68 69 63 68 20 6e 6f 77 20 74 68 65 20 6d 6f  which now the mo
1500: 73 74 20 63 6f 6d 6d 6f 6e 20 62 65 68 61 76 69  st common behavi
1510: 6f 72 29 0a 2a 2a 20 6f 72 20 69 66 20 6e 6f 20  or).** or if no 
1520: 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 20  locks are held. 
1530: 20 42 75 74 20 74 68 65 20 4f 73 46 69 6c 65 2e   But the OsFile.
1540: 70 4c 6f 63 6b 20 66 69 65 6c 64 20 6e 65 65 64  pLock field need
1550: 73 20 74 6f 20 62 65 0a 2a 2a 20 72 65 63 6f 6d  s to be.** recom
1560: 70 75 74 65 64 20 62 65 63 61 75 73 65 20 69 74  puted because it
1570: 73 20 6b 65 79 20 69 6e 63 6c 75 64 65 73 20 74  s key includes t
1580: 68 65 20 74 68 72 65 61 64 2d 69 64 2e 20 20 53  he thread-id.  S
1590: 65 65 20 74 68 65 20 0a 2a 2a 20 74 72 61 6e 73  ee the .** trans
15a0: 66 65 72 4f 77 6e 65 72 73 68 69 70 28 29 20 66  ferOwnership() f
15b0: 75 6e 63 74 69 6f 6e 20 62 65 6c 6f 77 20 66 6f  unction below fo
15c0: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
15d0: 6f 72 6d 61 74 69 6f 6e 0a 2a 2f 0a 23 69 66 20  ormation.*/.#if 
15e0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 55  defined(SQLITE_U
15f0: 4e 49 58 5f 54 48 52 45 41 44 53 29 0a 23 20 64  NIX_THREADS).# d
1600: 65 66 69 6e 65 20 53 45 54 5f 54 48 52 45 41 44  efine SET_THREAD
1610: 49 44 28 58 29 20 20 20 28 58 29 2d 3e 74 69 64  ID(X)   (X)->tid
1620: 20 3d 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28   = pthread_self(
1630: 29 0a 23 20 64 65 66 69 6e 65 20 43 48 45 43 4b  ).# define CHECK
1640: 5f 54 48 52 45 41 44 49 44 28 58 29 20 28 74 68  _THREADID(X) (th
1650: 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63  readsOverrideEac
1660: 68 4f 74 68 65 72 73 4c 6f 63 6b 73 3d 3d 30 20  hOthersLocks==0 
1670: 26 26 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  && \.           
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 20 21 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28   !pthread_equal(
16a0: 28 58 29 2d 3e 74 69 64 2c 20 70 74 68 72 65 61  (X)->tid, pthrea
16b0: 64 5f 73 65 6c 66 28 29 29 29 0a 23 65 6c 73 65  d_self())).#else
16c0: 0a 23 20 64 65 66 69 6e 65 20 53 45 54 5f 54 48  .# define SET_TH
16d0: 52 45 41 44 49 44 28 58 29 0a 23 20 64 65 66 69  READID(X).# defi
16e0: 6e 65 20 43 48 45 43 4b 5f 54 48 52 45 41 44 49  ne CHECK_THREADI
16f0: 44 28 58 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  D(X) 0.#endif../
1700: 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 74 68 65  *.** Here is the
1710: 20 64 69 72 74 20 6f 6e 20 50 4f 53 49 58 20 61   dirt on POSIX a
1720: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 3a 20 20  dvisory locks:  
1730: 41 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31 20  ANSI STD 1003.1 
1740: 28 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f  (1996).** sectio
1750: 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20  n 6.5.2.2 lines 
1760: 34 38 33 20 74 68 72 6f 75 67 68 20 34 39 30 20  483 through 490 
1770: 73 70 65 63 69 66 79 20 74 68 61 74 20 77 68 65  specify that whe
1780: 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73  n a process.** s
1790: 65 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20  ets or clears a 
17a0: 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61  lock, that opera
17b0: 74 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61  tion overrides a
17c0: 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73  ny prior locks s
17d0: 65 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d  et.** by the sam
17e0: 65 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64  e process.  It d
17f0: 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74  oes not explicit
1800: 6c 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74  ly say so, but t
1810: 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74  his implies.** t
1820: 68 61 74 20 69 74 20 6f 76 65 72 72 69 64 65 73  hat it overrides
1830: 20 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68   locks set by th
1840: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75  e same process u
1850: 73 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74  sing a different
1860: 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70  .** file descrip
1870: 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74  tor.  Consider t
1880: 68 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a  his test case:.*
1890: 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66  *.**       int f
18a0: 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c  d1 = open("./fil
18b0: 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52  e1", O_RDWR|O_CR
18c0: 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20  EAT, 0644);.**  
18d0: 20 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20 6f       int fd2 = o
18e0: 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f  pen("./file2", O
18f0: 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30  _RDWR|O_CREAT, 0
1900: 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70  644);.**.** Supp
1910: 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20  ose ./file1 and 
1920: 2e 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61 6c  ./file2 are real
1930: 6c 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  ly the same file
1940: 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65   (because.** one
1950: 20 69 73 20 61 20 68 61 72 64 20 6f 72 20 73 79   is a hard or sy
1960: 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74  mbolic link to t
1970: 68 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20 69  he other) then i
1980: 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20  f you set.** an 
1990: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f  exclusive lock o
19a0: 6e 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79 20  n fd1, then try 
19b0: 74 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73  to get an exclus
19c0: 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66  ive lock.** on f
19d0: 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20 49  d2, it works.  I
19e0: 20 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70 65   would have expe
19f0: 63 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64 20  cted the second 
1a00: 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20  lock to.** fail 
1a10: 73 69 6e 63 65 20 74 68 65 72 65 20 77 61 73 20  since there was 
1a20: 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f  already a lock o
1a30: 6e 20 74 68 65 20 66 69 6c 65 20 64 75 65 20 74  n the file due t
1a40: 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f  o fd1..** But no
1a50: 74 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74  t so.  Since bot
1a60: 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f  h locks came fro
1a70: 6d 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  m the same proce
1a80: 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e  ss, the.** secon
1a90: 64 20 6f 76 65 72 72 69 64 65 73 20 74 68 65 20  d overrides the 
1aa0: 66 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f 75  first, even thou
1ab0: 67 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e 20  gh they were on 
1ac0: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c  different.** fil
1ad0: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70  e descriptors op
1ae0: 65 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65 6e  ened on differen
1af0: 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a  t file names..**
1b00: 0a 2a 2a 20 42 75 6d 6d 65 72 2e 20 20 49 66 20  .** Bummer.  If 
1b10: 79 6f 75 20 61 73 6b 20 6d 65 2c 20 74 68 69 73  you ask me, this
1b20: 20 69 73 20 62 72 6f 6b 65 6e 2e 20 20 42 61 64   is broken.  Bad
1b30: 6c 79 20 62 72 6f 6b 65 6e 2e 20 20 49 74 20 6d  ly broken.  It m
1b40: 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20 77 65 20  eans.** that we 
1b50: 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49 58  cannot use POSIX
1b60: 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68 72   locks to synchr
1b70: 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63 63 65 73  onize file acces
1b80: 73 20 61 6d 6f 6e 67 0a 2a 2a 20 63 6f 6d 70 65  s among.** compe
1b90: 74 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66 20  ting threads of 
1ba0: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
1bb0: 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77  .  POSIX locks w
1bc0: 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a  ill work fine.**
1bd0: 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20   to synchronize 
1be0: 61 63 63 65 73 73 20 66 6f 72 20 74 68 72 65 61  access for threa
1bf0: 64 73 20 69 6e 20 73 65 70 61 72 61 74 65 20 70  ds in separate p
1c00: 72 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e 6f  rocesses, but no
1c10: 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69 74  t.** threads wit
1c20: 68 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f  hin the same pro
1c30: 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77  cess..**.** To w
1c40: 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 70  ork around the p
1c50: 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20 68  roblem, SQLite h
1c60: 61 73 20 74 6f 20 6d 61 6e 61 67 65 20 66 69 6c  as to manage fil
1c70: 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61 6c  e locks internal
1c80: 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77 6e  ly.** on its own
1c90: 2e 20 20 57 68 65 6e 65 76 65 72 20 61 20 6e 65  .  Whenever a ne
1ca0: 77 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  w database is op
1cb0: 65 6e 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f  ened, we have to
1cc0: 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70 65   find the.** spe
1cd0: 63 69 66 69 63 20 69 6e 6f 64 65 20 6f 66 20 74  cific inode of t
1ce0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1cf0: 20 28 74 68 65 20 69 6e 6f 64 65 20 69 73 20 64   (the inode is d
1d00: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
1d10: 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64 20 73  .** st_dev and s
1d20: 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66 20  t_ino fields of 
1d30: 74 68 65 20 73 74 61 74 20 73 74 72 75 63 74 75  the stat structu
1d40: 72 65 20 74 68 61 74 20 66 73 74 61 74 28 29 20  re that fstat() 
1d50: 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e 64  fills in).** and
1d60: 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 73   check for locks
1d70: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 69 6e   already existin
1d80: 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65 2e  g on that inode.
1d90: 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72 65    When locks are
1da0: 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f 72 20 72  .** created or r
1db0: 65 6d 6f 76 65 64 2c 20 77 65 20 68 61 76 65 20  emoved, we have 
1dc0: 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20 6f  to look at our o
1dd0: 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f  wn internal reco
1de0: 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63  rd of the.** loc
1df0: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f  ks to see if ano
1e00: 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20  ther thread has 
1e10: 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20 61  previously set a
1e20: 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73 61   lock on that sa
1e30: 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a  me.** inode..**.
1e40: 2a 2a 20 54 68 65 20 4f 73 46 69 6c 65 20 73 74  ** The OsFile st
1e50: 72 75 63 74 75 72 65 20 66 6f 72 20 50 4f 53 49  ructure for POSI
1e60: 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a  X is no longer j
1e70: 75 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20 66  ust an integer f
1e80: 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  ile.** descripto
1e90: 72 2e 20 20 49 74 20 69 73 20 6e 6f 77 20 61 20  r.  It is now a 
1ea0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 68  structure that h
1eb0: 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65 72  olds the integer
1ec0: 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70   file.** descrip
1ed0: 74 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e 74 65  tor and a pointe
1ee0: 72 20 74 6f 20 61 20 73 74 72 75 63 74 75 72 65  r to a structure
1ef0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
1f00: 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20  the internal.** 
1f10: 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72  locks on the cor
1f20: 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65  responding inode
1f30: 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  .  There is one 
1f40: 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
1f50: 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20  e.** per inode, 
1f60: 73 6f 20 69 66 20 74 68 65 20 73 61 6d 65 20 69  so if the same i
1f70: 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65 64 20 74  node is opened t
1f80: 77 69 63 65 2c 20 62 6f 74 68 20 4f 73 46 69 6c  wice, both OsFil
1f90: 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20  e structures.** 
1fa0: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 61 6d  point to the sam
1fb0: 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74  e locking struct
1fc0: 75 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  ure.  The lockin
1fd0: 67 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70  g structure keep
1fe0: 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65  s.** a reference
1ff0: 20 63 6f 75 6e 74 20 28 73 6f 20 77 65 20 77 69   count (so we wi
2000: 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20  ll know when to 
2010: 64 65 6c 65 74 65 20 69 74 29 20 61 6e 64 20 61  delete it) and a
2020: 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20   "cnt".** field 
2030: 74 68 61 74 20 74 65 6c 6c 73 20 75 73 20 69 74  that tells us it
2040: 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20  s internal lock 
2050: 73 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20  status.  cnt==0 
2060: 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c  means the.** fil
2070: 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20  e is unlocked.  
2080: 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68  cnt==-1 means th
2090: 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 65 78  e file has an ex
20a0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a  clusive lock..**
20b0: 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68 65   cnt>0 means the
20c0: 72 65 20 61 72 65 20 63 6e 74 20 73 68 61 72 65  re are cnt share
20d0: 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66  d locks on the f
20e0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61  ile..**.** Any a
20f0: 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f  ttempt to lock o
2100: 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20  r unlock a file 
2110: 66 69 72 73 74 20 63 68 65 63 6b 73 20 74 68 65  first checks the
2120: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75   locking.** stru
2130: 63 74 75 72 65 2e 20 20 54 68 65 20 66 63 6e 74  cture.  The fcnt
2140: 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  l() system call 
2150: 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20  is only invoked 
2160: 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53  to set a .** POS
2170: 49 58 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 69  IX lock if the i
2180: 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72  nternal lock str
2190: 75 63 74 75 72 65 20 74 72 61 6e 73 69 74 69 6f  ucture transitio
21a0: 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20  ns between.** a 
21b0: 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e  locked and an un
21c0: 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a  locked state..**
21d0: 0a 2a 2a 20 32 30 30 34 2d 4a 61 6e 2d 31 31 3a  .** 2004-Jan-11:
21e0: 0a 2a 2a 20 4d 6f 72 65 20 72 65 63 65 6e 74 20  .** More recent 
21f0: 64 69 73 63 6f 76 65 72 69 65 73 20 61 62 6f 75  discoveries abou
2200: 74 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  t POSIX advisory
2210: 20 6c 6f 63 6b 73 2e 20 20 28 54 68 65 20 6d 6f   locks.  (The mo
2220: 72 65 0a 2a 2a 20 49 20 64 69 73 63 6f 76 65 72  re.** I discover
2230: 2c 20 74 68 65 20 6d 6f 72 65 20 49 20 72 65 61  , the more I rea
2240: 6c 69 7a 65 20 74 68 65 20 61 20 50 4f 53 49 58  lize the a POSIX
2250: 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
2260: 61 72 65 0a 2a 2a 20 61 6e 20 61 62 6f 6d 69 6e  are.** an abomin
2270: 61 74 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 49 66  ation.).**.** If
2280: 20 79 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c   you close a fil
2290: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61  e descriptor tha
22a0: 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 69  t points to a fi
22b0: 6c 65 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b  le that has lock
22c0: 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20  s,.** all locks 
22d0: 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68 61  on that file tha
22e0: 74 20 61 72 65 20 6f 77 6e 65 64 20 62 79 20 74  t are owned by t
22f0: 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65  he current proce
2300: 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73  ss are.** releas
2310: 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f  ed.  To work aro
2320: 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  und this problem
2330: 2c 20 65 61 63 68 20 4f 73 46 69 6c 65 20 73 74  , each OsFile st
2340: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
2350: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
2360: 20 61 6e 20 6f 70 65 6e 43 6e 74 20 73 74 72 75   an openCnt stru
2370: 63 74 75 72 65 2e 20 20 54 68 65 72 65 20 69 73  cture.  There is
2380: 20 6f 6e 65 20 6f 70 65 6e 43 6e 74 20 73 74 72   one openCnt str
2390: 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 6f 70  ucture.** per op
23a0: 65 6e 20 69 6e 6f 64 65 2c 20 77 68 69 63 68 20  en inode, which 
23b0: 6d 65 61 6e 73 20 74 68 61 74 20 6d 75 6c 74 69  means that multi
23c0: 70 6c 65 20 4f 73 46 69 6c 65 73 20 63 61 6e 20  ple OsFiles can 
23d0: 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c  point to a singl
23e0: 65 0a 2a 2a 20 6f 70 65 6e 43 6e 74 2e 20 20 57  e.** openCnt.  W
23f0: 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
2400: 73 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73 65 20  s made to close 
2410: 61 6e 20 4f 73 46 69 6c 65 2c 20 69 66 20 74 68  an OsFile, if th
2420: 65 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72  ere are.** other
2430: 20 4f 73 46 69 6c 65 73 20 6f 70 65 6e 20 6f 6e   OsFiles open on
2440: 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20   the same inode 
2450: 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69 6e 67  that are holding
2460: 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c   locks, the call
2470: 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20 74  .** to close() t
2480: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
2490: 6f 72 20 69 73 20 64 65 66 65 72 72 65 64 20 75  or is deferred u
24a0: 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20  ntil all of the 
24b0: 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20  locks clear..** 
24c0: 54 68 65 20 6f 70 65 6e 43 6e 74 20 73 74 72 75  The openCnt stru
24d0: 63 74 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69  cture keeps a li
24e0: 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72  st of file descr
24f0: 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64  iptors that need
2500: 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64   to.** be closed
2510: 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69   and that list i
2520: 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c  s walked (and cl
2530: 65 61 72 65 64 29 20 77 68 65 6e 20 74 68 65 20  eared) when the 
2540: 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65  last lock.** cle
2550: 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 69 72 73 74  ars..**.** First
2560: 2c 20 75 6e 64 65 72 20 4c 69 6e 75 78 20 74 68  , under Linux th
2570: 72 65 61 64 73 2c 20 62 65 63 61 75 73 65 20 65  reads, because e
2580: 61 63 68 20 74 68 72 65 61 64 20 68 61 73 20 61  ach thread has a
2590: 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 70 72 6f   separate.** pro
25a0: 63 65 73 73 20 49 44 2c 20 6c 6f 63 6b 20 6f 70  cess ID, lock op
25b0: 65 72 61 74 69 6f 6e 73 20 69 6e 20 6f 6e 65 20  erations in one 
25c0: 74 68 72 65 61 64 20 64 6f 20 6e 6f 74 20 6f 76  thread do not ov
25d0: 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20  erride locks.** 
25e0: 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  to the same file
25f0: 20 69 6e 20 6f 74 68 65 72 20 74 68 72 65 61 64   in other thread
2600: 73 2e 20 20 4c 69 6e 75 78 20 74 68 72 65 61 64  s.  Linux thread
2610: 73 20 62 65 68 61 76 65 20 6c 69 6b 65 0a 2a 2a  s behave like.**
2620: 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73   separate proces
2630: 73 65 73 20 69 6e 20 74 68 69 73 20 72 65 73 70  ses in this resp
2640: 65 63 74 2e 20 20 42 75 74 2c 20 69 66 20 79 6f  ect.  But, if yo
2650: 75 20 63 6c 6f 73 65 20 61 20 66 69 6c 65 0a 2a  u close a file.*
2660: 2a 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 20  * descriptor in 
2670: 6c 69 6e 75 78 20 74 68 72 65 61 64 73 2c 20 61  linux threads, a
2680: 6c 6c 20 6c 6f 63 6b 73 20 61 72 65 20 63 6c 65  ll locks are cle
2690: 61 72 65 64 2c 20 65 76 65 6e 20 6c 6f 63 6b 73  ared, even locks
26a0: 0a 2a 2a 20 6f 6e 20 6f 74 68 65 72 20 74 68 72  .** on other thr
26b0: 65 61 64 73 20 61 6e 64 20 65 76 65 6e 20 74 68  eads and even th
26c0: 6f 75 67 68 20 74 68 65 20 6f 74 68 65 72 20 74  ough the other t
26d0: 68 72 65 61 64 73 20 68 61 76 65 20 64 69 66 66  hreads have diff
26e0: 65 72 65 6e 74 0a 2a 2a 20 70 72 6f 63 65 73 73  erent.** process
26f0: 20 49 44 73 2e 20 20 4c 69 6e 75 78 20 74 68 72   IDs.  Linux thr
2700: 65 61 64 73 20 69 73 20 69 6e 63 6f 6e 73 69 73  eads is inconsis
2710: 74 65 6e 74 20 69 6e 20 74 68 69 73 20 72 65 73  tent in this res
2720: 70 65 63 74 2e 0a 2a 2a 20 28 49 27 6d 20 62 65  pect..** (I'm be
2730: 67 69 6e 6e 69 6e 67 20 74 6f 20 74 68 69 6e 6b  ginning to think
2740: 20 74 68 61 74 20 6c 69 6e 75 78 20 74 68 72 65   that linux thre
2750: 61 64 73 20 69 73 20 61 6e 20 61 62 6f 6d 69 6e  ads is an abomin
2760: 61 74 69 6f 6e 20 74 6f 6f 2e 29 0a 2a 2a 20 54  ation too.).** T
2770: 68 65 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 6f  he consequence o
2780: 66 20 74 68 69 73 20 61 6c 6c 20 69 73 20 74 68  f this all is th
2790: 61 74 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  at the hash tabl
27a0: 65 20 66 6f 72 20 74 68 65 20 6c 6f 63 6b 49 6e  e for the lockIn
27b0: 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  fo.** structure 
27c0: 68 61 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 74  has to include t
27d0: 68 65 20 70 72 6f 63 65 73 73 20 69 64 20 61 73  he process id as
27e0: 20 70 61 72 74 20 6f 66 20 69 74 73 20 6b 65 79   part of its key
27f0: 20 62 65 63 61 75 73 65 0a 2a 2a 20 6c 6f 63 6b   because.** lock
2800: 73 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 74  s in different t
2810: 68 72 65 61 64 73 20 61 72 65 20 74 72 65 61 74  hreads are treat
2820: 65 64 20 61 73 20 64 69 73 74 69 6e 63 74 2e 20  ed as distinct. 
2830: 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 6f 70 65   But the .** ope
2840: 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20 73  nCnt structure s
2850: 68 6f 75 6c 64 20 6e 6f 74 20 69 6e 63 6c 75 64  hould not includ
2860: 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 69 64  e the process id
2870: 20 69 6e 20 69 74 73 0a 2a 2a 20 6b 65 79 20 62   in its.** key b
2880: 65 63 61 75 73 65 20 63 6c 6f 73 65 28 29 20 63  ecause close() c
2890: 6c 65 61 72 73 20 6c 6f 63 6b 20 6f 6e 20 61 6c  lears lock on al
28a0: 6c 20 74 68 72 65 61 64 73 2c 20 6e 6f 74 20 6a  l threads, not j
28b0: 75 73 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a  ust the current.
28c0: 2a 2a 20 74 68 72 65 61 64 2e 20 20 57 65 72 65  ** thread.  Were
28d0: 20 69 74 20 6e 6f 74 20 66 6f 72 20 74 68 69 73   it not for this
28e0: 20 67 6f 6f 66 69 6e 65 73 73 20 69 6e 20 6c 69   goofiness in li
28f0: 6e 75 78 20 74 68 72 65 61 64 73 2c 20 77 65 20  nux threads, we 
2900: 63 6f 75 6c 64 0a 2a 2a 20 63 6f 6d 62 69 6e 65  could.** combine
2910: 20 74 68 65 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e   the lockInfo an
2920: 64 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74  d openCnt struct
2930: 75 72 65 73 20 69 6e 74 6f 20 61 20 73 69 6e 67  ures into a sing
2940: 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  le structure..**
2950: 0a 2a 2a 20 32 30 30 34 2d 4a 75 6e 2d 32 38 3a  .** 2004-Jun-28:
2960: 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20 76 65 72 73  .** On some vers
2970: 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 2c 20 74  ions of linux, t
2980: 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72  hreads can overr
2990: 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20  ide each others 
29a0: 6c 6f 63 6b 73 2e 0a 2a 2a 20 4f 6e 20 6f 74 68  locks..** On oth
29b0: 65 72 73 20 6e 6f 74 2e 20 20 53 6f 6d 65 74 69  ers not.  Someti
29c0: 6d 65 73 20 79 6f 75 20 63 61 6e 20 63 68 61 6e  mes you can chan
29d0: 67 65 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  ge the behavior 
29e0: 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 73  on the same.** s
29f0: 79 73 74 65 6d 20 62 79 20 73 65 74 74 69 6e 67  ystem by setting
2a00: 20 74 68 65 20 4c 44 5f 41 53 53 55 4d 45 5f 4b   the LD_ASSUME_K
2a10: 45 52 4e 45 4c 20 65 6e 76 69 72 6f 6e 6d 65 6e  ERNEL environmen
2a20: 74 20 76 61 72 69 61 62 6c 65 2e 20 20 54 68 65  t variable.  The
2a30: 0a 2a 2a 20 50 4f 53 49 58 20 73 74 61 6e 64 61  .** POSIX standa
2a40: 72 64 20 69 73 20 73 69 6c 65 6e 74 20 61 73 20  rd is silent as 
2a50: 74 6f 20 77 68 69 63 68 20 62 65 68 61 76 69 6f  to which behavio
2a60: 72 20 69 73 20 63 6f 72 72 65 63 74 2c 20 61 73  r is correct, as
2a70: 20 66 61 72 0a 2a 2a 20 61 73 20 49 20 63 61 6e   far.** as I can
2a80: 20 74 65 6c 6c 2c 20 73 6f 20 6f 74 68 65 72 20   tell, so other 
2a90: 76 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78  versions of unix
2aa0: 20 6d 69 67 68 74 20 73 68 6f 77 20 74 68 65 20   might show the 
2ab0: 73 61 6d 65 0a 2a 2a 20 69 6e 63 6f 6e 73 69 73  same.** inconsis
2ac0: 74 65 6e 63 79 2e 20 20 54 68 65 72 65 20 69 73  tency.  There is
2ad0: 20 6e 6f 20 6c 69 74 74 6c 65 20 64 6f 75 62 74   no little doubt
2ae0: 20 69 6e 20 6d 79 20 6d 69 6e 64 20 74 68 61 74   in my mind that
2af0: 20 70 6f 73 69 78 0a 2a 2a 20 61 64 76 69 73 6f   posix.** adviso
2b00: 72 79 20 6c 6f 63 6b 73 20 61 6e 64 20 6c 69 6e  ry locks and lin
2b10: 75 78 20 74 68 72 65 61 64 73 20 61 72 65 20 70  ux threads are p
2b20: 72 6f 66 6f 75 6e 64 6c 79 20 62 72 6f 6b 65 6e  rofoundly broken
2b30: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
2b40: 61 72 6f 75 6e 64 20 74 68 65 20 69 6e 63 6f 6e  around the incon
2b50: 73 69 73 74 65 6e 63 69 65 73 2c 20 77 65 20 68  sistencies, we h
2b60: 61 76 65 20 74 6f 20 74 65 73 74 20 61 74 20 72  ave to test at r
2b70: 75 6e 74 69 6d 65 20 0a 2a 2a 20 77 68 65 74 68  untime .** wheth
2b80: 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64  er or not thread
2b90: 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65  s can override e
2ba0: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
2bb0: 2e 20 20 54 68 69 73 20 74 65 73 74 0a 2a 2a 20  .  This test.** 
2bc0: 69 73 20 72 75 6e 20 6f 6e 63 65 2c 20 74 68 65  is run once, the
2bd0: 20 66 69 72 73 74 20 74 69 6d 65 20 61 6e 79 20   first time any 
2be0: 6c 6f 63 6b 20 69 73 20 61 74 74 65 6d 70 74 65  lock is attempte
2bf0: 64 2e 20 20 41 20 73 74 61 74 69 63 20 0a 2a 2a  d.  A static .**
2c00: 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65 74   variable is set
2c10: 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 72   to record the r
2c20: 65 73 75 6c 74 73 20 6f 66 20 74 68 69 73 20 74  esults of this t
2c30: 65 73 74 20 66 6f 72 20 66 75 74 75 72 65 0a 2a  est for future.*
2c40: 2a 20 75 73 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  * use..*/../*.**
2c50: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
2c60: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
2c70: 72 75 63 74 75 72 65 20 73 65 72 76 65 73 20 61  ructure serves a
2c80: 73 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a  s the key used.*
2c90: 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61  * to locate a pa
2ca0: 72 74 69 63 75 6c 61 72 20 6c 6f 63 6b 49 6e 66  rticular lockInf
2cb0: 6f 20 73 74 72 75 63 74 75 72 65 20 67 69 76 65  o structure give
2cc0: 6e 20 69 74 73 20 69 6e 6f 64 65 2e 0a 2a 2a 0a  n its inode..**.
2cd0: 2a 2a 20 49 66 20 74 68 72 65 61 64 73 20 63 61  ** If threads ca
2ce0: 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 65 61  nnot override ea
2cf0: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2c  ch others locks,
2d00: 20 74 68 65 6e 20 77 65 20 73 65 74 20 74 68 65   then we set the
2d10: 0a 2a 2a 20 6c 6f 63 6b 4b 65 79 2e 74 69 64 20  .** lockKey.tid 
2d20: 66 69 65 6c 64 20 74 6f 20 74 68 65 20 74 68 72  field to the thr
2d30: 65 61 64 20 49 44 2e 20 20 49 66 20 74 68 72 65  ead ID.  If thre
2d40: 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65  ads can override
2d50: 0a 2a 2a 20 65 61 63 68 20 6f 74 68 65 72 73 20  .** each others 
2d60: 6c 6f 63 6b 73 20 74 68 65 6e 20 74 69 64 20 69  locks then tid i
2d70: 73 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20  s always set to 
2d80: 7a 65 72 6f 2e 20 20 74 69 64 20 69 73 20 6f 6d  zero.  tid is om
2d90: 69 74 74 65 64 0a 2a 2a 20 69 66 20 77 65 20 63  itted.** if we c
2da0: 6f 6d 70 69 6c 65 20 77 69 74 68 6f 75 74 20 74  ompile without t
2db0: 68 72 65 61 64 69 6e 67 20 73 75 70 70 6f 72 74  hreading support
2dc0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6c 6f 63 6b  ..*/.struct lock
2dd0: 4b 65 79 20 7b 0a 20 20 64 65 76 5f 74 20 64 65  Key {.  dev_t de
2de0: 76 3b 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69  v;       /* Devi
2df0: 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ce number */.  i
2e00: 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20 20  no_t ino;       
2e10: 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20  /* Inode number 
2e20: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2e30: 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 20 20  _UNIX_THREADS.  
2e40: 70 74 68 72 65 61 64 5f 74 20 74 69 64 3b 20 20  pthread_t tid;  
2e50: 20 2f 2a 20 54 68 72 65 61 64 20 49 44 20 6f 72   /* Thread ID or
2e60: 20 7a 65 72 6f 20 69 66 20 74 68 72 65 61 64 73   zero if threads
2e70: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61   can override ea
2e80: 63 68 20 6f 74 68 65 72 20 2a 2f 0a 23 65 6e 64  ch other */.#end
2e90: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  if.};../*.** An 
2ea0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
2eb0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
2ec0: 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
2ed0: 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a   for each open.*
2ee0: 2a 20 69 6e 6f 64 65 20 6f 6e 20 65 61 63 68 20  * inode on each 
2ef0: 74 68 72 65 61 64 20 77 69 74 68 20 61 20 64 69  thread with a di
2f00: 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 20  fferent process 
2f10: 49 44 2e 20 20 28 54 68 72 65 61 64 73 20 68 61  ID.  (Threads ha
2f20: 76 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20  ve.** different 
2f30: 70 72 6f 63 65 73 73 20 49 44 73 20 6f 6e 20 6c  process IDs on l
2f40: 69 6e 75 78 2c 20 62 75 74 20 6e 6f 74 20 6f 6e  inux, but not on
2f50: 20 6d 6f 73 74 20 6f 74 68 65 72 20 75 6e 69 78   most other unix
2f60: 65 73 2e 29 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e  es.).**.** A sin
2f70: 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68 61  gle inode can ha
2f80: 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65  ve multiple file
2f90: 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73 6f   descriptors, so
2fa0: 20 65 61 63 68 20 4f 73 46 69 6c 65 0a 2a 2a 20   each OsFile.** 
2fb0: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
2fc0: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
2fd0: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
2fe0: 68 69 73 20 6f 62 6a 65 63 74 20 61 6e 64 20 74  his object and t
2ff0: 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65  his.** object ke
3000: 65 70 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74  eps a count of t
3010: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 4f 73 46  he number of OsF
3020: 69 6c 65 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  iles pointing to
3030: 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6c   it..*/.struct l
3040: 6f 63 6b 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75  ockInfo {.  stru
3050: 63 74 20 6c 6f 63 6b 4b 65 79 20 6b 65 79 3b 20  ct lockKey key; 
3060: 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b   /* The lookup k
3070: 65 79 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b  ey */.  int cnt;
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3090: 4e 75 6d 62 65 72 20 6f 66 20 53 48 41 52 45 44  Number of SHARED
30a0: 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
30b0: 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 3b 20 20   int locktype;  
30c0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
30d0: 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53  SHARED_LOCK, RES
30e0: 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20  ERVED_LOCK etc. 
30f0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
3100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3110: 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ber of pointers 
3120: 74 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72  to this structur
3130: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  e */.};../*.** A
3140: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
3150: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
3160: 63 74 75 72 65 20 73 65 72 76 65 73 20 61 73 20  cture serves as 
3170: 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20  the key used.** 
3180: 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74  to locate a part
3190: 69 63 75 6c 61 72 20 6f 70 65 6e 43 6e 74 20 73  icular openCnt s
31a0: 74 72 75 63 74 75 72 65 20 67 69 76 65 6e 20 69  tructure given i
31b0: 74 73 20 69 6e 6f 64 65 2e 20 20 54 68 69 73 0a  ts inode.  This.
31c0: 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ** is the same a
31d0: 73 20 74 68 65 20 6c 6f 63 6b 4b 65 79 20 65 78  s the lockKey ex
31e0: 63 65 70 74 20 74 68 61 74 20 74 68 65 20 74 68  cept that the th
31f0: 72 65 61 64 20 49 44 20 69 73 20 6f 6d 69 74 74  read ID is omitt
3200: 65 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6f 70  ed..*/.struct op
3210: 65 6e 4b 65 79 20 7b 0a 20 20 64 65 76 5f 74 20  enKey {.  dev_t 
3220: 64 65 76 3b 20 20 20 2f 2a 20 44 65 76 69 63 65  dev;   /* Device
3230: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 6f   number */.  ino
3240: 5f 74 20 69 6e 6f 3b 20 20 20 2f 2a 20 49 6e 6f  _t ino;   /* Ino
3250: 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 7d 3b 0a  de number */.};.
3260: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
3270: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
3280: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
3290: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65   allocated for e
32a0: 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64  ach open.** inod
32b0: 65 2e 20 20 54 68 69 73 20 73 74 72 75 63 74 75  e.  This structu
32c0: 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b 20 6f  re keeps track o
32d0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
32e0: 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 0a 2a 2a  locks on that.**
32f0: 20 69 6e 6f 64 65 2e 20 20 49 66 20 61 20 63 6c   inode.  If a cl
3300: 6f 73 65 20 69 73 20 61 74 74 65 6d 70 74 65 64  ose is attempted
3310: 20 61 67 61 69 6e 73 74 20 61 6e 20 69 6e 6f 64   against an inod
3320: 65 20 74 68 61 74 20 69 73 20 68 6f 6c 64 69 6e  e that is holdin
3330: 67 0a 2a 2a 20 6c 6f 63 6b 73 2c 20 74 68 65 20  g.** locks, the 
3340: 63 6c 6f 73 65 20 69 73 20 64 65 66 65 72 72 65  close is deferre
3350: 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6c 6f 63 6b  d until all lock
3360: 73 20 63 6c 65 61 72 20 62 79 20 61 64 64 69 6e  s clear by addin
3370: 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 65  g the.** file de
3380: 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20 63  scriptor to be c
3390: 6c 6f 73 65 64 20 74 6f 20 74 68 65 20 70 65 6e  losed to the pen
33a0: 64 69 6e 67 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  ding list..*/.st
33b0: 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 7b 0a 20  ruct openCnt {. 
33c0: 20 73 74 72 75 63 74 20 6f 70 65 6e 4b 65 79 20   struct openKey 
33d0: 6b 65 79 3b 20 20 20 2f 2a 20 54 68 65 20 6c 6f  key;   /* The lo
33e0: 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  okup key */.  in
33f0: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
3400: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3410: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69   pointers to thi
3420: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  s structure */. 
3430: 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20 20   int nLock;     
3440: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3450: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
3460: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  locks */.  int n
3470: 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20 20 20  Pending;        
3480: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 65   /* Number of pe
3490: 6e 64 69 6e 67 20 63 6c 6f 73 65 28 29 20 6f 70  nding close() op
34a0: 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  erations */.  in
34b0: 74 20 2a 61 50 65 6e 64 69 6e 67 3b 20 20 20 20  t *aPending;    
34c0: 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20      /* Malloced 
34d0: 73 70 61 63 65 20 68 6f 6c 64 69 6e 67 20 66 64  space holding fd
34e0: 27 73 20 61 77 61 69 74 69 6e 67 20 61 20 63 6c  's awaiting a cl
34f0: 6f 73 65 28 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  ose() */.};../* 
3500: 0a 2a 2a 20 54 68 65 73 65 20 68 61 73 68 20 74  .** These hash t
3510: 61 62 6c 65 73 20 6d 61 70 20 69 6e 6f 64 65 73  ables map inodes
3520: 20 61 6e 64 20 66 69 6c 65 20 64 65 73 63 72 69   and file descri
3530: 70 74 6f 72 73 20 28 72 65 61 6c 6c 79 2c 20 6c  ptors (really, l
3540: 6f 63 6b 4b 65 79 20 61 6e 64 0a 2a 2a 20 6f 70  ockKey and.** op
3550: 65 6e 4b 65 79 20 73 74 72 75 63 74 75 72 65 73  enKey structures
3560: 29 20 69 6e 74 6f 20 6c 6f 63 6b 49 6e 66 6f 20  ) into lockInfo 
3570: 61 6e 64 20 6f 70 65 6e 43 6e 74 20 73 74 72 75  and openCnt stru
3580: 63 74 75 72 65 73 2e 20 20 41 63 63 65 73 73 20  ctures.  Access 
3590: 74 6f 20 0a 2a 2a 20 74 68 65 73 65 20 68 61 73  to .** these has
35a0: 68 20 74 61 62 6c 65 73 20 6d 75 73 74 20 62 65  h tables must be
35b0: 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 61 20   protected by a 
35c0: 6d 75 74 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  mutex..*/.static
35d0: 20 48 61 73 68 20 6c 6f 63 6b 48 61 73 68 20 3d   Hash lockHash =
35e0: 20 7b 53 51 4c 49 54 45 5f 48 41 53 48 5f 42 49   {SQLITE_HASH_BI
35f0: 4e 41 52 59 2c 20 30 2c 20 30 2c 20 30 2c 20 30  NARY, 0, 0, 0, 0
3600: 2c 20 30 7d 3b 0a 73 74 61 74 69 63 20 48 61 73  , 0};.static Has
3610: 68 20 6f 70 65 6e 48 61 73 68 20 3d 20 7b 53 51  h openHash = {SQ
3620: 4c 49 54 45 5f 48 41 53 48 5f 42 49 4e 41 52 59  LITE_HASH_BINARY
3630: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 7d  , 0, 0, 0, 0, 0}
3640: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
3650: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
3660: 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20  STYLE./*.** The 
3670: 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 73 20 61  locking styles a
3680: 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  re associated wi
3690: 74 68 20 74 68 65 20 64 69 66 66 65 72 65 6e 74  th the different
36a0: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a   file locking.**
36b0: 20 63 61 70 61 62 69 6c 69 74 69 65 73 20 73 75   capabilities su
36c0: 70 70 6f 72 74 65 64 20 62 79 20 64 69 66 66 65  pported by diffe
36d0: 72 65 6e 74 20 66 69 6c 65 20 73 79 73 74 65 6d  rent file system
36e0: 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58  s.  .**.** POSIX
36f0: 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 66   locking style f
3700: 75 6c 6c 79 20 73 75 70 70 6f 72 74 73 20 73 68  ully supports sh
3710: 61 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69  ared and exclusi
3720: 76 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f  ve byte-range lo
3730: 63 6b 73 20 0a 2a 2a 20 41 44 50 20 6c 6f 63 6b  cks .** ADP lock
3740: 69 6e 67 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74  ing only support
3750: 73 20 65 78 63 6c 75 73 69 76 65 20 62 79 74 65  s exclusive byte
3760: 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 0a 2a 2a 20  -range locks.** 
3770: 46 4c 4f 43 4b 20 6f 6e 6c 79 20 73 75 70 70 6f  FLOCK only suppo
3780: 72 74 73 20 61 20 73 69 6e 67 6c 65 20 66 69 6c  rts a single fil
3790: 65 2d 67 6c 6f 62 61 6c 20 65 78 63 6c 75 73 69  e-global exclusi
37a0: 76 65 20 6c 6f 63 6b 0a 2a 2a 20 44 4f 54 4c 4f  ve lock.** DOTLO
37b0: 43 4b 20 69 73 6e 27 74 20 61 20 74 72 75 65 20  CK isn't a true 
37c0: 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 2c 20 69  locking style, i
37d0: 74 20 72 65 66 65 72 73 20 74 6f 20 74 68 65 20  t refers to the 
37e0: 75 73 65 20 6f 66 20 61 20 73 70 65 63 69 61 6c  use of a special
37f0: 0a 2a 2a 20 20 20 66 69 6c 65 20 6e 61 6d 65 64  .**   file named
3800: 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
3810: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
3820: 69 74 68 20 61 20 27 2e 6c 6f 63 6b 27 20 65 78  ith a '.lock' ex
3830: 74 65 6e 73 69 6f 6e 2c 20 74 68 69 73 0a 2a 2a  tension, this.**
3840: 20 20 20 63 61 6e 20 62 65 20 75 73 65 64 20 6f     can be used o
3850: 6e 20 66 69 6c 65 20 73 79 73 74 65 6d 73 20 74  n file systems t
3860: 68 61 74 20 64 6f 20 6e 6f 74 20 6f 66 66 65 72  hat do not offer
3870: 20 61 6e 79 20 72 65 6c 69 61 62 6c 65 20 66 69   any reliable fi
3880: 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 4e 4f  le locking.** NO
3890: 20 6c 6f 63 6b 69 6e 67 20 6d 65 61 6e 73 20 74   locking means t
38a0: 68 61 74 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 77  hat no locking w
38b0: 69 6c 6c 20 62 65 20 61 74 74 65 6d 70 74 65 64  ill be attempted
38c0: 2c 20 74 68 69 73 20 69 73 20 6f 6e 6c 79 20 75  , this is only u
38d0: 73 65 64 20 66 6f 72 0a 2a 2a 20 20 20 72 65 61  sed for.**   rea
38e0: 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 73 79 73 74  d-only file syst
38f0: 65 6d 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  ems currently.**
3900: 20 55 4e 53 55 50 50 4f 52 54 45 44 20 6d 65 61   UNSUPPORTED mea
3910: 6e 73 20 74 68 61 74 20 6e 6f 20 6c 6f 63 6b 69  ns that no locki
3920: 6e 67 20 77 69 6c 6c 20 62 65 20 61 74 74 65 6d  ng will be attem
3930: 70 74 65 64 2c 20 74 68 69 73 20 69 73 20 6f 6e  pted, this is on
3940: 6c 79 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 20  ly used for.**  
3950: 20 66 69 6c 65 20 73 79 73 74 65 6d 73 20 74 68   file systems th
3960: 61 74 20 61 72 65 20 6b 6e 6f 77 6e 20 74 6f 20  at are known to 
3970: 62 65 20 75 6e 73 75 70 70 6f 72 74 65 64 0a 2a  be unsupported.*
3980: 2f 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b  /.typedef enum {
3990: 0a 20 20 20 20 20 20 20 20 70 6f 73 69 78 4c 6f  .        posixLo
39a0: 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 30 2c 20  ckingStyle = 0, 
39b0: 20 20 20 20 20 20 2f 2a 20 73 74 61 6e 64 61 72        /* standar
39c0: 64 20 70 6f 73 69 78 2d 61 64 76 69 73 6f 72 79  d posix-advisory
39d0: 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 20 20   locks */.      
39e0: 20 20 61 66 70 4c 6f 63 6b 69 6e 67 53 74 79 6c    afpLockingStyl
39f0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
3a00: 2a 20 75 73 65 20 61 66 70 20 6c 6f 63 6b 73 20  * use afp locks 
3a10: 2a 2f 0a 20 20 20 20 20 20 20 20 66 6c 6f 63 6b  */.        flock
3a20: 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 2c 20 20 20  LockingStyle,   
3a30: 20 20 20 20 20 20 20 20 2f 2a 20 75 73 65 20 66          /* use f
3a40: 6c 6f 63 6b 28 29 20 2a 2f 0a 20 20 20 20 20 20  lock() */.      
3a50: 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67    dotlockLocking
3a60: 53 74 79 6c 65 2c 20 20 20 20 20 20 20 20 20 2f  Style,         /
3a70: 2a 20 75 73 65 20 3c 66 69 6c 65 3e 2e 6c 6f 63  * use <file>.loc
3a80: 6b 20 66 69 6c 65 73 20 2a 2f 0a 20 20 20 20 20  k files */.     
3a90: 20 20 20 6e 6f 4c 6f 63 6b 69 6e 67 53 74 79 6c     noLockingStyl
3aa0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
3ab0: 2f 2a 20 75 73 65 66 75 6c 20 66 6f 72 20 72 65  /* useful for re
3ac0: 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 73 79 73  ad-only file sys
3ad0: 74 65 6d 20 2a 2f 0a 20 20 20 20 20 20 20 20 75  tem */.        u
3ae0: 6e 73 75 70 70 6f 72 74 65 64 4c 6f 63 6b 69 6e  nsupportedLockin
3af0: 67 53 74 79 6c 65 20 20 20 20 20 20 2f 2a 20 69  gStyle      /* i
3b00: 6e 64 69 63 61 74 65 73 20 75 6e 73 75 70 70 6f  ndicates unsuppo
3b10: 72 74 65 64 20 66 69 6c 65 20 73 79 73 74 65 6d  rted file system
3b20: 20 2a 2f 0a 7d 20 73 71 6c 69 74 65 33 4c 6f 63   */.} sqlite3Loc
3b30: 6b 69 6e 67 53 74 79 6c 65 3b 0a 23 65 6e 64 69  kingStyle;.#endi
3b40: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
3b50: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
3b60: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64   */..static void
3b70: 20 65 6e 74 65 72 4d 75 74 65 78 28 29 7b 0a 20   enterMutex(){. 
3b80: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
3b90: 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d 75 74  nter(sqlite3_mut
3ba0: 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
3bb0: 4d 55 54 45 58 5f 47 4c 4f 42 41 4c 29 29 3b 0a  MUTEX_GLOBAL));.
3bc0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 65  }.static void le
3bd0: 61 76 65 4d 75 74 65 78 28 29 7b 0a 20 20 73 71  aveMutex(){.  sq
3be0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
3bf0: 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  e(sqlite3_mutex_
3c00: 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
3c10: 45 58 5f 47 4c 4f 42 41 4c 29 29 3b 0a 7d 0a 0a  EX_GLOBAL));.}..
3c20: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e  #ifdef SQLITE_UN
3c30: 49 58 5f 54 48 52 45 41 44 53 0a 2f 2a 0a 2a 2a  IX_THREADS./*.**
3c40: 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 72   This variable r
3c50: 65 63 6f 72 64 73 20 77 68 65 74 68 65 72 20 6f  ecords whether o
3c60: 72 20 6e 6f 74 20 74 68 72 65 61 64 73 20 63 61  r not threads ca
3c70: 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20  n override each 
3c80: 6f 74 68 65 72 73 0a 2a 2a 20 6c 6f 63 6b 73 2e  others.** locks.
3c90: 0a 2a 2a 0a 2a 2a 20 20 20 20 30 3a 20 20 4e 6f  .**.**    0:  No
3ca0: 2e 20 20 54 68 72 65 61 64 73 20 63 61 6e 6e 6f  .  Threads canno
3cb0: 74 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20  t override each 
3cc0: 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2a  others locks..**
3cd0: 20 20 20 20 31 3a 20 20 59 65 73 2e 20 20 54 68      1:  Yes.  Th
3ce0: 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69  reads can overri
3cf0: 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c  de each others l
3d00: 6f 63 6b 73 2e 0a 2a 2a 20 20 20 2d 31 3a 20 20  ocks..**   -1:  
3d10: 57 65 20 64 6f 6e 27 74 20 6b 6e 6f 77 20 79 65  We don't know ye
3d20: 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65  t..**.** On some
3d30: 20 73 79 73 74 65 6d 73 2c 20 77 65 20 6b 6e 6f   systems, we kno
3d40: 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  w at compile-tim
3d50: 65 20 69 66 20 74 68 72 65 61 64 73 20 63 61 6e  e if threads can
3d60: 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 0a 2a   override each.*
3d70: 2a 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 20  * others locks. 
3d80: 20 4f 6e 20 74 68 6f 73 65 20 73 79 73 74 65 6d   On those system
3d90: 73 2c 20 74 68 65 20 53 51 4c 49 54 45 5f 54 48  s, the SQLITE_TH
3da0: 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f  READ_OVERRIDE_LO
3db0: 43 4b 20 6d 61 63 72 6f 0a 2a 2a 20 77 69 6c 6c  CK macro.** will
3dc0: 20 62 65 20 73 65 74 20 61 70 70 72 6f 70 72 69   be set appropri
3dd0: 61 74 65 6c 79 2e 20 20 4f 6e 20 6f 74 68 65 72  ately.  On other
3de0: 20 73 79 73 74 65 6d 73 2c 20 77 65 20 68 61 76   systems, we hav
3df0: 65 20 74 6f 20 63 68 65 63 6b 20 61 74 0a 2a 2a  e to check at.**
3e00: 20 72 75 6e 74 69 6d 65 2e 20 20 4f 6e 20 74 68   runtime.  On th
3e10: 65 73 65 20 6c 61 74 74 65 72 20 73 79 73 74 65  ese latter syste
3e20: 6d 73 2c 20 53 51 4c 54 49 45 5f 54 48 52 45 41  ms, SQLTIE_THREA
3e30: 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 20  D_OVERRIDE_LOCK 
3e40: 69 73 0a 2a 2a 20 75 6e 64 65 66 69 6e 65 64 2e  is.** undefined.
3e50: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72 69  .**.** This vari
3e60: 61 62 6c 65 20 6e 6f 72 6d 61 6c 6c 79 20 68 61  able normally ha
3e70: 73 20 66 69 6c 65 20 73 63 6f 70 65 20 6f 6e 6c  s file scope onl
3e80: 79 2e 20 20 42 75 74 20 64 75 72 69 6e 67 20 74  y.  But during t
3e90: 65 73 74 69 6e 67 2c 20 77 65 20 6d 61 6b 65 0a  esting, we make.
3ea0: 2a 2a 20 69 74 20 61 20 67 6c 6f 62 61 6c 20 73  ** it a global s
3eb0: 6f 20 74 68 61 74 20 74 68 65 20 74 65 73 74 20  o that the test 
3ec0: 63 6f 64 65 20 63 61 6e 20 63 68 61 6e 67 65 20  code can change 
3ed0: 69 74 73 20 76 61 6c 75 65 20 69 6e 20 6f 72 64  its value in ord
3ee0: 65 72 20 74 6f 20 76 65 72 69 66 79 0a 2a 2a 20  er to verify.** 
3ef0: 74 68 61 74 20 74 68 65 20 72 69 67 68 74 20 73  that the right s
3f00: 74 75 66 66 20 68 61 70 70 65 6e 73 20 69 6e 20  tuff happens in 
3f10: 65 69 74 68 65 72 20 63 61 73 65 2e 0a 2a 2f 0a  either case..*/.
3f20: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 54  #ifndef SQLITE_T
3f30: 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c  HREAD_OVERRIDE_L
3f40: 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  OCK.# define SQL
3f50: 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52  ITE_THREAD_OVERR
3f60: 49 44 45 5f 4c 4f 43 4b 20 2d 31 0a 23 65 6e 64  IDE_LOCK -1.#end
3f70: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
3f80: 5f 54 45 53 54 0a 69 6e 74 20 74 68 72 65 61 64  _TEST.int thread
3f90: 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68  sOverrideEachOth
3fa0: 65 72 73 4c 6f 63 6b 73 20 3d 20 53 51 4c 49 54  ersLocks = SQLIT
3fb0: 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44  E_THREAD_OVERRID
3fc0: 45 5f 4c 4f 43 4b 3b 0a 23 65 6c 73 65 0a 73 74  E_LOCK;.#else.st
3fd0: 61 74 69 63 20 69 6e 74 20 74 68 72 65 61 64 73  atic int threads
3fe0: 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65  OverrideEachOthe
3ff0: 72 73 4c 6f 63 6b 73 20 3d 20 53 51 4c 49 54 45  rsLocks = SQLITE
4000: 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45  _THREAD_OVERRIDE
4010: 5f 4c 4f 43 4b 3b 0a 23 65 6e 64 69 66 0a 0a 2f  _LOCK;.#endif../
4020: 2a 0a 2a 2a 20 54 68 69 73 20 73 74 72 75 63 74  *.** This struct
4030: 75 72 65 20 68 6f 6c 64 73 20 69 6e 66 6f 72 6d  ure holds inform
4040: 61 74 69 6f 6e 20 70 61 73 73 65 64 20 69 6e 74  ation passed int
4050: 6f 20 69 6e 64 69 76 69 64 75 61 6c 20 74 65 73  o individual tes
4060: 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 62 79 20  t.** threads by 
4070: 74 68 65 20 74 65 73 74 54 68 72 65 61 64 4c 6f  the testThreadLo
4080: 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29 20  ckingBehavior() 
4090: 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75  routine..*/.stru
40a0: 63 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74  ct threadTestDat
40b0: 61 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20  a {.  int fd;   
40c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
40d0: 46 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  File to be locke
40e0: 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 66 6c  d */.  struct fl
40f0: 6f 63 6b 20 6c 6f 63 6b 3b 20 20 20 20 20 2f 2a  ock lock;     /*
4100: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6f 70 65   The locking ope
4110: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
4120: 72 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20  result;         
4130: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20     /* Result of 
4140: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72  the locking oper
4150: 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 23 69 66  ation */.};..#if
4160: 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  def SQLITE_LOCK_
4170: 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  TRACE./*.** Prin
4180: 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f  t out informatio
4190: 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b  n about all lock
41a0: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a  ing operations..
41b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
41c0: 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  ne is used for t
41d0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c  roubleshooting l
41e0: 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72  ocks on multithr
41f0: 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72  eaded.** platfor
4200: 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63  ms.  Enable by c
4210: 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68  ompiling with th
4220: 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  e -DSQLITE_LOCK_
4230: 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64  TRACE.** command
4240: 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20  -line option on 
4250: 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54  the compiler.  T
4260: 68 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d  his code is norm
4270: 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f  ally.** turned o
4280: 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ff..*/.static in
4290: 74 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20  t lockTrace(int 
42a0: 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75  fd, int op, stru
42b0: 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20  ct flock *p){.  
42c0: 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a  char *zOpName, *
42d0: 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a  zType;.  int s;.
42e0: 20 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f    int savedErrno
42f0: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45  ;.  if( op==F_GE
4300: 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61  TLK ){.    zOpNa
4310: 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20  me = "GETLK";.  
4320: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f  }else if( op==F_
4330: 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70  SETLK ){.    zOp
4340: 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a  Name = "SETLK";.
4350: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d    }else{.    s =
4360: 20 66 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70   fcntl(fd, op, p
4370: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
4380: 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c  bugPrintf("fcntl
4390: 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25   unknown %d %d %
43a0: 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29  d\n", fd, op, s)
43b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 3b 0a  ;.    return s;.
43c0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74    }.  if( p->l_t
43d0: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
43e0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c      zType = "RDL
43f0: 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CK";.  }else if(
4400: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52   p->l_type==F_WR
4410: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
4420: 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65   = "WRLCK";.  }e
4430: 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  lse if( p->l_typ
4440: 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e==F_UNLCK ){.  
4450: 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b    zType = "UNLCK
4460: 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
4470: 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 7d  assert( 0 );.  }
4480: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f  .  assert( p->l_
4490: 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54  whence==SEEK_SET
44a0: 20 29 3b 0a 20 20 73 20 3d 20 66 63 6e 74 6c 28   );.  s = fcntl(
44b0: 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61  fd, op, p);.  sa
44c0: 76 65 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  vedErrno = errno
44d0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
44e0: 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64  Printf("fcntl %d
44f0: 20 25 64 20 25 73 20 25 73 20 25 64 20 25 64 20   %d %s %s %d %d 
4500: 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74  %d %d\n",.     t
4510: 68 72 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70  hreadid, fd, zOp
4520: 4e 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e  Name, zType, (in
4530: 74 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69  t)p->l_start, (i
4540: 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20  nt)p->l_len,.   
4550: 20 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c    (int)p->l_pid,
4560: 20 73 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d   s);.  if( s==(-
4570: 31 29 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c  1) && op==F_SETL
4580: 4b 20 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d  K && (p->l_type=
4590: 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c  =F_RDLCK || p->l
45a0: 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20  _type==F_WRLCK) 
45b0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c  ){.    struct fl
45c0: 6f 63 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d  ock l2;.    l2 =
45d0: 20 2a 70 3b 0a 20 20 20 20 66 63 6e 74 6c 28 66   *p;.    fcntl(f
45e0: 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29  d, F_GETLK, &l2)
45f0: 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74  ;.    if( l2.l_t
4600: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
4610: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52        zType = "R
4620: 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  DLCK";.    }else
4630: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
4640: 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_WRLCK ){.     
4650: 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22   zType = "WRLCK"
4660: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
4670: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c  l2.l_type==F_UNL
4680: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
4690: 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20  e = "UNLCK";.   
46a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
46b0: 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d  sert( 0 );.    }
46c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
46d0: 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66  gPrintf("fcntl-f
46e0: 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25  ailure-reason: %
46f0: 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20  s %d %d %d\n",. 
4700: 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e        zType, (in
4710: 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69  t)l2.l_start, (i
4720: 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e  nt)l2.l_len, (in
4730: 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d  t)l2.l_pid);.  }
4740: 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64  .  errno = saved
4750: 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20  Errno;.  return 
4760: 73 3b 0a 7d 0a 23 64 65 66 69 6e 65 20 66 63 6e  s;.}.#define fcn
4770: 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e  tl lockTrace.#en
4780: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f  dif /* SQLITE_LO
4790: 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a  CK_TRACE */../*.
47a0: 2a 2a 20 54 68 65 20 74 65 73 74 54 68 72 65 61  ** The testThrea
47b0: 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72  dLockingBehavior
47c0: 28 29 20 72 6f 75 74 69 6e 65 20 6c 61 75 6e 63  () routine launc
47d0: 68 65 73 20 74 77 6f 20 73 65 70 61 72 61 74 65  hes two separate
47e0: 0a 2a 2a 20 74 68 72 65 61 64 73 20 6f 6e 20 74  .** threads on t
47f0: 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68  his routine.  Th
4800: 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
4810: 70 74 73 20 74 6f 20 6c 6f 63 6b 20 61 20 66 69  pts to lock a fi
4820: 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  le.** descriptor
4830: 20 74 68 65 6e 20 72 65 74 75 72 6e 73 2e 20 20   then returns.  
4840: 54 68 65 20 73 75 63 63 65 73 73 20 6f 72 20 66  The success or f
4850: 61 69 6c 75 72 65 20 6f 66 20 74 68 61 74 20 61  ailure of that a
4860: 74 74 65 6d 70 74 0a 2a 2a 20 61 6c 6c 6f 77 73  ttempt.** allows
4870: 20 74 68 65 20 74 65 73 74 54 68 72 65 61 64 4c   the testThreadL
4880: 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29  ockingBehavior()
4890: 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20 64 65   procedure to de
48a0: 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68  termine.** wheth
48b0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64  er or not thread
48c0: 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65  s can override e
48d0: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
48e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
48f0: 20 2a 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54   *threadLockingT
4900: 65 73 74 28 76 6f 69 64 20 2a 70 41 72 67 29 7b  est(void *pArg){
4910: 0a 20 20 73 74 72 75 63 74 20 74 68 72 65 61 64  .  struct thread
4920: 54 65 73 74 44 61 74 61 20 2a 70 44 61 74 61 20  TestData *pData 
4930: 3d 20 28 73 74 72 75 63 74 20 74 68 72 65 61 64  = (struct thread
4940: 54 65 73 74 44 61 74 61 2a 29 70 41 72 67 3b 0a  TestData*)pArg;.
4950: 20 20 70 44 61 74 61 2d 3e 72 65 73 75 6c 74 20    pData->result 
4960: 3d 20 66 63 6e 74 6c 28 70 44 61 74 61 2d 3e 66  = fcntl(pData->f
4970: 64 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 70 44 61  d, F_SETLK, &pDa
4980: 74 61 2d 3e 6c 6f 63 6b 29 3b 0a 20 20 72 65 74  ta->lock);.  ret
4990: 75 72 6e 20 70 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a  urn pArg;.}../*.
49a0: 2a 2a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  ** This procedur
49b0: 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65  e attempts to de
49c0: 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
49d0: 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 73 0a 2a  or not threads.*
49e0: 2a 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65  * can override e
49f0: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
4a00: 20 74 68 65 6e 20 73 65 74 73 20 74 68 65 20 0a   then sets the .
4a10: 2a 2a 20 74 68 72 65 61 64 73 4f 76 65 72 72 69  ** threadsOverri
4a20: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
4a30: 73 20 76 61 72 69 61 62 6c 65 20 61 70 70 72 6f  s variable appro
4a40: 70 72 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61  priately..*/.sta
4a50: 74 69 63 20 76 6f 69 64 20 74 65 73 74 54 68 72  tic void testThr
4a60: 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69  eadLockingBehavi
4a70: 6f 72 28 69 6e 74 20 66 64 5f 6f 72 69 67 29 7b  or(int fd_orig){
4a80: 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 73 74 72  .  int fd;.  str
4a90: 75 63 74 20 74 68 72 65 61 64 54 65 73 74 44 61  uct threadTestDa
4aa0: 74 61 20 64 5b 32 5d 3b 0a 20 20 70 74 68 72 65  ta d[2];.  pthre
4ab0: 61 64 5f 74 20 74 5b 32 5d 3b 0a 0a 20 20 66 64  ad_t t[2];..  fd
4ac0: 20 3d 20 64 75 70 28 66 64 5f 6f 72 69 67 29 3b   = dup(fd_orig);
4ad0: 0a 20 20 69 66 28 20 66 64 3c 30 20 29 20 72 65  .  if( fd<0 ) re
4ae0: 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 64  turn;.  memset(d
4af0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 29 29 3b  , 0, sizeof(d));
4b00: 0a 20 20 64 5b 30 5d 2e 66 64 20 3d 20 66 64 3b  .  d[0].fd = fd;
4b10: 0a 20 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 74  .  d[0].lock.l_t
4b20: 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
4b30: 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 6c 65 6e   d[0].lock.l_len
4b40: 20 3d 20 31 3b 0a 20 20 64 5b 30 5d 2e 6c 6f 63   = 1;.  d[0].loc
4b50: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20  k.l_start = 0;. 
4b60: 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 77 68 65   d[0].lock.l_whe
4b70: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
4b80: 20 20 64 5b 31 5d 20 3d 20 64 5b 30 5d 3b 0a 20    d[1] = d[0];. 
4b90: 20 64 5b 31 5d 2e 6c 6f 63 6b 2e 6c 5f 74 79 70   d[1].lock.l_typ
4ba0: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 70  e = F_WRLCK;.  p
4bb0: 74 68 72 65 61 64 5f 63 72 65 61 74 65 28 26 74  thread_create(&t
4bc0: 5b 30 5d 2c 20 30 2c 20 74 68 72 65 61 64 4c 6f  [0], 0, threadLo
4bd0: 63 6b 69 6e 67 54 65 73 74 2c 20 26 64 5b 30 5d  ckingTest, &d[0]
4be0: 29 3b 0a 20 20 70 74 68 72 65 61 64 5f 63 72 65  );.  pthread_cre
4bf0: 61 74 65 28 26 74 5b 31 5d 2c 20 30 2c 20 74 68  ate(&t[1], 0, th
4c00: 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73 74 2c  readLockingTest,
4c10: 20 26 64 5b 31 5d 29 3b 0a 20 20 70 74 68 72 65   &d[1]);.  pthre
4c20: 61 64 5f 6a 6f 69 6e 28 74 5b 30 5d 2c 20 30 29  ad_join(t[0], 0)
4c30: 3b 0a 20 20 70 74 68 72 65 61 64 5f 6a 6f 69 6e  ;.  pthread_join
4c40: 28 74 5b 31 5d 2c 20 30 29 3b 0a 20 20 63 6c 6f  (t[1], 0);.  clo
4c50: 73 65 28 66 64 29 3b 0a 20 20 74 68 72 65 61 64  se(fd);.  thread
4c60: 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68  sOverrideEachOth
4c70: 65 72 73 4c 6f 63 6b 73 20 3d 20 20 64 5b 30 5d  ersLocks =  d[0]
4c80: 2e 72 65 73 75 6c 74 3d 3d 30 20 26 26 20 64 5b  .result==0 && d[
4c90: 31 5d 2e 72 65 73 75 6c 74 3d 3d 30 3b 0a 7d 0a  1].result==0;.}.
4ca0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
4cb0: 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 2a 2f  _UNIX_THREADS */
4cc0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
4cd0: 61 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63  a lockInfo struc
4ce0: 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20  ture previously 
4cf0: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e  allocated by fin
4d00: 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e 0a 2a 2f 0a  dLockInfo()..*/.
4d10: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
4d20: 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 73 74 72 75  aseLockInfo(stru
4d30: 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f  ct lockInfo *pLo
4d40: 63 6b 29 7b 0a 20 20 69 66 20 28 70 4c 6f 63 6b  ck){.  if (pLock
4d50: 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 72 65   == NULL).    re
4d60: 74 75 72 6e 3b 0a 20 20 70 4c 6f 63 6b 2d 3e 6e  turn;.  pLock->n
4d70: 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 4c 6f  Ref--;.  if( pLo
4d80: 63 6b 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  ck->nRef==0 ){. 
4d90: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
4da0: 73 65 72 74 28 26 6c 6f 63 6b 48 61 73 68 2c 20  sert(&lockHash, 
4db0: 26 70 4c 6f 63 6b 2d 3e 6b 65 79 2c 20 73 69 7a  &pLock->key, siz
4dc0: 65 6f 66 28 70 4c 6f 63 6b 2d 3e 6b 65 79 29 2c  eof(pLock->key),
4dd0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
4de0: 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20  _free(pLock);.  
4df0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  }.}../*.** Relea
4e00: 73 65 20 61 20 6f 70 65 6e 43 6e 74 20 73 74 72  se a openCnt str
4e10: 75 63 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c  ucture previousl
4e20: 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66  y allocated by f
4e30: 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e 0a 2a  indLockInfo()..*
4e40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
4e50: 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 73 74 72  leaseOpenCnt(str
4e60: 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70  uct openCnt *pOp
4e70: 65 6e 29 7b 0a 20 20 69 66 20 28 70 4f 70 65 6e  en){.  if (pOpen
4e80: 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 72 65   == NULL).    re
4e90: 74 75 72 6e 3b 0a 20 20 70 4f 70 65 6e 2d 3e 6e  turn;.  pOpen->n
4ea0: 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 4f 70  Ref--;.  if( pOp
4eb0: 65 6e 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  en->nRef==0 ){. 
4ec0: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
4ed0: 73 65 72 74 28 26 6f 70 65 6e 48 61 73 68 2c 20  sert(&openHash, 
4ee0: 26 70 4f 70 65 6e 2d 3e 6b 65 79 2c 20 73 69 7a  &pOpen->key, siz
4ef0: 65 6f 66 28 70 4f 70 65 6e 2d 3e 6b 65 79 29 2c  eof(pOpen->key),
4f00: 20 30 29 3b 0a 20 20 20 20 66 72 65 65 28 70 4f   0);.    free(pO
4f10: 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 29 3b 0a  pen->aPending);.
4f20: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
4f30: 28 70 4f 70 65 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a  (pOpen);.  }.}..
4f40: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
4f50: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
4f60: 4c 45 0a 2f 2a 0a 2a 2a 20 54 65 73 74 73 20 61  LE./*.** Tests a
4f70: 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
4f80: 69 6e 67 20 71 75 65 72 79 20 74 6f 20 73 65 65  ing query to see
4f90: 20 69 66 20 62 79 74 65 20 72 61 6e 67 65 20 6c   if byte range l
4fa0: 6f 63 6b 73 20 61 72 65 20 0a 2a 2a 20 73 75 70  ocks are .** sup
4fb0: 70 6f 72 74 65 64 2c 20 69 66 20 6e 6f 74 20 77  ported, if not w
4fc0: 65 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 64  e fall back to d
4fd0: 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79  otlockLockingSty
4fe0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  le..*/.static sq
4ff0: 6c 69 74 65 33 4c 6f 63 6b 69 6e 67 53 74 79 6c  lite3LockingStyl
5000: 65 20 73 71 6c 69 74 65 33 54 65 73 74 4c 6f 63  e sqlite3TestLoc
5010: 6b 69 6e 67 53 74 79 6c 65 28 63 6f 6e 73 74 20  kingStyle(const 
5020: 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20  char *filePath, 
5030: 0a 20 20 69 6e 74 20 66 64 29 20 7b 0a 20 20 2f  .  int fd) {.  /
5040: 2a 20 74 65 73 74 20 62 79 74 65 2d 72 61 6e 67  * test byte-rang
5050: 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e  e lock using fcn
5060: 74 6c 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 66  tl */.  struct f
5070: 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 20  lock lockInfo;. 
5080: 20 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c   .  lockInfo.l_l
5090: 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e  en = 1;.  lockIn
50a0: 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a  fo.l_start = 0;.
50b0: 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65    lockInfo.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 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70    lockInfo.l_typ
50e0: 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 0a  e = F_RDLCK;.  .
50f0: 20 20 69 66 20 28 66 63 6e 74 6c 28 66 64 2c 20    if (fcntl(fd, 
5100: 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e  F_GETLK, &lockIn
5110: 66 6f 29 20 21 3d 20 2d 31 29 20 7b 0a 20 20 20  fo) != -1) {.   
5120: 20 72 65 74 75 72 6e 20 70 6f 73 69 78 4c 6f 63   return posixLoc
5130: 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 7d 20 0a  kingStyle;.  } .
5140: 20 20 0a 20 20 2f 2a 20 74 65 73 74 69 6e 67 20    .  /* testing 
5150: 66 6f 72 20 66 6c 6f 63 6b 20 63 61 6e 20 67 69  for flock can gi
5160: 76 65 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76  ve false positiv
5170: 65 73 2e 20 20 53 6f 20 69 66 20 69 66 20 74 68  es.  So if if th
5180: 65 20 61 62 6f 76 65 20 74 65 73 74 0a 20 20 2a  e above test.  *
5190: 2a 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 77 65  * fails, then we
51a0: 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 75 73   fall back to us
51b0: 69 6e 67 20 64 6f 74 2d 6c 6f 63 6b 20 73 74 79  ing dot-lock sty
51c0: 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 20 20 2a 2f  le locking..  */
51d0: 20 20 0a 20 20 72 65 74 75 72 6e 20 64 6f 74 6c    .  return dotl
51e0: 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b  ockLockingStyle;
51f0: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 45 78 61 6d 69  .}../* .** Exami
5200: 6e 65 73 20 74 68 65 20 66 5f 66 73 74 79 70 65  nes the f_fstype
5210: 6e 61 6d 65 20 65 6e 74 72 79 20 69 6e 20 74 68  name entry in th
5220: 65 20 73 74 61 74 66 73 20 73 74 72 75 63 74 75  e statfs structu
5230: 72 65 20 61 73 20 72 65 74 75 72 6e 65 64 20 62  re as returned b
5240: 79 20 0a 2a 2a 20 73 74 61 74 28 29 20 66 6f 72  y .** stat() for
5250: 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d   the file system
5260: 20 68 6f 73 74 69 6e 67 20 74 68 65 20 64 61 74   hosting the dat
5270: 61 62 61 73 65 20 66 69 6c 65 2c 20 61 73 73 69  abase file, assi
5280: 67 6e 73 20 74 68 65 20 0a 2a 2a 20 61 70 70 72  gns the .** appr
5290: 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20  opriate locking 
52a0: 73 74 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 69  style based on i
52b0: 74 27 73 20 76 61 6c 75 65 2e 20 20 54 68 65 73  t's value.  Thes
52c0: 65 20 76 61 6c 75 65 73 20 61 6e 64 20 0a 2a 2a  e values and .**
52d0: 20 61 73 73 69 67 6e 6d 65 6e 74 73 20 61 72 65   assignments are
52e0: 20 62 61 73 65 64 20 6f 6e 20 44 61 72 77 69 6e   based on Darwin
52f0: 2f 4f 53 58 20 62 65 68 61 76 69 6f 72 20 61 6e  /OSX behavior an
5300: 64 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20  d have not been 
5310: 74 65 73 74 65 64 20 6f 6e 20 0a 2a 2a 20 6f 74  tested on .** ot
5320: 68 65 72 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a  her systems..*/.
5330: 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 4c 6f  static sqlite3Lo
5340: 63 6b 69 6e 67 53 74 79 6c 65 20 73 71 6c 69 74  ckingStyle sqlit
5350: 65 33 44 65 74 65 63 74 4c 6f 63 6b 69 6e 67 53  e3DetectLockingS
5360: 74 79 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20  tyle(const char 
5370: 2a 66 69 6c 65 50 61 74 68 2c 20 0a 20 20 69 6e  *filePath, .  in
5380: 74 20 66 64 29 20 7b 0a 0a 23 69 66 64 65 66 20  t fd) {..#ifdef 
5390: 53 51 4c 49 54 45 5f 46 49 58 45 44 5f 4c 4f 43  SQLITE_FIXED_LOC
53a0: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 72 65 74  KING_STYLE.  ret
53b0: 75 72 6e 20 28 73 71 6c 69 74 65 33 4c 6f 63 6b  urn (sqlite3Lock
53c0: 69 6e 67 53 74 79 6c 65 29 53 51 4c 49 54 45 5f  ingStyle)SQLITE_
53d0: 46 49 58 45 44 5f 4c 4f 43 4b 49 4e 47 5f 53 54  FIXED_LOCKING_ST
53e0: 59 4c 45 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72  YLE;.#else.  str
53f0: 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e 66  uct statfs fsInf
5400: 6f 3b 0a 0a 20 20 69 66 20 28 73 74 61 74 66 73  o;..  if (statfs
5410: 28 66 69 6c 65 50 61 74 68 2c 20 26 66 73 49 6e  (filePath, &fsIn
5420: 66 6f 29 20 3d 3d 20 2d 31 29 0a 20 20 20 20 72  fo) == -1).    r
5430: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54 65 73  eturn sqlite3Tes
5440: 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 66 69  tLockingStyle(fi
5450: 6c 65 50 61 74 68 2c 20 66 64 29 3b 0a 20 20 0a  lePath, fd);.  .
5460: 20 20 69 66 20 28 66 73 49 6e 66 6f 2e 66 5f 66    if (fsInfo.f_f
5470: 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c  lags & MNT_RDONL
5480: 59 29 0a 20 20 20 20 72 65 74 75 72 6e 20 6e 6f  Y).    return no
5490: 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20  LockingStyle;.  
54a0: 0a 20 20 69 66 28 20 28 21 73 74 72 63 6d 70 28  .  if( (!strcmp(
54b0: 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
54c0: 61 6d 65 2c 20 22 68 66 73 22 29 29 20 7c 7c 0a  ame, "hfs")) ||.
54d0: 20 20 20 20 28 21 73 74 72 63 6d 70 28 66 73 49      (!strcmp(fsI
54e0: 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65  nfo.f_fstypename
54f0: 2c 20 22 75 66 73 22 29 29 20 29 0a 20 20 20 20  , "ufs")) ).    
5500: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
5510: 72 6e 20 70 6f 73 69 78 4c 6f 63 6b 69 6e 67 53  rn posixLockingS
5520: 74 79 6c 65 3b 0a 20 20 0a 20 20 69 66 28 21 73  tyle;.  .  if(!s
5530: 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66  trcmp(fsInfo.f_f
5540: 73 74 79 70 65 6e 61 6d 65 2c 20 22 61 66 70 66  stypename, "afpf
5550: 73 22 29 29 0a 20 20 20 20 72 65 74 75 72 6e 20  s")).    return 
5560: 61 66 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b  afpLockingStyle;
5570: 0a 20 20 0a 20 20 69 66 28 21 73 74 72 63 6d 70  .  .  if(!strcmp
5580: 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65  (fsInfo.f_fstype
5590: 6e 61 6d 65 2c 20 22 6e 66 73 22 29 29 20 0a 20  name, "nfs")) . 
55a0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
55b0: 33 54 65 73 74 4c 6f 63 6b 69 6e 67 53 74 79 6c  3TestLockingStyl
55c0: 65 28 66 69 6c 65 50 61 74 68 2c 20 66 64 29 3b  e(filePath, fd);
55d0: 0a 20 20 0a 20 20 69 66 28 21 73 74 72 63 6d 70  .  .  if(!strcmp
55e0: 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65  (fsInfo.f_fstype
55f0: 6e 61 6d 65 2c 20 22 73 6d 62 66 73 22 29 29 0a  name, "smbfs")).
5600: 20 20 20 20 72 65 74 75 72 6e 20 66 6c 6f 63 6b      return flock
5610: 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20  LockingStyle;.  
5620: 0a 20 20 69 66 28 21 73 74 72 63 6d 70 28 66 73  .  if(!strcmp(fs
5630: 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d  Info.f_fstypenam
5640: 65 2c 20 22 6d 73 64 6f 73 22 29 29 0a 20 20 20  e, "msdos")).   
5650: 20 72 65 74 75 72 6e 20 64 6f 74 6c 6f 63 6b 4c   return dotlockL
5660: 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 0a  ockingStyle;.  .
5670: 20 20 69 66 28 21 73 74 72 63 6d 70 28 66 73 49    if(!strcmp(fsI
5680: 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65  nfo.f_fstypename
5690: 2c 20 22 77 65 62 64 61 76 22 29 29 0a 20 20 20  , "webdav")).   
56a0: 20 72 65 74 75 72 6e 20 75 6e 73 75 70 70 6f 72   return unsuppor
56b0: 74 65 64 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b  tedLockingStyle;
56c0: 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  .  .  return sql
56d0: 69 74 65 33 54 65 73 74 4c 6f 63 6b 69 6e 67 53  ite3TestLockingS
56e0: 74 79 6c 65 28 66 69 6c 65 50 61 74 68 2c 20 66  tyle(filePath, f
56f0: 64 29 3b 20 20 0a 23 65 6e 64 69 66 20 2f 2a 20  d);  .#endif /* 
5700: 53 51 4c 49 54 45 5f 46 49 58 45 44 5f 4c 4f 43  SQLITE_FIXED_LOC
5710: 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 7d 0a  KING_STYLE */.}.
5720: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
5730: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
5740: 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _STYLE */../*.**
5750: 20 47 69 76 65 6e 20 61 20 66 69 6c 65 20 64 65   Given a file de
5760: 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65  scriptor, locate
5770: 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 6f 70   lockInfo and op
5780: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 73  enCnt structures
5790: 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72 69 62   that.** describ
57a0: 65 73 20 74 68 61 74 20 66 69 6c 65 20 64 65 73  es that file des
57b0: 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61 74 65  criptor.  Create
57c0: 20 6e 65 77 20 6f 6e 65 73 20 69 66 20 6e 65 63   new ones if nec
57d0: 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20  essary.  The.** 
57e0: 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 6d 69  return values mi
57f0: 67 68 74 20 62 65 20 75 6e 69 6e 69 74 69 61 6c  ght be uninitial
5800: 69 7a 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72  ized if an error
5810: 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 52   occurs..**.** R
5820: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
5830: 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 73   of errors..*/.s
5840: 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 4c 6f  tatic int findLo
5850: 63 6b 49 6e 66 6f 28 0a 20 20 69 6e 74 20 66 64  ckInfo(.  int fd
5860: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5870: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
5880: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 75 73  le descriptor us
5890: 65 64 20 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f  ed in the key */
58a0: 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e  .  struct lockIn
58b0: 66 6f 20 2a 2a 70 70 4c 6f 63 6b 2c 20 20 20 20  fo **ppLock,    
58c0: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 6f  /* Return the lo
58d0: 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ckInfo structure
58e0: 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63   here */.  struc
58f0: 74 20 6f 70 65 6e 43 6e 74 20 2a 2a 70 70 4f 70  t openCnt **ppOp
5900: 65 6e 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  en      /* Retur
5910: 6e 20 74 68 65 20 6f 70 65 6e 43 6e 74 20 73 74  n the openCnt st
5920: 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
5930: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
5940: 74 72 75 63 74 20 6c 6f 63 6b 4b 65 79 20 6b 65  truct lockKey ke
5950: 79 31 3b 0a 20 20 73 74 72 75 63 74 20 6f 70 65  y1;.  struct ope
5960: 6e 4b 65 79 20 6b 65 79 32 3b 0a 20 20 73 74 72  nKey key2;.  str
5970: 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66  uct stat statbuf
5980: 3b 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49  ;.  struct lockI
5990: 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 0a 20 20 73 74  nfo *pLock;.  st
59a0: 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f  ruct openCnt *pO
59b0: 70 65 6e 3b 0a 20 20 72 63 20 3d 20 66 73 74 61  pen;.  rc = fsta
59c0: 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b  t(fd, &statbuf);
59d0: 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72  .  if( rc!=0 ) r
59e0: 65 74 75 72 6e 20 31 3b 0a 0a 20 20 6d 65 6d 73  eturn 1;..  mems
59f0: 65 74 28 26 6b 65 79 31 2c 20 30 2c 20 73 69 7a  et(&key1, 0, siz
5a00: 65 6f 66 28 6b 65 79 31 29 29 3b 0a 20 20 6b 65  eof(key1));.  ke
5a10: 79 31 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66  y1.dev = statbuf
5a20: 2e 73 74 5f 64 65 76 3b 0a 20 20 6b 65 79 31 2e  .st_dev;.  key1.
5a30: 69 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e 73 74  ino = statbuf.st
5a40: 5f 69 6e 6f 3b 0a 23 69 66 64 65 66 20 53 51 4c  _ino;.#ifdef SQL
5a50: 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53  ITE_UNIX_THREADS
5a60: 0a 20 20 69 66 28 20 74 68 72 65 61 64 73 4f 76  .  if( threadsOv
5a70: 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73  errideEachOthers
5a80: 4c 6f 63 6b 73 3c 30 20 29 7b 0a 20 20 20 20 74  Locks<0 ){.    t
5a90: 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67  estThreadLocking
5aa0: 42 65 68 61 76 69 6f 72 28 66 64 29 3b 0a 20 20  Behavior(fd);.  
5ab0: 7d 0a 20 20 6b 65 79 31 2e 74 69 64 20 3d 20 74  }.  key1.tid = t
5ac0: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
5ad0: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3f 20  chOthersLocks ? 
5ae0: 30 20 3a 20 70 74 68 72 65 61 64 5f 73 65 6c 66  0 : pthread_self
5af0: 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 6d 65 6d  ();.#endif.  mem
5b00: 73 65 74 28 26 6b 65 79 32 2c 20 30 2c 20 73 69  set(&key2, 0, si
5b10: 7a 65 6f 66 28 6b 65 79 32 29 29 3b 0a 20 20 6b  zeof(key2));.  k
5b20: 65 79 32 2e 64 65 76 20 3d 20 73 74 61 74 62 75  ey2.dev = statbu
5b30: 66 2e 73 74 5f 64 65 76 3b 0a 20 20 6b 65 79 32  f.st_dev;.  key2
5b40: 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e 73  .ino = statbuf.s
5b50: 74 5f 69 6e 6f 3b 0a 20 20 70 4c 6f 63 6b 20 3d  t_ino;.  pLock =
5b60: 20 28 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66   (struct lockInf
5b70: 6f 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46 69  o*)sqlite3HashFi
5b80: 6e 64 28 26 6c 6f 63 6b 48 61 73 68 2c 20 26 6b  nd(&lockHash, &k
5b90: 65 79 31 2c 20 73 69 7a 65 6f 66 28 6b 65 79 31  ey1, sizeof(key1
5ba0: 29 29 3b 0a 20 20 69 66 28 20 70 4c 6f 63 6b 3d  ));.  if( pLock=
5bb0: 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  =0 ){.    struct
5bc0: 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4f 6c 64 3b   lockInfo *pOld;
5bd0: 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 73 71 6c  .    pLock = sql
5be0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
5bf0: 65 6f 66 28 2a 70 4c 6f 63 6b 29 20 29 3b 0a 20  eof(*pLock) );. 
5c00: 20 20 20 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20     if( pLock==0 
5c10: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  ){.      rc = 1;
5c20: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
5c30: 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20  _findlockinfo;. 
5c40: 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e     }.    pLock->
5c50: 6b 65 79 20 3d 20 6b 65 79 31 3b 0a 20 20 20 20  key = key1;.    
5c60: 70 4c 6f 63 6b 2d 3e 6e 52 65 66 20 3d 20 31 3b  pLock->nRef = 1;
5c70: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20  .    pLock->cnt 
5c80: 3d 20 30 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  = 0;.    pLock->
5c90: 6c 6f 63 6b 74 79 70 65 20 3d 20 30 3b 0a 20 20  locktype = 0;.  
5ca0: 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33    pOld = sqlite3
5cb0: 48 61 73 68 49 6e 73 65 72 74 28 26 6c 6f 63 6b  HashInsert(&lock
5cc0: 48 61 73 68 2c 20 26 70 4c 6f 63 6b 2d 3e 6b 65  Hash, &pLock->ke
5cd0: 79 2c 20 73 69 7a 65 6f 66 28 6b 65 79 31 29 2c  y, sizeof(key1),
5ce0: 20 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28   pLock);.    if(
5cf0: 20 70 4f 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20   pOld!=0 ){.    
5d00: 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d    assert( pOld==
5d10: 70 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 73  pLock );.      s
5d20: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 63  qlite3_free(pLoc
5d30: 6b 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  k);.      rc = 1
5d40: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
5d50: 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a  t_findlockinfo;.
5d60: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
5d70: 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 2b 2b     pLock->nRef++
5d80: 3b 0a 20 20 7d 0a 20 20 2a 70 70 4c 6f 63 6b 20  ;.  }.  *ppLock 
5d90: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 69 66 28 20 70  = pLock;.  if( p
5da0: 70 4f 70 65 6e 21 3d 30 20 29 7b 0a 20 20 20 20  pOpen!=0 ){.    
5db0: 70 4f 70 65 6e 20 3d 20 28 73 74 72 75 63 74 20  pOpen = (struct 
5dc0: 6f 70 65 6e 43 6e 74 2a 29 73 71 6c 69 74 65 33  openCnt*)sqlite3
5dd0: 48 61 73 68 46 69 6e 64 28 26 6f 70 65 6e 48 61  HashFind(&openHa
5de0: 73 68 2c 20 26 6b 65 79 32 2c 20 73 69 7a 65 6f  sh, &key2, sizeo
5df0: 66 28 6b 65 79 32 29 29 3b 0a 20 20 20 20 69 66  f(key2));.    if
5e00: 28 20 70 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20  ( pOpen==0 ){.  
5e10: 20 20 20 20 73 74 72 75 63 74 20 6f 70 65 6e 43      struct openC
5e20: 6e 74 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 20 20  nt *pOld;.      
5e30: 70 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f  pOpen = sqlite3_
5e40: 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
5e50: 70 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 20 20  pOpen) );.      
5e60: 69 66 28 20 70 4f 70 65 6e 3d 3d 30 20 29 7b 0a  if( pOpen==0 ){.
5e70: 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 4c          releaseL
5e80: 6f 63 6b 49 6e 66 6f 28 70 4c 6f 63 6b 29 3b 0a  ockInfo(pLock);.
5e90: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
5ea0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
5eb0: 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a  t_findlockinfo;.
5ec0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f        }.      pO
5ed0: 70 65 6e 2d 3e 6b 65 79 20 3d 20 6b 65 79 32 3b  pen->key = key2;
5ee0: 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52  .      pOpen->nR
5ef0: 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f  ef = 1;.      pO
5f00: 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 3d 20 30 3b 0a  pen->nLock = 0;.
5f10: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65        pOpen->nPe
5f20: 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  nding = 0;.     
5f30: 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67   pOpen->aPending
5f40: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 6c 64   = 0;.      pOld
5f50: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
5f60: 73 65 72 74 28 26 6f 70 65 6e 48 61 73 68 2c 20  sert(&openHash, 
5f70: 26 70 4f 70 65 6e 2d 3e 6b 65 79 2c 20 73 69 7a  &pOpen->key, siz
5f80: 65 6f 66 28 6b 65 79 32 29 2c 20 70 4f 70 65 6e  eof(key2), pOpen
5f90: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 6c  );.      if( pOl
5fa0: 64 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d!=0 ){.        
5fb0: 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 4f  assert( pOld==pO
5fc0: 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 73  pen );.        s
5fd0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4f 70 65  qlite3_free(pOpe
5fe0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  n);.        rele
5ff0: 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 4c 6f 63  aseLockInfo(pLoc
6000: 6b 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  k);.        rc =
6010: 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
6020: 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e   exit_findlockin
6030: 66 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  fo;.      }.    
6040: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 70  }else{.      pOp
6050: 65 6e 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  en->nRef++;.    
6060: 7d 0a 20 20 20 20 2a 70 70 4f 70 65 6e 20 3d 20  }.    *ppOpen = 
6070: 70 4f 70 65 6e 3b 0a 20 20 7d 0a 0a 65 78 69 74  pOpen;.  }..exit
6080: 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3a 0a 20  _findlockinfo:. 
6090: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
60a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
60b0: 55 47 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20  UG./*.** Helper 
60c0: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72 69  function for pri
60d0: 6e 74 69 6e 67 20 6f 75 74 20 74 72 61 63 65 20  nting out trace 
60e0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
60f0: 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69   debugging.** bi
6100: 6e 61 72 69 65 73 2e 20 54 68 69 73 20 72 65 74  naries. This ret
6110: 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20  urns the string 
6120: 72 65 70 72 65 73 65 74 61 74 69 6f 6e 20 6f 66  represetation of
6130: 20 74 68 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a   the supplied.**
6140: 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79   integer lock-ty
6150: 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  pe..*/.static co
6160: 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b 74 79  nst char *lockty
6170: 70 65 4e 61 6d 65 28 69 6e 74 20 6c 6f 63 6b 74  peName(int lockt
6180: 79 70 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20  ype){.  switch( 
6190: 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 63 61  locktype ){.  ca
61a0: 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75  se NO_LOCK: retu
61b0: 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 63 61 73  rn "NONE";.  cas
61c0: 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72  e SHARED_LOCK: r
61d0: 65 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b 0a  eturn "SHARED";.
61e0: 20 20 63 61 73 65 20 52 45 53 45 52 56 45 44 5f    case RESERVED_
61f0: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 52 45  LOCK: return "RE
6200: 53 45 52 56 45 44 22 3b 0a 20 20 63 61 73 65 20  SERVED";.  case 
6210: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65  PENDING_LOCK: re
6220: 74 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a  turn "PENDING";.
6230: 20 20 63 61 73 65 20 45 58 43 4c 55 53 49 56 45    case EXCLUSIVE
6240: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 45  _LOCK: return "E
6250: 58 43 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20  XCLUSIVE";.  }. 
6260: 20 72 65 74 75 72 6e 20 22 45 52 52 4f 52 22 3b   return "ERROR";
6270: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
6280: 20 49 66 20 77 65 20 61 72 65 20 63 75 72 72 65   If we are curre
6290: 6e 74 6c 79 20 69 6e 20 61 20 64 69 66 66 65 72  ntly in a differ
62a0: 65 6e 74 20 74 68 72 65 61 64 20 74 68 61 6e 20  ent thread than 
62b0: 74 68 65 20 74 68 72 65 61 64 20 74 68 61 74 20  the thread that 
62c0: 74 68 65 0a 2a 2a 20 75 6e 69 78 46 69 6c 65 20  the.** unixFile 
62d0: 61 72 67 75 6d 65 6e 74 20 62 65 6c 6f 6e 67 73  argument belongs
62e0: 20 74 6f 2c 20 74 68 65 6e 20 74 72 61 6e 73 66   to, then transf
62f0: 65 72 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20  er ownership of 
6300: 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20  the unixFile.** 
6310: 6f 76 65 72 20 74 6f 20 74 68 65 20 63 75 72 72  over to the curr
6320: 65 6e 74 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a  ent thread..**.*
6330: 2a 20 41 20 75 6e 69 78 46 69 6c 65 20 69 73 20  * A unixFile is 
6340: 6f 6e 6c 79 20 6f 77 6e 65 64 20 62 79 20 61 20  only owned by a 
6350: 74 68 72 65 61 64 20 6f 6e 20 73 79 73 74 65 6d  thread on system
6360: 73 20 77 68 65 72 65 20 6f 6e 65 20 74 68 72 65  s where one thre
6370: 61 64 20 69 73 0a 2a 2a 20 75 6e 61 62 6c 65 20  ad is.** unable 
6380: 74 6f 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b  to override lock
6390: 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 64  s created by a d
63a0: 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 2e  ifferent thread.
63b0: 20 20 52 65 64 48 61 74 39 20 69 73 0a 2a 2a 20    RedHat9 is.** 
63c0: 61 6e 20 65 78 61 6d 70 6c 65 20 6f 66 20 73 75  an example of su
63d0: 63 68 20 61 20 73 79 73 74 65 6d 2e 0a 2a 2a 0a  ch a system..**.
63e0: 2a 2a 20 4f 77 6e 65 72 73 68 69 70 20 74 72 61  ** Ownership tra
63f0: 6e 73 66 65 72 20 69 73 20 6f 6e 6c 79 20 61 6c  nsfer is only al
6400: 6c 6f 77 65 64 20 69 66 20 74 68 65 20 75 6e 69  lowed if the uni
6410: 78 46 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74  xFile is current
6420: 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2a 20  ly unlocked..** 
6430: 49 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20  If the unixFile 
6440: 69 73 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e  is locked and an
6450: 20 6f 77 6e 65 72 73 68 69 70 20 69 73 20 77 72   ownership is wr
6460: 6f 6e 67 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ong, then return
6470: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  .** SQLITE_MISUS
6480: 45 2e 20 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  E.  SQLITE_OK is
6490: 20 72 65 74 75 72 6e 65 64 20 69 66 20 65 76 65   returned if eve
64a0: 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2e 0a 2a  rything works..*
64b0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
64c0: 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 73 74 61  UNIX_THREADS.sta
64d0: 74 69 63 20 69 6e 74 20 74 72 61 6e 73 66 65 72  tic int transfer
64e0: 4f 77 6e 65 72 73 68 69 70 28 75 6e 69 78 46 69  Ownership(unixFi
64f0: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e  le *pFile){.  in
6500: 74 20 72 63 3b 0a 20 20 70 74 68 72 65 61 64 5f  t rc;.  pthread_
6510: 74 20 68 53 65 6c 66 3b 0a 20 20 69 66 28 20 74  t hSelf;.  if( t
6520: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
6530: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 29 7b  chOthersLocks ){
6540: 0a 20 20 20 20 2f 2a 20 4f 77 6e 65 72 73 68 69  .    /* Ownershi
6550: 70 20 74 72 61 6e 73 66 65 72 73 20 6e 6f 74 20  p transfers not 
6560: 6e 65 65 64 65 64 20 6f 6e 20 74 68 69 73 20 73  needed on this s
6570: 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 72 65 74  ystem */.    ret
6580: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
6590: 20 7d 0a 20 20 68 53 65 6c 66 20 3d 20 70 74 68   }.  hSelf = pth
65a0: 72 65 61 64 5f 73 65 6c 66 28 29 3b 0a 20 20 69  read_self();.  i
65b0: 66 28 20 70 74 68 72 65 61 64 5f 65 71 75 61 6c  f( pthread_equal
65c0: 28 70 46 69 6c 65 2d 3e 74 69 64 2c 20 68 53 65  (pFile->tid, hSe
65d0: 6c 66 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65  lf) ){.    /* We
65e0: 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68   are still in th
65f0: 65 20 73 61 6d 65 20 74 68 72 65 61 64 20 2a 2f  e same thread */
6600: 0a 20 20 20 20 4f 53 54 52 41 43 45 31 28 22 4e  .    OSTRACE1("N
6610: 6f 2d 74 72 61 6e 73 66 65 72 2c 20 73 61 6d 65  o-transfer, same
6620: 20 74 68 72 65 61 64 5c 6e 22 29 3b 0a 20 20 20   thread\n");.   
6630: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6640: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69  K;.  }.  if( pFi
6650: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f  le->locktype!=NO
6660: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  _LOCK ){.    /* 
6670: 57 65 20 63 61 6e 6e 6f 74 20 63 68 61 6e 67 65  We cannot change
6680: 20 6f 77 6e 65 72 73 68 69 70 20 77 68 69 6c 65   ownership while
6690: 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e 67 20   we are holding 
66a0: 61 20 6c 6f 63 6b 21 20 2a 2f 0a 20 20 20 20 72  a lock! */.    r
66b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
66c0: 55 53 45 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  USE;.  }.  OSTRA
66d0: 43 45 34 28 22 54 72 61 6e 73 66 65 72 20 6f 77  CE4("Transfer ow
66e0: 6e 65 72 73 68 69 70 20 6f 66 20 25 64 20 66 72  nership of %d fr
66f0: 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c 0a  om %d to %d\n",.
6700: 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c              pFil
6710: 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 74 69 64  e->h, pFile->tid
6720: 2c 20 68 53 65 6c 66 29 3b 0a 20 20 70 46 69 6c  , hSelf);.  pFil
6730: 65 2d 3e 74 69 64 20 3d 20 68 53 65 6c 66 3b 0a  e->tid = hSelf;.
6740: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 70 4c 6f    if (pFile->pLo
6750: 63 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20  ck != NULL) {.  
6760: 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66    releaseLockInf
6770: 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29 3b  o(pFile->pLock);
6780: 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f  .    rc = findLo
6790: 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 68 2c  ckInfo(pFile->h,
67a0: 20 26 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2c 20   &pFile->pLock, 
67b0: 30 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 35  0);.    OSTRACE5
67c0: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 69 73 20  ("LOCK    %d is 
67d0: 6e 6f 77 20 25 73 28 25 73 2c 25 64 29 5c 6e 22  now %s(%s,%d)\n"
67e0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
67f0: 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e         locktypeN
6800: 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  ame(pFile->lockt
6810: 79 70 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ype),.          
6820: 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46   locktypeName(pF
6830: 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  ile->pLock->lock
6840: 74 79 70 65 29 2c 20 70 46 69 6c 65 2d 3e 70 4c  type), pFile->pL
6850: 6f 63 6b 2d 3e 63 6e 74 29 3b 0a 20 20 20 20 72  ock->cnt);.    r
6860: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c  eturn rc;.  } el
6870: 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  se {.    return 
6880: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
6890: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4f 6e 20 73  .#else.  /* On s
68a0: 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 20 62  ingle-threaded b
68b0: 75 69 6c 64 73 2c 20 6f 77 6e 65 72 73 68 69 70  uilds, ownership
68c0: 20 74 72 61 6e 73 66 65 72 20 69 73 20 61 20 6e   transfer is a n
68d0: 6f 2d 6f 70 20 2a 2f 0a 23 20 64 65 66 69 6e 65  o-op */.# define
68e0: 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68   transferOwnersh
68f0: 69 70 28 58 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ip(X) SQLITE_OK.
6900: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
6910: 6c 65 74 65 20 74 68 65 20 6e 61 6d 65 64 20 66  lete the named f
6920: 69 6c 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ile.*/.int sqlit
6930: 65 33 55 6e 69 78 44 65 6c 65 74 65 28 63 6f 6e  e3UnixDelete(con
6940: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
6950: 6d 65 29 7b 0a 20 20 53 69 6d 75 6c 61 74 65 49  me){.  SimulateI
6960: 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
6970: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
6980: 45 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28 7a 46 69  E);.  unlink(zFi
6990: 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  lename);.  retur
69a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
69b0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
69c0: 45 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 66  E if the named f
69d0: 69 6c 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69  ile exists..*/.i
69e0: 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78 46 69  nt sqlite3UnixFi
69f0: 6c 65 45 78 69 73 74 73 28 63 6f 6e 73 74 20 63  leExists(const c
6a00: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
6a10: 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73  .  return access
6a20: 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3d 3d  (zFilename, 0)==
6a30: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  0;.}../*.** Atte
6a40: 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 66 69  mpt to open a fi
6a50: 6c 65 20 66 6f 72 20 62 6f 74 68 20 72 65 61 64  le for both read
6a60: 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67 2e  ing and writing.
6a70: 20 20 49 66 20 74 68 61 74 0a 2a 2a 20 66 61 69    If that.** fai
6a80: 6c 73 2c 20 74 72 79 20 6f 70 65 6e 69 6e 67 20  ls, try opening 
6a90: 69 74 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 49  it read-only.  I
6aa0: 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20  f the file does 
6ab0: 6e 6f 74 20 65 78 69 73 74 2c 0a 2a 2a 20 74 72  not exist,.** tr
6ac0: 79 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e 0a  y to create it..
6ad0: 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73  **.** On success
6ae0: 2c 20 61 20 68 61 6e 64 6c 65 20 66 6f 72 20 74  , a handle for t
6af0: 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 69 73 20  he open file is 
6b00: 77 72 69 74 74 65 6e 20 74 6f 20 2a 69 64 0a 2a  written to *id.*
6b10: 2a 20 61 6e 64 20 2a 70 52 65 61 64 6f 6e 6c 79  * and *pReadonly
6b20: 20 69 73 20 73 65 74 20 74 6f 20 30 20 69 66 20   is set to 0 if 
6b30: 74 68 65 20 66 69 6c 65 20 77 61 73 20 6f 70 65  the file was ope
6b40: 6e 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20  ned for reading 
6b50: 61 6e 64 0a 2a 2a 20 77 72 69 74 69 6e 67 20 6f  and.** writing o
6b60: 72 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20  r 1 if the file 
6b70: 77 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d  was opened read-
6b80: 6f 6e 6c 79 2e 20 20 54 68 65 20 66 75 6e 63 74  only.  The funct
6b90: 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 53  ion returns.** S
6ba0: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
6bb0: 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  On failure, the 
6bc0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
6bd0: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
6be0: 20 61 6e 64 20 6c 65 61 76 65 73 0a 2a 2a 20 2a   and leaves.** *
6bf0: 69 64 20 61 6e 64 20 2a 70 52 65 61 64 6f 6e 6c  id and *pReadonl
6c00: 79 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  y unchanged..*/.
6c10: 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69 74 65  #if 0.int sqlite
6c20: 33 55 6e 69 78 4f 70 65 6e 52 65 61 64 57 72 69  3UnixOpenReadWri
6c30: 74 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  te(.  const char
6c40: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 73   *zFilename,.  s
6c50: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 2a 70 49  qlite3_file **pI
6c60: 64 2c 0a 20 20 69 6e 74 20 2a 70 52 65 61 64 6f  d,.  int *pReado
6c70: 6e 6c 79 0a 29 7b 0a 20 20 69 6e 74 20 68 3b 0a  nly.){.  int h;.
6c80: 20 20 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d    .  assert( 0==
6c90: 2a 70 49 64 20 29 3b 0a 20 20 68 20 3d 20 6f 70  *pId );.  h = op
6ca0: 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f  en(zFilename, O_
6cb0: 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f 4c  RDWR|O_CREAT|O_L
6cc0: 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52  ARGEFILE|O_BINAR
6cd0: 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y,.             
6ce0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
6cf0: 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
6d00: 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 69  ERMISSIONS);.  i
6d10: 66 28 20 68 3c 30 20 29 7b 0a 23 69 66 64 65 66  f( h<0 ){.#ifdef
6d20: 20 45 49 53 44 49 52 0a 20 20 20 20 69 66 28 20   EISDIR.    if( 
6d30: 65 72 72 6e 6f 3d 3d 45 49 53 44 49 52 20 29 7b  errno==EISDIR ){
6d40: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
6d50: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
6d60: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
6d70: 68 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61  h = open(zFilena
6d80: 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 4c  me, O_RDONLY|O_L
6d90: 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52  ARGEFILE|O_BINAR
6da0: 59 29 3b 0a 20 20 20 20 69 66 28 20 68 3c 30 20  Y);.    if( h<0 
6db0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
6dc0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
6dd0: 20 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 52 65   .    }.    *pRe
6de0: 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 7d 65  adonly = 1;.  }e
6df0: 6c 73 65 7b 0a 20 20 20 20 2a 70 52 65 61 64 6f  lse{.    *pReado
6e00: 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  nly = 0;.  }..  
6e10: 72 65 74 75 72 6e 20 43 52 41 53 48 5f 54 45 53  return CRASH_TES
6e20: 54 5f 4f 56 45 52 52 49 44 45 28 0a 20 20 20 20  T_OVERRIDE(.    
6e30: 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 49 64 2c 20  zFilename, pId, 
6e40: 61 6c 6c 6f 63 61 74 65 55 6e 69 78 46 69 6c 65  allocateUnixFile
6e50: 28 68 2c 20 70 49 64 2c 20 7a 46 69 6c 65 6e 61  (h, pId, zFilena
6e60: 6d 65 2c 20 30 29 0a 20 20 29 3b 0a 7d 0a 0a 0a  me, 0).  );.}...
6e70: 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
6e80: 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65   open a new file
6e90: 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61   for exclusive a
6ea0: 63 63 65 73 73 20 62 79 20 74 68 69 73 20 70 72  ccess by this pr
6eb0: 6f 63 65 73 73 2e 0a 2a 2a 20 54 68 65 20 66 69  ocess..** The fi
6ec0: 6c 65 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  le will be opene
6ed0: 64 20 66 6f 72 20 62 6f 74 68 20 72 65 61 64 69  d for both readi
6ee0: 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67 2e 20  ng and writing. 
6ef0: 20 54 6f 20 61 76 6f 69 64 0a 2a 2a 20 61 20 70   To avoid.** a p
6f00: 6f 74 65 6e 74 69 61 6c 20 73 65 63 75 72 69 74  otential securit
6f10: 79 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 6f  y problem, we do
6f20: 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 66   not allow the f
6f30: 69 6c 65 20 74 6f 20 68 61 76 65 0a 2a 2a 20 70  ile to have.** p
6f40: 72 65 76 69 6f 75 73 6c 79 20 65 78 69 73 74 65  reviously existe
6f50: 64 2e 20 20 4e 6f 72 20 64 6f 20 77 65 20 61 6c  d.  Nor do we al
6f60: 6c 6f 77 20 74 68 65 20 66 69 6c 65 20 74 6f 20  low the file to 
6f70: 62 65 20 61 20 73 79 6d 62 6f 6c 69 63 0a 2a 2a  be a symbolic.**
6f80: 20 6c 69 6e 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   link..**.** If 
6f90: 64 65 6c 46 6c 61 67 20 69 73 20 74 72 75 65 2c  delFlag is true,
6fa0: 20 74 68 65 6e 20 6d 61 6b 65 20 61 72 72 61 6e   then make arran
6fb0: 67 65 6d 65 6e 74 73 20 74 6f 20 61 75 74 6f 6d  gements to autom
6fc0: 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 0a  atically delete.
6fd0: 2a 2a 20 74 68 65 20 66 69 6c 65 20 77 68 65 6e  ** the file when
6fe0: 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
6ff0: 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c  *.** On success,
7000: 20 77 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   write the file 
7010: 68 61 6e 64 6c 65 20 69 6e 74 6f 20 2a 69 64 20  handle into *id 
7020: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
7030: 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66  E_OK..**.** On f
7040: 61 69 6c 75 72 65 2c 20 72 65 74 75 72 6e 20 53  ailure, return S
7050: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a  QLITE_CANTOPEN..
7060: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e  */.int sqlite3Un
7070: 69 78 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  ixOpenExclusive(
7080: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7090: 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c  Filename, .  sql
70a0: 69 74 65 33 5f 66 69 6c 65 20 2a 2a 70 49 64 2c  ite3_file **pId,
70b0: 20 0a 20 20 69 6e 74 20 64 65 6c 46 6c 61 67 0a   .  int delFlag.
70c0: 29 7b 0a 20 20 69 6e 74 20 68 3b 0a 0a 20 20 61  ){.  int h;..  a
70d0: 73 73 65 72 74 28 20 30 3d 3d 2a 70 49 64 20 29  ssert( 0==*pId )
70e0: 3b 0a 20 20 68 20 3d 20 6f 70 65 6e 28 7a 46 69  ;.  h = open(zFi
70f0: 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
7100: 20 20 20 20 20 20 20 20 4f 5f 52 44 57 52 7c 4f          O_RDWR|O
7110: 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 7c 4f 5f  _CREAT|O_EXCL|O_
7120: 4e 4f 46 4f 4c 4c 4f 57 7c 4f 5f 4c 41 52 47 45  NOFOLLOW|O_LARGE
7130: 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 2c 0a 20  FILE|O_BINARY,. 
7140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
7150: 65 6c 46 6c 61 67 20 3f 20 30 36 30 30 20 3a 20  elFlag ? 0600 : 
7160: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
7170: 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29  ILE_PERMISSIONS)
7180: 3b 0a 20 20 69 66 28 20 68 3c 30 20 29 7b 0a 20  ;.  if( h<0 ){. 
7190: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
71a0: 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20  _CANTOPEN;.  }. 
71b0: 20 72 65 74 75 72 6e 20 43 52 41 53 48 5f 54 45   return CRASH_TE
71c0: 53 54 5f 4f 56 45 52 52 49 44 45 28 0a 20 20 20  ST_OVERRIDE(.   
71d0: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 49 64 2c   zFilename, pId,
71e0: 20 61 6c 6c 6f 63 61 74 65 55 6e 69 78 46 69 6c   allocateUnixFil
71f0: 65 28 68 2c 20 70 49 64 2c 20 7a 46 69 6c 65 6e  e(h, pId, zFilen
7200: 61 6d 65 2c 20 64 65 6c 46 6c 61 67 29 0a 20 20  ame, delFlag).  
7210: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  );.}../*.** Atte
7220: 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65  mpt to open a ne
7230: 77 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2d  w file for read-
7240: 6f 6e 6c 79 20 61 63 63 65 73 73 2e 0a 2a 2a 0a  only access..**.
7250: 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 77  ** On success, w
7260: 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 68 61  rite the file ha
7270: 6e 64 6c 65 20 69 6e 74 6f 20 2a 69 64 20 61 6e  ndle into *id an
7280: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
7290: 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69  OK..**.** On fai
72a0: 6c 75 72 65 2c 20 72 65 74 75 72 6e 20 53 51 4c  lure, return SQL
72b0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a 2f  ITE_CANTOPEN..*/
72c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78  .int sqlite3Unix
72d0: 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 63 6f 6e  OpenReadOnly(con
72e0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
72f0: 6d 65 2c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  me, sqlite3_file
7300: 20 2a 2a 70 49 64 29 7b 0a 20 20 69 6e 74 20 68   **pId){.  int h
7310: 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 30  ;.  .  assert( 0
7320: 3d 3d 2a 70 49 64 20 29 3b 0a 20 20 68 20 3d 20  ==*pId );.  h = 
7330: 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  open(zFilename, 
7340: 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 4c 41 52 47 45  O_RDONLY|O_LARGE
7350: 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a  FILE|O_BINARY);.
7360: 20 20 69 66 28 20 68 3c 30 20 29 7b 0a 20 20 20    if( h<0 ){.   
7370: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
7380: 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 72  ANTOPEN;.  }.  r
7390: 65 74 75 72 6e 20 43 52 41 53 48 5f 54 45 53 54  eturn CRASH_TEST
73a0: 5f 4f 56 45 52 52 49 44 45 28 0a 20 20 20 20 7a  _OVERRIDE(.    z
73b0: 46 69 6c 65 6e 61 6d 65 2c 20 70 49 64 2c 20 61  Filename, pId, a
73c0: 6c 6c 6f 63 61 74 65 55 6e 69 78 46 69 6c 65 28  llocateUnixFile(
73d0: 68 2c 20 70 49 64 2c 20 7a 46 69 6c 65 6e 61 6d  h, pId, zFilenam
73e0: 65 2c 20 30 29 0a 20 20 29 3b 0a 7d 0a 23 65 6e  e, 0).  );.}.#en
73f0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  dif../*.** Attem
7400: 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 66 69 6c  pt to open a fil
7410: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
7420: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
7430: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a  hat contains a.*
7440: 2a 20 66 69 6c 65 2e 20 20 54 68 69 73 20 66 69  * file.  This fi
7450: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 63 61  le descriptor ca
7460: 6e 20 62 65 20 75 73 65 64 20 74 6f 20 66 73 79  n be used to fsy
7470: 6e 63 28 29 20 74 68 65 20 64 69 72 65 63 74 6f  nc() the directo
7480: 72 79 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  ry.** in order t
7490: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
74a0: 63 72 65 61 74 69 6f 6e 20 6f 66 20 61 20 6e 65  creation of a ne
74b0: 77 20 66 69 6c 65 20 69 73 20 61 63 74 75 61 6c  w file is actual
74c0: 6c 79 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f  ly written.** to
74d0: 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   disk..**.** Thi
74e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
74f0: 79 20 6d 65 61 6e 69 6e 67 66 75 6c 20 66 6f 72  y meaningful for
7500: 20 55 6e 69 78 2e 20 20 49 74 20 69 73 20 61 20   Unix.  It is a 
7510: 6e 6f 2d 6f 70 20 75 6e 64 65 72 0a 2a 2a 20 77  no-op under.** w
7520: 69 6e 64 6f 77 73 20 73 69 6e 63 65 20 77 69 6e  indows since win
7530: 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 73 75  dows does not su
7540: 70 70 6f 72 74 20 68 61 72 64 20 6c 69 6e 6b 73  pport hard links
7550: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 46 55 4c 4c 5f  ..**.** If FULL_
7560: 46 53 59 4e 43 20 69 73 20 65 6e 61 62 6c 65 64  FSYNC is enabled
7570: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
7580: 69 73 20 6e 6f 74 20 6c 6f 6e 67 65 72 20 75 73  is not longer us
7590: 65 66 75 6c 2c 20 0a 2a 2a 20 61 20 46 55 4c 4c  eful, .** a FULL
75a0: 5f 46 53 59 4e 43 20 73 79 6e 63 20 61 70 70 6c  _FSYNC sync appl
75b0: 69 65 73 20 74 6f 20 61 6c 6c 20 70 65 6e 64 69  ies to all pendi
75c0: 6e 67 20 64 69 73 6b 20 6f 70 65 72 61 74 69 6f  ng disk operatio
75d0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63  ns..**.** On suc
75e0: 63 65 73 73 2c 20 61 20 68 61 6e 64 6c 65 20 66  cess, a handle f
75f0: 6f 72 20 61 20 70 72 65 76 69 6f 75 73 6c 79 20  or a previously 
7600: 6f 70 65 6e 20 66 69 6c 65 20 61 74 20 2a 69 64  open file at *id
7610: 20 69 73 0a 2a 2a 20 75 70 64 61 74 65 64 20 77   is.** updated w
7620: 69 74 68 20 74 68 65 20 6e 65 77 20 64 69 72 65  ith the new dire
7630: 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72  ctory file descr
7640: 69 70 74 6f 72 20 61 6e 64 20 53 51 4c 49 54 45  iptor and SQLITE
7650: 5f 4f 4b 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  _OK is.** return
7660: 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69  ed..**.** On fai
7670: 6c 75 72 65 2c 20 74 68 65 20 66 75 6e 63 74 69  lure, the functi
7680: 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
7690: 45 5f 43 41 4e 54 4f 50 45 4e 20 61 6e 64 20 6c  E_CANTOPEN and l
76a0: 65 61 76 65 73 0a 2a 2a 20 2a 69 64 20 75 6e 63  eaves.** *id unc
76b0: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23 69 66 20 30  hanged..*/.#if 0
76c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
76d0: 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 0a 20  OpenDirectory(. 
76e0: 20 4f 73 46 69 6c 65 20 2a 69 64 2c 0a 20 20 63   OsFile *id,.  c
76f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 6e  onst char *zDirn
7700: 61 6d 65 0a 29 7b 0a 20 20 69 6e 74 20 68 3b 0a  ame.){.  int h;.
7710: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
7720: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
7730: 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  d;.  assert( pFi
7740: 6c 65 21 3d 30 20 29 3b 0a 20 20 53 45 54 5f 54  le!=0 );.  SET_T
7750: 48 52 45 41 44 49 44 28 70 46 69 6c 65 29 3b 0a  HREADID(pFile);.
7760: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
7770: 3e 64 69 72 66 64 3c 30 20 29 3b 0a 20 20 70 46  >dirfd<0 );.  pF
7780: 69 6c 65 2d 3e 64 69 72 66 64 20 3d 20 68 20 3d  ile->dirfd = h =
7790: 20 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20   open(zDirname, 
77a0: 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52  O_RDONLY|O_BINAR
77b0: 59 2c 20 30 29 3b 0a 20 20 69 66 28 20 68 3c 30  Y, 0);.  if( h<0
77c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
77d0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 20  QLITE_CANTOPEN; 
77e0: 0a 20 20 7d 0a 23 69 66 64 65 66 20 46 44 5f 43  .  }.#ifdef FD_C
77f0: 4c 4f 45 58 45 43 0a 20 20 66 63 6e 74 6c 28 68  LOEXEC.  fcntl(h
7800: 2c 20 46 5f 53 45 54 46 44 2c 20 66 63 6e 74 6c  , F_SETFD, fcntl
7810: 28 68 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20  (h, F_GETFD, 0) 
7820: 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23  | FD_CLOEXEC);.#
7830: 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 45 33  endif.  OSTRACE3
7840: 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25  ("OPENDIR %-3d %
7850: 73 5c 6e 22 2c 20 68 2c 20 7a 44 69 72 6e 61 6d  s\n", h, zDirnam
7860: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
7870: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
7880: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  ../*.** Check th
7890: 61 74 20 61 20 67 69 76 65 6e 20 70 61 74 68 6e  at a given pathn
78a0: 61 6d 65 20 69 73 20 61 20 64 69 72 65 63 74 6f  ame is a directo
78b0: 72 79 20 61 6e 64 20 69 73 20 77 72 69 74 61 62  ry and is writab
78c0: 6c 65 20 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71  le .**.*/.int sq
78d0: 6c 69 74 65 33 55 6e 69 78 49 73 44 69 72 57 72  lite3UnixIsDirWr
78e0: 69 74 61 62 6c 65 28 63 68 61 72 20 2a 7a 42 75  itable(char *zBu
78f0: 66 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  f){.#ifndef SQLI
7900: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
7910: 41 47 4d 41 53 0a 20 20 73 74 72 75 63 74 20 73  AGMAS.  struct s
7920: 74 61 74 20 62 75 66 3b 0a 20 20 69 66 28 20 7a  tat buf;.  if( z
7930: 42 75 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Buf==0 ) return 
7940: 30 3b 0a 20 20 69 66 28 20 7a 42 75 66 5b 30 5d  0;.  if( zBuf[0]
7950: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
7960: 20 20 69 66 28 20 73 74 61 74 28 7a 42 75 66 2c    if( stat(zBuf,
7970: 20 26 62 75 66 29 20 29 20 72 65 74 75 72 6e 20   &buf) ) return 
7980: 30 3b 0a 20 20 69 66 28 20 21 53 5f 49 53 44 49  0;.  if( !S_ISDI
7990: 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29  R(buf.st_mode) )
79a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
79b0: 20 61 63 63 65 73 73 28 7a 42 75 66 2c 20 30 37   access(zBuf, 07
79c0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  ) ) return 0;.#e
79d0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
79e0: 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
79f0: 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b  S */.  return 1;
7a00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74  .}../*.** Seek t
7a10: 6f 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 20  o the offset in 
7a20: 69 64 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e 20  id->offset then 
7a30: 72 65 61 64 20 63 6e 74 20 62 79 74 65 73 20 69  read cnt bytes i
7a40: 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74  nto pBuf..** Ret
7a50: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
7a60: 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79  f bytes actually
7a70: 20 72 65 61 64 2e 20 20 55 70 64 61 74 65 20 74   read.  Update t
7a80: 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2f 0a 73 74  he offset..*/.st
7a90: 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64  atic int seekAnd
7aa0: 52 65 61 64 28 75 6e 69 78 46 69 6c 65 20 2a 69  Read(unixFile *i
7ab0: 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
7ac0: 20 6f 66 66 73 65 74 2c 20 76 6f 69 64 20 2a 70   offset, void *p
7ad0: 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20  Buf, int cnt){. 
7ae0: 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69 36 34 20   int got;.  i64 
7af0: 6e 65 77 4f 66 66 73 65 74 3b 0a 20 20 54 49 4d  newOffset;.  TIM
7b00: 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65  ER_START;.#if de
7b10: 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
7b20: 0a 20 20 67 6f 74 20 3d 20 70 72 65 61 64 28 69  .  got = pread(i
7b30: 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
7b40: 20 6f 66 66 73 65 74 29 3b 0a 20 20 53 69 6d 75   offset);.  Simu
7b50: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74  lateIOError( got
7b60: 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69 66 20 64   = -1 );.#elif d
7b70: 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
7b80: 36 34 29 0a 20 20 67 6f 74 20 3d 20 70 72 65 61  64).  got = prea
7b90: 64 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  d64(id->h, pBuf,
7ba0: 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20   cnt, offset);. 
7bb0: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
7bc0: 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65  ( got = -1 );.#e
7bd0: 6c 73 65 0a 20 20 6e 65 77 4f 66 66 73 65 74 20  lse.  newOffset 
7be0: 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f  = lseek(id->h, o
7bf0: 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29  ffset, SEEK_SET)
7c00: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
7c10: 72 6f 72 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d  ror( newOffset--
7c20: 20 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f 66 66   );.  if( newOff
7c30: 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20  set!=offset ){. 
7c40: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
7c50: 7d 0a 20 20 67 6f 74 20 3d 20 72 65 61 64 28 69  }.  got = read(i
7c60: 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29  d->h, pBuf, cnt)
7c70: 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52  ;.#endif.  TIMER
7c80: 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 35  _END;.  OSTRACE5
7c90: 28 22 52 45 41 44 20 20 20 20 25 2d 33 64 20 25  ("READ    %-3d %
7ca0: 35 64 20 25 37 6c 6c 64 20 25 64 5c 6e 22 2c 20  5d %7lld %d\n", 
7cb0: 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 69 64 2d 3e  id->h, got, id->
7cc0: 6f 66 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c  offset, TIMER_EL
7cd0: 41 50 53 45 44 29 3b 0a 20 20 72 65 74 75 72 6e  APSED);.  return
7ce0: 20 67 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   got;.}../*.** R
7cf0: 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ead data from a 
7d00: 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66  file into a buff
7d10: 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  er.  Return SQLI
7d20: 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20  TE_OK if all.** 
7d30: 62 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20  bytes were read 
7d40: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64  successfully and
7d50: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66   SQLITE_IOERR if
7d60: 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
7d70: 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  * wrong..*/.stat
7d80: 69 63 20 69 6e 74 20 75 6e 69 78 52 65 61 64 28  ic int unixRead(
7d90: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
7da0: 2a 69 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42  *id, .  void *pB
7db0: 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a  uf, .  int amt,.
7dc0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
7dd0: 6f 66 66 73 65 74 0a 29 7b 0a 20 20 69 6e 74 20  offset.){.  int 
7de0: 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69  got;.  assert( i
7df0: 64 20 29 3b 0a 20 20 67 6f 74 20 3d 20 73 65 65  d );.  got = see
7e00: 6b 41 6e 64 52 65 61 64 28 28 75 6e 69 78 46 69  kAndRead((unixFi
7e10: 6c 65 2a 29 69 64 2c 20 6f 66 66 73 65 74 2c 20  le*)id, offset, 
7e20: 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66  pBuf, amt);.  if
7e30: 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20  ( got==amt ){.  
7e40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7e50: 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OK;.  }else if( 
7e60: 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 72 65 74  got<0 ){.    ret
7e70: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
7e80: 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _READ;.  }else{.
7e90: 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68      memset(&((ch
7ea0: 61 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20  ar*)pBuf)[got], 
7eb0: 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20  0, amt-got);.   
7ec0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
7ed0: 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b  OERR_SHORT_READ;
7ee0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
7ef0: 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  ek to the offset
7f00: 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20 74   in id->offset t
7f10: 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62 79 74  hen read cnt byt
7f20: 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a  es into pBuf..**
7f30: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
7f40: 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
7f50: 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70 64 61  ally read.  Upda
7f60: 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a  te the offset..*
7f70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
7f80: 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69  kAndWrite(unixFi
7f90: 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73  le *id, i64 offs
7fa0: 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  et, const void *
7fb0: 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a  pBuf, int cnt){.
7fc0: 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69 36 34    int got;.  i64
7fd0: 20 6e 65 77 4f 66 66 73 65 74 3b 0a 20 20 54 49   newOffset;.  TI
7fe0: 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64  MER_START;.#if d
7ff0: 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
8000: 29 0a 20 20 67 6f 74 20 3d 20 70 77 72 69 74 65  ).  got = pwrite
8010: 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
8020: 74 2c 20 6f 66 66 73 65 74 29 3b 0a 23 65 6c 69  t, offset);.#eli
8030: 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
8040: 45 41 44 36 34 29 0a 20 20 67 6f 74 20 3d 20 70  EAD64).  got = p
8050: 77 72 69 74 65 36 34 28 69 64 2d 3e 68 2c 20 70  write64(id->h, p
8060: 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
8070: 29 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f 66  );.#else.  newOf
8080: 66 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d  fset = lseek(id-
8090: 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b  >h, offset, SEEK
80a0: 5f 53 45 54 29 3b 0a 20 20 69 66 28 20 6e 65 77  _SET);.  if( new
80b0: 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29  Offset!=offset )
80c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  {.    return -1;
80d0: 0a 20 20 7d 0a 20 20 67 6f 74 20 3d 20 77 72 69  .  }.  got = wri
80e0: 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  te(id->h, pBuf, 
80f0: 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54  cnt);.#endif.  T
8100: 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52  IMER_END;.  OSTR
8110: 41 43 45 35 28 22 57 52 49 54 45 20 20 20 25 2d  ACE5("WRITE   %-
8120: 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25 64 5c  3d %5d %7lld %d\
8130: 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20  n", id->h, got, 
8140: 6f 66 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c  offset, TIMER_EL
8150: 41 50 53 45 44 29 3b 0a 20 20 72 65 74 75 72 6e  APSED);.  return
8160: 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   got;.}.../*.** 
8170: 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20  Write data from 
8180: 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20  a buffer into a 
8190: 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  file.  Return SQ
81a0: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
81b0: 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74  ss.** or some ot
81c0: 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  her error code o
81d0: 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74  n failure..*/.st
81e0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 57 72 69  atic int unixWri
81f0: 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  te(.  sqlite3_fi
8200: 6c 65 20 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74  le *id, .  const
8210: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20   void *pBuf, .  
8220: 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74  int amt,.  sqlit
8230: 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20  e3_int64 offset 
8240: 0a 29 7b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20  .){.  int wrote 
8250: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69  = 0;.  assert( i
8260: 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  d );.  assert( a
8270: 6d 74 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28  mt>0 );.  while(
8280: 20 61 6d 74 3e 30 20 26 26 20 28 77 72 6f 74 65   amt>0 && (wrote
8290: 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28   = seekAndWrite(
82a0: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 6f  (unixFile*)id, o
82b0: 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74  ffset, pBuf, amt
82c0: 29 29 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20  ))>0 ){.    amt 
82d0: 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66  -= wrote;.    of
82e0: 66 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20  fset += wrote;. 
82f0: 20 20 20 70 42 75 66 20 3d 20 26 28 28 63 68 61     pBuf = &((cha
8300: 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b  r*)pBuf)[wrote];
8310: 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49  .  }.  SimulateI
8320: 4f 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28  OError(( wrote=(
8330: 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20  -1), amt=1 ));. 
8340: 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
8350: 6c 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30  lError(( wrote=0
8360: 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 69 66  , amt=1 ));.  if
8370: 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 69  ( amt>0 ){.    i
8380: 66 28 20 77 72 6f 74 65 3c 30 20 29 7b 0a 20 20  f( wrote<0 ){.  
8390: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
83a0: 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20  E_IOERR_WRITE;. 
83b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
83c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
83d0: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  LL;.    }.  }.  
83e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
83f0: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
8400: 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f  TE_TEST./*.** Co
8410: 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
8420: 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20  f fullsyncs and 
8430: 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54  normal syncs.  T
8440: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74  his is used to t
8450: 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63  est.** that sync
8460: 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20  s and fullsyncs 
8470: 61 72 65 20 6f 63 63 75 72 69 6e 67 20 61 74 20  are occuring at 
8480: 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e  the right times.
8490: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
84a0: 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  sync_count = 0;.
84b0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c  int sqlite3_full
84c0: 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  sync_count = 0;.
84d0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73  #endif../*.** Us
84e0: 65 20 74 68 65 20 66 64 61 74 61 73 79 6e 63 28  e the fdatasync(
84f0: 29 20 41 50 49 20 6f 6e 6c 79 20 69 66 20 74 68  ) API only if th
8500: 65 20 48 41 56 45 5f 46 44 41 54 41 53 59 4e 43  e HAVE_FDATASYNC
8510: 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65   macro is define
8520: 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  d..** Otherwise 
8530: 75 73 65 20 66 73 79 6e 63 28 29 20 69 6e 20 69  use fsync() in i
8540: 74 73 20 70 6c 61 63 65 2e 0a 2a 2f 0a 23 69 66  ts place..*/.#if
8550: 6e 64 65 66 20 48 41 56 45 5f 46 44 41 54 41 53  ndef HAVE_FDATAS
8560: 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 66 64 61  YNC.# define fda
8570: 74 61 73 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e  tasync fsync.#en
8580: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e  dif../*.** Defin
8590: 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
85a0: 20 74 6f 20 30 20 6f 72 20 31 20 64 65 70 65 6e   to 0 or 1 depen
85b0: 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
85c0: 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f  or not.** the F_
85d0: 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20  FULLFSYNC macro 
85e0: 69 73 20 64 65 66 69 6e 65 64 2e 20 20 46 5f 46  is defined.  F_F
85f0: 55 4c 4c 46 53 59 4e 43 20 69 73 20 63 75 72 72  ULLFSYNC is curr
8600: 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76  ently.** only av
8610: 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f  ailable on Mac O
8620: 53 20 58 2e 20 20 42 75 74 20 74 68 61 74 20 63  S X.  But that c
8630: 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a  ould change..*/.
8640: 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46 53 59  #ifdef F_FULLFSY
8650: 4e 43 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45  NC.# define HAVE
8660: 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c  _FULLFSYNC 1.#el
8670: 73 65 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45  se.# define HAVE
8680: 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e  _FULLFSYNC 0.#en
8690: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  dif.../*.** The 
86a0: 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63  fsync() system c
86b0: 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  all does not wor
86c0: 6b 20 61 73 20 61 64 76 65 72 74 69 73 65 64 20  k as advertised 
86d0: 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20  on many.** unix 
86e0: 73 79 73 74 65 6d 73 2e 20 20 54 68 65 20 66 6f  systems.  The fo
86f0: 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72  llowing procedur
8700: 65 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  e is an attempt 
8710: 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f  to make.** it wo
8720: 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a  rk better..**.**
8730: 20 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53   The SQLITE_NO_S
8740: 59 4e 43 20 6d 61 63 72 6f 20 64 69 73 61 62 6c  YNC macro disabl
8750: 65 73 20 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e  es all fsync()s.
8760: 20 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c    This is useful
8770: 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20  .** for testing 
8780: 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20  when we want to 
8790: 72 75 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  run through the 
87a0: 74 65 73 74 20 73 75 69 74 65 20 71 75 69 63 6b  test suite quick
87b0: 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73  ly..** You are s
87c0: 74 72 6f 6e 67 6c 79 20 61 64 76 69 73 65 64 20  trongly advised 
87d0: 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20  *not* to deploy 
87e0: 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  with SQLITE_NO_S
87f0: 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20  YNC.** enabled, 
8800: 68 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 77  however, since w
8810: 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  ith SQLITE_NO_SY
8820: 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f  NC enabled, an O
8830: 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f  S crash.** or po
8840: 77 65 72 20 66 61 69 6c 75 72 65 20 77 69 6c 6c  wer failure will
8850: 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70 74 20   likely corrupt 
8860: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
8870: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
8880: 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20   full_fsync(int 
8890: 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63  fd, int fullSync
88a0: 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b  , int dataOnly){
88b0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
88c0: 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62   Record the numb
88d0: 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74  er of times that
88e0: 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20   we do a normal 
88f0: 66 73 79 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a  fsync() and .  *
8900: 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69  * FULLSYNC.  Thi
8910: 73 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67  s is used during
8920: 20 74 65 73 74 69 6e 67 20 74 6f 20 76 65 72 69   testing to veri
8930: 66 79 20 74 68 61 74 20 74 68 69 73 20 70 72 6f  fy that this pro
8940: 63 65 64 75 72 65 0a 20 20 2a 2a 20 67 65 74 73  cedure.  ** gets
8950: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65   called with the
8960: 20 63 6f 72 72 65 63 74 20 61 72 67 75 6d 65 6e   correct argumen
8970: 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  ts..  */.#ifdef 
8980: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
8990: 28 20 66 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c  ( fullSync ) sql
89a0: 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
89b0: 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  unt++;.  sqlite3
89c0: 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23  _sync_count++;.#
89d0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77  endif..  /* If w
89e0: 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  e compiled with 
89f0: 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  the SQLITE_NO_SY
8a00: 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79  NC flag, then sy
8a10: 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20  ncing is a.  ** 
8a20: 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65  no-op.  */.#ifde
8a30: 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
8a40: 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  .  rc = SQLITE_O
8a50: 4b 3b 0a 23 65 6c 73 65 0a 0a 23 69 66 20 48 41  K;.#else..#if HA
8a60: 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69  VE_FULLFSYNC.  i
8a70: 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  f( fullSync ){. 
8a80: 20 20 20 72 63 20 3d 20 66 63 6e 74 6c 28 66 64     rc = fcntl(fd
8a90: 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30  , F_FULLFSYNC, 0
8aa0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
8ab0: 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a  rc = 1;.  }.  /*
8ac0: 20 49 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e   If the FULLFSYN
8ad0: 43 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62  C failed, fall b
8ae0: 61 63 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e  ack to attemptin
8af0: 67 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20  g an fsync()..  
8b00: 20 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20   * It shouldn't 
8b10: 62 65 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  be possible for 
8b20: 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69  fullfsync to fai
8b30: 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a  l on the local .
8b40: 20 20 20 2a 20 66 69 6c 65 20 73 79 73 74 65 6d     * file system
8b50: 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61   (on OSX), so fa
8b60: 69 6c 75 72 65 20 69 6e 64 69 63 61 74 65 73 20  ilure indicates 
8b70: 74 68 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20  that FULLFSYNC. 
8b80: 20 20 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72    * isn't suppor
8b90: 74 65 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c  ted for this fil
8ba0: 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74  e system. So, at
8bb0: 74 65 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a  tempt an fsync .
8bc0: 20 20 20 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f     * and (for no
8bd0: 77 29 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76  w) ignore the ov
8be0: 65 72 68 65 61 64 20 6f 66 20 61 20 73 75 70 65  erhead of a supe
8bf0: 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61  rfluous fcntl ca
8c00: 6c 6c 2e 20 20 0a 20 20 20 2a 20 49 74 27 64 20  ll.  .   * It'd 
8c10: 62 65 20 62 65 74 74 65 72 20 74 6f 20 64 65 74  be better to det
8c20: 65 63 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75  ect fullfsync su
8c30: 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61  pport once and a
8c40: 76 6f 69 64 20 0a 20 20 20 2a 20 74 68 65 20 66  void .   * the f
8c50: 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20  cntl call every 
8c60: 74 69 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c  time sync is cal
8c70: 6c 65 64 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28  led..   */.  if(
8c80: 20 72 63 20 29 20 72 63 20 3d 20 66 73 79 6e 63   rc ) rc = fsync
8c90: 28 66 64 29 3b 0a 0a 23 65 6c 73 65 20 0a 20 20  (fd);..#else .  
8ca0: 69 66 28 20 64 61 74 61 4f 6e 6c 79 20 29 7b 0a  if( dataOnly ){.
8cb0: 20 20 20 20 72 63 20 3d 20 66 64 61 74 61 73 79      rc = fdatasy
8cc0: 6e 63 28 66 64 29 3b 0a 20 20 7d 65 6c 73 65 7b  nc(fd);.  }else{
8cd0: 0a 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28  .    rc = fsync(
8ce0: 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  fd);.  }.#endif 
8cf0: 2f 2a 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  /* HAVE_FULLFSYN
8d00: 43 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64  C */.#endif /* d
8d10: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f  efined(SQLITE_NO
8d20: 5f 53 59 4e 43 29 20 2a 2f 0a 0a 20 20 72 65 74  _SYNC) */..  ret
8d30: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
8d40: 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
8d50: 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
8d60: 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
8d70: 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
8d80: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f  ..**.** If dataO
8d90: 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68  nly==0 then both
8da0: 20 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66   the file itself
8db0: 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74   and its metadat
8dc0: 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c  a (file.** size,
8dd0: 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74   access time, et
8de0: 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20  c) are synced.  
8df0: 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74  If dataOnly!=0 t
8e00: 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  hen only the.** 
8e10: 66 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e  file data is syn
8e20: 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72  ced..**.** Under
8e30: 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65   Unix, also make
8e40: 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64   sure that the d
8e50: 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66  irectory entry f
8e60: 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68  or the file.** h
8e70: 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  as been created 
8e80: 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65  by fsync-ing the
8e90: 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20   directory that 
8ea0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c  contains the fil
8eb0: 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e  e..** If we do n
8ec0: 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77  ot do this and w
8ed0: 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f  e encounter a po
8ee0: 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
8ef0: 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e   directory.** en
8f00: 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  try for the jour
8f10: 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78  nal might not ex
8f20: 69 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62  ist after we reb
8f30: 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a  oot.  The next.*
8f40: 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65  * SQLite to acce
8f50: 73 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c  ss the file will
8f60: 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74   not know that t
8f70: 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  he journal exist
8f80: 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  s (because.** th
8f90: 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72  e directory entr
8fa0: 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  y for the journa
8fb0: 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61  l was never crea
8fc0: 74 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61  ted) and the tra
8fd0: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c  nsaction.** will
8fe0: 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d   not roll back -
8ff0: 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e   possibly leadin
9000: 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  g to database co
9010: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
9020: 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63  tic int unixSync
9030: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
9040: 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  d, int flags){. 
9050: 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46   int rc;.  unixF
9060: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
9070: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69  ixFile*)id;..  i
9080: 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20  nt isDataOnly = 
9090: 28 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59  (flags&SQLITE_SY
90a0: 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20  NC_DATAONLY);.  
90b0: 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d  int isFullsync =
90c0: 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53   (flags&0x0F)==S
90d0: 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b  QLITE_SYNC_FULL;
90e0: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
90f0: 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  t one of SQLITE_
9100: 53 59 4e 43 5f 4e 4f 52 4d 41 4c 2c 20 46 55 4c  SYNC_NORMAL, FUL
9110: 4c 20 6f 72 20 42 41 52 52 49 45 52 20 77 61 73  L or BARRIER was
9120: 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73   passed */.  ass
9130: 65 72 74 28 28 66 6c 61 67 73 26 30 78 30 46 29  ert((flags&0x0F)
9140: 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  ==SQLITE_SYNC_NO
9150: 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66  RMAL.      || (f
9160: 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
9170: 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 20  TE_SYNC_FULL.   
9180: 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30     || (flags&0x0
9190: 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
91a0: 42 41 52 52 49 45 52 0a 20 20 29 3b 0a 0a 20 20  BARRIER.  );..  
91b0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
91c0: 0a 20 20 4f 53 54 52 41 43 45 32 28 22 53 59 4e  .  OSTRACE2("SYN
91d0: 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46  C    %-3d\n", pF
91e0: 69 6c 65 2d 3e 68 29 3b 0a 20 20 72 63 20 3d 20  ile->h);.  rc = 
91f0: 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65  full_fsync(pFile
9200: 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e 63 2c  ->h, isFullsync,
9210: 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a 20 20   isDataOnly);.  
9220: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
9230: 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72   rc=1 );.  if( r
9240: 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
9250: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59  SQLITE_IOERR_FSY
9260: 4e 43 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46  NC;.  }.  if( pF
9270: 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29 7b  ile->dirfd>=0 ){
9280: 0a 20 20 20 20 4f 53 54 52 41 43 45 34 28 22 44  .    OSTRACE4("D
9290: 49 52 53 59 4e 43 20 25 2d 33 64 20 28 68 61 76  IRSYNC %-3d (hav
92a0: 65 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66  e_fullfsync=%d f
92b0: 75 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20  ullsync=%d)\n", 
92c0: 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c 0a 20 20  pFile->dirfd,.  
92d0: 20 20 20 20 20 20 20 20 20 20 48 41 56 45 5f 46            HAVE_F
92e0: 55 4c 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c  ULLFSYNC, isFull
92f0: 73 79 6e 63 29 3b 0a 23 69 66 6e 64 65 66 20 53  sync);.#ifndef S
9300: 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49  QLITE_DISABLE_DI
9310: 52 53 59 4e 43 0a 20 20 20 20 2f 2a 20 54 68 65  RSYNC.    /* The
9320: 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20   directory sync 
9330: 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65  is only attempte
9340: 64 20 69 66 20 66 75 6c 6c 5f 66 73 79 6e 63 20  d if full_fsync 
9350: 69 73 0a 20 20 20 20 2a 2a 20 74 75 72 6e 65 64  is.    ** turned
9360: 20 6f 66 66 20 6f 72 20 75 6e 61 76 61 69 6c 61   off or unavaila
9370: 62 6c 65 2e 20 20 49 66 20 61 20 66 75 6c 6c 5f  ble.  If a full_
9380: 66 73 79 6e 63 20 6f 63 63 75 72 72 65 64 20 61  fsync occurred a
9390: 62 6f 76 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65  bove,.    ** the
93a0: 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  n the directory 
93b0: 73 79 6e 63 20 69 73 20 73 75 70 65 72 66 6c 75  sync is superflu
93c0: 6f 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ous..    */.    
93d0: 69 66 28 20 28 21 48 41 56 45 5f 46 55 4c 4c 46  if( (!HAVE_FULLF
93e0: 53 59 4e 43 20 7c 7c 20 21 69 73 46 75 6c 6c 73  SYNC || !isFulls
93f0: 79 6e 63 29 20 26 26 20 66 75 6c 6c 5f 66 73 79  ync) && full_fsy
9400: 6e 63 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c  nc(pFile->dirfd,
9410: 30 2c 30 29 20 29 7b 0a 20 20 20 20 20 20 20 2f  0,0) ){.       /
9420: 2a 0a 20 20 20 20 20 20 20 2a 2a 20 57 65 20 68  *.       ** We h
9430: 61 76 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c  ave received mul
9440: 74 69 70 6c 65 20 72 65 70 6f 72 74 73 20 6f 66  tiple reports of
9450: 20 66 73 79 6e 63 28 29 20 72 65 74 75 72 6e 69   fsync() returni
9460: 6e 67 0a 20 20 20 20 20 20 20 2a 2a 20 65 72 72  ng.       ** err
9470: 6f 72 73 20 77 68 65 6e 20 61 70 70 6c 69 65 64  ors when applied
9480: 20 74 6f 20 64 69 72 65 63 74 6f 72 69 65 73 20   to directories 
9490: 6f 6e 20 63 65 72 74 61 69 6e 20 66 69 6c 65 20  on certain file 
94a0: 73 79 73 74 65 6d 73 2e 0a 20 20 20 20 20 20 20  systems..       
94b0: 2a 2a 20 41 20 66 61 69 6c 65 64 20 64 69 72 65  ** A failed dire
94c0: 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20 6e 6f  ctory sync is no
94d0: 74 20 61 20 62 69 67 20 64 65 61 6c 2e 20 20 53  t a big deal.  S
94e0: 6f 20 69 74 20 73 65 65 6d 73 0a 20 20 20 20 20  o it seems.     
94f0: 20 20 2a 2a 20 62 65 74 74 65 72 20 74 6f 20 69    ** better to i
9500: 67 6e 6f 72 65 20 74 68 65 20 65 72 72 6f 72 2e  gnore the error.
9510: 20 20 54 69 63 6b 65 74 20 23 31 36 35 37 0a 20    Ticket #1657. 
9520: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
9530: 2f 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  /* return SQLITE
9540: 5f 49 4f 45 52 52 3b 20 2a 2f 0a 20 20 20 20 7d  _IOERR; */.    }
9550: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 6c 6f 73  .#endif.    clos
9560: 65 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 29 3b  e(pFile->dirfd);
9570: 20 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 20 74    /* Only need t
9580: 6f 20 73 79 6e 63 20 6f 6e 63 65 2c 20 73 6f 20  o sync once, so 
9590: 63 6c 6f 73 65 20 74 68 65 20 64 69 72 65 63 74  close the direct
95a0: 6f 72 79 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65  ory */.    pFile
95b0: 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 20 20 20  ->dirfd = -1;   
95c0: 20 2f 2a 20 77 68 65 6e 20 77 65 20 61 72 65 20   /* when we are 
95d0: 64 6f 6e 65 2e 20 2a 2f 0a 20 20 7d 0a 20 20 72  done. */.  }.  r
95e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
95f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
9600: 68 65 20 64 69 72 65 63 74 6f 72 79 20 7a 44 69  he directory zDi
9610: 72 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 61  rname. This is a
9620: 20 6e 6f 2d 6f 70 20 6f 6e 20 6f 70 65 72 61 74   no-op on operat
9630: 69 6e 67 20 73 79 73 74 65 6d 73 20 6f 74 68 65  ing systems othe
9640: 72 0a 2a 2a 20 74 68 61 6e 20 55 4e 49 58 2e 0a  r.** than UNIX..
9650: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73  **.** This is us
9660: 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
9670: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
9680: 61 6c 20 66 69 6c 65 20 68 61 73 20 74 72 75 65  al file has true
9690: 6c 79 20 62 65 65 6e 20 64 65 6c 65 74 65 64 0a  ly been deleted.
96a0: 2a 2a 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67  ** before making
96b0: 20 63 68 61 6e 67 65 73 20 74 6f 20 69 6e 64 69   changes to indi
96c0: 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 73 20  vidual journals 
96d0: 6f 6e 20 61 20 6d 75 6c 74 69 2d 64 61 74 61 62  on a multi-datab
96e0: 61 73 65 20 63 6f 6d 6d 69 74 2e 0a 2a 2a 20 54  ase commit..** T
96f0: 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6f  he F_FULLFSYNC o
9700: 70 74 69 6f 6e 20 69 73 20 6e 6f 74 20 6e 65 65  ption is not nee
9710: 64 65 64 20 68 65 72 65 2e 0a 2a 2f 0a 69 6e 74  ded here..*/.int
9720: 20 73 71 6c 69 74 65 33 55 6e 69 78 53 79 6e 63   sqlite3UnixSync
9730: 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20  Directory(const 
9740: 63 68 61 72 20 2a 7a 44 69 72 6e 61 6d 65 29 7b  char *zDirname){
9750: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
9760: 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20  ISABLE_DIRSYNC. 
9770: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9780: 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 66  K;.#else.  int f
9790: 64 3b 0a 20 20 69 6e 74 20 72 3b 0a 20 20 66 64  d;.  int r;.  fd
97a0: 20 3d 20 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65   = open(zDirname
97b0: 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e  , O_RDONLY|O_BIN
97c0: 41 52 59 2c 20 30 29 3b 0a 20 20 4f 53 54 52 41  ARY, 0);.  OSTRA
97d0: 43 45 33 28 22 44 49 52 53 59 4e 43 20 25 2d 33  CE3("DIRSYNC %-3
97e0: 64 20 28 25 73 29 5c 6e 22 2c 20 66 64 2c 20 7a  d (%s)\n", fd, z
97f0: 44 69 72 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  Dirname);.  if( 
9800: 66 64 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75  fd<0 ){.    retu
9810: 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
9820: 45 4e 3b 20 0a 20 20 7d 0a 20 20 72 20 3d 20 66  EN; .  }.  r = f
9830: 73 79 6e 63 28 66 64 29 3b 0a 20 20 63 6c 6f 73  sync(fd);.  clos
9840: 65 28 66 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74  e(fd);.  Simulat
9850: 65 49 4f 45 72 72 6f 72 28 20 72 3d 31 20 29 3b  eIOError( r=1 );
9860: 0a 20 20 69 66 28 20 72 20 29 7b 0a 20 20 20 20  .  if( r ){.    
9870: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
9880: 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 3b 0a 20  ERR_DIR_FSYNC;. 
9890: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
98a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
98b0: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
98c0: 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70  * Truncate an op
98d0: 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65  en file to a spe
98e0: 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73  cified size.*/.s
98f0: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72  tatic int unixTr
9900: 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66  uncate(sqlite3_f
9910: 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79  ile *id, i64 nBy
9920: 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  te){.  int rc;. 
9930: 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20   assert( id );. 
9940: 20 72 63 20 3d 20 66 74 72 75 6e 63 61 74 65 28   rc = ftruncate(
9950: 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
9960: 3e 68 2c 20 28 6f 66 66 5f 74 29 6e 42 79 74 65  >h, (off_t)nByte
9970: 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
9980: 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20  rror( rc=1 );.  
9990: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
99a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
99b0: 52 5f 54 52 55 4e 43 41 54 45 3b 0a 20 20 7d 65  R_TRUNCATE;.  }e
99c0: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
99d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
99e0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
99f0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  e the current si
9a00: 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20  ze of a file in 
9a10: 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  bytes.*/.static 
9a20: 69 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a 65  int unixFileSize
9a30: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
9a40: 64 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a  d, i64 *pSize){.
9a50: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75    int rc;.  stru
9a60: 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61  ct stat buf;.  a
9a70: 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72  ssert( id );.  r
9a80: 63 20 3d 20 66 73 74 61 74 28 28 28 75 6e 69 78  c = fstat(((unix
9a90: 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62  File*)id)->h, &b
9aa0: 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  uf);.  SimulateI
9ab0: 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a  OError( rc=1 );.
9ac0: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
9ad0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9ae0: 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
9af0: 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66  }.  *pSize = buf
9b00: 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 72 65 74 75  .st_size;.  retu
9b10: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
9b20: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
9b30: 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
9b40: 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
9b50: 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
9b60: 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
9b70: 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
9b80: 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
9b90: 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
9ba0: 6b 20 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72  k is held, retur
9bb0: 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20  n.** non-zero.  
9bc0: 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  If the file is u
9bd0: 6e 6c 6f 63 6b 65 64 20 6f 72 20 68 6f 6c 64 73  nlocked or holds
9be0: 20 6f 6e 6c 79 20 53 48 41 52 45 44 20 6c 6f 63   only SHARED loc
9bf0: 6b 73 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75  ks, then.** retu
9c00: 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  rn zero..*/.stat
9c10: 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b  ic int unixCheck
9c20: 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
9c30: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
9c40: 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 75    int r = 0;.  u
9c50: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
9c60: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
9c70: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
9c80: 20 29 3b 0a 20 20 65 6e 74 65 72 4d 75 74 65 78   );.  enterMutex
9c90: 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70  (); /* Because p
9ca0: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73  File->pLock is s
9cb0: 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
9cc0: 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68  eads */..  /* Ch
9cd0: 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20  eck if a thread 
9ce0: 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
9cf0: 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63  holds such a loc
9d00: 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  k */.  if( pFile
9d10: 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70  ->pLock->locktyp
9d20: 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  e>SHARED_LOCK ){
9d30: 0a 20 20 20 20 72 20 3d 20 31 3b 0a 20 20 7d 0a  .    r = 1;.  }.
9d40: 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
9d50: 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
9d60: 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
9d70: 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  it..  */.  if( !
9d80: 72 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  r ){.    struct 
9d90: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20  flock lock;.    
9da0: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
9db0: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f  SEEK_SET;.    lo
9dc0: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53  ck.l_start = RES
9dd0: 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20  ERVED_BYTE;.    
9de0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a  lock.l_len = 1;.
9df0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
9e00: 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 66  = F_WRLCK;.    f
9e10: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
9e20: 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a  _GETLK, &lock);.
9e30: 20 20 20 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74      if( lock.l_t
9e40: 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype!=F_UNLCK ){.
9e50: 20 20 20 20 20 20 72 20 3d 20 31 3b 0a 20 20 20        r = 1;.   
9e60: 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 6c 65 61 76   }.  }.  .  leav
9e70: 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
9e80: 41 43 45 33 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE3("TEST WR-LO
9e90: 43 4b 20 25 64 20 25 64 5c 6e 22 2c 20 70 46 69  CK %d %d\n", pFi
9ea0: 6c 65 2d 3e 68 2c 20 72 29 3b 0a 0a 20 20 72 65  le->h, r);..  re
9eb0: 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn r;.}../*.**
9ec0: 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
9ed0: 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
9ee0: 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
9ef0: 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f  ter locktype - o
9f00: 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
9f10: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
9f20: 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
9f30: 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
9f40: 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
9f50: 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
9f60: 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
9f70: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
9f80: 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
9f90: 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
9fa0: 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
9fb0: 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
9fc0: 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
9fd0: 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
9fe0: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
9ff0: 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
a000: 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
a010: 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
a020: 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
a030: 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
a040: 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
a050: 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
a060: 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
a070: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
a080: 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
a090: 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
a0a0: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
a0b0: 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
a0c0: 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
a0d0: 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
a0e0: 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
a0f0: 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
a100: 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
a110: 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
a120: 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
a130: 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
a140: 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
a150: 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
a160: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
a170: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
a180: 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
a190: 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
a1a0: 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
a1b0: 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
a1c0: 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
a1d0: 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
a1e0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63  atic int unixLoc
a1f0: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
a200: 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
a210: 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ){.  /* The foll
a220: 6f 77 69 6e 67 20 64 65 73 63 72 69 62 65 73 20  owing describes 
a230: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
a240: 6f 6e 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75  on of the variou
a250: 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a  s locks and.  **
a260: 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e   lock transition
a270: 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68  s in terms of th
a280: 65 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  e POSIX advisory
a290: 20 73 68 61 72 65 64 20 61 6e 64 20 65 78 63 6c   shared and excl
a2a0: 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20  usive.  ** lock 
a2b0: 70 72 69 6d 69 74 69 76 65 73 20 28 63 61 6c 6c  primitives (call
a2c0: 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e  ed read-locks an
a2d0: 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65  d write-locks be
a2e0: 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20  low, to avoid.  
a2f0: 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74  ** confusion wit
a300: 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61  h SQLite lock na
a310: 6d 65 73 29 2e 20 54 68 65 20 61 6c 67 6f 72 69  mes). The algori
a320: 74 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69 63  thms are complic
a330: 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74  ated.  ** slight
a340: 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  ly in order to b
a350: 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  e compatible wit
a360: 68 20 77 69 6e 64 6f 77 73 20 73 79 73 74 65 6d  h windows system
a370: 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79  s simultaneously
a380: 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67 20  .  ** accessing 
a390: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
a3a0: 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65 20  e file, in case 
a3b0: 74 68 61 74 20 69 73 20 65 76 65 72 20 72 65 71  that is ever req
a3c0: 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  uired..  **.  **
a3d0: 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64   Symbols defined
a3e0: 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69   in os.h indenti
a3f0: 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  fy the 'pending 
a400: 62 79 74 65 27 20 61 6e 64 20 74 68 65 20 27 72  byte' and the 'r
a410: 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79 74  eserved.  ** byt
a420: 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65 20  e', each single 
a430: 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e  bytes at well kn
a440: 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e 64  own offsets, and
a450: 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74   the 'shared byt
a460: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61  e.  ** range', a
a470: 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62 79   range of 510 by
a480: 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e  tes at a well kn
a490: 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a  own offset..  **
a4a0: 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20  .  ** To obtain 
a4b0: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61  a SHARED lock, a
a4c0: 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62   read-lock is ob
a4d0: 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27 70  tained on the 'p
a4e0: 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65  ending.  ** byte
a4f0: 27 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73  '.  If this is s
a500: 75 63 63 65 73 73 66 75 6c 2c 20 61 20 72 61 6e  uccessful, a ran
a510: 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 74 68  dom byte from th
a520: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
a530: 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 72 65   ** range' is re
a540: 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68  ad-locked and th
a550: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70  e lock on the 'p
a560: 65 6e 64 69 6e 67 20 62 79 74 65 27 20 72 65 6c  ending byte' rel
a570: 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  eased..  **.  **
a580: 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f   A process may o
a590: 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52 45 53  nly obtain a RES
a5a0: 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74 65 72  ERVED lock after
a5b0: 20 69 74 20 68 61 73 20 61 20 53 48 41 52 45 44   it has a SHARED
a5c0: 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45   lock..  ** A RE
a5d0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 69  SERVED lock is i
a5e0: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 67 72  mplemented by gr
a5f0: 61 62 62 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  abbing a write-l
a600: 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ock on the.  ** 
a610: 27 72 65 73 65 72 76 65 64 20 62 79 74 65 27 2e  'reserved byte'.
a620: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72   .  **.  ** A pr
a630: 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f  ocess may only o
a640: 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e 47 20  btain a PENDING 
a650: 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61  lock after it ha
a660: 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20 20 2a  s obtained a.  *
a670: 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41  * SHARED lock. A
a680: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
a690: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
a6a0: 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74  obtaining a writ
a6b0: 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74  e-lock.  ** on t
a6c0: 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65  he 'pending byte
a6d0: 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  '. This ensures 
a6e0: 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48 41 52  that no new SHAR
a6f0: 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a  ED locks can be.
a700: 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62    ** obtained, b
a710: 75 74 20 65 78 69 73 74 69 6e 67 20 53 48 41 52  ut existing SHAR
a720: 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c  ED locks are all
a730: 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73 74 2e  owed to persist.
a740: 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20   A process.  ** 
a750: 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
a760: 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56   obtain a RESERV
a770: 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77  ED lock on the w
a780: 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e 47 20  ay to a PENDING 
a790: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20  lock..  ** This 
a7a0: 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64  property is used
a7b0: 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69 74 68   by the algorith
a7c0: 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61  m for rolling ba
a7d0: 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ck a journal fil
a7e0: 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 20 63  e.  ** after a c
a7f0: 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rash..  **.  ** 
a800: 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  An EXCLUSIVE loc
a810: 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66 74 65  k, obtained afte
a820: 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  r a PENDING lock
a830: 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a   is held, is.  *
a840: 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  * implemented by
a850: 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69   obtaining a wri
a860: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65  te-lock on the e
a870: 6e 74 69 72 65 20 27 73 68 61 72 65 64 20 62 79  ntire 'shared by
a880: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20  te.  ** range'. 
a890: 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72 20  Since all other 
a8a0: 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20 61 20  locks require a 
a8b0: 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65  read-lock on one
a8c0: 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a 20 20   of the bytes.  
a8d0: 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 72  ** within this r
a8e0: 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73 75 72  ange, this ensur
a8f0: 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  es that no other
a900: 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 20   locks are held 
a910: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  on the.  ** data
a920: 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  base. .  **.  **
a930: 20 54 68 65 20 72 65 61 73 6f 6e 20 61 20 73 69   The reason a si
a940: 6e 67 6c 65 20 62 79 74 65 20 63 61 6e 6e 6f 74  ngle byte cannot
a950: 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64   be used instead
a960: 20 6f 66 20 74 68 65 20 27 73 68 61 72 65 64 20   of the 'shared 
a970: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
a980: 20 69 73 20 74 68 61 74 20 73 6f 6d 65 20 76 65   is that some ve
a990: 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64 6f 77  rsions of window
a9a0: 73 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  s do not support
a9b0: 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a   read-locks. By.
a9c0: 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61 20 72    ** locking a r
a9d0: 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20  andom byte from 
a9e0: 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75 72 72  a range, concurr
a9f0: 65 6e 74 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  ent SHARED locks
aa00: 20 6d 61 79 20 65 78 69 73 74 0a 20 20 2a 2a 20   may exist.  ** 
aa10: 65 76 65 6e 20 69 66 20 74 68 65 20 6c 6f 63 6b  even if the lock
aa20: 69 6e 67 20 70 72 69 6d 69 74 69 76 65 20 75 73  ing primitive us
aa30: 65 64 20 69 73 20 61 6c 77 61 79 73 20 61 20 77  ed is always a w
aa40: 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a  rite-lock..  */.
aa50: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
aa60: 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
aa70: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
aa80: 69 6c 65 2a 29 69 64 3b 0a 20 20 73 74 72 75 63  ile*)id;.  struc
aa90: 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63  t lockInfo *pLoc
aaa0: 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  k = pFile->pLock
aab0: 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  ;.  struct flock
aac0: 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 73 3b 0a   lock;.  int s;.
aad0: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
aae0: 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 37 28 22   );.  OSTRACE7("
aaf0: 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61  LOCK    %d %s wa
ab00: 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d  s %s(%s,%d) pid=
ab10: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
ab20: 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e  .      locktypeN
ab30: 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 6c  ame(locktype), l
ab40: 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69 6c  ocktypeName(pFil
ab50: 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 0a 20 20  e->locktype),.  
ab60: 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65      locktypeName
ab70: 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65  (pLock->locktype
ab80: 29 2c 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 2c 20  ), pLock->cnt , 
ab90: 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 2f 2a  getpid());..  /*
aba0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
abb0: 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
abc0: 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
abd0: 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
abe0: 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c  the.  ** OsFile,
abf0: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e   do nothing. Don
ac00: 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c  't use the end_l
ac10: 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20  ock: exit path, 
ac20: 61 73 0a 20 20 2a 2a 20 65 6e 74 65 72 4d 75 74  as.  ** enterMut
ac30: 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e  ex() hasn't been
ac40: 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a   called yet..  *
ac50: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  /.  if( pFile->l
ac60: 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70  ocktype>=locktyp
ac70: 65 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  e ){.    OSTRACE
ac80: 33 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  3("LOCK    %d %s
ac90: 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c   ok (already hel
aca0: 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  d)\n", pFile->h,
acb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63  .            loc
acc0: 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79  ktypeName(lockty
acd0: 70 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  pe));.    return
ace0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
acf0: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
ad00: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75  the locking sequ
ad10: 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a  ence is correct.
ad20: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
ad30: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d  File->locktype!=
ad40: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74  NO_LOCK || lockt
ad50: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
ad60: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
ad70: 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f  cktype!=PENDING_
ad80: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
ad90: 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45  ( locktype!=RESE
ada0: 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69  RVED_LOCK || pFi
adb0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  le->locktype==SH
adc0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ARED_LOCK );..  
add0: 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73  /* This mutex is
ade0: 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20   needed because 
adf0: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20  pFile->pLock is 
ae00: 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
ae10: 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 65 6e 74  reads.  */.  ent
ae20: 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a  erMutex();..  /*
ae30: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
ae40: 75 72 72 65 6e 74 20 74 68 72 65 61 64 20 6f 77  urrent thread ow
ae50: 6e 73 20 74 68 65 20 70 46 69 6c 65 2e 0a 20 20  ns the pFile..  
ae60: 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61 6e 73 66  */.  rc = transf
ae70: 65 72 4f 77 6e 65 72 73 68 69 70 28 70 46 69 6c  erOwnership(pFil
ae80: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
ae90: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6c  LITE_OK ){.    l
aea0: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
aeb0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
aec0: 20 20 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d    pLock = pFile-
aed0: 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66  >pLock;..  /* If
aee0: 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
aef0: 6e 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20  ng this PID has 
af00: 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66  a lock via a dif
af10: 66 65 72 65 6e 74 20 4f 73 46 69 6c 65 2a 0a 20  ferent OsFile*. 
af20: 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20   ** handle that 
af30: 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65  precludes the re
af40: 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65  quested lock, re
af50: 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a  turn BUSY..  */.
af60: 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 6c 6f    if( (pFile->lo
af70: 63 6b 74 79 70 65 21 3d 70 4c 6f 63 6b 2d 3e 6c  cktype!=pLock->l
af80: 6f 63 6b 74 79 70 65 20 26 26 20 0a 20 20 20 20  ocktype && .    
af90: 20 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f        (pLock->lo
afa0: 63 6b 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f  cktype>=PENDING_
afb0: 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65  LOCK || locktype
afc0: 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20  >SHARED_LOCK)). 
afd0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
afe0: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f  ITE_BUSY;.    go
aff0: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  to end_lock;.  }
b000: 0a 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52  ..  /* If a SHAR
b010: 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ED lock is reque
b020: 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74  sted, and some t
b030: 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
b040: 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a   PID already.  *
b050: 2a 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f  * has a SHARED o
b060: 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  r RESERVED lock,
b070: 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   then increment 
b080: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73  reference counts
b090: 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e   and.  ** return
b0a0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f   SQLITE_OK..  */
b0b0: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
b0c0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20  =SHARED_LOCK && 
b0d0: 0a 20 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c  .      (pLock->l
b0e0: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
b0f0: 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 6c  LOCK || pLock->l
b100: 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45  ocktype==RESERVE
b110: 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61  D_LOCK) ){.    a
b120: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3d  ssert( locktype=
b130: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
b140: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
b150: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30 20 29  e->locktype==0 )
b160: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
b170: 6f 63 6b 2d 3e 63 6e 74 3e 30 20 29 3b 0a 20 20  ock->cnt>0 );.  
b180: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
b190: 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  e = SHARED_LOCK;
b1a0: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2b  .    pLock->cnt+
b1b0: 2b 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4f  +;.    pFile->pO
b1c0: 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  pen->nLock++;.  
b1d0: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
b1e0: 0a 20 20 7d 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c  .  }..  lock.l_l
b1f0: 65 6e 20 3d 20 31 4c 3b 0a 0a 20 20 6c 6f 63 6b  en = 1L;..  lock
b200: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
b210: 5f 53 45 54 3b 0a 0a 20 20 2f 2a 20 41 20 50 45  _SET;..  /* A PE
b220: 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65  NDING lock is ne
b230: 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75  eded before acqu
b240: 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  iring a SHARED l
b250: 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20  ock and before. 
b260: 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e   ** acquiring an
b270: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
b280: 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44    For the SHARED
b290: 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49   lock, the PENDI
b2a0: 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20  NG will.  ** be 
b2b0: 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20  released..  */. 
b2c0: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53   if( locktype==S
b2d0: 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20  HARED_LOCK .    
b2e0: 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65 3d 3d    || (locktype==
b2f0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
b300: 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  & pFile->locktyp
b310: 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a  e<PENDING_LOCK).
b320: 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f    ){.    lock.l_
b330: 74 79 70 65 20 3d 20 28 6c 6f 63 6b 74 79 70 65  type = (locktype
b340: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f  ==SHARED_LOCK?F_
b350: 52 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a  RDLCK:F_WRLCK);.
b360: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
b370: 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
b380: 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 70  .    s = fcntl(p
b390: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
b3a0: 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66  , &lock);.    if
b3b0: 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ( s==(-1) ){.   
b3c0: 20 20 20 72 63 20 3d 20 28 65 72 72 6e 6f 3d 3d     rc = (errno==
b3d0: 45 49 4e 56 41 4c 29 20 3f 20 53 51 4c 49 54 45  EINVAL) ? SQLITE
b3e0: 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c 49 54 45 5f  _NOLFS : SQLITE_
b3f0: 42 55 53 59 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BUSY;.      goto
b400: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d   end_lock;.    }
b410: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63  .  }...  /* If c
b420: 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74  ontrol gets to t
b430: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
b440: 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61  actually go ahea
b450: 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20  d and make.  ** 
b460: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
b470: 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73   calls for the s
b480: 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20  pecified lock.. 
b490: 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
b4a0: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
b4b0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
b4c0: 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 3b 0a  Lock->cnt==0 );.
b4d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
b4e0: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30 20 29  k->locktype==0 )
b4f0: 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65  ;..    /* Now ge
b500: 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20  t the read-lock 
b510: 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  */.    lock.l_st
b520: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
b530: 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  ST;.    lock.l_l
b540: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
b550: 3b 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28  ;.    s = fcntl(
b560: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
b570: 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 0a 20 20 20 20  K, &lock);..    
b580: 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70  /* Drop the temp
b590: 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f  orary PENDING lo
b5a0: 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c  ck */.    lock.l
b5b0: 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47  _start = PENDING
b5c0: 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e  _BYTE;.    lock.
b5d0: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20  l_len = 1L;.    
b5e0: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
b5f0: 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 66  UNLCK;.    if( f
b600: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
b610: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d  _SETLK, &lock)!=
b620: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
b630: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
b640: 4f 43 4b 3b 20 20 2f 2a 20 54 68 69 73 20 73 68  OCK;  /* This sh
b650: 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65  ould never happe
b660: 6e 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20  n */.      goto 
b670: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  end_lock;.    }.
b680: 20 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20      if( s==(-1) 
b690: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 65  ){.      rc = (e
b6a0: 72 72 6e 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f 20  rrno==EINVAL) ? 
b6b0: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53  SQLITE_NOLFS : S
b6c0: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
b6d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69  }else{.      pFi
b6e0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53  le->locktype = S
b6f0: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
b700: 20 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e    pFile->pOpen->
b710: 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70  nLock++;.      p
b720: 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 31 3b 0a 20  Lock->cnt = 1;. 
b730: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
b740: 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55   locktype==EXCLU
b750: 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f  SIVE_LOCK && pLo
b760: 63 6b 2d 3e 63 6e 74 3e 31 20 29 7b 0a 20 20 20  ck->cnt>1 ){.   
b770: 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e   /* We are tryin
b780: 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  g for an exclusi
b790: 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74  ve lock but anot
b7a0: 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68  her thread in th
b7b0: 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 70  is.    ** same p
b7c0: 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
b7d0: 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64  holding a shared
b7e0: 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63   lock. */.    rc
b7f0: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
b800: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
b810: 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20  The request was 
b820: 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  for a RESERVED o
b830: 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
b840: 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20  .  It is.    ** 
b850: 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
b860: 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f  re is a SHARED o
b870: 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
b880: 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  n the file.    *
b890: 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  * already..    *
b8a0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21  /.    assert( 0!
b8b0: 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  =pFile->locktype
b8c0: 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   );.    lock.l_t
b8d0: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20  ype = F_WRLCK;. 
b8e0: 20 20 20 73 77 69 74 63 68 28 20 6c 6f 63 6b 74     switch( lockt
b8f0: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
b900: 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a  e RESERVED_LOCK:
b910: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
b920: 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44  start = RESERVED
b930: 5f 42 59 54 45 3b 0a 20 20 20 20 20 20 20 20 62  _BYTE;.        b
b940: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b950: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a   EXCLUSIVE_LOCK:
b960: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
b970: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
b980: 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  IRST;.        lo
b990: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
b9a0: 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20  D_SIZE;.        
b9b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 64 65 66  break;.      def
b9c0: 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 61 73  ault:.        as
b9d0: 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20  sert(0);.    }. 
b9e0: 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 70 46 69     s = fcntl(pFi
b9f0: 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  le->h, F_SETLK, 
ba00: 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20  &lock);.    if( 
ba10: 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  s==(-1) ){.     
ba20: 20 72 63 20 3d 20 28 65 72 72 6e 6f 3d 3d 45 49   rc = (errno==EI
ba30: 4e 56 41 4c 29 20 3f 20 53 51 4c 49 54 45 5f 4e  NVAL) ? SQLITE_N
ba40: 4f 4c 46 53 20 3a 20 53 51 4c 49 54 45 5f 42 55  OLFS : SQLITE_BU
ba50: 53 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  SY;.    }.  }.  
ba60: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
ba70: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  E_OK ){.    pFil
ba80: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  e->locktype = lo
ba90: 63 6b 74 79 70 65 3b 0a 20 20 20 20 70 4c 6f 63  cktype;.    pLoc
baa0: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  k->locktype = lo
bab0: 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c 73 65 20  cktype;.  }else 
bac0: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
bad0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
bae0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
baf0: 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ype = PENDING_LO
bb00: 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c  CK;.    pLock->l
bb10: 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e  ocktype = PENDIN
bb20: 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64  G_LOCK;.  }..end
bb30: 5f 6c 6f 63 6b 3a 0a 20 20 6c 65 61 76 65 4d 75  _lock:.  leaveMu
bb40: 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45  tex();.  OSTRACE
bb50: 34 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  4("LOCK    %d %s
bb60: 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %s\n", pFile->h
bb70: 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c  , locktypeName(l
bb80: 6f 63 6b 74 79 70 65 29 2c 20 0a 20 20 20 20 20  ocktype), .     
bb90: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
bba0: 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
bbb0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
bbc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
bbd0: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
bbe0: 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
bbf0: 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63  tor pFile to loc
bc00: 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65  ktype.  locktype
bc10: 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
bc20: 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
bc30: 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
bc40: 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
bc50: 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
bc60: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
bc70: 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
bc80: 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
bc90: 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
bca0: 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
bcb0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
bcc0: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55  static int unixU
bcd0: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
bce0: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
bcf0: 74 79 70 65 29 7b 0a 20 20 73 74 72 75 63 74 20  type){.  struct 
bd00: 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b  lockInfo *pLock;
bd10: 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
bd20: 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d  lock;.  int rc =
bd30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
bd40: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
bd50: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
bd60: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
bd70: 29 3b 0a 20 20 4f 53 54 52 41 43 45 37 28 22 55  );.  OSTRACE7("U
bd80: 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
bd90: 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25   %d(%d,%d) pid=%
bda0: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
bdb0: 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20 20  locktype,.      
bdc0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c  pFile->locktype,
bdd0: 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c   pFile->pLock->l
bde0: 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e  ocktype, pFile->
bdf0: 70 4c 6f 63 6b 2d 3e 63 6e 74 2c 20 67 65 74 70  pLock->cnt, getp
be00: 69 64 28 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  id());..  assert
be10: 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52  ( locktype<=SHAR
be20: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  ED_LOCK );.  if(
be30: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
be40: 3c 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  <=locktype ){.  
be50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
be60: 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 43 48  OK;.  }.  if( CH
be70: 45 43 4b 5f 54 48 52 45 41 44 49 44 28 70 46 69  ECK_THREADID(pFi
be80: 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  le) ){.    retur
be90: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b  n SQLITE_MISUSE;
bea0: 0a 20 20 7d 0a 20 20 65 6e 74 65 72 4d 75 74 65  .  }.  enterMute
beb0: 78 28 29 3b 0a 20 20 70 4c 6f 63 6b 20 3d 20 70  x();.  pLock = p
bec0: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 61  File->pLock;.  a
bed0: 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e  ssert( pLock->cn
bee0: 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46  t!=0 );.  if( pF
bef0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48  ile->locktype>SH
bf00: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
bf10: 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
bf20: 6c 6f 63 6b 74 79 70 65 3d 3d 70 46 69 6c 65 2d  locktype==pFile-
bf30: 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20  >locktype );.   
bf40: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53   if( locktype==S
bf50: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
bf60: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
bf70: 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20  = F_RDLCK;.     
bf80: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
bf90: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
bfa0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
bfb0: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
bfc0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
bfd0: 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20   SHARED_SIZE;.  
bfe0: 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 70 46      if( fcntl(pF
bff0: 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c  ile->h, F_SETLK,
c000: 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b   &lock)==(-1) ){
c010: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
c020: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61   should never ha
c030: 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ppen */.        
c040: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
c050: 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_RDLOCK;.      
c060: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b  }.    }.    lock
c070: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
c080: 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68  K;.    lock.l_wh
c090: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
c0a0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
c0b0: 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  t = PENDING_BYTE
c0c0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
c0d0: 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28 20   = 2L;  assert( 
c0e0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d  PENDING_BYTE+1==
c0f0: 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 29 3b  RESERVED_BYTE );
c100: 0a 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 70  .    if( fcntl(p
c110: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
c120: 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d 31 29 20 29  , &lock)!=(-1) )
c130: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c  {.      pLock->l
c140: 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44  ocktype = SHARED
c150: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
c160: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
c170: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
c180: 3b 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c  ;  /* This shoul
c190: 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a  d never happen *
c1a0: 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  /.    }.  }.  if
c1b0: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c  ( locktype==NO_L
c1c0: 4f 43 4b 20 29 7b 0a 20 20 20 20 73 74 72 75 63  OCK ){.    struc
c1d0: 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e  t openCnt *pOpen
c1e0: 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  ;..    /* Decrem
c1f0: 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20 6c  ent the shared l
c200: 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65  ock counter.  Re
c210: 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75  lease the lock u
c220: 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f  sing an.    ** O
c230: 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e  S call only when
c240: 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20   all threads in 
c250: 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73  this same proces
c260: 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a  s have released.
c270: 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e      ** the lock.
c280: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c 6f 63  .    */.    pLoc
c290: 6b 2d 3e 63 6e 74 2d 2d 3b 0a 20 20 20 20 69 66  k->cnt--;.    if
c2a0: 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20  ( pLock->cnt==0 
c2b0: 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ){.      lock.l_
c2c0: 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
c2d0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
c2e0: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
c2f0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
c300: 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  rt = lock.l_len 
c310: 3d 20 30 4c 3b 0a 20 20 20 20 20 20 69 66 28 20  = 0L;.      if( 
c320: 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  fcntl(pFile->h, 
c330: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21  F_SETLK, &lock)!
c340: 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  =(-1) ){.       
c350: 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65   pLock->locktype
c360: 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
c370: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c380: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
c390: 52 52 5f 55 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54  RR_UNLOCK;  /* T
c3a0: 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  his should never
c3b0: 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20   happen */.     
c3c0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
c3d0: 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63   Decrement the c
c3e0: 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67  ount of locks ag
c3f0: 61 69 6e 73 74 20 74 68 69 73 20 73 61 6d 65 20  ainst this same 
c400: 66 69 6c 65 2e 20 20 57 68 65 6e 20 74 68 65 0a  file.  When the.
c410: 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61      ** count rea
c420: 63 68 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65  ches zero, close
c430: 20 61 6e 79 20 6f 74 68 65 72 20 66 69 6c 65 20   any other file 
c440: 64 65 73 63 72 69 70 74 6f 72 73 20 77 68 6f 73  descriptors whos
c450: 65 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77  e close.    ** w
c460: 61 73 20 64 65 66 65 72 72 65 64 20 62 65 63 61  as deferred beca
c470: 75 73 65 20 6f 66 20 6f 75 74 73 74 61 6e 64 69  use of outstandi
c480: 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f  ng locks..    */
c490: 0a 20 20 20 20 70 4f 70 65 6e 20 3d 20 70 46 69  .    pOpen = pFi
c4a0: 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20 20 20 70  le->pOpen;.    p
c4b0: 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20  Open->nLock--;. 
c4c0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 65 6e     assert( pOpen
c4d0: 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20  ->nLock>=0 );.  
c4e0: 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f    if( pOpen->nLo
c4f0: 63 6b 3d 3d 30 20 26 26 20 70 4f 70 65 6e 2d 3e  ck==0 && pOpen->
c500: 6e 50 65 6e 64 69 6e 67 3e 30 20 29 7b 0a 20 20  nPending>0 ){.  
c510: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
c520: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 70 65   for(i=0; i<pOpe
c530: 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3b 20 69 2b 2b  n->nPending; i++
c540: 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65  ){.        close
c550: 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67  (pOpen->aPending
c560: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
c570: 20 20 20 20 66 72 65 65 28 70 4f 70 65 6e 2d 3e      free(pOpen->
c580: 61 50 65 6e 64 69 6e 67 29 3b 0a 20 20 20 20 20  aPending);.     
c590: 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67   pOpen->nPending
c5a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 70 65   = 0;.      pOpe
c5b0: 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d 20 30 3b  n->aPending = 0;
c5c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6c 65 61  .    }.  }.  lea
c5d0: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 70 46 69  veMutex();.  pFi
c5e0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c  le->locktype = l
c5f0: 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72  ocktype;.  retur
c600: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
c610: 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  lose a file..*/.
c620: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43  static int unixC
c630: 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
c640: 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69  e *id){.  unixFi
c650: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
c660: 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 66  xFile *)id;.  if
c670: 28 20 21 70 46 69 6c 65 20 29 20 72 65 74 75 72  ( !pFile ) retur
c680: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  n SQLITE_OK;.  u
c690: 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  nixUnlock(id, NO
c6a0: 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 70 46  _LOCK);.  if( pF
c6b0: 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29 20  ile->dirfd>=0 ) 
c6c0: 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72  close(pFile->dir
c6d0: 66 64 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 64 69  fd);.  pFile->di
c6e0: 72 66 64 20 3d 20 2d 31 3b 0a 20 20 65 6e 74 65  rfd = -1;.  ente
c6f0: 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 69 66 28  rMutex();..  if(
c700: 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e   pFile->pOpen->n
c710: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Lock ){.    /* I
c720: 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
c730: 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64  tanding locks, d
c740: 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63  o not actually c
c750: 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75  lose the file ju
c760: 73 74 0a 20 20 20 20 2a 2a 20 79 65 74 20 62 65  st.    ** yet be
c770: 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64  cause that would
c780: 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63   clear those loc
c790: 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64  ks.  Instead, ad
c7a0: 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  d the file.    *
c7b0: 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  * descriptor to 
c7c0: 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2e  pOpen->aPending.
c7d0: 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74    It will be aut
c7e0: 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65  omatically close
c7f0: 64 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  d when.    ** th
c800: 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63  e last lock is c
c810: 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  leared..    */. 
c820: 20 20 20 69 6e 74 20 2a 61 4e 65 77 3b 0a 20 20     int *aNew;.  
c830: 20 20 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74    struct openCnt
c840: 20 2a 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d   *pOpen = pFile-
c850: 3e 70 4f 70 65 6e 3b 0a 20 20 20 20 61 4e 65 77  >pOpen;.    aNew
c860: 20 3d 20 72 65 61 6c 6c 6f 63 28 20 70 4f 70 65   = realloc( pOpe
c870: 6e 2d 3e 61 50 65 6e 64 69 6e 67 2c 20 28 70 4f  n->aPending, (pO
c880: 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b 31 29  pen->nPending+1)
c890: 2a 73 69 7a 65 6f 66 28 69 6e 74 29 20 29 3b 0a  *sizeof(int) );.
c8a0: 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
c8b0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61  ){.      /* If a
c8c0: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2c 20 6a   malloc fails, j
c8d0: 75 73 74 20 6c 65 61 6b 20 74 68 65 20 66 69 6c  ust leak the fil
c8e0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
c8f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c900: 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67   pOpen->aPending
c910: 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 70   = aNew;.      p
c920: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 70  Open->aPending[p
c930: 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 5d 20  Open->nPending] 
c940: 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 20 20  = pFile->h;.    
c950: 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e    pOpen->nPendin
c960: 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  g++;.    }.  }el
c970: 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65  se{.    /* There
c980: 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
c990: 69 6e 67 20 6c 6f 63 6b 73 20 73 6f 20 77 65 20  ing locks so we 
c9a0: 63 61 6e 20 63 6c 6f 73 65 20 74 68 65 20 66 69  can close the fi
c9b0: 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a  le immediately *
c9c0: 2f 0a 20 20 20 20 63 6c 6f 73 65 28 70 46 69 6c  /.    close(pFil
c9d0: 65 2d 3e 68 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  e->h);.  }.  rel
c9e0: 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 46 69  easeLockInfo(pFi
c9f0: 6c 65 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 72 65  le->pLock);.  re
ca00: 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 70 46 69  leaseOpenCnt(pFi
ca10: 6c 65 2d 3e 70 4f 70 65 6e 29 3b 0a 0a 20 20 6c  le->pOpen);..  l
ca20: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 70  eaveMutex();.  p
ca30: 46 69 6c 65 2d 3e 69 73 4f 70 65 6e 20 3d 20 30  File->isOpen = 0
ca40: 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22 43 4c  ;.  OSTRACE2("CL
ca50: 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70  OSE   %-3d\n", p
ca60: 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e  File->h);.  Open
ca70: 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 6d  Counter(-1);.  m
ca80: 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20  emset(pFile, 0, 
ca90: 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
caa0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
cab0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 64 65  TE_OK;.}...#ifde
cac0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
cad0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 70  LOCKING_STYLE.#p
cae0: 72 61 67 6d 61 20 6d 61 72 6b 20 41 46 50 20 53  ragma mark AFP S
caf0: 75 70 70 6f 72 74 0a 0a 2f 2a 0a 20 2a 2a 20 54  upport../*. ** T
cb00: 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  he afpLockingCon
cb10: 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20 63  text structure c
cb20: 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66 70 20  ontains all afp 
cb30: 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20 73 74  lock specific st
cb40: 61 74 65 0a 20 2a 2f 0a 74 79 70 65 64 65 66 20  ate. */.typedef 
cb50: 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e  struct afpLockin
cb60: 67 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b  gContext afpLock
cb70: 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75  ingContext;.stru
cb80: 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  ct afpLockingCon
cb90: 74 65 78 74 20 7b 0a 20 20 75 6e 73 69 67 6e 65  text {.  unsigne
cba0: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72  d long long shar
cbb0: 65 64 4c 6f 63 6b 42 79 74 65 3b 0a 20 20 63 68  edLockByte;.  ch
cbc0: 61 72 20 2a 66 69 6c 65 50 61 74 68 3b 0a 7d 3b  ar *filePath;.};
cbd0: 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52 61 6e  ..struct ByteRan
cbe0: 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e  geLockPB2.{.  un
cbf0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
cc00: 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20   offset;        
cc10: 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72  /* offset to fir
cc20: 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20  st byte to lock 
cc30: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
cc40: 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20  ng long length; 
cc50: 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66         /* nbr of
cc60: 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
cc70: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
cc80: 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53  g long retRangeS
cc90: 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20  tart; /* nbr of 
cca0: 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20  1st byte locked 
ccb0: 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f  if successful */
ccc0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
ccd0: 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20   unLockFlag;    
cce0: 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f       /* 1 = unlo
ccf0: 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a  ck, 0 = lock */.
cd00: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
cd10: 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20  startEndFlag;   
cd20: 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20      /* 1=rel to 
cd30: 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72  end of fork, 0=r
cd40: 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20  el to start */. 
cd50: 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20   int fd;        
cd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd70: 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20     /* file desc 
cd80: 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f  to assoc this lo
cd90: 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23  ck with */.};..#
cda0: 64 65 66 69 6e 65 20 61 66 70 66 73 42 79 74 65  define afpfsByte
cdb0: 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20  RangeLock2FSCTL 
cdc0: 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27         _IOWR('z'
cdd0: 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74  , 23, struct Byt
cde0: 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a  eRangeLockPB2)..
cdf0: 2f 2a 20 72 65 74 75 72 6e 20 30 20 6f 6e 20 73  /* return 0 on s
ce00: 75 63 63 65 73 73 2c 20 31 20 6f 6e 20 66 61 69  uccess, 1 on fai
ce10: 6c 75 72 65 2e 20 20 54 6f 20 6d 61 74 63 68 20  lure.  To match 
ce20: 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  the behavior of 
ce30: 74 68 65 20 0a 20 20 6e 6f 72 6d 61 6c 20 70 6f  the .  normal po
ce40: 73 69 78 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  six file locking
ce50: 20 28 75 73 65 64 20 69 6e 20 75 6e 69 78 4c 6f   (used in unixLo
ce60: 63 6b 20 66 6f 72 20 65 78 61 6d 70 6c 65 29 2c  ck for example),
ce70: 20 77 65 20 73 68 6f 75 6c 64 20 0a 20 20 70 72   we should .  pr
ce80: 6f 76 69 64 65 20 27 72 69 63 68 65 72 27 20 72  ovide 'richer' r
ce90: 65 74 75 72 6e 20 63 6f 64 65 73 20 2d 20 73 70  eturn codes - sp
cea0: 65 63 69 66 69 63 61 6c 6c 79 20 74 6f 20 64 69  ecifically to di
ceb0: 66 66 65 72 65 6e 74 69 61 74 65 20 62 65 74 77  fferentiate betw
cec0: 65 65 6e 0a 20 20 27 66 69 6c 65 20 62 75 73 79  een.  'file busy
ced0: 27 20 61 6e 64 20 27 66 69 6c 65 20 73 79 73 74  ' and 'file syst
cee0: 65 6d 20 65 72 72 6f 72 27 20 72 65 73 75 6c 74  em error' result
cef0: 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
cf00: 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f  _AFPFSSetLock(co
cf10: 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20  nst char *path, 
cf20: 69 6e 74 20 66 64 2c 20 75 6e 73 69 67 6e 65 64  int fd, unsigned
cf30: 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65   long long offse
cf40: 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t, .            
cf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 73               uns
cf60: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
cf70: 6c 65 6e 67 74 68 2c 20 69 6e 74 20 73 65 74 4c  length, int setL
cf80: 6f 63 6b 46 6c 61 67 29 0a 7b 0a 20 20 73 74 72  ockFlag).{.  str
cf90: 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
cfa0: 6b 50 42 32 20 20 20 20 20 20 20 70 62 3b 0a 20  kPB2       pb;. 
cfb0: 20 69 6e 74 20 20 20 20 20 20 20 20 20 20 20 20   int            
cfc0: 20 20 20 20 20 20 20 20 20 65 72 72 3b 0a 20 20           err;.  
cfd0: 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67  .  pb.unLockFlag
cfe0: 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f   = setLockFlag ?
cff0: 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61   0 : 1;.  pb.sta
d000: 72 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20  rtEndFlag = 0;. 
d010: 20 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66   pb.offset = off
d020: 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68  set;.  pb.length
d030: 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62   = length; .  pb
d040: 2e 66 64 20 3d 20 66 64 3b 0a 20 20 4f 53 54 52  .fd = fd;.  OSTR
d050: 41 43 45 35 28 22 41 46 50 4c 4f 43 4b 20 73 65  ACE5("AFPLOCK se
d060: 74 74 69 6e 67 20 6c 6f 63 6b 20 25 73 20 66 6f  tting lock %s fo
d070: 72 20 25 64 20 69 6e 20 72 61 6e 67 65 20 25 6c  r %d in range %l
d080: 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20  lx:%llx\n", .   
d090: 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f   (setLockFlag?"O
d0a0: 4e 22 3a 22 4f 46 46 22 29 2c 20 66 64 2c 20 6f  N":"OFF"), fd, o
d0b0: 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29 3b 0a  ffset, length);.
d0c0: 20 20 65 72 72 20 3d 20 66 73 63 74 6c 28 70 61    err = fsctl(pa
d0d0: 74 68 2c 20 61 66 70 66 73 42 79 74 65 52 61 6e  th, afpfsByteRan
d0e0: 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70  geLock2FSCTL, &p
d0f0: 62 2c 20 30 29 3b 0a 20 20 69 66 20 28 20 65 72  b, 0);.  if ( er
d100: 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 4f 53  r==-1 ) {.    OS
d110: 54 52 41 43 45 34 28 22 41 46 50 4c 4f 43 4b 20  TRACE4("AFPLOCK 
d120: 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74 6c 28  failed to fsctl(
d130: 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e 22 2c  ) '%s' %d %s\n",
d140: 20 70 61 74 68 2c 20 65 72 72 6e 6f 2c 20 0a 20   path, errno, . 
d150: 20 20 20 20 20 73 74 72 65 72 72 6f 72 28 65 72       strerror(er
d160: 72 6e 6f 29 29 3b 0a 20 20 20 20 72 65 74 75 72  rno));.    retur
d170: 6e 20 31 3b 20 2f 2a 20 65 72 72 6f 72 20 2a 2f  n 1; /* error */
d180: 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
d190: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a  return 0;.  }.}.
d1a0: 0a 2f 2a 0a 20 2a 2a 20 54 68 69 73 20 72 6f 75  ./*. ** This rou
d1b0: 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
d1c0: 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
d1d0: 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
d1e0: 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 20 2a  the specified. *
d1f0: 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
d200: 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
d210: 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
d220: 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 72 65 74  ock is held, ret
d230: 75 72 6e 0a 20 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  urn. ** non-zero
d240: 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  .  If the file i
d250: 73 20 75 6e 6c 6f 63 6b 65 64 20 6f 72 20 68 6f  s unlocked or ho
d260: 6c 64 73 20 6f 6e 6c 79 20 53 48 41 52 45 44 20  lds only SHARED 
d270: 6c 6f 63 6b 73 2c 20 74 68 65 6e 0a 20 2a 2a 20  locks, then. ** 
d280: 72 65 74 75 72 6e 20 7a 65 72 6f 2e 0a 20 2a 2f  return zero.. */
d290: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 55  .static int afpU
d2a0: 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
d2b0: 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 29  Lock(OsFile *id)
d2c0: 7b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20  {.  int r = 0;. 
d2d0: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
d2e0: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
d2f0: 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
d300: 46 69 6c 65 20 29 3b 20 0a 20 20 61 66 70 4c 6f  File ); .  afpLo
d310: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
d320: 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b  ntext = (afpLock
d330: 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
d340: 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
d350: 65 78 74 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65  ext;.  .  /* Che
d360: 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
d370: 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
d380: 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
d390: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
d3a0: 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44  >locktype>SHARED
d3b0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 20 3d  _LOCK ){.    r =
d3c0: 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20   1;.  }.  .  /* 
d3d0: 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
d3e0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
d3f0: 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20  ess holds it..  
d400: 20 2a 2f 0a 20 20 69 66 20 28 20 21 72 20 29 20   */.  if ( !r ) 
d410: 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68  {.    /* lock th
d420: 65 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e  e byte */.    in
d430: 74 20 66 61 69 6c 65 64 20 3d 20 5f 41 46 50 46  t failed = _AFPF
d440: 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  SSetLock(context
d450: 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c  ->filePath, pFil
d460: 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42  e->h, RESERVED_B
d470: 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20  YTE, 1,1);  .   
d480: 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20   if (failed) {. 
d490: 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66 61       /* if we fa
d4a0: 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65 20  iled to get the 
d4b0: 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e  lock then someon
d4c0: 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76 65  e else must have
d4d0: 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 20 3d   it */.      r =
d4e0: 20 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b   1;.    } else {
d4f0: 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20  .      /* if we 
d500: 73 75 63 63 65 65 64 65 64 20 69 6e 20 74 61 6b  succeeded in tak
d510: 69 6e 67 20 74 68 65 20 72 65 73 65 72 76 65 64  ing the reserved
d520: 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74   lock, unlock it
d530: 20 74 6f 20 72 65 73 74 6f 72 65 0a 20 20 20 20   to restore.    
d540: 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61    ** the origina
d550: 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 20  l state */.     
d560: 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63   _AFPFSSetLock(c
d570: 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68  ontext->filePath
d580: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45  , pFile->h, RESE
d590: 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29  RVED_BYTE, 1, 0)
d5a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53  ;.    }.  }.  OS
d5b0: 54 52 41 43 45 33 28 22 54 45 53 54 20 57 52 2d  TRACE3("TEST WR-
d5c0: 4c 4f 43 4b 20 25 64 20 25 64 5c 6e 22 2c 20 70  LOCK %d %d\n", p
d5d0: 46 69 6c 65 2d 3e 68 2c 20 72 29 3b 0a 20 20 0a  File->h, r);.  .
d5e0: 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f    return r;.}../
d5f0: 2a 20 41 46 50 2d 73 74 79 6c 65 20 6c 6f 63 6b  * AFP-style lock
d600: 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ing following th
d610: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 75 6e  e behavior of un
d620: 69 78 4c 6f 63 6b 2c 20 73 65 65 20 74 68 65 20  ixLock, see the 
d630: 75 6e 69 78 4c 6f 63 6b 20 0a 2a 2a 20 66 75 6e  unixLock .** fun
d640: 63 74 69 6f 6e 20 63 6f 6d 6d 65 6e 74 73 20 66  ction comments f
d650: 6f 72 20 64 65 74 61 69 6c 73 20 6f 66 20 6c 6f  or details of lo
d660: 63 6b 20 6d 61 6e 61 67 65 6d 65 6e 74 2e 20 2a  ck management. *
d670: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
d680: 55 6e 69 78 4c 6f 63 6b 28 4f 73 46 69 6c 65 20  UnixLock(OsFile 
d690: 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
d6a0: 65 29 0a 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  e).{.  int rc = 
d6b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
d6c0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
d6d0: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
d6e0: 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
d6f0: 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66  t *context = (af
d700: 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
d710: 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  *) pFile->lockin
d720: 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20  gContext;.  int 
d730: 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d  gotPendingLock =
d740: 20 30 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   0;.  .  assert(
d750: 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
d760: 41 43 45 35 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE5("LOCK    %d
d770: 20 25 73 20 77 61 73 20 25 73 20 70 69 64 3d 25   %s was %s pid=%
d780: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  d\n", pFile->h,.
d790: 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70           locktyp
d7a0: 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c  eName(locktype),
d7b0: 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46   locktypeName(pF
d7c0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20  ile->locktype), 
d7d0: 67 65 74 70 69 64 28 29 29 3b 20 20 0a 20 20 2f  getpid());  .  /
d7e0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
d7f0: 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
d800: 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
d810: 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
d820: 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 73 46 69   the.    ** OsFi
d830: 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
d840: 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 61 66  Don't use the af
d850: 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74  p_end_lock: exit
d860: 20 70 61 74 68 2c 20 61 73 0a 20 20 20 20 2a 2a   path, as.    **
d870: 20 65 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61   enterMutex() ha
d880: 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64  sn't been called
d890: 20 79 65 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 69   yet..    */.  i
d8a0: 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
d8b0: 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe>=locktype ){.
d8c0: 20 20 20 20 4f 53 54 52 41 43 45 33 28 22 4c 4f      OSTRACE3("LO
d8d0: 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28  CK    %d %s ok (
d8e0: 61 6c 72 65 61 64 79 20 68 65 6c 64 29 5c 6e 22  already held)\n"
d8f0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
d900: 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e         locktypeN
d910: 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  ame(locktype));.
d920: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d930: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
d940: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f  Make sure the lo
d950: 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  cking sequence i
d960: 73 20 63 6f 72 72 65 63 74 0a 20 20 20 20 2a 2f  s correct.    */
d970: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
d980: 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c  ->locktype!=NO_L
d990: 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d  OCK || locktype=
d9a0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
d9b0: 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
d9c0: 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  pe!=PENDING_LOCK
d9d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
d9e0: 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45 44  cktype!=RESERVED
d9f0: 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e  _LOCK || pFile->
da00: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
da10: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
da20: 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e   This mutex is n
da30: 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46  eeded because pF
da40: 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68  ile->pLock is sh
da50: 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
da60: 61 64 73 0a 20 20 20 20 2a 2f 0a 20 20 65 6e 74  ads.    */.  ent
da70: 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a  erMutex();..  /*
da80: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
da90: 75 72 72 65 6e 74 20 74 68 72 65 61 64 20 6f 77  urrent thread ow
daa0: 6e 73 20 74 68 65 20 70 46 69 6c 65 2e 0a 20 20  ns the pFile..  
dab0: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61 6e    */.  rc = tran
dac0: 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 70 46  sferOwnership(pF
dad0: 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ile);.  if( rc!=
dae0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
daf0: 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20   leaveMutex();. 
db00: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
db10: 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45  }.    .  /* A PE
db20: 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65  NDING lock is ne
db30: 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75  eded before acqu
db40: 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  iring a SHARED l
db50: 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20  ock and before. 
db60: 20 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20     ** acquiring 
db70: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
db80: 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52  k.  For the SHAR
db90: 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e  ED lock, the PEN
dba0: 44 49 4e 47 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  DING will.    **
dbb0: 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20   be released..  
dbc0: 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
dbd0: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
dbe0: 20 0a 20 20 20 20 20 20 7c 7c 20 28 6c 6f 63 6b   .      || (lock
dbf0: 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
dc00: 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c  LOCK && pFile->l
dc10: 6f 63 6b 74 79 70 65 3c 50 45 4e 44 49 4e 47 5f  ocktype<PENDING_
dc20: 4c 4f 43 4b 29 0a 20 20 20 20 20 20 29 7b 0a 20  LOCK).      ){. 
dc30: 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20     int failed = 
dc40: 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f  _AFPFSSetLock(co
dc50: 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c  ntext->filePath,
dc60: 20 70 46 69 6c 65 2d 3e 68 2c 20 0a 20 20 20 20   pFile->h, .    
dc70: 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20    PENDING_BYTE, 
dc80: 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 20 28 66  1, 1);.    if (f
dc90: 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 72  ailed) {.      r
dca0: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
dcb0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  .      goto afp_
dcc0: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  end_lock;.    }.
dcd0: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63    }.  .  /* If c
dce0: 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74  ontrol gets to t
dcf0: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
dd00: 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61  actually go ahea
dd10: 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 20 20 2a  d and make.    *
dd20: 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
dd30: 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65  em calls for the
dd40: 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e   specified lock.
dd50: 0a 20 20 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  .    */.  if( lo
dd60: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
dd70: 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c  OCK ){.    int l
dd80: 6b 2c 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 69  k, failed;.    i
dd90: 6e 74 20 74 72 69 65 73 20 3d 20 30 3b 0a 20 20  nt tries = 0;.  
dda0: 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65    .    /* Now ge
ddb0: 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20  t the read-lock 
ddc0: 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74  */.    /* note t
ddd0: 68 61 74 20 74 68 65 20 71 75 61 6c 69 74 79 20  hat the quality 
dde0: 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73  of the randomnes
ddf0: 73 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  s doesn't matter
de00: 20 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20   that much */.  
de10: 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b    lk = random();
de20: 20 0a 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 73   .    context->s
de30: 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20  haredLockByte = 
de40: 28 6c 6b 20 26 20 30 78 37 66 66 66 66 66 66 66  (lk & 0x7fffffff
de50: 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d  )%(SHARED_SIZE -
de60: 20 31 29 3b 0a 20 20 20 20 66 61 69 6c 65 64 20   1);.    failed 
de70: 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28  = _AFPFSSetLock(
de80: 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74  context->filePat
de90: 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 0a 20 20  h, pFile->h, .  
dea0: 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54      SHARED_FIRST
deb0: 2b 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64  +context->shared
dec0: 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b  LockByte, 1, 1);
ded0: 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 44 72 6f  .    .    /* Dro
dee0: 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  p the temporary 
def0: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a  PENDING lock */.
df00: 20 20 20 20 69 66 20 28 5f 41 46 50 46 53 53 65      if (_AFPFSSe
df10: 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66  tLock(context->f
df20: 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e  ilePath, pFile->
df30: 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  h, PENDING_BYTE,
df40: 20 31 2c 20 30 29 29 20 7b 0a 20 20 20 20 20 20   1, 0)) {.      
df50: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
df60: 52 5f 55 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54 68  R_UNLOCK;  /* Th
df70: 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  is should never 
df80: 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20  happen */.      
df90: 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
dfa0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20  k;.    }.    .  
dfb0: 20 20 69 66 28 20 66 61 69 6c 65 64 20 29 7b 0a    if( failed ){.
dfc0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
dfd0: 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c  E_BUSY;.    } el
dfe0: 73 65 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  se {.      pFile
dff0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41  ->locktype = SHA
e000: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  RED_LOCK;.    }.
e010: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
e020: 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20  The request was 
e030: 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  for a RESERVED o
e040: 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
e050: 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20  .  It is.    ** 
e060: 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
e070: 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f  re is a SHARED o
e080: 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
e090: 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  n the file.    *
e0a0: 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  * already..    *
e0b0: 2f 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64  /.    int failed
e0c0: 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
e0d0: 28 20 30 21 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ( 0!=pFile->lock
e0e0: 74 79 70 65 20 29 3b 0a 20 20 20 20 69 66 20 28  type );.    if (
e0f0: 6c 6f 63 6b 74 79 70 65 20 3e 3d 20 52 45 53 45  locktype >= RESE
e100: 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69  RVED_LOCK && pFi
e110: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3c 20 52  le->locktype < R
e120: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a  ESERVED_LOCK) {.
e130: 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69          /* Acqui
e140: 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  re a RESERVED lo
e150: 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61  ck */.        fa
e160: 69 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74  iled = _AFPFSSet
e170: 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69  Lock(context->fi
e180: 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68  lePath, pFile->h
e190: 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
e1a0: 20 31 2c 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20   1,1);.    }.   
e1b0: 20 69 66 20 28 21 66 61 69 6c 65 64 20 26 26 20   if (!failed && 
e1c0: 6c 6f 63 6b 74 79 70 65 20 3d 3d 20 45 58 43 4c  locktype == EXCL
e1d0: 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20  USIVE_LOCK) {.  
e1e0: 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61      /* Acquire a
e1f0: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
e200: 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20 20 20   */.        .   
e210: 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
e220: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 62 65 66   shared lock bef
e230: 6f 72 65 20 74 72 79 69 6e 67 20 74 68 65 20 72  ore trying the r
e240: 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65  ange.  we'll nee
e250: 64 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72  d to .      ** r
e260: 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73  eestablish the s
e270: 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 77 65  hared lock if we
e280: 20 63 61 6e 27 74 20 67 65 74 20 74 68 65 20 20   can't get the  
e290: 61 66 70 55 6e 69 78 55 6e 6c 6f 63 6b 0a 20 20  afpUnixUnlock.  
e2a0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 20      */.      if 
e2b0: 28 21 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28  (!_AFPFSSetLock(
e2c0: 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74  context->filePat
e2d0: 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  h, pFile->h, SHA
e2e0: 52 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20 20  RED_FIRST +.    
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e300: 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 73 68       context->sh
e310: 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c  aredLockByte, 1,
e320: 20 30 29 29 20 7b 0a 20 20 20 20 20 20 20 20 2f   0)) {.        /
e330: 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74  * now attemmpt t
e340: 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c 75 73  o get the exclus
e350: 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a  ive lock range *
e360: 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64  /.        failed
e370: 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b   = _AFPFSSetLock
e380: 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61  (context->filePa
e390: 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 53 48  th, pFile->h, SH
e3a0: 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20  ARED_FIRST, .   
e3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3c0: 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52              SHAR
e3d0: 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20  ED_SIZE, 1);.   
e3e0: 20 20 20 20 20 69 66 20 28 66 61 69 6c 65 64 20       if (failed 
e3f0: 26 26 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b  && _AFPFSSetLock
e400: 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61  (context->filePa
e410: 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 53 48  th, pFile->h, SH
e420: 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20  ARED_FIRST +.   
e430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e450: 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64   context->shared
e460: 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 29  LockByte, 1, 1))
e470: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   {.          rc 
e480: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  = SQLITE_IOERR_R
e490: 44 4c 4f 43 4b 3b 20 2f 2a 20 74 68 69 73 20 73  DLOCK; /* this s
e4a0: 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70  hould never happ
e4b0: 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  en */.        }.
e4c0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
e4d0: 20 20 20 20 20 20 20 2f 2a 20 2a 2f 0a 20 20 20         /* */.   
e4e0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
e4f0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 2f  _IOERR_UNLOCK; /
e500: 2a 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 65  * this should ne
e510: 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20  ver happen */.  
e520: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
e530: 69 66 28 20 66 61 69 6c 65 64 20 26 26 20 72 63  if( failed && rc
e540: 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a   == SQLITE_OK){.
e550: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
e560: 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20  E_BUSY;.    }.  
e570: 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53  }.  .  if( rc==S
e580: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e590: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
e5a0: 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 65  = locktype;.  }e
e5b0: 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  lse if( locktype
e5c0: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
e5d0: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
e5e0: 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e  ocktype = PENDIN
e5f0: 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61  G_LOCK;.  }.  .a
e600: 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 20  fp_end_lock:.   
e610: 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20   leaveMutex();. 
e620: 20 4f 53 54 52 41 43 45 34 28 22 4c 4f 43 4b 20   OSTRACE4("LOCK 
e630: 20 20 20 25 64 20 25 73 20 25 73 5c 6e 22 2c 20     %d %s %s\n", 
e640: 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79  pFile->h, lockty
e650: 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29  peName(locktype)
e660: 2c 20 0a 20 20 20 20 20 20 20 20 20 72 63 3d 3d  , .         rc==
e670: 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
e680: 20 3a 20 22 66 61 69 6c 65 64 22 29 3b 0a 20 20   : "failed");.  
e690: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
e6a0: 0a 20 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  . ** Lower the l
e6b0: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
e6c0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
e6d0: 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70  pFile to locktyp
e6e0: 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 20 2a 2a  e.  locktype. **
e6f0: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
e700: 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
e710: 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20  D_LOCK.. **. ** 
e720: 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
e730: 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
e740: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
e750: 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
e760: 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65 71 75 65  ow. ** the reque
e770: 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
e780: 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
e790: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f   is a no-op.. */
e7a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 55  .static int afpU
e7b0: 6e 69 78 55 6e 6c 6f 63 6b 28 4f 73 46 69 6c 65  nixUnlock(OsFile
e7c0: 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
e7d0: 70 65 29 20 7b 0a 20 20 73 74 72 75 63 74 20 66  pe) {.  struct f
e7e0: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74  lock lock;.  int
e7f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e800: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
e810: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
e820: 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67  id;.  afpLocking
e830: 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
e840: 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
e850: 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e  ntext *) pFile->
e860: 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
e870: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
e880: 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22   );.  OSTRACE5("
e890: 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
e8a0: 73 20 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c 20  s %d pid=%d\n", 
e8b0: 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79  pFile->h, lockty
e8c0: 70 65 2c 0a 20 20 20 20 20 20 20 20 20 70 46 69  pe,.         pFi
e8d0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 67 65  le->locktype, ge
e8e0: 74 70 69 64 28 29 29 3b 0a 20 20 0a 20 20 61 73  tpid());.  .  as
e8f0: 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d  sert( locktype<=
e900: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
e910: 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
e920: 74 79 70 65 3c 3d 6c 6f 63 6b 74 79 70 65 20 29  type<=locktype )
e930: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
e940: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
e950: 28 20 43 48 45 43 4b 5f 54 48 52 45 41 44 49 44  ( CHECK_THREADID
e960: 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 72  (pFile) ){.    r
e970: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
e980: 55 53 45 3b 0a 20 20 7d 0a 20 20 65 6e 74 65 72  USE;.  }.  enter
e990: 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 70  Mutex();.  if( p
e9a0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53  File->locktype>S
e9b0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
e9c0: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
e9d0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
e9e0: 20 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20       int failed 
e9f0: 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 75  = 0;..      /* u
ea00: 6e 6c 6f 63 6b 20 74 68 65 20 65 78 63 6c 75 73  nlock the exclus
ea10: 69 76 65 20 72 61 6e 67 65 20 2d 20 74 68 65 6e  ive range - then
ea20: 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20 74 68   re-establish th
ea30: 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f  e shared lock */
ea40: 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65  .      if (pFile
ea50: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c  ->locktype==EXCL
ea60: 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20  USIVE_LOCK) {.  
ea70: 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 5f        failed = _
ea80: 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e  AFPFSSetLock(con
ea90: 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20  text->filePath, 
eaa0: 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
eab0: 5f 46 49 52 53 54 2c 20 0a 20 20 20 20 20 20 20  _FIRST, .       
eac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ead0: 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
eae0: 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20  _SIZE, 0);.     
eaf0: 20 20 20 69 66 20 28 21 66 61 69 6c 65 64 29 20     if (!failed) 
eb00: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  {.          /* s
eb10: 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 6d 6f  uccessfully remo
eb20: 76 65 64 20 74 68 65 20 65 78 63 6c 75 73 69 76  ved the exclusiv
eb30: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  e lock */.      
eb40: 20 20 20 20 69 66 20 28 5f 41 46 50 46 53 53 65      if (_AFPFSSe
eb50: 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66  tLock(context->f
eb60: 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e  ilePath, pFile->
eb70: 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b  h, SHARED_FIRST+
eb80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
eb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
eba0: 74 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  text->sharedLock
ebb0: 42 79 74 65 2c 20 31 2c 20 31 29 29 20 7b 0a 20  Byte, 1, 1)) {. 
ebc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 61             /* fa
ebd0: 69 6c 65 64 20 74 6f 20 72 65 2d 65 73 74 61 62  iled to re-estab
ebe0: 6c 69 73 68 20 6f 75 72 20 73 68 61 72 65 64 20  lish our shared 
ebf0: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
ec00: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
ec10: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b 20 2f 2a  IOERR_RDLOCK; /*
ec20: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76   This should nev
ec30: 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20  er happen */.   
ec40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ec50: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
ec60: 20 20 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75      /* This shou
ec70: 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20  ld never happen 
ec80: 2d 20 66 61 69 6c 65 64 20 74 6f 20 75 6e 6c 6f  - failed to unlo
ec90: 63 6b 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  ck the exclusive
eca0: 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20   range */.      
ecb0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
ecc0: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  IOERR_UNLOCK;.  
ecd0: 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d        } .      }
ece0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72  .    }.    if (r
ecf0: 63 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 26  c == SQLITE_OK &
ed00: 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  & pFile->locktyp
ed10: 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29  e>=PENDING_LOCK)
ed20: 20 7b 0a 20 20 20 20 20 20 69 66 20 28 5f 41 46   {.      if (_AF
ed30: 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  PFSSetLock(conte
ed40: 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46  xt->filePath, pF
ed50: 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f  ile->h, PENDING_
ed60: 42 59 54 45 2c 20 31 2c 20 30 29 29 7b 0a 20 20  BYTE, 1, 0)){.  
ed70: 20 20 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20        /* failed 
ed80: 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20 70  to release the p
ed90: 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20  ending lock */. 
eda0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
edb0: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
edc0: 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20   /* This should 
edd0: 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a  never happen */.
ede0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 0a 20        }.    } . 
edf0: 20 20 20 69 66 20 28 72 63 20 3d 3d 20 53 51 4c     if (rc == SQL
ee00: 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d  ITE_OK && pFile-
ee10: 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52  >locktype>=RESER
ee20: 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  VED_LOCK) {.    
ee30: 20 20 69 66 20 28 5f 41 46 50 46 53 53 65 74 4c    if (_AFPFSSetL
ee40: 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c  ock(context->fil
ee50: 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c  ePath, pFile->h,
ee60: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
ee70: 31 2c 20 30 29 29 20 7b 0a 20 20 20 20 20 20 20  1, 0)) {.       
ee80: 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 72 65   /* failed to re
ee90: 6c 65 61 73 65 20 74 68 65 20 72 65 73 65 72 76  lease the reserv
eea0: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  ed lock */.     
eeb0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
eec0: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 20 2f 2a  OERR_UNLOCK;  /*
eed0: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76   This should nev
eee0: 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20  er happen */.   
eef0: 20 20 20 7d 0a 20 20 20 20 7d 20 0a 20 20 7d 0a     }.    } .  }.
ef00: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
ef10: 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69  NO_LOCK ){.    i
ef20: 6e 74 20 66 61 69 6c 65 64 20 3d 20 5f 41 46 50  nt failed = _AFP
ef30: 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  FSSetLock(contex
ef40: 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69  t->filePath, pFi
ef50: 6c 65 2d 3e 68 2c 20 0a 20 20 20 20 20 20 20 20  le->h, .        
ef60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef70: 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49         SHARED_FI
ef80: 52 53 54 20 2b 20 63 6f 6e 74 65 78 74 2d 3e 73  RST + context->s
ef90: 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31  haredLockByte, 1
efa0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 20 28 66 61  , 0);.    if (fa
efb0: 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 72 63  iled) {.      rc
efc0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
efd0: 55 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54 68 69 73  UNLOCK;  /* This
efe0: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61   should never ha
eff0: 70 70 65 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  ppen */.    }.  
f000: 7d 0a 20 20 69 66 20 28 72 63 20 3d 3d 20 53 51  }.  if (rc == SQ
f010: 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 20 70 46 69  LITE_OK).    pFi
f020: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c  le->locktype = l
f030: 6f 63 6b 74 79 70 65 3b 0a 20 20 6c 65 61 76 65  ocktype;.  leave
f040: 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
f050: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20  n rc;.}../*. ** 
f060: 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 26 20 63  Close a file & c
f070: 6c 65 61 6e 75 70 20 41 46 50 20 73 70 65 63 69  leanup AFP speci
f080: 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  fic locking cont
f090: 65 78 74 20 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ext . */.static 
f0a0: 69 6e 74 20 61 66 70 55 6e 69 78 43 6c 6f 73 65  int afpUnixClose
f0b0: 28 4f 73 46 69 6c 65 20 2a 2a 70 49 64 29 20 7b  (OsFile **pId) {
f0c0: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 69 64 20  .  unixFile *id 
f0d0: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 2a 70 49  = (unixFile*)*pI
f0e0: 64 3b 0a 20 20 0a 20 20 69 66 28 20 21 69 64 20  d;.  .  if( !id 
f0f0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
f100: 4f 4b 3b 0a 20 20 61 66 70 55 6e 69 78 55 6e 6c  OK;.  afpUnixUnl
f110: 6f 63 6b 28 2a 70 49 64 2c 20 4e 4f 5f 4c 4f 43  ock(*pId, NO_LOC
f120: 4b 29 3b 0a 20 20 2f 2a 20 66 72 65 65 20 74 68  K);.  /* free th
f130: 65 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 73 74  e AFP locking st
f140: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 66 20  ructure */.  if 
f150: 28 69 64 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  (id->lockingCont
f160: 65 78 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 20  ext != NULL) {. 
f170: 20 20 20 69 66 20 28 28 28 61 66 70 4c 6f 63 6b     if (((afpLock
f180: 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 69 64 2d  ingContext *)id-
f190: 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
f1a0: 2d 3e 66 69 6c 65 50 61 74 68 20 21 3d 20 4e 55  ->filePath != NU
f1b0: 4c 4c 29 0a 20 20 20 20 20 20 73 71 6c 69 74 65  LL).      sqlite
f1c0: 33 5f 66 72 65 65 28 28 28 61 66 70 4c 6f 63 6b  3_free(((afpLock
f1d0: 69 6e 67 43 6f 6e 74 65 78 74 2a 29 69 64 2d 3e  ingContext*)id->
f1e0: 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d  lockingContext)-
f1f0: 3e 66 69 6c 65 50 61 74 68 29 3b 0a 20 20 20 20  >filePath);.    
f200: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 69 64 2d  sqlite3_free(id-
f210: 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
f220: 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 69  ;.  }.  .  if( i
f230: 64 2d 3e 64 69 72 66 64 3e 3d 30 20 29 20 63 6c  d->dirfd>=0 ) cl
f240: 6f 73 65 28 69 64 2d 3e 64 69 72 66 64 29 3b 0a  ose(id->dirfd);.
f250: 20 20 69 64 2d 3e 64 69 72 66 64 20 3d 20 2d 31    id->dirfd = -1
f260: 3b 0a 20 20 63 6c 6f 73 65 28 69 64 2d 3e 68 29  ;.  close(id->h)
f270: 3b 0a 20 20 69 64 2d 3e 69 73 4f 70 65 6e 20 3d  ;.  id->isOpen =
f280: 20 30 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22   0;.  OSTRACE2("
f290: 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c  CLOSE   %-3d\n",
f2a0: 20 69 64 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e 43   id->h);.  OpenC
f2b0: 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71  ounter(-1);.  sq
f2c0: 6c 69 74 65 33 5f 66 72 65 65 28 69 64 29 3b 0a  lite3_free(id);.
f2d0: 20 20 2a 70 49 64 20 3d 20 30 3b 0a 20 20 72 65    *pId = 0;.  re
f2e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f2f0: 7d 0a 0a 0a 23 70 72 61 67 6d 61 20 6d 61 72 6b  }...#pragma mark
f300: 20 66 6c 6f 63 6b 28 29 20 73 74 79 6c 65 20 6c   flock() style l
f310: 6f 63 6b 69 6e 67 0a 0a 2f 2a 0a 20 2a 2a 20 54  ocking../*. ** T
f320: 68 65 20 66 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43  he flockLockingC
f330: 6f 6e 74 65 78 74 20 69 73 20 6e 6f 74 20 75 73  ontext is not us
f340: 65 64 0a 20 2a 2f 0a 74 79 70 65 64 65 66 20 76  ed. */.typedef v
f350: 6f 69 64 20 66 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  oid flockLocking
f360: 43 6f 6e 74 65 78 74 3b 0a 0a 73 74 61 74 69 63  Context;..static
f370: 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 69 78 43 68   int flockUnixCh
f380: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
f390: 4f 73 46 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  OsFile *id) {.  
f3a0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
f3b0: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
f3c0: 0a 20 20 0a 20 20 69 66 20 28 70 46 69 6c 65 2d  .  .  if (pFile-
f3d0: 3e 6c 6f 63 6b 74 79 70 65 20 3d 3d 20 52 45 53  >locktype == RES
f3e0: 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  ERVED_LOCK) {.  
f3f0: 20 20 72 65 74 75 72 6e 20 31 3b 20 2f 2a 20 61    return 1; /* a
f400: 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 72 65  lready have a re
f410: 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20  served lock */. 
f420: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a   } else {.    /*
f430: 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74 20   attempt to get 
f440: 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  the lock */.    
f450: 69 6e 74 20 72 63 20 3d 20 66 6c 6f 63 6b 28 70  int rc = flock(p
f460: 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58  File->h, LOCK_EX
f470: 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20   | LOCK_NB);.   
f480: 20 69 66 20 28 21 72 63 29 20 7b 0a 20 20 20 20   if (!rc) {.    
f490: 20 20 2f 2a 20 67 6f 74 20 74 68 65 20 6c 6f 63    /* got the loc
f4a0: 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a  k, unlock it */.
f4b0: 20 20 20 20 20 20 66 6c 6f 63 6b 28 70 46 69 6c        flock(pFil
f4c0: 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a  e->h, LOCK_UN);.
f4d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
f4e0: 20 2f 2a 20 6e 6f 20 6f 6e 65 20 68 61 73 20 69   /* no one has i
f4f0: 74 20 72 65 73 65 72 76 65 64 20 2a 2f 0a 20 20  t reserved */.  
f500: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 31    }.    return 1
f510: 3b 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73  ; /* someone els
f520: 65 20 6d 69 67 68 74 20 68 61 76 65 20 69 74 20  e might have it 
f530: 72 65 73 65 72 76 65 64 20 2a 2f 0a 20 20 7d 0a  reserved */.  }.
f540: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  }..static int fl
f550: 6f 63 6b 55 6e 69 78 4c 6f 63 6b 28 4f 73 46 69  ockUnixLock(OsFi
f560: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
f570: 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69  type) {.  unixFi
f580: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
f590: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20  xFile*)id;.  .  
f5a0: 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79  /* if we already
f5b0: 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74   have a lock, it
f5c0: 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20   is exclusive.  
f5d0: 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73  .  ** Just adjus
f5e0: 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74  t level and punt
f5f0: 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20   on outta here. 
f600: 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  */.  if (pFile->
f610: 6c 6f 63 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f  locktype > NO_LO
f620: 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
f630: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b  >locktype = lock
f640: 74 79 70 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  type;.    return
f650: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
f660: 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20    .  /* grab an 
f670: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a  exclusive lock *
f680: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 66 6c 6f  /.  int rc = flo
f690: 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
f6a0: 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b  K_EX | LOCK_NB);
f6b0: 0a 20 20 69 66 20 28 72 63 29 20 7b 0a 20 20 20  .  if (rc) {.   
f6c0: 20 2f 2a 20 64 69 64 6e 27 74 20 67 65 74 2c 20   /* didn't get, 
f6d0: 6d 75 73 74 20 62 65 20 62 75 73 79 20 2a 2f 0a  must be busy */.
f6e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f6f0: 45 5f 42 55 53 59 3b 0a 20 20 7d 20 65 6c 73 65  E_BUSY;.  } else
f700: 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69 74   {.    /* got it
f710: 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61  , set the type a
f720: 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a  nd return ok */.
f730: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
f740: 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
f750: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f760: 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  E_OK;.  }.}..sta
f770: 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 69  tic int flockUni
f780: 78 55 6e 6c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a  xUnlock(OsFile *
f790: 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
f7a0: 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
f7b0: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
f7c0: 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65  e*)id;.  .  asse
f7d0: 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48  rt( locktype<=SH
f7e0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a  ARED_LOCK );.  .
f7f0: 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f    /* no-op if po
f800: 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20  ssible */.  if( 
f810: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
f820: 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20  =locktype ){.   
f830: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
f840: 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73  K;.  }.  .  /* s
f850: 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62  hared can just b
f860: 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65  e set because we
f870: 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20   always have an 
f880: 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69  exclusive */.  i
f890: 66 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f (locktype==SHA
f8a0: 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  RED_LOCK) {.    
f8b0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
f8c0: 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  = locktype;.    
f8d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f8e0: 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f  ;.  }.  .  /* no
f8f0: 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b  , really, unlock
f900: 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  . */.  int rc = 
f910: 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
f920: 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 69 66 20 28  LOCK_UN);.  if (
f930: 72 63 29 0a 20 20 20 20 72 65 74 75 72 6e 20 53  rc).    return S
f940: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
f950: 43 4b 3b 0a 20 20 65 6c 73 65 20 7b 0a 20 20 20  CK;.  else {.   
f960: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
f970: 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
f980: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f990: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20  ;.  }.}../*. ** 
f9a0: 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a  Close a file.. *
f9b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
f9c0: 63 6b 55 6e 69 78 43 6c 6f 73 65 28 4f 73 46 69  ckUnixClose(OsFi
f9d0: 6c 65 20 2a 2a 70 49 64 29 20 7b 0a 20 20 75 6e  le **pId) {.  un
f9e0: 69 78 46 69 6c 65 20 2a 69 64 20 3d 20 28 75 6e  ixFile *id = (un
f9f0: 69 78 46 69 6c 65 2a 29 2a 70 49 64 3b 0a 20 20  ixFile*)*pId;.  
fa00: 0a 20 20 69 66 28 20 21 69 64 20 29 20 72 65 74  .  if( !id ) ret
fa10: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
fa20: 20 66 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b   flockUnixUnlock
fa30: 28 2a 70 49 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  (*pId, NO_LOCK);
fa40: 0a 20 20 0a 20 20 69 66 28 20 69 64 2d 3e 64 69  .  .  if( id->di
fa50: 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28 69  rfd>=0 ) close(i
fa60: 64 2d 3e 64 69 72 66 64 29 3b 0a 20 20 69 64 2d  d->dirfd);.  id-
fa70: 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 65  >dirfd = -1;.  e
fa80: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 0a  nterMutex();.  .
fa90: 20 20 63 6c 6f 73 65 28 69 64 2d 3e 68 29 3b 20    close(id->h); 
faa0: 20 0a 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29   .  leaveMutex()
fab0: 3b 0a 20 20 69 64 2d 3e 69 73 4f 70 65 6e 20 3d  ;.  id->isOpen =
fac0: 20 30 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22   0;.  OSTRACE2("
fad0: 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c  CLOSE   %-3d\n",
fae0: 20 69 64 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e 43   id->h);.  OpenC
faf0: 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71  ounter(-1);.  sq
fb00: 6c 69 74 65 33 5f 66 72 65 65 28 69 64 29 3b 0a  lite3_free(id);.
fb10: 20 20 2a 70 49 64 20 3d 20 30 3b 0a 20 20 72 65    *pId = 0;.  re
fb20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
fb30: 7d 0a 0a 23 70 72 61 67 6d 61 20 6d 61 72 6b 20  }..#pragma mark 
fb40: 4f 6c 64 2d 53 63 68 6f 6f 6c 20 2e 6c 6f 63 6b  Old-School .lock
fb50: 20 66 69 6c 65 20 62 61 73 65 64 20 6c 6f 63 6b   file based lock
fb60: 69 6e 67 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 65 20  ing../*. ** The 
fb70: 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  dotlockLockingCo
fb80: 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20  ntext structure 
fb90: 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 64 6f 74  contains all dot
fba0: 6c 6f 63 6b 20 28 2e 6c 6f 63 6b 29 20 6c 6f 63  lock (.lock) loc
fbb0: 6b 0a 20 2a 2a 20 73 70 65 63 69 66 69 63 20 73  k. ** specific s
fbc0: 74 61 74 65 0a 20 2a 2f 0a 74 79 70 65 64 65 66  tate. */.typedef
fbd0: 20 73 74 72 75 63 74 20 64 6f 74 6c 6f 63 6b 4c   struct dotlockL
fbe0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 64 6f  ockingContext do
fbf0: 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
fc00: 65 78 74 3b 0a 73 74 72 75 63 74 20 64 6f 74 6c  ext;.struct dotl
fc10: 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
fc20: 74 20 7b 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b  t {.  char *lock
fc30: 50 61 74 68 3b 0a 7d 3b 0a 0a 0a 73 74 61 74 69  Path;.};...stati
fc40: 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 69  c int dotlockUni
fc50: 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
fc60: 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 29 20 7b  ck(OsFile *id) {
fc70: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
fc80: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
fc90: 69 64 3b 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63  id;.  dotlockLoc
fca0: 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e  kingContext *con
fcb0: 74 65 78 74 20 3d 20 0a 20 20 20 20 28 64 6f 74  text = .    (dot
fcc0: 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  lockLockingConte
fcd0: 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
fce0: 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a  kingContext;.  .
fcf0: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
fd00: 6b 74 79 70 65 20 3d 3d 20 52 45 53 45 52 56 45  ktype == RESERVE
fd10: 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 72 65  D_LOCK) {.    re
fd20: 74 75 72 6e 20 31 3b 20 2f 2a 20 61 6c 72 65 61  turn 1; /* alrea
fd30: 64 79 20 68 61 76 65 20 61 20 72 65 73 65 72 76  dy have a reserv
fd40: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 20 65  ed lock */.  } e
fd50: 6c 73 65 20 7b 0a 20 20 20 20 73 74 72 75 63 74  lse {.    struct
fd60: 20 73 74 61 74 20 73 74 61 74 42 75 66 3b 0a 20   stat statBuf;. 
fd70: 20 20 20 69 66 20 28 6c 73 74 61 74 28 63 6f 6e     if (lstat(con
fd80: 74 65 78 74 2d 3e 6c 6f 63 6b 50 61 74 68 2c 26  text->lockPath,&
fd90: 73 74 61 74 42 75 66 29 20 3d 3d 20 30 29 0a 20  statBuf) == 0). 
fda0: 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 65 78 69       /* file exi
fdb0: 73 74 73 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c 73  sts, someone els
fdc0: 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20 2a  e has the lock *
fdd0: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  /.      return 1
fde0: 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  ;.    else.     
fdf0: 20 2f 2a 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f   /* file does no
fe00: 74 20 65 78 69 73 74 2c 20 77 65 20 63 6f 75 6c  t exist, we coul
fe10: 64 20 68 61 76 65 20 69 74 20 69 66 20 77 65 20  d have it if we 
fe20: 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20 20  want it */.     
fe30: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d   return 0;.  }.}
fe40: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  ..static int dot
fe50: 6c 6f 63 6b 55 6e 69 78 4c 6f 63 6b 28 4f 73 46  lockUnixLock(OsF
fe60: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
fe70: 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46  ktype) {.  unixF
fe80: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
fe90: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 64 6f  ixFile*)id;.  do
fea0: 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
feb0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 0a  ext *context = .
fec0: 20 20 20 20 28 64 6f 74 6c 6f 63 6b 4c 6f 63 6b      (dotlockLock
fed0: 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
fee0: 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
fef0: 65 78 74 3b 0a 20 20 0a 20 20 2f 2a 20 69 66 20  ext;.  .  /* if 
ff00: 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  we already have 
ff10: 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78  a lock, it is ex
ff20: 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20  clusive.  .  ** 
ff30: 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65  Just adjust leve
ff40: 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75  l and punt on ou
ff50: 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69  tta here. */.  i
ff60: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f (pFile->lockty
ff70: 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a  pe > NO_LOCK) {.
ff80: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
ff90: 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
ffa0: 20 20 20 20 0a 20 20 20 20 2f 2a 20 41 6c 77 61      .    /* Alwa
ffb0: 79 73 20 75 70 64 61 74 65 20 74 68 65 20 74 69  ys update the ti
ffc0: 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f  mestamp on the o
ffd0: 6c 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 75  ld file */.    u
ffe0: 74 69 6d 65 73 28 63 6f 6e 74 65 78 74 2d 3e 6c  times(context->l
fff0: 6f 63 6b 50 61 74 68 2c 4e 55 4c 4c 29 3b 0a 20  ockPath,NULL);. 
10000 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10010 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
10020 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
10030 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72 65 61   lock file alrea
10040 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 73  dy exists */.  s
10050 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74 42  truct stat statB
10060 75 66 3b 0a 20 20 69 66 20 28 6c 73 74 61 74 28  uf;.  if (lstat(
10070 63 6f 6e 74 65 78 74 2d 3e 6c 6f 63 6b 50 61 74  context->lockPat
10080 68 2c 26 73 74 61 74 42 75 66 29 20 3d 3d 20 30  h,&statBuf) == 0
10090 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
100a0 4c 49 54 45 5f 42 55 53 59 3b 20 2f 2a 20 69 74  LITE_BUSY; /* it
100b0 20 64 6f 65 73 2c 20 62 75 73 79 20 2a 2f 0a 20   does, busy */. 
100c0 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20   }.  .  /* grab 
100d0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
100e0 6b 20 2a 2f 0a 20 20 69 6e 74 20 66 64 20 3d 20  k */.  int fd = 
100f0 6f 70 65 6e 28 63 6f 6e 74 65 78 74 2d 3e 6c 6f  open(context->lo
10100 63 6b 50 61 74 68 2c 4f 5f 52 44 4f 4e 4c 59 7c  ckPath,O_RDONLY|
10110 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 2c 30  O_CREAT|O_EXCL,0
10120 36 30 30 29 3b 0a 20 20 69 66 20 28 66 64 20 3c  600);.  if (fd <
10130 20 30 29 20 7b 0a 20 20 20 20 2f 2a 20 66 61 69   0) {.    /* fai
10140 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61  led to open/crea
10150 74 65 20 74 68 65 20 66 69 6c 65 2c 20 73 6f 6d  te the file, som
10160 65 6f 6e 65 20 65 6c 73 65 20 6d 61 79 20 68 61  eone else may ha
10170 76 65 20 73 74 6f 6c 65 6e 20 74 68 65 20 6c 6f  ve stolen the lo
10180 63 6b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ck */.    return
10190 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 20 0a 20   SQLITE_BUSY; . 
101a0 20 7d 0a 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a   }.  close(fd);.
101b0 20 20 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20    .  /* got it, 
101c0 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  set the type and
101d0 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20   return ok */.  
101e0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
101f0 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65  = locktype;.  re
10200 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10210 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  }..static int do
10220 74 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b 28  tlockUnixUnlock(
10230 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  OsFile *id, int 
10240 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e  locktype) {.  un
10250 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
10260 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
10270 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43   dotlockLockingC
10280 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20  ontext *context 
10290 3d 20 0a 20 20 20 20 28 64 6f 74 6c 6f 63 6b 4c  = .    (dotlockL
102a0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
102b0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
102c0 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73  ontext;.  .  ass
102d0 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53  ert( locktype<=S
102e0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
102f0 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70  .  /* no-op if p
10300 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28  ossible */.  if(
10310 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
10320 3d 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  ==locktype ){.  
10330 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10340 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
10350 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20  shared can just 
10360 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77  be set because w
10370 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e  e always have an
10380 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20   exclusive */.  
10390 69 66 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if (locktype==SH
103a0 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  ARED_LOCK) {.   
103b0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
103c0 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20   = locktype;.   
103d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
103e0 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e  K;.  }.  .  /* n
103f0 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63  o, really, unloc
10400 6b 2e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 28 63  k. */.  unlink(c
10410 6f 6e 74 65 78 74 2d 3e 6c 6f 63 6b 50 61 74 68  ontext->lockPath
10420 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  );.  pFile->lock
10430 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  type = NO_LOCK;.
10440 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10450 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c  OK;.}../*. ** Cl
10460 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a  ose a file.. */.
10470 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
10480 63 6b 55 6e 69 78 43 6c 6f 73 65 28 4f 73 46 69  ckUnixClose(OsFi
10490 6c 65 20 2a 2a 70 49 64 29 20 7b 0a 20 20 75 6e  le **pId) {.  un
104a0 69 78 46 69 6c 65 20 2a 69 64 20 3d 20 28 75 6e  ixFile *id = (un
104b0 69 78 46 69 6c 65 2a 29 2a 70 49 64 3b 0a 20 20  ixFile*)*pId;.  
104c0 0a 20 20 69 66 28 20 21 69 64 20 29 20 72 65 74  .  if( !id ) ret
104d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
104e0 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f   dotlockUnixUnlo
104f0 63 6b 28 2a 70 49 64 2c 20 4e 4f 5f 4c 4f 43 4b  ck(*pId, NO_LOCK
10500 29 3b 0a 20 20 2f 2a 20 66 72 65 65 20 74 68 65  );.  /* free the
10510 20 64 6f 74 6c 6f 63 6b 20 6c 6f 63 6b 69 6e 67   dotlock locking
10520 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
10530 69 66 20 28 69 64 2d 3e 6c 6f 63 6b 69 6e 67 43  if (id->lockingC
10540 6f 6e 74 65 78 74 20 21 3d 20 4e 55 4c 4c 29 20  ontext != NULL) 
10550 7b 0a 20 20 20 20 69 66 20 28 28 28 64 6f 74 6c  {.    if (((dotl
10560 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
10570 74 20 2a 29 69 64 2d 3e 6c 6f 63 6b 69 6e 67 43  t *)id->lockingC
10580 6f 6e 74 65 78 74 29 2d 3e 6c 6f 63 6b 50 61 74  ontext)->lockPat
10590 68 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20  h != NULL).     
105a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 20 28   sqlite3_free( (
105b0 20 28 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67   (dotlockLocking
105c0 43 6f 6e 74 65 78 74 20 2a 29 0a 20 20 20 20 20  Context *).     
105d0 20 20 20 69 64 2d 3e 6c 6f 63 6b 69 6e 67 43 6f     id->lockingCo
105e0 6e 74 65 78 74 29 2d 3e 6c 6f 63 6b 50 61 74 68  ntext)->lockPath
105f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
10600 72 65 65 28 69 64 2d 3e 6c 6f 63 6b 69 6e 67 43  ree(id->lockingC
10610 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20 20 0a  ontext);.  }.  .
10620 20 20 69 66 28 20 69 64 2d 3e 64 69 72 66 64 3e    if( id->dirfd>
10630 3d 30 20 29 20 63 6c 6f 73 65 28 69 64 2d 3e 64  =0 ) close(id->d
10640 69 72 66 64 29 3b 0a 20 20 69 64 2d 3e 64 69 72  irfd);.  id->dir
10650 66 64 20 3d 20 2d 31 3b 0a 20 20 65 6e 74 65 72  fd = -1;.  enter
10660 4d 75 74 65 78 28 29 3b 0a 20 20 0a 20 20 63 6c  Mutex();.  .  cl
10670 6f 73 65 28 69 64 2d 3e 68 29 3b 0a 20 20 0a 20  ose(id->h);.  . 
10680 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20   leaveMutex();. 
10690 20 69 64 2d 3e 69 73 4f 70 65 6e 20 3d 20 30 3b   id->isOpen = 0;
106a0 0a 20 20 4f 53 54 52 41 43 45 32 28 22 43 4c 4f  .  OSTRACE2("CLO
106b0 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 69 64  SE   %-3d\n", id
106c0 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e  ->h);.  OpenCoun
106d0 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74  ter(-1);.  sqlit
106e0 65 33 5f 66 72 65 65 28 69 64 29 3b 0a 20 20 2a  e3_free(id);.  *
106f0 70 49 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  pId = 0;.  retur
10700 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
10710 0a 23 70 72 61 67 6d 61 20 6d 61 72 6b 20 4e 6f  .#pragma mark No
10720 20 6c 6f 63 6b 69 6e 67 0a 0a 2f 2a 0a 20 2a 2a   locking../*. **
10730 20 54 68 65 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 69   The nolockLocki
10740 6e 67 43 6f 6e 74 65 78 74 20 69 73 20 76 6f 69  ngContext is voi
10750 64 0a 20 2a 2f 0a 74 79 70 65 64 65 66 20 76 6f  d. */.typedef vo
10760 69 64 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  id nolockLocking
10770 43 6f 6e 74 65 78 74 3b 0a 0a 73 74 61 74 69 63  Context;..static
10780 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 69 78 43   int nolockUnixC
10790 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
107a0 28 4f 73 46 69 6c 65 20 2a 69 64 29 20 7b 0a 20  (OsFile *id) {. 
107b0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74   return 0;.}..st
107c0 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55  atic int nolockU
107d0 6e 69 78 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a  nixLock(OsFile *
107e0 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
107f0 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ) {.  return SQL
10800 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69  ITE_OK;.}..stati
10810 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 69 78  c int nolockUnix
10820 55 6e 6c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69  Unlock(OsFile *i
10830 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
10840 20 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   {.  return SQLI
10850 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a  TE_OK;.}../*. **
10860 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20   Close a file.. 
10870 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  */.static int no
10880 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73 65 28 4f 73  lockUnixClose(Os
10890 46 69 6c 65 20 2a 2a 70 49 64 29 20 7b 0a 20 20  File **pId) {.  
108a0 75 6e 69 78 46 69 6c 65 20 2a 69 64 20 3d 20 28  unixFile *id = (
108b0 75 6e 69 78 46 69 6c 65 2a 29 2a 70 49 64 3b 0a  unixFile*)*pId;.
108c0 20 20 0a 20 20 69 66 28 20 21 69 64 20 29 20 72    .  if( !id ) r
108d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
108e0 0a 20 20 69 66 28 20 69 64 2d 3e 64 69 72 66 64  .  if( id->dirfd
108f0 3e 3d 30 20 29 20 63 6c 6f 73 65 28 69 64 2d 3e  >=0 ) close(id->
10900 64 69 72 66 64 29 3b 0a 20 20 69 64 2d 3e 64 69  dirfd);.  id->di
10910 72 66 64 20 3d 20 2d 31 3b 0a 20 20 65 6e 74 65  rfd = -1;.  ente
10920 72 4d 75 74 65 78 28 29 3b 0a 20 20 0a 20 20 63  rMutex();.  .  c
10930 6c 6f 73 65 28 69 64 2d 3e 68 29 3b 0a 20 20 0a  lose(id->h);.  .
10940 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a    leaveMutex();.
10950 20 20 69 64 2d 3e 69 73 4f 70 65 6e 20 3d 20 30    id->isOpen = 0
10960 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22 43 4c  ;.  OSTRACE2("CL
10970 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 69  OSE   %-3d\n", i
10980 64 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e 43 6f 75  d->h);.  OpenCou
10990 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69  nter(-1);.  sqli
109a0 74 65 33 5f 66 72 65 65 28 69 64 29 3b 0a 20 20  te3_free(id);.  
109b0 2a 70 49 64 20 3d 20 30 3b 0a 20 20 72 65 74 75  *pId = 0;.  retu
109c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
109d0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
109e0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
109f0 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 30  _STYLE */..#if 0
10a00 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
10a10 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66  e value of the f
10a20 75 6c 6c 73 79 6e 63 20 66 6c 61 67 20 69 6e 20  ullsync flag in 
10a30 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
10a40 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74  escriptor..*/.st
10a50 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 65  atic void unixSe
10a60 74 46 75 6c 6c 53 79 6e 63 28 4f 73 46 69 6c 65  tFullSync(OsFile
10a70 20 2a 69 64 2c 20 69 6e 74 20 76 29 7b 0a 20 20   *id, int v){.  
10a80 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
10a90 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 76 3b 0a 7d  >fullSync = v;.}
10aa0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
10ab0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69  he underlying fi
10ac0 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 6e  le handle for an
10ad0 20 4f 73 46 69 6c 65 0a 2a 2f 0a 73 74 61 74 69   OsFile.*/.stati
10ae0 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 48 61  c int unixFileHa
10af0 6e 64 6c 65 28 4f 73 46 69 6c 65 20 2a 69 64 29  ndle(OsFile *id)
10b00 7b 0a 20 20 72 65 74 75 72 6e 20 28 28 75 6e 69  {.  return ((uni
10b10 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 3b 0a 7d  xFile*)id)->h;.}
10b20 0a 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ..#endif../*.** 
10b30 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f  Return the secto
10b40 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  r size in bytes 
10b50 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  of the underlyin
10b60 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66  g block device f
10b70 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66  or.** the specif
10b80 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69  ied file. This i
10b90 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20  s almost always 
10ba0 35 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d  512 bytes, but m
10bb0 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20  ay be.** larger 
10bc0 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73  for some devices
10bd0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63  ..**.** SQLite c
10be0 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73  ode assumes this
10bf0 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74   function cannot
10c00 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61   fail. It also a
10c10 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69  ssumes that.** i
10c20 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20  f two files are 
10c30 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73  created in the s
10c40 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ame file-system 
10c50 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a  directory (i.e..
10c60 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e  ** a database an
10c70 64 20 69 74 27 73 20 6a 6f 75 72 6e 61 6c 20 66  d it's journal f
10c80 69 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65  ile) that the se
10c90 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
10ca0 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f  e the.** same fo
10cb0 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69  r both..*/.stati
10cc0 63 20 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72  c int unixSector
10cd0 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
10ce0 65 20 2a 69 64 29 7b 0a 20 20 72 65 74 75 72 6e  e *id){.  return
10cf0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
10d00 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a  SECTOR_SIZE;.}..
10d10 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
10d20 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
10d30 72 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20  ristics for the 
10d40 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c  file. This is al
10d50 77 61 79 73 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  ways 0..*/.stati
10d60 63 20 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65  c int unixDevice
10d70 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
10d80 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
10d90 29 7b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  ){.  return 0;.}
10da0 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  ..static int uni
10db0 78 42 72 65 61 6b 4c 6f 63 6b 28 73 71 6c 69 74  xBreakLock(sqlit
10dc0 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
10dd0 61 73 73 65 72 74 28 21 22 54 4f 44 4f 3a 20 75  assert(!"TODO: u
10de0 6e 69 78 42 72 65 61 6b 4c 6f 63 6b 28 29 22 29  nixBreakLock()")
10df0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
10e00 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  ./*.** Return an
10e10 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 69 6e   integer that in
10e20 64 69 63 65 73 20 74 68 65 20 74 79 70 65 20 6f  dices the type o
10e30 66 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c 79  f lock currently
10e40 20 68 65 6c 64 0a 2a 2a 20 62 79 20 74 68 69 73   held.** by this
10e50 20 68 61 6e 64 6c 65 2e 20 20 28 55 73 65 64 20   handle.  (Used 
10e60 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
10e70 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 29 0a  analysis only.).
10e80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
10e90 69 78 4c 6f 63 6b 53 74 61 74 65 28 73 71 6c 69  ixLockState(sqli
10ea0 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
10eb0 20 72 65 74 75 72 6e 20 28 28 75 6e 69 78 46 69   return ((unixFi
10ec0 6c 65 2a 29 69 64 29 2d 3e 6c 6f 63 6b 74 79 70  le*)id)->locktyp
10ed0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
10ee0 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20   vector defines 
10ef0 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20  all the methods 
10f00 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65  that can operate
10f10 20 6f 6e 20 61 6e 20 4f 73 46 69 6c 65 0a 2a 2a   on an OsFile.**
10f20 20 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f 0a 73 74   for unix..*/.st
10f30 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
10f40 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 73 71  e3_io_methods sq
10f50 6c 69 74 65 33 55 6e 69 78 49 6f 4d 65 74 68 6f  lite3UnixIoMetho
10f60 64 20 3d 20 7b 0a 20 20 31 2c 20 20 20 20 20 20  d = {.  1,      
10f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f80 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
10f90 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 0a 20 20  .  unixClose,.  
10fa0 75 6e 69 78 52 65 61 64 2c 0a 20 20 75 6e 69 78  unixRead,.  unix
10fb0 57 72 69 74 65 2c 0a 20 20 75 6e 69 78 54 72 75  Write,.  unixTru
10fc0 6e 63 61 74 65 2c 0a 20 20 75 6e 69 78 53 79 6e  ncate,.  unixSyn
10fd0 63 2c 0a 20 20 75 6e 69 78 46 69 6c 65 53 69 7a  c,.  unixFileSiz
10fe0 65 2c 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 0a 20  e,.  unixLock,. 
10ff0 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 0a 20 20 75   unixUnlock,.  u
11000 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
11010 4c 6f 63 6b 2c 0a 20 20 75 6e 69 78 42 72 65 61  Lock,.  unixBrea
11020 6b 4c 6f 63 6b 2c 0a 20 20 75 6e 69 78 4c 6f 63  kLock,.  unixLoc
11030 6b 53 74 61 74 65 2c 0a 20 20 75 6e 69 78 53 65  kState,.  unixSe
11040 63 74 6f 72 53 69 7a 65 2c 0a 20 20 75 6e 69 78  ctorSize,.  unix
11050 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
11060 73 74 69 63 73 0a 7d 3b 0a 0a 23 69 66 64 65 66  stics.};..#ifdef
11070 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
11080 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a  OCKING_STYLE./*.
11090 20 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20   ** This vector 
110a0 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20  defines all the 
110b0 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e  methods that can
110c0 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 20 4f   operate on an O
110d0 73 46 69 6c 65 0a 20 2a 2a 20 66 6f 72 20 75 6e  sFile. ** for un
110e0 69 78 20 77 69 74 68 20 41 46 50 20 73 74 79 6c  ix with AFP styl
110f0 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a  e file locking..
11100 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74   */.static const
11110 20 49 6f 4d 65 74 68 6f 64 20 73 71 6c 69 74 65   IoMethod sqlite
11120 33 41 46 50 4c 6f 63 6b 69 6e 67 55 6e 69 78 49  3AFPLockingUnixI
11130 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20 20 20  oMethod = {.    
11140 61 66 70 55 6e 69 78 43 6c 6f 73 65 2c 0a 20 20  afpUnixClose,.  
11150 20 20 75 6e 69 78 4f 70 65 6e 44 69 72 65 63 74    unixOpenDirect
11160 6f 72 79 2c 0a 20 20 20 20 75 6e 69 78 52 65 61  ory,.    unixRea
11170 64 2c 0a 20 20 20 20 75 6e 69 78 57 72 69 74 65  d,.    unixWrite
11180 2c 0a 20 20 20 20 75 6e 69 78 53 65 65 6b 2c 0a  ,.    unixSeek,.
11190 20 20 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65      unixTruncate
111a0 2c 0a 20 20 20 20 75 6e 69 78 53 79 6e 63 2c 0a  ,.    unixSync,.
111b0 20 20 20 20 75 6e 69 78 53 65 74 46 75 6c 6c 53      unixSetFullS
111c0 79 6e 63 2c 0a 20 20 20 20 75 6e 69 78 46 69 6c  ync,.    unixFil
111d0 65 48 61 6e 64 6c 65 2c 0a 20 20 20 20 75 6e 69  eHandle,.    uni
111e0 78 46 69 6c 65 53 69 7a 65 2c 0a 20 20 20 20 61  xFileSize,.    a
111f0 66 70 55 6e 69 78 4c 6f 63 6b 2c 0a 20 20 20 20  fpUnixLock,.    
11200 61 66 70 55 6e 69 78 55 6e 6c 6f 63 6b 2c 0a 20  afpUnixUnlock,. 
11210 20 20 20 75 6e 69 78 4c 6f 63 6b 53 74 61 74 65     unixLockState
11220 2c 0a 20 20 20 20 61 66 70 55 6e 69 78 43 68 65  ,.    afpUnixChe
11230 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a  ckReservedLock,.
11240 20 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69      unixSectorSi
11250 7a 65 2c 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2a 20 54  ze,.};../*. ** T
11260 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e  his vector defin
11270 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f  es all the metho
11280 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72  ds that can oper
11290 61 74 65 20 6f 6e 20 61 6e 20 4f 73 46 69 6c 65  ate on an OsFile
112a0 0a 20 2a 2a 20 66 6f 72 20 75 6e 69 78 20 77 69  . ** for unix wi
112b0 74 68 20 66 6c 6f 63 6b 28 29 20 73 74 79 6c 65  th flock() style
112c0 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 20   file locking.. 
112d0 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
112e0 49 6f 4d 65 74 68 6f 64 20 73 71 6c 69 74 65 33  IoMethod sqlite3
112f0 46 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78  FlockLockingUnix
11300 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20 20  IoMethod = {.   
11310 20 66 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73 65 2c   flockUnixClose,
11320 0a 20 20 20 20 75 6e 69 78 4f 70 65 6e 44 69 72  .    unixOpenDir
11330 65 63 74 6f 72 79 2c 0a 20 20 20 20 75 6e 69 78  ectory,.    unix
11340 52 65 61 64 2c 0a 20 20 20 20 75 6e 69 78 57 72  Read,.    unixWr
11350 69 74 65 2c 0a 20 20 20 20 75 6e 69 78 53 65 65  ite,.    unixSee
11360 6b 2c 0a 20 20 20 20 75 6e 69 78 54 72 75 6e 63  k,.    unixTrunc
11370 61 74 65 2c 0a 20 20 20 20 75 6e 69 78 53 79 6e  ate,.    unixSyn
11380 63 2c 0a 20 20 20 20 75 6e 69 78 53 65 74 46 75  c,.    unixSetFu
11390 6c 6c 53 79 6e 63 2c 0a 20 20 20 20 75 6e 69 78  llSync,.    unix
113a0 46 69 6c 65 48 61 6e 64 6c 65 2c 0a 20 20 20 20  FileHandle,.    
113b0 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 0a 20 20  unixFileSize,.  
113c0 20 20 66 6c 6f 63 6b 55 6e 69 78 4c 6f 63 6b 2c    flockUnixLock,
113d0 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 69 78 55 6e  .    flockUnixUn
113e0 6c 6f 63 6b 2c 0a 20 20 20 20 75 6e 69 78 4c 6f  lock,.    unixLo
113f0 63 6b 53 74 61 74 65 2c 0a 20 20 20 20 66 6c 6f  ckState,.    flo
11400 63 6b 55 6e 69 78 43 68 65 63 6b 52 65 73 65 72  ckUnixCheckReser
11410 76 65 64 4c 6f 63 6b 2c 0a 20 20 20 20 75 6e 69  vedLock,.    uni
11420 78 53 65 63 74 6f 72 53 69 7a 65 2c 0a 7d 3b 0a  xSectorSize,.};.
11430 0a 2f 2a 0a 20 2a 2a 20 54 68 69 73 20 76 65 63  ./*. ** This vec
11440 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20  tor defines all 
11450 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74  the methods that
11460 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20   can operate on 
11470 61 6e 20 4f 73 46 69 6c 65 0a 20 2a 2a 20 66 6f  an OsFile. ** fo
11480 72 20 75 6e 69 78 20 77 69 74 68 20 64 6f 74 6c  r unix with dotl
11490 6f 63 6b 20 73 74 79 6c 65 20 66 69 6c 65 20 6c  ock style file l
114a0 6f 63 6b 69 6e 67 2e 0a 20 2a 2f 0a 73 74 61 74  ocking.. */.stat
114b0 69 63 20 63 6f 6e 73 74 20 49 6f 4d 65 74 68 6f  ic const IoMetho
114c0 64 20 73 71 6c 69 74 65 33 44 6f 74 6c 6f 63 6b  d sqlite3Dotlock
114d0 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74  LockingUnixIoMet
114e0 68 6f 64 20 3d 20 7b 0a 20 20 20 20 64 6f 74 6c  hod = {.    dotl
114f0 6f 63 6b 55 6e 69 78 43 6c 6f 73 65 2c 0a 20 20  ockUnixClose,.  
11500 20 20 75 6e 69 78 4f 70 65 6e 44 69 72 65 63 74    unixOpenDirect
11510 6f 72 79 2c 0a 20 20 20 20 75 6e 69 78 52 65 61  ory,.    unixRea
11520 64 2c 0a 20 20 20 20 75 6e 69 78 57 72 69 74 65  d,.    unixWrite
11530 2c 0a 20 20 20 20 75 6e 69 78 53 65 65 6b 2c 0a  ,.    unixSeek,.
11540 20 20 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65      unixTruncate
11550 2c 0a 20 20 20 20 75 6e 69 78 53 79 6e 63 2c 0a  ,.    unixSync,.
11560 20 20 20 20 75 6e 69 78 53 65 74 46 75 6c 6c 53      unixSetFullS
11570 79 6e 63 2c 0a 20 20 20 20 75 6e 69 78 46 69 6c  ync,.    unixFil
11580 65 48 61 6e 64 6c 65 2c 0a 20 20 20 20 75 6e 69  eHandle,.    uni
11590 78 46 69 6c 65 53 69 7a 65 2c 0a 20 20 20 20 64  xFileSize,.    d
115a0 6f 74 6c 6f 63 6b 55 6e 69 78 4c 6f 63 6b 2c 0a  otlockUnixLock,.
115b0 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 55      dotlockUnixU
115c0 6e 6c 6f 63 6b 2c 0a 20 20 20 20 75 6e 69 78 4c  nlock,.    unixL
115d0 6f 63 6b 53 74 61 74 65 2c 0a 20 20 20 20 64 6f  ockState,.    do
115e0 74 6c 6f 63 6b 55 6e 69 78 43 68 65 63 6b 52 65  tlockUnixCheckRe
115f0 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 20 20 20 20  servedLock,.    
11600 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 0a  unixSectorSize,.
11610 7d 3b 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 69 73 20  };../*. ** This 
11620 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61  vector defines a
11630 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74  ll the methods t
11640 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20  hat can operate 
11650 6f 6e 20 61 6e 20 4f 73 46 69 6c 65 0a 20 2a 2a  on an OsFile. **
11660 20 66 6f 72 20 75 6e 69 78 20 77 69 74 68 20 64   for unix with d
11670 6f 74 6c 6f 63 6b 20 73 74 79 6c 65 20 66 69 6c  otlock style fil
11680 65 20 6c 6f 63 6b 69 6e 67 2e 0a 20 2a 2f 0a 73  e locking.. */.s
11690 74 61 74 69 63 20 63 6f 6e 73 74 20 49 6f 4d 65  tatic const IoMe
116a0 74 68 6f 64 20 73 71 6c 69 74 65 33 4e 6f 6c 6f  thod sqlite3Nolo
116b0 63 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d  ckLockingUnixIoM
116c0 65 74 68 6f 64 20 3d 20 7b 0a 20 20 6e 6f 6c 6f  ethod = {.  nolo
116d0 63 6b 55 6e 69 78 43 6c 6f 73 65 2c 0a 20 20 75  ckUnixClose,.  u
116e0 6e 69 78 4f 70 65 6e 44 69 72 65 63 74 6f 72 79  nixOpenDirectory
116f0 2c 0a 20 20 75 6e 69 78 52 65 61 64 2c 0a 20 20  ,.  unixRead,.  
11700 75 6e 69 78 57 72 69 74 65 2c 0a 20 20 75 6e 69  unixWrite,.  uni
11710 78 53 65 65 6b 2c 0a 20 20 75 6e 69 78 54 72 75  xSeek,.  unixTru
11720 6e 63 61 74 65 2c 0a 20 20 75 6e 69 78 53 79 6e  ncate,.  unixSyn
11730 63 2c 0a 20 20 75 6e 69 78 53 65 74 46 75 6c 6c  c,.  unixSetFull
11740 53 79 6e 63 2c 0a 20 20 75 6e 69 78 46 69 6c 65  Sync,.  unixFile
11750 48 61 6e 64 6c 65 2c 0a 20 20 75 6e 69 78 46 69  Handle,.  unixFi
11760 6c 65 53 69 7a 65 2c 0a 20 20 6e 6f 6c 6f 63 6b  leSize,.  nolock
11770 55 6e 69 78 4c 6f 63 6b 2c 0a 20 20 6e 6f 6c 6f  UnixLock,.  nolo
11780 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b 2c 0a 20 20  ckUnixUnlock,.  
11790 75 6e 69 78 4c 6f 63 6b 53 74 61 74 65 2c 0a 20  unixLockState,. 
117a0 20 6e 6f 6c 6f 63 6b 55 6e 69 78 43 68 65 63 6b   nolockUnixCheck
117b0 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 20 20  ReservedLock,.  
117c0 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 0a  unixSectorSize,.
117d0 7d 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  };..#endif /* SQ
117e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
117f0 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a  ING_STYLE */../*
11800 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d  .** Allocate mem
11810 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20 75 6e  ory for a new un
11820 69 78 46 69 6c 65 20 61 6e 64 20 69 6e 69 74 69  ixFile and initi
11830 61 6c 69 7a 65 20 74 68 61 74 20 75 6e 69 78 46  alize that unixF
11840 69 6c 65 2e 0a 2a 2a 20 57 72 69 74 65 20 61 20  ile..** Write a 
11850 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
11860 65 77 20 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f  ew unixFile into
11870 20 2a 70 49 64 2e 0a 2a 2a 20 49 66 20 77 65 20   *pId..** If we 
11880 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  run out of memor
11890 79 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  y, close the fil
118a0 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20  e and return an 
118b0 65 72 72 6f 72 2e 0a 2a 2f 0a 23 69 66 64 65 66  error..*/.#ifdef
118c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
118d0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20  OCKING_STYLE./* 
118e0 0a 20 2a 2a 20 57 68 65 6e 20 6c 6f 63 6b 69 6e  . ** When lockin
118f0 67 20 65 78 74 65 6e 73 69 6f 6e 73 20 61 72 65  g extensions are
11900 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 20 66 69   enabled, the fi
11910 6c 65 70 61 74 68 20 61 6e 64 20 6c 6f 63 6b 69  lepath and locki
11920 6e 67 20 73 74 79 6c 65 20 0a 20 2a 2a 20 61 72  ng style . ** ar
11930 65 20 6e 65 65 64 65 64 20 74 6f 20 64 65 74 65  e needed to dete
11940 72 6d 69 6e 65 20 74 68 65 20 75 6e 69 78 46 69  rmine the unixFi
11950 6c 65 20 70 4d 65 74 68 6f 64 20 74 6f 20 75 73  le pMethod to us
11960 65 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 6f 70  e for locking op
11970 65 72 61 74 69 6f 6e 73 2e 0a 20 2a 2a 20 54 68  erations.. ** Th
11980 65 20 6c 6f 63 6b 69 6e 67 2d 73 74 79 6c 65 20  e locking-style 
11990 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67  specific locking
119a0 43 6f 6e 74 65 78 74 20 64 61 74 61 20 73 74 72  Context data str
119b0 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65  ucture is create
119c0 64 20 0a 20 2a 2a 20 61 6e 64 20 61 73 73 69 67  d . ** and assig
119d0 6e 65 64 20 68 65 72 65 20 61 6c 73 6f 2e 0a 20  ned here also.. 
119e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
119f0 6c 6f 63 61 74 65 55 6e 69 78 46 69 6c 65 28 0a  locateUnixFile(.
11a00 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20    int h,        
11a10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
11a20 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
11a30 72 20 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20  r of file being 
11a40 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 4f 73 46 69  opened */.  OsFi
11a50 6c 65 20 2a 2a 70 49 64 2c 20 20 20 20 20 20 20  le **pId,       
11a60 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 6f 6d      /* Write com
11a70 70 6c 65 74 65 64 20 69 6e 69 74 69 61 6c 69 7a  pleted initializ
11a80 61 74 69 6f 6e 20 68 65 72 65 20 2a 2f 0a 20 20  ation here */.  
11a90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
11aa0 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20  ename,  /* Name 
11ab0 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e  of the file bein
11ac0 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e  g opened */.  in
11ad0 74 20 64 65 6c 46 6c 61 67 20 20 20 20 20 20 20  t delFlag       
11ae0 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 2d        /* Delete-
11af0 6f 6e 2d 6f 72 2d 62 65 66 6f 72 65 2d 63 6c 6f  on-or-before-clo
11b00 73 65 20 66 6c 61 67 20 2a 2f 0a 29 7b 0a 20 20  se flag */.){.  
11b10 73 71 6c 69 74 65 33 4c 6f 63 6b 69 6e 67 53 74  sqlite3LockingSt
11b20 79 6c 65 20 6c 6f 63 6b 69 6e 67 53 74 79 6c 65  yle lockingStyle
11b30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  ;.  unixFile *pN
11b40 65 77 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 66  ew;.  unixFile f
11b50 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 6d  ;.  int rc;..  m
11b60 65 6d 73 65 74 28 26 66 2c 20 30 2c 20 73 69 7a  emset(&f, 0, siz
11b70 65 6f 66 28 66 29 29 3b 0a 20 20 6c 6f 63 6b 69  eof(f));.  locki
11b80 6e 67 53 74 79 6c 65 20 3d 20 73 71 6c 69 74 65  ngStyle = sqlite
11b90 33 44 65 74 65 63 74 4c 6f 63 6b 69 6e 67 53 74  3DetectLockingSt
11ba0 79 6c 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 68  yle(zFilename, h
11bb0 29 3b 0a 20 20 69 66 20 28 20 6c 6f 63 6b 69 6e  );.  if ( lockin
11bc0 67 53 74 79 6c 65 20 3d 3d 20 70 6f 73 69 78 4c  gStyle == posixL
11bd0 6f 63 6b 69 6e 67 53 74 79 6c 65 20 29 20 7b 0a  ockingStyle ) {.
11be0 20 20 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29      enterMutex()
11bf0 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 4c  ;.    rc = findL
11c00 6f 63 6b 49 6e 66 6f 28 68 2c 20 26 66 2e 70 4c  ockInfo(h, &f.pL
11c10 6f 63 6b 2c 20 26 66 2e 70 4f 70 65 6e 29 3b 0a  ock, &f.pOpen);.
11c20 20 20 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29      leaveMutex()
11c30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
11c40 20 20 20 20 20 20 63 6c 6f 73 65 28 68 29 3b 0a        close(h);.
11c50 20 20 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69        unlink(zFi
11c60 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72  lename);.      r
11c70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
11c80 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c  EM;.    }.  } el
11c90 73 65 20 7b 0a 20 20 20 20 2f 2a 20 20 70 4c 6f  se {.    /*  pLo
11ca0 63 6b 20 61 6e 64 20 70 4f 70 65 6e 20 61 72 65  ck and pOpen are
11cb0 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 70   only used for p
11cc0 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
11cd0 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 66 2e 70  cking */.    f.p
11ce0 4c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  Lock = NULL;.   
11cf0 20 66 2e 70 4f 70 65 6e 20 3d 20 4e 55 4c 4c 3b   f.pOpen = NULL;
11d00 0a 20 20 7d 0a 20 20 69 66 28 20 64 65 6c 46 6c  .  }.  if( delFl
11d10 61 67 20 29 7b 0a 20 20 20 20 75 6e 6c 69 6e 6b  ag ){.    unlink
11d20 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d  (zFilename);.  }
11d30 0a 20 20 66 2e 64 69 72 66 64 20 3d 20 2d 31 3b  .  f.dirfd = -1;
11d40 0a 20 20 66 2e 68 20 3d 20 68 3b 0a 20 20 53 45  .  f.h = h;.  SE
11d50 54 5f 54 48 52 45 41 44 49 44 28 26 66 29 3b 0a  T_THREADID(&f);.
11d60 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
11d70 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
11d80 75 6e 69 78 46 69 6c 65 29 20 29 3b 0a 20 20 69  unixFile) );.  i
11d90 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
11da0 20 20 63 6c 6f 73 65 28 68 29 3b 0a 20 20 20 20    close(h);.    
11db0 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  enterMutex();.  
11dc0 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66    releaseLockInf
11dd0 6f 28 66 2e 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  o(f.pLock);.    
11de0 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 66  releaseOpenCnt(f
11df0 2e 70 4f 70 65 6e 29 3b 0a 20 20 20 20 6c 65 61  .pOpen);.    lea
11e00 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 2a  veMutex();.    *
11e10 70 49 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  pId = 0;.    ret
11e20 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
11e30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
11e40 70 4e 65 77 20 3d 20 66 3b 0a 20 20 20 20 73 77  pNew = f;.    sw
11e50 69 74 63 68 28 6c 6f 63 6b 69 6e 67 53 74 79 6c  itch(lockingStyl
11e60 65 29 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e) {.      case 
11e70 61 66 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3a  afpLockingStyle:
11e80 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 61 66   {.        /* af
11e90 70 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74  p locking uses t
11ea0 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20  he file path so 
11eb0 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69  it needs to be i
11ec0 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 20  ncluded in.     
11ed0 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63     ** the afpLoc
11ee0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 2f 0a 20  kingContext */. 
11ef0 20 20 20 20 20 20 20 69 6e 74 20 6e 46 69 6c 65         int nFile
11f00 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70 4e  name;.        pN
11f10 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 73  ew->pMethod = &s
11f20 71 6c 69 74 65 33 41 46 50 4c 6f 63 6b 69 6e 67  qlite3AFPLocking
11f30 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a 20 20  UnixIoMethod;.  
11f40 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b        pNew->lock
11f50 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 0a 20 20  ingContext = .  
11f60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
11f70 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 61 66  malloc(sizeof(af
11f80 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  pLockingContext)
11f90 29 3b 0a 20 20 20 20 20 20 20 20 6e 46 69 6c 65  );.        nFile
11fa0 6e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 46  name = strlen(zF
11fb0 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20 20  ilename)+1;.    
11fc0 20 20 20 20 28 28 61 66 70 4c 6f 63 6b 69 6e 67      ((afpLocking
11fd0 43 6f 6e 74 65 78 74 20 2a 29 70 4e 65 77 2d 3e  Context *)pNew->
11fe0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d  lockingContext)-
11ff0 3e 66 69 6c 65 50 61 74 68 20 3d 20 0a 20 20 20  >filePath = .   
12000 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
12010 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d 65 29  alloc(nFilename)
12020 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
12030 28 28 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  (((afpLockingCon
12040 74 65 78 74 20 2a 29 70 4e 65 77 2d 3e 6c 6f 63  text *)pNew->loc
12050 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 66 69  kingContext)->fi
12060 6c 65 50 61 74 68 2c 20 0a 20 20 20 20 20 20 20  lePath, .       
12070 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d          zFilenam
12080 65 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e, nFilename);. 
12090 20 20 20 20 20 20 20 73 72 61 6e 64 6f 6d 64 65         srandomde
120a0 76 28 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  v();.        bre
120b0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
120c0 20 20 63 61 73 65 20 66 6c 6f 63 6b 4c 6f 63 6b    case flockLock
120d0 69 6e 67 53 74 79 6c 65 3a 0a 20 20 20 20 20 20  ingStyle:.      
120e0 20 20 2f 2a 20 66 6c 6f 63 6b 20 6c 6f 63 6b 69    /* flock locki
120f0 6e 67 20 64 6f 65 73 6e 27 74 20 6e 65 65 64 20  ng doesn't need 
12100 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69  additional locki
12110 6e 67 43 6f 6e 74 65 78 74 20 69 6e 66 6f 72 6d  ngContext inform
12120 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ation */.       
12130 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d   pNew->pMethod =
12140 20 26 73 71 6c 69 74 65 33 46 6c 6f 63 6b 4c 6f   &sqlite3FlockLo
12150 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f  ckingUnixIoMetho
12160 64 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  d;.        break
12170 3b 0a 20 20 20 20 20 20 63 61 73 65 20 64 6f 74  ;.      case dot
12180 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  lockLockingStyle
12190 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 64  : {.        /* d
121a0 6f 74 6c 6f 63 6b 20 6c 6f 63 6b 69 6e 67 20 75  otlock locking u
121b0 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
121c0 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
121d0 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a   be included in.
121e0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
121f0 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  dotlockLockingCo
12200 6e 74 65 78 74 20 2a 2f 0a 20 20 20 20 20 20 20  ntext */.       
12210 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a   int nFilename;.
12220 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4d          pNew->pM
12230 65 74 68 6f 64 20 3d 20 26 73 71 6c 69 74 65 33  ethod = &sqlite3
12240 44 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 55 6e  DotlockLockingUn
12250 69 78 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 20 20  ixIoMethod;.    
12260 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e      pNew->lockin
12270 67 43 6f 6e 74 65 78 74 20 3d 20 73 71 6c 69 74  gContext = sqlit
12280 65 33 5f 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20  e3_malloc(.     
12290 20 20 20 20 20 73 69 7a 65 6f 66 28 64 6f 74 6c       sizeof(dotl
122a0 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
122b0 74 29 29 3b 0a 20 20 20 20 20 20 20 20 6e 46 69  t));.        nFi
122c0 6c 65 6e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28  lename = strlen(
122d0 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a  zFilename) + 6;.
122e0 20 20 20 20 20 20 20 20 28 28 64 6f 74 6c 6f 63          ((dotloc
122f0 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  kLockingContext 
12300 2a 29 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43  *)pNew->lockingC
12310 6f 6e 74 65 78 74 29 2d 3e 6c 6f 63 6b 50 61 74  ontext)->lockPat
12320 68 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20  h = .           
12330 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
12340 20 6e 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20   nFilename );.  
12350 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
12360 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65  printf(nFilename
12370 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
12380 20 20 20 28 28 64 6f 74 6c 6f 63 6b 4c 6f 63 6b     ((dotlockLock
12390 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 4e 65  ingContext *)pNe
123a0 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
123b0 74 29 2d 3e 6c 6f 63 6b 50 61 74 68 2c 20 0a 20  t)->lockPath, . 
123c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
123d0 25 73 2e 6c 6f 63 6b 22 2c 20 7a 46 69 6c 65 6e  %s.lock", zFilen
123e0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ame);.        br
123f0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
12400 20 20 20 63 61 73 65 20 70 6f 73 69 78 4c 6f 63     case posixLoc
12410 6b 69 6e 67 53 74 79 6c 65 3a 0a 20 20 20 20 20  kingStyle:.     
12420 20 20 20 2f 2a 20 70 6f 73 69 78 20 6c 6f 63 6b     /* posix lock
12430 69 6e 67 20 64 6f 65 73 6e 27 74 20 6e 65 65 64  ing doesn't need
12440 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
12450 69 6e 67 43 6f 6e 74 65 78 74 20 69 6e 66 6f 72  ingContext infor
12460 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  mation */.      
12470 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20    pNew->pMethod 
12480 3d 20 26 73 71 6c 69 74 65 33 55 6e 69 78 49 6f  = &sqlite3UnixIo
12490 4d 65 74 68 6f 64 3b 0a 20 20 20 20 20 20 20 20  Method;.        
124a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
124b0 65 20 6e 6f 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  e noLockingStyle
124c0 3a 0a 20 20 20 20 20 20 63 61 73 65 20 75 6e 73  :.      case uns
124d0 75 70 70 6f 72 74 65 64 4c 6f 63 6b 69 6e 67 53  upportedLockingS
124e0 74 79 6c 65 3a 0a 20 20 20 20 20 20 64 65 66 61  tyle:.      defa
124f0 75 6c 74 3a 20 0a 20 20 20 20 20 20 20 20 70 4e  ult: .        pN
12500 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 73  ew->pMethod = &s
12510 71 6c 69 74 65 33 4e 6f 6c 6f 63 6b 4c 6f 63 6b  qlite3NolockLock
12520 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b  ingUnixIoMethod;
12530 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 49 64 20  .    }.    *pId 
12540 3d 20 28 4f 73 46 69 6c 65 2a 29 70 4e 65 77 3b  = (OsFile*)pNew;
12550 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  .    OpenCounter
12560 28 2b 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  (+1);.    return
12570 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
12580 7d 0a 23 65 6c 73 65 20 2f 2a 20 53 51 4c 49 54  }.#else /* SQLIT
12590 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
125a0 5f 53 54 59 4c 45 20 2a 2f 0a 73 74 61 74 69 63  _STYLE */.static
125b0 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46   int fillInUnixF
125c0 69 6c 65 28 0a 20 20 69 6e 74 20 68 2c 20 20 20  ile(.  int h,   
125d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
125e0 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72   Open file descr
125f0 69 70 74 6f 72 20 6f 6e 20 66 69 6c 65 20 62 65  iptor on file be
12600 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20  ing opened */.  
12610 69 6e 74 20 64 69 72 66 64 2c 0a 20 20 73 71 6c  int dirfd,.  sql
12620 69 74 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20  ite3_file *pId, 
12630 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20      /* Write to 
12640 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  the unixFile str
12650 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
12660 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
12670 6c 65 6e 61 6d 65 20 20 2f 2a 20 4e 61 6d 65 20  lename  /* Name 
12680 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e  of the file bein
12690 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 29 7b 0a 20  g opened */.){. 
126a0 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20   unixFile *pNew 
126b0 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 49  = (unixFile *)pI
126c0 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69  d;.  int rc;..#i
126d0 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a  fdef FD_CLOEXEC.
126e0 20 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54    fcntl(h, F_SET
126f0 46 44 2c 20 66 63 6e 74 6c 28 68 2c 20 46 5f 47  FD, fcntl(h, F_G
12700 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c  ETFD, 0) | FD_CL
12710 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 0a  OEXEC);.#endif..
12720 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a    enterMutex();.
12730 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49    rc = findLockI
12740 6e 66 6f 28 68 2c 20 26 70 4e 65 77 2d 3e 70 4c  nfo(h, &pNew->pL
12750 6f 63 6b 2c 20 26 70 4e 65 77 2d 3e 70 4f 70 65  ock, &pNew->pOpe
12760 6e 29 3b 0a 20 20 6c 65 61 76 65 4d 75 74 65 78  n);.  leaveMutex
12770 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  ();.  if( rc ){.
12780 20 20 20 20 63 6c 6f 73 65 28 68 29 3b 0a 20 20      close(h);.  
12790 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
127a0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 4f 53  NOMEM;.  }..  OS
127b0 54 52 41 43 45 33 28 22 4f 50 45 4e 20 20 20 20  TRACE3("OPEN    
127c0 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20 7a  %-3d %s\n", h, z
127d0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 70 4e 65  Filename);.  pNe
127e0 77 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20  w->dirfd = -1;. 
127f0 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20   pNew->h = h;.  
12800 70 4e 65 77 2d 3e 64 69 72 66 64 20 3d 20 64 69  pNew->dirfd = di
12810 72 66 64 3b 0a 20 20 53 45 54 5f 54 48 52 45 41  rfd;.  SET_THREA
12820 44 49 44 28 70 4e 65 77 29 3b 0a 0a 20 20 70 4e  DID(pNew);..  pN
12830 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 73  ew->pMethod = &s
12840 71 6c 69 74 65 33 55 6e 69 78 49 6f 4d 65 74 68  qlite3UnixIoMeth
12850 6f 64 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65  od;.  OpenCounte
12860 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  r(+1);.  return 
12870 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
12880 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
12890 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
128a0 4c 45 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a  LE */..#endif /*
128b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
128c0 4b 49 4f 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  KIO */./********
128d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
128e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
128f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12910 2a 2a 2a 0a 2a 2a 20 45 76 65 72 79 74 68 69 6e  ***.** Everythin
12920 67 20 61 62 6f 76 65 20 64 65 61 6c 73 20 77 69  g above deals wi
12930 74 68 20 66 69 6c 65 20 49 2f 4f 2e 20 20 45 76  th file I/O.  Ev
12940 65 72 79 74 68 69 6e 67 20 74 68 61 74 20 66 6f  erything that fo
12950 6c 6c 6f 77 73 20 64 65 61 6c 73 0a 2a 2a 20 77  llows deals.** w
12960 69 74 68 20 6f 74 68 65 72 20 6d 69 73 63 65 6c  ith other miscel
12970 6c 61 6e 6f 75 73 20 61 73 70 65 63 74 73 20 6f  lanous aspects o
12980 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  f the operating 
12990 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65  system interface
129a0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
129b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
129c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
129d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
129e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
129f0 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44  static int openD
12a00 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63  irectory(const c
12a10 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
12a20 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20 63 68 61  int *pFd){.  cha
12a30 72 20 2a 7a 44 69 72 6e 61 6d 65 3b 0a 20 20 69  r *zDirname;.  i
12a40 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 66 64 3b  nt ii;.  int fd;
12a50 0a 0a 20 20 7a 44 69 72 6e 61 6d 65 20 3d 20 28  ..  zDirname = (
12a60 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d  char *)sqlite3_m
12a70 61 6c 6c 6f 63 28 4d 41 58 5f 50 41 54 48 4e 41  alloc(MAX_PATHNA
12a80 4d 45 29 3b 0a 20 20 69 66 28 20 21 7a 44 69 72  ME);.  if( !zDir
12a90 6e 61 6d 65 20 29 7b 0a 20 20 20 20 72 65 74 75  name ){.    retu
12aa0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
12ab0 0a 20 20 7d 0a 20 20 73 74 72 6e 63 70 79 28 7a  .  }.  strncpy(z
12ac0 44 69 72 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61  Dirname, zFilena
12ad0 6d 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45  me, MAX_PATHNAME
12ae0 29 3b 0a 20 20 7a 44 69 72 6e 61 6d 65 5b 4d 41  );.  zDirname[MA
12af0 58 5f 50 41 54 48 4e 41 4d 45 2d 31 5d 20 3d 20  X_PATHNAME-1] = 
12b00 27 5c 30 27 3b 0a 20 20 66 6f 72 28 69 69 3d 73  '\0';.  for(ii=s
12b10 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b  trlen(zDirname);
12b20 20 69 69 3e 3d 30 20 26 26 20 7a 44 69 72 6e 61   ii>=0 && zDirna
12b30 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d  me[ii]!='/'; ii-
12b40 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20 29  -);.  if( ii>0 )
12b50 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69  {.    zDirname[i
12b60 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66  i] = '\0';.    f
12b70 64 20 3d 20 6f 70 65 6e 28 7a 44 69 72 6e 61 6d  d = open(zDirnam
12b80 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49  e, O_RDONLY|O_BI
12b90 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20 20 69 66  NARY, 0);.    if
12ba0 28 20 66 64 3e 30 20 29 7b 0a 23 69 66 64 65 66  ( fd>0 ){.#ifdef
12bb0 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20 20 20   FD_CLOEXEC.    
12bc0 20 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45    fcntl(fd, F_SE
12bd0 54 46 44 2c 20 66 63 6e 74 6c 28 66 64 2c 20 46  TFD, fcntl(fd, F
12be0 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f  _GETFD, 0) | FD_
12bf0 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66  CLOEXEC);.#endif
12c00 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 33 28  .      OSTRACE3(
12c10 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25 73  "OPENDIR %-3d %s
12c20 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d  \n", fd, zDirnam
12c30 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
12c40 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 44 69  sqlite3_free(zDi
12c50 72 6e 61 6d 65 29 3b 0a 20 20 2a 70 46 64 20 3d  rname);.  *pFd =
12c60 20 66 64 3b 0a 20 20 72 65 74 75 72 6e 20 28 66   fd;.  return (f
12c70 64 3e 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a 53 51  d>0?SQLITE_OK:SQ
12c80 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29 3b 0a  LITE_CANTOPEN);.
12c90 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 76 69 6f 75  }../*.** Previou
12ca0 73 6c 79 2c 20 74 68 65 20 53 51 4c 69 74 65 20  sly, the SQLite 
12cb0 4f 53 20 6c 61 79 65 72 20 75 73 65 64 20 74 68  OS layer used th
12cc0 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e  ree functions in
12cd0 20 70 6c 61 63 65 20 6f 66 20 74 68 69 73 0a 2a   place of this.*
12ce0 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  * one:.**.**    
12cf0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
12d00 61 64 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20  adWrite();.**   
12d10 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52    sqlite3OsOpenR
12d20 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20  eadOnly();.**   
12d30 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45    sqlite3OsOpenE
12d40 78 63 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a  xclusive();.**.*
12d50 2a 20 54 68 65 73 65 20 63 61 6c 6c 73 20 63 6f  * These calls co
12d60 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20  rrespond to the 
12d70 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e  following combin
12d80 61 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a  ations of flags:
12d90 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64 57  .**.**     ReadW
12da0 72 69 74 65 28 29 20 2d 3e 20 20 20 20 20 28 52  rite() ->     (R
12db0 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54  EADWRITE | CREAT
12dc0 45 29 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e  E).**     ReadOn
12dd0 6c 79 28 29 20 20 2d 3e 20 20 20 20 20 28 52 45  ly()  ->     (RE
12de0 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20  ADONLY) .**     
12df0 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20  OpenExclusive() 
12e00 2d 3e 20 28 52 45 41 44 57 52 49 54 45 20 7c 20  -> (READWRITE | 
12e10 43 52 45 41 54 45 20 7c 20 45 58 43 4c 55 53 49  CREATE | EXCLUSI
12e20 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c  VE).**.** The ol
12e30 64 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  d OpenExclusive(
12e40 29 20 61 63 63 65 70 74 65 64 20 61 20 62 6f 6f  ) accepted a boo
12e50 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20  lean argument - 
12e60 22 64 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a  "delFlag". If.**
12e70 20 74 72 75 65 2c 20 74 68 65 20 66 69 6c 65 20   true, the file 
12e80 77 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74  was configured t
12e90 6f 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  o be automatical
12ea0 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ly deleted when 
12eb0 74 68 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64  the.** file hand
12ec0 6c 65 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63  le closed. To ac
12ed0 68 69 65 76 65 20 74 68 65 20 73 61 6d 65 20 65  hieve the same e
12ee0 66 66 65 63 74 20 75 73 69 6e 67 20 74 68 69 73  ffect using this
12ef0 20 6e 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61   new .** interfa
12f00 63 65 2c 20 61 64 64 20 74 68 65 20 44 45 4c 45  ce, add the DELE
12f10 54 45 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74  TEONCLOSE flag t
12f20 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65  o those specifie
12f30 64 20 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20  d above for .** 
12f40 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 2e  OpenExclusive().
12f50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
12f60 6e 69 78 4f 70 65 6e 28 0a 20 20 76 6f 69 64 20  nixOpen(.  void 
12f70 2a 70 4e 6f 74 55 73 65 64 2c 20 0a 20 20 63 6f  *pNotUsed, .  co
12f80 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
12f90 20 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   .  sqlite3_file
12fa0 20 2a 70 46 69 6c 65 2c 0a 20 20 69 6e 74 20 66   *pFile,.  int f
12fb0 6c 61 67 73 2c 0a 20 20 69 6e 74 20 2a 70 4f 75  lags,.  int *pOu
12fc0 74 46 6c 61 67 73 0a 29 7b 0a 20 20 69 6e 74 20  tFlags.){.  int 
12fd0 66 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  fd = 0;         
12fe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
12ff0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 72 65  le descriptor re
13000 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e 28 29  turned by open()
13010 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64 20   */.  int dirfd 
13020 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20  = -1;           
13030 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72       /* Director
13040 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
13050 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 6c 61 67  r */.  int oflag
13060 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
13070 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74        /* Flags t
13080 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e 28 29  o pass to open()
13090 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20   */.  int eType 
130a0 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 46  = flags&0xFFFFFF
130b0 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20  00;  /* Type of 
130c0 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
130d0 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69  .  int isExclusi
130e0 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  ve  = (flags & S
130f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
13100 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44  SIVE);.  int isD
13110 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61  elete     = (fla
13120 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
13130 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b  _DELETEONCLOSE);
13140 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 20  .  int isCreate 
13150 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53      = (flags & S
13160 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
13170 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64  E);.  int isRead
13180 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20  only   = (flags 
13190 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
131a0 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69  ADONLY);.  int i
131b0 73 52 65 61 64 57 72 69 74 65 20 20 3d 20 28 66  sReadWrite  = (f
131c0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
131d0 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 0a  EN_READWRITE);..
131e0 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67    /* If creating
131f0 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61 69   a master or mai
13200 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20  n-file journal, 
13210 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
13220 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66  ll open.  ** a f
13230 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 6f  ile-descriptor o
13240 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  n the directory 
13250 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20 74  too. The first t
13260 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a 20  ime unixSync(). 
13270 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 68   ** is called th
13280 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65  e directory file
13290 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c   descriptor will
132a0 20 62 65 20 66 73 79 6e 63 28 29 65 64 20 61 6e   be fsync()ed an
132b0 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f  d close()d..  */
132c0 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 44 69 72  .  int isOpenDir
132d0 65 63 74 6f 72 79 20 3d 20 28 69 73 43 72 65 61  ectory = (isCrea
132e0 74 65 20 26 26 20 0a 20 20 20 20 20 20 28 65 54  te && .      (eT
132f0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
13300 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
13310 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
13320 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
13330 41 4c 29 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 43  AL).  );..  /* C
13340 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69  heck the followi
13350 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  ng statements ar
13360 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20  e true: .  **.  
13370 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c 79  **   (a) Exactly
13380 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44   one of the READ
13390 57 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e  WRITE and READON
133a0 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65  LY flags must be
133b0 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20   set, and .  ** 
133c0 20 20 28 62 29 20 69 66 20 43 52 45 41 54 45 20    (b) if CREATE 
133d0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41  is set, then REA
133e0 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f  DWRITE must also
133f0 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a   be set, and.  *
13400 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c 55  *   (c) if EXCLU
13410 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68 65  SIVE is set, the
13420 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c  n CREATE must al
13430 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a  so be set..  */.
13440 20 20 61 73 73 65 72 74 28 28 69 73 52 65 61 64    assert((isRead
13450 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61  only==0 || isRea
13460 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69  dWrite==0) && (i
13470 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73  sReadWrite || is
13480 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73  Readonly));.  as
13490 73 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30  sert(isCreate==0
134a0 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 29   || isReadWrite)
134b0 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45 78 63  ;.  assert(isExc
134c0 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43  lusive==0 || isC
134d0 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 41 73  reate);..  /* As
134e0 73 65 72 74 20 74 68 61 74 20 74 68 65 20 75 70  sert that the up
134f0 70 65 72 20 6c 61 79 65 72 20 68 61 73 20 73 65  per layer has se
13500 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69  t one of the "fi
13510 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20  le-type" flags. 
13520 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  */.  assert( eTy
13530 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
13540 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20  MAIN_DB      || 
13550 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
13560 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20 20  EN_TEMP_DB .    
13570 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
13580 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
13590 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d  URNAL || eType==
135a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
135b0 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20  _JOURNAL .      
135c0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
135d0 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
135e0 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  L   || eType==SQ
135f0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
13600 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 29 3b 0a 0a  _JOURNAL .  );..
13610 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79    if( isReadonly
13620 20 29 20 20 6f 66 6c 61 67 73 20 7c 3d 20 4f 5f   )  oflags |= O_
13630 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73  RDONLY;.  if( is
13640 52 65 61 64 57 72 69 74 65 20 29 20 6f 66 6c 61  ReadWrite ) ofla
13650 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20  gs |= O_RDWR;.  
13660 69 66 28 20 69 73 43 72 65 61 74 65 20 29 20 20  if( isCreate )  
13670 20 20 6f 66 6c 61 67 73 20 7c 3d 20 4f 5f 43 52    oflags |= O_CR
13680 45 41 54 3b 0a 20 20 69 66 28 20 69 73 45 78 63  EAT;.  if( isExc
13690 6c 75 73 69 76 65 20 29 20 6f 66 6c 61 67 73 20  lusive ) oflags 
136a0 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46  |= (O_EXCL|O_NOF
136b0 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 66 6c 61 67 73  OLLOW);.  oflags
136c0 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c 45   |= (O_LARGEFILE
136d0 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 20 20 6d  |O_BINARY);..  m
136e0 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20  emset(pFile, 0, 
136f0 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
13700 29 3b 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a  );.  fd = open(z
13710 50 61 74 68 2c 20 6f 66 6c 61 67 73 2c 20 69 73  Path, oflags, is
13720 44 65 6c 65 74 65 3f 30 36 30 30 3a 53 51 4c 49  Delete?0600:SQLI
13730 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
13740 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20  PERMISSIONS);.  
13750 69 66 28 20 66 64 3c 30 20 26 26 20 69 73 52 65  if( fd<0 && isRe
13760 61 64 57 72 69 74 65 20 26 26 20 21 69 73 45 78  adWrite && !isEx
13770 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 2f  clusive ){.    /
13780 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e  * Failed to open
13790 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 72 65   the file for re
137a0 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e  ad/write access.
137b0 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e 20   Try read-only. 
137c0 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20  */.    flags &= 
137d0 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  ~(SQLITE_OPEN_RE
137e0 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
137f0 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20  PEN_CREATE);.   
13800 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
13810 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
13820 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4f      return unixO
13830 70 65 6e 28 70 4e 6f 74 55 73 65 64 2c 20 7a 50  pen(pNotUsed, zP
13840 61 74 68 2c 20 70 46 69 6c 65 2c 20 66 6c 61 67  ath, pFile, flag
13850 73 2c 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20  s, pOutFlags);. 
13860 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b   }.  if( fd<0 ){
13870 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13880 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d  TE_CANTOPEN;.  }
13890 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20  .  if( isDelete 
138a0 29 7b 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 50  ){.    unlink(zP
138b0 61 74 68 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ath);.  }.  if( 
138c0 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20  pOutFlags ){.   
138d0 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c   *pOutFlags = fl
138e0 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ags;.  }..  asse
138f0 72 74 28 66 64 21 3d 30 29 3b 0a 20 20 69 66 28  rt(fd!=0);.  if(
13900 20 69 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79   isOpenDirectory
13910 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
13920 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 7a   openDirectory(z
13930 50 61 74 68 2c 20 26 64 69 72 66 64 29 3b 0a 20  Path, &dirfd);. 
13940 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
13950 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 63 6c  E_OK ){.      cl
13960 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 20 20 72  ose(fd);.      r
13970 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
13980 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69 6c    }.  return fil
13990 6c 49 6e 55 6e 69 78 46 69 6c 65 28 66 64 2c 20  lInUnixFile(fd, 
139a0 64 69 72 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50  dirfd, pFile, zP
139b0 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ath);.}../*.** D
139c0 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20 61  elete the file a
139d0 74 20 7a 50 61 74 68 2e 20 49 66 20 74 68 65 20  t zPath. If the 
139e0 64 69 72 53 79 6e 63 20 61 72 67 75 6d 65 6e 74  dirSync argument
139f0 20 69 73 20 74 72 75 65 2c 20 66 73 79 6e 63 28   is true, fsync(
13a00 29 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f  ).** the directo
13a10 72 79 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e  ry after deletin
13a20 67 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73  g the file..*/.s
13a30 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65  tatic int unixDe
13a40 6c 65 74 65 28 76 6f 69 64 20 2a 70 4e 6f 74 55  lete(void *pNotU
13a50 73 65 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  sed, const char 
13a60 2a 7a 50 61 74 68 2c 20 69 6e 74 20 64 69 72 53  *zPath, int dirS
13a70 79 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ync){.  int rc =
13a80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 53 69   SQLITE_OK;.  Si
13a90 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
13aa0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
13ab0 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 75 6e 6c  R_DELETE);.  unl
13ac0 69 6e 6b 28 7a 50 61 74 68 29 3b 0a 20 20 69 66  ink(zPath);.  if
13ad0 28 20 64 69 72 53 79 6e 63 20 29 7b 0a 20 20 20  ( dirSync ){.   
13ae0 20 69 6e 74 20 66 64 3b 0a 20 20 20 20 72 63 20   int fd;.    rc 
13af0 3d 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  = openDirectory(
13b00 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a 20 20 20  zPath, &fd);.   
13b10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13b20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
13b30 66 73 79 6e 63 28 66 64 29 20 29 7b 0a 20 20 20  fsync(fd) ){.   
13b40 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
13b50 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43  _IOERR_DIR_FSYNC
13b60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13b70 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d  close(fd);.    }
13b80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
13b90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20  ;.}../*.** Test 
13ba0 74 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66  the existance of
13bb0 20 6f 72 20 61 63 63 65 73 73 20 70 65 72 6d 69   or access permi
13bc0 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65 20 7a  ssions of file z
13bd0 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74 65 73  Path. The.** tes
13be0 74 20 70 65 72 66 6f 72 6d 65 64 20 64 65 70 65  t performed depe
13bf0 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  nds on the value
13c00 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a   of flags:.**.**
13c10 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45       SQLITE_ACCE
13c20 53 53 5f 45 58 49 53 54 53 3a 20 52 65 74 75 72  SS_EXISTS: Retur
13c30 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20  n 1 if the file 
13c40 65 78 69 73 74 73 0a 2a 2a 20 20 20 20 20 53 51  exists.**     SQ
13c50 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
13c60 57 52 49 54 45 3a 20 52 65 74 75 72 6e 20 31 20  WRITE: Return 1 
13c70 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 72  if the file is r
13c80 65 61 64 20 61 6e 64 20 77 72 69 74 61 62 6c 65  ead and writable
13c90 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  ..**     SQLITE_
13ca0 41 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a  ACCESS_READONLY:
13cb0 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
13cc0 20 66 69 6c 65 20 69 73 20 72 65 61 64 61 62 6c   file is readabl
13cd0 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  e..**.** Otherwi
13ce0 73 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  se return 0..*/.
13cf0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 41  static int unixA
13d00 63 63 65 73 73 28 76 6f 69 64 20 2a 70 4e 6f 74  ccess(void *pNot
13d10 55 73 65 64 2c 20 63 6f 6e 73 74 20 63 68 61 72  Used, const char
13d20 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c 61   *zPath, int fla
13d30 67 73 29 7b 0a 20 20 69 6e 74 20 61 6d 6f 64 65  gs){.  int amode
13d40 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61 67  ;.  switch( flag
13d50 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  s ){.    case SQ
13d60 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
13d70 54 53 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20  TS:.      amode 
13d80 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72  = F_OK;.      br
13d90 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
13da0 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
13db0 57 52 49 54 45 3a 0a 20 20 20 20 20 20 61 6d 6f  WRITE:.      amo
13dc0 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a  de = W_OK|R_OK;.
13dd0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13de0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
13df0 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 0a 20 20  ESS_READONLY:.  
13e00 20 20 20 20 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b      amode = R_OK
13e10 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
13e20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
13e30 20 20 20 61 73 73 65 72 74 28 21 22 49 6e 76 61     assert(!"Inva
13e40 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65  lid flags argume
13e50 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nt");.  }.  retu
13e60 72 6e 20 28 61 63 63 65 73 73 28 7a 50 61 74 68  rn (access(zPath
13e70 2c 20 61 6d 6f 64 65 29 3d 3d 30 29 3b 0a 7d 0a  , amode)==0);.}.
13e80 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
13e90 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e  temporary file n
13ea0 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42  ame in zBuf.  zB
13eb0 75 66 20 6d 75 73 74 20 62 65 20 62 69 67 20 65  uf must be big e
13ec0 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64  nough to.** hold
13ed0 20 61 74 20 6c 65 61 73 74 20 4d 41 58 5f 50 41   at least MAX_PA
13ee0 54 48 4e 41 4d 45 20 63 68 61 72 61 63 74 65 72  THNAME character
13ef0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
13f00 20 75 6e 69 78 47 65 74 54 65 6d 70 4e 61 6d 65   unixGetTempName
13f10 28 76 6f 69 64 20 2a 70 4e 6f 74 55 73 65 64 2c  (void *pNotUsed,
13f20 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
13f30 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
13f40 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a  r *azDirs[] = {.
13f50 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f 76       0,.     "/v
13f60 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f  ar/tmp",.     "/
13f70 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22  usr/tmp",.     "
13f80 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2e 22 2c  /tmp",.     ".",
13f90 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63  .  };.  static c
13fa0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
13fb0 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20  ar zChars[] =.  
13fc0 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d    "abcdefghijklm
13fd0 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20  nopqrstuvwxyz". 
13fe0 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c     "ABCDEFGHIJKL
13ff0 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a  MNOPQRSTUVWXYZ".
14000 20 20 20 20 22 30 31 32 33 34 35 36 37 38 39 22      "0123456789"
14010 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
14020 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
14030 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
14040 44 69 72 20 3d 20 22 2e 22 3b 0a 20 20 61 7a 44  Dir = ".";.  azD
14050 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33  irs[0] = sqlite3
14060 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b  _temp_directory;
14070 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
14080 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a  zeof(azDirs)/siz
14090 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20  eof(azDirs[0]); 
140a0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 7a  i++){.    if( az
140b0 44 69 72 73 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e  Dirs[i]==0 ) con
140c0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
140d0 74 61 74 28 61 7a 44 69 72 73 5b 69 5d 2c 20 26  tat(azDirs[i], &
140e0 62 75 66 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  buf) ) continue;
140f0 0a 20 20 20 20 69 66 28 20 21 53 5f 49 53 44 49  .    if( !S_ISDI
14100 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29  R(buf.st_mode) )
14110 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
14120 66 28 20 61 63 63 65 73 73 28 61 7a 44 69 72 73  f( access(azDirs
14130 5b 69 5d 2c 20 30 37 29 20 29 20 63 6f 6e 74 69  [i], 07) ) conti
14140 6e 75 65 3b 0a 20 20 20 20 7a 44 69 72 20 3d 20  nue;.    zDir = 
14150 61 7a 44 69 72 73 5b 69 5d 3b 0a 20 20 20 20 62  azDirs[i];.    b
14160 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 64 6f 7b 0a  reak;.  }.  do{.
14170 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
14180 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d  intf(MAX_PATHNAM
14190 45 2d 31 37 2c 20 7a 42 75 66 2c 20 22 25 73 2f  E-17, zBuf, "%s/
141a0 22 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49  "TEMP_FILE_PREFI
141b0 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20  X, zDir);.    j 
141c0 3d 20 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a  = strlen(zBuf);.
141d0 20 20 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f      sqlite3Rando
141e0 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b  mness(15, &zBuf[
141f0 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  j]);.    for(i=0
14200 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b  ; i<15; i++, j++
14210 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 6a 5d  ){.      zBuf[j]
14220 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b   = (char)zChars[
14230 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72   ((unsigned char
14240 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f  )zBuf[j])%(sizeo
14250 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a  f(zChars)-1) ];.
14260 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6a      }.    zBuf[j
14270 5d 20 3d 20 30 3b 0a 20 20 7d 77 68 69 6c 65 28  ] = 0;.  }while(
14280 20 61 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d   access(zBuf,0)=
14290 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  =0 );.  return S
142a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
142b0 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74  .** Turn a relat
142c0 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74  ive pathname int
142d0 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  o a full pathnam
142e0 65 2e 20 54 68 65 20 72 65 6c 61 74 69 76 65 20  e. The relative 
142f0 70 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f 72 65  path.** is store
14300 64 20 61 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69  d as a nul-termi
14310 6e 61 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20  nated string in 
14320 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
14330 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50 61 74  ed to by.** zPat
14340 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70  h. .**.** zOut p
14350 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65  oints to a buffe
14360 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 73 71  r of at least sq
14370 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68  lite3_vfs.mxPath
14380 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a 20 28  name bytes .** (
14390 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20 4d 41  in this case, MA
143a0 58 5f 50 41 54 48 4e 41 4d 45 20 62 79 74 65 73  X_PATHNAME bytes
143b0 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61 74 68  ). The full-path
143c0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a   is written to.*
143d0 2a 20 74 68 69 73 20 62 75 66 66 65 72 20 62 65  * this buffer be
143e0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
143f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
14400 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 76  ixFullPathname(v
14410 6f 69 64 20 2a 70 4e 6f 74 55 73 65 64 2c 20 63  oid *pNotUsed, c
14420 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
14430 2c 20 63 68 61 72 20 2a 7a 4f 75 74 29 7b 0a 20  , char *zOut){. 
14440 20 7a 4f 75 74 5b 4d 41 58 5f 50 41 54 48 4e 41   zOut[MAX_PATHNA
14450 4d 45 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  ME-1] = '\0';.  
14460 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f  if( zPath[0]=='/
14470 27 20 29 7b 0a 20 20 20 20 73 74 72 6e 63 70 79  ' ){.    strncpy
14480 28 7a 4f 75 74 2c 20 7a 50 61 74 68 2c 20 4d 41  (zOut, zPath, MA
14490 58 5f 50 41 54 48 4e 41 4d 45 2d 31 29 3b 0a 20  X_PATHNAME-1);. 
144a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
144b0 6e 43 77 64 3b 0a 20 20 20 20 69 66 28 20 67 65  nCwd;.    if( ge
144c0 74 63 77 64 28 7a 4f 75 74 2c 20 4d 41 58 5f 50  tcwd(zOut, MAX_P
144d0 41 54 48 4e 41 4d 45 2d 31 29 3d 3d 30 20 29 7b  ATHNAME-1)==0 ){
144e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
144f0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
14500 7d 0a 20 20 20 20 6e 43 77 64 20 3d 20 73 74 72  }.    nCwd = str
14510 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7a  len(zOut);.    z
14520 4f 75 74 5b 6e 43 77 64 5d 20 3d 20 27 2f 27 3b  Out[nCwd] = '/';
14530 0a 20 20 20 20 73 74 72 6e 63 70 79 28 26 7a 4f  .    strncpy(&zO
14540 75 74 5b 6e 43 77 64 2b 31 5d 2c 20 7a 50 61 74  ut[nCwd+1], zPat
14550 68 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2d  h, MAX_PATHNAME-
14560 31 2d 6e 43 77 64 2d 31 29 3b 0a 20 20 7d 0a 20  1-nCwd-1);.  }. 
14570 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14580 4b 3b 0a 0a 23 69 66 20 30 0a 20 20 2f 2a 0a 20  K;..#if 0.  /*. 
14590 20 2a 2a 20 52 65 6d 6f 76 65 20 22 2f 2e 2f 22   ** Remove "/./"
145a0 20 70 61 74 68 20 65 6c 65 6d 65 6e 74 73 20 61   path elements a
145b0 6e 64 20 63 6f 6e 76 65 72 74 20 22 2f 41 2f 2e  nd convert "/A/.
145c0 2f 22 20 70 61 74 68 20 65 6c 65 6d 65 6e 74 73  /" path elements
145d0 0a 20 20 2a 2a 20 74 6f 20 6a 75 73 74 20 22 2f  .  ** to just "/
145e0 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  "..  */.  if( zF
145f0 75 6c 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ull ){.    int i
14600 2c 20 6a 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6a  , j;.    for(i=j
14610 3d 30 3b 20 7a 46 75 6c 6c 5b 69 5d 3b 20 69 2b  =0; zFull[i]; i+
14620 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 46  +){.      if( zF
14630 75 6c 6c 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20  ull[i]=='/' ){. 
14640 20 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c         if( zFull
14650 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e  [i+1]=='/' ) con
14660 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
14670 66 28 20 7a 46 75 6c 6c 5b 69 2b 31 5d 3d 3d 27  f( zFull[i+1]=='
14680 2e 27 20 26 26 20 7a 46 75 6c 6c 5b 69 2b 32 5d  .' && zFull[i+2]
14690 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='/' ){.       
146a0 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20     i += 1;.     
146b0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
146c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
146d0 20 69 66 28 20 7a 46 75 6c 6c 5b 69 2b 31 5d 3d   if( zFull[i+1]=
146e0 3d 27 2e 27 20 26 26 20 7a 46 75 6c 6c 5b 69 2b  ='.' && zFull[i+
146f0 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 46 75 6c 6c  2]=='.' && zFull
14700 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  [i+3]=='/' ){.  
14710 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a          while( j
14720 3e 30 20 26 26 20 7a 46 75 6c 6c 5b 6a 2d 31 5d  >0 && zFull[j-1]
14730 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a  !='/' ){ j--; }.
14740 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 33            i += 3
14750 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
14760 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
14770 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 46        }.      zF
14780 75 6c 6c 5b 6a 2b 2b 5d 20 3d 20 7a 46 75 6c 6c  ull[j++] = zFull
14790 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  [i];.    }.    z
147a0 46 75 6c 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d  Full[j] = 0;.  }
147b0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 23 69 66 6e  .#endif.}...#ifn
147c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
147d0 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f  LOAD_EXTENSION./
147e0 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20  *.** Interfaces 
147f0 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68  for opening a sh
14800 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69  ared library, fi
14810 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e  nding entry poin
14820 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ts.** within the
14830 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
14840 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65   and closing the
14850 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e   shared library.
14860 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c  .*/.#include <dl
14870 66 63 6e 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f  fcn.h>.static vo
14880 69 64 20 2a 75 6e 69 78 44 6c 4f 70 65 6e 28 76  id *unixDlOpen(v
14890 6f 69 64 20 2a 70 4e 6f 74 55 73 65 64 2c 20 63  oid *pNotUsed, c
148a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
148b0 6e 61 6d 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  name){.  return 
148c0 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  dlopen(zFilename
148d0 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c  , RTLD_NOW | RTL
148e0 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 73 74 61  D_GLOBAL);.}.sta
148f0 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 45  tic void unixDlE
14900 72 72 6f 72 28 76 6f 69 64 20 2a 70 4e 6f 74 55  rror(void *pNotU
14910 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  sed, int nBuf, c
14920 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20  har *zBufOut){. 
14930 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 65   char *zErr;.  e
14940 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a  nterMutex();.  z
14950 45 72 72 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b  Err = dlerror();
14960 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20  .  if( zErr ){. 
14970 20 20 20 73 74 72 6e 63 70 79 28 7a 42 75 66 4f     strncpy(zBufO
14980 75 74 2c 20 7a 45 72 72 2c 20 6e 42 75 66 2d 31  ut, zErr, nBuf-1
14990 29 3b 0a 20 20 20 20 7a 42 75 66 4f 75 74 5b 6e  );.    zBufOut[n
149a0 42 75 66 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20  Buf-1] = '\0';. 
149b0 20 7d 65 6c 73 65 20 69 66 28 6e 42 75 66 3e 30   }else if(nBuf>0
149c0 29 20 7b 0a 20 20 20 20 7a 42 75 66 4f 75 74 5b  ) {.    zBufOut[
149d0 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20  0] = '\0';.  }. 
149e0 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d   leaveMutex();.}
149f0 0a 76 6f 69 64 20 2a 75 6e 69 78 44 6c 53 79 6d  .void *unixDlSym
14a00 28 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 2c 20  (void *pHandle, 
14a10 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6d  const char *zSym
14a20 62 6f 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 64  bol){.  return d
14a30 6c 73 79 6d 28 70 48 61 6e 64 6c 65 2c 20 7a 53  lsym(pHandle, zS
14a40 79 6d 62 6f 6c 29 3b 0a 7d 0a 76 6f 69 64 20 75  ymbol);.}.void u
14a50 6e 69 78 44 6c 43 6c 6f 73 65 28 76 6f 69 64 20  nixDlClose(void 
14a60 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 64 6c 63  *pHandle){.  dlc
14a70 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a 7d  lose(pHandle);.}
14a80 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c  .#else /* if SQL
14a90 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
14aa0 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e  TENSION is defin
14ab0 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ed: */.  #define
14ac0 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a 20   unixDlOpen  0. 
14ad0 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 45   #define unixDlE
14ae0 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65  rror 0.  #define
14af0 20 75 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a 20   unixDlSym   0. 
14b00 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 43   #define unixDlC
14b10 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  lose 0.#endif../
14b20 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75 66 20  *.** Write nBuf 
14b30 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20  bytes of random 
14b40 64 61 74 61 20 74 6f 20 74 68 65 20 73 75 70 70  data to the supp
14b50 6c 69 65 64 20 62 75 66 66 65 72 20 7a 42 75 66  lied buffer zBuf
14b60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14b70 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28 76  unixRandomness(v
14b80 6f 69 64 20 2a 70 4e 6f 74 55 73 65 64 2c 20 69  oid *pNotUsed, i
14b90 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
14ba0 42 75 66 29 7b 0a 0a 20 20 61 73 73 65 72 74 28  Buf){..  assert(
14bb0 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74 69  nBuf>=(sizeof(ti
14bc0 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e 74  me_t)+sizeof(int
14bd0 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68 61  )));..  /* We ha
14be0 76 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ve to initialize
14bf0 20 7a 42 75 66 20 74 6f 20 70 72 65 76 65 6e 74   zBuf to prevent
14c00 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72   valgrind from r
14c10 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72  eporting.  ** er
14c20 72 6f 72 73 2e 20 20 54 68 65 20 72 65 70 6f 72  rors.  The repor
14c30 74 73 20 69 73 73 75 65 64 20 62 79 20 76 61 6c  ts issued by val
14c40 67 72 69 6e 64 20 61 72 65 20 69 6e 63 6f 72 72  grind are incorr
14c50 65 63 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20  ect - we would. 
14c60 20 2a 2a 20 70 72 65 66 65 72 20 74 68 61 74 20   ** prefer that 
14c70 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62  the randomness b
14c80 65 20 69 6e 63 72 65 61 73 65 64 20 62 79 20 6d  e increased by m
14c90 61 6b 69 6e 67 20 75 73 65 20 6f 66 20 74 68 65  aking use of the
14ca0 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69  .  ** uninitiali
14cb0 7a 65 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75  zed space in zBu
14cc0 66 20 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64  f - but valgrind
14cd0 20 65 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20   errors tend to 
14ce0 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20  worry.  ** some 
14cf0 75 73 65 72 73 2e 20 20 52 61 74 68 65 72 20 74  users.  Rather t
14d00 68 61 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65  han argue, it se
14d10 65 6d 73 20 65 61 73 69 65 72 20 6a 75 73 74 20  ems easier just 
14d20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20  to initialize.  
14d30 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72  ** the whole arr
14d40 61 79 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76  ay and silence v
14d50 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66  algrind, even if
14d60 20 74 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73   that means less
14d70 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a   randomness.  **
14d80 20 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 73   in the random s
14d90 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  eed..  **.  ** W
14da0 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e 69  hen testing, ini
14db0 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d  tializing zBuf[]
14dc0 20 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20   to zero is all 
14dd0 77 65 20 64 6f 2e 20 20 54 68 61 74 20 6d 65 61  we do.  That mea
14de0 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20  ns.  ** that we 
14df0 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 73  always use the s
14e00 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65  ame random numbe
14e10 72 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68 69  r sequence.  Thi
14e20 73 20 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a  s makes the.  **
14e30 20 74 65 73 74 73 20 72 65 70 65 61 74 61 62 6c   tests repeatabl
14e40 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  e..  */.  memset
14e50 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b  (zBuf, 0, nBuf);
14e60 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
14e70 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20  LITE_TEST).  {. 
14e80 20 20 20 69 6e 74 20 70 69 64 2c 20 66 64 3b 0a     int pid, fd;.
14e90 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 22 2f      fd = open("/
14ea0 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f  dev/urandom", O_
14eb0 52 44 4f 4e 4c 59 29 3b 0a 20 20 20 20 69 66 28  RDONLY);.    if(
14ec0 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 74   fd<0 ){.      t
14ed0 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20 20 74  ime_t t;.      t
14ee0 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 20 6d  ime(&t);.      m
14ef0 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74 2c 20  emcpy(zBuf, &t, 
14f00 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20 20  sizeof(t));.    
14f10 20 20 70 69 64 20 3d 20 67 65 74 70 69 64 28 29    pid = getpid()
14f20 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
14f30 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 29 5d 2c  zBuf[sizeof(t)],
14f40 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69   &pid, sizeof(pi
14f50 64 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  d));.    }else{.
14f60 20 20 20 20 20 20 72 65 61 64 28 66 64 2c 20 7a        read(fd, z
14f70 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20 20 20 20  Buf, nBuf);.    
14f80 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20    close(fd);.   
14f90 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
14fa0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14fb0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65  ;.}.../*.** Slee
14fc0 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77  p for a little w
14fd0 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68  hile.  Return th
14fe0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
14ff0 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61   slept..** The a
15000 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e  rgument is the n
15010 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65  umber of microse
15020 63 6f 6e 64 73 20 77 65 20 77 61 6e 74 20 74 6f  conds we want to
15030 20 73 6c 65 65 70 2e 0a 2a 2f 0a 73 74 61 74 69   sleep..*/.stati
15040 63 20 69 6e 74 20 75 6e 69 78 53 6c 65 65 70 28  c int unixSleep(
15050 76 6f 69 64 20 2a 70 4e 6f 74 55 73 65 64 2c 20  void *pNotUsed, 
15060 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  int microseconds
15070 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  ){.#if defined(H
15080 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48  AVE_USLEEP) && H
15090 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c  AVE_USLEEP.  usl
150a0 65 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73  eep(microseconds
150b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72  );.  return micr
150c0 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a  oseconds;.#else.
150d0 20 20 69 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20    int seconds = 
150e0 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39  (microseconds+99
150f0 39 39 39 39 29 2f 31 30 30 30 30 30 30 3b 0a 20  9999)/1000000;. 
15100 20 73 6c 65 65 70 28 73 65 63 6f 6e 64 73 29 3b   sleep(seconds);
15110 0a 20 20 72 65 74 75 72 6e 20 73 65 63 6f 6e 64  .  return second
15120 73 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  s;.#endif.}../*.
15130 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
15140 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65   variable, if se
15150 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  t to a non-zero 
15160 76 61 6c 75 65 2c 20 62 65 63 6f 6d 65 73 20 74  value, becomes t
15170 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 72 65 74  he result.** ret
15180 75 72 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  urned from sqlit
15190 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28  e3OsCurrentTime(
151a0 29 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  ).  This is used
151b0 20 66 6f 72 20 74 65 73 74 69 6e 67 2e 0a 2a 2f   for testing..*/
151c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
151d0 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
151e0 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30  current_time = 0
151f0 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
15200 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  Find the current
15210 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72   time (in Univer
15220 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20  sal Coordinated 
15230 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68  Time).  Write th
15240 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d  e.** current tim
15250 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20  e and date as a 
15260 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65  Julian Day numbe
15270 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e  r into *prNow an
15280 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20  d.** return 0.  
15290 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
152a0 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61  time and date ca
152b0 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a  nnot be found..*
152c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
152d0 78 43 75 72 72 65 6e 74 54 69 6d 65 28 76 6f 69  xCurrentTime(voi
152e0 64 20 2a 70 4e 6f 74 55 73 65 64 2c 20 64 6f 75  d *pNotUsed, dou
152f0 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 23 69 66  ble *prNow){.#if
15300 64 65 66 20 4e 4f 5f 47 45 54 54 4f 44 0a 20 20  def NO_GETTOD.  
15310 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65  time_t t;.  time
15320 28 26 74 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d  (&t);.  *prNow =
15330 20 74 2f 38 36 34 30 30 2e 30 20 2b 20 32 34 34   t/86400.0 + 244
15340 30 35 38 37 2e 35 3b 0a 23 65 6c 73 65 0a 20 20  0587.5;.#else.  
15350 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73  struct timeval s
15360 4e 6f 77 3b 0a 20 20 67 65 74 74 69 6d 65 6f 66  Now;.  gettimeof
15370 64 61 79 28 26 73 4e 6f 77 2c 20 30 29 3b 0a 20  day(&sNow, 0);. 
15380 20 2a 70 72 4e 6f 77 20 3d 20 32 34 34 30 35 38   *prNow = 244058
15390 37 2e 35 20 2b 20 73 4e 6f 77 2e 74 76 5f 73 65  7.5 + sNow.tv_se
153a0 63 2f 38 36 34 30 30 2e 30 20 2b 20 73 4e 6f 77  c/86400.0 + sNow
153b0 2e 74 76 5f 75 73 65 63 2f 38 36 34 30 30 30 30  .tv_usec/8640000
153c0 30 30 30 30 2e 30 3b 0a 23 65 6e 64 69 66 0a 23  0000.0;.#endif.#
153d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
153e0 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  T.  if( sqlite3_
153f0 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a  current_time ){.
15400 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 73 71 6c      *prNow = sql
15410 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
15420 65 2f 38 36 34 30 30 2e 30 20 2b 20 32 34 34 30  e/86400.0 + 2440
15430 35 38 37 2e 35 3b 0a 20 20 7d 0a 23 65 6e 64 69  587.5;.  }.#endi
15440 66 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  f.  return 0;.}.
15450 0a 0a 73 71 6c 69 74 65 33 5f 76 66 73 20 73 71  ..sqlite3_vfs sq
15460 6c 69 74 65 33 44 65 66 61 75 6c 74 56 66 73 20  lite3DefaultVfs 
15470 3d 20 7b 0a 20 20 31 2c 20 20 20 20 20 20 20 20  = {.  1,        
15480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
15490 72 73 69 6f 6e 20 2a 2f 0a 20 20 73 69 7a 65 6f  rsion */.  sizeo
154a0 66 28 75 6e 69 78 46 69 6c 65 29 2c 20 20 20 2f  f(unixFile),   /
154b0 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20  * szOsFile */.  
154c0 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 20 20  MAX_PATHNAME,   
154d0 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d      /* mxPathnam
154e0 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  e */.  0,       
154f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 52             /* nR
15500 65 66 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  ef */.  0,      
15510 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 76              /* v
15520 66 73 4d 75 74 65 78 20 2a 2f 0a 20 20 30 2c 20  fsMutex */.  0, 
15530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15540 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 30   /* pNext */.  0
15550 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15560 20 20 20 2f 2a 20 70 50 72 65 76 20 2a 2f 0a 20     /* pPrev */. 
15570 20 22 75 6e 69 78 22 2c 20 20 20 20 20 20 20 20   "unix",        
15580 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f       /* zName */
15590 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
155a0 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61         /* pAppDa
155b0 74 61 20 2a 2f 0a 0a 20 20 75 6e 69 78 4f 70 65  ta */..  unixOpe
155c0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n,           /* 
155d0 78 4f 70 65 6e 20 2a 2f 0a 20 20 75 6e 69 78 44  xOpen */.  unixD
155e0 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 2f  elete,         /
155f0 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 75  * xDelete */.  u
15600 6e 69 78 41 63 63 65 73 73 2c 20 20 20 20 20 20  nixAccess,      
15610 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f     /* xAccess */
15620 0a 20 20 75 6e 69 78 47 65 74 54 65 6d 70 4e 61  .  unixGetTempNa
15630 6d 65 2c 20 20 20 20 2f 2a 20 78 47 65 74 54 65  me,    /* xGetTe
15640 6d 70 4e 61 6d 65 20 2a 2f 0a 20 20 75 6e 69 78  mpName */.  unix
15650 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20  FullPathname,   
15660 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  /* xFullPathname
15670 20 2a 2f 0a 20 20 75 6e 69 78 44 6c 4f 70 65 6e   */.  unixDlOpen
15680 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c  ,         /* xDl
15690 4f 70 65 6e 20 2a 2f 0a 20 20 75 6e 69 78 44 6c  Open */.  unixDl
156a0 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 2f 2a  Error,        /*
156b0 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 75   xDlError */.  u
156c0 6e 69 78 44 6c 53 79 6d 2c 20 20 20 20 20 20 20  nixDlSym,       
156d0 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a     /* xDlSym */.
156e0 20 20 75 6e 69 78 44 6c 43 6c 6f 73 65 2c 20 20    unixDlClose,  
156f0 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73        /* xDlClos
15700 65 20 2a 2f 0a 20 20 75 6e 69 78 52 61 6e 64 6f  e */.  unixRando
15710 6d 6e 65 73 73 2c 20 20 20 20 20 2f 2a 20 78 52  mness,     /* xR
15720 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 75  andomness */.  u
15730 6e 69 78 53 6c 65 65 70 2c 20 20 20 20 20 20 20  nixSleep,       
15740 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a     /* xSleep */.
15750 20 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d    unixCurrentTim
15760 65 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e  e     /* xCurren
15770 74 54 69 6d 65 20 2a 2f 0a 7d 3b 0a 20 0a 23 65  tTime */.};. .#e
15780 6e 64 69 66 20 2f 2a 20 4f 53 5f 55 4e 49 58 20  ndif /* OS_UNIX 
15790 2a 2f 0a                                         */.