/ Hex Artifact Content
Login

Artifact bf86c474a5febb67684b967a8d2816b1d7f26891:


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 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
0b30: 68 61 72 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20  har fullSync;   
0b40: 2f 2a 20 55 73 65 20 46 5f 46 55 4c 4c 53 59 4e  /* Use F_FULLSYN
0b50: 43 20 69 66 20 61 76 61 69 6c 61 62 6c 65 20 2a  C if available *
0b60: 2f 0a 20 20 69 6e 74 20 64 69 72 66 64 3b 20 20  /.  int dirfd;  
0b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0b80: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
0b90: 20 66 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f   for the directo
0ba0: 72 79 20 2a 2f 0a 20 20 69 36 34 20 6f 66 66 73  ry */.  i64 offs
0bb0: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
0bc0: 20 20 2f 2a 20 53 65 65 6b 20 6f 66 66 73 65 74    /* Seek offset
0bd0: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
0be0: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 20  E_UNIX_THREADS. 
0bf0: 20 70 74 68 72 65 61 64 5f 74 20 74 69 64 3b 20   pthread_t tid; 
0c00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
0c10: 65 20 74 68 72 65 61 64 20 74 68 61 74 20 22 6f  e thread that "o
0c20: 77 6e 73 22 20 74 68 69 73 20 4f 73 46 69 6c 65  wns" this OsFile
0c30: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 0a   */.#endif.};...
0c40: 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 74 68  /*.** Provide th
0c50: 65 20 61 62 69 6c 69 74 79 20 74 6f 20 6f 76 65  e ability to ove
0c60: 72 72 69 64 65 20 73 6f 6d 65 20 4f 53 2d 6c 61  rride some OS-la
0c70: 79 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 64 75  yer functions du
0c80: 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67 2e  ring.** testing.
0c90: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
0ca0: 6f 20 73 69 6d 75 6c 61 74 65 20 4f 53 20 63 72  o simulate OS cr
0cb0: 61 73 68 65 73 20 74 6f 20 76 65 72 69 66 79 20  ashes to verify 
0cc0: 74 68 61 74 20 0a 2a 2a 20 63 6f 6d 6d 69 74 73  that .** commits
0cd0: 20 61 72 65 20 61 74 6f 6d 69 63 20 65 76 65 6e   are atomic even
0ce0: 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
0cf0: 20 61 6e 20 4f 53 20 63 72 61 73 68 2e 0a 2a 2f   an OS crash..*/
0d00: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
0d10: 52 41 53 48 5f 54 45 53 54 0a 20 20 65 78 74 65  RASH_TEST.  exte
0d20: 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 43 72  rn int sqlite3Cr
0d30: 61 73 68 54 65 73 74 45 6e 61 62 6c 65 3b 0a 20  ashTestEnable;. 
0d40: 20 69 6e 74 20 73 71 6c 69 74 65 33 43 72 61 73   int sqlite3Cras
0d50: 68 46 69 6c 65 57 72 61 70 28 73 71 6c 69 74 65  hFileWrap(sqlite
0d60: 33 5f 66 69 6c 65 20 2a 2c 20 63 6f 6e 73 74 20  3_file *, const 
0d70: 63 68 61 72 20 2a 2c 20 73 71 6c 69 74 65 33 5f  char *, sqlite3_
0d80: 66 69 6c 65 20 2a 2a 29 3b 0a 20 20 73 74 61 74  file **);.  stat
0d90: 69 63 20 69 6e 74 20 43 52 41 53 48 5f 54 45 53  ic int CRASH_TES
0da0: 54 5f 4f 56 45 52 52 49 44 45 28 63 6f 6e 73 74  T_OVERRIDE(const
0db0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 73 71   char *zFile, sq
0dc0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 2a 70 49 64  lite3_file **pId
0dd0: 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 20 20 69  , int rc){.    i
0de0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
0df0: 20 26 26 20 73 71 6c 69 74 65 33 43 72 61 73 68   && sqlite3Crash
0e00: 54 65 73 74 45 6e 61 62 6c 65 20 29 7b 0a 20 20  TestEnable ){.  
0e10: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
0e20: 43 72 61 73 68 46 69 6c 65 57 72 61 70 28 2a 70  CrashFileWrap(*p
0e30: 49 64 2c 20 7a 46 69 6c 65 2c 20 70 49 64 29 3b  Id, zFile, pId);
0e40: 20 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75   .    }.    retu
0e50: 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6c 73 65  rn rc;.  }.#else
0e60: 0a 23 20 64 65 66 69 6e 65 20 43 52 41 53 48 5f  .# define CRASH_
0e70: 54 45 53 54 5f 4f 56 45 52 52 49 44 45 28 41 2c  TEST_OVERRIDE(A,
0e80: 42 2c 43 29 20 43 0a 23 65 6e 64 69 66 0a 0a 0a  B,C) C.#endif...
0e90: 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63 6f  /*.** Include co
0ea0: 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f  de that is commo
0eb0: 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20  n to all os_*.c 
0ec0: 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64  files.*/.#includ
0ed0: 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a  e "os_common.h".
0ee0: 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e  ./*.** Do not in
0ef0: 63 6c 75 64 65 20 61 6e 79 20 6f 66 20 74 68 65  clude any of the
0f00: 20 46 69 6c 65 20 49 2f 4f 20 69 6e 74 65 72 66   File I/O interf
0f10: 61 63 65 20 70 72 6f 63 65 64 75 72 65 73 20 69  ace procedures i
0f20: 66 20 74 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f  f the.** SQLITE_
0f30: 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 6d 61 63 72  OMIT_DISKIO macr
0f40: 6f 20 69 73 20 64 65 66 69 6e 65 64 20 28 69 6e  o is defined (in
0f50: 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 74 68  dicating that th
0f60: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 77 69  e database.** wi
0f70: 6c 6c 20 62 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  ll be in-memory 
0f80: 6f 6e 6c 79 29 0a 2a 2f 0a 23 69 66 6e 64 65 66  only).*/.#ifndef
0f90: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
0fa0: 4b 49 4f 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69  KIO.../*.** Defi
0fb0: 6e 65 20 76 61 72 69 6f 75 73 20 6d 61 63 72 6f  ne various macro
0fc0: 73 20 74 68 61 74 20 61 72 65 20 6d 69 73 73 69  s that are missi
0fd0: 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73  ng from some sys
0fe0: 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tems..*/.#ifndef
0ff0: 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64   O_LARGEFILE.# d
1000: 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c  efine O_LARGEFIL
1010: 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  E 0.#endif.#ifde
1020: 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  f SQLITE_DISABLE
1030: 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c  _LFS.# undef O_L
1040: 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e  ARGEFILE.# defin
1050: 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a  e O_LARGEFILE 0.
1060: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f  #endif.#ifndef O
1070: 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69  _NOFOLLOW.# defi
1080: 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a  ne O_NOFOLLOW 0.
1090: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f  #endif.#ifndef O
10a0: 5f 42 49 4e 41 52 59 0a 23 20 64 65 66 69 6e 65  _BINARY.# define
10b0: 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23 65 6e 64   O_BINARY 0.#end
10c0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a  if../*.** The DJ
10d0: 47 50 50 20 63 6f 6d 70 69 6c 65 72 20 65 6e 76  GPP compiler env
10e0: 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d  ironment looks m
10f0: 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69 78 2c  ostly like Unix,
1100: 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63 6b 73   but it.** lacks
1110: 20 74 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73   the fcntl() sys
1120: 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20 72 65  tem call.  So re
1130: 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 29 20 74  define fcntl() t
1140: 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  o be something.*
1150: 2a 20 74 68 61 74 20 61 6c 77 61 79 73 20 73 75  * that always su
1160: 63 63 65 65 64 73 2e 20 20 54 68 69 73 20 6d 65  cceeds.  This me
1170: 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69 6e 67  ans that locking
1180: 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
1190: 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50 2e 20  under.** DJGPP. 
11a0: 20 42 75 74 20 69 74 27 73 20 44 4f 53 20 2d 20   But it's DOS - 
11b0: 77 68 61 74 20 64 69 64 20 79 6f 75 20 65 78 70  what did you exp
11c0: 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65 66 20 5f  ect?.*/.#ifdef _
11d0: 5f 44 4a 47 50 50 5f 5f 0a 23 20 64 65 66 69 6e  _DJGPP__.# defin
11e0: 65 20 66 63 6e 74 6c 28 41 2c 42 2c 43 29 20 30  e fcntl(A,B,C) 0
11f0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1200: 68 65 20 74 68 72 65 61 64 69 64 20 6d 61 63 72  he threadid macr
1210: 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f 20 74 68  o resolves to th
1220: 65 20 74 68 72 65 61 64 2d 69 64 20 6f 72 20 74  e thread-id or t
1230: 6f 20 30 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a  o 0.  Used for.*
1240: 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  * testing and de
1250: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
1260: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55  .#ifdef SQLITE_U
1270: 4e 49 58 5f 54 48 52 45 41 44 53 0a 23 64 65 66  NIX_THREADS.#def
1280: 69 6e 65 20 74 68 72 65 61 64 69 64 20 70 74 68  ine threadid pth
1290: 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65 6c 73  read_self().#els
12a0: 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61 64  e.#define thread
12b0: 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  id 0.#endif../*.
12c0: 2a 2a 20 53 65 74 20 6f 72 20 63 68 65 63 6b 20  ** Set or check 
12d0: 74 68 65 20 4f 73 46 69 6c 65 2e 74 69 64 20 66  the OsFile.tid f
12e0: 69 65 6c 64 2e 20 20 54 68 69 73 20 66 69 65 6c  ield.  This fiel
12f0: 64 20 69 73 20 73 65 74 20 77 68 65 6e 20 61 6e  d is set when an
1300: 20 4f 73 46 69 6c 65 0a 2a 2a 20 69 73 20 66 69   OsFile.** is fi
1310: 72 73 74 20 6f 70 65 6e 65 64 2e 20 20 41 6c 6c  rst opened.  All
1320: 20 73 75 62 73 65 71 75 65 6e 74 20 75 73 65 73   subsequent uses
1330: 20 6f 66 20 74 68 65 20 4f 73 46 69 6c 65 20 76   of the OsFile v
1340: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 0a 2a  erify that the.*
1350: 2a 20 73 61 6d 65 20 74 68 72 65 61 64 20 69 73  * same thread is
1360: 20 6f 70 65 72 61 74 69 6e 67 20 6f 6e 20 74 68   operating on th
1370: 65 20 4f 73 46 69 6c 65 2e 20 20 53 6f 6d 65 20  e OsFile.  Some 
1380: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
1390: 73 20 64 6f 0a 2a 2a 20 6e 6f 74 20 61 6c 6c 6f  s do.** not allo
13a0: 77 20 6c 6f 63 6b 73 20 74 6f 20 62 65 20 6f 76  w locks to be ov
13b0: 65 72 72 69 64 64 65 6e 20 62 79 20 6f 74 68 65  erridden by othe
13c0: 72 20 74 68 72 65 61 64 73 20 61 6e 64 20 74 68  r threads and th
13d0: 61 74 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a  at restriction.*
13e0: 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 73 71 6c  * means that sql
13f0: 69 74 65 33 2a 20 64 61 74 61 62 61 73 65 20 68  ite3* database h
1400: 61 6e 64 6c 65 73 20 63 61 6e 6e 6f 74 20 62 65  andles cannot be
1410: 20 6d 6f 76 65 64 20 66 72 6f 6d 20 6f 6e 65 20   moved from one 
1420: 74 68 72 65 61 64 0a 2a 2a 20 74 6f 20 61 6e 6f  thread.** to ano
1430: 74 68 65 72 2e 20 20 54 68 69 73 20 6c 6f 67 69  ther.  This logi
1440: 63 20 6d 61 6b 65 73 20 73 75 72 65 20 61 20 75  c makes sure a u
1450: 73 65 72 20 64 6f 65 73 20 6e 6f 74 20 74 72 79  ser does not try
1460: 20 74 6f 20 64 6f 20 74 68 61 74 0a 2a 2a 20 62   to do that.** b
1470: 79 20 6d 69 73 74 61 6b 65 2e 0a 2a 2a 0a 2a 2a  y mistake..**.**
1480: 20 56 65 72 73 69 6f 6e 20 33 2e 33 2e 31 20 28   Version 3.3.1 (
1490: 32 30 30 36 2d 30 31 2d 31 35 29 3a 20 20 4f 73  2006-01-15):  Os
14a0: 46 69 6c 65 73 20 63 61 6e 20 62 65 20 6d 6f 76  Files can be mov
14b0: 65 64 20 66 72 6f 6d 20 6f 6e 65 20 74 68 72 65  ed from one thre
14c0: 61 64 20 74 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72  ad to.** another
14d0: 20 61 73 20 6c 6f 6e 67 20 61 73 20 77 65 20 61   as long as we a
14e0: 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 61 20  re running on a 
14f0: 73 79 73 74 65 6d 20 74 68 61 74 20 73 75 70 70  system that supp
1500: 6f 72 74 73 20 74 68 72 65 61 64 73 0a 2a 2a 20  orts threads.** 
1510: 6f 76 65 72 72 69 64 69 6e 67 20 65 61 63 68 20  overriding each 
1520: 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20 28 77 68  others locks (wh
1530: 69 63 68 20 6e 6f 77 20 74 68 65 20 6d 6f 73 74  ich now the most
1540: 20 63 6f 6d 6d 6f 6e 20 62 65 68 61 76 69 6f 72   common behavior
1550: 29 0a 2a 2a 20 6f 72 20 69 66 20 6e 6f 20 6c 6f  ).** or if no lo
1560: 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 20 20 42  cks are held.  B
1570: 75 74 20 74 68 65 20 4f 73 46 69 6c 65 2e 70 4c  ut the OsFile.pL
1580: 6f 63 6b 20 66 69 65 6c 64 20 6e 65 65 64 73 20  ock field needs 
1590: 74 6f 20 62 65 0a 2a 2a 20 72 65 63 6f 6d 70 75  to be.** recompu
15a0: 74 65 64 20 62 65 63 61 75 73 65 20 69 74 73 20  ted because its 
15b0: 6b 65 79 20 69 6e 63 6c 75 64 65 73 20 74 68 65  key includes the
15c0: 20 74 68 72 65 61 64 2d 69 64 2e 20 20 53 65 65   thread-id.  See
15d0: 20 74 68 65 20 0a 2a 2a 20 74 72 61 6e 73 66 65   the .** transfe
15e0: 72 4f 77 6e 65 72 73 68 69 70 28 29 20 66 75 6e  rOwnership() fun
15f0: 63 74 69 6f 6e 20 62 65 6c 6f 77 20 66 6f 72 20  ction below for 
1600: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
1610: 6d 61 74 69 6f 6e 0a 2a 2f 0a 23 69 66 20 64 65  mation.*/.#if de
1620: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 55 4e 49  fined(SQLITE_UNI
1630: 58 5f 54 48 52 45 41 44 53 29 0a 23 20 64 65 66  X_THREADS).# def
1640: 69 6e 65 20 53 45 54 5f 54 48 52 45 41 44 49 44  ine SET_THREADID
1650: 28 58 29 20 20 20 28 58 29 2d 3e 74 69 64 20 3d  (X)   (X)->tid =
1660: 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a   pthread_self().
1670: 23 20 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 54  # define CHECK_T
1680: 48 52 45 41 44 49 44 28 58 29 20 28 74 68 72 65  HREADID(X) (thre
1690: 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f  adsOverrideEachO
16a0: 74 68 65 72 73 4c 6f 63 6b 73 3d 3d 30 20 26 26  thersLocks==0 &&
16b0: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
16d0: 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28 28 58  pthread_equal((X
16e0: 29 2d 3e 74 69 64 2c 20 70 74 68 72 65 61 64 5f  )->tid, pthread_
16f0: 73 65 6c 66 28 29 29 29 0a 23 65 6c 73 65 0a 23  self())).#else.#
1700: 20 64 65 66 69 6e 65 20 53 45 54 5f 54 48 52 45   define SET_THRE
1710: 41 44 49 44 28 58 29 0a 23 20 64 65 66 69 6e 65  ADID(X).# define
1720: 20 43 48 45 43 4b 5f 54 48 52 45 41 44 49 44 28   CHECK_THREADID(
1730: 58 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  X) 0.#endif../*.
1740: 2a 2a 20 48 65 72 65 20 69 73 20 74 68 65 20 64  ** Here is the d
1750: 69 72 74 20 6f 6e 20 50 4f 53 49 58 20 61 64 76  irt on POSIX adv
1760: 69 73 6f 72 79 20 6c 6f 63 6b 73 3a 20 20 41 4e  isory locks:  AN
1770: 53 49 20 53 54 44 20 31 30 30 33 2e 31 20 28 31  SI STD 1003.1 (1
1780: 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20  996).** section 
1790: 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38  6.5.2.2 lines 48
17a0: 33 20 74 68 72 6f 75 67 68 20 34 39 30 20 73 70  3 through 490 sp
17b0: 65 63 69 66 79 20 74 68 61 74 20 77 68 65 6e 20  ecify that when 
17c0: 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74  a process.** set
17d0: 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c 6f  s or clears a lo
17e0: 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74 69  ck, that operati
17f0: 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79  on overrides any
1800: 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74   prior locks set
1810: 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65 20  .** by the same 
1820: 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f 65  process.  It doe
1830: 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79  s not explicitly
1840: 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68 69   say so, but thi
1850: 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61  s implies.** tha
1860: 74 20 69 74 20 6f 76 65 72 72 69 64 65 73 20 6c  t it overrides l
1870: 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68 65 20  ocks set by the 
1880: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73 69  same process usi
1890: 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a  ng a different.*
18a0: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
18b0: 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69  r.  Consider thi
18c0: 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a  s test case:.**.
18d0: 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 31  **       int fd1
18e0: 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31   = open("./file1
18f0: 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41  ", O_RDWR|O_CREA
1900: 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20  T, 0644);.**    
1910: 20 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70 65     int fd2 = ope
1920: 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52  n("./file2", O_R
1930: 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34  DWR|O_CREAT, 064
1940: 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73  4);.**.** Suppos
1950: 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f  e ./file1 and ./
1960: 66 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c 79  file2 are really
1970: 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 28   the same file (
1980: 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69  because.** one i
1990: 73 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d 62  s a hard or symb
19a0: 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65  olic link to the
19b0: 20 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66 20   other) then if 
19c0: 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78  you set.** an ex
19d0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20  clusive lock on 
19e0: 66 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74 6f  fd1, then try to
19f0: 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76   get an exclusiv
1a00: 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32  e lock.** on fd2
1a10: 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20 77  , it works.  I w
1a20: 6f 75 6c 64 20 68 61 76 65 20 65 78 70 65 63 74  ould have expect
1a30: 65 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f  ed the second lo
1a40: 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69  ck to.** fail si
1a50: 6e 63 65 20 74 68 65 72 65 20 77 61 73 20 61 6c  nce there was al
1a60: 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20  ready a lock on 
1a70: 74 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f 20  the file due to 
1a80: 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20  fd1..** But not 
1a90: 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68 20  so.  Since both 
1aa0: 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20  locks came from 
1ab0: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
1ac0: 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20  , the.** second 
1ad0: 6f 76 65 72 72 69 64 65 73 20 74 68 65 20 66 69  overrides the fi
1ae0: 72 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  rst, even though
1af0: 20 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64 69   they were on di
1b00: 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20  fferent.** file 
1b10: 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e  descriptors open
1b20: 65 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 20  ed on different 
1b30: 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a  file names..**.*
1b40: 2a 20 42 75 6d 6d 65 72 2e 20 20 49 66 20 79 6f  * Bummer.  If yo
1b50: 75 20 61 73 6b 20 6d 65 2c 20 74 68 69 73 20 69  u ask me, this i
1b60: 73 20 62 72 6f 6b 65 6e 2e 20 20 42 61 64 6c 79  s broken.  Badly
1b70: 20 62 72 6f 6b 65 6e 2e 20 20 49 74 20 6d 65 61   broken.  It mea
1b80: 6e 73 0a 2a 2a 20 74 68 61 74 20 77 65 20 63 61  ns.** that we ca
1b90: 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49 58 20 6c  nnot use POSIX l
1ba0: 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e  ocks to synchron
1bb0: 69 7a 65 20 66 69 6c 65 20 61 63 63 65 73 73 20  ize file access 
1bc0: 61 6d 6f 6e 67 0a 2a 2a 20 63 6f 6d 70 65 74 69  among.** competi
1bd0: 6e 67 20 74 68 72 65 61 64 73 20 6f 66 20 74 68  ng threads of th
1be0: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20  e same process. 
1bf0: 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c   POSIX locks wil
1c00: 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74  l work fine.** t
1c10: 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63  o synchronize ac
1c20: 63 65 73 73 20 66 6f 72 20 74 68 72 65 61 64 73  cess for threads
1c30: 20 69 6e 20 73 65 70 61 72 61 74 65 20 70 72 6f   in separate pro
1c40: 63 65 73 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a  cesses, but not.
1c50: 2a 2a 20 74 68 72 65 61 64 73 20 77 69 74 68 69  ** threads withi
1c60: 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  n the same proce
1c70: 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72  ss..**.** To wor
1c80: 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 70 72 6f  k around the pro
1c90: 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20 68 61 73  blem, SQLite has
1ca0: 20 74 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65 20   to manage file 
1cb0: 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79  locks internally
1cc0: 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20  .** on its own. 
1cd0: 20 57 68 65 6e 65 76 65 72 20 61 20 6e 65 77 20   Whenever a new 
1ce0: 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
1cf0: 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66  ed, we have to f
1d00: 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70 65 63 69  ind the.** speci
1d10: 66 69 63 20 69 6e 6f 64 65 20 6f 66 20 74 68 65  fic inode of the
1d20: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
1d30: 74 68 65 20 69 6e 6f 64 65 20 69 73 20 64 65 74  the inode is det
1d40: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 0a 2a  ermined by the.*
1d50: 2a 20 73 74 5f 64 65 76 20 61 6e 64 20 73 74 5f  * st_dev and st_
1d60: 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68  ino fields of th
1d70: 65 20 73 74 61 74 20 73 74 72 75 63 74 75 72 65  e stat structure
1d80: 20 74 68 61 74 20 66 73 74 61 74 28 29 20 66 69   that fstat() fi
1d90: 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63  lls in).** and c
1da0: 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61  heck for locks a
1db0: 6c 72 65 61 64 79 20 65 78 69 73 74 69 6e 67 20  lready existing 
1dc0: 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65 2e 20 20  on that inode.  
1dd0: 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a  When locks are.*
1de0: 2a 20 63 72 65 61 74 65 64 20 6f 72 20 72 65 6d  * created or rem
1df0: 6f 76 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f  oved, we have to
1e00: 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e   look at our own
1e10: 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64   internal record
1e20: 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73   of the.** locks
1e30: 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68   to see if anoth
1e40: 65 72 20 74 68 72 65 61 64 20 68 61 73 20 70 72  er thread has pr
1e50: 65 76 69 6f 75 73 6c 79 20 73 65 74 20 61 20 6c  eviously set a l
1e60: 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d 65  ock on that same
1e70: 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a  .** inode..**.**
1e80: 20 54 68 65 20 4f 73 46 69 6c 65 20 73 74 72 75   The OsFile stru
1e90: 63 74 75 72 65 20 66 6f 72 20 50 4f 53 49 58 20  cture for POSIX 
1ea0: 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 73  is no longer jus
1eb0: 74 20 61 6e 20 69 6e 74 65 67 65 72 20 66 69 6c  t an integer fil
1ec0: 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 2e  e.** descriptor.
1ed0: 20 20 49 74 20 69 73 20 6e 6f 77 20 61 20 73 74    It is now a st
1ee0: 72 75 63 74 75 72 65 20 74 68 61 74 20 68 6f 6c  ructure that hol
1ef0: 64 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 66  ds the integer f
1f00: 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  ile.** descripto
1f10: 72 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20  r and a pointer 
1f20: 74 6f 20 61 20 73 74 72 75 63 74 75 72 65 20 74  to a structure t
1f30: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
1f40: 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f  e internal.** lo
1f50: 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72 72 65  cks on the corre
1f60: 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65 2e 20  sponding inode. 
1f70: 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f   There is one lo
1f80: 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 0a  cking structure.
1f90: 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20 73 6f  ** per inode, so
1fa0: 20 69 66 20 74 68 65 20 73 61 6d 65 20 69 6e 6f   if the same ino
1fb0: 64 65 20 69 73 20 6f 70 65 6e 65 64 20 74 77 69  de is opened twi
1fc0: 63 65 2c 20 62 6f 74 68 20 4f 73 46 69 6c 65 20  ce, both OsFile 
1fd0: 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f  structures.** po
1fe0: 69 6e 74 20 74 6f 20 74 68 65 20 73 61 6d 65 20  int to the same 
1ff0: 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
2000: 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  e.  The locking 
2010: 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 0a  structure keeps.
2020: 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 63  ** a reference c
2030: 6f 75 6e 74 20 28 73 6f 20 77 65 20 77 69 6c 6c  ount (so we will
2040: 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20 64 65   know when to de
2050: 6c 65 74 65 20 69 74 29 20 61 6e 64 20 61 20 22  lete it) and a "
2060: 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68  cnt".** field th
2070: 61 74 20 74 65 6c 6c 73 20 75 73 20 69 74 73 20  at tells us its 
2080: 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74  internal lock st
2090: 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65  atus.  cnt==0 me
20a0: 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  ans the.** file 
20b0: 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e  is unlocked.  cn
20c0: 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68 65 20  t==-1 means the 
20d0: 66 69 6c 65 20 68 61 73 20 61 6e 20 65 78 63 6c  file has an excl
20e0: 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63  usive lock..** c
20f0: 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68 65 72 65  nt>0 means there
2100: 20 61 72 65 20 63 6e 74 20 73 68 61 72 65 64 20   are cnt shared 
2110: 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c  locks on the fil
2120: 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74  e..**.** Any att
2130: 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20  empt to lock or 
2140: 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 66 69  unlock a file fi
2150: 72 73 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c  rst checks the l
2160: 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74  ocking.** struct
2170: 75 72 65 2e 20 20 54 68 65 20 66 63 6e 74 6c 28  ure.  The fcntl(
2180: 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 69 73  ) system call is
2190: 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f   only invoked to
21a0: 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58   set a .** POSIX
21b0: 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 69 6e 74   lock if the int
21c0: 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63  ernal lock struc
21d0: 74 75 72 65 20 74 72 61 6e 73 69 74 69 6f 6e 73  ture transitions
21e0: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f   between.** a lo
21f0: 63 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f  cked and an unlo
2200: 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  cked state..**.*
2210: 2a 20 32 30 30 34 2d 4a 61 6e 2d 31 31 3a 0a 2a  * 2004-Jan-11:.*
2220: 2a 20 4d 6f 72 65 20 72 65 63 65 6e 74 20 64 69  * More recent di
2230: 73 63 6f 76 65 72 69 65 73 20 61 62 6f 75 74 20  scoveries about 
2240: 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c  POSIX advisory l
2250: 6f 63 6b 73 2e 20 20 28 54 68 65 20 6d 6f 72 65  ocks.  (The more
2260: 0a 2a 2a 20 49 20 64 69 73 63 6f 76 65 72 2c 20  .** I discover, 
2270: 74 68 65 20 6d 6f 72 65 20 49 20 72 65 61 6c 69  the more I reali
2280: 7a 65 20 74 68 65 20 61 20 50 4f 53 49 58 20 61  ze the a POSIX a
2290: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72  dvisory locks ar
22a0: 65 0a 2a 2a 20 61 6e 20 61 62 6f 6d 69 6e 61 74  e.** an abominat
22b0: 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 49 66 20 79  ion.).**.** If y
22c0: 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c 65 20  ou close a file 
22d0: 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20  descriptor that 
22e0: 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 69 6c 65  points to a file
22f0: 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c   that has locks,
2300: 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e  .** all locks on
2310: 20 74 68 61 74 20 66 69 6c 65 20 74 68 61 74 20   that file that 
2320: 61 72 65 20 6f 77 6e 65 64 20 62 79 20 74 68 65  are owned by the
2330: 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73   current process
2340: 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64   are.** released
2350: 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  .  To work aroun
2360: 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20  d this problem, 
2370: 65 61 63 68 20 4f 73 46 69 6c 65 20 73 74 72 75  each OsFile stru
2380: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a  cture contains.*
2390: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  * a pointer to a
23a0: 6e 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74  n openCnt struct
23b0: 75 72 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f  ure.  There is o
23c0: 6e 65 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63  ne openCnt struc
23d0: 74 75 72 65 0a 2a 2a 20 70 65 72 20 6f 70 65 6e  ture.** per open
23e0: 20 69 6e 6f 64 65 2c 20 77 68 69 63 68 20 6d 65   inode, which me
23f0: 61 6e 73 20 74 68 61 74 20 6d 75 6c 74 69 70 6c  ans that multipl
2400: 65 20 4f 73 46 69 6c 65 73 20 63 61 6e 20 70 6f  e OsFiles can po
2410: 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 0a  int to a single.
2420: 2a 2a 20 6f 70 65 6e 43 6e 74 2e 20 20 57 68 65  ** openCnt.  Whe
2430: 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  n an attempt is 
2440: 6d 61 64 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e  made to close an
2450: 20 4f 73 46 69 6c 65 2c 20 69 66 20 74 68 65 72   OsFile, if ther
2460: 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20 4f  e are.** other O
2470: 73 46 69 6c 65 73 20 6f 70 65 6e 20 6f 6e 20 74  sFiles open on t
2480: 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 74 68  he same inode th
2490: 61 74 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c  at are holding l
24a0: 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a  ocks, the call.*
24b0: 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65  * to close() the
24c0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
24d0: 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74   is deferred unt
24e0: 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f  il all of the lo
24f0: 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68  cks clear..** Th
2500: 65 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74  e openCnt struct
2510: 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69 73 74  ure keeps a list
2520: 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69 70   of file descrip
2530: 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
2540: 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20 61  o.** be closed a
2550: 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69 73 20  nd that list is 
2560: 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65 61  walked (and clea
2570: 72 65 64 29 20 77 68 65 6e 20 74 68 65 20 6c 61  red) when the la
2580: 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72  st lock.** clear
2590: 73 2e 0a 2a 2a 0a 2a 2a 20 46 69 72 73 74 2c 20  s..**.** First, 
25a0: 75 6e 64 65 72 20 4c 69 6e 75 78 20 74 68 72 65  under Linux thre
25b0: 61 64 73 2c 20 62 65 63 61 75 73 65 20 65 61 63  ads, because eac
25c0: 68 20 74 68 72 65 61 64 20 68 61 73 20 61 20 73  h thread has a s
25d0: 65 70 61 72 61 74 65 0a 2a 2a 20 70 72 6f 63 65  eparate.** proce
25e0: 73 73 20 49 44 2c 20 6c 6f 63 6b 20 6f 70 65 72  ss ID, lock oper
25f0: 61 74 69 6f 6e 73 20 69 6e 20 6f 6e 65 20 74 68  ations in one th
2600: 72 65 61 64 20 64 6f 20 6e 6f 74 20 6f 76 65 72  read do not over
2610: 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 74 6f  ride locks.** to
2620: 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 69   the same file i
2630: 6e 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 2e  n other threads.
2640: 20 20 4c 69 6e 75 78 20 74 68 72 65 61 64 73 20    Linux threads 
2650: 62 65 68 61 76 65 20 6c 69 6b 65 0a 2a 2a 20 73  behave like.** s
2660: 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 65  eparate processe
2670: 73 20 69 6e 20 74 68 69 73 20 72 65 73 70 65 63  s in this respec
2680: 74 2e 20 20 42 75 74 2c 20 69 66 20 79 6f 75 20  t.  But, if you 
2690: 63 6c 6f 73 65 20 61 20 66 69 6c 65 0a 2a 2a 20  close a file.** 
26a0: 64 65 73 63 72 69 70 74 6f 72 20 69 6e 20 6c 69  descriptor in li
26b0: 6e 75 78 20 74 68 72 65 61 64 73 2c 20 61 6c 6c  nux threads, all
26c0: 20 6c 6f 63 6b 73 20 61 72 65 20 63 6c 65 61 72   locks are clear
26d0: 65 64 2c 20 65 76 65 6e 20 6c 6f 63 6b 73 0a 2a  ed, even locks.*
26e0: 2a 20 6f 6e 20 6f 74 68 65 72 20 74 68 72 65 61  * on other threa
26f0: 64 73 20 61 6e 64 20 65 76 65 6e 20 74 68 6f 75  ds and even thou
2700: 67 68 20 74 68 65 20 6f 74 68 65 72 20 74 68 72  gh the other thr
2710: 65 61 64 73 20 68 61 76 65 20 64 69 66 66 65 72  eads have differ
2720: 65 6e 74 0a 2a 2a 20 70 72 6f 63 65 73 73 20 49  ent.** process I
2730: 44 73 2e 20 20 4c 69 6e 75 78 20 74 68 72 65 61  Ds.  Linux threa
2740: 64 73 20 69 73 20 69 6e 63 6f 6e 73 69 73 74 65  ds is inconsiste
2750: 6e 74 20 69 6e 20 74 68 69 73 20 72 65 73 70 65  nt in this respe
2760: 63 74 2e 0a 2a 2a 20 28 49 27 6d 20 62 65 67 69  ct..** (I'm begi
2770: 6e 6e 69 6e 67 20 74 6f 20 74 68 69 6e 6b 20 74  nning to think t
2780: 68 61 74 20 6c 69 6e 75 78 20 74 68 72 65 61 64  hat linux thread
2790: 73 20 69 73 20 61 6e 20 61 62 6f 6d 69 6e 61 74  s is an abominat
27a0: 69 6f 6e 20 74 6f 6f 2e 29 0a 2a 2a 20 54 68 65  ion too.).** The
27b0: 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 6f 66 20   consequence of 
27c0: 74 68 69 73 20 61 6c 6c 20 69 73 20 74 68 61 74  this all is that
27d0: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
27e0: 66 6f 72 20 74 68 65 20 6c 6f 63 6b 49 6e 66 6f  for the lockInfo
27f0: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 68 61  .** structure ha
2800: 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65  s to include the
2810: 20 70 72 6f 63 65 73 73 20 69 64 20 61 73 20 70   process id as p
2820: 61 72 74 20 6f 66 20 69 74 73 20 6b 65 79 20 62  art of its key b
2830: 65 63 61 75 73 65 0a 2a 2a 20 6c 6f 63 6b 73 20  ecause.** locks 
2840: 69 6e 20 64 69 66 66 65 72 65 6e 74 20 74 68 72  in different thr
2850: 65 61 64 73 20 61 72 65 20 74 72 65 61 74 65 64  eads are treated
2860: 20 61 73 20 64 69 73 74 69 6e 63 74 2e 20 20 42   as distinct.  B
2870: 75 74 20 74 68 65 20 0a 2a 2a 20 6f 70 65 6e 43  ut the .** openC
2880: 6e 74 20 73 74 72 75 63 74 75 72 65 20 73 68 6f  nt structure sho
2890: 75 6c 64 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20  uld not include 
28a0: 74 68 65 20 70 72 6f 63 65 73 73 20 69 64 20 69  the process id i
28b0: 6e 20 69 74 73 0a 2a 2a 20 6b 65 79 20 62 65 63  n its.** key bec
28c0: 61 75 73 65 20 63 6c 6f 73 65 28 29 20 63 6c 65  ause close() cle
28d0: 61 72 73 20 6c 6f 63 6b 20 6f 6e 20 61 6c 6c 20  ars lock on all 
28e0: 74 68 72 65 61 64 73 2c 20 6e 6f 74 20 6a 75 73  threads, not jus
28f0: 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  t the current.**
2900: 20 74 68 72 65 61 64 2e 20 20 57 65 72 65 20 69   thread.  Were i
2910: 74 20 6e 6f 74 20 66 6f 72 20 74 68 69 73 20 67  t not for this g
2920: 6f 6f 66 69 6e 65 73 73 20 69 6e 20 6c 69 6e 75  oofiness in linu
2930: 78 20 74 68 72 65 61 64 73 2c 20 77 65 20 63 6f  x threads, we co
2940: 75 6c 64 0a 2a 2a 20 63 6f 6d 62 69 6e 65 20 74  uld.** combine t
2950: 68 65 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e 64 20  he lockInfo and 
2960: 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72  openCnt structur
2970: 65 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  es into a single
2980: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
2990: 2a 20 32 30 30 34 2d 4a 75 6e 2d 32 38 3a 0a 2a  * 2004-Jun-28:.*
29a0: 2a 20 4f 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f  * On some versio
29b0: 6e 73 20 6f 66 20 6c 69 6e 75 78 2c 20 74 68 72  ns of linux, thr
29c0: 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64  eads can overrid
29d0: 65 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f  e each others lo
29e0: 63 6b 73 2e 0a 2a 2a 20 4f 6e 20 6f 74 68 65 72  cks..** On other
29f0: 73 20 6e 6f 74 2e 20 20 53 6f 6d 65 74 69 6d 65  s not.  Sometime
2a00: 73 20 79 6f 75 20 63 61 6e 20 63 68 61 6e 67 65  s you can change
2a10: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 6e   the behavior on
2a20: 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 73 79 73   the same.** sys
2a30: 74 65 6d 20 62 79 20 73 65 74 74 69 6e 67 20 74  tem by setting t
2a40: 68 65 20 4c 44 5f 41 53 53 55 4d 45 5f 4b 45 52  he LD_ASSUME_KER
2a50: 4e 45 4c 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  NEL environment 
2a60: 76 61 72 69 61 62 6c 65 2e 20 20 54 68 65 0a 2a  variable.  The.*
2a70: 2a 20 50 4f 53 49 58 20 73 74 61 6e 64 61 72 64  * POSIX standard
2a80: 20 69 73 20 73 69 6c 65 6e 74 20 61 73 20 74 6f   is silent as to
2a90: 20 77 68 69 63 68 20 62 65 68 61 76 69 6f 72 20   which behavior 
2aa0: 69 73 20 63 6f 72 72 65 63 74 2c 20 61 73 20 66  is correct, as f
2ab0: 61 72 0a 2a 2a 20 61 73 20 49 20 63 61 6e 20 74  ar.** as I can t
2ac0: 65 6c 6c 2c 20 73 6f 20 6f 74 68 65 72 20 76 65  ell, so other ve
2ad0: 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78 20 6d  rsions of unix m
2ae0: 69 67 68 74 20 73 68 6f 77 20 74 68 65 20 73 61  ight show the sa
2af0: 6d 65 0a 2a 2a 20 69 6e 63 6f 6e 73 69 73 74 65  me.** inconsiste
2b00: 6e 63 79 2e 20 20 54 68 65 72 65 20 69 73 20 6e  ncy.  There is n
2b10: 6f 20 6c 69 74 74 6c 65 20 64 6f 75 62 74 20 69  o little doubt i
2b20: 6e 20 6d 79 20 6d 69 6e 64 20 74 68 61 74 20 70  n my mind that p
2b30: 6f 73 69 78 0a 2a 2a 20 61 64 76 69 73 6f 72 79  osix.** advisory
2b40: 20 6c 6f 63 6b 73 20 61 6e 64 20 6c 69 6e 75 78   locks and linux
2b50: 20 74 68 72 65 61 64 73 20 61 72 65 20 70 72 6f   threads are pro
2b60: 66 6f 75 6e 64 6c 79 20 62 72 6f 6b 65 6e 2e 0a  foundly broken..
2b70: 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72  **.** To work ar
2b80: 6f 75 6e 64 20 74 68 65 20 69 6e 63 6f 6e 73 69  ound the inconsi
2b90: 73 74 65 6e 63 69 65 73 2c 20 77 65 20 68 61 76  stencies, we hav
2ba0: 65 20 74 6f 20 74 65 73 74 20 61 74 20 72 75 6e  e to test at run
2bb0: 74 69 6d 65 20 0a 2a 2a 20 77 68 65 74 68 65 72  time .** whether
2bc0: 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 73 20   or not threads 
2bd0: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63  can override eac
2be0: 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 20  h others locks. 
2bf0: 20 54 68 69 73 20 74 65 73 74 0a 2a 2a 20 69 73   This test.** is
2c00: 20 72 75 6e 20 6f 6e 63 65 2c 20 74 68 65 20 66   run once, the f
2c10: 69 72 73 74 20 74 69 6d 65 20 61 6e 79 20 6c 6f  irst time any lo
2c20: 63 6b 20 69 73 20 61 74 74 65 6d 70 74 65 64 2e  ck is attempted.
2c30: 20 20 41 20 73 74 61 74 69 63 20 0a 2a 2a 20 76    A static .** v
2c40: 61 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74  ariable is set t
2c50: 6f 20 72 65 63 6f 72 64 20 74 68 65 20 72 65 73  o record the res
2c60: 75 6c 74 73 20 6f 66 20 74 68 69 73 20 74 65 73  ults of this tes
2c70: 74 20 66 6f 72 20 66 75 74 75 72 65 0a 2a 2a 20  t for future.** 
2c80: 75 73 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  use..*/../*.** A
2c90: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
2ca0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
2cb0: 63 74 75 72 65 20 73 65 72 76 65 73 20 61 73 20  cture serves as 
2cc0: 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20  the key used.** 
2cd0: 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74  to locate a part
2ce0: 69 63 75 6c 61 72 20 6c 6f 63 6b 49 6e 66 6f 20  icular lockInfo 
2cf0: 73 74 72 75 63 74 75 72 65 20 67 69 76 65 6e 20  structure given 
2d00: 69 74 73 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a  its inode..**.**
2d10: 20 49 66 20 74 68 72 65 61 64 73 20 63 61 6e 6e   If threads cann
2d20: 6f 74 20 6f 76 65 72 72 69 64 65 20 65 61 63 68  ot override each
2d30: 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2c 20 74   others locks, t
2d40: 68 65 6e 20 77 65 20 73 65 74 20 74 68 65 0a 2a  hen we set the.*
2d50: 2a 20 6c 6f 63 6b 4b 65 79 2e 74 69 64 20 66 69  * lockKey.tid fi
2d60: 65 6c 64 20 74 6f 20 74 68 65 20 74 68 72 65 61  eld to the threa
2d70: 64 20 49 44 2e 20 20 49 66 20 74 68 72 65 61 64  d ID.  If thread
2d80: 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 0a 2a  s can override.*
2d90: 2a 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f  * each others lo
2da0: 63 6b 73 20 74 68 65 6e 20 74 69 64 20 69 73 20  cks then tid is 
2db0: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 7a 65  always set to ze
2dc0: 72 6f 2e 20 20 74 69 64 20 69 73 20 6f 6d 69 74  ro.  tid is omit
2dd0: 74 65 64 0a 2a 2a 20 69 66 20 77 65 20 63 6f 6d  ted.** if we com
2de0: 70 69 6c 65 20 77 69 74 68 6f 75 74 20 74 68 72  pile without thr
2df0: 65 61 64 69 6e 67 20 73 75 70 70 6f 72 74 2e 0a  eading support..
2e00: 2a 2f 0a 73 74 72 75 63 74 20 6c 6f 63 6b 4b 65  */.struct lockKe
2e10: 79 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b  y {.  dev_t dev;
2e20: 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65         /* Device
2e30: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 6f   number */.  ino
2e40: 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20 20 2f 2a  _t ino;       /*
2e50: 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f   Inode number */
2e60: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55  .#ifdef SQLITE_U
2e70: 4e 49 58 5f 54 48 52 45 41 44 53 0a 20 20 70 74  NIX_THREADS.  pt
2e80: 68 72 65 61 64 5f 74 20 74 69 64 3b 20 20 20 2f  hread_t tid;   /
2e90: 2a 20 54 68 72 65 61 64 20 49 44 20 6f 72 20 7a  * Thread ID or z
2ea0: 65 72 6f 20 69 66 20 74 68 72 65 61 64 73 20 63  ero if threads c
2eb0: 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63 68  an override each
2ec0: 20 6f 74 68 65 72 20 2a 2f 0a 23 65 6e 64 69 66   other */.#endif
2ed0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .};../*.** An in
2ee0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
2ef0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
2f00: 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66  e is allocated f
2f10: 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20  or each open.** 
2f20: 69 6e 6f 64 65 20 6f 6e 20 65 61 63 68 20 74 68  inode on each th
2f30: 72 65 61 64 20 77 69 74 68 20 61 20 64 69 66 66  read with a diff
2f40: 65 72 65 6e 74 20 70 72 6f 63 65 73 73 20 49 44  erent process ID
2f50: 2e 20 20 28 54 68 72 65 61 64 73 20 68 61 76 65  .  (Threads have
2f60: 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 70 72  .** different pr
2f70: 6f 63 65 73 73 20 49 44 73 20 6f 6e 20 6c 69 6e  ocess IDs on lin
2f80: 75 78 2c 20 62 75 74 20 6e 6f 74 20 6f 6e 20 6d  ux, but not on m
2f90: 6f 73 74 20 6f 74 68 65 72 20 75 6e 69 78 65 73  ost other unixes
2fa0: 2e 29 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c  .).**.** A singl
2fb0: 65 20 69 6e 6f 64 65 20 63 61 6e 20 68 61 76 65  e inode can have
2fc0: 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65 20 64   multiple file d
2fd0: 65 73 63 72 69 70 74 6f 72 73 2c 20 73 6f 20 65  escriptors, so e
2fe0: 61 63 68 20 4f 73 46 69 6c 65 0a 2a 2a 20 73 74  ach OsFile.** st
2ff0: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
3000: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
3010: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
3020: 73 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 69  s object and thi
3030: 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65 70  s.** object keep
3040: 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65  s a count of the
3050: 20 6e 75 6d 62 65 72 20 6f 66 20 4f 73 46 69 6c   number of OsFil
3060: 65 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69  es pointing to i
3070: 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6c 6f 63  t..*/.struct loc
3080: 6b 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63 74  kInfo {.  struct
3090: 20 6c 6f 63 6b 4b 65 79 20 6b 65 79 3b 20 20 2f   lockKey key;  /
30a0: 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79  * The lookup key
30b0: 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20   */.  int cnt;  
30c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
30d0: 6d 62 65 72 20 6f 66 20 53 48 41 52 45 44 20 6c  mber of SHARED l
30e0: 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69  ocks held */.  i
30f0: 6e 74 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20  nt locktype;    
3100: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48      /* One of SH
3110: 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52  ARED_LOCK, RESER
3120: 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f  VED_LOCK etc. */
3130: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
3140: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3150: 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  r of pointers to
3160: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
3170: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  */.};../*.** An 
3180: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
3190: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
31a0: 75 72 65 20 73 65 72 76 65 73 20 61 73 20 74 68  ure serves as th
31b0: 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f  e key used.** to
31c0: 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69 63   locate a partic
31d0: 75 6c 61 72 20 6f 70 65 6e 43 6e 74 20 73 74 72  ular openCnt str
31e0: 75 63 74 75 72 65 20 67 69 76 65 6e 20 69 74 73  ucture given its
31f0: 20 69 6e 6f 64 65 2e 20 20 54 68 69 73 0a 2a 2a   inode.  This.**
3200: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
3210: 74 68 65 20 6c 6f 63 6b 4b 65 79 20 65 78 63 65  the lockKey exce
3220: 70 74 20 74 68 61 74 20 74 68 65 20 74 68 72 65  pt that the thre
3230: 61 64 20 49 44 20 69 73 20 6f 6d 69 74 74 65 64  ad ID is omitted
3240: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6f 70 65 6e  ..*/.struct open
3250: 4b 65 79 20 7b 0a 20 20 64 65 76 5f 74 20 64 65  Key {.  dev_t de
3260: 76 3b 20 20 20 2f 2a 20 44 65 76 69 63 65 20 6e  v;   /* Device n
3270: 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 6f 5f 74  umber */.  ino_t
3280: 20 69 6e 6f 3b 20 20 20 2f 2a 20 49 6e 6f 64 65   ino;   /* Inode
3290: 20 6e 75 6d 62 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f   number */.};../
32a0: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
32b0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
32c0: 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  g structure is a
32d0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63  llocated for eac
32e0: 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e  h open.** inode.
32f0: 20 20 54 68 69 73 20 73 74 72 75 63 74 75 72 65    This structure
3300: 20 6b 65 65 70 73 20 74 72 61 63 6b 20 6f 66 20   keeps track of 
3310: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f  the number of lo
3320: 63 6b 73 20 6f 6e 20 74 68 61 74 0a 2a 2a 20 69  cks on that.** i
3330: 6e 6f 64 65 2e 20 20 49 66 20 61 20 63 6c 6f 73  node.  If a clos
3340: 65 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 61  e is attempted a
3350: 67 61 69 6e 73 74 20 61 6e 20 69 6e 6f 64 65 20  gainst an inode 
3360: 74 68 61 74 20 69 73 20 68 6f 6c 64 69 6e 67 0a  that is holding.
3370: 2a 2a 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 6c  ** locks, the cl
3380: 6f 73 65 20 69 73 20 64 65 66 65 72 72 65 64 20  ose is deferred 
3390: 75 6e 74 69 6c 20 61 6c 6c 20 6c 6f 63 6b 73 20  until all locks 
33a0: 63 6c 65 61 72 20 62 79 20 61 64 64 69 6e 67 20  clear by adding 
33b0: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  the.** file desc
33c0: 72 69 70 74 6f 72 20 74 6f 20 62 65 20 63 6c 6f  riptor to be clo
33d0: 73 65 64 20 74 6f 20 74 68 65 20 70 65 6e 64 69  sed to the pendi
33e0: 6e 67 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75  ng list..*/.stru
33f0: 63 74 20 6f 70 65 6e 43 6e 74 20 7b 0a 20 20 73  ct openCnt {.  s
3400: 74 72 75 63 74 20 6f 70 65 6e 4b 65 79 20 6b 65  truct openKey ke
3410: 79 3b 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b  y;   /* The look
3420: 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  up key */.  int 
3430: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
3440: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
3450: 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20  ointers to this 
3460: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
3470: 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20  nt nLock;       
3480: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3490: 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  f outstanding lo
34a0: 63 6b 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 65  cks */.  int nPe
34b0: 6e 64 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f  nding;         /
34c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 65 6e 64  * Number of pend
34d0: 69 6e 67 20 63 6c 6f 73 65 28 29 20 6f 70 65 72  ing close() oper
34e0: 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ations */.  int 
34f0: 2a 61 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20  *aPending;      
3500: 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 70    /* Malloced sp
3510: 61 63 65 20 68 6f 6c 64 69 6e 67 20 66 64 27 73  ace holding fd's
3520: 20 61 77 61 69 74 69 6e 67 20 61 20 63 6c 6f 73   awaiting a clos
3530: 65 28 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a  e() */.};../* .*
3540: 2a 20 54 68 65 73 65 20 68 61 73 68 20 74 61 62  * These hash tab
3550: 6c 65 73 20 6d 61 70 20 69 6e 6f 64 65 73 20 61  les map inodes a
3560: 6e 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  nd file descript
3570: 6f 72 73 20 28 72 65 61 6c 6c 79 2c 20 6c 6f 63  ors (really, loc
3580: 6b 4b 65 79 20 61 6e 64 0a 2a 2a 20 6f 70 65 6e  kKey and.** open
3590: 4b 65 79 20 73 74 72 75 63 74 75 72 65 73 29 20  Key structures) 
35a0: 69 6e 74 6f 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e  into lockInfo an
35b0: 64 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74  d openCnt struct
35c0: 75 72 65 73 2e 20 20 41 63 63 65 73 73 20 74 6f  ures.  Access to
35d0: 20 0a 2a 2a 20 74 68 65 73 65 20 68 61 73 68 20   .** these hash 
35e0: 74 61 62 6c 65 73 20 6d 75 73 74 20 62 65 20 70  tables must be p
35f0: 72 6f 74 65 63 74 65 64 20 62 79 20 61 20 6d 75  rotected by a mu
3600: 74 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 48  tex..*/.static H
3610: 61 73 68 20 6c 6f 63 6b 48 61 73 68 20 3d 20 7b  ash lockHash = {
3620: 53 51 4c 49 54 45 5f 48 41 53 48 5f 42 49 4e 41  SQLITE_HASH_BINA
3630: 52 59 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  RY, 0, 0, 0, 0, 
3640: 30 7d 3b 0a 73 74 61 74 69 63 20 48 61 73 68 20  0};.static Hash 
3650: 6f 70 65 6e 48 61 73 68 20 3d 20 7b 53 51 4c 49  openHash = {SQLI
3660: 54 45 5f 48 41 53 48 5f 42 49 4e 41 52 59 2c 20  TE_HASH_BINARY, 
3670: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 7d 3b 0a  0, 0, 0, 0, 0};.
3680: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
3690: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
36a0: 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6c 6f  YLE./*.** The lo
36b0: 63 6b 69 6e 67 20 73 74 79 6c 65 73 20 61 72 65  cking styles are
36c0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
36d0: 20 74 68 65 20 64 69 66 66 65 72 65 6e 74 20 66   the different f
36e0: 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63  ile locking.** c
36f0: 61 70 61 62 69 6c 69 74 69 65 73 20 73 75 70 70  apabilities supp
3700: 6f 72 74 65 64 20 62 79 20 64 69 66 66 65 72 65  orted by differe
3710: 6e 74 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e  nt file systems.
3720: 20 20 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 6c    .**.** POSIX l
3730: 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 66 75 6c  ocking style ful
3740: 6c 79 20 73 75 70 70 6f 72 74 73 20 73 68 61 72  ly supports shar
3750: 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  ed and exclusive
3760: 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
3770: 73 20 0a 2a 2a 20 41 44 50 20 6c 6f 63 6b 69 6e  s .** ADP lockin
3780: 67 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 73 20  g only supports 
3790: 65 78 63 6c 75 73 69 76 65 20 62 79 74 65 2d 72  exclusive byte-r
37a0: 61 6e 67 65 20 6c 6f 63 6b 73 0a 2a 2a 20 46 4c  ange locks.** FL
37b0: 4f 43 4b 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74  OCK only support
37c0: 73 20 61 20 73 69 6e 67 6c 65 20 66 69 6c 65 2d  s a single file-
37d0: 67 6c 6f 62 61 6c 20 65 78 63 6c 75 73 69 76 65  global exclusive
37e0: 20 6c 6f 63 6b 0a 2a 2a 20 44 4f 54 4c 4f 43 4b   lock.** DOTLOCK
37f0: 20 69 73 6e 27 74 20 61 20 74 72 75 65 20 6c 6f   isn't a true lo
3800: 63 6b 69 6e 67 20 73 74 79 6c 65 2c 20 69 74 20  cking style, it 
3810: 72 65 66 65 72 73 20 74 6f 20 74 68 65 20 75 73  refers to the us
3820: 65 20 6f 66 20 61 20 73 70 65 63 69 61 6c 0a 2a  e of a special.*
3830: 2a 20 20 20 66 69 6c 65 20 6e 61 6d 65 64 20 74  *   file named t
3840: 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 64  he same as the d
3850: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 74  atabase file wit
3860: 68 20 61 20 27 2e 6c 6f 63 6b 27 20 65 78 74 65  h a '.lock' exte
3870: 6e 73 69 6f 6e 2c 20 74 68 69 73 0a 2a 2a 20 20  nsion, this.**  
3880: 20 63 61 6e 20 62 65 20 75 73 65 64 20 6f 6e 20   can be used on 
3890: 66 69 6c 65 20 73 79 73 74 65 6d 73 20 74 68 61  file systems tha
38a0: 74 20 64 6f 20 6e 6f 74 20 6f 66 66 65 72 20 61  t do not offer a
38b0: 6e 79 20 72 65 6c 69 61 62 6c 65 20 66 69 6c 65  ny reliable file
38c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 4e 4f 20 6c   locking.** NO l
38d0: 6f 63 6b 69 6e 67 20 6d 65 61 6e 73 20 74 68 61  ocking means tha
38e0: 74 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 77 69 6c  t no locking wil
38f0: 6c 20 62 65 20 61 74 74 65 6d 70 74 65 64 2c 20  l be attempted, 
3900: 74 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73 65  this is only use
3910: 64 20 66 6f 72 0a 2a 2a 20 20 20 72 65 61 64 2d  d for.**   read-
3920: 6f 6e 6c 79 20 66 69 6c 65 20 73 79 73 74 65 6d  only file system
3930: 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 55  s currently.** U
3940: 4e 53 55 50 50 4f 52 54 45 44 20 6d 65 61 6e 73  NSUPPORTED means
3950: 20 74 68 61 74 20 6e 6f 20 6c 6f 63 6b 69 6e 67   that no locking
3960: 20 77 69 6c 6c 20 62 65 20 61 74 74 65 6d 70 74   will be attempt
3970: 65 64 2c 20 74 68 69 73 20 69 73 20 6f 6e 6c 79  ed, this is only
3980: 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 20 20 66   used for.**   f
3990: 69 6c 65 20 73 79 73 74 65 6d 73 20 74 68 61 74  ile systems that
39a0: 20 61 72 65 20 6b 6e 6f 77 6e 20 74 6f 20 62 65   are known to be
39b0: 20 75 6e 73 75 70 70 6f 72 74 65 64 0a 2a 2f 0a   unsupported.*/.
39c0: 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 20  typedef enum {. 
39d0: 20 20 20 20 20 20 20 70 6f 73 69 78 4c 6f 63 6b         posixLock
39e0: 69 6e 67 53 74 79 6c 65 20 3d 20 30 2c 20 20 20  ingStyle = 0,   
39f0: 20 20 20 20 2f 2a 20 73 74 61 6e 64 61 72 64 20      /* standard 
3a00: 70 6f 73 69 78 2d 61 64 76 69 73 6f 72 79 20 6c  posix-advisory l
3a10: 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ocks */.        
3a20: 61 66 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 2c  afpLockingStyle,
3a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3a40: 75 73 65 20 61 66 70 20 6c 6f 63 6b 73 20 2a 2f  use afp locks */
3a50: 0a 20 20 20 20 20 20 20 20 66 6c 6f 63 6b 4c 6f  .        flockLo
3a60: 63 6b 69 6e 67 53 74 79 6c 65 2c 20 20 20 20 20  ckingStyle,     
3a70: 20 20 20 20 20 20 2f 2a 20 75 73 65 20 66 6c 6f        /* use flo
3a80: 63 6b 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  ck() */.        
3a90: 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74  dotlockLockingSt
3aa0: 79 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  yle,         /* 
3ab0: 75 73 65 20 3c 66 69 6c 65 3e 2e 6c 6f 63 6b 20  use <file>.lock 
3ac0: 66 69 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  files */.       
3ad0: 20 6e 6f 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 2c   noLockingStyle,
3ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3af0: 20 75 73 65 66 75 6c 20 66 6f 72 20 72 65 61 64   useful for read
3b00: 2d 6f 6e 6c 79 20 66 69 6c 65 20 73 79 73 74 65  -only file syste
3b10: 6d 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 73  m */.        uns
3b20: 75 70 70 6f 72 74 65 64 4c 6f 63 6b 69 6e 67 53  upportedLockingS
3b30: 74 79 6c 65 20 20 20 20 20 20 2f 2a 20 69 6e 64  tyle      /* ind
3b40: 69 63 61 74 65 73 20 75 6e 73 75 70 70 6f 72 74  icates unsupport
3b50: 65 64 20 66 69 6c 65 20 73 79 73 74 65 6d 20 2a  ed file system *
3b60: 2f 0a 7d 20 73 71 6c 69 74 65 33 4c 6f 63 6b 69  /.} sqlite3Locki
3b70: 6e 67 53 74 79 6c 65 3b 0a 23 65 6e 64 69 66 20  ngStyle;.#endif 
3b80: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
3b90: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
3ba0: 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  /..static void e
3bb0: 6e 74 65 72 4d 75 74 65 78 28 29 7b 0a 20 20 73  nterMutex(){.  s
3bc0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
3bd0: 65 72 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  er(sqlite3_mutex
3be0: 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
3bf0: 54 45 58 5f 47 4c 4f 42 41 4c 29 29 3b 0a 7d 0a  TEX_GLOBAL));.}.
3c00: 73 74 61 74 69 63 20 76 6f 69 64 20 6c 65 61 76  static void leav
3c10: 65 4d 75 74 65 78 28 29 7b 0a 20 20 73 71 6c 69  eMutex(){.  sqli
3c20: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
3c30: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
3c40: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
3c50: 5f 47 4c 4f 42 41 4c 29 29 3b 0a 7d 0a 0a 23 69  _GLOBAL));.}..#i
3c60: 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58  fdef SQLITE_UNIX
3c70: 5f 54 48 52 45 41 44 53 0a 2f 2a 0a 2a 2a 20 54  _THREADS./*.** T
3c80: 68 69 73 20 76 61 72 69 61 62 6c 65 20 72 65 63  his variable rec
3c90: 6f 72 64 73 20 77 68 65 74 68 65 72 20 6f 72 20  ords whether or 
3ca0: 6e 6f 74 20 74 68 72 65 61 64 73 20 63 61 6e 20  not threads can 
3cb0: 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74  override each ot
3cc0: 68 65 72 73 0a 2a 2a 20 6c 6f 63 6b 73 2e 0a 2a  hers.** locks..*
3cd0: 2a 0a 2a 2a 20 20 20 20 30 3a 20 20 4e 6f 2e 20  *.**    0:  No. 
3ce0: 20 54 68 72 65 61 64 73 20 63 61 6e 6e 6f 74 20   Threads cannot 
3cf0: 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74  override each ot
3d00: 68 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2a 20 20  hers locks..**  
3d10: 20 20 31 3a 20 20 59 65 73 2e 20 20 54 68 72 65    1:  Yes.  Thre
3d20: 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65  ads can override
3d30: 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63   each others loc
3d40: 6b 73 2e 0a 2a 2a 20 20 20 2d 31 3a 20 20 57 65  ks..**   -1:  We
3d50: 20 64 6f 6e 27 74 20 6b 6e 6f 77 20 79 65 74 2e   don't know yet.
3d60: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20 73  .**.** On some s
3d70: 79 73 74 65 6d 73 2c 20 77 65 20 6b 6e 6f 77 20  ystems, we know 
3d80: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
3d90: 69 66 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f  if threads can o
3da0: 76 65 72 72 69 64 65 20 65 61 63 68 0a 2a 2a 20  verride each.** 
3db0: 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 20 20 4f  others locks.  O
3dc0: 6e 20 74 68 6f 73 65 20 73 79 73 74 65 6d 73 2c  n those systems,
3dd0: 20 74 68 65 20 53 51 4c 49 54 45 5f 54 48 52 45   the SQLITE_THRE
3de0: 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b  AD_OVERRIDE_LOCK
3df0: 20 6d 61 63 72 6f 0a 2a 2a 20 77 69 6c 6c 20 62   macro.** will b
3e00: 65 20 73 65 74 20 61 70 70 72 6f 70 72 69 61 74  e set appropriat
3e10: 65 6c 79 2e 20 20 4f 6e 20 6f 74 68 65 72 20 73  ely.  On other s
3e20: 79 73 74 65 6d 73 2c 20 77 65 20 68 61 76 65 20  ystems, we have 
3e30: 74 6f 20 63 68 65 63 6b 20 61 74 0a 2a 2a 20 72  to check at.** r
3e40: 75 6e 74 69 6d 65 2e 20 20 4f 6e 20 74 68 65 73  untime.  On thes
3e50: 65 20 6c 61 74 74 65 72 20 73 79 73 74 65 6d 73  e latter systems
3e60: 2c 20 53 51 4c 54 49 45 5f 54 48 52 45 41 44 5f  , SQLTIE_THREAD_
3e70: 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 20 69 73  OVERRIDE_LOCK is
3e80: 0a 2a 2a 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a  .** undefined..*
3e90: 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72 69 61 62  *.** This variab
3ea0: 6c 65 20 6e 6f 72 6d 61 6c 6c 79 20 68 61 73 20  le normally has 
3eb0: 66 69 6c 65 20 73 63 6f 70 65 20 6f 6e 6c 79 2e  file scope only.
3ec0: 20 20 42 75 74 20 64 75 72 69 6e 67 20 74 65 73    But during tes
3ed0: 74 69 6e 67 2c 20 77 65 20 6d 61 6b 65 0a 2a 2a  ting, we make.**
3ee0: 20 69 74 20 61 20 67 6c 6f 62 61 6c 20 73 6f 20   it a global so 
3ef0: 74 68 61 74 20 74 68 65 20 74 65 73 74 20 63 6f  that the test co
3f00: 64 65 20 63 61 6e 20 63 68 61 6e 67 65 20 69 74  de can change it
3f10: 73 20 76 61 6c 75 65 20 69 6e 20 6f 72 64 65 72  s value in order
3f20: 20 74 6f 20 76 65 72 69 66 79 0a 2a 2a 20 74 68   to verify.** th
3f30: 61 74 20 74 68 65 20 72 69 67 68 74 20 73 74 75  at the right stu
3f40: 66 66 20 68 61 70 70 65 6e 73 20 69 6e 20 65 69  ff happens in ei
3f50: 74 68 65 72 20 63 61 73 65 2e 0a 2a 2f 0a 23 69  ther case..*/.#i
3f60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 54 48 52  fndef SQLITE_THR
3f70: 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43  EAD_OVERRIDE_LOC
3f80: 4b 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  K.# define SQLIT
3f90: 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44  E_THREAD_OVERRID
3fa0: 45 5f 4c 4f 43 4b 20 2d 31 0a 23 65 6e 64 69 66  E_LOCK -1.#endif
3fb0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
3fc0: 45 53 54 0a 69 6e 74 20 74 68 72 65 61 64 73 4f  EST.int threadsO
3fd0: 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72  verrideEachOther
3fe0: 73 4c 6f 63 6b 73 20 3d 20 53 51 4c 49 54 45 5f  sLocks = SQLITE_
3ff0: 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f  THREAD_OVERRIDE_
4000: 4c 4f 43 4b 3b 0a 23 65 6c 73 65 0a 73 74 61 74  LOCK;.#else.stat
4010: 69 63 20 69 6e 74 20 74 68 72 65 61 64 73 4f 76  ic int threadsOv
4020: 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73  errideEachOthers
4030: 4c 6f 63 6b 73 20 3d 20 53 51 4c 49 54 45 5f 54  Locks = SQLITE_T
4040: 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c  HREAD_OVERRIDE_L
4050: 4f 43 4b 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  OCK;.#endif../*.
4060: 2a 2a 20 54 68 69 73 20 73 74 72 75 63 74 75 72  ** This structur
4070: 65 20 68 6f 6c 64 73 20 69 6e 66 6f 72 6d 61 74  e holds informat
4080: 69 6f 6e 20 70 61 73 73 65 64 20 69 6e 74 6f 20  ion passed into 
4090: 69 6e 64 69 76 69 64 75 61 6c 20 74 65 73 74 0a  individual test.
40a0: 2a 2a 20 74 68 72 65 61 64 73 20 62 79 20 74 68  ** threads by th
40b0: 65 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b  e testThreadLock
40c0: 69 6e 67 42 65 68 61 76 69 6f 72 28 29 20 72 6f  ingBehavior() ro
40d0: 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  utine..*/.struct
40e0: 20 74 68 72 65 61 64 54 65 73 74 44 61 74 61 20   threadTestData 
40f0: 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20  {.  int fd;     
4100: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
4110: 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
4120: 2a 2f 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  */.  struct floc
4130: 6b 20 6c 6f 63 6b 3b 20 20 20 20 20 2f 2a 20 54  k lock;     /* T
4140: 68 65 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  he locking opera
4150: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tion */.  int re
4160: 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20  sult;           
4170: 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 74 68   /* Result of th
4180: 65 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74  e locking operat
4190: 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 64 65  ion */.};..#ifde
41a0: 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52  f SQLITE_LOCK_TR
41b0: 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  ACE./*.** Print 
41c0: 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  out information 
41d0: 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e  about all lockin
41e0: 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a  g operations..**
41f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4200: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 72 6f   is used for tro
4210: 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f 63  ubleshooting loc
4220: 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65 61  ks on multithrea
4230: 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 73  ded.** platforms
4240: 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63 6f 6d  .  Enable by com
4250: 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68 65 20  piling with the 
4260: 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52  -DSQLITE_LOCK_TR
4270: 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c  ACE.** command-l
4280: 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74 68  ine option on th
4290: 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68 69  e compiler.  Thi
42a0: 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61 6c  s code is normal
42b0: 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66  ly.** turned off
42c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
42d0: 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20 66 64  lockTrace(int fd
42e0: 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75 63 74  , int op, struct
42f0: 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63 68   flock *p){.  ch
4300: 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54  ar *zOpName, *zT
4310: 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20 20  ype;.  int s;.  
4320: 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a  int savedErrno;.
4330: 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54 4c    if( op==F_GETL
4340: 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65  K ){.    zOpName
4350: 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d 65   = "GETLK";.  }e
4360: 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53 45  lse if( op==F_SE
4370: 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61  TLK ){.    zOpNa
4380: 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20 20  me = "SETLK";.  
4390: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20 66  }else{.    s = f
43a0: 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b  cntl(fd, op, p);
43b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
43c0: 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 75  gPrintf("fcntl u
43d0: 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25 64 5c  nknown %d %d %d\
43e0: 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a  n", fd, op, s);.
43f0: 20 20 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20      return s;.  
4400: 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  }.  if( p->l_typ
4410: 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
4420: 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b    zType = "RDLCK
4430: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  ";.  }else if( p
4440: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43  ->l_type==F_WRLC
4450: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
4460: 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "WRLCK";.  }els
4470: 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d  e if( p->l_type=
4480: 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
4490: 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b  zType = "UNLCK";
44a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
44b0: 73 65 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20  sert( 0 );.  }. 
44c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68   assert( p->l_wh
44d0: 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29  ence==SEEK_SET )
44e0: 3b 0a 20 20 73 20 3d 20 66 63 6e 74 6c 28 66 64  ;.  s = fcntl(fd
44f0: 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76 65  , op, p);.  save
4500: 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  dErrno = errno;.
4510: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
4520: 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20 25  intf("fcntl %d %
4530: 64 20 25 73 20 25 73 20 25 64 20 25 64 20 25 64  d %s %s %d %d %d
4540: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72   %d\n",.     thr
4550: 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61  eadid, fd, zOpNa
4560: 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74 29  me, zType, (int)
4570: 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74  p->l_start, (int
4580: 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20  )p->l_len,.     
4590: 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73  (int)p->l_pid, s
45a0: 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31 29  );.  if( s==(-1)
45b0: 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20   && op==F_SETLK 
45c0: 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  && (p->l_type==F
45d0: 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74  _RDLCK || p->l_t
45e0: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b  ype==F_WRLCK) ){
45f0: 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63  .    struct floc
4600: 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a  k l2;.    l2 = *
4610: 70 3b 0a 20 20 20 20 66 63 6e 74 6c 28 66 64 2c  p;.    fcntl(fd,
4620: 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a   F_GETLK, &l2);.
4630: 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70      if( l2.l_typ
4640: 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
4650: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c      zType = "RDL
4660: 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  CK";.    }else i
4670: 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f  f( l2.l_type==F_
4680: 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a  WRLCK ){.      z
4690: 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a  Type = "WRLCK";.
46a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32      }else if( l2
46b0: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b  .l_type==F_UNLCK
46c0: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
46d0: 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "UNLCK";.    }
46e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
46f0: 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20  rt( 0 );.    }. 
4700: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
4710: 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66 61 69  rintf("fcntl-fai
4720: 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20  lure-reason: %s 
4730: 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20  %d %d %d\n",.   
4740: 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e 74 29      zType, (int)
4750: 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74  l2.l_start, (int
4760: 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29  )l2.l_len, (int)
4770: 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20  l2.l_pid);.  }. 
4780: 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64 45 72   errno = savedEr
4790: 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b  rno;.  return s;
47a0: 0a 7d 0a 23 64 65 66 69 6e 65 20 66 63 6e 74 6c  .}.#define fcntl
47b0: 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64 69   lockTrace.#endi
47c0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  f /* SQLITE_LOCK
47d0: 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _TRACE */../*.**
47e0: 20 54 68 65 20 74 65 73 74 54 68 72 65 61 64 4c   The testThreadL
47f0: 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29  ockingBehavior()
4800: 20 72 6f 75 74 69 6e 65 20 6c 61 75 6e 63 68 65   routine launche
4810: 73 20 74 77 6f 20 73 65 70 61 72 61 74 65 0a 2a  s two separate.*
4820: 2a 20 74 68 72 65 61 64 73 20 6f 6e 20 74 68 69  * threads on thi
4830: 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 69 73  s routine.  This
4840: 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
4850: 73 20 74 6f 20 6c 6f 63 6b 20 61 20 66 69 6c 65  s to lock a file
4860: 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74  .** descriptor t
4870: 68 65 6e 20 72 65 74 75 72 6e 73 2e 20 20 54 68  hen returns.  Th
4880: 65 20 73 75 63 63 65 73 73 20 6f 72 20 66 61 69  e success or fai
4890: 6c 75 72 65 20 6f 66 20 74 68 61 74 20 61 74 74  lure of that att
48a0: 65 6d 70 74 0a 2a 2a 20 61 6c 6c 6f 77 73 20 74  empt.** allows t
48b0: 68 65 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63  he testThreadLoc
48c0: 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29 20 70  kingBehavior() p
48d0: 72 6f 63 65 64 75 72 65 20 74 6f 20 64 65 74 65  rocedure to dete
48e0: 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72  rmine.** whether
48f0: 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 73 20   or not threads 
4900: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63  can override eac
4910: 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 0a  h others locks..
4920: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
4930: 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73  threadLockingTes
4940: 74 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  t(void *pArg){. 
4950: 20 73 74 72 75 63 74 20 74 68 72 65 61 64 54 65   struct threadTe
4960: 73 74 44 61 74 61 20 2a 70 44 61 74 61 20 3d 20  stData *pData = 
4970: 28 73 74 72 75 63 74 20 74 68 72 65 61 64 54 65  (struct threadTe
4980: 73 74 44 61 74 61 2a 29 70 41 72 67 3b 0a 20 20  stData*)pArg;.  
4990: 70 44 61 74 61 2d 3e 72 65 73 75 6c 74 20 3d 20  pData->result = 
49a0: 66 63 6e 74 6c 28 70 44 61 74 61 2d 3e 66 64 2c  fcntl(pData->fd,
49b0: 20 46 5f 53 45 54 4c 4b 2c 20 26 70 44 61 74 61   F_SETLK, &pData
49c0: 2d 3e 6c 6f 63 6b 29 3b 0a 20 20 72 65 74 75 72  ->lock);.  retur
49d0: 6e 20 70 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pArg;.}../*.**
49e0: 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   This procedure 
49f0: 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65  attempts to dete
4a00: 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
4a10: 20 6e 6f 74 20 74 68 72 65 61 64 73 0a 2a 2a 20   not threads.** 
4a20: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63  can override eac
4a30: 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20 74  h others locks t
4a40: 68 65 6e 20 73 65 74 73 20 74 68 65 20 0a 2a 2a  hen sets the .**
4a50: 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65   threadsOverride
4a60: 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20  EachOthersLocks 
4a70: 76 61 72 69 61 62 6c 65 20 61 70 70 72 6f 70 72  variable appropr
4a80: 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  iately..*/.stati
4a90: 63 20 76 6f 69 64 20 74 65 73 74 54 68 72 65 61  c void testThrea
4aa0: 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72  dLockingBehavior
4ab0: 28 69 6e 74 20 66 64 5f 6f 72 69 67 29 7b 0a 20  (int fd_orig){. 
4ac0: 20 69 6e 74 20 66 64 3b 0a 20 20 73 74 72 75 63   int fd;.  struc
4ad0: 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74 61  t threadTestData
4ae0: 20 64 5b 32 5d 3b 0a 20 20 70 74 68 72 65 61 64   d[2];.  pthread
4af0: 5f 74 20 74 5b 32 5d 3b 0a 0a 20 20 66 64 20 3d  _t t[2];..  fd =
4b00: 20 64 75 70 28 66 64 5f 6f 72 69 67 29 3b 0a 20   dup(fd_orig);. 
4b10: 20 69 66 28 20 66 64 3c 30 20 29 20 72 65 74 75   if( fd<0 ) retu
4b20: 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 64 2c 20  rn;.  memset(d, 
4b30: 30 2c 20 73 69 7a 65 6f 66 28 64 29 29 3b 0a 20  0, sizeof(d));. 
4b40: 20 64 5b 30 5d 2e 66 64 20 3d 20 66 64 3b 0a 20   d[0].fd = fd;. 
4b50: 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 74 79 70   d[0].lock.l_typ
4b60: 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 64  e = F_RDLCK;.  d
4b70: 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  [0].lock.l_len =
4b80: 20 31 3b 0a 20 20 64 5b 30 5d 2e 6c 6f 63 6b 2e   1;.  d[0].lock.
4b90: 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 64  l_start = 0;.  d
4ba0: 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63  [0].lock.l_whenc
4bb0: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
4bc0: 64 5b 31 5d 20 3d 20 64 5b 30 5d 3b 0a 20 20 64  d[1] = d[0];.  d
4bd0: 5b 31 5d 2e 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20  [1].lock.l_type 
4be0: 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 70 74 68  = F_WRLCK;.  pth
4bf0: 72 65 61 64 5f 63 72 65 61 74 65 28 26 74 5b 30  read_create(&t[0
4c00: 5d 2c 20 30 2c 20 74 68 72 65 61 64 4c 6f 63 6b  ], 0, threadLock
4c10: 69 6e 67 54 65 73 74 2c 20 26 64 5b 30 5d 29 3b  ingTest, &d[0]);
4c20: 0a 20 20 70 74 68 72 65 61 64 5f 63 72 65 61 74  .  pthread_creat
4c30: 65 28 26 74 5b 31 5d 2c 20 30 2c 20 74 68 72 65  e(&t[1], 0, thre
4c40: 61 64 4c 6f 63 6b 69 6e 67 54 65 73 74 2c 20 26  adLockingTest, &
4c50: 64 5b 31 5d 29 3b 0a 20 20 70 74 68 72 65 61 64  d[1]);.  pthread
4c60: 5f 6a 6f 69 6e 28 74 5b 30 5d 2c 20 30 29 3b 0a  _join(t[0], 0);.
4c70: 20 20 70 74 68 72 65 61 64 5f 6a 6f 69 6e 28 74    pthread_join(t
4c80: 5b 31 5d 2c 20 30 29 3b 0a 20 20 63 6c 6f 73 65  [1], 0);.  close
4c90: 28 66 64 29 3b 0a 20 20 74 68 72 65 61 64 73 4f  (fd);.  threadsO
4ca0: 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72  verrideEachOther
4cb0: 73 4c 6f 63 6b 73 20 3d 20 20 64 5b 30 5d 2e 72  sLocks =  d[0].r
4cc0: 65 73 75 6c 74 3d 3d 30 20 26 26 20 64 5b 31 5d  esult==0 && d[1]
4cd0: 2e 72 65 73 75 6c 74 3d 3d 30 3b 0a 7d 0a 23 65  .result==0;.}.#e
4ce0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55  ndif /* SQLITE_U
4cf0: 4e 49 58 5f 54 48 52 45 41 44 53 20 2a 2f 0a 0a  NIX_THREADS */..
4d00: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
4d10: 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75  lockInfo structu
4d20: 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c  re previously al
4d30: 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e 64 4c  located by findL
4d40: 6f 63 6b 49 6e 66 6f 28 29 2e 0a 2a 2f 0a 73 74  ockInfo()..*/.st
4d50: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
4d60: 65 4c 6f 63 6b 49 6e 66 6f 28 73 74 72 75 63 74  eLockInfo(struct
4d70: 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b   lockInfo *pLock
4d80: 29 7b 0a 20 20 69 66 20 28 70 4c 6f 63 6b 20 3d  ){.  if (pLock =
4d90: 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 72 65 74 75  = NULL).    retu
4da0: 72 6e 3b 0a 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65  rn;.  pLock->nRe
4db0: 66 2d 2d 3b 0a 20 20 69 66 28 20 70 4c 6f 63 6b  f--;.  if( pLock
4dc0: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
4dd0: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
4de0: 72 74 28 26 6c 6f 63 6b 48 61 73 68 2c 20 26 70  rt(&lockHash, &p
4df0: 4c 6f 63 6b 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f  Lock->key, sizeo
4e00: 66 28 70 4c 6f 63 6b 2d 3e 6b 65 79 29 2c 20 30  f(pLock->key), 0
4e10: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
4e20: 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a  ree(pLock);.  }.
4e30: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
4e40: 20 61 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63   a openCnt struc
4e50: 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20  ture previously 
4e60: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e  allocated by fin
4e70: 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e 0a 2a 2f 0a  dLockInfo()..*/.
4e80: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
4e90: 61 73 65 4f 70 65 6e 43 6e 74 28 73 74 72 75 63  aseOpenCnt(struc
4ea0: 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e  t openCnt *pOpen
4eb0: 29 7b 0a 20 20 69 66 20 28 70 4f 70 65 6e 20 3d  ){.  if (pOpen =
4ec0: 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 72 65 74 75  = NULL).    retu
4ed0: 72 6e 3b 0a 20 20 70 4f 70 65 6e 2d 3e 6e 52 65  rn;.  pOpen->nRe
4ee0: 66 2d 2d 3b 0a 20 20 69 66 28 20 70 4f 70 65 6e  f--;.  if( pOpen
4ef0: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
4f00: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
4f10: 72 74 28 26 6f 70 65 6e 48 61 73 68 2c 20 26 70  rt(&openHash, &p
4f20: 4f 70 65 6e 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f  Open->key, sizeo
4f30: 66 28 70 4f 70 65 6e 2d 3e 6b 65 79 29 2c 20 30  f(pOpen->key), 0
4f40: 29 3b 0a 20 20 20 20 66 72 65 65 28 70 4f 70 65  );.    free(pOpe
4f50: 6e 2d 3e 61 50 65 6e 64 69 6e 67 29 3b 0a 20 20  n->aPending);.  
4f60: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
4f70: 4f 70 65 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  Open);.  }.}..#i
4f80: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
4f90: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
4fa0: 0a 2f 2a 0a 2a 2a 20 54 65 73 74 73 20 61 20 62  ./*.** Tests a b
4fb0: 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 69 6e  yte-range lockin
4fc0: 67 20 71 75 65 72 79 20 74 6f 20 73 65 65 20 69  g query to see i
4fd0: 66 20 62 79 74 65 20 72 61 6e 67 65 20 6c 6f 63  f byte range loc
4fe0: 6b 73 20 61 72 65 20 0a 2a 2a 20 73 75 70 70 6f  ks are .** suppo
4ff0: 72 74 65 64 2c 20 69 66 20 6e 6f 74 20 77 65 20  rted, if not we 
5000: 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 64 6f 74  fall back to dot
5010: 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  lockLockingStyle
5020: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  ..*/.static sqli
5030: 74 65 33 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  te3LockingStyle 
5040: 73 71 6c 69 74 65 33 54 65 73 74 4c 6f 63 6b 69  sqlite3TestLocki
5050: 6e 67 53 74 79 6c 65 28 63 6f 6e 73 74 20 63 68  ngStyle(const ch
5060: 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 0a 20  ar *filePath, . 
5070: 20 69 6e 74 20 66 64 29 20 7b 0a 20 20 2f 2a 20   int fd) {.  /* 
5080: 74 65 73 74 20 62 79 74 65 2d 72 61 6e 67 65 20  test byte-range 
5090: 6c 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e 74 6c  lock using fcntl
50a0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 66 6c 6f   */.  struct flo
50b0: 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 20 20 0a  ck lockInfo;.  .
50c0: 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e    lockInfo.l_len
50d0: 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f   = 1;.  lockInfo
50e0: 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  .l_start = 0;.  
50f0: 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63  lockInfo.l_whenc
5100: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
5110: 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20  lockInfo.l_type 
5120: 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 0a 20 20  = F_RDLCK;.  .  
5130: 69 66 20 28 66 63 6e 74 6c 28 66 64 2c 20 46 5f  if (fcntl(fd, F_
5140: 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f  GETLK, &lockInfo
5150: 29 20 21 3d 20 2d 31 29 20 7b 0a 20 20 20 20 72  ) != -1) {.    r
5160: 65 74 75 72 6e 20 70 6f 73 69 78 4c 6f 63 6b 69  eturn posixLocki
5170: 6e 67 53 74 79 6c 65 3b 0a 20 20 7d 20 0a 20 20  ngStyle;.  } .  
5180: 0a 20 20 2f 2a 20 74 65 73 74 69 6e 67 20 66 6f  .  /* testing fo
5190: 72 20 66 6c 6f 63 6b 20 63 61 6e 20 67 69 76 65  r flock can give
51a0: 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 73   false positives
51b0: 2e 20 20 53 6f 20 69 66 20 69 66 20 74 68 65 20  .  So if if the 
51c0: 61 62 6f 76 65 20 74 65 73 74 0a 20 20 2a 2a 20  above test.  ** 
51d0: 66 61 69 6c 73 2c 20 74 68 65 6e 20 77 65 20 66  fails, then we f
51e0: 61 6c 6c 20 62 61 63 6b 20 74 6f 20 75 73 69 6e  all back to usin
51f0: 67 20 64 6f 74 2d 6c 6f 63 6b 20 73 74 79 6c 65  g dot-lock style
5200: 20 6c 6f 63 6b 69 6e 67 2e 0a 20 20 2a 2f 20 20   locking..  */  
5210: 0a 20 20 72 65 74 75 72 6e 20 64 6f 74 6c 6f 63  .  return dotloc
5220: 6b 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 7d  kLockingStyle;.}
5230: 0a 0a 2f 2a 20 0a 2a 2a 20 45 78 61 6d 69 6e 65  ../* .** Examine
5240: 73 20 74 68 65 20 66 5f 66 73 74 79 70 65 6e 61  s the f_fstypena
5250: 6d 65 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  me entry in the 
5260: 73 74 61 74 66 73 20 73 74 72 75 63 74 75 72 65  statfs structure
5270: 20 61 73 20 72 65 74 75 72 6e 65 64 20 62 79 20   as returned by 
5280: 0a 2a 2a 20 73 74 61 74 28 29 20 66 6f 72 20 74  .** stat() for t
5290: 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 20 68  he file system h
52a0: 6f 73 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  osting the datab
52b0: 61 73 65 20 66 69 6c 65 2c 20 61 73 73 69 67 6e  ase file, assign
52c0: 73 20 74 68 65 20 0a 2a 2a 20 61 70 70 72 6f 70  s the .** approp
52d0: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
52e0: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 69 74 27  yle based on it'
52f0: 73 20 76 61 6c 75 65 2e 20 20 54 68 65 73 65 20  s value.  These 
5300: 76 61 6c 75 65 73 20 61 6e 64 20 0a 2a 2a 20 61  values and .** a
5310: 73 73 69 67 6e 6d 65 6e 74 73 20 61 72 65 20 62  ssignments are b
5320: 61 73 65 64 20 6f 6e 20 44 61 72 77 69 6e 2f 4f  ased on Darwin/O
5330: 53 58 20 62 65 68 61 76 69 6f 72 20 61 6e 64 20  SX behavior and 
5340: 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 74 65  have not been te
5350: 73 74 65 64 20 6f 6e 20 0a 2a 2a 20 6f 74 68 65  sted on .** othe
5360: 72 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 73 74  r systems..*/.st
5370: 61 74 69 63 20 73 71 6c 69 74 65 33 4c 6f 63 6b  atic sqlite3Lock
5380: 69 6e 67 53 74 79 6c 65 20 73 71 6c 69 74 65 33  ingStyle sqlite3
5390: 44 65 74 65 63 74 4c 6f 63 6b 69 6e 67 53 74 79  DetectLockingSty
53a0: 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  le(const char *f
53b0: 69 6c 65 50 61 74 68 2c 20 0a 20 20 69 6e 74 20  ilePath, .  int 
53c0: 66 64 29 20 7b 0a 0a 23 69 66 64 65 66 20 53 51  fd) {..#ifdef SQ
53d0: 4c 49 54 45 5f 46 49 58 45 44 5f 4c 4f 43 4b 49  LITE_FIXED_LOCKI
53e0: 4e 47 5f 53 54 59 4c 45 0a 20 20 72 65 74 75 72  NG_STYLE.  retur
53f0: 6e 20 28 73 71 6c 69 74 65 33 4c 6f 63 6b 69 6e  n (sqlite3Lockin
5400: 67 53 74 79 6c 65 29 53 51 4c 49 54 45 5f 46 49  gStyle)SQLITE_FI
5410: 58 45 44 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  XED_LOCKING_STYL
5420: 45 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63  E;.#else.  struc
5430: 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b  t statfs fsInfo;
5440: 0a 0a 20 20 69 66 20 28 73 74 61 74 66 73 28 66  ..  if (statfs(f
5450: 69 6c 65 50 61 74 68 2c 20 26 66 73 49 6e 66 6f  ilePath, &fsInfo
5460: 29 20 3d 3d 20 2d 31 29 0a 20 20 20 20 72 65 74  ) == -1).    ret
5470: 75 72 6e 20 73 71 6c 69 74 65 33 54 65 73 74 4c  urn sqlite3TestL
5480: 6f 63 6b 69 6e 67 53 74 79 6c 65 28 66 69 6c 65  ockingStyle(file
5490: 50 61 74 68 2c 20 66 64 29 3b 0a 20 20 0a 20 20  Path, fd);.  .  
54a0: 69 66 20 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61  if (fsInfo.f_fla
54b0: 67 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 29  gs & MNT_RDONLY)
54c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 6e 6f 4c 6f  .    return noLo
54d0: 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 0a 20  ckingStyle;.  . 
54e0: 20 69 66 28 20 28 21 73 74 72 63 6d 70 28 66 73   if( (!strcmp(fs
54f0: 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d  Info.f_fstypenam
5500: 65 2c 20 22 68 66 73 22 29 29 20 7c 7c 0a 20 20  e, "hfs")) ||.  
5510: 20 20 28 21 73 74 72 63 6d 70 28 66 73 49 6e 66    (!strcmp(fsInf
5520: 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
5530: 22 75 66 73 22 29 29 20 29 0a 20 20 20 20 20 20  "ufs")) ).      
5540: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
5550: 20 70 6f 73 69 78 4c 6f 63 6b 69 6e 67 53 74 79   posixLockingSty
5560: 6c 65 3b 0a 20 20 0a 20 20 69 66 28 21 73 74 72  le;.  .  if(!str
5570: 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74  cmp(fsInfo.f_fst
5580: 79 70 65 6e 61 6d 65 2c 20 22 61 66 70 66 73 22  ypename, "afpfs"
5590: 29 29 0a 20 20 20 20 72 65 74 75 72 6e 20 61 66  )).    return af
55a0: 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20  pLockingStyle;. 
55b0: 20 0a 20 20 69 66 28 21 73 74 72 63 6d 70 28 66   .  if(!strcmp(f
55c0: 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
55d0: 6d 65 2c 20 22 6e 66 73 22 29 29 20 0a 20 20 20  me, "nfs")) .   
55e0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54   return sqlite3T
55f0: 65 73 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28  estLockingStyle(
5600: 66 69 6c 65 50 61 74 68 2c 20 66 64 29 3b 0a 20  filePath, fd);. 
5610: 20 0a 20 20 69 66 28 21 73 74 72 63 6d 70 28 66   .  if(!strcmp(f
5620: 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
5630: 6d 65 2c 20 22 73 6d 62 66 73 22 29 29 0a 20 20  me, "smbfs")).  
5640: 20 20 72 65 74 75 72 6e 20 66 6c 6f 63 6b 4c 6f    return flockLo
5650: 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 0a 20  ckingStyle;.  . 
5660: 20 69 66 28 21 73 74 72 63 6d 70 28 66 73 49 6e   if(!strcmp(fsIn
5670: 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
5680: 20 22 6d 73 64 6f 73 22 29 29 0a 20 20 20 20 72   "msdos")).    r
5690: 65 74 75 72 6e 20 64 6f 74 6c 6f 63 6b 4c 6f 63  eturn dotlockLoc
56a0: 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 0a 20 20  kingStyle;.  .  
56b0: 69 66 28 21 73 74 72 63 6d 70 28 66 73 49 6e 66  if(!strcmp(fsInf
56c0: 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
56d0: 22 77 65 62 64 61 76 22 29 29 0a 20 20 20 20 72  "webdav")).    r
56e0: 65 74 75 72 6e 20 75 6e 73 75 70 70 6f 72 74 65  eturn unsupporte
56f0: 64 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20  dLockingStyle;. 
5700: 20 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74   .  return sqlit
5710: 65 33 54 65 73 74 4c 6f 63 6b 69 6e 67 53 74 79  e3TestLockingSty
5720: 6c 65 28 66 69 6c 65 50 61 74 68 2c 20 66 64 29  le(filePath, fd)
5730: 3b 20 20 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;  .#endif /* SQ
5740: 4c 49 54 45 5f 46 49 58 45 44 5f 4c 4f 43 4b 49  LITE_FIXED_LOCKI
5750: 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 7d 0a 0a 23  NG_STYLE */.}..#
5760: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
5770: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
5780: 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  TYLE */../*.** G
5790: 69 76 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63  iven a file desc
57a0: 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20 6c  riptor, locate l
57b0: 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 6f 70 65 6e  ockInfo and open
57c0: 43 6e 74 20 73 74 72 75 63 74 75 72 65 73 20 74  Cnt structures t
57d0: 68 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73  hat.** describes
57e0: 20 74 68 61 74 20 66 69 6c 65 20 64 65 73 63 72   that file descr
57f0: 69 70 74 6f 72 2e 20 20 43 72 65 61 74 65 20 6e  iptor.  Create n
5800: 65 77 20 6f 6e 65 73 20 69 66 20 6e 65 63 65 73  ew ones if neces
5810: 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65  sary.  The.** re
5820: 74 75 72 6e 20 76 61 6c 75 65 73 20 6d 69 67 68  turn values migh
5830: 74 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a  t be uninitializ
5840: 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  ed if an error o
5850: 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ccurs..**.** Ret
5860: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
5870: 66 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 73 74 61  f errors..*/.sta
5880: 74 69 63 20 69 6e 74 20 66 69 6e 64 4c 6f 63 6b  tic int findLock
5890: 49 6e 66 6f 28 0a 20 20 69 6e 74 20 66 64 2c 20  Info(.  int fd, 
58a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
58c0: 20 64 65 73 63 72 69 70 74 6f 72 20 75 73 65 64   descriptor used
58d0: 20 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20   in the key */. 
58e0: 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f   struct lockInfo
58f0: 20 2a 2a 70 70 4c 6f 63 6b 2c 20 20 20 20 2f 2a   **ppLock,    /*
5900: 20 52 65 74 75 72 6e 20 74 68 65 20 6c 6f 63 6b   Return the lock
5910: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 68  Info structure h
5920: 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ere */.  struct 
5930: 6f 70 65 6e 43 6e 74 20 2a 2a 70 70 4f 70 65 6e  openCnt **ppOpen
5940: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
5950: 74 68 65 20 6f 70 65 6e 43 6e 74 20 73 74 72 75  the openCnt stru
5960: 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 29 7b  cture here */.){
5970: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72  .  int rc;.  str
5980: 75 63 74 20 6c 6f 63 6b 4b 65 79 20 6b 65 79 31  uct lockKey key1
5990: 3b 0a 20 20 73 74 72 75 63 74 20 6f 70 65 6e 4b  ;.  struct openK
59a0: 65 79 20 6b 65 79 32 3b 0a 20 20 73 74 72 75 63  ey key2;.  struc
59b0: 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 0a  t stat statbuf;.
59c0: 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66    struct lockInf
59d0: 6f 20 2a 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75  o *pLock;.  stru
59e0: 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65  ct openCnt *pOpe
59f0: 6e 3b 0a 20 20 72 63 20 3d 20 66 73 74 61 74 28  n;.  rc = fstat(
5a00: 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20  fd, &statbuf);. 
5a10: 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74   if( rc!=0 ) ret
5a20: 75 72 6e 20 31 3b 0a 0a 20 20 6d 65 6d 73 65 74  urn 1;..  memset
5a30: 28 26 6b 65 79 31 2c 20 30 2c 20 73 69 7a 65 6f  (&key1, 0, sizeo
5a40: 66 28 6b 65 79 31 29 29 3b 0a 20 20 6b 65 79 31  f(key1));.  key1
5a50: 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66 2e 73  .dev = statbuf.s
5a60: 74 5f 64 65 76 3b 0a 20 20 6b 65 79 31 2e 69 6e  t_dev;.  key1.in
5a70: 6f 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 69  o = statbuf.st_i
5a80: 6e 6f 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  no;.#ifdef SQLIT
5a90: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 20  E_UNIX_THREADS. 
5aa0: 20 69 66 28 20 74 68 72 65 61 64 73 4f 76 65 72   if( threadsOver
5ab0: 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f  rideEachOthersLo
5ac0: 63 6b 73 3c 30 20 29 7b 0a 20 20 20 20 74 65 73  cks<0 ){.    tes
5ad0: 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65  tThreadLockingBe
5ae0: 68 61 76 69 6f 72 28 66 64 29 3b 0a 20 20 7d 0a  havior(fd);.  }.
5af0: 20 20 6b 65 79 31 2e 74 69 64 20 3d 20 74 68 72    key1.tid = thr
5b00: 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68  eadsOverrideEach
5b10: 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3f 20 30 20  OthersLocks ? 0 
5b20: 3a 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29  : pthread_self()
5b30: 3b 0a 23 65 6e 64 69 66 0a 20 20 6d 65 6d 73 65  ;.#endif.  memse
5b40: 74 28 26 6b 65 79 32 2c 20 30 2c 20 73 69 7a 65  t(&key2, 0, size
5b50: 6f 66 28 6b 65 79 32 29 29 3b 0a 20 20 6b 65 79  of(key2));.  key
5b60: 32 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66 2e  2.dev = statbuf.
5b70: 73 74 5f 64 65 76 3b 0a 20 20 6b 65 79 32 2e 69  st_dev;.  key2.i
5b80: 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f  no = statbuf.st_
5b90: 69 6e 6f 3b 0a 20 20 70 4c 6f 63 6b 20 3d 20 28  ino;.  pLock = (
5ba0: 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 2a  struct lockInfo*
5bb0: 29 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64  )sqlite3HashFind
5bc0: 28 26 6c 6f 63 6b 48 61 73 68 2c 20 26 6b 65 79  (&lockHash, &key
5bd0: 31 2c 20 73 69 7a 65 6f 66 28 6b 65 79 31 29 29  1, sizeof(key1))
5be0: 3b 0a 20 20 69 66 28 20 70 4c 6f 63 6b 3d 3d 30  ;.  if( pLock==0
5bf0: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 6c   ){.    struct l
5c00: 6f 63 6b 49 6e 66 6f 20 2a 70 4f 6c 64 3b 0a 20  ockInfo *pOld;. 
5c10: 20 20 20 70 4c 6f 63 6b 20 3d 20 73 71 6c 69 74     pLock = sqlit
5c20: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
5c30: 66 28 2a 70 4c 6f 63 6b 29 20 29 3b 0a 20 20 20  f(*pLock) );.   
5c40: 20 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20 29 7b   if( pLock==0 ){
5c50: 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
5c60: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 66       goto exit_f
5c70: 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20  indlockinfo;.   
5c80: 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6b 65   }.    pLock->ke
5c90: 79 20 3d 20 6b 65 79 31 3b 0a 20 20 20 20 70 4c  y = key1;.    pL
5ca0: 6f 63 6b 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  ock->nRef = 1;. 
5cb0: 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20     pLock->cnt = 
5cc0: 30 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f  0;.    pLock->lo
5cd0: 63 6b 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20  cktype = 0;.    
5ce0: 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61  pOld = sqlite3Ha
5cf0: 73 68 49 6e 73 65 72 74 28 26 6c 6f 63 6b 48 61  shInsert(&lockHa
5d00: 73 68 2c 20 26 70 4c 6f 63 6b 2d 3e 6b 65 79 2c  sh, &pLock->key,
5d10: 20 73 69 7a 65 6f 66 28 6b 65 79 31 29 2c 20 70   sizeof(key1), p
5d20: 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 70  Lock);.    if( p
5d30: 4f 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Old!=0 ){.      
5d40: 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 4c  assert( pOld==pL
5d50: 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ock );.      sql
5d60: 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29  ite3_free(pLock)
5d70: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
5d80: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
5d90: 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20  findlockinfo;.  
5da0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
5db0: 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 2b 2b 3b 0a   pLock->nRef++;.
5dc0: 20 20 7d 0a 20 20 2a 70 70 4c 6f 63 6b 20 3d 20    }.  *ppLock = 
5dd0: 70 4c 6f 63 6b 3b 0a 20 20 69 66 28 20 70 70 4f  pLock;.  if( ppO
5de0: 70 65 6e 21 3d 30 20 29 7b 0a 20 20 20 20 70 4f  pen!=0 ){.    pO
5df0: 70 65 6e 20 3d 20 28 73 74 72 75 63 74 20 6f 70  pen = (struct op
5e00: 65 6e 43 6e 74 2a 29 73 71 6c 69 74 65 33 48 61  enCnt*)sqlite3Ha
5e10: 73 68 46 69 6e 64 28 26 6f 70 65 6e 48 61 73 68  shFind(&openHash
5e20: 2c 20 26 6b 65 79 32 2c 20 73 69 7a 65 6f 66 28  , &key2, sizeof(
5e30: 6b 65 79 32 29 29 3b 0a 20 20 20 20 69 66 28 20  key2));.    if( 
5e40: 70 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  pOpen==0 ){.    
5e50: 20 20 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74    struct openCnt
5e60: 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 20 20 70 4f   *pOld;.      pO
5e70: 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  pen = sqlite3_ma
5e80: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4f  lloc( sizeof(*pO
5e90: 70 65 6e 29 20 29 3b 0a 20 20 20 20 20 20 69 66  pen) );.      if
5ea0: 28 20 70 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20  ( pOpen==0 ){.  
5eb0: 20 20 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63        releaseLoc
5ec0: 6b 49 6e 66 6f 28 70 4c 6f 63 6b 29 3b 0a 20 20  kInfo(pLock);.  
5ed0: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
5ee0: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
5ef0: 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20  findlockinfo;.  
5f00: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 65      }.      pOpe
5f10: 6e 2d 3e 6b 65 79 20 3d 20 6b 65 79 32 3b 0a 20  n->key = key2;. 
5f20: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66       pOpen->nRef
5f30: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f 70 65   = 1;.      pOpe
5f40: 6e 2d 3e 6e 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20  n->nLock = 0;.  
5f50: 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64      pOpen->nPend
5f60: 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ing = 0;.      p
5f70: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d  Open->aPending =
5f80: 20 30 3b 0a 20 20 20 20 20 20 70 4f 6c 64 20 3d   0;.      pOld =
5f90: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
5fa0: 72 74 28 26 6f 70 65 6e 48 61 73 68 2c 20 26 70  rt(&openHash, &p
5fb0: 4f 70 65 6e 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f  Open->key, sizeo
5fc0: 66 28 6b 65 79 32 29 2c 20 70 4f 70 65 6e 29 3b  f(key2), pOpen);
5fd0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64 21  .      if( pOld!
5fe0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
5ff0: 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 4f 70 65  sert( pOld==pOpe
6000: 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  n );.        sql
6010: 69 74 65 33 5f 66 72 65 65 28 70 4f 70 65 6e 29  ite3_free(pOpen)
6020: 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
6030: 65 4c 6f 63 6b 49 6e 66 6f 28 70 4c 6f 63 6b 29  eLockInfo(pLock)
6040: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
6050: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
6060: 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f  xit_findlockinfo
6070: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
6080: 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e  lse{.      pOpen
6090: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a  ->nRef++;.    }.
60a0: 20 20 20 20 2a 70 70 4f 70 65 6e 20 3d 20 70 4f      *ppOpen = pO
60b0: 70 65 6e 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 66  pen;.  }..exit_f
60c0: 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3a 0a 20 20 72  indlockinfo:.  r
60d0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
60e0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
60f0: 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75  ./*.** Helper fu
6100: 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74  nction for print
6110: 69 6e 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e  ing out trace in
6120: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64  formation from d
6130: 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61  ebugging.** bina
6140: 72 69 65 73 2e 20 54 68 69 73 20 72 65 74 75 72  ries. This retur
6150: 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20 72 65  ns the string re
6160: 70 72 65 73 65 74 61 74 69 6f 6e 20 6f 66 20 74  presetation of t
6170: 68 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69  he supplied.** i
6180: 6e 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65  nteger lock-type
6190: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
61a0: 74 20 63 68 61 72 20 2a 6c 6f 63 6b 74 79 70 65  t char *locktype
61b0: 4e 61 6d 65 28 69 6e 74 20 6c 6f 63 6b 74 79 70  Name(int locktyp
61c0: 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20 6c 6f  e){.  switch( lo
61d0: 63 6b 74 79 70 65 20 29 7b 0a 20 20 63 61 73 65  cktype ){.  case
61e0: 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e   NO_LOCK: return
61f0: 20 22 4e 4f 4e 45 22 3b 0a 20 20 63 61 73 65 20   "NONE";.  case 
6200: 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74  SHARED_LOCK: ret
6210: 75 72 6e 20 22 53 48 41 52 45 44 22 3b 0a 20 20  urn "SHARED";.  
6220: 63 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f  case RESERVED_LO
6230: 43 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53 45  CK: return "RESE
6240: 52 56 45 44 22 3b 0a 20 20 63 61 73 65 20 50 45  RVED";.  case PE
6250: 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75  NDING_LOCK: retu
6260: 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20  rn "PENDING";.  
6270: 63 61 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c  case EXCLUSIVE_L
6280: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43  OCK: return "EXC
6290: 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72  LUSIVE";.  }.  r
62a0: 65 74 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d  eturn "ERROR";.}
62b0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
62c0: 66 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74  f we are current
62d0: 6c 79 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e  ly in a differen
62e0: 74 20 74 68 72 65 61 64 20 74 68 61 6e 20 74 68  t thread than th
62f0: 65 20 74 68 72 65 61 64 20 74 68 61 74 20 74 68  e thread that th
6300: 65 0a 2a 2a 20 75 6e 69 78 46 69 6c 65 20 61 72  e.** unixFile ar
6310: 67 75 6d 65 6e 74 20 62 65 6c 6f 6e 67 73 20 74  gument belongs t
6320: 6f 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72  o, then transfer
6330: 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68   ownership of th
6340: 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 6f 76  e unixFile.** ov
6350: 65 72 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  er to the curren
6360: 74 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  t thread..**.** 
6370: 41 20 75 6e 69 78 46 69 6c 65 20 69 73 20 6f 6e  A unixFile is on
6380: 6c 79 20 6f 77 6e 65 64 20 62 79 20 61 20 74 68  ly owned by a th
6390: 72 65 61 64 20 6f 6e 20 73 79 73 74 65 6d 73 20  read on systems 
63a0: 77 68 65 72 65 20 6f 6e 65 20 74 68 72 65 61 64  where one thread
63b0: 20 69 73 0a 2a 2a 20 75 6e 61 62 6c 65 20 74 6f   is.** unable to
63c0: 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20   override locks 
63d0: 63 72 65 61 74 65 64 20 62 79 20 61 20 64 69 66  created by a dif
63e0: 66 65 72 65 6e 74 20 74 68 72 65 61 64 2e 20 20  ferent thread.  
63f0: 52 65 64 48 61 74 39 20 69 73 0a 2a 2a 20 61 6e  RedHat9 is.** an
6400: 20 65 78 61 6d 70 6c 65 20 6f 66 20 73 75 63 68   example of such
6410: 20 61 20 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a   a system..**.**
6420: 20 4f 77 6e 65 72 73 68 69 70 20 74 72 61 6e 73   Ownership trans
6430: 66 65 72 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f  fer is only allo
6440: 77 65 64 20 69 66 20 74 68 65 20 75 6e 69 78 46  wed if the unixF
6450: 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ile is currently
6460: 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2a 20 49 66   unlocked..** If
6470: 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 69 73   the unixFile is
6480: 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 6f   locked and an o
6490: 77 6e 65 72 73 68 69 70 20 69 73 20 77 72 6f 6e  wnership is wron
64a0: 67 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a  g, then return.*
64b0: 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e  * SQLITE_MISUSE.
64c0: 20 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72    SQLITE_OK is r
64d0: 65 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79  eturned if every
64e0: 74 68 69 6e 67 20 77 6f 72 6b 73 2e 0a 2a 2f 0a  thing works..*/.
64f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e  #ifdef SQLITE_UN
6500: 49 58 5f 54 48 52 45 41 44 53 0a 73 74 61 74 69  IX_THREADS.stati
6510: 63 20 69 6e 74 20 74 72 61 6e 73 66 65 72 4f 77  c int transferOw
6520: 6e 65 72 73 68 69 70 28 75 6e 69 78 46 69 6c 65  nership(unixFile
6530: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
6540: 72 63 3b 0a 20 20 70 74 68 72 65 61 64 5f 74 20  rc;.  pthread_t 
6550: 68 53 65 6c 66 3b 0a 20 20 69 66 28 20 74 68 72  hSelf;.  if( thr
6560: 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68  eadsOverrideEach
6570: 4f 74 68 65 72 73 4c 6f 63 6b 73 20 29 7b 0a 20  OthersLocks ){. 
6580: 20 20 20 2f 2a 20 4f 77 6e 65 72 73 68 69 70 20     /* Ownership 
6590: 74 72 61 6e 73 66 65 72 73 20 6e 6f 74 20 6e 65  transfers not ne
65a0: 65 64 65 64 20 6f 6e 20 74 68 69 73 20 73 79 73  eded on this sys
65b0: 74 65 6d 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  tem */.    retur
65c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
65d0: 0a 20 20 68 53 65 6c 66 20 3d 20 70 74 68 72 65  .  hSelf = pthre
65e0: 61 64 5f 73 65 6c 66 28 29 3b 0a 20 20 69 66 28  ad_self();.  if(
65f0: 20 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28 70   pthread_equal(p
6600: 46 69 6c 65 2d 3e 74 69 64 2c 20 68 53 65 6c 66  File->tid, hSelf
6610: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61  ) ){.    /* We a
6620: 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 20  re still in the 
6630: 73 61 6d 65 20 74 68 72 65 61 64 20 2a 2f 0a 20  same thread */. 
6640: 20 20 20 4f 53 54 52 41 43 45 31 28 22 4e 6f 2d     OSTRACE1("No-
6650: 74 72 61 6e 73 66 65 72 2c 20 73 61 6d 65 20 74  transfer, same t
6660: 68 72 65 61 64 5c 6e 22 29 3b 0a 20 20 20 20 72  hread\n");.    r
6670: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6680: 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65  .  }.  if( pFile
6690: 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c  ->locktype!=NO_L
66a0: 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65  OCK ){.    /* We
66b0: 20 63 61 6e 6e 6f 74 20 63 68 61 6e 67 65 20 6f   cannot change o
66c0: 77 6e 65 72 73 68 69 70 20 77 68 69 6c 65 20 77  wnership while w
66d0: 65 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 61 20  e are holding a 
66e0: 6c 6f 63 6b 21 20 2a 2f 0a 20 20 20 20 72 65 74  lock! */.    ret
66f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
6700: 45 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  E;.  }.  OSTRACE
6710: 34 28 22 54 72 61 6e 73 66 65 72 20 6f 77 6e 65  4("Transfer owne
6720: 72 73 68 69 70 20 6f 66 20 25 64 20 66 72 6f 6d  rship of %d from
6730: 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c 0a 20 20   %d to %d\n",.  
6740: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
6750: 3e 68 2c 20 70 46 69 6c 65 2d 3e 74 69 64 2c 20  >h, pFile->tid, 
6760: 68 53 65 6c 66 29 3b 0a 20 20 70 46 69 6c 65 2d  hSelf);.  pFile-
6770: 3e 74 69 64 20 3d 20 68 53 65 6c 66 3b 0a 20 20  >tid = hSelf;.  
6780: 69 66 20 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  if (pFile->pLock
6790: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20   != NULL) {.    
67a0: 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28  releaseLockInfo(
67b0: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29 3b 0a 20  pFile->pLock);. 
67c0: 20 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b     rc = findLock
67d0: 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 68 2c 20 26  Info(pFile->h, &
67e0: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2c 20 30 29  pFile->pLock, 0)
67f0: 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 35 28 22  ;.    OSTRACE5("
6800: 4c 4f 43 4b 20 20 20 20 25 64 20 69 73 20 6e 6f  LOCK    %d is no
6810: 77 20 25 73 28 25 73 2c 25 64 29 5c 6e 22 2c 20  w %s(%s,%d)\n", 
6820: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
6830: 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d       locktypeNam
6840: 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  e(pFile->locktyp
6850: 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c  e),.           l
6860: 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69 6c  ocktypeName(pFil
6870: 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79  e->pLock->lockty
6880: 70 65 29 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f 63  pe), pFile->pLoc
6890: 6b 2d 3e 63 6e 74 29 3b 0a 20 20 20 20 72 65 74  k->cnt);.    ret
68a0: 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65  urn rc;.  } else
68b0: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51   {.    return SQ
68c0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 23  LITE_OK;.  }.}.#
68d0: 65 6c 73 65 0a 20 20 2f 2a 20 4f 6e 20 73 69 6e  else.  /* On sin
68e0: 67 6c 65 2d 74 68 72 65 61 64 65 64 20 62 75 69  gle-threaded bui
68f0: 6c 64 73 2c 20 6f 77 6e 65 72 73 68 69 70 20 74  lds, ownership t
6900: 72 61 6e 73 66 65 72 20 69 73 20 61 20 6e 6f 2d  ransfer is a no-
6910: 6f 70 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 74  op */.# define t
6920: 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70  ransferOwnership
6930: 28 58 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65  (X) SQLITE_OK.#e
6940: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  ndif../*.** Dele
6950: 74 65 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c  te the named fil
6960: 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  e.*/.int sqlite3
6970: 55 6e 69 78 44 65 6c 65 74 65 28 63 6f 6e 73 74  UnixDelete(const
6980: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
6990: 29 7b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ){.  SimulateIOE
69a0: 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
69b0: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29  TE_IOERR_DELETE)
69c0: 3b 0a 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65  ;.  unlink(zFile
69d0: 6e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  name);.  return 
69e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
69f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
6a00: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c  if the named fil
6a10: 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74  e exists..*/.int
6a20: 20 73 71 6c 69 74 65 33 55 6e 69 78 46 69 6c 65   sqlite3UnixFile
6a30: 45 78 69 73 74 73 28 63 6f 6e 73 74 20 63 68 61  Exists(const cha
6a40: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
6a50: 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 28 7a   return access(z
6a60: 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3d 3d 30 3b  Filename, 0)==0;
6a70: 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  .}../* Forward d
6a80: 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74  eclaration */.st
6a90: 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
6aa0: 65 55 6e 69 78 46 69 6c 65 28 0a 20 20 69 6e 74  eUnixFile(.  int
6ab0: 20 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   h,             
6ac0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
6ad0: 65 73 63 72 69 70 74 6f 72 20 6f 66 20 74 68 65  escriptor of the
6ae0: 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 20 20   open file */.  
6af0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 2a 70  sqlite3_file **p
6b00: 49 64 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69  Id,       /* Wri
6b10: 74 65 20 74 68 65 20 72 65 61 6c 20 66 69 6c 65  te the real file
6b20: 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65   descriptor here
6b30: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
6b40: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20   *zFilename,    
6b50: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
6b60: 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ile being opened
6b70: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 46 6c 61   */.  int delFla
6b80: 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
6b90: 2f 2a 20 49 66 20 74 72 75 65 2c 20 6d 61 6b 65  /* If true, make
6ba0: 20 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 64   sure the file d
6bb0: 65 6c 65 74 65 73 20 6f 6e 20 63 6c 6f 73 65 20  eletes on close 
6bc0: 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  */.);../*.** Att
6bd0: 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 66  empt to open a f
6be0: 69 6c 65 20 66 6f 72 20 62 6f 74 68 20 72 65 61  ile for both rea
6bf0: 64 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67  ding and writing
6c00: 2e 20 20 49 66 20 74 68 61 74 0a 2a 2a 20 66 61  .  If that.** fa
6c10: 69 6c 73 2c 20 74 72 79 20 6f 70 65 6e 69 6e 67  ils, try opening
6c20: 20 69 74 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20   it read-only.  
6c30: 49 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  If the file does
6c40: 20 6e 6f 74 20 65 78 69 73 74 2c 0a 2a 2a 20 74   not exist,.** t
6c50: 72 79 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e  ry to create it.
6c60: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
6c70: 73 2c 20 61 20 68 61 6e 64 6c 65 20 66 6f 72 20  s, a handle for 
6c80: 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 69 73  the open file is
6c90: 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 69 64 0a   written to *id.
6ca0: 2a 2a 20 61 6e 64 20 2a 70 52 65 61 64 6f 6e 6c  ** and *pReadonl
6cb0: 79 20 69 73 20 73 65 74 20 74 6f 20 30 20 69 66  y is set to 0 if
6cc0: 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 6f 70   the file was op
6cd0: 65 6e 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67  ened for reading
6ce0: 20 61 6e 64 0a 2a 2a 20 77 72 69 74 69 6e 67 20   and.** writing 
6cf0: 6f 72 20 31 20 69 66 20 74 68 65 20 66 69 6c 65  or 1 if the file
6d00: 20 77 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64   was opened read
6d10: 2d 6f 6e 6c 79 2e 20 20 54 68 65 20 66 75 6e 63  -only.  The func
6d20: 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20  tion returns.** 
6d30: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
6d40: 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74 68 65   On failure, the
6d50: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
6d60: 73 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  s SQLITE_CANTOPE
6d70: 4e 20 61 6e 64 20 6c 65 61 76 65 73 0a 2a 2a 20  N and leaves.** 
6d80: 2a 69 64 20 61 6e 64 20 2a 70 52 65 61 64 6f 6e  *id and *pReadon
6d90: 6c 79 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  ly unchanged..*/
6da0: 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69 74  .#if 0.int sqlit
6db0: 65 33 55 6e 69 78 4f 70 65 6e 52 65 61 64 57 72  e3UnixOpenReadWr
6dc0: 69 74 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ite(.  const cha
6dd0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  r *zFilename,.  
6de0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 2a 70  sqlite3_file **p
6df0: 49 64 2c 0a 20 20 69 6e 74 20 2a 70 52 65 61 64  Id,.  int *pRead
6e00: 6f 6e 6c 79 0a 29 7b 0a 20 20 69 6e 74 20 68 3b  only.){.  int h;
6e10: 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 30 3d  .  .  assert( 0=
6e20: 3d 2a 70 49 64 20 29 3b 0a 20 20 68 20 3d 20 6f  =*pId );.  h = o
6e30: 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f  pen(zFilename, O
6e40: 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f  _RDWR|O_CREAT|O_
6e50: 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41  LARGEFILE|O_BINA
6e60: 52 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  RY,.            
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
6e80: 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
6e90: 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20  PERMISSIONS);.  
6ea0: 69 66 28 20 68 3c 30 20 29 7b 0a 23 69 66 64 65  if( h<0 ){.#ifde
6eb0: 66 20 45 49 53 44 49 52 0a 20 20 20 20 69 66 28  f EISDIR.    if(
6ec0: 20 65 72 72 6e 6f 3d 3d 45 49 53 44 49 52 20 29   errno==EISDIR )
6ed0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
6ee0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
6ef0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
6f00: 20 68 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e   h = open(zFilen
6f10: 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f  ame, O_RDONLY|O_
6f20: 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41  LARGEFILE|O_BINA
6f30: 52 59 29 3b 0a 20 20 20 20 69 66 28 20 68 3c 30  RY);.    if( h<0
6f40: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
6f50: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
6f60: 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 52  ; .    }.    *pR
6f70: 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 7d  eadonly = 1;.  }
6f80: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 52 65 61 64  else{.    *pRead
6f90: 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  only = 0;.  }.. 
6fa0: 20 72 65 74 75 72 6e 20 43 52 41 53 48 5f 54 45   return CRASH_TE
6fb0: 53 54 5f 4f 56 45 52 52 49 44 45 28 0a 20 20 20  ST_OVERRIDE(.   
6fc0: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 49 64 2c   zFilename, pId,
6fd0: 20 61 6c 6c 6f 63 61 74 65 55 6e 69 78 46 69 6c   allocateUnixFil
6fe0: 65 28 68 2c 20 70 49 64 2c 20 7a 46 69 6c 65 6e  e(h, pId, zFilen
6ff0: 61 6d 65 2c 20 30 29 0a 20 20 29 3b 0a 7d 0a 0a  ame, 0).  );.}..
7000: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
7010: 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c  o open a new fil
7020: 65 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20  e for exclusive 
7030: 61 63 63 65 73 73 20 62 79 20 74 68 69 73 20 70  access by this p
7040: 72 6f 63 65 73 73 2e 0a 2a 2a 20 54 68 65 20 66  rocess..** The f
7050: 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e  ile will be open
7060: 65 64 20 66 6f 72 20 62 6f 74 68 20 72 65 61 64  ed for both read
7070: 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67 2e  ing and writing.
7080: 20 20 54 6f 20 61 76 6f 69 64 0a 2a 2a 20 61 20    To avoid.** a 
7090: 70 6f 74 65 6e 74 69 61 6c 20 73 65 63 75 72 69  potential securi
70a0: 74 79 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64  ty problem, we d
70b0: 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20  o not allow the 
70c0: 66 69 6c 65 20 74 6f 20 68 61 76 65 0a 2a 2a 20  file to have.** 
70d0: 70 72 65 76 69 6f 75 73 6c 79 20 65 78 69 73 74  previously exist
70e0: 65 64 2e 20 20 4e 6f 72 20 64 6f 20 77 65 20 61  ed.  Nor do we a
70f0: 6c 6c 6f 77 20 74 68 65 20 66 69 6c 65 20 74 6f  llow the file to
7100: 20 62 65 20 61 20 73 79 6d 62 6f 6c 69 63 0a 2a   be a symbolic.*
7110: 2a 20 6c 69 6e 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  * link..**.** If
7120: 20 64 65 6c 46 6c 61 67 20 69 73 20 74 72 75 65   delFlag is true
7130: 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 72 72 61  , then make arra
7140: 6e 67 65 6d 65 6e 74 73 20 74 6f 20 61 75 74 6f  ngements to auto
7150: 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
7160: 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 77 68 65  .** the file whe
7170: 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
7180: 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73  **.** On success
7190: 2c 20 77 72 69 74 65 20 74 68 65 20 66 69 6c 65  , write the file
71a0: 20 68 61 6e 64 6c 65 20 69 6e 74 6f 20 2a 69 64   handle into *id
71b0: 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
71c0: 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  TE_OK..**.** On 
71d0: 66 61 69 6c 75 72 65 2c 20 72 65 74 75 72 6e 20  failure, return 
71e0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e  SQLITE_CANTOPEN.
71f0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55  .*/.int sqlite3U
7200: 6e 69 78 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  nixOpenExclusive
7210: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
7220: 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71  zFilename, .  sq
7230: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 2a 70 49 64  lite3_file **pId
7240: 2c 20 0a 20 20 69 6e 74 20 64 65 6c 46 6c 61 67  , .  int delFlag
7250: 0a 29 7b 0a 20 20 69 6e 74 20 68 3b 0a 0a 20 20  .){.  int h;..  
7260: 61 73 73 65 72 74 28 20 30 3d 3d 2a 70 49 64 20  assert( 0==*pId 
7270: 29 3b 0a 20 20 68 20 3d 20 6f 70 65 6e 28 7a 46  );.  h = open(zF
7280: 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
7290: 20 20 20 20 20 20 20 20 20 4f 5f 52 44 57 52 7c           O_RDWR|
72a0: 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 7c 4f  O_CREAT|O_EXCL|O
72b0: 5f 4e 4f 46 4f 4c 4c 4f 57 7c 4f 5f 4c 41 52 47  _NOFOLLOW|O_LARG
72c0: 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 2c 0a  EFILE|O_BINARY,.
72d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72e0: 64 65 6c 46 6c 61 67 20 3f 20 30 36 30 30 20 3a  delFlag ? 0600 :
72f0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
7300: 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
7310: 29 3b 0a 20 20 69 66 28 20 68 3c 30 20 29 7b 0a  );.  if( h<0 ){.
7320: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7330: 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a  E_CANTOPEN;.  }.
7340: 20 20 72 65 74 75 72 6e 20 43 52 41 53 48 5f 54    return CRASH_T
7350: 45 53 54 5f 4f 56 45 52 52 49 44 45 28 0a 20 20  EST_OVERRIDE(.  
7360: 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 49 64    zFilename, pId
7370: 2c 20 61 6c 6c 6f 63 61 74 65 55 6e 69 78 46 69  , allocateUnixFi
7380: 6c 65 28 68 2c 20 70 49 64 2c 20 7a 46 69 6c 65  le(h, pId, zFile
7390: 6e 61 6d 65 2c 20 64 65 6c 46 6c 61 67 29 0a 20  name, delFlag). 
73a0: 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74   );.}../*.** Att
73b0: 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 6e  empt to open a n
73c0: 65 77 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64  ew file for read
73d0: 2d 6f 6e 6c 79 20 61 63 63 65 73 73 2e 0a 2a 2a  -only access..**
73e0: 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20  .** On success, 
73f0: 77 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 68  write the file h
7400: 61 6e 64 6c 65 20 69 6e 74 6f 20 2a 69 64 20 61  andle into *id a
7410: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
7420: 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61  _OK..**.** On fa
7430: 69 6c 75 72 65 2c 20 72 65 74 75 72 6e 20 53 51  ilure, return SQ
7440: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a  LITE_CANTOPEN..*
7450: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69  /.int sqlite3Uni
7460: 78 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 63 6f  xOpenReadOnly(co
7470: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
7480: 61 6d 65 2c 20 73 71 6c 69 74 65 33 5f 66 69 6c  ame, sqlite3_fil
7490: 65 20 2a 2a 70 49 64 29 7b 0a 20 20 69 6e 74 20  e **pId){.  int 
74a0: 68 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  h;.  .  assert( 
74b0: 30 3d 3d 2a 70 49 64 20 29 3b 0a 20 20 68 20 3d  0==*pId );.  h =
74c0: 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c   open(zFilename,
74d0: 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 4c 41 52 47   O_RDONLY|O_LARG
74e0: 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b  EFILE|O_BINARY);
74f0: 0a 20 20 69 66 28 20 68 3c 30 20 29 7b 0a 20 20  .  if( h<0 ){.  
7500: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7510: 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20  CANTOPEN;.  }.  
7520: 72 65 74 75 72 6e 20 43 52 41 53 48 5f 54 45 53  return CRASH_TES
7530: 54 5f 4f 56 45 52 52 49 44 45 28 0a 20 20 20 20  T_OVERRIDE(.    
7540: 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 49 64 2c 20  zFilename, pId, 
7550: 61 6c 6c 6f 63 61 74 65 55 6e 69 78 46 69 6c 65  allocateUnixFile
7560: 28 68 2c 20 70 49 64 2c 20 7a 46 69 6c 65 6e 61  (h, pId, zFilena
7570: 6d 65 2c 20 30 29 0a 20 20 29 3b 0a 7d 0a 23 65  me, 0).  );.}.#e
7580: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  ndif../*.** Atte
7590: 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 66 69  mpt to open a fi
75a0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
75b0: 72 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  r the directory 
75c0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 0a  that contains a.
75d0: 2a 2a 20 66 69 6c 65 2e 20 20 54 68 69 73 20 66  ** file.  This f
75e0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 63  ile descriptor c
75f0: 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 66 73  an be used to fs
7600: 79 6e 63 28 29 20 74 68 65 20 64 69 72 65 63 74  ync() the direct
7610: 6f 72 79 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  ory.** in order 
7620: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
7630: 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 61 20 6e   creation of a n
7640: 65 77 20 66 69 6c 65 20 69 73 20 61 63 74 75 61  ew file is actua
7650: 6c 6c 79 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74  lly written.** t
7660: 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  o disk..**.** Th
7670: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
7680: 6c 79 20 6d 65 61 6e 69 6e 67 66 75 6c 20 66 6f  ly meaningful fo
7690: 72 20 55 6e 69 78 2e 20 20 49 74 20 69 73 20 61  r Unix.  It is a
76a0: 20 6e 6f 2d 6f 70 20 75 6e 64 65 72 0a 2a 2a 20   no-op under.** 
76b0: 77 69 6e 64 6f 77 73 20 73 69 6e 63 65 20 77 69  windows since wi
76c0: 6e 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 73  ndows does not s
76d0: 75 70 70 6f 72 74 20 68 61 72 64 20 6c 69 6e 6b  upport hard link
76e0: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 46 55 4c 4c  s..**.** If FULL
76f0: 5f 46 53 59 4e 43 20 69 73 20 65 6e 61 62 6c 65  _FSYNC is enable
7700: 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
7710: 20 69 73 20 6e 6f 74 20 6c 6f 6e 67 65 72 20 75   is not longer u
7720: 73 65 66 75 6c 2c 20 0a 2a 2a 20 61 20 46 55 4c  seful, .** a FUL
7730: 4c 5f 46 53 59 4e 43 20 73 79 6e 63 20 61 70 70  L_FSYNC sync app
7740: 6c 69 65 73 20 74 6f 20 61 6c 6c 20 70 65 6e 64  lies to all pend
7750: 69 6e 67 20 64 69 73 6b 20 6f 70 65 72 61 74 69  ing disk operati
7760: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75  ons..**.** On su
7770: 63 63 65 73 73 2c 20 61 20 68 61 6e 64 6c 65 20  ccess, a handle 
7780: 66 6f 72 20 61 20 70 72 65 76 69 6f 75 73 6c 79  for a previously
7790: 20 6f 70 65 6e 20 66 69 6c 65 20 61 74 20 2a 69   open file at *i
77a0: 64 20 69 73 0a 2a 2a 20 75 70 64 61 74 65 64 20  d is.** updated 
77b0: 77 69 74 68 20 74 68 65 20 6e 65 77 20 64 69 72  with the new dir
77c0: 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63  ectory file desc
77d0: 72 69 70 74 6f 72 20 61 6e 64 20 53 51 4c 49 54  riptor and SQLIT
77e0: 45 5f 4f 4b 20 69 73 0a 2a 2a 20 72 65 74 75 72  E_OK is.** retur
77f0: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61  ned..**.** On fa
7800: 69 6c 75 72 65 2c 20 74 68 65 20 66 75 6e 63 74  ilure, the funct
7810: 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
7820: 54 45 5f 43 41 4e 54 4f 50 45 4e 20 61 6e 64 20  TE_CANTOPEN and 
7830: 6c 65 61 76 65 73 0a 2a 2a 20 2a 69 64 20 75 6e  leaves.** *id un
7840: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74  changed..*/.stat
7850: 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 44  ic int unixOpenD
7860: 69 72 65 63 74 6f 72 79 28 0a 20 20 4f 73 46 69  irectory(.  OsFi
7870: 6c 65 20 2a 69 64 2c 0a 20 20 63 6f 6e 73 74 20  le *id,.  const 
7880: 63 68 61 72 20 2a 7a 44 69 72 6e 61 6d 65 0a 29  char *zDirname.)
7890: 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 75 6e 69  {.  int h;.  uni
78a0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
78b0: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
78c0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30  assert( pFile!=0
78d0: 20 29 3b 0a 20 20 53 45 54 5f 54 48 52 45 41 44   );.  SET_THREAD
78e0: 49 44 28 70 46 69 6c 65 29 3b 0a 20 20 61 73 73  ID(pFile);.  ass
78f0: 65 72 74 28 20 70 46 69 6c 65 2d 3e 64 69 72 66  ert( pFile->dirf
7900: 64 3c 30 20 29 3b 0a 20 20 70 46 69 6c 65 2d 3e  d<0 );.  pFile->
7910: 64 69 72 66 64 20 3d 20 68 20 3d 20 6f 70 65 6e  dirfd = h = open
7920: 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f  (zDirname, O_RDO
7930: 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29  NLY|O_BINARY, 0)
7940: 3b 0a 20 20 69 66 28 20 68 3c 30 20 29 7b 0a 20  ;.  if( h<0 ){. 
7950: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7960: 5f 43 41 4e 54 4f 50 45 4e 3b 20 0a 20 20 7d 0a  _CANTOPEN; .  }.
7970: 23 69 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45  #ifdef FD_CLOEXE
7980: 43 0a 20 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53  C.  fcntl(h, F_S
7990: 45 54 46 44 2c 20 66 63 6e 74 6c 28 68 2c 20 46  ETFD, fcntl(h, F
79a0: 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f  _GETFD, 0) | FD_
79b0: 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66  CLOEXEC);.#endif
79c0: 0a 20 20 4f 53 54 52 41 43 45 33 28 22 4f 50 45  .  OSTRACE3("OPE
79d0: 4e 44 49 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c  NDIR %-3d %s\n",
79e0: 20 68 2c 20 7a 44 69 72 6e 61 6d 65 29 3b 0a 20   h, zDirname);. 
79f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7a00: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  K;.}../*.** Chec
7a10: 6b 20 74 68 61 74 20 61 20 67 69 76 65 6e 20 70  k that a given p
7a20: 61 74 68 6e 61 6d 65 20 69 73 20 61 20 64 69 72  athname is a dir
7a30: 65 63 74 6f 72 79 20 61 6e 64 20 69 73 20 77 72  ectory and is wr
7a40: 69 74 61 62 6c 65 20 0a 2a 2a 0a 2a 2f 0a 69 6e  itable .**.*/.in
7a50: 74 20 73 71 6c 69 74 65 33 55 6e 69 78 49 73 44  t sqlite3UnixIsD
7a60: 69 72 57 72 69 74 61 62 6c 65 28 63 68 61 72 20  irWritable(char 
7a70: 2a 7a 42 75 66 29 7b 0a 23 69 66 6e 64 65 66 20  *zBuf){.#ifndef 
7a80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
7a90: 52 5f 50 52 41 47 4d 41 53 0a 20 20 73 74 72 75  R_PRAGMAS.  stru
7aa0: 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 69  ct stat buf;.  i
7ab0: 66 28 20 7a 42 75 66 3d 3d 30 20 29 20 72 65 74  f( zBuf==0 ) ret
7ac0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 7a 42 75  urn 0;.  if( zBu
7ad0: 66 5b 30 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e  f[0]==0 ) return
7ae0: 20 30 3b 0a 20 20 69 66 28 20 73 74 61 74 28 7a   0;.  if( stat(z
7af0: 42 75 66 2c 20 26 62 75 66 29 20 29 20 72 65 74  Buf, &buf) ) ret
7b00: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 53 5f  urn 0;.  if( !S_
7b10: 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64  ISDIR(buf.st_mod
7b20: 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  e) ) return 0;. 
7b30: 20 69 66 28 20 61 63 63 65 73 73 28 7a 42 75 66   if( access(zBuf
7b40: 2c 20 30 37 29 20 29 20 72 65 74 75 72 6e 20 30  , 07) ) return 0
7b50: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
7b60: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
7b70: 41 47 4d 41 53 20 2a 2f 0a 20 20 72 65 74 75 72  AGMAS */.  retur
7b80: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n 1;.}../*.** Se
7b90: 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  ek to the offset
7ba0: 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20 74   in id->offset t
7bb0: 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62 79 74  hen read cnt byt
7bc0: 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a  es into pBuf..**
7bd0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
7be0: 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
7bf0: 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70 64 61  ally read.  Upda
7c00: 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a  te the offset..*
7c10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
7c20: 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46 69 6c  kAndRead(unixFil
7c30: 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69  e *id, sqlite3_i
7c40: 6e 74 36 34 20 6f 66 66 73 65 74 2c 20 76 6f 69  nt64 offset, voi
7c50: 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74  d *pBuf, int cnt
7c60: 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20  ){.  int got;.  
7c70: 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 20  i64 newOffset;. 
7c80: 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69   TIMER_START;.#i
7c90: 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
7ca0: 45 41 44 29 0a 20 20 67 6f 74 20 3d 20 70 72 65  EAD).  got = pre
7cb0: 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  ad(id->h, pBuf, 
7cc0: 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  cnt, offset);.  
7cd0: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
7ce0: 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c   got = -1 );.#el
7cf0: 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
7d00: 52 45 41 44 36 34 29 0a 20 20 67 6f 74 20 3d 20  READ64).  got = 
7d10: 70 72 65 61 64 36 34 28 69 64 2d 3e 68 2c 20 70  pread64(id->h, p
7d20: 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
7d30: 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
7d40: 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29  rror( got = -1 )
7d50: 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66  ;.#else.  newOff
7d60: 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e  set = lseek(id->
7d70: 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f  h, offset, SEEK_
7d80: 53 45 54 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  SET);.  Simulate
7d90: 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73  IOError( newOffs
7da0: 65 74 2d 2d 20 29 3b 0a 20 20 69 66 28 20 6e 65  et-- );.  if( ne
7db0: 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20  wOffset!=offset 
7dc0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31  ){.    return -1
7dd0: 3b 0a 20 20 7d 0a 20 20 67 6f 74 20 3d 20 72 65  ;.  }.  got = re
7de0: 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  ad(id->h, pBuf, 
7df0: 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54  cnt);.#endif.  T
7e00: 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52  IMER_END;.  OSTR
7e10: 41 43 45 35 28 22 52 45 41 44 20 20 20 20 25 2d  ACE5("READ    %-
7e20: 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25 64 5c  3d %5d %7lld %d\
7e30: 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20  n", id->h, got, 
7e40: 69 64 2d 3e 6f 66 66 73 65 74 2c 20 54 49 4d 45  id->offset, TIME
7e50: 52 5f 45 4c 41 50 53 45 44 29 3b 0a 20 20 72 65  R_ELAPSED);.  re
7e60: 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 2f 2a 0a  turn got;.}../*.
7e70: 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f  ** Read data fro
7e80: 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20  m a file into a 
7e90: 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20  buffer.  Return 
7ea0: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c  SQLITE_OK if all
7eb0: 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72  .** bytes were r
7ec0: 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
7ed0: 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52   and SQLITE_IOER
7ee0: 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  R if anything go
7ef0: 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a  es.** wrong..*/.
7f00: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52  static int unixR
7f10: 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ead(.  sqlite3_f
7f20: 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64  ile *id, .  void
7f30: 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61   *pBuf, .  int a
7f40: 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  mt,.  sqlite3_in
7f50: 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20  t64 offset.){.  
7f60: 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65 72  int got;.  asser
7f70: 74 28 20 69 64 20 29 3b 0a 20 20 67 6f 74 20 3d  t( id );.  got =
7f80: 20 73 65 65 6b 41 6e 64 52 65 61 64 28 28 75 6e   seekAndRead((un
7f90: 69 78 46 69 6c 65 2a 29 69 64 2c 20 6f 66 66 73  ixFile*)id, offs
7fa0: 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a  et, pBuf, amt);.
7fb0: 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29    if( got==amt )
7fc0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
7fd0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20  ITE_OK;.  }else 
7fe0: 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20  if( got<0 ){.   
7ff0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
8000: 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c  OERR_READ;.  }el
8010: 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  se{.    memset(&
8020: 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 67 6f  ((char*)pBuf)[go
8030: 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b  t], 0, amt-got);
8040: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8050: 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
8060: 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  EAD;.  }.}../*.*
8070: 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66  * Seek to the of
8080: 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73  fset in id->offs
8090: 65 74 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74  et then read cnt
80a0: 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66   bytes into pBuf
80b0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
80c0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
80d0: 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 20 20  actually read.  
80e0: 55 70 64 61 74 65 20 74 68 65 20 6f 66 66 73 65  Update the offse
80f0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
8100: 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 75 6e   seekAndWrite(un
8110: 69 78 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  ixFile *id, i64 
8120: 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f  offset, const vo
8130: 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e  id *pBuf, int cn
8140: 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20  t){.  int got;. 
8150: 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a   i64 newOffset;.
8160: 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23    TIMER_START;.#
8170: 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
8180: 52 45 41 44 29 0a 20 20 67 6f 74 20 3d 20 70 77  READ).  got = pw
8190: 72 69 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66  rite(id->h, pBuf
81a0: 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a  , cnt, offset);.
81b0: 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53  #elif defined(US
81c0: 45 5f 50 52 45 41 44 36 34 29 0a 20 20 67 6f 74  E_PREAD64).  got
81d0: 20 3d 20 70 77 72 69 74 65 36 34 28 69 64 2d 3e   = pwrite64(id->
81e0: 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66  h, pBuf, cnt, of
81f0: 66 73 65 74 29 3b 0a 23 65 6c 73 65 0a 20 20 6e  fset);.#else.  n
8200: 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b  ewOffset = lseek
8210: 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20  (id->h, offset, 
8220: 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 69 66 28  SEEK_SET);.  if(
8230: 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73   newOffset!=offs
8240: 65 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  et ){.    return
8250: 20 2d 31 3b 0a 20 20 7d 0a 20 20 67 6f 74 20 3d   -1;.  }.  got =
8260: 20 77 72 69 74 65 28 69 64 2d 3e 68 2c 20 70 42   write(id->h, pB
8270: 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66  uf, cnt);.#endif
8280: 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20  .  TIMER_END;.  
8290: 4f 53 54 52 41 43 45 35 28 22 57 52 49 54 45 20  OSTRACE5("WRITE 
82a0: 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64    %-3d %5d %7lld
82b0: 20 25 64 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67   %d\n", id->h, g
82c0: 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d 45  ot, offset, TIME
82d0: 52 5f 45 4c 41 50 53 45 44 29 3b 0a 20 20 72 65  R_ELAPSED);.  re
82e0: 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a  turn got;.}.../*
82f0: 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66  .** Write data f
8300: 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74  rom a buffer int
8310: 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72  o a file.  Retur
8320: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
8330: 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d  uccess.** or som
8340: 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
8350: 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  de on failure..*
8360: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
8370: 78 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65  xWrite(.  sqlite
8380: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 63  3_file *id, .  c
8390: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c  onst void *pBuf,
83a0: 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73   .  int amt,.  s
83b0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
83c0: 73 65 74 20 0a 29 7b 0a 20 20 69 6e 74 20 77 72  set .){.  int wr
83d0: 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ote = 0;.  asser
83e0: 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72  t( id );.  asser
83f0: 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 77 68  t( amt>0 );.  wh
8400: 69 6c 65 28 20 61 6d 74 3e 30 20 26 26 20 28 77  ile( amt>0 && (w
8410: 72 6f 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72  rote = seekAndWr
8420: 69 74 65 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  ite((unixFile*)i
8430: 64 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c  d, offset, pBuf,
8440: 20 61 6d 74 29 29 3e 30 20 29 7b 0a 20 20 20 20   amt))>0 ){.    
8450: 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20  amt -= wrote;.  
8460: 20 20 6f 66 66 73 65 74 20 2b 3d 20 77 72 6f 74    offset += wrot
8470: 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26 28  e;.    pBuf = &(
8480: 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72 6f  (char*)pBuf)[wro
8490: 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75 6c  te];.  }.  Simul
84a0: 61 74 65 49 4f 45 72 72 6f 72 28 28 20 77 72 6f  ateIOError(( wro
84b0: 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31 20 29  te=(-1), amt=1 )
84c0: 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73  );.  SimulateDis
84d0: 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20 77 72 6f  kfullError(( wro
84e0: 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29 3b 0a  te=0, amt=1 ));.
84f0: 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a 20    if( amt>0 ){. 
8500: 20 20 20 69 66 28 20 77 72 6f 74 65 3c 30 20 29     if( wrote<0 )
8510: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
8520: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
8530: 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  E;.    }else{.  
8540: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8550: 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  E_FULL;.    }.  
8560: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
8570: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
8580: 6f 76 65 20 74 68 65 20 72 65 61 64 2f 77 72 69  ove the read/wri
8590: 74 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 61 20  te pointer in a 
85a0: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
85b0: 69 6e 74 20 75 6e 69 78 53 65 65 6b 28 4f 73 46  int unixSeek(OsF
85c0: 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66  ile *id, i64 off
85d0: 73 65 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  set){.  assert( 
85e0: 69 64 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  id );.#ifdef SQL
85f0: 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 6f  ITE_TEST.  if( o
8600: 66 66 73 65 74 20 29 20 53 69 6d 75 6c 61 74 65  ffset ) Simulate
8610: 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 72 65  DiskfullError(re
8620: 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
8630: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 28 28 75 6e  );.#endif.  ((un
8640: 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6f 66 66  ixFile*)id)->off
8650: 73 65 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20  set = offset;.  
8660: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
8670: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
8680: 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f  TE_TEST./*.** Co
8690: 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
86a0: 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20  f fullsyncs and 
86b0: 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54  normal syncs.  T
86c0: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74  his is used to t
86d0: 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63  est.** that sync
86e0: 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20  s and fullsyncs 
86f0: 61 72 65 20 6f 63 63 75 72 69 6e 67 20 61 74 20  are occuring at 
8700: 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e  the right times.
8710: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
8720: 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  sync_count = 0;.
8730: 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c  int sqlite3_full
8740: 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  sync_count = 0;.
8750: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73  #endif../*.** Us
8760: 65 20 74 68 65 20 66 64 61 74 61 73 79 6e 63 28  e the fdatasync(
8770: 29 20 41 50 49 20 6f 6e 6c 79 20 69 66 20 74 68  ) API only if th
8780: 65 20 48 41 56 45 5f 46 44 41 54 41 53 59 4e 43  e HAVE_FDATASYNC
8790: 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65   macro is define
87a0: 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  d..** Otherwise 
87b0: 75 73 65 20 66 73 79 6e 63 28 29 20 69 6e 20 69  use fsync() in i
87c0: 74 73 20 70 6c 61 63 65 2e 0a 2a 2f 0a 23 69 66  ts place..*/.#if
87d0: 6e 64 65 66 20 48 41 56 45 5f 46 44 41 54 41 53  ndef HAVE_FDATAS
87e0: 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 66 64 61  YNC.# define fda
87f0: 74 61 73 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e  tasync fsync.#en
8800: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e  dif../*.** Defin
8810: 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
8820: 20 74 6f 20 30 20 6f 72 20 31 20 64 65 70 65 6e   to 0 or 1 depen
8830: 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
8840: 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f  or not.** the F_
8850: 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20  FULLFSYNC macro 
8860: 69 73 20 64 65 66 69 6e 65 64 2e 20 20 46 5f 46  is defined.  F_F
8870: 55 4c 4c 46 53 59 4e 43 20 69 73 20 63 75 72 72  ULLFSYNC is curr
8880: 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76  ently.** only av
8890: 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f  ailable on Mac O
88a0: 53 20 58 2e 20 20 42 75 74 20 74 68 61 74 20 63  S X.  But that c
88b0: 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a  ould change..*/.
88c0: 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46 53 59  #ifdef F_FULLFSY
88d0: 4e 43 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45  NC.# define HAVE
88e0: 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c  _FULLFSYNC 1.#el
88f0: 73 65 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45  se.# define HAVE
8900: 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e  _FULLFSYNC 0.#en
8910: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  dif.../*.** The 
8920: 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63  fsync() system c
8930: 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  all does not wor
8940: 6b 20 61 73 20 61 64 76 65 72 74 69 73 65 64 20  k as advertised 
8950: 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20  on many.** unix 
8960: 73 79 73 74 65 6d 73 2e 20 20 54 68 65 20 66 6f  systems.  The fo
8970: 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72  llowing procedur
8980: 65 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  e is an attempt 
8990: 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f  to make.** it wo
89a0: 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a  rk better..**.**
89b0: 20 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53   The SQLITE_NO_S
89c0: 59 4e 43 20 6d 61 63 72 6f 20 64 69 73 61 62 6c  YNC macro disabl
89d0: 65 73 20 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e  es all fsync()s.
89e0: 20 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c    This is useful
89f0: 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20  .** for testing 
8a00: 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20  when we want to 
8a10: 72 75 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  run through the 
8a20: 74 65 73 74 20 73 75 69 74 65 20 71 75 69 63 6b  test suite quick
8a30: 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73  ly..** You are s
8a40: 74 72 6f 6e 67 6c 79 20 61 64 76 69 73 65 64 20  trongly advised 
8a50: 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20  *not* to deploy 
8a60: 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  with SQLITE_NO_S
8a70: 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20  YNC.** enabled, 
8a80: 68 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 77  however, since w
8a90: 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  ith SQLITE_NO_SY
8aa0: 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f  NC enabled, an O
8ab0: 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f  S crash.** or po
8ac0: 77 65 72 20 66 61 69 6c 75 72 65 20 77 69 6c 6c  wer failure will
8ad0: 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70 74 20   likely corrupt 
8ae0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
8af0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
8b00: 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20   full_fsync(int 
8b10: 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63  fd, int fullSync
8b20: 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b  , int dataOnly){
8b30: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
8b40: 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62   Record the numb
8b50: 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74  er of times that
8b60: 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20   we do a normal 
8b70: 66 73 79 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a  fsync() and .  *
8b80: 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69  * FULLSYNC.  Thi
8b90: 73 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67  s is used during
8ba0: 20 74 65 73 74 69 6e 67 20 74 6f 20 76 65 72 69   testing to veri
8bb0: 66 79 20 74 68 61 74 20 74 68 69 73 20 70 72 6f  fy that this pro
8bc0: 63 65 64 75 72 65 0a 20 20 2a 2a 20 67 65 74 73  cedure.  ** gets
8bd0: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65   called with the
8be0: 20 63 6f 72 72 65 63 74 20 61 72 67 75 6d 65 6e   correct argumen
8bf0: 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  ts..  */.#ifdef 
8c00: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
8c10: 28 20 66 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c  ( fullSync ) sql
8c20: 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
8c30: 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  unt++;.  sqlite3
8c40: 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23  _sync_count++;.#
8c50: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77  endif..  /* If w
8c60: 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  e compiled with 
8c70: 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  the SQLITE_NO_SY
8c80: 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79  NC flag, then sy
8c90: 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20  ncing is a.  ** 
8ca0: 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65  no-op.  */.#ifde
8cb0: 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
8cc0: 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  .  rc = SQLITE_O
8cd0: 4b 3b 0a 23 65 6c 73 65 0a 0a 23 69 66 20 48 41  K;.#else..#if HA
8ce0: 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69  VE_FULLFSYNC.  i
8cf0: 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  f( fullSync ){. 
8d00: 20 20 20 72 63 20 3d 20 66 63 6e 74 6c 28 66 64     rc = fcntl(fd
8d10: 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30  , F_FULLFSYNC, 0
8d20: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
8d30: 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a  rc = 1;.  }.  /*
8d40: 20 49 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e   If the FULLFSYN
8d50: 43 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62  C failed, fall b
8d60: 61 63 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e  ack to attemptin
8d70: 67 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20  g an fsync()..  
8d80: 20 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20   * It shouldn't 
8d90: 62 65 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  be possible for 
8da0: 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69  fullfsync to fai
8db0: 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a  l on the local .
8dc0: 20 20 20 2a 20 66 69 6c 65 20 73 79 73 74 65 6d     * file system
8dd0: 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61   (on OSX), so fa
8de0: 69 6c 75 72 65 20 69 6e 64 69 63 61 74 65 73 20  ilure indicates 
8df0: 74 68 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20  that FULLFSYNC. 
8e00: 20 20 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72    * isn't suppor
8e10: 74 65 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c  ted for this fil
8e20: 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74  e system. So, at
8e30: 74 65 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a  tempt an fsync .
8e40: 20 20 20 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f     * and (for no
8e50: 77 29 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76  w) ignore the ov
8e60: 65 72 68 65 61 64 20 6f 66 20 61 20 73 75 70 65  erhead of a supe
8e70: 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61  rfluous fcntl ca
8e80: 6c 6c 2e 20 20 0a 20 20 20 2a 20 49 74 27 64 20  ll.  .   * It'd 
8e90: 62 65 20 62 65 74 74 65 72 20 74 6f 20 64 65 74  be better to det
8ea0: 65 63 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75  ect fullfsync su
8eb0: 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61  pport once and a
8ec0: 76 6f 69 64 20 0a 20 20 20 2a 20 74 68 65 20 66  void .   * the f
8ed0: 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20  cntl call every 
8ee0: 74 69 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c  time sync is cal
8ef0: 6c 65 64 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28  led..   */.  if(
8f00: 20 72 63 20 29 20 72 63 20 3d 20 66 73 79 6e 63   rc ) rc = fsync
8f10: 28 66 64 29 3b 0a 0a 23 65 6c 73 65 20 0a 20 20  (fd);..#else .  
8f20: 69 66 28 20 64 61 74 61 4f 6e 6c 79 20 29 7b 0a  if( dataOnly ){.
8f30: 20 20 20 20 72 63 20 3d 20 66 64 61 74 61 73 79      rc = fdatasy
8f40: 6e 63 28 66 64 29 3b 0a 20 20 7d 65 6c 73 65 7b  nc(fd);.  }else{
8f50: 0a 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28  .    rc = fsync(
8f60: 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  fd);.  }.#endif 
8f70: 2f 2a 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  /* HAVE_FULLFSYN
8f80: 43 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64  C */.#endif /* d
8f90: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f  efined(SQLITE_NO
8fa0: 5f 53 59 4e 43 29 20 2a 2f 0a 0a 20 20 72 65 74  _SYNC) */..  ret
8fb0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
8fc0: 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
8fd0: 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
8fe0: 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
8ff0: 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
9000: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f  ..**.** If dataO
9010: 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68  nly==0 then both
9020: 20 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66   the file itself
9030: 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74   and its metadat
9040: 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c  a (file.** size,
9050: 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74   access time, et
9060: 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20  c) are synced.  
9070: 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74  If dataOnly!=0 t
9080: 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  hen only the.** 
9090: 66 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e  file data is syn
90a0: 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72  ced..**.** Under
90b0: 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65   Unix, also make
90c0: 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64   sure that the d
90d0: 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66  irectory entry f
90e0: 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68  or the file.** h
90f0: 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  as been created 
9100: 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65  by fsync-ing the
9110: 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20   directory that 
9120: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c  contains the fil
9130: 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e  e..** If we do n
9140: 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77  ot do this and w
9150: 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f  e encounter a po
9160: 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
9170: 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e   directory.** en
9180: 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  try for the jour
9190: 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78  nal might not ex
91a0: 69 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62  ist after we reb
91b0: 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a  oot.  The next.*
91c0: 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65  * SQLite to acce
91d0: 73 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c  ss the file will
91e0: 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74   not know that t
91f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  he journal exist
9200: 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  s (because.** th
9210: 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72  e directory entr
9220: 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  y for the journa
9230: 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61  l was never crea
9240: 74 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61  ted) and the tra
9250: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c  nsaction.** will
9260: 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d   not roll back -
9270: 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e   possibly leadin
9280: 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  g to database co
9290: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
92a0: 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63  tic int unixSync
92b0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
92c0: 64 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29  d, int dataOnly)
92d0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e  {.  int rc;.  un
92e0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
92f0: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
9300: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
9310: 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22 53 59  ;.  OSTRACE2("SY
9320: 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70  NC    %-3d\n", p
9330: 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 72 63 20 3d  File->h);.  rc =
9340: 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c   full_fsync(pFil
9350: 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 66 75 6c  e->h, pFile->ful
9360: 6c 53 79 6e 63 2c 20 64 61 74 61 4f 6e 6c 79 29  lSync, dataOnly)
9370: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
9380: 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69  ror( rc=1 );.  i
9390: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
93a0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
93b0: 5f 46 53 59 4e 43 3b 0a 20 20 7d 0a 20 20 69 66  _FSYNC;.  }.  if
93c0: 28 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d  ( pFile->dirfd>=
93d0: 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  0 ){.    OSTRACE
93e0: 34 28 22 44 49 52 53 59 4e 43 20 25 2d 33 64 20  4("DIRSYNC %-3d 
93f0: 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d  (have_fullfsync=
9400: 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c  %d fullsync=%d)\
9410: 6e 22 2c 20 70 46 69 6c 65 2d 3e 64 69 72 66 64  n", pFile->dirfd
9420: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 48 41  ,.            HA
9430: 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 70 46  VE_FULLFSYNC, pF
9440: 69 6c 65 2d 3e 66 75 6c 6c 53 79 6e 63 29 3b 0a  ile->fullSync);.
9450: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
9460: 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20  ISABLE_DIRSYNC. 
9470: 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74     /* The direct
9480: 6f 72 79 20 73 79 6e 63 20 69 73 20 6f 6e 6c 79  ory sync is only
9490: 20 61 74 74 65 6d 70 74 65 64 20 69 66 20 66 75   attempted if fu
94a0: 6c 6c 5f 66 73 79 6e 63 20 69 73 0a 20 20 20 20  ll_fsync is.    
94b0: 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66 20 6f 72  ** turned off or
94c0: 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20 49   unavailable.  I
94d0: 66 20 61 20 66 75 6c 6c 5f 66 73 79 6e 63 20 6f  f a full_fsync o
94e0: 63 63 75 72 72 65 64 20 61 62 6f 76 65 2c 0a 20  ccurred above,. 
94f0: 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 64     ** then the d
9500: 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73  irectory sync is
9510: 20 73 75 70 65 72 66 6c 75 6f 75 73 2e 0a 20 20   superfluous..  
9520: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 48    */.    if( (!H
9530: 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 7c  AVE_FULLFSYNC ||
9540: 20 21 70 46 69 6c 65 2d 3e 66 75 6c 6c 53 79 6e   !pFile->fullSyn
9550: 63 29 20 26 26 20 66 75 6c 6c 5f 66 73 79 6e 63  c) && full_fsync
9560: 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c 30 2c  (pFile->dirfd,0,
9570: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 2f 2a 0a  0) ){.       /*.
9580: 20 20 20 20 20 20 20 2a 2a 20 57 65 20 68 61 76         ** We hav
9590: 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69  e received multi
95a0: 70 6c 65 20 72 65 70 6f 72 74 73 20 6f 66 20 66  ple reports of f
95b0: 73 79 6e 63 28 29 20 72 65 74 75 72 6e 69 6e 67  sync() returning
95c0: 0a 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72  .       ** error
95d0: 73 20 77 68 65 6e 20 61 70 70 6c 69 65 64 20 74  s when applied t
95e0: 6f 20 64 69 72 65 63 74 6f 72 69 65 73 20 6f 6e  o directories on
95f0: 20 63 65 72 74 61 69 6e 20 66 69 6c 65 20 73 79   certain file sy
9600: 73 74 65 6d 73 2e 0a 20 20 20 20 20 20 20 2a 2a  stems..       **
9610: 20 41 20 66 61 69 6c 65 64 20 64 69 72 65 63 74   A failed direct
9620: 6f 72 79 20 73 79 6e 63 20 69 73 20 6e 6f 74 20  ory sync is not 
9630: 61 20 62 69 67 20 64 65 61 6c 2e 20 20 53 6f 20  a big deal.  So 
9640: 69 74 20 73 65 65 6d 73 0a 20 20 20 20 20 20 20  it seems.       
9650: 2a 2a 20 62 65 74 74 65 72 20 74 6f 20 69 67 6e  ** better to ign
9660: 6f 72 65 20 74 68 65 20 65 72 72 6f 72 2e 20 20  ore the error.  
9670: 54 69 63 6b 65 74 20 23 31 36 35 37 0a 20 20 20  Ticket #1657.   
9680: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 2f 2a      */.       /*
9690: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
96a0: 4f 45 52 52 3b 20 2a 2f 0a 20 20 20 20 7d 0a 23  OERR; */.    }.#
96b0: 65 6e 64 69 66 0a 20 20 20 20 63 6c 6f 73 65 28  endif.    close(
96c0: 70 46 69 6c 65 2d 3e 64 69 72 66 64 29 3b 20 20  pFile->dirfd);  
96d0: 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 20 74 6f 20  /* Only need to 
96e0: 73 79 6e 63 20 6f 6e 63 65 2c 20 73 6f 20 63 6c  sync once, so cl
96f0: 6f 73 65 20 74 68 65 20 64 69 72 65 63 74 6f 72  ose the director
9700: 79 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e  y */.    pFile->
9710: 64 69 72 66 64 20 3d 20 2d 31 3b 20 20 20 20 2f  dirfd = -1;    /
9720: 2a 20 77 68 65 6e 20 77 65 20 61 72 65 20 64 6f  * when we are do
9730: 6e 65 2e 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  ne. */.  }.  ret
9740: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
9750: 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
9760: 20 64 69 72 65 63 74 6f 72 79 20 7a 44 69 72 6e   directory zDirn
9770: 61 6d 65 2e 20 54 68 69 73 20 69 73 20 61 20 6e  ame. This is a n
9780: 6f 2d 6f 70 20 6f 6e 20 6f 70 65 72 61 74 69 6e  o-op on operatin
9790: 67 20 73 79 73 74 65 6d 73 20 6f 74 68 65 72 0a  g systems other.
97a0: 2a 2a 20 74 68 61 6e 20 55 4e 49 58 2e 0a 2a 2a  ** than UNIX..**
97b0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65 64  .** This is used
97c0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
97d0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
97e0: 20 66 69 6c 65 20 68 61 73 20 74 72 75 65 6c 79   file has truely
97f0: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 0a 2a 2a   been deleted.**
9800: 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 20 63   before making c
9810: 68 61 6e 67 65 73 20 74 6f 20 69 6e 64 69 76 69  hanges to indivi
9820: 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 73 20 6f 6e  dual journals on
9830: 20 61 20 6d 75 6c 74 69 2d 64 61 74 61 62 61 73   a multi-databas
9840: 65 20 63 6f 6d 6d 69 74 2e 0a 2a 2a 20 54 68 65  e commit..** The
9850: 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6f 70 74   F_FULLFSYNC opt
9860: 69 6f 6e 20 69 73 20 6e 6f 74 20 6e 65 65 64 65  ion is not neede
9870: 64 20 68 65 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73  d here..*/.int s
9880: 71 6c 69 74 65 33 55 6e 69 78 53 79 6e 63 44 69  qlite3UnixSyncDi
9890: 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68  rectory(const ch
98a0: 61 72 20 2a 7a 44 69 72 6e 61 6d 65 29 7b 0a 23  ar *zDirname){.#
98b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53  ifdef SQLITE_DIS
98c0: 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20 72  ABLE_DIRSYNC.  r
98d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
98e0: 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 66 64 3b  .#else.  int fd;
98f0: 0a 20 20 69 6e 74 20 72 3b 0a 20 20 66 64 20 3d  .  int r;.  fd =
9900: 20 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20   open(zDirname, 
9910: 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52  O_RDONLY|O_BINAR
9920: 59 2c 20 30 29 3b 0a 20 20 4f 53 54 52 41 43 45  Y, 0);.  OSTRACE
9930: 33 28 22 44 49 52 53 59 4e 43 20 25 2d 33 64 20  3("DIRSYNC %-3d 
9940: 28 25 73 29 5c 6e 22 2c 20 66 64 2c 20 7a 44 69  (%s)\n", fd, zDi
9950: 72 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 66 64  rname);.  if( fd
9960: 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  <0 ){.    return
9970: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
9980: 3b 20 0a 20 20 7d 0a 20 20 72 20 3d 20 66 73 79  ; .  }.  r = fsy
9990: 6e 63 28 66 64 29 3b 0a 20 20 63 6c 6f 73 65 28  nc(fd);.  close(
99a0: 66 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  fd);.  SimulateI
99b0: 4f 45 72 72 6f 72 28 20 72 3d 31 20 29 3b 0a 20  OError( r=1 );. 
99c0: 20 69 66 28 20 72 20 29 7b 0a 20 20 20 20 72 65   if( r ){.    re
99d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
99e0: 52 5f 44 49 52 5f 46 53 59 4e 43 3b 0a 20 20 7d  R_DIR_FSYNC;.  }
99f0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
9a00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
9a10: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
9a20: 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e  Truncate an open
9a30: 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69   file to a speci
9a40: 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61  fied size.*/.sta
9a50: 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e  tic int unixTrun
9a60: 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  cate(sqlite3_fil
9a70: 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79 74 65  e *id, i64 nByte
9a80: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
9a90: 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72  ssert( id );.  r
9aa0: 63 20 3d 20 66 74 72 75 6e 63 61 74 65 28 28 28  c = ftruncate(((
9ab0: 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68  unixFile*)id)->h
9ac0: 2c 20 28 6f 66 66 5f 74 29 6e 42 79 74 65 29 3b  , (off_t)nByte);
9ad0: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
9ae0: 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66  or( rc=1 );.  if
9af0: 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
9b00: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
9b10: 54 52 55 4e 43 41 54 45 3b 0a 20 20 7d 65 6c 73  TRUNCATE;.  }els
9b20: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e{.    return SQ
9b30: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
9b40: 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
9b50: 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
9b60: 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79   of a file in by
9b70: 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  tes.*/.static in
9b80: 74 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 28 73  t unixFileSize(s
9b90: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
9ba0: 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20   i64 *pSize){.  
9bb0: 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74  int rc;.  struct
9bc0: 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61 73 73   stat buf;.  ass
9bd0: 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72 63 20  ert( id );.  rc 
9be0: 3d 20 66 73 74 61 74 28 28 28 75 6e 69 78 46 69  = fstat(((unixFi
9bf0: 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66  le*)id)->h, &buf
9c00: 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
9c10: 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20  rror( rc=1 );.  
9c20: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
9c30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
9c40: 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a  OERR_FSTAT;.  }.
9c50: 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e 73    *pSize = buf.s
9c60: 74 5f 73 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e  t_size;.  return
9c70: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
9c80: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
9c90: 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
9ca0: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
9cb0: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
9cc0: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
9cd0: 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
9ce0: 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
9cf0: 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
9d00: 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a  is held, return.
9d10: 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 49 66  ** non-zero.  If
9d20: 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c   the file is unl
9d30: 6f 63 6b 65 64 20 6f 72 20 68 6f 6c 64 73 20 6f  ocked or holds o
9d40: 6e 6c 79 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  nly SHARED locks
9d50: 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e  , then.** return
9d60: 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
9d70: 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 65   int unixCheckRe
9d80: 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
9d90: 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
9da0: 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 75 6e 69  int r = 0;.  uni
9db0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
9dc0: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
9dd0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
9de0: 3b 0a 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29  ;.  enterMutex()
9df0: 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69  ; /* Because pFi
9e00: 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61  le->pLock is sha
9e10: 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
9e20: 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63  ds */..  /* Chec
9e30: 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e  k if a thread in
9e40: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f   this process ho
9e50: 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20  lds such a lock 
9e60: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
9e70: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pLock->locktype>
9e80: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
9e90: 20 20 20 72 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20     r = 1;.  }.. 
9ea0: 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65   /* Otherwise se
9eb0: 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  e if some other 
9ec0: 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74  process holds it
9ed0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 20  ..  */.  if( !r 
9ee0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c  ){.    struct fl
9ef0: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f  ock lock;.    lo
9f00: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
9f10: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b  EK_SET;.    lock
9f20: 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52  .l_start = RESER
9f30: 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  VED_BYTE;.    lo
9f40: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20  ck.l_len = 1;.  
9f50: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
9f60: 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 66 63 6e  F_WRLCK;.    fcn
9f70: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47  tl(pFile->h, F_G
9f80: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20  ETLK, &lock);.  
9f90: 20 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70    if( lock.l_typ
9fa0: 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e!=F_UNLCK ){.  
9fb0: 20 20 20 20 72 20 3d 20 31 3b 0a 20 20 20 20 7d      r = 1;.    }
9fc0: 0a 20 20 7d 0a 20 20 0a 20 20 6c 65 61 76 65 4d  .  }.  .  leaveM
9fd0: 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
9fe0: 45 33 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E3("TEST WR-LOCK
9ff0: 20 25 64 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65   %d %d\n", pFile
a000: 2d 3e 68 2c 20 72 29 3b 0a 0a 20 20 72 65 74 75  ->h, r);..  retu
a010: 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  rn r;.}../*.** L
a020: 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
a030: 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
a040: 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
a050: 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65  r locktype - one
a060: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
a070: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
a080: 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
a090: 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
a0a0: 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
a0b0: 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
a0c0: 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
a0d0: 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
a0e0: 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
a0f0: 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
a100: 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
a110: 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
a120: 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
a130: 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
a140: 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
a150: 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
a160: 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
a170: 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
a180: 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
a190: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
a1a0: 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
a1b0: 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
a1c0: 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
a1d0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
a1e0: 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
a1f0: 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
a200: 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
a210: 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
a220: 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
a230: 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
a240: 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
a250: 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
a260: 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
a270: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
a280: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
a290: 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
a2a0: 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
a2b0: 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
a2c0: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
a2d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
a2e0: 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
a2f0: 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
a300: 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
a310: 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
a320: 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
a330: 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
a340: 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28  ic int unixLock(
a350: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
a360: 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
a370: 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
a380: 69 6e 67 20 64 65 73 63 72 69 62 65 73 20 74 68  ing describes th
a390: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
a3a0: 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20   of the various 
a3b0: 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c  locks and.  ** l
a3c0: 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ock transitions 
a3d0: 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  in terms of the 
a3e0: 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 73  POSIX advisory s
a3f0: 68 61 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73  hared and exclus
a400: 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72  ive.  ** lock pr
a410: 69 6d 69 74 69 76 65 73 20 28 63 61 6c 6c 65 64  imitives (called
a420: 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20   read-locks and 
a430: 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f  write-locks belo
a440: 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a  w, to avoid.  **
a450: 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20   confusion with 
a460: 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65  SQLite lock name
a470: 73 29 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68  s). The algorith
a480: 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74  ms are complicat
a490: 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79  ed.  ** slightly
a4a0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20   in order to be 
a4b0: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
a4c0: 77 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20  windows systems 
a4d0: 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20  simultaneously. 
a4e0: 20 2a 2a 20 61 63 63 65 73 73 69 6e 67 20 74 68   ** accessing th
a4f0: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
a500: 66 69 6c 65 2c 20 69 6e 20 63 61 73 65 20 74 68  file, in case th
a510: 61 74 20 69 73 20 65 76 65 72 20 72 65 71 75 69  at is ever requi
a520: 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  red..  **.  ** S
a530: 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64 20 69  ymbols defined i
a540: 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66 79  n os.h indentify
a550: 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79   the 'pending by
a560: 74 65 27 20 61 6e 64 20 74 68 65 20 27 72 65 73  te' and the 'res
a570: 65 72 76 65 64 0a 20 20 2a 2a 20 62 79 74 65 27  erved.  ** byte'
a580: 2c 20 65 61 63 68 20 73 69 6e 67 6c 65 20 62 79  , each single by
a590: 74 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77  tes at well know
a5a0: 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e 64 20 74  n offsets, and t
a5b0: 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a  he 'shared byte.
a5c0: 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20 72    ** range', a r
a5d0: 61 6e 67 65 20 6f 66 20 35 31 30 20 62 79 74 65  ange of 510 byte
a5e0: 73 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77  s at a well know
a5f0: 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20  n offset..  **. 
a600: 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61 20   ** To obtain a 
a610: 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72  SHARED lock, a r
a620: 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61  ead-lock is obta
a630: 69 6e 65 64 20 6f 6e 20 74 68 65 20 27 70 65 6e  ined on the 'pen
a640: 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e  ding.  ** byte'.
a650: 20 20 49 66 20 74 68 69 73 20 69 73 20 73 75 63    If this is suc
a660: 63 65 73 73 66 75 6c 2c 20 61 20 72 61 6e 64 6f  cessful, a rando
a670: 6d 20 62 79 74 65 20 66 72 6f 6d 20 74 68 65 20  m byte from the 
a680: 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a  'shared byte.  *
a690: 2a 20 72 61 6e 67 65 27 20 69 73 20 72 65 61 64  * range' is read
a6a0: 2d 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20  -locked and the 
a6b0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70 65 6e  lock on the 'pen
a6c0: 64 69 6e 67 20 62 79 74 65 27 20 72 65 6c 65 61  ding byte' relea
a6d0: 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  sed..  **.  ** A
a6e0: 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c   process may onl
a6f0: 79 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52  y obtain a RESER
a700: 56 45 44 20 6c 6f 63 6b 20 61 66 74 65 72 20 69  VED lock after i
a710: 74 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6c  t has a SHARED l
a720: 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53 45  ock..  ** A RESE
a730: 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d 70  RVED lock is imp
a740: 6c 65 6d 65 6e 74 65 64 20 62 79 20 67 72 61 62  lemented by grab
a750: 62 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  bing a write-loc
a760: 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27 72  k on the.  ** 'r
a770: 65 73 65 72 76 65 64 20 62 79 74 65 27 2e 20 0a  eserved byte'. .
a780: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63    **.  ** A proc
a790: 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74  ess may only obt
a7a0: 61 69 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ain a PENDING lo
a7b0: 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20  ck after it has 
a7c0: 6f 62 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a 20  obtained a.  ** 
a7d0: 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20 50  SHARED lock. A P
a7e0: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 69  ENDING lock is i
a7f0: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62  mplemented by ob
a800: 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d  taining a write-
a810: 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  lock.  ** on the
a820: 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 2e   'pending byte'.
a830: 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   This ensures th
a840: 61 74 20 6e 6f 20 6e 65 77 20 53 48 41 52 45 44  at no new SHARED
a850: 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20 20   locks can be.  
a860: 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62 75 74  ** obtained, but
a870: 20 65 78 69 73 74 69 6e 67 20 53 48 41 52 45 44   existing SHARED
a880: 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f 77   locks are allow
a890: 65 64 20 74 6f 20 70 65 72 73 69 73 74 2e 20 41  ed to persist. A
a8a0: 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64 6f   process.  ** do
a8b0: 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6f  es not have to o
a8c0: 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44  btain a RESERVED
a8d0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61 79   lock on the way
a8e0: 20 74 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f   to a PENDING lo
a8f0: 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70 72  ck..  ** This pr
a900: 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20 62  operty is used b
a910: 79 20 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20  y the algorithm 
a920: 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  for rolling back
a930: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a   a journal file.
a940: 20 20 2a 2a 20 61 66 74 65 72 20 61 20 63 72 61    ** after a cra
a950: 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  sh..  **.  ** An
a960: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
a970: 20 6f 62 74 61 69 6e 65 64 20 61 66 74 65 72 20   obtained after 
a980: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  a PENDING lock i
a990: 73 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a 20  s held, is.  ** 
a9a0: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f  implemented by o
a9b0: 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65  btaining a write
a9c0: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e 74  -lock on the ent
a9d0: 69 72 65 20 27 73 68 61 72 65 64 20 62 79 74 65  ire 'shared byte
a9e0: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53 69  .  ** range'. Si
a9f0: 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c 6f  nce all other lo
aa00: 63 6b 73 20 72 65 71 75 69 72 65 20 61 20 72 65  cks require a re
aa10: 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f  ad-lock on one o
aa20: 66 20 74 68 65 20 62 79 74 65 73 0a 20 20 2a 2a  f the bytes.  **
aa30: 20 77 69 74 68 69 6e 20 74 68 69 73 20 72 61 6e   within this ran
aa40: 67 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73  ge, this ensures
aa50: 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 6c   that no other l
aa60: 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 20 6f 6e  ocks are held on
aa70: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
aa80: 73 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  se. .  **.  ** T
aa90: 68 65 20 72 65 61 73 6f 6e 20 61 20 73 69 6e 67  he reason a sing
aaa0: 6c 65 20 62 79 74 65 20 63 61 6e 6e 6f 74 20 62  le byte cannot b
aab0: 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f  e used instead o
aac0: 66 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79  f the 'shared by
aad0: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69  te.  ** range' i
aae0: 73 20 74 68 61 74 20 73 6f 6d 65 20 76 65 72 73  s that some vers
aaf0: 69 6f 6e 73 20 6f 66 20 77 69 6e 64 6f 77 73 20  ions of windows 
ab00: 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 72  do not support r
ab10: 65 61 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20 20  ead-locks. By.  
ab20: 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61 20 72 61 6e  ** locking a ran
ab30: 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 61 20  dom byte from a 
ab40: 72 61 6e 67 65 2c 20 63 6f 6e 63 75 72 72 65 6e  range, concurren
ab50: 74 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 6d  t SHARED locks m
ab60: 61 79 20 65 78 69 73 74 0a 20 20 2a 2a 20 65 76  ay exist.  ** ev
ab70: 65 6e 20 69 66 20 74 68 65 20 6c 6f 63 6b 69 6e  en if the lockin
ab80: 67 20 70 72 69 6d 69 74 69 76 65 20 75 73 65 64  g primitive used
ab90: 20 69 73 20 61 6c 77 61 79 73 20 61 20 77 72 69   is always a wri
aba0: 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  te-lock..  */.  
abb0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
abc0: 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
abd0: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
abe0: 65 2a 29 69 64 3b 0a 20 20 73 74 72 75 63 74 20  e*)id;.  struct 
abf0: 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 20  lockInfo *pLock 
ac00: 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a  = pFile->pLock;.
ac10: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
ac20: 6f 63 6b 3b 0a 20 20 69 6e 74 20 73 3b 0a 0a 20  ock;.  int s;.. 
ac30: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
ac40: 3b 0a 20 20 4f 53 54 52 41 43 45 37 28 22 4c 4f  ;.  OSTRACE7("LO
ac50: 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20  CK    %d %s was 
ac60: 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64  %s(%s,%d) pid=%d
ac70: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
ac80: 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d       locktypeNam
ac90: 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 6c 6f 63  e(locktype), loc
aca0: 6b 74 79 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d  ktypeName(pFile-
acb0: 3e 6c 6f 63 6b 74 79 70 65 29 2c 0a 20 20 20 20  >locktype),.    
acc0: 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70    locktypeName(p
acd0: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c  Lock->locktype),
ace0: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 2c 20 67 65   pLock->cnt , ge
acf0: 74 70 69 64 28 29 29 3b 0a 0a 20 20 2f 2a 20 49  tpid());..  /* I
ad00: 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
ad10: 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69  dy a lock of thi
ad20: 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72  s type or more r
ad30: 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68  estrictive on th
ad40: 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64  e.  ** OsFile, d
ad50: 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74  o nothing. Don't
ad60: 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63   use the end_loc
ad70: 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73  k: exit path, as
ad80: 0a 20 20 2a 2a 20 65 6e 74 65 72 4d 75 74 65 78  .  ** enterMutex
ad90: 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63  () hasn't been c
ada0: 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a  alled yet..  */.
adb0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
adc0: 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20  ktype>=locktype 
add0: 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 33 28  ){.    OSTRACE3(
ade0: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f  "LOCK    %d %s o
adf0: 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29  k (already held)
ae00: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
ae10: 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74             lockt
ae20: 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65  ypeName(locktype
ae30: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
ae40: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
ae50: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
ae60: 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e  e locking sequen
ae70: 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20  ce is correct.  
ae80: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
ae90: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f  le->locktype!=NO
aea0: 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70  _LOCK || locktyp
aeb0: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
aec0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
aed0: 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  type!=PENDING_LO
aee0: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
aef0: 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56  locktype!=RESERV
af00: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65  ED_LOCK || pFile
af10: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ->locktype==SHAR
af20: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  ED_LOCK );..  /*
af30: 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e   This mutex is n
af40: 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46  eeded because pF
af50: 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68  ile->pLock is sh
af60: 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
af70: 61 64 73 0a 20 20 2a 2f 0a 20 20 65 6e 74 65 72  ads.  */.  enter
af80: 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 4d  Mutex();..  /* M
af90: 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 75 72  ake sure the cur
afa0: 72 65 6e 74 20 74 68 72 65 61 64 20 6f 77 6e 73  rent thread owns
afb0: 20 74 68 65 20 70 46 69 6c 65 2e 0a 20 20 2a 2f   the pFile..  */
afc0: 0a 20 20 72 63 20 3d 20 74 72 61 6e 73 66 65 72  .  rc = transfer
afd0: 4f 77 6e 65 72 73 68 69 70 28 70 46 69 6c 65 29  Ownership(pFile)
afe0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
aff0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6c 65 61  TE_OK ){.    lea
b000: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72  veMutex();.    r
b010: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
b020: 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70  pLock = pFile->p
b030: 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 73  Lock;..  /* If s
b040: 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67  ome thread using
b050: 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61 20   this PID has a 
b060: 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66 65  lock via a diffe
b070: 72 65 6e 74 20 4f 73 46 69 6c 65 2a 0a 20 20 2a  rent OsFile*.  *
b080: 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72  * handle that pr
b090: 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71 75  ecludes the requ
b0a0: 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75  ested lock, retu
b0b0: 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20  rn BUSY..  */.  
b0c0: 69 66 28 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b  if( (pFile->lock
b0d0: 74 79 70 65 21 3d 70 4c 6f 63 6b 2d 3e 6c 6f 63  type!=pLock->loc
b0e0: 6b 74 79 70 65 20 26 26 20 0a 20 20 20 20 20 20  ktype && .      
b0f0: 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b      (pLock->lock
b100: 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  type>=PENDING_LO
b110: 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3e 53  CK || locktype>S
b120: 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29  HARED_LOCK)).  )
b130: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
b140: 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
b150: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a   end_lock;.  }..
b160: 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44    /* If a SHARED
b170: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
b180: 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72  ed, and some thr
b190: 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
b1a0: 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ID already.  ** 
b1b0: 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20  has a SHARED or 
b1c0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74  RESERVED lock, t
b1d0: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65  hen increment re
b1e0: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61  ference counts a
b1f0: 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  nd.  ** return S
b200: 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20  QLITE_OK..  */. 
b210: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53   if( locktype==S
b220: 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20  HARED_LOCK && . 
b230: 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63       (pLock->loc
b240: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
b250: 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 6c 6f 63  CK || pLock->loc
b260: 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f  ktype==RESERVED_
b270: 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73  LOCK) ){.    ass
b280: 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  ert( locktype==S
b290: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
b2a0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
b2b0: 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a  >locktype==0 );.
b2c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
b2d0: 6b 2d 3e 63 6e 74 3e 30 20 29 3b 0a 20 20 20 20  k->cnt>0 );.    
b2e0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
b2f0: 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
b300: 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2b 2b 3b     pLock->cnt++;
b310: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4f 70 65  .    pFile->pOpe
b320: 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  n->nLock++;.    
b330: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
b340: 20 7d 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e   }..  lock.l_len
b350: 20 3d 20 31 4c 3b 0a 0a 20 20 6c 6f 63 6b 2e 6c   = 1L;..  lock.l
b360: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
b370: 45 54 3b 0a 0a 20 20 2f 2a 20 41 20 50 45 4e 44  ET;..  /* A PEND
b380: 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64  ING lock is need
b390: 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72  ed before acquir
b3a0: 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ing a SHARED loc
b3b0: 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a  k and before.  *
b3c0: 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45  * acquiring an E
b3d0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
b3e0: 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c  For the SHARED l
b3f0: 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47  ock, the PENDING
b400: 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65   will.  ** be re
b410: 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  leased..  */.  i
b420: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
b430: 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20  RED_LOCK .      
b440: 7c 7c 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  || (locktype==EX
b450: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
b460: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c  pFile->locktype<
b470: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20  PENDING_LOCK).  
b480: 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  ){.    lock.l_ty
b490: 70 65 20 3d 20 28 6c 6f 63 6b 74 79 70 65 3d 3d  pe = (locktype==
b4a0: 53 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44  SHARED_LOCK?F_RD
b4b0: 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20  LCK:F_WRLCK);.  
b4c0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
b4d0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20   PENDING_BYTE;. 
b4e0: 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 70 46 69     s = fcntl(pFi
b4f0: 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  le->h, F_SETLK, 
b500: 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20  &lock);.    if( 
b510: 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  s==(-1) ){.     
b520: 20 72 63 20 3d 20 28 65 72 72 6e 6f 3d 3d 45 49   rc = (errno==EI
b530: 4e 56 41 4c 29 20 3f 20 53 51 4c 49 54 45 5f 4e  NVAL) ? SQLITE_N
b540: 4f 4c 46 53 20 3a 20 53 51 4c 49 54 45 5f 42 55  OLFS : SQLITE_BU
b550: 53 59 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  SY;.      goto e
b560: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  nd_lock;.    }. 
b570: 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e   }...  /* If con
b580: 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69  trol gets to thi
b590: 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63  s point, then ac
b5a0: 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20  tually go ahead 
b5b0: 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70  and make.  ** op
b5c0: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
b5d0: 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65  alls for the spe
b5e0: 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  cified lock..  *
b5f0: 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
b600: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
b610: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
b620: 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 3b 0a 20 20  ck->cnt==0 );.  
b630: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
b640: 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a  >locktype==0 );.
b650: 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20  .    /* Now get 
b660: 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f  the read-lock */
b670: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
b680: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
b690: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
b6a0: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
b6b0: 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 70 46      s = fcntl(pF
b6c0: 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c  ile->h, F_SETLK,
b6d0: 20 26 6c 6f 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a   &lock);..    /*
b6e0: 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72   Drop the tempor
b6f0: 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  ary PENDING lock
b700: 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73   */.    lock.l_s
b710: 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
b720: 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  YTE;.    lock.l_
b730: 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f  len = 1L;.    lo
b740: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
b750: 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 66 63 6e  LCK;.    if( fcn
b760: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
b770: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 30 20  ETLK, &lock)!=0 
b780: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
b790: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
b7a0: 4b 3b 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75  K;  /* This shou
b7b0: 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20  ld never happen 
b7c0: 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  */.      goto en
b7d0: 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
b7e0: 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b    if( s==(-1) ){
b7f0: 0a 20 20 20 20 20 20 72 63 20 3d 20 28 65 72 72  .      rc = (err
b800: 6e 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f 20 53 51  no==EINVAL) ? SQ
b810: 4c 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c  LITE_NOLFS : SQL
b820: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65  ITE_BUSY;.    }e
b830: 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
b840: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41  ->locktype = SHA
b850: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  RED_LOCK;.      
b860: 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c  pFile->pOpen->nL
b870: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 4c 6f  ock++;.      pLo
b880: 63 6b 2d 3e 63 6e 74 20 3d 20 31 3b 0a 20 20 20  ck->cnt = 1;.   
b890: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c   }.  }else if( l
b8a0: 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
b8b0: 56 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  VE_LOCK && pLock
b8c0: 2d 3e 63 6e 74 3e 31 20 29 7b 0a 20 20 20 20 2f  ->cnt>1 ){.    /
b8d0: 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20  * We are trying 
b8e0: 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65  for an exclusive
b8f0: 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65   lock but anothe
b900: 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  r thread in this
b910: 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f  .    ** same pro
b920: 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f  cess is still ho
b930: 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  lding a shared l
b940: 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ock. */.    rc =
b950: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
b960: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
b970: 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f  e request was fo
b980: 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
b990: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
b9a0: 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73   It is.    ** as
b9b0: 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65  sumed that there
b9c0: 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20   is a SHARED or 
b9d0: 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
b9e0: 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
b9f0: 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
ba00: 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70      assert( 0!=p
ba10: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29  File->locktype )
ba20: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.    lock.l_typ
ba30: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20  e = F_WRLCK;.   
ba40: 20 73 77 69 74 63 68 28 20 6c 6f 63 6b 74 79 70   switch( locktyp
ba50: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
ba60: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 0a 20  RESERVED_LOCK:. 
ba70: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
ba80: 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42  art = RESERVED_B
ba90: 59 54 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65  YTE;.        bre
baa0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 45  ak;.      case E
bab0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 0a 20  XCLUSIVE_LOCK:. 
bac0: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
bad0: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
bae0: 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ST;.        lock
baf0: 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
bb00: 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 62 72  SIZE;.        br
bb10: 65 61 6b 3b 0a 20 20 20 20 20 20 64 65 66 61 75  eak;.      defau
bb20: 6c 74 3a 0a 20 20 20 20 20 20 20 20 61 73 73 65  lt:.        asse
bb30: 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rt(0);.    }.   
bb40: 20 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65   s = fcntl(pFile
bb50: 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  ->h, F_SETLK, &l
bb60: 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 73 3d  ock);.    if( s=
bb70: 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 72  =(-1) ){.      r
bb80: 63 20 3d 20 28 65 72 72 6e 6f 3d 3d 45 49 4e 56  c = (errno==EINV
bb90: 41 4c 29 20 3f 20 53 51 4c 49 54 45 5f 4e 4f 4c  AL) ? SQLITE_NOL
bba0: 46 53 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59  FS : SQLITE_BUSY
bbb0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
bbc0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
bbd0: 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  OK ){.    pFile-
bbe0: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b  >locktype = lock
bbf0: 74 79 70 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  type;.    pLock-
bc00: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b  >locktype = lock
bc10: 74 79 70 65 3b 0a 20 20 7d 65 6c 73 65 20 69 66  type;.  }else if
bc20: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c  ( locktype==EXCL
bc30: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
bc40: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
bc50: 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  e = PENDING_LOCK
bc60: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63  ;.    pLock->loc
bc70: 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f  ktype = PENDING_
bc80: 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c  LOCK;.  }..end_l
bc90: 6f 63 6b 3a 0a 20 20 6c 65 61 76 65 4d 75 74 65  ock:.  leaveMute
bca0: 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 34 28  x();.  OSTRACE4(
bcb0: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25  "LOCK    %d %s %
bcc0: 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  s\n", pFile->h, 
bcd0: 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63  locktypeName(loc
bce0: 6b 74 79 70 65 29 2c 20 0a 20 20 20 20 20 20 72  ktype), .      r
bcf0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22  c==SQLITE_OK ? "
bd00: 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 3b  ok" : "failed");
bd10: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
bd20: 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
bd30: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
bd40: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
bd50: 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74  r pFile to lockt
bd60: 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a  ype.  locktype.*
bd70: 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
bd80: 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
bd90: 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
bda0: 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
bdb0: 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
bdc0: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
bdd0: 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
bde0: 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
bdf0: 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
be00: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
be10: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
be20: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c  atic int unixUnl
be30: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
be40: 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
be50: 70 65 29 7b 0a 20 20 73 74 72 75 63 74 20 6c 6f  pe){.  struct lo
be60: 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 0a 20  ckInfo *pLock;. 
be70: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
be80: 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ck;.  int rc = S
be90: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
bea0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
beb0: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
bec0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
bed0: 0a 20 20 4f 53 54 52 41 43 45 37 28 22 55 4e 4c  .  OSTRACE7("UNL
bee0: 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
bef0: 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 5c  d(%d,%d) pid=%d\
bf00: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f  n", pFile->h, lo
bf10: 63 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 70 46  cktype,.      pF
bf20: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70  ile->locktype, p
bf30: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63  File->pLock->loc
bf40: 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 70 4c  ktype, pFile->pL
bf50: 6f 63 6b 2d 3e 63 6e 74 2c 20 67 65 74 70 69 64  ock->cnt, getpid
bf60: 28 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ());..  assert( 
bf70: 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44  locktype<=SHARED
bf80: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
bf90: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d  File->locktype<=
bfa0: 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
bfb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
bfc0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 43 48 45 43  ;.  }.  if( CHEC
bfd0: 4b 5f 54 48 52 45 41 44 49 44 28 70 46 69 6c 65  K_THREADID(pFile
bfe0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
bff0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20  SQLITE_MISUSE;. 
c000: 20 7d 0a 20 20 65 6e 74 65 72 4d 75 74 65 78 28   }.  enterMutex(
c010: 29 3b 0a 20 20 70 4c 6f 63 6b 20 3d 20 70 46 69  );.  pLock = pFi
c020: 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 61 73 73  le->pLock;.  ass
c030: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 21  ert( pLock->cnt!
c040: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  =0 );.  if( pFil
c050: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52  e->locktype>SHAR
c060: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61  ED_LOCK ){.    a
c070: 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f  ssert( pLock->lo
c080: 63 6b 74 79 70 65 3d 3d 70 46 69 6c 65 2d 3e 6c  cktype==pFile->l
c090: 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20 69  ocktype );.    i
c0a0: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
c0b0: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
c0c0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
c0d0: 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 6c  F_RDLCK;.      l
c0e0: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
c0f0: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c  EEK_SET;.      l
c100: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
c110: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
c120: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
c130: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
c140: 20 20 69 66 28 20 66 63 6e 74 6c 28 70 46 69 6c    if( fcntl(pFil
c150: 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
c160: 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20  lock)==(-1) ){. 
c170: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73         /* This s
c180: 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70  hould never happ
c190: 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  en */.        rc
c1a0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
c1b0: 52 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a  RDLOCK;.      }.
c1c0: 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c      }.    lock.l
c1d0: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
c1e0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  .    lock.l_when
c1f0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
c200: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
c210: 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a  = PENDING_BYTE;.
c220: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
c230: 20 32 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45   2L;  assert( PE
c240: 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45  NDING_BYTE+1==RE
c250: 53 45 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20  SERVED_BYTE );. 
c260: 20 20 20 69 66 28 20 66 63 6e 74 6c 28 70 46 69     if( fcntl(pFi
c270: 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  le->h, F_SETLK, 
c280: 26 6c 6f 63 6b 29 21 3d 28 2d 31 29 20 29 7b 0a  &lock)!=(-1) ){.
c290: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63        pLock->loc
c2a0: 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c  ktype = SHARED_L
c2b0: 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  OCK;.    }else{.
c2c0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
c2d0: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20  E_IOERR_UNLOCK; 
c2e0: 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20   /* This should 
c2f0: 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a  never happen */.
c300: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
c310: 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43  locktype==NO_LOC
c320: 4b 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  K ){.    struct 
c330: 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 0a  openCnt *pOpen;.
c340: 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
c350: 74 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  t the shared loc
c360: 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65  k counter.  Rele
c370: 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69  ase the lock usi
c380: 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20  ng an.    ** OS 
c390: 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61  call only when a
c3a0: 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74 68  ll threads in th
c3b0: 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  is same process 
c3c0: 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20  have released.  
c3d0: 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20    ** the lock.. 
c3e0: 20 20 20 2a 2f 0a 20 20 20 20 70 4c 6f 63 6b 2d     */.    pLock-
c3f0: 3e 63 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20  >cnt--;.    if( 
c400: 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 7b  pLock->cnt==0 ){
c410: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  .      lock.l_ty
c420: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
c430: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
c440: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
c450: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
c460: 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20   = lock.l_len = 
c470: 30 4c 3b 0a 20 20 20 20 20 20 69 66 28 20 66 63  0L;.      if( fc
c480: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
c490: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28  SETLK, &lock)!=(
c4a0: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  -1) ){.        p
c4b0: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  Lock->locktype =
c4c0: 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
c4d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
c4e0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
c4f0: 5f 55 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54 68 69  _UNLOCK;  /* Thi
c500: 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68  s should never h
c510: 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d  appen */.      }
c520: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
c530: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75  ecrement the cou
c540: 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69  nt of locks agai
c550: 6e 73 74 20 74 68 69 73 20 73 61 6d 65 20 66 69  nst this same fi
c560: 6c 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20  le.  When the.  
c570: 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68    ** count reach
c580: 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61  es zero, close a
c590: 6e 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65  ny other file de
c5a0: 73 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20  scriptors whose 
c5b0: 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73  close.    ** was
c5c0: 20 64 65 66 65 72 72 65 64 20 62 65 63 61 75 73   deferred becaus
c5d0: 65 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  e of outstanding
c5e0: 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20   locks..    */. 
c5f0: 20 20 20 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65     pOpen = pFile
c600: 2d 3e 70 4f 70 65 6e 3b 0a 20 20 20 20 70 4f 70  ->pOpen;.    pOp
c610: 65 6e 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20  en->nLock--;.   
c620: 20 61 73 73 65 72 74 28 20 70 4f 70 65 6e 2d 3e   assert( pOpen->
c630: 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20  nLock>=0 );.    
c640: 69 66 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b  if( pOpen->nLock
c650: 3d 3d 30 20 26 26 20 70 4f 70 65 6e 2d 3e 6e 50  ==0 && pOpen->nP
c660: 65 6e 64 69 6e 67 3e 30 20 29 7b 0a 20 20 20 20  ending>0 ){.    
c670: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
c680: 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 70 65 6e 2d  or(i=0; i<pOpen-
c690: 3e 6e 50 65 6e 64 69 6e 67 3b 20 69 2b 2b 29 7b  >nPending; i++){
c6a0: 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 70  .        close(p
c6b0: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 69  Open->aPending[i
c6c0: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
c6d0: 20 20 66 72 65 65 28 70 4f 70 65 6e 2d 3e 61 50    free(pOpen->aP
c6e0: 65 6e 64 69 6e 67 29 3b 0a 20 20 20 20 20 20 70  ending);.      p
c6f0: 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d  Open->nPending =
c700: 20 30 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d   0;.      pOpen-
c710: 3e 61 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20  >aPending = 0;. 
c720: 20 20 20 7d 0a 20 20 7d 0a 20 20 6c 65 61 76 65     }.  }.  leave
c730: 4d 75 74 65 78 28 29 3b 0a 20 20 70 46 69 6c 65  Mutex();.  pFile
c740: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
c750: 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20  ktype;.  return 
c760: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  rc;.}../*.** Clo
c770: 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  se a file..*/.st
c780: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f  atic int unixClo
c790: 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
c7a0: 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  *id){.  unixFile
c7b0: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
c7c0: 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 66 28 20  ile *)id;.  if( 
c7d0: 21 70 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20  !pFile ) return 
c7e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
c7f0: 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  xUnlock(id, NO_L
c800: 4f 43 4b 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  OCK);.  if( pFil
c810: 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29 20 63 6c  e->dirfd>=0 ) cl
c820: 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72 66 64  ose(pFile->dirfd
c830: 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 64 69 72 66  );.  pFile->dirf
c840: 64 20 3d 20 2d 31 3b 0a 20 20 65 6e 74 65 72 4d  d = -1;.  enterM
c850: 75 74 65 78 28 29 3b 0a 0a 20 20 69 66 28 20 70  utex();..  if( p
c860: 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f  File->pOpen->nLo
c870: 63 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  ck ){.    /* If 
c880: 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
c890: 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20  nding locks, do 
c8a0: 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f  not actually clo
c8b0: 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74  se the file just
c8c0: 0a 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61  .    ** yet beca
c8d0: 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63  use that would c
c8e0: 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73  lear those locks
c8f0: 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20  .  Instead, add 
c900: 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
c910: 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 4f  descriptor to pO
c920: 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20  pen->aPending.  
c930: 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  It will be autom
c940: 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20  atically closed 
c950: 77 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  when.    ** the 
c960: 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65  last lock is cle
c970: 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ared..    */.   
c980: 20 69 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20   int *aNew;.    
c990: 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a  struct openCnt *
c9a0: 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d 3e 70  pOpen = pFile->p
c9b0: 4f 70 65 6e 3b 0a 20 20 20 20 61 4e 65 77 20 3d  Open;.    aNew =
c9c0: 20 72 65 61 6c 6c 6f 63 28 20 70 4f 70 65 6e 2d   realloc( pOpen-
c9d0: 3e 61 50 65 6e 64 69 6e 67 2c 20 28 70 4f 70 65  >aPending, (pOpe
c9e0: 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b 31 29 2a 73  n->nPending+1)*s
c9f0: 69 7a 65 6f 66 28 69 6e 74 29 20 29 3b 0a 20 20  izeof(int) );.  
ca00: 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b    if( aNew==0 ){
ca10: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 6d  .      /* If a m
ca20: 61 6c 6c 6f 63 20 66 61 69 6c 73 2c 20 6a 75 73  alloc fails, jus
ca30: 74 20 6c 65 61 6b 20 74 68 65 20 66 69 6c 65 20  t leak the file 
ca40: 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
ca50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
ca60: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d  Open->aPending =
ca70: 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 70 4f 70   aNew;.      pOp
ca80: 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 70 4f 70  en->aPending[pOp
ca90: 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 5d 20 3d 20  en->nPending] = 
caa0: 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 20 20 20 20  pFile->h;.      
cab0: 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b  pOpen->nPending+
cac0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  +;.    }.  }else
cad0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
cae0: 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
caf0: 67 20 6c 6f 63 6b 73 20 73 6f 20 77 65 20 63 61  g locks so we ca
cb00: 6e 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  n close the file
cb10: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a   immediately */.
cb20: 20 20 20 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d      close(pFile-
cb30: 3e 68 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  >h);.  }.  relea
cb40: 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65  seLockInfo(pFile
cb50: 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 72 65 6c 65  ->pLock);.  rele
cb60: 61 73 65 4f 70 65 6e 43 6e 74 28 70 46 69 6c 65  aseOpenCnt(pFile
cb70: 2d 3e 70 4f 70 65 6e 29 3b 0a 0a 20 20 6c 65 61  ->pOpen);..  lea
cb80: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 70 46 69  veMutex();.  pFi
cb90: 6c 65 2d 3e 69 73 4f 70 65 6e 20 3d 20 30 3b 0a  le->isOpen = 0;.
cba0: 20 20 4f 53 54 52 41 43 45 32 28 22 43 4c 4f 53    OSTRACE2("CLOS
cbb0: 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69  E   %-3d\n", pFi
cbc0: 6c 65 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e 43 6f  le->h);.  OpenCo
cbd0: 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 6d 65 6d  unter(-1);.  mem
cbe0: 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69  set(pFile, 0, si
cbf0: 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b  zeof(unixFile));
cc00: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
cc10: 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20  _OK;.}...#ifdef 
cc20: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
cc30: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 70 72 61  CKING_STYLE.#pra
cc40: 67 6d 61 20 6d 61 72 6b 20 41 46 50 20 53 75 70  gma mark AFP Sup
cc50: 70 6f 72 74 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 65  port../*. ** The
cc60: 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
cc70: 78 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  xt structure con
cc80: 74 61 69 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f  tains all afp lo
cc90: 63 6b 20 73 70 65 63 69 66 69 63 20 73 74 61 74  ck specific stat
cca0: 65 0a 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  e. */.typedef st
ccb0: 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43  ruct afpLockingC
ccc0: 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e  ontext afpLockin
ccd0: 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74  gContext;.struct
cce0: 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
ccf0: 78 74 20 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  xt {.  unsigned 
cd00: 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64  long long shared
cd10: 4c 6f 63 6b 42 79 74 65 3b 0a 20 20 63 68 61 72  LockByte;.  char
cd20: 20 2a 66 69 6c 65 50 61 74 68 3b 0a 7d 3b 0a 0a   *filePath;.};..
cd30: 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65  struct ByteRange
cd40: 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69  LockPB2.{.  unsi
cd50: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f  gned long long o
cd60: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a  ffset;        /*
cd70: 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74   offset to first
cd80: 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f   byte to lock */
cd90: 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
cda0: 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20   long length;   
cdb0: 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62       /* nbr of b
cdc0: 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  ytes to lock */.
cdd0: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
cde0: 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74 61  long retRangeSta
cdf0: 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73  rt; /* nbr of 1s
ce00: 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69 66  t byte locked if
ce10: 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20   successful */. 
ce20: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75   unsigned char u
ce30: 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20 20  nLockFlag;      
ce40: 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b     /* 1 = unlock
ce50: 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20  , 0 = lock */.  
ce60: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73 74  unsigned char st
ce70: 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20 20  artEndFlag;     
ce80: 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e    /* 1=rel to en
ce90: 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c  d of fork, 0=rel
cea0: 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20 69   to start */.  i
ceb0: 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20  nt fd;          
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ced0: 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74 6f   /* file desc to
cee0: 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b   assoc this lock
cef0: 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65   with */.};..#de
cf00: 66 69 6e 65 20 61 66 70 66 73 42 79 74 65 52 61  fine afpfsByteRa
cf10: 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20  ngeLock2FSCTL   
cf20: 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20       _IOWR('z', 
cf30: 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65 52  23, struct ByteR
cf40: 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a  angeLockPB2)../*
cf50: 20 72 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63   return 0 on suc
cf60: 63 65 73 73 2c 20 31 20 6f 6e 20 66 61 69 6c 75  cess, 1 on failu
cf70: 72 65 2e 20 20 54 6f 20 6d 61 74 63 68 20 74 68  re.  To match th
cf80: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68  e behavior of th
cf90: 65 20 0a 20 20 6e 6f 72 6d 61 6c 20 70 6f 73 69  e .  normal posi
cfa0: 78 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 28  x file locking (
cfb0: 75 73 65 64 20 69 6e 20 75 6e 69 78 4c 6f 63 6b  used in unixLock
cfc0: 20 66 6f 72 20 65 78 61 6d 70 6c 65 29 2c 20 77   for example), w
cfd0: 65 20 73 68 6f 75 6c 64 20 0a 20 20 70 72 6f 76  e should .  prov
cfe0: 69 64 65 20 27 72 69 63 68 65 72 27 20 72 65 74  ide 'richer' ret
cff0: 75 72 6e 20 63 6f 64 65 73 20 2d 20 73 70 65 63  urn codes - spec
d000: 69 66 69 63 61 6c 6c 79 20 74 6f 20 64 69 66 66  ifically to diff
d010: 65 72 65 6e 74 69 61 74 65 20 62 65 74 77 65 65  erentiate betwee
d020: 6e 0a 20 20 27 66 69 6c 65 20 62 75 73 79 27 20  n.  'file busy' 
d030: 61 6e 64 20 27 66 69 6c 65 20 73 79 73 74 65 6d  and 'file system
d040: 20 65 72 72 6f 72 27 20 72 65 73 75 6c 74 73 20   error' results 
d050: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 5f 41  */.static int _A
d060: 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 73  FPFSSetLock(cons
d070: 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 69 6e  t char *path, in
d080: 74 20 66 64 2c 20 75 6e 73 69 67 6e 65 64 20 6c  t fd, unsigned l
d090: 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c  ong long offset,
d0a0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
d0b0: 20 20 20 20 20 20 20 20 20 20 20 75 6e 73 69 67             unsig
d0c0: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65  ned long long le
d0d0: 6e 67 74 68 2c 20 69 6e 74 20 73 65 74 4c 6f 63  ngth, int setLoc
d0e0: 6b 46 6c 61 67 29 0a 7b 0a 20 20 73 74 72 75 63  kFlag).{.  struc
d0f0: 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50  t ByteRangeLockP
d100: 42 32 20 20 20 20 20 20 20 70 62 3b 0a 20 20 69  B2       pb;.  i
d110: 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nt              
d120: 20 20 20 20 20 20 20 65 72 72 3b 0a 20 20 0a 20         err;.  . 
d130: 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d   pb.unLockFlag =
d140: 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30   setLockFlag ? 0
d150: 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72 74   : 1;.  pb.start
d160: 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70  EndFlag = 0;.  p
d170: 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65  b.offset = offse
d180: 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d  t;.  pb.length =
d190: 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66   length; .  pb.f
d1a0: 64 20 3d 20 66 64 3b 0a 20 20 4f 53 54 52 41 43  d = fd;.  OSTRAC
d1b0: 45 35 28 22 41 46 50 4c 4f 43 4b 20 73 65 74 74  E5("AFPLOCK sett
d1c0: 69 6e 67 20 6c 6f 63 6b 20 25 73 20 66 6f 72 20  ing lock %s for 
d1d0: 25 64 20 69 6e 20 72 61 6e 67 65 20 25 6c 6c 78  %d in range %llx
d1e0: 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 28  :%llx\n", .    (
d1f0: 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22  setLockFlag?"ON"
d200: 3a 22 4f 46 46 22 29 2c 20 66 64 2c 20 6f 66 66  :"OFF"), fd, off
d210: 73 65 74 2c 20 6c 65 6e 67 74 68 29 3b 0a 20 20  set, length);.  
d220: 65 72 72 20 3d 20 66 73 63 74 6c 28 70 61 74 68  err = fsctl(path
d230: 2c 20 61 66 70 66 73 42 79 74 65 52 61 6e 67 65  , afpfsByteRange
d240: 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c  Lock2FSCTL, &pb,
d250: 20 30 29 3b 0a 20 20 69 66 20 28 20 65 72 72 3d   0);.  if ( err=
d260: 3d 2d 31 20 29 20 7b 0a 20 20 20 20 4f 53 54 52  =-1 ) {.    OSTR
d270: 41 43 45 34 28 22 41 46 50 4c 4f 43 4b 20 66 61  ACE4("AFPLOCK fa
d280: 69 6c 65 64 20 74 6f 20 66 73 63 74 6c 28 29 20  iled to fsctl() 
d290: 27 25 73 27 20 25 64 20 25 73 5c 6e 22 2c 20 70  '%s' %d %s\n", p
d2a0: 61 74 68 2c 20 65 72 72 6e 6f 2c 20 0a 20 20 20  ath, errno, .   
d2b0: 20 20 20 73 74 72 65 72 72 6f 72 28 65 72 72 6e     strerror(errn
d2c0: 6f 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  o));.    return 
d2d0: 31 3b 20 2f 2a 20 65 72 72 6f 72 20 2a 2f 0a 20  1; /* error */. 
d2e0: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65   } else {.    re
d2f0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  turn 0;.  }.}../
d300: 2a 0a 20 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  *. ** This routi
d310: 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
d320: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
d330: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
d340: 65 20 73 70 65 63 69 66 69 65 64 0a 20 2a 2a 20  e specified. ** 
d350: 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
d360: 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
d370: 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
d380: 6b 20 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72  k is held, retur
d390: 6e 0a 20 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  n. ** non-zero. 
d3a0: 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
d3b0: 75 6e 6c 6f 63 6b 65 64 20 6f 72 20 68 6f 6c 64  unlocked or hold
d3c0: 73 20 6f 6e 6c 79 20 53 48 41 52 45 44 20 6c 6f  s only SHARED lo
d3d0: 63 6b 73 2c 20 74 68 65 6e 0a 20 2a 2a 20 72 65  cks, then. ** re
d3e0: 74 75 72 6e 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 73  turn zero.. */.s
d3f0: 74 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e 69  tatic int afpUni
d400: 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
d410: 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a  ck(OsFile *id){.
d420: 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 75    int r = 0;.  u
d430: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
d440: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
d450: 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
d460: 6c 65 20 29 3b 20 0a 20 20 61 66 70 4c 6f 63 6b  le ); .  afpLock
d470: 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  ingContext *cont
d480: 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e  ext = (afpLockin
d490: 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c  gContext *) pFil
d4a0: 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
d4b0: 74 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b  t;.  .  /* Check
d4c0: 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
d4d0: 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
d4e0: 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
d4f0: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  /.  if( pFile->l
d500: 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c  ocktype>SHARED_L
d510: 4f 43 4b 20 29 7b 0a 20 20 20 20 72 20 3d 20 31  OCK ){.    r = 1
d520: 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
d530: 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
d540: 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
d550: 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a  s holds it..   *
d560: 2f 0a 20 20 69 66 20 28 20 21 72 20 29 20 7b 0a  /.  if ( !r ) {.
d570: 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20      /* lock the 
d580: 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  byte */.    int 
d590: 66 61 69 6c 65 64 20 3d 20 5f 41 46 50 46 53 53  failed = _AFPFSS
d5a0: 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
d5b0: 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d  filePath, pFile-
d5c0: 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  >h, RESERVED_BYT
d5d0: 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20 20 69  E, 1,1);  .    i
d5e0: 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20  f (failed) {.   
d5f0: 20 20 20 2f 2a 20 69 66 20 77 65 20 66 61 69 6c     /* if we fail
d600: 65 64 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f  ed to get the lo
d610: 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e 65 20  ck then someone 
d620: 65 6c 73 65 20 6d 75 73 74 20 68 61 76 65 20 69  else must have i
d630: 74 20 2a 2f 0a 20 20 20 20 20 20 72 20 3d 20 31  t */.      r = 1
d640: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
d650: 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 73 75       /* if we su
d660: 63 63 65 65 64 65 64 20 69 6e 20 74 61 6b 69 6e  cceeded in takin
d670: 67 20 74 68 65 20 72 65 73 65 72 76 65 64 20 6c  g the reserved l
d680: 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 74  ock, unlock it t
d690: 6f 20 72 65 73 74 6f 72 65 0a 20 20 20 20 20 20  o restore.      
d6a0: 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** the original 
d6b0: 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 5f  state */.      _
d6c0: 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e  AFPFSSetLock(con
d6d0: 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20  text->filePath, 
d6e0: 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56  pFile->h, RESERV
d6f0: 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a  ED_BYTE, 1, 0);.
d700: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52      }.  }.  OSTR
d710: 41 43 45 33 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE3("TEST WR-LO
d720: 43 4b 20 25 64 20 25 64 5c 6e 22 2c 20 70 46 69  CK %d %d\n", pFi
d730: 6c 65 2d 3e 68 2c 20 72 29 3b 0a 20 20 0a 20 20  le->h, r);.  .  
d740: 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 20  return r;.}../* 
d750: 41 46 50 2d 73 74 79 6c 65 20 6c 6f 63 6b 69 6e  AFP-style lockin
d760: 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  g following the 
d770: 62 65 68 61 76 69 6f 72 20 6f 66 20 75 6e 69 78  behavior of unix
d780: 4c 6f 63 6b 2c 20 73 65 65 20 74 68 65 20 75 6e  Lock, see the un
d790: 69 78 4c 6f 63 6b 20 0a 2a 2a 20 66 75 6e 63 74  ixLock .** funct
d7a0: 69 6f 6e 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72  ion comments for
d7b0: 20 64 65 74 61 69 6c 73 20 6f 66 20 6c 6f 63 6b   details of lock
d7c0: 20 6d 61 6e 61 67 65 6d 65 6e 74 2e 20 2a 2f 0a   management. */.
d7d0: 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e  static int afpUn
d7e0: 69 78 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69  ixLock(OsFile *i
d7f0: 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
d800: 0a 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  .{.  int rc = SQ
d810: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
d820: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
d830: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66  ixFile*)id;.  af
d840: 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
d850: 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c  *context = (afpL
d860: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
d870: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
d880: 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 67 6f  ontext;.  int go
d890: 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30  tPendingLock = 0
d8a0: 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
d8b0: 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
d8c0: 45 35 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E5("LOCK    %d %
d8d0: 73 20 77 61 73 20 25 73 20 70 69 64 3d 25 64 5c  s was %s pid=%d\
d8e0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
d8f0: 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e         locktypeN
d900: 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 6c  ame(locktype), l
d910: 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69 6c  ocktypeName(pFil
d920: 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 67 65  e->locktype), ge
d930: 74 70 69 64 28 29 29 3b 20 20 0a 20 20 2f 2a 20  tpid());  .  /* 
d940: 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
d950: 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68  ady a lock of th
d960: 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20  is type or more 
d970: 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74  restrictive on t
d980: 68 65 0a 20 20 20 20 2a 2a 20 4f 73 46 69 6c 65  he.    ** OsFile
d990: 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f  , do nothing. Do
d9a0: 6e 27 74 20 75 73 65 20 74 68 65 20 61 66 70 5f  n't use the afp_
d9b0: 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70  end_lock: exit p
d9c0: 61 74 68 2c 20 61 73 0a 20 20 20 20 2a 2a 20 65  ath, as.    ** e
d9d0: 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e  nterMutex() hasn
d9e0: 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79  't been called y
d9f0: 65 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 69 66 28  et..    */.  if(
da00: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
da10: 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  >=locktype ){.  
da20: 20 20 4f 53 54 52 41 43 45 33 28 22 4c 4f 43 4b    OSTRACE3("LOCK
da30: 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c      %d %s ok (al
da40: 72 65 61 64 79 20 68 65 6c 64 29 5c 6e 22 2c 20  ready held)\n", 
da50: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
da60: 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d       locktypeNam
da70: 65 28 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20  e(locktype));.  
da80: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
da90: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  OK;.  }..  /* Ma
daa0: 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b  ke sure the lock
dab0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
dac0: 63 6f 72 72 65 63 74 0a 20 20 20 20 2a 2f 0a 20  correct.    */. 
dad0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
dae0: 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43  locktype!=NO_LOC
daf0: 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  K || locktype==S
db00: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
db10: 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
db20: 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  !=PENDING_LOCK )
db30: 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
db40: 74 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c  type!=RESERVED_L
db50: 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f  OCK || pFile->lo
db60: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
db70: 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54  OCK );.  .  /* T
db80: 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65  his mutex is nee
db90: 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c  ded because pFil
dba0: 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61 72  e->pLock is shar
dbb0: 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
dbc0: 73 0a 20 20 20 20 2a 2f 0a 20 20 65 6e 74 65 72  s.    */.  enter
dbd0: 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 4d  Mutex();..  /* M
dbe0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 75 72  ake sure the cur
dbf0: 72 65 6e 74 20 74 68 72 65 61 64 20 6f 77 6e 73  rent thread owns
dc00: 20 74 68 65 20 70 46 69 6c 65 2e 0a 20 20 20 20   the pFile..    
dc10: 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61 6e 73 66  */.  rc = transf
dc20: 65 72 4f 77 6e 65 72 73 68 69 70 28 70 46 69 6c  erOwnership(pFil
dc30: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
dc40: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6c  LITE_OK ){.    l
dc50: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
dc60: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
dc70: 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44      .  /* A PEND
dc80: 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64  ING lock is need
dc90: 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72  ed before acquir
dca0: 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ing a SHARED loc
dcb0: 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 20  k and before.   
dcc0: 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e   ** acquiring an
dcd0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
dce0: 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44    For the SHARED
dcf0: 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49   lock, the PENDI
dd00: 4e 47 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62  NG will.    ** b
dd10: 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 20 20  e released..    
dd20: 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
dd30: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a  e==SHARED_LOCK .
dd40: 20 20 20 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79        || (lockty
dd50: 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
dd60: 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK && pFile->loc
dd70: 6b 74 79 70 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f  ktype<PENDING_LO
dd80: 43 4b 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  CK).      ){.   
dd90: 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 5f 41   int failed = _A
dda0: 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74  FPFSSetLock(cont
ddb0: 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70  ext->filePath, p
ddc0: 46 69 6c 65 2d 3e 68 2c 20 0a 20 20 20 20 20 20  File->h, .      
ddd0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c  PENDING_BYTE, 1,
dde0: 20 31 29 3b 0a 20 20 20 20 69 66 20 28 66 61 69   1);.    if (fai
ddf0: 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 72 63 20  led) {.      rc 
de00: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
de10: 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
de20: 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
de30: 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e  }.  .  /* If con
de40: 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69  trol gets to thi
de50: 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63  s point, then ac
de60: 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20  tually go ahead 
de70: 61 6e 64 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20  and make.    ** 
de80: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
de90: 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73   calls for the s
dea0: 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20  pecified lock.. 
deb0: 20 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b     */.  if( lock
dec0: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
ded0: 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 2c  K ){.    int lk,
dee0: 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 69 6e 74   failed;.    int
def0: 20 74 72 69 65 73 20 3d 20 30 3b 0a 20 20 20 20   tries = 0;.    
df00: 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20  .    /* Now get 
df10: 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f  the read-lock */
df20: 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74 68 61  .    /* note tha
df30: 74 20 74 68 65 20 71 75 61 6c 69 74 79 20 6f 66  t the quality of
df40: 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20   the randomness 
df50: 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 74  doesn't matter t
df60: 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20 20 20  hat much */.    
df70: 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b 20 0a  lk = random(); .
df80: 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61      context->sha
df90: 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28 6c  redLockByte = (l
dfa0: 6b 20 26 20 30 78 37 66 66 66 66 66 66 66 29 25  k & 0x7fffffff)%
dfb0: 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31  (SHARED_SIZE - 1
dfc0: 29 3b 0a 20 20 20 20 66 61 69 6c 65 64 20 3d 20  );.    failed = 
dfd0: 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f  _AFPFSSetLock(co
dfe0: 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c  ntext->filePath,
dff0: 20 70 46 69 6c 65 2d 3e 68 2c 20 0a 20 20 20 20   pFile->h, .    
e000: 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 63    SHARED_FIRST+c
e010: 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f  ontext->sharedLo
e020: 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20  ckByte, 1, 1);. 
e030: 20 20 20 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20     .    /* Drop 
e040: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45  the temporary PE
e050: 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20  NDING lock */.  
e060: 20 20 69 66 20 28 5f 41 46 50 46 53 53 65 74 4c    if (_AFPFSSetL
e070: 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c  ock(context->fil
e080: 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c  ePath, pFile->h,
e090: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31   PENDING_BYTE, 1
e0a0: 2c 20 30 29 29 20 7b 0a 20 20 20 20 20 20 72 63  , 0)) {.      rc
e0b0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
e0c0: 55 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54 68 69 73  UNLOCK;  /* This
e0d0: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61   should never ha
e0e0: 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 67 6f  ppen */.      go
e0f0: 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
e100: 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20  .    }.    .    
e110: 69 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20 20  if( failed ){.  
e120: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e130: 42 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65  BUSY;.    } else
e140: 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
e150: 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45  locktype = SHARE
e160: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20  D_LOCK;.    }.  
e170: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
e180: 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f  e request was fo
e190: 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
e1a0: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
e1b0: 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73   It is.    ** as
e1c0: 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65  sumed that there
e1d0: 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20   is a SHARED or 
e1e0: 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
e1f0: 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
e200: 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
e210: 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d      int failed =
e220: 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
e230: 30 21 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  0!=pFile->lockty
e240: 70 65 20 29 3b 0a 20 20 20 20 69 66 20 28 6c 6f  pe );.    if (lo
e250: 63 6b 74 79 70 65 20 3e 3d 20 52 45 53 45 52 56  cktype >= RESERV
e260: 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  ED_LOCK && pFile
e270: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3c 20 52 45 53  ->locktype < RES
e280: 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  ERVED_LOCK) {.  
e290: 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65        /* Acquire
e2a0: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
e2b0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c   */.        fail
e2c0: 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f  ed = _AFPFSSetLo
e2d0: 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65  ck(context->file
e2e0: 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  Path, pFile->h, 
e2f0: 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
e300: 2c 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ,1);.    }.    i
e310: 66 20 28 21 66 61 69 6c 65 64 20 26 26 20 6c 6f  f (!failed && lo
e320: 63 6b 74 79 70 65 20 3d 3d 20 45 58 43 4c 55 53  cktype == EXCLUS
e330: 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  IVE_LOCK) {.    
e340: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20    /* Acquire an 
e350: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a  EXCLUSIVE lock *
e360: 2f 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  /.        .     
e370: 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73   /* Remove the s
e380: 68 61 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72  hared lock befor
e390: 65 20 74 72 79 69 6e 67 20 74 68 65 20 72 61 6e  e trying the ran
e3a0: 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 20  ge.  we'll need 
e3b0: 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65  to .      ** ree
e3c0: 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
e3d0: 72 65 64 20 6c 6f 63 6b 20 69 66 20 77 65 20 63  red lock if we c
e3e0: 61 6e 27 74 20 67 65 74 20 74 68 65 20 20 61 66  an't get the  af
e3f0: 70 55 6e 69 78 55 6e 6c 6f 63 6b 0a 20 20 20 20  pUnixUnlock.    
e400: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 20 28 21    */.      if (!
e410: 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f  _AFPFSSetLock(co
e420: 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c  ntext->filePath,
e430: 20 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45   pFile->h, SHARE
e440: 44 5f 46 49 52 53 54 20 2b 0a 20 20 20 20 20 20  D_FIRST +.      
e450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e460: 20 20 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72     context->shar
e470: 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30  edLockByte, 1, 0
e480: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  )) {.        /* 
e490: 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74 6f 20  now attemmpt to 
e4a0: 67 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76  get the exclusiv
e4b0: 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a  e lock range */.
e4c0: 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d          failed =
e4d0: 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63   _AFPFSSetLock(c
e4e0: 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68  ontext->filePath
e4f0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52  , pFile->h, SHAR
e500: 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20 20  ED_FIRST, .     
e510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e520: 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
e530: 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20  _SIZE, 1);.     
e540: 20 20 20 69 66 20 28 66 61 69 6c 65 64 20 26 26     if (failed &&
e550: 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63   _AFPFSSetLock(c
e560: 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68  ontext->filePath
e570: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52  , pFile->h, SHAR
e580: 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20 20 20  ED_FIRST +.     
e590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
e5b0: 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f  ontext->sharedLo
e5c0: 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 29 20 7b  ckByte, 1, 1)) {
e5d0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
e5e0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
e5f0: 4f 43 4b 3b 20 2f 2a 20 74 68 69 73 20 73 68 6f  OCK; /* this sho
e600: 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e  uld never happen
e610: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
e620: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
e630: 20 20 20 20 20 2f 2a 20 2a 2f 0a 20 20 20 20 20       /* */.     
e640: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
e650: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 2f 2a 20  OERR_UNLOCK; /* 
e660: 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65  this should neve
e670: 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20  r happen */.    
e680: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
e690: 28 20 66 61 69 6c 65 64 20 26 26 20 72 63 20 3d  ( failed && rc =
e6a0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20  = SQLITE_OK){.  
e6b0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e6c0: 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BUSY;.    }.  }.
e6d0: 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c    .  if( rc==SQL
e6e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46  ITE_OK ){.    pF
e6f0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
e700: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c 73  locktype;.  }els
e710: 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d  e if( locktype==
e720: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
e730: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  {.    pFile->loc
e740: 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f  ktype = PENDING_
e750: 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70  LOCK;.  }.  .afp
e760: 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 20 20 6c  _end_lock:.    l
e770: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
e780: 53 54 52 41 43 45 34 28 22 4c 4f 43 4b 20 20 20  STRACE4("LOCK   
e790: 20 25 64 20 25 73 20 25 73 5c 6e 22 2c 20 70 46   %d %s %s\n", pF
e7a0: 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65  ile->h, locktype
e7b0: 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20  Name(locktype), 
e7c0: 0a 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51  .         rc==SQ
e7d0: 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
e7e0: 20 22 66 61 69 6c 65 64 22 29 3b 0a 20 20 72 65   "failed");.  re
e7f0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 20  turn rc;.}../*. 
e800: 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
e810: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
e820: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
e830: 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e  ile to locktype.
e840: 20 20 6c 6f 63 6b 74 79 70 65 0a 20 2a 2a 20 6d    locktype. ** m
e850: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
e860: 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
e870: 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66  LOCK.. **. ** If
e880: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
e890: 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
e8a0: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
e8b0: 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
e8c0: 0a 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  . ** the request
e8d0: 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
e8e0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
e8f0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73  s a no-op.. */.s
e900: 74 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e 69  tatic int afpUni
e910: 78 55 6e 6c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a  xUnlock(OsFile *
e920: 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
e930: 29 20 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  ) {.  struct flo
e940: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72  ck lock;.  int r
e950: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
e960: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
e970: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
e980: 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
e990: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
e9a0: 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
e9b0: 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
e9c0: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 20  ckingContext;.. 
e9d0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
e9e0: 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22 55 4e  ;.  OSTRACE5("UN
e9f0: 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
ea00: 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46  %d pid=%d\n", pF
ea10: 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65  ile->h, locktype
ea20: 2c 0a 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  ,.         pFile
ea30: 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 67 65 74 70  ->locktype, getp
ea40: 69 64 28 29 29 3b 0a 20 20 0a 20 20 61 73 73 65  id());.  .  asse
ea50: 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48  rt( locktype<=SH
ea60: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  ARED_LOCK );.  i
ea70: 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
ea80: 70 65 3c 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe<=locktype ){.
ea90: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
eaa0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
eab0: 43 48 45 43 4b 5f 54 48 52 45 41 44 49 44 28 70  CHECK_THREADID(p
eac0: 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74  File) ){.    ret
ead0: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
eae0: 45 3b 0a 20 20 7d 0a 20 20 65 6e 74 65 72 4d 75  E;.  }.  enterMu
eaf0: 74 65 78 28 29 3b 0a 20 20 69 66 28 20 70 46 69  tex();.  if( pFi
eb00: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41  le->locktype>SHA
eb10: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
eb20: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
eb30: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
eb40: 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20     int failed = 
eb50: 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 75 6e 6c  0;..      /* unl
eb60: 6f 63 6b 20 74 68 65 20 65 78 63 6c 75 73 69 76  ock the exclusiv
eb70: 65 20 72 61 6e 67 65 20 2d 20 74 68 65 6e 20 72  e range - then r
eb80: 65 2d 65 73 74 61 62 6c 69 73 68 20 74 68 65 20  e-establish the 
eb90: 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20  shared lock */. 
eba0: 20 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e       if (pFile->
ebb0: 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
ebc0: 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  IVE_LOCK) {.    
ebd0: 20 20 20 20 66 61 69 6c 65 64 20 3d 20 5f 41 46      failed = _AF
ebe0: 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  PFSSetLock(conte
ebf0: 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46  xt->filePath, pF
ec00: 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46  ile->h, SHARED_F
ec10: 49 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20  IRST, .         
ec20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec30: 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53          SHARED_S
ec40: 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  IZE, 0);.       
ec50: 20 69 66 20 28 21 66 61 69 6c 65 64 29 20 7b 0a   if (!failed) {.
ec60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 75 63            /* suc
ec70: 63 65 73 73 66 75 6c 6c 79 20 72 65 6d 6f 76 65  cessfully remove
ec80: 64 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  d the exclusive 
ec90: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
eca0: 20 20 69 66 20 28 5f 41 46 50 46 53 53 65 74 4c    if (_AFPFSSetL
ecb0: 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c  ock(context->fil
ecc0: 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c  ePath, pFile->h,
ecd0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 0a 20   SHARED_FIRST+. 
ece0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecf0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 65             conte
ed00: 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  xt->sharedLockBy
ed10: 74 65 2c 20 31 2c 20 31 29 29 20 7b 0a 20 20 20  te, 1, 1)) {.   
ed20: 20 20 20 20 20 20 20 20 20 2f 2a 20 66 61 69 6c           /* fail
ed30: 65 64 20 74 6f 20 72 65 2d 65 73 74 61 62 6c 69  ed to re-establi
ed40: 73 68 20 6f 75 72 20 73 68 61 72 65 64 20 6c 6f  sh our shared lo
ed50: 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ck */.          
ed60: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
ed70: 45 52 52 5f 52 44 4c 4f 43 4b 3b 20 2f 2a 20 54  ERR_RDLOCK; /* T
ed80: 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  his should never
ed90: 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20   happen */.     
eda0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
edb0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
edc0: 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64    /* This should
edd0: 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2d 20   never happen - 
ede0: 66 61 69 6c 65 64 20 74 6f 20 75 6e 6c 6f 63 6b  failed to unlock
edf0: 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 72   the exclusive r
ee00: 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  ange */.        
ee10: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
ee20: 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_UNLOCK;.    
ee30: 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a 20      } .      }. 
ee40: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72 63 20     }.    if (rc 
ee50: 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  == SQLITE_OK && 
ee60: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
ee70: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 20 7b  =PENDING_LOCK) {
ee80: 0a 20 20 20 20 20 20 69 66 20 28 5f 41 46 50 46  .      if (_AFPF
ee90: 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  SSetLock(context
eea0: 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c  ->filePath, pFil
eeb0: 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59  e->h, PENDING_BY
eec0: 54 45 2c 20 31 2c 20 30 29 29 7b 0a 20 20 20 20  TE, 1, 0)){.    
eed0: 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f      /* failed to
eee0: 20 72 65 6c 65 61 73 65 20 74 68 65 20 70 65 6e   release the pen
eef0: 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  ding lock */.   
ef00: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
ef10: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 2f  _IOERR_UNLOCK; /
ef20: 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65  * This should ne
ef30: 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20  ver happen */.  
ef40: 20 20 20 20 7d 0a 20 20 20 20 7d 20 0a 20 20 20      }.    } .   
ef50: 20 69 66 20 28 72 63 20 3d 3d 20 53 51 4c 49 54   if (rc == SQLIT
ef60: 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c  E_OK && pFile->l
ef70: 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56 45  ocktype>=RESERVE
ef80: 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20  D_LOCK) {.      
ef90: 69 66 20 28 5f 41 46 50 46 53 53 65 74 4c 6f 63  if (_AFPFSSetLoc
efa0: 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50  k(context->fileP
efb0: 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 52  ath, pFile->h, R
efc0: 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
efd0: 20 30 29 29 20 7b 0a 20 20 20 20 20 20 20 20 2f   0)) {.        /
efe0: 2a 20 66 61 69 6c 65 64 20 74 6f 20 72 65 6c 65  * failed to rele
eff0: 61 73 65 20 74 68 65 20 72 65 73 65 72 76 65 64  ase the reserved
f000: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20   lock */.       
f010: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
f020: 52 52 5f 55 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54  RR_UNLOCK;  /* T
f030: 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  his should never
f040: 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20   happen */.     
f050: 20 7d 0a 20 20 20 20 7d 20 0a 20 20 7d 0a 20 20   }.    } .  }.  
f060: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  if( locktype==NO
f070: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74  _LOCK ){.    int
f080: 20 66 61 69 6c 65 64 20 3d 20 5f 41 46 50 46 53   failed = _AFPFS
f090: 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
f0a0: 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65  >filePath, pFile
f0b0: 2d 3e 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ->h, .          
f0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0d0: 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53       SHARED_FIRS
f0e0: 54 20 2b 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61  T + context->sha
f0f0: 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20  redLockByte, 1, 
f100: 30 29 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c  0);.    if (fail
f110: 65 64 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  ed) {.      rc =
f120: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
f130: 4c 4f 43 4b 3b 20 20 2f 2a 20 54 68 69 73 20 73  LOCK;  /* This s
f140: 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70  hould never happ
f150: 65 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  en */.    }.  }.
f160: 20 20 69 66 20 28 72 63 20 3d 3d 20 53 51 4c 49    if (rc == SQLI
f170: 54 45 5f 4f 4b 29 0a 20 20 20 20 70 46 69 6c 65  TE_OK).    pFile
f180: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
f190: 6b 74 79 70 65 3b 0a 20 20 6c 65 61 76 65 4d 75  ktype;.  leaveMu
f1a0: 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20  tex();.  return 
f1b0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c  rc;.}../*. ** Cl
f1c0: 6f 73 65 20 61 20 66 69 6c 65 20 26 20 63 6c 65  ose a file & cle
f1d0: 61 6e 75 70 20 41 46 50 20 73 70 65 63 69 66 69  anup AFP specifi
f1e0: 63 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  c locking contex
f1f0: 74 20 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  t . */.static in
f200: 74 20 61 66 70 55 6e 69 78 43 6c 6f 73 65 28 4f  t afpUnixClose(O
f210: 73 46 69 6c 65 20 2a 2a 70 49 64 29 20 7b 0a 20  sFile **pId) {. 
f220: 20 75 6e 69 78 46 69 6c 65 20 2a 69 64 20 3d 20   unixFile *id = 
f230: 28 75 6e 69 78 46 69 6c 65 2a 29 2a 70 49 64 3b  (unixFile*)*pId;
f240: 0a 20 20 0a 20 20 69 66 28 20 21 69 64 20 29 20  .  .  if( !id ) 
f250: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f260: 3b 0a 20 20 61 66 70 55 6e 69 78 55 6e 6c 6f 63  ;.  afpUnixUnloc
f270: 6b 28 2a 70 49 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  k(*pId, NO_LOCK)
f280: 3b 0a 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20  ;.  /* free the 
f290: 41 46 50 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  AFP locking stru
f2a0: 63 74 75 72 65 20 2a 2f 0a 20 20 69 66 20 28 69  cture */.  if (i
f2b0: 64 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  d->lockingContex
f2c0: 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20  t != NULL) {.   
f2d0: 20 69 66 20 28 28 28 61 66 70 4c 6f 63 6b 69 6e   if (((afpLockin
f2e0: 67 43 6f 6e 74 65 78 74 20 2a 29 69 64 2d 3e 6c  gContext *)id->l
f2f0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e  ockingContext)->
f300: 66 69 6c 65 50 61 74 68 20 21 3d 20 4e 55 4c 4c  filePath != NULL
f310: 29 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ).      sqlite3_
f320: 66 72 65 65 28 28 28 61 66 70 4c 6f 63 6b 69 6e  free(((afpLockin
f330: 67 43 6f 6e 74 65 78 74 2a 29 69 64 2d 3e 6c 6f  gContext*)id->lo
f340: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 66  ckingContext)->f
f350: 69 6c 65 50 61 74 68 29 3b 0a 20 20 20 20 73 71  ilePath);.    sq
f360: 6c 69 74 65 33 5f 66 72 65 65 28 69 64 2d 3e 6c  lite3_free(id->l
f370: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a  ockingContext);.
f380: 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 69 64 2d    }.  .  if( id-
f390: 3e 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73  >dirfd>=0 ) clos
f3a0: 65 28 69 64 2d 3e 64 69 72 66 64 29 3b 0a 20 20  e(id->dirfd);.  
f3b0: 69 64 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a  id->dirfd = -1;.
f3c0: 20 20 63 6c 6f 73 65 28 69 64 2d 3e 68 29 3b 0a    close(id->h);.
f3d0: 20 20 69 64 2d 3e 69 73 4f 70 65 6e 20 3d 20 30    id->isOpen = 0
f3e0: 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22 43 4c  ;.  OSTRACE2("CL
f3f0: 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 69  OSE   %-3d\n", i
f400: 64 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e 43 6f 75  d->h);.  OpenCou
f410: 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69  nter(-1);.  sqli
f420: 74 65 33 5f 66 72 65 65 28 69 64 29 3b 0a 20 20  te3_free(id);.  
f430: 2a 70 49 64 20 3d 20 30 3b 0a 20 20 72 65 74 75  *pId = 0;.  retu
f440: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f450: 0a 0a 23 70 72 61 67 6d 61 20 6d 61 72 6b 20 66  ..#pragma mark f
f460: 6c 6f 63 6b 28 29 20 73 74 79 6c 65 20 6c 6f 63  lock() style loc
f470: 6b 69 6e 67 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 65  king../*. ** The
f480: 20 66 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e   flockLockingCon
f490: 74 65 78 74 20 69 73 20 6e 6f 74 20 75 73 65 64  text is not used
f4a0: 0a 20 2a 2f 0a 74 79 70 65 64 65 66 20 76 6f 69  . */.typedef voi
f4b0: 64 20 66 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  d flockLockingCo
f4c0: 6e 74 65 78 74 3b 0a 0a 73 74 61 74 69 63 20 69  ntext;..static i
f4d0: 6e 74 20 66 6c 6f 63 6b 55 6e 69 78 43 68 65 63  nt flockUnixChec
f4e0: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 4f 73  kReservedLock(Os
f4f0: 46 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 75 6e  File *id) {.  un
f500: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
f510: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
f520: 20 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c   .  if (pFile->l
f530: 6f 63 6b 74 79 70 65 20 3d 3d 20 52 45 53 45 52  ocktype == RESER
f540: 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  VED_LOCK) {.    
f550: 72 65 74 75 72 6e 20 31 3b 20 2f 2a 20 61 6c 72  return 1; /* alr
f560: 65 61 64 79 20 68 61 76 65 20 61 20 72 65 73 65  eady have a rese
f570: 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d  rved lock */.  }
f580: 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 61   else {.    /* a
f590: 74 74 65 6d 70 74 20 74 6f 20 67 65 74 20 74 68  ttempt to get th
f5a0: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e  e lock */.    in
f5b0: 74 20 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69  t rc = flock(pFi
f5c0: 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c  le->h, LOCK_EX |
f5d0: 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20 20 69   LOCK_NB);.    i
f5e0: 66 20 28 21 72 63 29 20 7b 0a 20 20 20 20 20 20  f (!rc) {.      
f5f0: 2f 2a 20 67 6f 74 20 74 68 65 20 6c 6f 63 6b 2c  /* got the lock,
f600: 20 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20 20   unlock it */.  
f610: 20 20 20 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d      flock(pFile-
f620: 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20  >h, LOCK_UN);.  
f630: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f      return 0;  /
f640: 2a 20 6e 6f 20 6f 6e 65 20 68 61 73 20 69 74 20  * no one has it 
f650: 72 65 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20  reserved */.    
f660: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20  }.    return 1; 
f670: 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  /* someone else 
f680: 6d 69 67 68 74 20 68 61 76 65 20 69 74 20 72 65  might have it re
f690: 73 65 72 76 65 64 20 2a 2f 0a 20 20 7d 0a 7d 0a  served */.  }.}.
f6a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
f6b0: 6b 55 6e 69 78 4c 6f 63 6b 28 4f 73 46 69 6c 65  kUnixLock(OsFile
f6c0: 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
f6d0: 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  pe) {.  unixFile
f6e0: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
f6f0: 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 2f 2a  ile*)id;.  .  /*
f700: 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68   if we already h
f710: 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69  ave a lock, it i
f720: 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20  s exclusive.  . 
f730: 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20   ** Just adjust 
f740: 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f  level and punt o
f750: 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f  n outta here. */
f760: 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f  .  if (pFile->lo
f770: 63 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b  cktype > NO_LOCK
f780: 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ) {.    pFile->l
f790: 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79  ocktype = lockty
f7a0: 70 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  pe;.    return S
f7b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
f7c0: 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78  .  /* grab an ex
f7d0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a  clusive lock */.
f7e0: 20 20 69 6e 74 20 72 63 20 3d 20 66 6c 6f 63 6b    int rc = flock
f7f0: 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
f800: 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20  EX | LOCK_NB);. 
f810: 20 69 66 20 28 72 63 29 20 7b 0a 20 20 20 20 2f   if (rc) {.    /
f820: 2a 20 64 69 64 6e 27 74 20 67 65 74 2c 20 6d 75  * didn't get, mu
f830: 73 74 20 62 65 20 62 75 73 79 20 2a 2f 0a 20 20  st be busy */.  
f840: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f850: 42 55 53 59 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  BUSY;.  } else {
f860: 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20  .    /* got it, 
f870: 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  set the type and
f880: 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20   return ok */.  
f890: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
f8a0: 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
f8b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f8c0: 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  OK;.  }.}..stati
f8d0: 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 69 78 55  c int flockUnixU
f8e0: 6e 6c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64  nlock(OsFile *id
f8f0: 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20  , int locktype) 
f900: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
f910: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
f920: 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  )id;.  .  assert
f930: 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52  ( locktype<=SHAR
f940: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
f950: 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73  /* no-op if poss
f960: 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46  ible */.  if( pF
f970: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c  ile->locktype==l
f980: 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
f990: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f9a0: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61  .  }.  .  /* sha
f9b0: 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20  red can just be 
f9c0: 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61  set because we a
f9d0: 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78  lways have an ex
f9e0: 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20  clusive */.  if 
f9f0: 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  (locktype==SHARE
fa00: 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  D_LOCK) {.    pF
fa10: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
fa20: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 72 65  locktype;.    re
fa30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
fa40: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20    }.  .  /* no, 
fa50: 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20  really, unlock. 
fa60: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 66 6c  */.  int rc = fl
fa70: 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f  ock(pFile->h, LO
fa80: 43 4b 5f 55 4e 29 3b 0a 20 20 69 66 20 28 72 63  CK_UN);.  if (rc
fa90: 29 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ).    return SQL
faa0: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
fab0: 3b 0a 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 70  ;.  else {.    p
fac0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
fad0: 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65   NO_LOCK;.    re
fae0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
faf0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c    }.}../*. ** Cl
fb00: 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a  ose a file.. */.
fb10: 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
fb20: 55 6e 69 78 43 6c 6f 73 65 28 4f 73 46 69 6c 65  UnixClose(OsFile
fb30: 20 2a 2a 70 49 64 29 20 7b 0a 20 20 75 6e 69 78   **pId) {.  unix
fb40: 46 69 6c 65 20 2a 69 64 20 3d 20 28 75 6e 69 78  File *id = (unix
fb50: 46 69 6c 65 2a 29 2a 70 49 64 3b 0a 20 20 0a 20  File*)*pId;.  . 
fb60: 20 69 66 28 20 21 69 64 20 29 20 72 65 74 75 72   if( !id ) retur
fb70: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66  n SQLITE_OK;.  f
fb80: 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b 28 2a  lockUnixUnlock(*
fb90: 70 49 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  pId, NO_LOCK);. 
fba0: 20 0a 20 20 69 66 28 20 69 64 2d 3e 64 69 72 66   .  if( id->dirf
fbb0: 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28 69 64 2d  d>=0 ) close(id-
fbc0: 3e 64 69 72 66 64 29 3b 0a 20 20 69 64 2d 3e 64  >dirfd);.  id->d
fbd0: 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 65 6e 74  irfd = -1;.  ent
fbe0: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 0a 20 20  erMutex();.  .  
fbf0: 63 6c 6f 73 65 28 69 64 2d 3e 68 29 3b 20 20 0a  close(id->h);  .
fc00: 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a    leaveMutex();.
fc10: 20 20 69 64 2d 3e 69 73 4f 70 65 6e 20 3d 20 30    id->isOpen = 0
fc20: 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22 43 4c  ;.  OSTRACE2("CL
fc30: 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 69  OSE   %-3d\n", i
fc40: 64 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e 43 6f 75  d->h);.  OpenCou
fc50: 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69  nter(-1);.  sqli
fc60: 74 65 33 5f 66 72 65 65 28 69 64 29 3b 0a 20 20  te3_free(id);.  
fc70: 2a 70 49 64 20 3d 20 30 3b 0a 20 20 72 65 74 75  *pId = 0;.  retu
fc80: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
fc90: 0a 23 70 72 61 67 6d 61 20 6d 61 72 6b 20 4f 6c  .#pragma mark Ol
fca0: 64 2d 53 63 68 6f 6f 6c 20 2e 6c 6f 63 6b 20 66  d-School .lock f
fcb0: 69 6c 65 20 62 61 73 65 64 20 6c 6f 63 6b 69 6e  ile based lockin
fcc0: 67 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 65 20 64 6f  g../*. ** The do
fcd0: 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
fce0: 65 78 74 20 73 74 72 75 63 74 75 72 65 20 63 6f  ext structure co
fcf0: 6e 74 61 69 6e 73 20 61 6c 6c 20 64 6f 74 6c 6f  ntains all dotlo
fd00: 63 6b 20 28 2e 6c 6f 63 6b 29 20 6c 6f 63 6b 0a  ck (.lock) lock.
fd10: 20 2a 2a 20 73 70 65 63 69 66 69 63 20 73 74 61   ** specific sta
fd20: 74 65 0a 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  te. */.typedef s
fd30: 74 72 75 63 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63  truct dotlockLoc
fd40: 6b 69 6e 67 43 6f 6e 74 65 78 74 20 64 6f 74 6c  kingContext dotl
fd50: 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
fd60: 74 3b 0a 73 74 72 75 63 74 20 64 6f 74 6c 6f 63  t;.struct dotloc
fd70: 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  kLockingContext 
fd80: 7b 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61  {.  char *lockPa
fd90: 74 68 3b 0a 7d 3b 0a 0a 0a 73 74 61 74 69 63 20  th;.};...static 
fda0: 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 43  int dotlockUnixC
fdb0: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
fdc0: 28 4f 73 46 69 6c 65 20 2a 69 64 29 20 7b 0a 20  (OsFile *id) {. 
fdd0: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
fde0: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
fdf0: 3b 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69  ;.  dotlockLocki
fe00: 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  ngContext *conte
fe10: 78 74 20 3d 20 0a 20 20 20 20 28 64 6f 74 6c 6f  xt = .    (dotlo
fe20: 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ckLockingContext
fe30: 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
fe40: 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20  ngContext;.  .  
fe50: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if (pFile->lockt
fe60: 79 70 65 20 3d 3d 20 52 45 53 45 52 56 45 44 5f  ype == RESERVED_
fe70: 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 72 65 74 75  LOCK) {.    retu
fe80: 72 6e 20 31 3b 20 2f 2a 20 61 6c 72 65 61 64 79  rn 1; /* already
fe90: 20 68 61 76 65 20 61 20 72 65 73 65 72 76 65 64   have a reserved
fea0: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 20 65 6c 73   lock */.  } els
feb0: 65 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73  e {.    struct s
fec0: 74 61 74 20 73 74 61 74 42 75 66 3b 0a 20 20 20  tat statBuf;.   
fed0: 20 69 66 20 28 6c 73 74 61 74 28 63 6f 6e 74 65   if (lstat(conte
fee0: 78 74 2d 3e 6c 6f 63 6b 50 61 74 68 2c 26 73 74  xt->lockPath,&st
fef0: 61 74 42 75 66 29 20 3d 3d 20 30 29 0a 20 20 20  atBuf) == 0).   
ff00: 20 20 20 2f 2a 20 66 69 6c 65 20 65 78 69 73 74     /* file exist
ff10: 73 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  s, someone else 
ff20: 68 61 73 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a  has the lock */.
ff30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
ff40: 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 2f      else.      /
ff50: 2a 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  * file does not 
ff60: 65 78 69 73 74 2c 20 77 65 20 63 6f 75 6c 64 20  exist, we could 
ff70: 68 61 76 65 20 69 74 20 69 66 20 77 65 20 77 61  have it if we wa
ff80: 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72  nt it */.      r
ff90: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 0;.  }.}..
ffa0: 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
ffb0: 63 6b 55 6e 69 78 4c 6f 63 6b 28 4f 73 46 69 6c  ckUnixLock(OsFil
ffc0: 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
ffd0: 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ype) {.  unixFil
ffe0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
fff0: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 64 6f 74 6c  File*)id;.  dotl
10000 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
10010 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 0a 20 20  t *context = .  
10020 20 20 28 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e    (dotlockLockin
10030 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c  gContext *) pFil
10040 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
10050 74 3b 0a 20 20 0a 20 20 2f 2a 20 69 66 20 77 65  t;.  .  /* if we
10060 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
10070 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c  lock, it is excl
10080 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75  usive.  .  ** Ju
10090 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20  st adjust level 
100a0 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74  and punt on outt
100b0 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20  a here. */.  if 
100c0 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  (pFile->locktype
100d0 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20   > NO_LOCK) {.  
100e0 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
100f0 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
10100 20 20 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73    .    /* Always
10110 20 75 70 64 61 74 65 20 74 68 65 20 74 69 6d 65   update the time
10120 73 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64  stamp on the old
10130 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 75 74 69   file */.    uti
10140 6d 65 73 28 63 6f 6e 74 65 78 74 2d 3e 6c 6f 63  mes(context->loc
10150 6b 50 61 74 68 2c 4e 55 4c 4c 29 3b 0a 20 20 20  kPath,NULL);.   
10160 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10170 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 63  K;.  }.  .  /* c
10180 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 6c  heck to see if l
10190 6f 63 6b 20 66 69 6c 65 20 61 6c 72 65 61 64 79  ock file already
101a0 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 73 74 72   exists */.  str
101b0 75 63 74 20 73 74 61 74 20 73 74 61 74 42 75 66  uct stat statBuf
101c0 3b 0a 20 20 69 66 20 28 6c 73 74 61 74 28 63 6f  ;.  if (lstat(co
101d0 6e 74 65 78 74 2d 3e 6c 6f 63 6b 50 61 74 68 2c  ntext->lockPath,
101e0 26 73 74 61 74 42 75 66 29 20 3d 3d 20 30 29 7b  &statBuf) == 0){
101f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
10200 54 45 5f 42 55 53 59 3b 20 2f 2a 20 69 74 20 64  TE_BUSY; /* it d
10210 6f 65 73 2c 20 62 75 73 79 20 2a 2f 0a 20 20 7d  oes, busy */.  }
10220 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e  .  .  /* grab an
10230 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
10240 2a 2f 0a 20 20 69 6e 74 20 66 64 20 3d 20 6f 70  */.  int fd = op
10250 65 6e 28 63 6f 6e 74 65 78 74 2d 3e 6c 6f 63 6b  en(context->lock
10260 50 61 74 68 2c 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f  Path,O_RDONLY|O_
10270 43 52 45 41 54 7c 4f 5f 45 58 43 4c 2c 30 36 30  CREAT|O_EXCL,060
10280 30 29 3b 0a 20 20 69 66 20 28 66 64 20 3c 20 30  0);.  if (fd < 0
10290 29 20 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65  ) {.    /* faile
102a0 64 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65  d to open/create
102b0 20 74 68 65 20 66 69 6c 65 2c 20 73 6f 6d 65 6f   the file, someo
102c0 6e 65 20 65 6c 73 65 20 6d 61 79 20 68 61 76 65  ne else may have
102d0 20 73 74 6f 6c 65 6e 20 74 68 65 20 6c 6f 63 6b   stolen the lock
102e0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
102f0 51 4c 49 54 45 5f 42 55 53 59 3b 20 0a 20 20 7d  QLITE_BUSY; .  }
10300 0a 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20  .  close(fd);.  
10310 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65  .  /* got it, se
10320 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
10330 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46  eturn ok */.  pF
10340 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
10350 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75  locktype;.  retu
10360 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
10370 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
10380 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b 28 4f 73  ockUnixUnlock(Os
10390 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  File *id, int lo
103a0 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78  cktype) {.  unix
103b0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
103c0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 64  nixFile*)id;.  d
103d0 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e  otlockLockingCon
103e0 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20  text *context = 
103f0 0a 20 20 20 20 28 64 6f 74 6c 6f 63 6b 4c 6f 63  .    (dotlockLoc
10400 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70  kingContext *) p
10410 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
10420 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65 72  text;.  .  asser
10430 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41  t( locktype<=SHA
10440 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
10450 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
10460 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
10470 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
10480 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
10490 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
104a0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68  ;.  }.  .  /* sh
104b0 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65  ared can just be
104c0 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20   set because we 
104d0 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65  always have an e
104e0 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66  xclusive */.  if
104f0 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52   (locktype==SHAR
10500 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70  ED_LOCK) {.    p
10510 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
10520 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 72   locktype;.    r
10530 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10540 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c  .  }.  .  /* no,
10550 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e   really, unlock.
10560 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 28 63 6f 6e   */.  unlink(con
10570 74 65 78 74 2d 3e 6c 6f 63 6b 50 61 74 68 29 3b  text->lockPath);
10580 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  .  pFile->lockty
10590 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  pe = NO_LOCK;.  
105a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
105b0 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73  ;.}../*. ** Clos
105c0 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74  e a file.. */.st
105d0 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
105e0 55 6e 69 78 43 6c 6f 73 65 28 4f 73 46 69 6c 65  UnixClose(OsFile
105f0 20 2a 2a 70 49 64 29 20 7b 0a 20 20 75 6e 69 78   **pId) {.  unix
10600 46 69 6c 65 20 2a 69 64 20 3d 20 28 75 6e 69 78  File *id = (unix
10610 46 69 6c 65 2a 29 2a 70 49 64 3b 0a 20 20 0a 20  File*)*pId;.  . 
10620 20 69 66 28 20 21 69 64 20 29 20 72 65 74 75 72   if( !id ) retur
10630 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 64  n SQLITE_OK;.  d
10640 6f 74 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b  otlockUnixUnlock
10650 28 2a 70 49 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  (*pId, NO_LOCK);
10660 0a 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 64  .  /* free the d
10670 6f 74 6c 6f 63 6b 20 6c 6f 63 6b 69 6e 67 20 73  otlock locking s
10680 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 66  tructure */.  if
10690 20 28 69 64 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e   (id->lockingCon
106a0 74 65 78 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  text != NULL) {.
106b0 20 20 20 20 69 66 20 28 28 28 64 6f 74 6c 6f 63      if (((dotloc
106c0 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  kLockingContext 
106d0 2a 29 69 64 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  *)id->lockingCon
106e0 74 65 78 74 29 2d 3e 6c 6f 63 6b 50 61 74 68 20  text)->lockPath 
106f0 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 73  != NULL).      s
10700 71 6c 69 74 65 33 5f 66 72 65 65 28 20 28 20 28  qlite3_free( ( (
10710 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  dotlockLockingCo
10720 6e 74 65 78 74 20 2a 29 0a 20 20 20 20 20 20 20  ntext *).       
10730 20 69 64 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74   id->lockingCont
10740 65 78 74 29 2d 3e 6c 6f 63 6b 50 61 74 68 29 3b  ext)->lockPath);
10750 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
10760 65 28 69 64 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  e(id->lockingCon
10770 74 65 78 74 29 3b 0a 20 20 7d 0a 20 20 0a 20 20  text);.  }.  .  
10780 69 66 28 20 69 64 2d 3e 64 69 72 66 64 3e 3d 30  if( id->dirfd>=0
10790 20 29 20 63 6c 6f 73 65 28 69 64 2d 3e 64 69 72   ) close(id->dir
107a0 66 64 29 3b 0a 20 20 69 64 2d 3e 64 69 72 66 64  fd);.  id->dirfd
107b0 20 3d 20 2d 31 3b 0a 20 20 65 6e 74 65 72 4d 75   = -1;.  enterMu
107c0 74 65 78 28 29 3b 0a 20 20 0a 20 20 63 6c 6f 73  tex();.  .  clos
107d0 65 28 69 64 2d 3e 68 29 3b 0a 20 20 0a 20 20 6c  e(id->h);.  .  l
107e0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69  eaveMutex();.  i
107f0 64 2d 3e 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20  d->isOpen = 0;. 
10800 20 4f 53 54 52 41 43 45 32 28 22 43 4c 4f 53 45   OSTRACE2("CLOSE
10810 20 20 20 25 2d 33 64 5c 6e 22 2c 20 69 64 2d 3e     %-3d\n", id->
10820 68 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65  h);.  OpenCounte
10830 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  r(-1);.  sqlite3
10840 5f 66 72 65 65 28 69 64 29 3b 0a 20 20 2a 70 49  _free(id);.  *pI
10850 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  d = 0;.  return 
10860 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23  SQLITE_OK;.}...#
10870 70 72 61 67 6d 61 20 6d 61 72 6b 20 4e 6f 20 6c  pragma mark No l
10880 6f 63 6b 69 6e 67 0a 0a 2f 2a 0a 20 2a 2a 20 54  ocking../*. ** T
10890 68 65 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  he nolockLocking
108a0 43 6f 6e 74 65 78 74 20 69 73 20 76 6f 69 64 0a  Context is void.
108b0 20 2a 2f 0a 74 79 70 65 64 65 66 20 76 6f 69 64   */.typedef void
108c0 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f   nolockLockingCo
108d0 6e 74 65 78 74 3b 0a 0a 73 74 61 74 69 63 20 69  ntext;..static i
108e0 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 69 78 43 68 65  nt nolockUnixChe
108f0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 4f  ckReservedLock(O
10900 73 46 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 72  sFile *id) {.  r
10910 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74  eturn 0;.}..stat
10920 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 69  ic int nolockUni
10930 78 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64  xLock(OsFile *id
10940 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20  , int locktype) 
10950 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  {.  return SQLIT
10960 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  E_OK;.}..static 
10970 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 69 78 55 6e  int nolockUnixUn
10980 6c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c  lock(OsFile *id,
10990 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b   int locktype) {
109a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
109b0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43  _OK;.}../*. ** C
109c0 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f  lose a file.. */
109d0 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
109e0 63 6b 55 6e 69 78 43 6c 6f 73 65 28 4f 73 46 69  ckUnixClose(OsFi
109f0 6c 65 20 2a 2a 70 49 64 29 20 7b 0a 20 20 75 6e  le **pId) {.  un
10a00 69 78 46 69 6c 65 20 2a 69 64 20 3d 20 28 75 6e  ixFile *id = (un
10a10 69 78 46 69 6c 65 2a 29 2a 70 49 64 3b 0a 20 20  ixFile*)*pId;.  
10a20 0a 20 20 69 66 28 20 21 69 64 20 29 20 72 65 74  .  if( !id ) ret
10a30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
10a40 20 69 66 28 20 69 64 2d 3e 64 69 72 66 64 3e 3d   if( id->dirfd>=
10a50 30 20 29 20 63 6c 6f 73 65 28 69 64 2d 3e 64 69  0 ) close(id->di
10a60 72 66 64 29 3b 0a 20 20 69 64 2d 3e 64 69 72 66  rfd);.  id->dirf
10a70 64 20 3d 20 2d 31 3b 0a 20 20 65 6e 74 65 72 4d  d = -1;.  enterM
10a80 75 74 65 78 28 29 3b 0a 20 20 0a 20 20 63 6c 6f  utex();.  .  clo
10a90 73 65 28 69 64 2d 3e 68 29 3b 0a 20 20 0a 20 20  se(id->h);.  .  
10aa0 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  leaveMutex();.  
10ab0 69 64 2d 3e 69 73 4f 70 65 6e 20 3d 20 30 3b 0a  id->isOpen = 0;.
10ac0 20 20 4f 53 54 52 41 43 45 32 28 22 43 4c 4f 53    OSTRACE2("CLOS
10ad0 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 69 64 2d  E   %-3d\n", id-
10ae0 3e 68 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74  >h);.  OpenCount
10af0 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65  er(-1);.  sqlite
10b00 33 5f 66 72 65 65 28 69 64 29 3b 0a 20 20 2a 70  3_free(id);.  *p
10b10 49 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  Id = 0;.  return
10b20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
10b30 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
10b40 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
10b50 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  TYLE */../*.** C
10b60 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
10b70 6f 66 20 74 68 65 20 66 75 6c 6c 73 79 6e 63 20  of the fullsync 
10b80 66 6c 61 67 20 69 6e 20 74 68 65 20 67 69 76 65  flag in the give
10b90 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
10ba0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
10bb0 64 20 75 6e 69 78 53 65 74 46 75 6c 6c 53 79 6e  d unixSetFullSyn
10bc0 63 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e  c(OsFile *id, in
10bd0 74 20 76 29 7b 0a 20 20 28 28 75 6e 69 78 46 69  t v){.  ((unixFi
10be0 6c 65 2a 29 69 64 29 2d 3e 66 75 6c 6c 53 79 6e  le*)id)->fullSyn
10bf0 63 20 3d 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c = v;.}../*.** 
10c00 52 65 74 75 72 6e 20 74 68 65 20 75 6e 64 65 72  Return the under
10c10 6c 79 69 6e 67 20 66 69 6c 65 20 68 61 6e 64 6c  lying file handl
10c20 65 20 66 6f 72 20 61 6e 20 4f 73 46 69 6c 65 0a  e for an OsFile.
10c30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
10c40 69 78 46 69 6c 65 48 61 6e 64 6c 65 28 4f 73 46  ixFileHandle(OsF
10c50 69 6c 65 20 2a 69 64 29 7b 0a 20 20 72 65 74 75  ile *id){.  retu
10c60 72 6e 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  rn ((unixFile*)i
10c70 64 29 2d 3e 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  d)->h;.}../*.** 
10c80 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
10c90 72 20 74 68 61 74 20 69 6e 64 69 63 65 73 20 74  r that indices t
10ca0 68 65 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20  he type of lock 
10cb0 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 0a 2a  currently held.*
10cc0 2a 20 62 79 20 74 68 69 73 20 68 61 6e 64 6c 65  * by this handle
10cd0 2e 20 20 28 55 73 65 64 20 66 6f 72 20 74 65 73  .  (Used for tes
10ce0 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
10cf0 73 20 6f 6e 6c 79 2e 29 0a 2a 2f 0a 73 74 61 74  s only.).*/.stat
10d00 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 53  ic int unixLockS
10d10 74 61 74 65 28 4f 73 46 69 6c 65 20 2a 69 64 29  tate(OsFile *id)
10d20 7b 0a 20 20 72 65 74 75 72 6e 20 28 28 75 6e 69  {.  return ((uni
10d30 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 6f 63 6b  xFile*)id)->lock
10d40 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  type;.}../*.** R
10d50 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72  eturn the sector
10d60 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
10d70 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
10d80 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f   block device fo
10d90 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69  r.** the specifi
10da0 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  ed file. This is
10db0 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35   almost always 5
10dc0 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61  12 bytes, but ma
10dd0 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66  y be.** larger f
10de0 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e  or some devices.
10df0 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f  .**.** SQLite co
10e00 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20  de assumes this 
10e10 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  function cannot 
10e20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73  fail. It also as
10e30 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66  sumes that.** if
10e40 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63   two files are c
10e50 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61  reated in the sa
10e60 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  me file-system d
10e70 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a  irectory (i.e..*
10e80 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64  * a database and
10e90 20 69 74 27 73 20 6a 6f 75 72 6e 61 6c 20 66 69   it's journal fi
10ea0 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63  le) that the sec
10eb0 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  tor size will be
10ec0 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72   the.** same for
10ed0 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63   both..*/.static
10ee0 20 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53   int unixSectorS
10ef0 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
10f00 20 2a 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20   *id){.  return 
10f10 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
10f20 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 73  ECTOR_SIZE;.}..s
10f30 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65  tatic int unixDe
10f40 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
10f50 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ics(sqlite3_file
10f60 20 2a 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20   *id){.  return 
10f70 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  0;.}..static int
10f80 20 75 6e 69 78 42 72 65 61 6b 4c 6f 63 6b 28 73   unixBreakLock(s
10f90 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
10fa0 7b 0a 20 20 61 73 73 65 72 74 28 21 22 54 4f 44  {.  assert(!"TOD
10fb0 4f 3a 20 75 6e 69 78 42 72 65 61 6b 4c 6f 63 6b  O: unixBreakLock
10fc0 28 29 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ()");.  return 0
10fd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
10fe0 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61  vector defines a
10ff0 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74  ll the methods t
11000 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20  hat can operate 
11010 6f 6e 20 61 6e 20 4f 73 46 69 6c 65 0a 2a 2a 20  on an OsFile.** 
11020 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f 0a 73 74 61  for unix..*/.sta
11030 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
11040 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 73 71 6c  3_io_methods sql
11050 69 74 65 33 55 6e 69 78 49 6f 4d 65 74 68 6f 64  ite3UnixIoMethod
11060 20 3d 20 7b 0a 20 20 31 2c 20 20 20 20 20 20 20   = {.  1,       
11070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11080 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
11090 20 20 75 6e 69 78 43 6c 6f 73 65 2c 0a 20 20 75    unixClose,.  u
110a0 6e 69 78 52 65 61 64 2c 0a 20 20 75 6e 69 78 57  nixRead,.  unixW
110b0 72 69 74 65 2c 0a 20 20 75 6e 69 78 54 72 75 6e  rite,.  unixTrun
110c0 63 61 74 65 2c 0a 20 20 75 6e 69 78 53 79 6e 63  cate,.  unixSync
110d0 2c 0a 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65  ,.  unixFileSize
110e0 2c 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 0a 20 20  ,.  unixLock,.  
110f0 75 6e 69 78 55 6e 6c 6f 63 6b 2c 0a 20 20 75 6e  unixUnlock,.  un
11100 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
11110 6f 63 6b 2c 0a 20 20 75 6e 69 78 42 72 65 61 6b  ock,.  unixBreak
11120 4c 6f 63 6b 2c 0a 20 20 75 6e 69 78 53 65 63 74  Lock,.  unixSect
11130 6f 72 53 69 7a 65 2c 0a 20 20 75 6e 69 78 44 65  orSize,.  unixDe
11140 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
11150 69 63 73 0a 7d 3b 0a 0a 23 69 66 64 65 66 20 53  ics.};..#ifdef S
11160 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
11170 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a  KING_STYLE./*. *
11180 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20 64 65  * This vector de
11190 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65  fines all the me
111a0 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f  thods that can o
111b0 70 65 72 61 74 65 20 6f 6e 20 61 6e 20 4f 73 46  perate on an OsF
111c0 69 6c 65 0a 20 2a 2a 20 66 6f 72 20 75 6e 69 78  ile. ** for unix
111d0 20 77 69 74 68 20 41 46 50 20 73 74 79 6c 65 20   with AFP style 
111e0 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 20 2a  file locking.. *
111f0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 49  /.static const I
11200 6f 4d 65 74 68 6f 64 20 73 71 6c 69 74 65 33 41  oMethod sqlite3A
11210 46 50 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d  FPLockingUnixIoM
11220 65 74 68 6f 64 20 3d 20 7b 0a 20 20 20 20 61 66  ethod = {.    af
11230 70 55 6e 69 78 43 6c 6f 73 65 2c 0a 20 20 20 20  pUnixClose,.    
11240 75 6e 69 78 4f 70 65 6e 44 69 72 65 63 74 6f 72  unixOpenDirector
11250 79 2c 0a 20 20 20 20 75 6e 69 78 52 65 61 64 2c  y,.    unixRead,
11260 0a 20 20 20 20 75 6e 69 78 57 72 69 74 65 2c 0a  .    unixWrite,.
11270 20 20 20 20 75 6e 69 78 53 65 65 6b 2c 0a 20 20      unixSeek,.  
11280 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 0a    unixTruncate,.
11290 20 20 20 20 75 6e 69 78 53 79 6e 63 2c 0a 20 20      unixSync,.  
112a0 20 20 75 6e 69 78 53 65 74 46 75 6c 6c 53 79 6e    unixSetFullSyn
112b0 63 2c 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 48  c,.    unixFileH
112c0 61 6e 64 6c 65 2c 0a 20 20 20 20 75 6e 69 78 46  andle,.    unixF
112d0 69 6c 65 53 69 7a 65 2c 0a 20 20 20 20 61 66 70  ileSize,.    afp
112e0 55 6e 69 78 4c 6f 63 6b 2c 0a 20 20 20 20 61 66  UnixLock,.    af
112f0 70 55 6e 69 78 55 6e 6c 6f 63 6b 2c 0a 20 20 20  pUnixUnlock,.   
11300 20 75 6e 69 78 4c 6f 63 6b 53 74 61 74 65 2c 0a   unixLockState,.
11310 20 20 20 20 61 66 70 55 6e 69 78 43 68 65 63 6b      afpUnixCheck
11320 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 20 20  ReservedLock,.  
11330 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65    unixSectorSize
11340 2c 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 69  ,.};../*. ** Thi
11350 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73  s vector defines
11360 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73   all the methods
11370 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74   that can operat
11380 65 20 6f 6e 20 61 6e 20 4f 73 46 69 6c 65 0a 20  e on an OsFile. 
11390 2a 2a 20 66 6f 72 20 75 6e 69 78 20 77 69 74 68  ** for unix with
113a0 20 66 6c 6f 63 6b 28 29 20 73 74 79 6c 65 20 66   flock() style f
113b0 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 20 2a 2f  ile locking.. */
113c0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 49 6f  .static const Io
113d0 4d 65 74 68 6f 64 20 73 71 6c 69 74 65 33 46 6c  Method sqlite3Fl
113e0 6f 63 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f  ockLockingUnixIo
113f0 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20 20 20 66  Method = {.    f
11400 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73 65 2c 0a 20  lockUnixClose,. 
11410 20 20 20 75 6e 69 78 4f 70 65 6e 44 69 72 65 63     unixOpenDirec
11420 74 6f 72 79 2c 0a 20 20 20 20 75 6e 69 78 52 65  tory,.    unixRe
11430 61 64 2c 0a 20 20 20 20 75 6e 69 78 57 72 69 74  ad,.    unixWrit
11440 65 2c 0a 20 20 20 20 75 6e 69 78 53 65 65 6b 2c  e,.    unixSeek,
11450 0a 20 20 20 20 75 6e 69 78 54 72 75 6e 63 61 74  .    unixTruncat
11460 65 2c 0a 20 20 20 20 75 6e 69 78 53 79 6e 63 2c  e,.    unixSync,
11470 0a 20 20 20 20 75 6e 69 78 53 65 74 46 75 6c 6c  .    unixSetFull
11480 53 79 6e 63 2c 0a 20 20 20 20 75 6e 69 78 46 69  Sync,.    unixFi
11490 6c 65 48 61 6e 64 6c 65 2c 0a 20 20 20 20 75 6e  leHandle,.    un
114a0 69 78 46 69 6c 65 53 69 7a 65 2c 0a 20 20 20 20  ixFileSize,.    
114b0 66 6c 6f 63 6b 55 6e 69 78 4c 6f 63 6b 2c 0a 20  flockUnixLock,. 
114c0 20 20 20 66 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f     flockUnixUnlo
114d0 63 6b 2c 0a 20 20 20 20 75 6e 69 78 4c 6f 63 6b  ck,.    unixLock
114e0 53 74 61 74 65 2c 0a 20 20 20 20 66 6c 6f 63 6b  State,.    flock
114f0 55 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  UnixCheckReserve
11500 64 4c 6f 63 6b 2c 0a 20 20 20 20 75 6e 69 78 53  dLock,.    unixS
11510 65 63 74 6f 72 53 69 7a 65 2c 0a 7d 3b 0a 0a 2f  ectorSize,.};../
11520 2a 0a 20 2a 2a 20 54 68 69 73 20 76 65 63 74 6f  *. ** This vecto
11530 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68  r defines all th
11540 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63  e methods that c
11550 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e  an operate on an
11560 20 4f 73 46 69 6c 65 0a 20 2a 2a 20 66 6f 72 20   OsFile. ** for 
11570 75 6e 69 78 20 77 69 74 68 20 64 6f 74 6c 6f 63  unix with dotloc
11580 6b 20 73 74 79 6c 65 20 66 69 6c 65 20 6c 6f 63  k style file loc
11590 6b 69 6e 67 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  king.. */.static
115a0 20 63 6f 6e 73 74 20 49 6f 4d 65 74 68 6f 64 20   const IoMethod 
115b0 73 71 6c 69 74 65 33 44 6f 74 6c 6f 63 6b 4c 6f  sqlite3DotlockLo
115c0 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f  ckingUnixIoMetho
115d0 64 20 3d 20 7b 0a 20 20 20 20 64 6f 74 6c 6f 63  d = {.    dotloc
115e0 6b 55 6e 69 78 43 6c 6f 73 65 2c 0a 20 20 20 20  kUnixClose,.    
115f0 75 6e 69 78 4f 70 65 6e 44 69 72 65 63 74 6f 72  unixOpenDirector
11600 79 2c 0a 20 20 20 20 75 6e 69 78 52 65 61 64 2c  y,.    unixRead,
11610 0a 20 20 20 20 75 6e 69 78 57 72 69 74 65 2c 0a  .    unixWrite,.
11620 20 20 20 20 75 6e 69 78 53 65 65 6b 2c 0a 20 20      unixSeek,.  
11630 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 0a    unixTruncate,.
11640 20 20 20 20 75 6e 69 78 53 79 6e 63 2c 0a 20 20      unixSync,.  
11650 20 20 75 6e 69 78 53 65 74 46 75 6c 6c 53 79 6e    unixSetFullSyn
11660 63 2c 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 48  c,.    unixFileH
11670 61 6e 64 6c 65 2c 0a 20 20 20 20 75 6e 69 78 46  andle,.    unixF
11680 69 6c 65 53 69 7a 65 2c 0a 20 20 20 20 64 6f 74  ileSize,.    dot
11690 6c 6f 63 6b 55 6e 69 78 4c 6f 63 6b 2c 0a 20 20  lockUnixLock,.  
116a0 20 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 55 6e 6c    dotlockUnixUnl
116b0 6f 63 6b 2c 0a 20 20 20 20 75 6e 69 78 4c 6f 63  ock,.    unixLoc
116c0 6b 53 74 61 74 65 2c 0a 20 20 20 20 64 6f 74 6c  kState,.    dotl
116d0 6f 63 6b 55 6e 69 78 43 68 65 63 6b 52 65 73 65  ockUnixCheckRese
116e0 72 76 65 64 4c 6f 63 6b 2c 0a 20 20 20 20 75 6e  rvedLock,.    un
116f0 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 0a 7d 3b  ixSectorSize,.};
11700 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 69 73 20 76 65  ../*. ** This ve
11710 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c  ctor defines all
11720 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61   the methods tha
11730 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e  t can operate on
11740 20 61 6e 20 4f 73 46 69 6c 65 0a 20 2a 2a 20 66   an OsFile. ** f
11750 6f 72 20 75 6e 69 78 20 77 69 74 68 20 64 6f 74  or unix with dot
11760 6c 6f 63 6b 20 73 74 79 6c 65 20 66 69 6c 65 20  lock style file 
11770 6c 6f 63 6b 69 6e 67 2e 0a 20 2a 2f 0a 73 74 61  locking.. */.sta
11780 74 69 63 20 63 6f 6e 73 74 20 49 6f 4d 65 74 68  tic const IoMeth
11790 6f 64 20 73 71 6c 69 74 65 33 4e 6f 6c 6f 63 6b  od sqlite3Nolock
117a0 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74  LockingUnixIoMet
117b0 68 6f 64 20 3d 20 7b 0a 20 20 6e 6f 6c 6f 63 6b  hod = {.  nolock
117c0 55 6e 69 78 43 6c 6f 73 65 2c 0a 20 20 75 6e 69  UnixClose,.  uni
117d0 78 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 2c 0a  xOpenDirectory,.
117e0 20 20 75 6e 69 78 52 65 61 64 2c 0a 20 20 75 6e    unixRead,.  un
117f0 69 78 57 72 69 74 65 2c 0a 20 20 75 6e 69 78 53  ixWrite,.  unixS
11800 65 65 6b 2c 0a 20 20 75 6e 69 78 54 72 75 6e 63  eek,.  unixTrunc
11810 61 74 65 2c 0a 20 20 75 6e 69 78 53 79 6e 63 2c  ate,.  unixSync,
11820 0a 20 20 75 6e 69 78 53 65 74 46 75 6c 6c 53 79  .  unixSetFullSy
11830 6e 63 2c 0a 20 20 75 6e 69 78 46 69 6c 65 48 61  nc,.  unixFileHa
11840 6e 64 6c 65 2c 0a 20 20 75 6e 69 78 46 69 6c 65  ndle,.  unixFile
11850 53 69 7a 65 2c 0a 20 20 6e 6f 6c 6f 63 6b 55 6e  Size,.  nolockUn
11860 69 78 4c 6f 63 6b 2c 0a 20 20 6e 6f 6c 6f 63 6b  ixLock,.  nolock
11870 55 6e 69 78 55 6e 6c 6f 63 6b 2c 0a 20 20 75 6e  UnixUnlock,.  un
11880 69 78 4c 6f 63 6b 53 74 61 74 65 2c 0a 20 20 6e  ixLockState,.  n
11890 6f 6c 6f 63 6b 55 6e 69 78 43 68 65 63 6b 52 65  olockUnixCheckRe
118a0 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 20 20 75 6e  servedLock,.  un
118b0 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 0a 7d 3b  ixSectorSize,.};
118c0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
118d0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
118e0 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  G_STYLE */../*.*
118f0 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  * Allocate memor
11900 79 20 66 6f 72 20 61 20 6e 65 77 20 75 6e 69 78  y for a new unix
11910 46 69 6c 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  File and initial
11920 69 7a 65 20 74 68 61 74 20 75 6e 69 78 46 69 6c  ize that unixFil
11930 65 2e 0a 2a 2a 20 57 72 69 74 65 20 61 20 70 6f  e..** Write a po
11940 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77  inter to the new
11950 20 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20 2a   unixFile into *
11960 70 49 64 2e 0a 2a 2a 20 49 66 20 77 65 20 72 75  pId..** If we ru
11970 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2c  n out of memory,
11980 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
11990 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65 72  and return an er
119a0 72 6f 72 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ror..*/.#ifdef S
119b0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
119c0 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 20  KING_STYLE./* . 
119d0 2a 2a 20 57 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ** When locking 
119e0 65 78 74 65 6e 73 69 6f 6e 73 20 61 72 65 20 65  extensions are e
119f0 6e 61 62 6c 65 64 2c 20 74 68 65 20 66 69 6c 65  nabled, the file
11a00 70 61 74 68 20 61 6e 64 20 6c 6f 63 6b 69 6e 67  path and locking
11a10 20 73 74 79 6c 65 20 0a 20 2a 2a 20 61 72 65 20   style . ** are 
11a20 6e 65 65 64 65 64 20 74 6f 20 64 65 74 65 72 6d  needed to determ
11a30 69 6e 65 20 74 68 65 20 75 6e 69 78 46 69 6c 65  ine the unixFile
11a40 20 70 4d 65 74 68 6f 64 20 74 6f 20 75 73 65 20   pMethod to use 
11a50 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72  for locking oper
11a60 61 74 69 6f 6e 73 2e 0a 20 2a 2a 20 54 68 65 20  ations.. ** The 
11a70 6c 6f 63 6b 69 6e 67 2d 73 74 79 6c 65 20 73 70  locking-style sp
11a80 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 43 6f  ecific lockingCo
11a90 6e 74 65 78 74 20 64 61 74 61 20 73 74 72 75 63  ntext data struc
11aa0 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20  ture is created 
11ab0 0a 20 2a 2a 20 61 6e 64 20 61 73 73 69 67 6e 65  . ** and assigne
11ac0 64 20 68 65 72 65 20 61 6c 73 6f 2e 0a 20 2a 2f  d here also.. */
11ad0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
11ae0 63 61 74 65 55 6e 69 78 46 69 6c 65 28 0a 20 20  cateUnixFile(.  
11af0 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20  int h,          
11b00 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
11b10 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
11b20 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  of file being op
11b30 65 6e 65 64 20 2a 2f 0a 20 20 4f 73 46 69 6c 65  ened */.  OsFile
11b40 20 2a 2a 70 49 64 2c 20 20 20 20 20 20 20 20 20   **pId,         
11b50 20 20 2f 2a 20 57 72 69 74 65 20 63 6f 6d 70 6c    /* Write compl
11b60 65 74 65 64 20 69 6e 69 74 69 61 6c 69 7a 61 74  eted initializat
11b70 69 6f 6e 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ion here */.  co
11b80 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
11b90 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
11ba0 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20   the file being 
11bb0 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20  opened */.  int 
11bc0 64 65 6c 46 6c 61 67 20 20 20 20 20 20 20 20 20  delFlag         
11bd0 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 2d 6f 6e      /* Delete-on
11be0 2d 6f 72 2d 62 65 66 6f 72 65 2d 63 6c 6f 73 65  -or-before-close
11bf0 20 66 6c 61 67 20 2a 2f 0a 29 7b 0a 20 20 73 71   flag */.){.  sq
11c00 6c 69 74 65 33 4c 6f 63 6b 69 6e 67 53 74 79 6c  lite3LockingStyl
11c10 65 20 6c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a  e lockingStyle;.
11c20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77    unixFile *pNew
11c30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 66 3b 0a  ;.  unixFile f;.
11c40 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 6d 65 6d    int rc;..  mem
11c50 73 65 74 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f  set(&f, 0, sizeo
11c60 66 28 66 29 29 3b 0a 20 20 6c 6f 63 6b 69 6e 67  f(f));.  locking
11c70 53 74 79 6c 65 20 3d 20 73 71 6c 69 74 65 33 44  Style = sqlite3D
11c80 65 74 65 63 74 4c 6f 63 6b 69 6e 67 53 74 79 6c  etectLockingStyl
11c90 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 68 29 3b  e(zFilename, h);
11ca0 0a 20 20 69 66 20 28 20 6c 6f 63 6b 69 6e 67 53  .  if ( lockingS
11cb0 74 79 6c 65 20 3d 3d 20 70 6f 73 69 78 4c 6f 63  tyle == posixLoc
11cc0 6b 69 6e 67 53 74 79 6c 65 20 29 20 7b 0a 20 20  kingStyle ) {.  
11cd0 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a    enterMutex();.
11ce0 20 20 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63      rc = findLoc
11cf0 6b 49 6e 66 6f 28 68 2c 20 26 66 2e 70 4c 6f 63  kInfo(h, &f.pLoc
11d00 6b 2c 20 26 66 2e 70 4f 70 65 6e 29 3b 0a 20 20  k, &f.pOpen);.  
11d10 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a    leaveMutex();.
11d20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
11d30 20 20 20 20 63 6c 6f 73 65 28 68 29 3b 0a 20 20      close(h);.  
11d40 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65      unlink(zFile
11d50 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  name);.      ret
11d60 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
11d70 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65  ;.    }.  } else
11d80 20 7b 0a 20 20 20 20 2f 2a 20 20 70 4c 6f 63 6b   {.    /*  pLock
11d90 20 61 6e 64 20 70 4f 70 65 6e 20 61 72 65 20 6f   and pOpen are o
11da0 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 70 6f 73  nly used for pos
11db0 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ix advisory lock
11dc0 69 6e 67 20 2a 2f 0a 20 20 20 20 66 2e 70 4c 6f  ing */.    f.pLo
11dd0 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 66  ck = NULL;.    f
11de0 2e 70 4f 70 65 6e 20 3d 20 4e 55 4c 4c 3b 0a 20  .pOpen = NULL;. 
11df0 20 7d 0a 20 20 69 66 28 20 64 65 6c 46 6c 61 67   }.  if( delFlag
11e00 20 29 7b 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a   ){.    unlink(z
11e10 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20  Filename);.  }. 
11e20 20 66 2e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20   f.dirfd = -1;. 
11e30 20 66 2e 68 20 3d 20 68 3b 0a 20 20 53 45 54 5f   f.h = h;.  SET_
11e40 54 48 52 45 41 44 49 44 28 26 66 29 3b 0a 20 20  THREADID(&f);.  
11e50 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pNew = sqlite3_m
11e60 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 75 6e  alloc( sizeof(un
11e70 69 78 46 69 6c 65 29 20 29 3b 0a 20 20 69 66 28  ixFile) );.  if(
11e80 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
11e90 63 6c 6f 73 65 28 68 29 3b 0a 20 20 20 20 65 6e  close(h);.    en
11ea0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
11eb0 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28  releaseLockInfo(
11ec0 66 2e 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 72 65  f.pLock);.    re
11ed0 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 66 2e 70  leaseOpenCnt(f.p
11ee0 4f 70 65 6e 29 3b 0a 20 20 20 20 6c 65 61 76 65  Open);.    leave
11ef0 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 2a 70 49  Mutex();.    *pI
11f00 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  d = 0;.    retur
11f10 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
11f20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 4e    }else{.    *pN
11f30 65 77 20 3d 20 66 3b 0a 20 20 20 20 73 77 69 74  ew = f;.    swit
11f40 63 68 28 6c 6f 63 6b 69 6e 67 53 74 79 6c 65 29  ch(lockingStyle)
11f50 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20 61 66   {.      case af
11f60 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3a 20 7b  pLockingStyle: {
11f70 0a 20 20 20 20 20 20 20 20 2f 2a 20 61 66 70 20  .        /* afp 
11f80 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65  locking uses the
11f90 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74   file path so it
11fa0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63   needs to be inc
11fb0 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 20 20 20  luded in.       
11fc0 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63 6b 69   ** the afpLocki
11fd0 6e 67 43 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20  ngContext */.   
11fe0 20 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61       int nFilena
11ff0 6d 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  me;.        pNew
12000 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 73 71 6c  ->pMethod = &sql
12010 69 74 65 33 41 46 50 4c 6f 63 6b 69 6e 67 55 6e  ite3AFPLockingUn
12020 69 78 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 20 20  ixIoMethod;.    
12030 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e      pNew->lockin
12040 67 43 6f 6e 74 65 78 74 20 3d 20 0a 20 20 20 20  gContext = .    
12050 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 61        sqlite3_ma
12060 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 61 66 70 4c  lloc(sizeof(afpL
12070 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 29 3b  ockingContext));
12080 0a 20 20 20 20 20 20 20 20 6e 46 69 6c 65 6e 61  .        nFilena
12090 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 46 69 6c  me = strlen(zFil
120a0 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20 20 20 20  ename)+1;.      
120b0 20 20 28 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f    ((afpLockingCo
120c0 6e 74 65 78 74 20 2a 29 70 4e 65 77 2d 3e 6c 6f  ntext *)pNew->lo
120d0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 66  ckingContext)->f
120e0 69 6c 65 50 61 74 68 20 3d 20 0a 20 20 20 20 20  ilePath = .     
120f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 61 6c       sqlite3_mal
12100 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a  loc(nFilename);.
12110 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 28          memcpy((
12120 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
12130 78 74 20 2a 29 70 4e 65 77 2d 3e 6c 6f 63 6b 69  xt *)pNew->locki
12140 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 66 69 6c 65  ngContext)->file
12150 50 61 74 68 2c 20 0a 20 20 20 20 20 20 20 20 20  Path, .         
12160 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c        zFilename,
12170 20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   nFilename);.   
12180 20 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28       srandomdev(
12190 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
121a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
121b0 63 61 73 65 20 66 6c 6f 63 6b 4c 6f 63 6b 69 6e  case flockLockin
121c0 67 53 74 79 6c 65 3a 0a 20 20 20 20 20 20 20 20  gStyle:.        
121d0 2f 2a 20 66 6c 6f 63 6b 20 6c 6f 63 6b 69 6e 67  /* flock locking
121e0 20 64 6f 65 73 6e 27 74 20 6e 65 65 64 20 61 64   doesn't need ad
121f0 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67  ditional locking
12200 43 6f 6e 74 65 78 74 20 69 6e 66 6f 72 6d 61 74  Context informat
12210 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ion */.        p
12220 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26  New->pMethod = &
12230 73 71 6c 69 74 65 33 46 6c 6f 63 6b 4c 6f 63 6b  sqlite3FlockLock
12240 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b  ingUnixIoMethod;
12250 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
12260 20 20 20 20 20 20 63 61 73 65 20 64 6f 74 6c 6f        case dotlo
12270 63 6b 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3a 20  ckLockingStyle: 
12280 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 64 6f 74  {.        /* dot
12290 6c 6f 63 6b 20 6c 6f 63 6b 69 6e 67 20 75 73 65  lock locking use
122a0 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20  s the file path 
122b0 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  so it needs to b
122c0 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20  e included in.  
122d0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 6f         ** the do
122e0 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
122f0 65 78 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ext */.        i
12300 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  nt nFilename;.  
12310 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74        pNew->pMet
12320 68 6f 64 20 3d 20 26 73 71 6c 69 74 65 33 44 6f  hod = &sqlite3Do
12330 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78  tlockLockingUnix
12340 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 20 20 20 20  IoMethod;.      
12350 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43    pNew->lockingC
12360 6f 6e 74 65 78 74 20 3d 20 73 71 6c 69 74 65 33  ontext = sqlite3
12370 5f 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  _malloc(.       
12380 20 20 20 73 69 7a 65 6f 66 28 64 6f 74 6c 6f 63     sizeof(dotloc
12390 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  kLockingContext)
123a0 29 3b 0a 20 20 20 20 20 20 20 20 6e 46 69 6c 65  );.        nFile
123b0 6e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 46  name = strlen(zF
123c0 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20  ilename) + 6;.  
123d0 20 20 20 20 20 20 28 28 64 6f 74 6c 6f 63 6b 4c        ((dotlockL
123e0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
123f0 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
12400 74 65 78 74 29 2d 3e 6c 6f 63 6b 50 61 74 68 20  text)->lockPath 
12410 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  = .            s
12420 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e  qlite3_malloc( n
12430 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 20 20  Filename );.    
12440 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
12450 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c 20  intf(nFilename, 
12460 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12470 20 28 28 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e   ((dotlockLockin
12480 67 43 6f 6e 74 65 78 74 20 2a 29 70 4e 65 77 2d  gContext *)pNew-
12490 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
124a0 2d 3e 6c 6f 63 6b 50 61 74 68 2c 20 0a 20 20 20  ->lockPath, .   
124b0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25 73               "%s
124c0 2e 6c 6f 63 6b 22 2c 20 7a 46 69 6c 65 6e 61 6d  .lock", zFilenam
124d0 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  e);.        brea
124e0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
124f0 20 63 61 73 65 20 70 6f 73 69 78 4c 6f 63 6b 69   case posixLocki
12500 6e 67 53 74 79 6c 65 3a 0a 20 20 20 20 20 20 20  ngStyle:.       
12510 20 2f 2a 20 70 6f 73 69 78 20 6c 6f 63 6b 69 6e   /* posix lockin
12520 67 20 64 6f 65 73 6e 27 74 20 6e 65 65 64 20 61  g doesn't need a
12530 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e  dditional lockin
12540 67 43 6f 6e 74 65 78 74 20 69 6e 66 6f 72 6d 61  gContext informa
12550 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
12560 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20  pNew->pMethod = 
12570 26 73 71 6c 69 74 65 33 55 6e 69 78 49 6f 4d 65  &sqlite3UnixIoMe
12580 74 68 6f 64 3b 0a 20 20 20 20 20 20 20 20 62 72  thod;.        br
12590 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
125a0 6e 6f 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3a 0a  noLockingStyle:.
125b0 20 20 20 20 20 20 63 61 73 65 20 75 6e 73 75 70        case unsup
125c0 70 6f 72 74 65 64 4c 6f 63 6b 69 6e 67 53 74 79  portedLockingSty
125d0 6c 65 3a 0a 20 20 20 20 20 20 64 65 66 61 75 6c  le:.      defaul
125e0 74 3a 20 0a 20 20 20 20 20 20 20 20 70 4e 65 77  t: .        pNew
125f0 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 73 71 6c  ->pMethod = &sql
12600 69 74 65 33 4e 6f 6c 6f 63 6b 4c 6f 63 6b 69 6e  ite3NolockLockin
12610 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a 20  gUnixIoMethod;. 
12620 20 20 20 7d 0a 20 20 20 20 2a 70 49 64 20 3d 20     }.    *pId = 
12630 28 4f 73 46 69 6c 65 2a 29 70 4e 65 77 3b 0a 20  (OsFile*)pNew;. 
12640 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b     OpenCounter(+
12650 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  1);.    return S
12660 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
12670 23 65 6c 73 65 20 2f 2a 20 53 51 4c 49 54 45 5f  #else /* SQLITE_
12680 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
12690 54 59 4c 45 20 2a 2f 0a 73 74 61 74 69 63 20 69  TYLE */.static i
126a0 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c  nt fillInUnixFil
126b0 65 28 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20  e(.  int h,     
126c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
126d0 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
126e0 74 6f 72 20 6f 6e 20 66 69 6c 65 20 62 65 69 6e  tor on file bein
126f0 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71  g opened */.  sq
12700 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c  lite3_file *pId,
12710 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f       /* Write to
12720 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74   the unixFile st
12730 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
12740 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
12750 69 6c 65 6e 61 6d 65 20 20 2f 2a 20 4e 61 6d 65  ilename  /* Name
12760 20 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65 69   of the file bei
12770 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 29 7b 0a  ng opened */.){.
12780 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77    unixFile *pNew
12790 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70   = (unixFile *)p
127a0 49 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23  Id;.  int rc;..#
127b0 69 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45 43  ifdef FD_CLOEXEC
127c0 0a 20 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45  .  fcntl(h, F_SE
127d0 54 46 44 2c 20 66 63 6e 74 6c 28 68 2c 20 46 5f  TFD, fcntl(h, F_
127e0 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43  GETFD, 0) | FD_C
127f0 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a  LOEXEC);.#endif.
12800 0a 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29 3b  .  enterMutex();
12810 0a 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b  .  rc = findLock
12820 49 6e 66 6f 28 68 2c 20 26 70 4e 65 77 2d 3e 70  Info(h, &pNew->p
12830 4c 6f 63 6b 2c 20 26 70 4e 65 77 2d 3e 70 4f 70  Lock, &pNew->pOp
12840 65 6e 29 3b 0a 20 20 6c 65 61 76 65 4d 75 74 65  en);.  leaveMute
12850 78 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  x();.  if( rc ){
12860 0a 20 20 20 20 63 6c 6f 73 65 28 68 29 3b 0a 20  .    close(h);. 
12870 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12880 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 4f  _NOMEM;.  }..  O
12890 53 54 52 41 43 45 33 28 22 4f 50 45 4e 20 20 20  STRACE3("OPEN   
128a0 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20   %-3d %s\n", h, 
128b0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 70 4e  zFilename);.  pN
128c0 65 77 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a  ew->dirfd = -1;.
128d0 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20    pNew->h = h;. 
128e0 20 53 45 54 5f 54 48 52 45 41 44 49 44 28 70 4e   SET_THREADID(pN
128f0 65 77 29 3b 0a 0a 20 20 70 4e 65 77 2d 3e 70 4d  ew);..  pNew->pM
12900 65 74 68 6f 64 20 3d 20 26 73 71 6c 69 74 65 33  ethod = &sqlite3
12910 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a 20 20  UnixIoMethod;.  
12920 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b  OpenCounter(+1);
12930 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
12940 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
12950 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
12960 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
12970 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
12980 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f  E_OMIT_DISKIO */
12990 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
129a0 2a 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 0a 2a 2a  *************.**
129e0 20 45 76 65 72 79 74 68 69 6e 67 20 61 62 6f 76   Everything abov
129f0 65 20 64 65 61 6c 73 20 77 69 74 68 20 66 69 6c  e deals with fil
12a00 65 20 49 2f 4f 2e 20 20 45 76 65 72 79 74 68 69  e I/O.  Everythi
12a10 6e 67 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  ng that follows 
12a20 64 65 61 6c 73 0a 2a 2a 20 77 69 74 68 20 6f 74  deals.** with ot
12a30 68 65 72 20 6d 69 73 63 65 6c 6c 61 6e 6f 75 73  her miscellanous
12a40 20 61 73 70 65 63 74 73 20 6f 66 20 74 68 65 20   aspects of the 
12a50 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
12a60 20 69 6e 74 65 72 66 61 63 65 0a 2a 2a 2a 2a 2a   interface.*****
12a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ab0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
12ac0 50 72 65 76 69 6f 75 73 6c 79 2c 20 74 68 65 20  Previously, the 
12ad0 53 51 4c 69 74 65 20 4f 53 20 6c 61 79 65 72 20  SQLite OS layer 
12ae0 75 73 65 64 20 74 68 72 65 65 20 66 75 6e 63 74  used three funct
12af0 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f 66  ions in place of
12b00 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a   this.** one:.**
12b10 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f  .**     sqlite3O
12b20 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 29  sOpenReadWrite()
12b30 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ;.**     sqlite3
12b40 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29  OsOpenReadOnly()
12b50 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ;.**     sqlite3
12b60 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
12b70 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63  );.**.** These c
12b80 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64 20  alls correspond 
12b90 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
12ba0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66   combinations of
12bb0 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   flags:.**.**   
12bc0 20 20 52 65 61 64 57 72 69 74 65 28 29 20 2d 3e    ReadWrite() ->
12bd0 20 20 20 20 20 28 52 45 41 44 57 52 49 54 45 20       (READWRITE 
12be0 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20 20 20 20  | CREATE).**    
12bf0 20 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20   ReadOnly()  -> 
12c00 20 20 20 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a      (READONLY) .
12c10 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78 63 6c 75  **     OpenExclu
12c20 73 69 76 65 28 29 20 2d 3e 20 28 52 45 41 44 57  sive() -> (READW
12c30 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 7c 20  RITE | CREATE | 
12c40 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a  EXCLUSIVE).**.**
12c50 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63   The old OpenExc
12c60 6c 75 73 69 76 65 28 29 20 61 63 63 65 70 74 65  lusive() accepte
12c70 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75  d a boolean argu
12c80 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67 22  ment - "delFlag"
12c90 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68  . If.** true, th
12ca0 65 20 66 69 6c 65 20 77 61 73 20 63 6f 6e 66 69  e file was confi
12cb0 67 75 72 65 64 20 74 6f 20 62 65 20 61 75 74 6f  gured to be auto
12cc0 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
12cd0 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69  d when the.** fi
12ce0 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64  le handle closed
12cf0 2e 20 54 6f 20 61 63 68 69 65 76 65 20 74 68 65  . To achieve the
12d00 20 73 61 6d 65 20 65 66 66 65 63 74 20 75 73 69   same effect usi
12d10 6e 67 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20  ng this new .** 
12d20 69 6e 74 65 72 66 61 63 65 2c 20 61 64 64 20 74  interface, add t
12d30 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  he DELETEONCLOSE
12d40 20 66 6c 61 67 20 74 6f 20 74 68 6f 73 65 20 73   flag to those s
12d50 70 65 63 69 66 69 65 64 20 61 62 6f 76 65 20 66  pecified above f
12d60 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75  or .** OpenExclu
12d70 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  sive()..*/.stati
12d80 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a  c int unixOpen(.
12d90 20 20 76 6f 69 64 20 2a 70 4e 6f 74 55 73 65 64    void *pNotUsed
12da0 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
12db0 2a 7a 50 61 74 68 2c 20 0a 20 20 73 71 6c 69 74  *zPath, .  sqlit
12dc0 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 0a  e3_file *pFile,.
12dd0 20 20 69 6e 74 20 66 6c 61 67 73 2c 0a 20 20 69    int flags,.  i
12de0 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 0a 29 7b  nt *pOutFlags.){
12df0 0a 20 20 69 6e 74 20 66 64 20 3d 20 30 3b 0a 20  .  int fd = 0;. 
12e00 20 69 6e 74 20 6f 66 6c 61 67 73 20 3d 20 30 3b   int oflags = 0;
12e10 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73  ..  int isExclus
12e20 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ive  = (flags & 
12e30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
12e40 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73  USIVE);.  int is
12e50 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c  Delete     = (fl
12e60 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
12e70 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29  N_DELETEONCLOSE)
12e80 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74 65  ;.  int isCreate
12e90 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
12ea0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
12eb0 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61  TE);.  int isRea
12ec0 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73  donly   = (flags
12ed0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
12ee0 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20  EADONLY);.  int 
12ef0 69 73 52 65 61 64 57 72 69 74 65 20 20 3d 20 28  isReadWrite  = (
12f00 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
12f10 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a  PEN_READWRITE);.
12f20 0a 20 20 2f 2a 20 45 78 61 63 74 6c 79 20 6f 6e  .  /* Exactly on
12f30 65 20 6f 66 20 74 68 65 20 52 45 41 44 57 52 49  e of the READWRI
12f40 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20  TE and READONLY 
12f50 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73 65  flags must be se
12f60 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69  t */.  assert((i
12f70 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20  sReadonly==0 || 
12f80 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20  isReadWrite==0) 
12f90 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20  && (isReadWrite 
12fa0 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b  || isReadonly));
12fb0 0a 0a 20 20 2f 2a 20 49 66 20 69 73 43 72 65 61  ..  /* If isCrea
12fc0 74 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  te is true, then
12fd0 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62   the file must b
12fe0 65 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61  e opened for rea
12ff0 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20  d/write access. 
13000 2a 2f 0a 20 20 61 73 73 65 72 74 28 69 73 43 72  */.  assert(isCr
13010 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61  eate==0 || isRea
13020 64 57 72 69 74 65 29 3b 0a 0a 20 20 2f 2a 20 49  dWrite);..  /* I
13030 66 20 69 73 45 78 63 6c 75 73 69 76 65 20 69 73  f isExclusive is
13040 20 74 72 75 65 2c 20 74 68 65 6e 20 69 73 43 72   true, then isCr
13050 65 61 74 65 20 6d 75 73 74 20 61 6c 73 6f 20 62  eate must also b
13060 65 20 74 72 75 65 20 2a 2f 0a 20 20 61 73 73 65  e true */.  asse
13070 72 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d  rt(isExclusive==
13080 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a  0 || isCreate);.
13090 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c  .  if( isReadonl
130a0 79 20 29 20 20 6f 66 6c 61 67 73 20 7c 3d 20 4f  y )  oflags |= O
130b0 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69  _RDONLY;.  if( i
130c0 73 52 65 61 64 57 72 69 74 65 20 29 20 6f 66 6c  sReadWrite ) ofl
130d0 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20  ags |= O_RDWR;. 
130e0 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29 20   if( isCreate ) 
130f0 20 20 20 6f 66 6c 61 67 73 20 7c 3d 20 4f 5f 43     oflags |= O_C
13100 52 45 41 54 3b 0a 20 20 69 66 28 20 69 73 45 78  REAT;.  if( isEx
13110 63 6c 75 73 69 76 65 20 29 20 6f 66 6c 61 67 73  clusive ) oflags
13120 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f   |= (O_EXCL|O_NO
13130 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 66 6c 61 67  FOLLOW);.  oflag
13140 73 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c  s |= (O_LARGEFIL
13150 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 20 20  E|O_BINARY);..  
13160 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c  memset(pFile, 0,
13170 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65   sizeof(unixFile
13180 29 29 3b 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28  ));.  fd = open(
13190 7a 50 61 74 68 2c 20 6f 66 6c 61 67 73 2c 20 69  zPath, oflags, i
131a0 73 44 65 6c 65 74 65 3f 30 36 30 30 3a 53 51 4c  sDelete?0600:SQL
131b0 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
131c0 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20  _PERMISSIONS);. 
131d0 20 69 66 28 20 66 64 3c 30 20 26 26 20 69 73 52   if( fd<0 && isR
131e0 65 61 64 57 72 69 74 65 20 26 26 20 21 69 73 45  eadWrite && !isE
131f0 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20  xclusive ){.    
13200 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f 70 65  /* Failed to ope
13210 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 72  n the file for r
13220 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
13230 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e  . Try read-only.
13240 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 26 3d   */.    flags &=
13250 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   ~(SQLITE_OPEN_R
13260 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
13270 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20  OPEN_CREATE);.  
13280 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
13290 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b  E_OPEN_READONLY;
132a0 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78  .    return unix
132b0 4f 70 65 6e 28 70 4e 6f 74 55 73 65 64 2c 20 7a  Open(pNotUsed, z
132c0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 66 6c 61  Path, pFile, fla
132d0 67 73 2c 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a  gs, pOutFlags);.
132e0 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29    }.  if( fd<0 )
132f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
13300 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
13310 7d 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65  }.  if( isDelete
13320 20 29 7b 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a   ){.    unlink(z
13330 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Path);.  }.  if(
13340 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20   pOutFlags ){.  
13350 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 66    *pOutFlags = f
13360 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  lags;.  }..  ass
13370 65 72 74 28 66 64 21 3d 30 29 3b 0a 20 20 72 65  ert(fd!=0);.  re
13380 74 75 72 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46  turn fillInUnixF
13390 69 6c 65 28 66 64 2c 20 70 46 69 6c 65 2c 20 7a  ile(fd, pFile, z
133a0 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Path);.}../*.** 
133b0 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20  Delete the file 
133c0 61 74 20 7a 50 61 74 68 2e 0a 2a 2f 0a 73 74 61  at zPath..*/.sta
133d0 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 6c 65  tic int unixDele
133e0 74 65 28 76 6f 69 64 20 2a 70 4e 6f 74 55 73 65  te(void *pNotUse
133f0 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  d, const char *z
13400 50 61 74 68 29 7b 0a 20 20 53 69 6d 75 6c 61 74  Path){.  Simulat
13410 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
13420 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
13430 45 54 45 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28 7a  ETE);.  unlink(z
13440 50 61 74 68 29 3b 0a 20 20 72 65 74 75 72 6e 20  Path);.  return 
13450 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74  SQLITE_OK;.}..st
13460 61 74 69 63 20 69 6e 74 20 75 6e 69 78 41 63 63  atic int unixAcc
13470 65 73 73 28 76 6f 69 64 20 2a 70 4e 6f 74 55 73  ess(void *pNotUs
13480 65 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ed, const char *
13490 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c 61 67 73  zPath, int flags
134a0 29 7b 0a 20 20 69 6e 74 20 61 6d 6f 64 65 3b 0a  ){.  int amode;.
134b0 20 20 73 77 69 74 63 68 28 20 66 6c 61 67 73 20    switch( flags 
134c0 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
134d0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
134e0 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20  :.      amode = 
134f0 46 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61  F_OK;.      brea
13500 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
13510 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52  TE_ACCESS_READWR
13520 49 54 45 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65  ITE:.      amode
13530 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20   = W_OK|R_OK;.  
13540 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
13550 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
13560 53 5f 52 45 41 44 4f 4e 4c 59 3a 0a 20 20 20 20  S_READONLY:.    
13570 20 20 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b 0a    amode = R_OK;.
13580 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
13590 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
135a0 20 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69   assert(!"Invali
135b0 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74  d flags argument
135c0 22 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ");.  }.  return
135d0 20 28 61 63 63 65 73 73 28 7a 50 61 74 68 2c 20   (access(zPath, 
135e0 61 6d 6f 64 65 29 3d 3d 30 29 3b 0a 7d 0a 0a 2f  amode)==0);.}../
135f0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65  *.** Create a te
13600 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  mporary file nam
13610 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66  e in zBuf.  zBuf
13620 20 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f   must be big eno
13630 75 67 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61  ugh to.** hold a
13640 74 20 6c 65 61 73 74 20 4d 41 58 5f 50 41 54 48  t least MAX_PATH
13650 4e 41 4d 45 20 63 68 61 72 61 63 74 65 72 73 2e  NAME characters.
13660 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
13670 6e 69 78 47 65 74 54 65 6d 70 4e 61 6d 65 28 76  nixGetTempName(v
13680 6f 69 64 20 2a 70 4e 6f 74 55 73 65 64 2c 20 63  oid *pNotUsed, c
13690 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74  har *zBuf){.  st
136a0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
136b0 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20  *azDirs[] = {.  
136c0 20 20 20 30 2c 0a 20 20 20 20 20 22 2f 76 61 72     0,.     "/var
136d0 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73  /tmp",.     "/us
136e0 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74  r/tmp",.     "/t
136f0 6d 70 22 2c 0a 20 20 20 20 20 22 2e 22 2c 0a 20  mp",.     ".",. 
13700 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   };.  static con
13710 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
13720 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20   zChars[] =.    
13730 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
13740 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20  pqrstuvwxyz".   
13750 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
13760 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20  OPQRSTUVWXYZ".  
13770 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a    "0123456789";.
13780 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74    int i, j;.  st
13790 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
137a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
137b0 72 20 3d 20 22 2e 22 3b 0a 20 20 61 7a 44 69 72  r = ".";.  azDir
137c0 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 74  s[0] = sqlite3_t
137d0 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20  emp_directory;. 
137e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
137f0 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f  of(azDirs)/sizeo
13800 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 69 2b  f(azDirs[0]); i+
13810 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 7a 44 69  +){.    if( azDi
13820 72 73 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69  rs[i]==0 ) conti
13830 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 74 61  nue;.    if( sta
13840 74 28 61 7a 44 69 72 73 5b 69 5d 2c 20 26 62 75  t(azDirs[i], &bu
13850 66 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  f) ) continue;. 
13860 20 20 20 69 66 28 20 21 53 5f 49 53 44 49 52 28     if( !S_ISDIR(
13870 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63  buf.st_mode) ) c
13880 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
13890 20 61 63 63 65 73 73 28 61 7a 44 69 72 73 5b 69   access(azDirs[i
138a0 5d 2c 20 30 37 29 20 29 20 63 6f 6e 74 69 6e 75  ], 07) ) continu
138b0 65 3b 0a 20 20 20 20 7a 44 69 72 20 3d 20 61 7a  e;.    zDir = az
138c0 44 69 72 73 5b 69 5d 3b 0a 20 20 20 20 62 72 65  Dirs[i];.    bre
138d0 61 6b 3b 0a 20 20 7d 0a 20 20 64 6f 7b 0a 20 20  ak;.  }.  do{.  
138e0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
138f0 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2d  tf(MAX_PATHNAME-
13900 31 37 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 54  17, zBuf, "%s/"T
13910 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c  EMP_FILE_PREFIX,
13920 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20   zDir);.    j = 
13930 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20  strlen(zBuf);.  
13940 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e    sqlite3Randomn
13950 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d  ess(15, &zBuf[j]
13960 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
13970 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b  i<15; i++, j++){
13980 0a 20 20 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d  .      zBuf[j] =
13990 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28   (char)zChars[ (
139a0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a  (unsigned char)z
139b0 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28  Buf[j])%(sizeof(
139c0 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20  zChars)-1) ];.  
139d0 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20    }.    zBuf[j] 
139e0 3d 20 30 3b 0a 20 20 7d 77 68 69 6c 65 28 20 61  = 0;.  }while( a
139f0 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30  ccess(zBuf,0)==0
13a00 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
13a10 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
13a20 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76  * Turn a relativ
13a30 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20  e pathname into 
13a40 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e  a full pathname.
13a50 20 54 68 65 20 72 65 6c 61 74 69 76 65 20 70 61   The relative pa
13a60 74 68 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20  th.** is stored 
13a70 61 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  as a nul-termina
13a80 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20 74 68  ted string in th
13a90 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
13aa0 20 74 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68 2e   to by.** zPath.
13ab0 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69   .**.** zOut poi
13ac0 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20  nts to a buffer 
13ad0 6f 66 20 61 74 20 6c 65 61 73 74 20 73 71 6c 69  of at least sqli
13ae0 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61  te3_vfs.mxPathna
13af0 6d 65 20 62 79 74 65 73 20 0a 2a 2a 20 28 69 6e  me bytes .** (in
13b00 20 74 68 69 73 20 63 61 73 65 2c 20 4d 41 58 5f   this case, MAX_
13b10 50 41 54 48 4e 41 4d 45 20 62 79 74 65 73 29 2e  PATHNAME bytes).
13b20 20 54 68 65 20 66 75 6c 6c 2d 70 61 74 68 20 69   The full-path i
13b30 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20  s written to.** 
13b40 74 68 69 73 20 62 75 66 66 65 72 20 62 65 66 6f  this buffer befo
13b50 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
13b60 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
13b70 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 76 6f 69  FullPathname(voi
13b80 64 20 2a 70 4e 6f 74 55 73 65 64 2c 20 63 6f 6e  d *pNotUsed, con
13b90 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
13ba0 63 68 61 72 20 2a 7a 4f 75 74 29 7b 0a 20 20 7a  char *zOut){.  z
13bb0 4f 75 74 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  Out[MAX_PATHNAME
13bc0 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 69 66  -1] = '\0';.  if
13bd0 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20  ( zPath[0]=='/' 
13be0 29 7b 0a 20 20 20 20 73 74 72 6e 63 70 79 28 7a  ){.    strncpy(z
13bf0 4f 75 74 2c 20 7a 50 61 74 68 2c 20 4d 41 58 5f  Out, zPath, MAX_
13c00 50 41 54 48 4e 41 4d 45 2d 31 29 3b 0a 20 20 7d  PATHNAME-1);.  }
13c10 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43  else{.    int nC
13c20 77 64 3b 0a 20 20 20 20 69 66 28 20 67 65 74 63  wd;.    if( getc
13c30 77 64 28 7a 4f 75 74 2c 20 4d 41 58 5f 50 41 54  wd(zOut, MAX_PAT
13c40 48 4e 41 4d 45 2d 31 29 3d 3d 30 20 29 7b 0a 20  HNAME-1)==0 ){. 
13c50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
13c60 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
13c70 20 20 20 20 6e 43 77 64 20 3d 20 73 74 72 6c 65      nCwd = strle
13c80 6e 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7a 4f 75  n(zOut);.    zOu
13c90 74 5b 6e 43 77 64 5d 20 3d 20 27 2f 27 3b 0a 20  t[nCwd] = '/';. 
13ca0 20 20 20 73 74 72 6e 63 70 79 28 26 7a 4f 75 74     strncpy(&zOut
13cb0 5b 6e 43 77 64 2b 31 5d 2c 20 7a 50 61 74 68 2c  [nCwd+1], zPath,
13cc0 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2d 31 2d   MAX_PATHNAME-1-
13cd0 6e 43 77 64 2d 31 29 3b 0a 20 20 7d 0a 20 20 72  nCwd-1);.  }.  r
13ce0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13cf0 0a 0a 23 69 66 20 30 0a 20 20 2f 2a 0a 20 20 2a  ..#if 0.  /*.  *
13d00 2a 20 52 65 6d 6f 76 65 20 22 2f 2e 2f 22 20 70  * Remove "/./" p
13d10 61 74 68 20 65 6c 65 6d 65 6e 74 73 20 61 6e 64  ath elements and
13d20 20 63 6f 6e 76 65 72 74 20 22 2f 41 2f 2e 2f 22   convert "/A/./"
13d30 20 70 61 74 68 20 65 6c 65 6d 65 6e 74 73 0a 20   path elements. 
13d40 20 2a 2a 20 74 6f 20 6a 75 73 74 20 22 2f 22 2e   ** to just "/".
13d50 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 75 6c  .  */.  if( zFul
13d60 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20  l ){.    int i, 
13d70 6a 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d 30  j;.    for(i=j=0
13d80 3b 20 7a 46 75 6c 6c 5b 69 5d 3b 20 69 2b 2b 29  ; zFull[i]; i++)
13d90 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c  {.      if( zFul
13da0 6c 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  l[i]=='/' ){.   
13db0 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 5b 69       if( zFull[i
13dc0 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69  +1]=='/' ) conti
13dd0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
13de0 20 7a 46 75 6c 6c 5b 69 2b 31 5d 3d 3d 27 2e 27   zFull[i+1]=='.'
13df0 20 26 26 20 7a 46 75 6c 6c 5b 69 2b 32 5d 3d 3d   && zFull[i+2]==
13e00 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  '/' ){.         
13e10 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20   i += 1;.       
13e20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
13e30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
13e40 66 28 20 7a 46 75 6c 6c 5b 69 2b 31 5d 3d 3d 27  f( zFull[i+1]=='
13e50 2e 27 20 26 26 20 7a 46 75 6c 6c 5b 69 2b 32 5d  .' && zFull[i+2]
13e60 3d 3d 27 2e 27 20 26 26 20 7a 46 75 6c 6c 5b 69  =='.' && zFull[i
13e70 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  +3]=='/' ){.    
13e80 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30        while( j>0
13e90 20 26 26 20 7a 46 75 6c 6c 5b 6a 2d 31 5d 21 3d   && zFull[j-1]!=
13ea0 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20  '/' ){ j--; }.  
13eb0 20 20 20 20 20 20 20 20 69 20 2b 3d 20 33 3b 0a          i += 3;.
13ec0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
13ed0 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
13ee0 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 46 75 6c      }.      zFul
13ef0 6c 5b 6a 2b 2b 5d 20 3d 20 7a 46 75 6c 6c 5b 69  l[j++] = zFull[i
13f00 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46 75  ];.    }.    zFu
13f10 6c 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 0a 23  ll[j] = 0;.  }.#
13f20 65 6e 64 69 66 0a 7d 0a 0a 0a 23 69 66 6e 64 65  endif.}...#ifnde
13f30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
13f40 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a  AD_EXTENSION./*.
13f50 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f  ** Interfaces fo
13f60 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72  r opening a shar
13f70 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64  ed library, find
13f80 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73  ing entry points
13f90 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73  .** within the s
13fa0 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61  hared library, a
13fb0 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73  nd closing the s
13fc0 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a  hared library..*
13fd0 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66 63  /.#include <dlfc
13fe0 6e 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f 69 64  n.h>.static void
13ff0 20 2a 75 6e 69 78 44 6c 4f 70 65 6e 28 76 6f 69   *unixDlOpen(voi
14000 64 20 2a 70 4e 6f 74 55 73 65 64 2c 20 63 6f 6e  d *pNotUsed, con
14010 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
14020 6d 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 6c  me){.  return dl
14030 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  open(zFilename, 
14040 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f  RTLD_NOW | RTLD_
14050 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 73 74 61 74 69  GLOBAL);.}.stati
14060 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 45 72 72  c void unixDlErr
14070 6f 72 28 76 6f 69 64 20 2a 70 4e 6f 74 55 73 65  or(void *pNotUse
14080 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  d, int nBuf, cha
14090 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63  r *zBufOut){.  c
140a0 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 65 6e 74  har *zErr;.  ent
140b0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a 45 72  erMutex();.  zEr
140c0 72 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b 0a 20  r = dlerror();. 
140d0 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20   if( zErr ){.   
140e0 20 73 74 72 6e 63 70 79 28 7a 42 75 66 4f 75 74   strncpy(zBufOut
140f0 2c 20 7a 45 72 72 2c 20 6e 42 75 66 2d 31 29 3b  , zErr, nBuf-1);
14100 0a 20 20 20 20 7a 42 75 66 4f 75 74 5b 6e 42 75  .    zBufOut[nBu
14110 66 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d  f-1] = '\0';.  }
14120 65 6c 73 65 20 69 66 28 6e 42 75 66 3e 30 29 20  else if(nBuf>0) 
14130 7b 0a 20 20 20 20 7a 42 75 66 4f 75 74 5b 30 5d  {.    zBufOut[0]
14140 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 6c   = '\0';.  }.  l
14150 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 76  eaveMutex();.}.v
14160 6f 69 64 20 2a 75 6e 69 78 44 6c 53 79 6d 28 76  oid *unixDlSym(v
14170 6f 69 64 20 2a 70 48 61 6e 64 6c 65 2c 20 63 6f  oid *pHandle, co
14180 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 62 6f  nst char *zSymbo
14190 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 6c 73  l){.  return dls
141a0 79 6d 28 70 48 61 6e 64 6c 65 2c 20 7a 53 79 6d  ym(pHandle, zSym
141b0 62 6f 6c 29 3b 0a 7d 0a 76 6f 69 64 20 75 6e 69  bol);.}.void uni
141c0 78 44 6c 43 6c 6f 73 65 28 76 6f 69 64 20 2a 70  xDlClose(void *p
141d0 48 61 6e 64 6c 65 29 7b 0a 20 20 64 6c 63 6c 6f  Handle){.  dlclo
141e0 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23  se(pHandle);.}.#
141f0 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54  else /* if SQLIT
14200 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
14210 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64  NSION is defined
14220 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 75  : */.  #define u
14230 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23  nixDlOpen  0.  #
14240 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 45 72 72  define unixDlErr
14250 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75  or 0.  #define u
14260 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a 20 20 23  nixDlSym   0.  #
14270 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 43 6c 6f  define unixDlClo
14280 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  se 0.#endif../*.
14290 2a 2a 20 42 6f 74 68 20 61 72 67 75 6d 65 6e 74  ** Both argument
142a0 73 20 61 72 65 20 69 6e 74 65 67 65 72 73 2e 20  s are integers. 
142b0 54 68 69 73 20 6d 61 63 72 6f 20 72 65 74 75 72  This macro retur
142c0 6e 73 20 74 68 65 20 6c 6f 77 65 73 74 20 6f 66  ns the lowest of
142d0 20 74 68 65 20 0a 2a 2a 20 74 77 6f 20 61 72 67   the .** two arg
142e0 75 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 23 64 65 66  uments. .*/.#def
142f0 69 6e 65 20 4d 49 4e 28 78 2c 79 29 20 28 28 78  ine MIN(x,y) ((x
14300 29 3e 28 79 29 3f 28 79 29 3a 28 78 29 29 0a 0a  )>(y)?(y):(x))..
14310 2f 2a 0a 2a 2a 20 47 65 74 20 69 6e 66 6f 72 6d  /*.** Get inform
14320 61 74 69 6f 6e 20 74 6f 20 73 65 65 64 20 74 68  ation to seed th
14330 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  e random number 
14340 67 65 6e 65 72 61 74 6f 72 2e 20 20 54 68 65 20  generator.  The 
14350 73 65 65 64 0a 2a 2a 20 69 73 20 77 72 69 74 74  seed.** is writt
14360 65 6e 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66  en into the buff
14370 65 72 20 7a 42 75 66 5b 32 35 36 5d 2e 20 20 54  er zBuf[256].  T
14380 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
14390 69 6f 6e 20 6d 75 73 74 0a 2a 2a 20 73 75 70 70  ion must.** supp
143a0 6c 79 20 61 20 73 75 66 66 69 63 69 65 6e 74 6c  ly a sufficientl
143b0 79 20 6c 61 72 67 65 20 62 75 66 66 65 72 2e 0a  y large buffer..
143c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
143d0 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28 76 6f 69  ixRandomness(voi
143e0 64 20 2a 70 4e 6f 74 55 73 65 64 2c 20 69 6e 74  d *pNotUsed, int
143f0 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
14400 66 29 7b 0a 20 20 2f 2a 20 57 65 20 68 61 76 65  f){.  /* We have
14410 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a   to initialize z
14420 42 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76  Buf to prevent v
14430 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70  algrind from rep
14440 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f  orting.  ** erro
14450 72 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73  rs.  The reports
14460 20 69 73 73 75 65 64 20 62 79 20 76 61 6c 67 72   issued by valgr
14470 69 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63  ind are incorrec
14480 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a  t - we would.  *
14490 2a 20 70 72 65 66 65 72 20 74 68 61 74 20 74 68  * prefer that th
144a0 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20  e randomness be 
144b0 69 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b  increased by mak
144c0 69 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20  ing use of the. 
144d0 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   ** uninitialize
144e0 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20  d space in zBuf 
144f0 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65  - but valgrind e
14500 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f  rrors tend to wo
14510 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73  rry.  ** some us
14520 65 72 73 2e 20 20 52 61 74 68 65 72 20 74 68 61  ers.  Rather tha
14530 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d  n argue, it seem
14540 73 20 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f  s easier just to
14550 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a   initialize.  **
14560 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79   the whole array
14570 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c   and silence val
14580 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74  grind, even if t
14590 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72  hat means less r
145a0 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69  andomness.  ** i
145b0 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65  n the random see
145c0 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  d..  **.  ** Whe
145d0 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69  n testing, initi
145e0 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74  alizing zBuf[] t
145f0 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65  o zero is all we
14600 20 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73   do.  That means
14610 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c  .  ** that we al
14620 77 61 79 73 20 75 73 65 20 74 68 65 20 73 61 6d  ways use the sam
14630 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  e random number 
14640 73 65 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20  sequence.  This 
14650 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74  makes the.  ** t
14660 65 73 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e  ests repeatable.
14670 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a  .  */.  memset(z
14680 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23  Buf, 0, nBuf);.#
14690 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
146a0 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20 20  TE_TEST).  {.   
146b0 20 69 6e 74 20 70 69 64 2c 20 66 64 3b 0a 20 20   int pid, fd;.  
146c0 20 20 66 64 20 3d 20 6f 70 65 6e 28 22 2f 64 65    fd = open("/de
146d0 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44  v/urandom", O_RD
146e0 4f 4e 4c 59 29 3b 0a 20 20 20 20 69 66 28 20 66  ONLY);.    if( f
146f0 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 74 69 6d  d<0 ){.      tim
14700 65 5f 74 20 74 3b 0a 20 20 20 20 20 20 74 69 6d  e_t t;.      tim
14710 65 28 26 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d  e(&t);.      mem
14720 63 70 79 28 7a 42 75 66 2c 20 26 74 2c 20 4d 49  cpy(zBuf, &t, MI
14730 4e 28 6e 42 75 66 2c 20 73 69 7a 65 6f 66 28 74  N(nBuf, sizeof(t
14740 29 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  )));.      if( (
14750 6e 42 75 66 2d 73 69 7a 65 6f 66 28 74 29 29 3e  nBuf-sizeof(t))>
14760 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 69 64  0 ){.        pid
14770 20 3d 20 67 65 74 70 69 64 28 29 3b 0a 20 20 20   = getpid();.   
14780 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75       memcpy(&zBu
14790 66 5b 73 69 7a 65 6f 66 28 74 29 5d 2c 20 26 70  f[sizeof(t)], &p
147a0 69 64 2c 20 4d 49 4e 28 6e 42 75 66 2d 73 69 7a  id, MIN(nBuf-siz
147b0 65 6f 66 28 74 29 2c 20 73 69 7a 65 6f 66 28 70  eof(t), sizeof(p
147c0 69 64 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  id)));.      }. 
147d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
147e0 72 65 61 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e  read(fd, zBuf, n
147f0 42 75 66 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73  Buf);.      clos
14800 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e(fd);.    }.  }
14810 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
14820 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
14830 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20  /*.** Sleep for 
14840 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20  a little while. 
14850 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75   Return the amou
14860 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74  nt of time slept
14870 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  ..** The argumen
14880 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  t is the number 
14890 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20  of microseconds 
148a0 77 65 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70  we want to sleep
148b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
148c0 75 6e 69 78 53 6c 65 65 70 28 76 6f 69 64 20 2a  unixSleep(void *
148d0 70 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6d 69  pNotUsed, int mi
148e0 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66  croseconds){.#if
148f0 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53   defined(HAVE_US
14900 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53  LEEP) && HAVE_US
14910 4c 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d 69  LEEP.  usleep(mi
14920 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20 72  croseconds);.  r
14930 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e  eturn microsecon
14940 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  ds;.#else.  int 
14950 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f  seconds = (micro
14960 73 65 63 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f  seconds+999999)/
14970 31 30 30 30 30 30 30 3b 0a 20 20 73 6c 65 65 70  1000000;.  sleep
14980 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20 72 65 74  (seconds);.  ret
14990 75 72 6e 20 73 65 63 6f 6e 64 73 3b 0a 23 65 6e  urn seconds;.#en
149a0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  dif.}../*.** The
149b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
149c0 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61  ble, if set to a
149d0 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c   non-zero value,
149e0 20 62 65 63 6f 6d 65 73 20 74 68 65 20 72 65 73   becomes the res
149f0 75 6c 74 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  ult.** returned 
14a00 66 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73 43 75  from sqlite3OsCu
14a10 72 72 65 6e 74 54 69 6d 65 28 29 2e 20 20 54 68  rrentTime().  Th
14a20 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  is is used for t
14a30 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65  esting..*/.#ifde
14a40 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
14a50 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  t sqlite3_curren
14a60 74 5f 74 69 6d 65 20 3d 20 30 3b 0a 23 65 6e 64  t_time = 0;.#end
14a70 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  if../*.** Find t
14a80 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
14a90 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f  (in Universal Co
14aa0 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e  ordinated Time).
14ab0 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63    Write the.** c
14ac0 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20  urrent time and 
14ad0 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e  date as a Julian
14ae0 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f   Day number into
14af0 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72   *prNow and.** r
14b00 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e  eturn 0.  Return
14b10 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61   1 if the time a
14b20 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62  nd date cannot b
14b30 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
14b40 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65  ic int unixCurre
14b50 6e 74 54 69 6d 65 28 76 6f 69 64 20 2a 70 4e 6f  ntTime(void *pNo
14b60 74 55 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70  tUsed, double *p
14b70 72 4e 6f 77 29 7b 0a 23 69 66 64 65 66 20 4e 4f  rNow){.#ifdef NO
14b80 5f 47 45 54 54 4f 44 0a 20 20 74 69 6d 65 5f 74  _GETTOD.  time_t
14b90 20 74 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a   t;.  time(&t);.
14ba0 20 20 2a 70 72 4e 6f 77 20 3d 20 74 2f 38 36 34    *prNow = t/864
14bb0 30 30 2e 30 20 2b 20 32 34 34 30 35 38 37 2e 35  00.0 + 2440587.5
14bc0 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74  ;.#else.  struct
14bd0 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20   timeval sNow;. 
14be0 20 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73   gettimeofday(&s
14bf0 4e 6f 77 2c 20 30 29 3b 0a 20 20 2a 70 72 4e 6f  Now, 0);.  *prNo
14c00 77 20 3d 20 32 34 34 30 35 38 37 2e 35 20 2b 20  w = 2440587.5 + 
14c10 73 4e 6f 77 2e 74 76 5f 73 65 63 2f 38 36 34 30  sNow.tv_sec/8640
14c20 30 2e 30 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73  0.0 + sNow.tv_us
14c30 65 63 2f 38 36 34 30 30 30 30 30 30 30 30 2e 30  ec/86400000000.0
14c40 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
14c50 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
14c60 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  ( sqlite3_curren
14c70 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70  t_time ){.    *p
14c80 72 4e 6f 77 20 3d 20 73 71 6c 69 74 65 33 5f 63  rNow = sqlite3_c
14c90 75 72 72 65 6e 74 5f 74 69 6d 65 2f 38 36 34 30  urrent_time/8640
14ca0 30 2e 30 20 2b 20 32 34 34 30 35 38 37 2e 35 3b  0.0 + 2440587.5;
14cb0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
14cc0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 73 71 6c 69  turn 0;.}...sqli
14cd0 74 65 33 5f 76 66 73 20 73 71 6c 69 74 65 33 44  te3_vfs sqlite3D
14ce0 65 66 61 75 6c 74 56 66 73 20 3d 20 7b 0a 20 20  efaultVfs = {.  
14cf0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
14d00 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
14d10 2a 2f 0a 20 20 73 69 7a 65 6f 66 28 75 6e 69 78  */.  sizeof(unix
14d20 46 69 6c 65 29 2c 20 20 20 2f 2a 20 73 7a 4f 73  File),   /* szOs
14d30 46 69 6c 65 20 2a 2f 0a 20 20 4d 41 58 5f 50 41  File */.  MAX_PA
14d40 54 48 4e 41 4d 45 2c 20 20 20 20 20 20 20 2f 2a  THNAME,       /*
14d50 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20   mxPathname */. 
14d60 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
14d70 20 20 20 20 20 2f 2a 20 6e 52 65 66 20 2a 2f 0a       /* nRef */.
14d80 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
14d90 20 20 20 20 20 20 2f 2a 20 76 66 73 4d 75 74 65        /* vfsMute
14da0 78 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  x */.  0,       
14db0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e             /* pN
14dc0 65 78 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ext */.  0,     
14dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14de0 70 50 72 65 76 20 2a 2f 0a 20 20 22 75 6e 69 78  pPrev */.  "unix
14df0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ",             /
14e00 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 30 2c 20  * zName */.  0, 
14e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a   /* pAppData */.
14e30 0a 20 20 75 6e 69 78 4f 70 65 6e 2c 20 20 20 20  .  unixOpen,    
14e40 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20         /* xOpen 
14e50 2a 2f 0a 20 20 75 6e 69 78 44 65 6c 65 74 65 2c  */.  unixDelete,
14e60 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c           /* xDel
14e70 65 74 65 20 2a 2f 0a 20 20 75 6e 69 78 41 63 63  ete */.  unixAcc
14e80 65 73 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ess,         /* 
14e90 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 75 6e 69  xAccess */.  uni
14ea0 78 47 65 74 54 65 6d 70 4e 61 6d 65 2c 20 20 20  xGetTempName,   
14eb0 20 2f 2a 20 78 47 65 74 54 65 6d 70 4e 61 6d 65   /* xGetTempName
14ec0 20 2a 2f 0a 20 20 75 6e 69 78 46 75 6c 6c 50 61   */.  unixFullPa
14ed0 74 68 6e 61 6d 65 2c 20 20 20 2f 2a 20 78 46 75  thname,   /* xFu
14ee0 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20  llPathname */.  
14ef0 75 6e 69 78 44 6c 4f 70 65 6e 2c 20 20 20 20 20  unixDlOpen,     
14f00 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a      /* xDlOpen *
14f10 2f 0a 20 20 75 6e 69 78 44 6c 45 72 72 6f 72 2c  /.  unixDlError,
14f20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72          /* xDlEr
14f30 72 6f 72 20 2a 2f 0a 20 20 75 6e 69 78 44 6c 53  ror */.  unixDlS
14f40 79 6d 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ym,          /* 
14f50 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 75 6e 69 78  xDlSym */.  unix
14f60 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  DlClose,        
14f70 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20  /* xDlClose */. 
14f80 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 2c   unixRandomness,
14f90 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e       /* xRandomn
14fa0 65 73 73 20 2a 2f 0a 20 20 75 6e 69 78 53 6c 65  ess */.  unixSle
14fb0 65 70 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ep,          /* 
14fc0 78 53 6c 65 65 70 20 2a 2f 0a 20 20 75 6e 69 78  xSleep */.  unix
14fd0 43 75 72 72 65 6e 74 54 69 6d 65 20 20 20 20 20  CurrentTime     
14fe0 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20  /* xCurrentTime 
14ff0 2a 2f 0a 7d 3b 0a 20 0a 23 65 6e 64 69 66 20 2f  */.};. .#endif /
15000 2a 20 4f 53 5f 55 4e 49 58 20 2a 2f 0a           * OS_UNIX */.