/ Hex Artifact Content
Login

Artifact b21695b8cc529f9aad7507bdc0d31cfa72623159:


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 66 20 4f 53 5f 55 4e 49 58 20 20 20 20 20  #if OS_UNIX     
01e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
01f0: 20 66 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e   file is used on
0200: 20 75 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f   unix only */../
0210: 2a 20 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  * #define SQLITE
0220: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
0230: 53 54 59 4c 45 20 30 20 2a 2f 0a 0a 2f 2a 0a 2a  STYLE 0 */../*.*
0240: 2a 20 54 68 65 73 65 20 23 64 65 66 69 6e 65 73  * These #defines
0250: 20 73 68 6f 75 6c 64 20 65 6e 61 62 6c 65 20 3e   should enable >
0260: 32 47 42 20 66 69 6c 65 20 73 75 70 70 6f 72 74  2GB file support
0270: 20 6f 6e 20 50 6f 73 69 78 20 69 66 20 74 68 65   on Posix if the
0280: 0a 2a 2a 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f  .** underlying o
0290: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
02a0: 73 75 70 70 6f 72 74 73 20 69 74 2e 20 20 49 66  supports it.  If
02b0: 20 74 68 65 20 4f 53 20 6c 61 63 6b 73 0a 2a 2a   the OS lacks.**
02c0: 20 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70   large file supp
02d0: 6f 72 74 2c 20 74 68 65 73 65 20 73 68 6f 75 6c  ort, these shoul
02e0: 64 20 62 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2a 0a  d be no-ops..**.
02f0: 2a 2a 20 4c 61 72 67 65 20 66 69 6c 65 20 73 75  ** Large file su
0300: 70 70 6f 72 74 20 63 61 6e 20 62 65 20 64 69 73  pport can be dis
0310: 61 62 6c 65 64 20 75 73 69 6e 67 20 74 68 65 20  abled using the 
0320: 2d 44 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  -DSQLITE_DISABLE
0330: 5f 4c 46 53 20 73 77 69 74 63 68 0a 2a 2a 20 6f  _LFS switch.** o
0340: 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 63  n the compiler c
0350: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20 20 54 68  ommand line.  Th
0360: 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
0370: 69 66 20 79 6f 75 20 61 72 65 20 63 6f 6d 70 69  if you are compi
0380: 6c 69 6e 67 0a 2a 2a 20 6f 6e 20 61 20 72 65 63  ling.** on a rec
0390: 65 6e 74 20 6d 61 63 68 69 6e 65 20 28 65 78 3a  ent machine (ex:
03a0: 20 52 65 64 48 61 74 20 37 2e 32 29 20 62 75 74   RedHat 7.2) but
03b0: 20 79 6f 75 20 77 61 6e 74 20 79 6f 75 72 20 63   you want your c
03c0: 6f 64 65 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 6f  ode to work.** o
03d0: 6e 20 61 6e 20 6f 6c 64 65 72 20 6d 61 63 68 69  n an older machi
03e0: 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20 36  ne (ex: RedHat 6
03f0: 2e 30 29 2e 20 20 49 66 20 79 6f 75 20 63 6f 6d  .0).  If you com
0400: 70 69 6c 65 20 6f 6e 20 52 65 64 48 61 74 20 37  pile on RedHat 7
0410: 2e 32 0a 2a 2a 20 77 69 74 68 6f 75 74 20 74 68  .2.** without th
0420: 69 73 20 6f 70 74 69 6f 6e 2c 20 4c 46 53 20 69  is option, LFS i
0430: 73 20 65 6e 61 62 6c 65 2e 20 20 42 75 74 20 4c  s enable.  But L
0440: 46 53 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  FS does not exis
0450: 74 20 69 6e 20 74 68 65 20 6b 65 72 6e 65 6c 0a  t in the kernel.
0460: 2a 2a 20 69 6e 20 52 65 64 48 61 74 20 36 2e 30  ** in RedHat 6.0
0470: 2c 20 73 6f 20 74 68 65 20 63 6f 64 65 20 77 6f  , so the code wo
0480: 6e 27 74 20 77 6f 72 6b 2e 20 20 48 65 6e 63 65  n't work.  Hence
0490: 2c 20 66 6f 72 20 6d 61 78 69 6d 75 6d 20 62 69  , for maximum bi
04a0: 6e 61 72 79 0a 2a 2a 20 70 6f 72 74 61 62 69 6c  nary.** portabil
04b0: 69 74 79 20 79 6f 75 20 73 68 6f 75 6c 64 20 6f  ity you should o
04c0: 6d 69 74 20 4c 46 53 2e 0a 2a 2f 0a 23 69 66 6e  mit LFS..*/.#ifn
04d0: 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
04e0: 4c 45 5f 4c 46 53 0a 23 20 64 65 66 69 6e 65 20  LE_LFS.# define 
04f0: 5f 4c 41 52 47 45 5f 46 49 4c 45 20 20 20 20 20  _LARGE_FILE     
0500: 20 20 31 0a 23 20 69 66 6e 64 65 66 20 5f 46 49    1.# ifndef _FI
0510: 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 0a 23  LE_OFFSET_BITS.#
0520: 20 20 20 64 65 66 69 6e 65 20 5f 46 49 4c 45 5f     define _FILE_
0530: 4f 46 46 53 45 54 5f 42 49 54 53 20 36 34 0a 23  OFFSET_BITS 64.#
0540: 20 65 6e 64 69 66 0a 23 20 64 65 66 69 6e 65 20   endif.# define 
0550: 5f 4c 41 52 47 45 46 49 4c 45 5f 53 4f 55 52 43  _LARGEFILE_SOURC
0560: 45 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  E 1.#endif../*.*
0570: 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 63 6c 75  * standard inclu
0580: 64 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a 23 69 6e  de files..*/.#in
0590: 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73  clude <sys/types
05a0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
05b0: 73 2f 73 74 61 74 2e 68 3e 0a 23 69 6e 63 6c 75  s/stat.h>.#inclu
05c0: 64 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 69 6e  de <fcntl.h>.#in
05d0: 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e  clude <unistd.h>
05e0: 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e  .#include <time.
05f0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
0600: 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  /time.h>.#includ
0610: 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69 66 64  e <errno.h>.#ifd
0620: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
0630: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23  _LOCKING_STYLE.#
0640: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63  include <sys/ioc
0650: 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  tl.h>.#include <
0660: 73 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 69 6e  sys/param.h>.#in
0670: 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6f 75 6e 74  clude <sys/mount
0680: 2e 68 3e 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .h>.#endif /* SQ
0690: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
06a0: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a  ING_STYLE */../*
06b0: 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 74 6f  .** If we are to
06c0: 20 62 65 20 74 68 72 65 61 64 2d 73 61 66 65 2c   be thread-safe,
06d0: 20 69 6e 63 6c 75 64 65 20 74 68 65 20 70 74 68   include the pth
06e0: 72 65 61 64 73 20 68 65 61 64 65 72 20 61 6e 64  reads header and
06f0: 20 64 65 66 69 6e 65 0a 2a 2a 20 74 68 65 20 53   define.** the S
0700: 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41  QLITE_UNIX_THREA
0710: 44 53 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66  DS macro..*/.#if
0720: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
0730: 46 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 70 74  FE.# include <pt
0740: 68 72 65 61 64 2e 68 3e 0a 23 20 64 65 66 69 6e  hread.h>.# defin
0750: 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48  e SQLITE_UNIX_TH
0760: 52 45 41 44 53 20 31 0a 23 65 6e 64 69 66 0a 0a  READS 1.#endif..
0770: 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 70 65  /*.** Default pe
0780: 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63  rmissions when c
0790: 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 66 69  reating a new fi
07a0: 6c 65 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  le.*/.#ifndef SQ
07b0: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
07c0: 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20  E_PERMISSIONS.# 
07d0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 45  define SQLITE_DE
07e0: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
07f0: 53 53 49 4f 4e 53 20 30 36 34 34 0a 23 65 6e 64  SSIONS 0644.#end
0800: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75  if../*.** Maximu
0810: 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 74 68  m supported path
0820: 2d 6c 65 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65 66  -length..*/.#def
0830: 69 6e 65 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ine MAX_PATHNAME
0840: 20 35 31 32 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   512.../*.** The
0850: 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
0860: 75 72 65 20 69 73 20 73 75 62 63 6c 61 73 73 20  ure is subclass 
0870: 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  of sqlite3_file 
0880: 73 70 65 63 69 66 69 63 20 66 6f 72 20 74 68 65  specific for the
0890: 20 75 6e 69 78 0a 2a 2a 20 70 72 6f 74 61 62 69   unix.** protabi
08a0: 6c 69 74 79 20 6c 61 79 65 72 2e 0a 2a 2f 0a 74  lity layer..*/.t
08b0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e  ypedef struct un
08c0: 69 78 46 69 6c 65 20 75 6e 69 78 46 69 6c 65 3b  ixFile unixFile;
08d0: 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65  .struct unixFile
08e0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f   {.  sqlite3_io_
08f0: 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70  methods const *p
0900: 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c 77 61  Method;  /* Alwa
0910: 79 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  ys the first ent
0920: 72 79 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ry */.#ifdef SQL
0930: 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e  ITE_TEST.  /* In
0940: 20 74 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72   test mode, incr
0950: 65 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66  ease the size of
0960: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
0970: 61 20 62 69 74 20 73 6f 20 74 68 61 74 20 0a 20  a bit so that . 
0980: 20 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72   ** it is larger
0990: 20 74 68 61 6e 20 74 68 65 20 73 74 72 75 63 74   than the struct
09a0: 20 43 72 61 73 68 46 69 6c 65 20 64 65 66 69 6e   CrashFile defin
09b0: 65 64 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20  ed in test6.c.. 
09c0: 20 2a 2f 0a 20 20 63 68 61 72 20 61 50 61 64 64   */.  char aPadd
09d0: 69 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a  ing[32];.#endif.
09e0: 20 20 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74    struct openCnt
09f0: 20 2a 70 4f 70 65 6e 3b 20 20 20 20 2f 2a 20 49   *pOpen;    /* I
0a00: 6e 66 6f 20 61 62 6f 75 74 20 61 6c 6c 20 6f 70  nfo about all op
0a10: 65 6e 20 66 64 27 73 20 6f 6e 20 74 68 69 73 20  en fd's on this 
0a20: 69 6e 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63  inode */.  struc
0a30: 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63  t lockInfo *pLoc
0a40: 6b 3b 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f  k;   /* Info abo
0a50: 75 74 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 69 73  ut locks on this
0a60: 20 69 6e 6f 64 65 20 2a 2f 0a 23 69 66 64 65 66   inode */.#ifdef
0a70: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
0a80: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 76  OCKING_STYLE.  v
0a90: 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oid *lockingCont
0aa0: 65 78 74 3b 20 20 20 20 20 2f 2a 20 4c 6f 63 6b  ext;     /* Lock
0ab0: 69 6e 67 20 73 74 79 6c 65 20 73 70 65 63 69 66  ing style specif
0ac0: 69 63 20 73 74 61 74 65 20 2a 2f 0a 23 65 6e 64  ic state */.#end
0ad0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
0ae0: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
0af0: 45 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20  E */.  int h;   
0b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b10: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
0b20: 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 75 6e 73  criptor */.  uns
0b30: 69 67 6e 65 64 20 63 68 61 72 20 6c 6f 63 6b 74  igned char lockt
0b40: 79 70 65 3b 20 20 20 2f 2a 20 54 68 65 20 74 79  ype;   /* The ty
0b50: 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64 20  pe of lock held 
0b60: 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20 20  on this fd */.  
0b70: 69 6e 74 20 64 69 72 66 64 3b 20 20 20 20 20 20  int dirfd;      
0b80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
0b90: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
0ba0: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 2a   the directory *
0bb0: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  /.#if SQLITE_THR
0bc0: 45 41 44 53 41 46 45 0a 20 20 70 74 68 72 65 61  EADSAFE.  pthrea
0bd0: 64 5f 74 20 74 69 64 3b 20 20 20 20 20 20 20 20  d_t tid;        
0be0: 20 20 20 20 2f 2a 20 54 68 65 20 74 68 72 65 61      /* The threa
0bf0: 64 20 74 68 61 74 20 22 6f 77 6e 73 22 20 74 68  d that "owns" th
0c00: 69 73 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 23  is unixFile */.#
0c10: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
0c20: 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61  Include code tha
0c30: 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61  t is common to a
0c40: 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a  ll os_*.c files.
0c50: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f  */.#include "os_
0c60: 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a  common.h"../*.**
0c70: 20 44 65 66 69 6e 65 20 76 61 72 69 6f 75 73 20   Define various 
0c80: 6d 61 63 72 6f 73 20 74 68 61 74 20 61 72 65 20  macros that are 
0c90: 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d  missing from som
0ca0: 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69  e systems..*/.#i
0cb0: 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c  fndef O_LARGEFIL
0cc0: 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52  E.# define O_LAR
0cd0: 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a  GEFILE 0.#endif.
0ce0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
0cf0: 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65  SABLE_LFS.# unde
0d00: 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20  f O_LARGEFILE.# 
0d10: 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49  define O_LARGEFI
0d20: 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e  LE 0.#endif.#ifn
0d30: 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23  def O_NOFOLLOW.#
0d40: 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c   define O_NOFOLL
0d50: 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e  OW 0.#endif.#ifn
0d60: 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64  def O_BINARY.# d
0d70: 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30  efine O_BINARY 0
0d80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0d90: 68 65 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65  he DJGPP compile
0da0: 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f  r environment lo
0db0: 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20  oks mostly like 
0dc0: 55 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20  Unix, but it.** 
0dd0: 6c 61 63 6b 73 20 74 68 65 20 66 63 6e 74 6c 28  lacks the fcntl(
0de0: 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20  ) system call.  
0df0: 53 6f 20 72 65 64 65 66 69 6e 65 20 66 63 6e 74  So redefine fcnt
0e00: 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d 65 74 68  l() to be someth
0e10: 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61  ing.** that alwa
0e20: 79 73 20 73 75 63 63 65 65 64 73 2e 20 20 54 68  ys succeeds.  Th
0e30: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f  is means that lo
0e40: 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f  cking does not o
0e50: 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a  ccur under.** DJ
0e60: 47 50 50 2e 20 20 42 75 74 20 69 74 20 69 73 20  GPP.  But it is 
0e70: 44 4f 53 20 2d 20 77 68 61 74 20 64 69 64 20 79  DOS - what did y
0e80: 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69  ou expect?.*/.#i
0e90: 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 23  fdef __DJGPP__.#
0ea0: 20 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 41 2c   define fcntl(A,
0eb0: 42 2c 43 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  B,C) 0.#endif../
0ec0: 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64 69  *.** The threadi
0ed0: 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65 73  d macro resolves
0ee0: 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d 69   to the thread-i
0ef0: 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65 64  d or to 0.  Used
0f00: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
0f10: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
0f20: 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ly..*/.#if SQLIT
0f30: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64 65  E_THREADSAFE.#de
0f40: 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 70 74  fine threadid pt
0f50: 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65 6c  hread_self().#el
0f60: 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61  se.#define threa
0f70: 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  did 0.#endif../*
0f80: 0a 2a 2a 20 53 65 74 20 6f 72 20 63 68 65 63 6b  .** Set or check
0f90: 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e 74 69   the unixFile.ti
0fa0: 64 20 66 69 65 6c 64 2e 20 20 54 68 69 73 20 66  d field.  This f
0fb0: 69 65 6c 64 20 69 73 20 73 65 74 20 77 68 65 6e  ield is set when
0fc0: 20 61 6e 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20   an unixFile.** 
0fd0: 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e  is first opened.
0fe0: 20 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74    All subsequent
0ff0: 20 75 73 65 73 20 6f 66 20 74 68 65 20 75 6e 69   uses of the uni
1000: 78 46 69 6c 65 20 76 65 72 69 66 79 20 74 68 61  xFile verify tha
1010: 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 74 68  t the.** same th
1020: 72 65 61 64 20 69 73 20 6f 70 65 72 61 74 69 6e  read is operatin
1030: 67 20 6f 6e 20 74 68 65 20 75 6e 69 78 46 69 6c  g on the unixFil
1040: 65 2e 20 20 53 6f 6d 65 20 6f 70 65 72 61 74 69  e.  Some operati
1050: 6e 67 20 73 79 73 74 65 6d 73 20 64 6f 0a 2a 2a  ng systems do.**
1060: 20 6e 6f 74 20 61 6c 6c 6f 77 20 6c 6f 63 6b 73   not allow locks
1070: 20 74 6f 20 62 65 20 6f 76 65 72 72 69 64 64 65   to be overridde
1080: 6e 20 62 79 20 6f 74 68 65 72 20 74 68 72 65 61  n by other threa
1090: 64 73 20 61 6e 64 20 74 68 61 74 20 72 65 73 74  ds and that rest
10a0: 72 69 63 74 69 6f 6e 0a 2a 2a 20 6d 65 61 6e 73  riction.** means
10b0: 20 74 68 61 74 20 73 71 6c 69 74 65 33 2a 20 64   that sqlite3* d
10c0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20  atabase handles 
10d0: 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 76 65 64 20  cannot be moved 
10e0: 66 72 6f 6d 20 6f 6e 65 20 74 68 72 65 61 64 0a  from one thread.
10f0: 2a 2a 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20  ** to another.  
1100: 54 68 69 73 20 6c 6f 67 69 63 20 6d 61 6b 65 73  This logic makes
1110: 20 73 75 72 65 20 61 20 75 73 65 72 20 64 6f 65   sure a user doe
1120: 73 20 6e 6f 74 20 74 72 79 20 74 6f 20 64 6f 20  s not try to do 
1130: 74 68 61 74 0a 2a 2a 20 62 79 20 6d 69 73 74 61  that.** by mista
1140: 6b 65 2e 0a 2a 2a 0a 2a 2a 20 56 65 72 73 69 6f  ke..**.** Versio
1150: 6e 20 33 2e 33 2e 31 20 28 32 30 30 36 2d 30 31  n 3.3.1 (2006-01
1160: 2d 31 35 29 3a 20 20 75 6e 69 78 46 69 6c 65 20  -15):  unixFile 
1170: 63 61 6e 20 62 65 20 6d 6f 76 65 64 20 66 72 6f  can be moved fro
1180: 6d 20 6f 6e 65 20 74 68 72 65 61 64 20 74 6f 0a  m one thread to.
1190: 2a 2a 20 61 6e 6f 74 68 65 72 20 61 73 20 6c 6f  ** another as lo
11a0: 6e 67 20 61 73 20 77 65 20 61 72 65 20 72 75 6e  ng as we are run
11b0: 6e 69 6e 67 20 6f 6e 20 61 20 73 79 73 74 65 6d  ning on a system
11c0: 20 74 68 61 74 20 73 75 70 70 6f 72 74 73 20 74   that supports t
11d0: 68 72 65 61 64 73 0a 2a 2a 20 6f 76 65 72 72 69  hreads.** overri
11e0: 64 69 6e 67 20 65 61 63 68 20 6f 74 68 65 72 73  ding each others
11f0: 20 6c 6f 63 6b 73 20 28 77 68 69 63 68 20 6e 6f   locks (which no
1200: 77 20 74 68 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f  w the most commo
1210: 6e 20 62 65 68 61 76 69 6f 72 29 0a 2a 2a 20 6f  n behavior).** o
1220: 72 20 69 66 20 6e 6f 20 6c 6f 63 6b 73 20 61 72  r if no locks ar
1230: 65 20 68 65 6c 64 2e 20 20 42 75 74 20 74 68 65  e held.  But the
1240: 20 75 6e 69 78 46 69 6c 65 2e 70 4c 6f 63 6b 20   unixFile.pLock 
1250: 66 69 65 6c 64 20 6e 65 65 64 73 20 74 6f 20 62  field needs to b
1260: 65 0a 2a 2a 20 72 65 63 6f 6d 70 75 74 65 64 20  e.** recomputed 
1270: 62 65 63 61 75 73 65 20 69 74 73 20 6b 65 79 20  because its key 
1280: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 74 68 72  includes the thr
1290: 65 61 64 2d 69 64 2e 20 20 53 65 65 20 74 68 65  ead-id.  See the
12a0: 20 0a 2a 2a 20 74 72 61 6e 73 66 65 72 4f 77 6e   .** transferOwn
12b0: 65 72 73 68 69 70 28 29 20 66 75 6e 63 74 69 6f  ership() functio
12c0: 6e 20 62 65 6c 6f 77 20 66 6f 72 20 61 64 64 69  n below for addi
12d0: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
12e0: 6f 6e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  on.*/.#if SQLITE
12f0: 5f 54 48 52 45 41 44 53 41 46 45 0a 23 20 64 65  _THREADSAFE.# de
1300: 66 69 6e 65 20 53 45 54 5f 54 48 52 45 41 44 49  fine SET_THREADI
1310: 44 28 58 29 20 20 20 28 58 29 2d 3e 74 69 64 20  D(X)   (X)->tid 
1320: 3d 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29  = pthread_self()
1330: 0a 23 20 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  .# define CHECK_
1340: 54 48 52 45 41 44 49 44 28 58 29 20 28 74 68 72  THREADID(X) (thr
1350: 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68  eadsOverrideEach
1360: 4f 74 68 65 72 73 4c 6f 63 6b 73 3d 3d 30 20 26  OthersLocks==0 &
1370: 26 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  & \.            
1380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1390: 21 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28 28  !pthread_equal((
13a0: 58 29 2d 3e 74 69 64 2c 20 70 74 68 72 65 61 64  X)->tid, pthread
13b0: 5f 73 65 6c 66 28 29 29 29 0a 23 65 6c 73 65 0a  _self())).#else.
13c0: 23 20 64 65 66 69 6e 65 20 53 45 54 5f 54 48 52  # define SET_THR
13d0: 45 41 44 49 44 28 58 29 0a 23 20 64 65 66 69 6e  EADID(X).# defin
13e0: 65 20 43 48 45 43 4b 5f 54 48 52 45 41 44 49 44  e CHECK_THREADID
13f0: 28 58 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (X) 0.#endif../*
1400: 0a 2a 2a 20 48 65 72 65 20 69 73 20 74 68 65 20  .** Here is the 
1410: 64 69 72 74 20 6f 6e 20 50 4f 53 49 58 20 61 64  dirt on POSIX ad
1420: 76 69 73 6f 72 79 20 6c 6f 63 6b 73 3a 20 20 41  visory locks:  A
1430: 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31 20 28  NSI STD 1003.1 (
1440: 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e  1996).** section
1450: 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34   6.5.2.2 lines 4
1460: 38 33 20 74 68 72 6f 75 67 68 20 34 39 30 20 73  83 through 490 s
1470: 70 65 63 69 66 79 20 74 68 61 74 20 77 68 65 6e  pecify that when
1480: 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65   a process.** se
1490: 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c  ts or clears a l
14a0: 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74  ock, that operat
14b0: 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e  ion overrides an
14c0: 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65  y prior locks se
14d0: 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65  t.** by the same
14e0: 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f   process.  It do
14f0: 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c  es not explicitl
1500: 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68  y say so, but th
1510: 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68  is implies.** th
1520: 61 74 20 69 74 20 6f 76 65 72 72 69 64 65 73 20  at it overrides 
1530: 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68 65  locks set by the
1540: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73   same process us
1550: 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a  ing a different.
1560: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
1570: 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68  or.  Consider th
1580: 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a  is test case:.**
1590: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64  .**       int fd
15a0: 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65  1 = open("./file
15b0: 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  1", O_RDWR|O_CRE
15c0: 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20  AT, 0644);.**   
15d0: 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70      int fd2 = op
15e0: 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f  en("./file2", O_
15f0: 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36  RDWR|O_CREAT, 06
1600: 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f  44);.**.** Suppo
1610: 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e  se ./file1 and .
1620: 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c  /file2 are reall
1630: 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  y the same file 
1640: 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20  (because.** one 
1650: 69 73 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d  is a hard or sym
1660: 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68  bolic link to th
1670: 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66  e other) then if
1680: 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65   you set.** an e
1690: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
16a0: 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74   fd1, then try t
16b0: 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69  o get an exclusi
16c0: 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64  ve lock.** on fd
16d0: 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20  2, it works.  I 
16e0: 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70 65 63  would have expec
16f0: 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c  ted the second l
1700: 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73  ock to.** fail s
1710: 69 6e 63 65 20 74 68 65 72 65 20 77 61 73 20 61  ince there was a
1720: 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e  lready a lock on
1730: 20 74 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f   the file due to
1740: 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74   fd1..** But not
1750: 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68   so.  Since both
1760: 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d   locks came from
1770: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
1780: 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64  s, the.** second
1790: 20 6f 76 65 72 72 69 64 65 73 20 74 68 65 20 66   overrides the f
17a0: 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67  irst, even thoug
17b0: 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64  h they were on d
17c0: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65  ifferent.** file
17d0: 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65   descriptors ope
17e0: 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74  ned on different
17f0: 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a   file names..**.
1800: 2a 2a 20 42 75 6d 6d 65 72 2e 20 20 49 66 20 79  ** Bummer.  If y
1810: 6f 75 20 61 73 6b 20 6d 65 2c 20 74 68 69 73 20  ou ask me, this 
1820: 69 73 20 62 72 6f 6b 65 6e 2e 20 20 42 61 64 6c  is broken.  Badl
1830: 79 20 62 72 6f 6b 65 6e 2e 20 20 49 74 20 6d 65  y broken.  It me
1840: 61 6e 73 0a 2a 2a 20 74 68 61 74 20 77 65 20 63  ans.** that we c
1850: 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49 58 20  annot use POSIX 
1860: 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f  locks to synchro
1870: 6e 69 7a 65 20 66 69 6c 65 20 61 63 63 65 73 73  nize file access
1880: 20 61 6d 6f 6e 67 0a 2a 2a 20 63 6f 6d 70 65 74   among.** compet
1890: 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66 20 74  ing threads of t
18a0: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e  he same process.
18b0: 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69    POSIX locks wi
18c0: 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20  ll work fine.** 
18d0: 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61  to synchronize a
18e0: 63 63 65 73 73 20 66 6f 72 20 74 68 72 65 61 64  ccess for thread
18f0: 73 20 69 6e 20 73 65 70 61 72 61 74 65 20 70 72  s in separate pr
1900: 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e 6f 74  ocesses, but not
1910: 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69 74 68  .** threads with
1920: 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  in the same proc
1930: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f  ess..**.** To wo
1940: 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 70 72  rk around the pr
1950: 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20 68 61  oblem, SQLite ha
1960: 73 20 74 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65  s to manage file
1970: 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c   locks internall
1980: 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e  y.** on its own.
1990: 20 20 57 68 65 6e 65 76 65 72 20 61 20 6e 65 77    Whenever a new
19a0: 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
19b0: 6e 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20  ned, we have to 
19c0: 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70 65 63  find the.** spec
19d0: 69 66 69 63 20 69 6e 6f 64 65 20 6f 66 20 74 68  ific inode of th
19e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
19f0: 28 74 68 65 20 69 6e 6f 64 65 20 69 73 20 64 65  (the inode is de
1a00: 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 0a  termined by the.
1a10: 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64 20 73 74  ** st_dev and st
1a20: 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66 20 74  _ino fields of t
1a30: 68 65 20 73 74 61 74 20 73 74 72 75 63 74 75 72  he stat structur
1a40: 65 20 74 68 61 74 20 66 73 74 61 74 28 29 20 66  e that fstat() f
1a50: 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20  ills in).** and 
1a60: 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20  check for locks 
1a70: 61 6c 72 65 61 64 79 20 65 78 69 73 74 69 6e 67  already existing
1a80: 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65 2e 20   on that inode. 
1a90: 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a   When locks are.
1aa0: 2a 2a 20 63 72 65 61 74 65 64 20 6f 72 20 72 65  ** created or re
1ab0: 6d 6f 76 65 64 2c 20 77 65 20 68 61 76 65 20 74  moved, we have t
1ac0: 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77  o look at our ow
1ad0: 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72  n internal recor
1ae0: 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b  d of the.** lock
1af0: 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74  s to see if anot
1b00: 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20 70  her thread has p
1b10: 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20 61 20  reviously set a 
1b20: 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d  lock on that sam
1b30: 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a  e.** inode..**.*
1b40: 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 66 69  * The sqlite3_fi
1b50: 6c 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  le structure for
1b60: 20 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e   POSIX is no lon
1b70: 67 65 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65  ger just an inte
1b80: 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  ger file.** desc
1b90: 72 69 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e  riptor.  It is n
1ba0: 6f 77 20 61 20 73 74 72 75 63 74 75 72 65 20 74  ow a structure t
1bb0: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e  hat holds the in
1bc0: 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65  teger file.** de
1bd0: 73 63 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70  scriptor and a p
1be0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75  ointer to a stru
1bf0: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
1c00: 69 62 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61  ibes the interna
1c10: 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  l.** locks on th
1c20: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
1c30: 69 6e 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73  inode.  There is
1c40: 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72   one locking str
1c50: 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e  ucture.** per in
1c60: 6f 64 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73  ode, so if the s
1c70: 61 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65  ame inode is ope
1c80: 6e 65 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20  ned twice, both 
1c90: 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
1ca0: 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20  res.** point to 
1cb0: 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67  the same locking
1cc0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
1cd0: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
1ce0: 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65  re keeps.** a re
1cf0: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73  ference count (s
1d00: 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77  o we will know w
1d10: 68 65 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74  hen to delete it
1d20: 29 20 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a  ) and a "cnt".**
1d30: 20 66 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c   field that tell
1d40: 73 20 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61  s us its interna
1d50: 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20  l lock status.  
1d60: 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65  cnt==0 means the
1d70: 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  .** file is unlo
1d80: 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d  cked.  cnt==-1 m
1d90: 65 61 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61  eans the file ha
1da0: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
1db0: 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65  ock..** cnt>0 me
1dc0: 61 6e 73 20 74 68 65 72 65 20 61 72 65 20 63 6e  ans there are cn
1dd0: 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f  t shared locks o
1de0: 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  n the file..**.*
1df0: 2a 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f  * Any attempt to
1e00: 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20   lock or unlock 
1e10: 61 20 66 69 6c 65 20 66 69 72 73 74 20 63 68 65  a file first che
1e20: 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a  cks the locking.
1e30: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  ** structure.  T
1e40: 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65  he fcntl() syste
1e50: 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69  m call is only i
1e60: 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20  nvoked to set a 
1e70: 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69  .** POSIX lock i
1e80: 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c  f the internal l
1e90: 6f 63 6b 20 73 74 72 75 63 74 75 72 65 20 74 72  ock structure tr
1ea0: 61 6e 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65  ansitions betwee
1eb0: 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e  n.** a locked an
1ec0: 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74  d an unlocked st
1ed0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 34 2d  ate..**.** 2004-
1ee0: 4a 61 6e 2d 31 31 3a 0a 2a 2a 20 4d 6f 72 65 20  Jan-11:.** More 
1ef0: 72 65 63 65 6e 74 20 64 69 73 63 6f 76 65 72 69  recent discoveri
1f00: 65 73 20 61 62 6f 75 74 20 50 4f 53 49 58 20 61  es about POSIX a
1f10: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 20 20  dvisory locks.  
1f20: 28 54 68 65 20 6d 6f 72 65 0a 2a 2a 20 49 20 64  (The more.** I d
1f30: 69 73 63 6f 76 65 72 2c 20 74 68 65 20 6d 6f 72  iscover, the mor
1f40: 65 20 49 20 72 65 61 6c 69 7a 65 20 74 68 65 20  e I realize the 
1f50: 61 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  a POSIX advisory
1f60: 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 61 6e   locks are.** an
1f70: 20 61 62 6f 6d 69 6e 61 74 69 6f 6e 2e 29 0a 2a   abomination.).*
1f80: 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73  *.** If you clos
1f90: 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  e a file descrip
1fa0: 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20  tor that points 
1fb0: 74 6f 20 61 20 66 69 6c 65 20 74 68 61 74 20 68  to a file that h
1fc0: 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c  as locks,.** all
1fd0: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20 66   locks on that f
1fe0: 69 6c 65 20 74 68 61 74 20 61 72 65 20 6f 77 6e  ile that are own
1ff0: 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  ed by the curren
2000: 74 20 70 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a  t process are.**
2010: 20 72 65 6c 65 61 73 65 64 2e 20 20 54 6f 20 77   released.  To w
2020: 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20  ork around this 
2030: 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e  problem, each un
2040: 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
2050: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 70   contains.** a p
2060: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 65  ointer to an ope
2070: 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 2e 20  nCnt structure. 
2080: 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6f 70   There is one op
2090: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 0a  enCnt structure.
20a0: 2a 2a 20 70 65 72 20 6f 70 65 6e 20 69 6e 6f 64  ** per open inod
20b0: 65 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74  e, which means t
20c0: 68 61 74 20 6d 75 6c 74 69 70 6c 65 20 75 6e 69  hat multiple uni
20d0: 78 46 69 6c 65 20 63 61 6e 20 70 6f 69 6e 74 20  xFile can point 
20e0: 74 6f 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 6f  to a single.** o
20f0: 70 65 6e 43 6e 74 2e 20 20 57 68 65 6e 20 61 6e  penCnt.  When an
2100: 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
2110: 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69   to close an uni
2120: 78 46 69 6c 65 2c 20 69 66 20 74 68 65 72 65 20  xFile, if there 
2130: 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69  are.** other uni
2140: 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68  xFile open on th
2150: 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 74 68 61  e same inode tha
2160: 74 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f  t are holding lo
2170: 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a  cks, the call.**
2180: 20 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65 20   to close() the 
2190: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
21a0: 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
21b0: 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63  l all of the loc
21c0: 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65  ks clear..** The
21d0: 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75   openCnt structu
21e0: 72 65 20 6b 65 65 70 73 20 61 20 6c 69 73 74 20  re keeps a list 
21f0: 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  of file descript
2200: 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ors that need to
2210: 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20 61 6e  .** be closed an
2220: 64 20 74 68 61 74 20 6c 69 73 74 20 69 73 20 77  d that list is w
2230: 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65 61 72  alked (and clear
2240: 65 64 29 20 77 68 65 6e 20 74 68 65 20 6c 61 73  ed) when the las
2250: 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73  t lock.** clears
2260: 2e 0a 2a 2a 0a 2a 2a 20 46 69 72 73 74 2c 20 75  ..**.** First, u
2270: 6e 64 65 72 20 4c 69 6e 75 78 20 74 68 72 65 61  nder Linux threa
2280: 64 73 2c 20 62 65 63 61 75 73 65 20 65 61 63 68  ds, because each
2290: 20 74 68 72 65 61 64 20 68 61 73 20 61 20 73 65   thread has a se
22a0: 70 61 72 61 74 65 0a 2a 2a 20 70 72 6f 63 65 73  parate.** proces
22b0: 73 20 49 44 2c 20 6c 6f 63 6b 20 6f 70 65 72 61  s ID, lock opera
22c0: 74 69 6f 6e 73 20 69 6e 20 6f 6e 65 20 74 68 72  tions in one thr
22d0: 65 61 64 20 64 6f 20 6e 6f 74 20 6f 76 65 72 72  ead do not overr
22e0: 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 74 6f 20  ide locks.** to 
22f0: 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 69 6e  the same file in
2300: 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 2e 20   other threads. 
2310: 20 4c 69 6e 75 78 20 74 68 72 65 61 64 73 20 62   Linux threads b
2320: 65 68 61 76 65 20 6c 69 6b 65 0a 2a 2a 20 73 65  ehave like.** se
2330: 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 65 73  parate processes
2340: 20 69 6e 20 74 68 69 73 20 72 65 73 70 65 63 74   in this respect
2350: 2e 20 20 42 75 74 2c 20 69 66 20 79 6f 75 20 63  .  But, if you c
2360: 6c 6f 73 65 20 61 20 66 69 6c 65 0a 2a 2a 20 64  lose a file.** d
2370: 65 73 63 72 69 70 74 6f 72 20 69 6e 20 6c 69 6e  escriptor in lin
2380: 75 78 20 74 68 72 65 61 64 73 2c 20 61 6c 6c 20  ux threads, all 
2390: 6c 6f 63 6b 73 20 61 72 65 20 63 6c 65 61 72 65  locks are cleare
23a0: 64 2c 20 65 76 65 6e 20 6c 6f 63 6b 73 0a 2a 2a  d, even locks.**
23b0: 20 6f 6e 20 6f 74 68 65 72 20 74 68 72 65 61 64   on other thread
23c0: 73 20 61 6e 64 20 65 76 65 6e 20 74 68 6f 75 67  s and even thoug
23d0: 68 20 74 68 65 20 6f 74 68 65 72 20 74 68 72 65  h the other thre
23e0: 61 64 73 20 68 61 76 65 20 64 69 66 66 65 72 65  ads have differe
23f0: 6e 74 0a 2a 2a 20 70 72 6f 63 65 73 73 20 49 44  nt.** process ID
2400: 73 2e 20 20 4c 69 6e 75 78 20 74 68 72 65 61 64  s.  Linux thread
2410: 73 20 69 73 20 69 6e 63 6f 6e 73 69 73 74 65 6e  s is inconsisten
2420: 74 20 69 6e 20 74 68 69 73 20 72 65 73 70 65 63  t in this respec
2430: 74 2e 0a 2a 2a 20 28 49 27 6d 20 62 65 67 69 6e  t..** (I'm begin
2440: 6e 69 6e 67 20 74 6f 20 74 68 69 6e 6b 20 74 68  ning to think th
2450: 61 74 20 6c 69 6e 75 78 20 74 68 72 65 61 64 73  at linux threads
2460: 20 69 73 20 61 6e 20 61 62 6f 6d 69 6e 61 74 69   is an abominati
2470: 6f 6e 20 74 6f 6f 2e 29 0a 2a 2a 20 54 68 65 20  on too.).** The 
2480: 63 6f 6e 73 65 71 75 65 6e 63 65 20 6f 66 20 74  consequence of t
2490: 68 69 73 20 61 6c 6c 20 69 73 20 74 68 61 74 20  his all is that 
24a0: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 66  the hash table f
24b0: 6f 72 20 74 68 65 20 6c 6f 63 6b 49 6e 66 6f 0a  or the lockInfo.
24c0: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 68 61 73  ** structure has
24d0: 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20   to include the 
24e0: 70 72 6f 63 65 73 73 20 69 64 20 61 73 20 70 61  process id as pa
24f0: 72 74 20 6f 66 20 69 74 73 20 6b 65 79 20 62 65  rt of its key be
2500: 63 61 75 73 65 0a 2a 2a 20 6c 6f 63 6b 73 20 69  cause.** locks i
2510: 6e 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65  n different thre
2520: 61 64 73 20 61 72 65 20 74 72 65 61 74 65 64 20  ads are treated 
2530: 61 73 20 64 69 73 74 69 6e 63 74 2e 20 20 42 75  as distinct.  Bu
2540: 74 20 74 68 65 20 0a 2a 2a 20 6f 70 65 6e 43 6e  t the .** openCn
2550: 74 20 73 74 72 75 63 74 75 72 65 20 73 68 6f 75  t structure shou
2560: 6c 64 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74  ld not include t
2570: 68 65 20 70 72 6f 63 65 73 73 20 69 64 20 69 6e  he process id in
2580: 20 69 74 73 0a 2a 2a 20 6b 65 79 20 62 65 63 61   its.** key beca
2590: 75 73 65 20 63 6c 6f 73 65 28 29 20 63 6c 65 61  use close() clea
25a0: 72 73 20 6c 6f 63 6b 20 6f 6e 20 61 6c 6c 20 74  rs lock on all t
25b0: 68 72 65 61 64 73 2c 20 6e 6f 74 20 6a 75 73 74  hreads, not just
25c0: 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
25d0: 74 68 72 65 61 64 2e 20 20 57 65 72 65 20 69 74  thread.  Were it
25e0: 20 6e 6f 74 20 66 6f 72 20 74 68 69 73 20 67 6f   not for this go
25f0: 6f 66 69 6e 65 73 73 20 69 6e 20 6c 69 6e 75 78  ofiness in linux
2600: 20 74 68 72 65 61 64 73 2c 20 77 65 20 63 6f 75   threads, we cou
2610: 6c 64 0a 2a 2a 20 63 6f 6d 62 69 6e 65 20 74 68  ld.** combine th
2620: 65 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 6f  e lockInfo and o
2630: 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65  penCnt structure
2640: 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  s into a single 
2650: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
2660: 20 32 30 30 34 2d 4a 75 6e 2d 32 38 3a 0a 2a 2a   2004-Jun-28:.**
2670: 20 4f 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e   On some version
2680: 73 20 6f 66 20 6c 69 6e 75 78 2c 20 74 68 72 65  s of linux, thre
2690: 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65  ads can override
26a0: 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63   each others loc
26b0: 6b 73 2e 0a 2a 2a 20 4f 6e 20 6f 74 68 65 72 73  ks..** On others
26c0: 20 6e 6f 74 2e 20 20 53 6f 6d 65 74 69 6d 65 73   not.  Sometimes
26d0: 20 79 6f 75 20 63 61 6e 20 63 68 61 6e 67 65 20   you can change 
26e0: 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 6e 20  the behavior on 
26f0: 74 68 65 20 73 61 6d 65 0a 2a 2a 20 73 79 73 74  the same.** syst
2700: 65 6d 20 62 79 20 73 65 74 74 69 6e 67 20 74 68  em by setting th
2710: 65 20 4c 44 5f 41 53 53 55 4d 45 5f 4b 45 52 4e  e LD_ASSUME_KERN
2720: 45 4c 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76  EL environment v
2730: 61 72 69 61 62 6c 65 2e 20 20 54 68 65 0a 2a 2a  ariable.  The.**
2740: 20 50 4f 53 49 58 20 73 74 61 6e 64 61 72 64 20   POSIX standard 
2750: 69 73 20 73 69 6c 65 6e 74 20 61 73 20 74 6f 20  is silent as to 
2760: 77 68 69 63 68 20 62 65 68 61 76 69 6f 72 20 69  which behavior i
2770: 73 20 63 6f 72 72 65 63 74 2c 20 61 73 20 66 61  s correct, as fa
2780: 72 0a 2a 2a 20 61 73 20 49 20 63 61 6e 20 74 65  r.** as I can te
2790: 6c 6c 2c 20 73 6f 20 6f 74 68 65 72 20 76 65 72  ll, so other ver
27a0: 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78 20 6d 69  sions of unix mi
27b0: 67 68 74 20 73 68 6f 77 20 74 68 65 20 73 61 6d  ght show the sam
27c0: 65 0a 2a 2a 20 69 6e 63 6f 6e 73 69 73 74 65 6e  e.** inconsisten
27d0: 63 79 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  cy.  There is no
27e0: 20 6c 69 74 74 6c 65 20 64 6f 75 62 74 20 69 6e   little doubt in
27f0: 20 6d 79 20 6d 69 6e 64 20 74 68 61 74 20 70 6f   my mind that po
2800: 73 69 78 0a 2a 2a 20 61 64 76 69 73 6f 72 79 20  six.** advisory 
2810: 6c 6f 63 6b 73 20 61 6e 64 20 6c 69 6e 75 78 20  locks and linux 
2820: 74 68 72 65 61 64 73 20 61 72 65 20 70 72 6f 66  threads are prof
2830: 6f 75 6e 64 6c 79 20 62 72 6f 6b 65 6e 2e 0a 2a  oundly broken..*
2840: 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f  *.** To work aro
2850: 75 6e 64 20 74 68 65 20 69 6e 63 6f 6e 73 69 73  und the inconsis
2860: 74 65 6e 63 69 65 73 2c 20 77 65 20 68 61 76 65  tencies, we have
2870: 20 74 6f 20 74 65 73 74 20 61 74 20 72 75 6e 74   to test at runt
2880: 69 6d 65 20 0a 2a 2a 20 77 68 65 74 68 65 72 20  ime .** whether 
2890: 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 73 20 63  or not threads c
28a0: 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63 68  an override each
28b0: 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 20 20   others locks.  
28c0: 54 68 69 73 20 74 65 73 74 0a 2a 2a 20 69 73 20  This test.** is 
28d0: 72 75 6e 20 6f 6e 63 65 2c 20 74 68 65 20 66 69  run once, the fi
28e0: 72 73 74 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63  rst time any loc
28f0: 6b 20 69 73 20 61 74 74 65 6d 70 74 65 64 2e 20  k is attempted. 
2900: 20 41 20 73 74 61 74 69 63 20 0a 2a 2a 20 76 61   A static .** va
2910: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
2920: 20 72 65 63 6f 72 64 20 74 68 65 20 72 65 73 75   record the resu
2930: 6c 74 73 20 6f 66 20 74 68 69 73 20 74 65 73 74  lts of this test
2940: 20 66 6f 72 20 66 75 74 75 72 65 0a 2a 2a 20 75   for future.** u
2950: 73 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e  se..*/../*.** An
2960: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
2970: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
2980: 74 75 72 65 20 73 65 72 76 65 73 20 61 73 20 74  ture serves as t
2990: 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74  he key used.** t
29a0: 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69  o locate a parti
29b0: 63 75 6c 61 72 20 6c 6f 63 6b 49 6e 66 6f 20 73  cular lockInfo s
29c0: 74 72 75 63 74 75 72 65 20 67 69 76 65 6e 20 69  tructure given i
29d0: 74 73 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ts inode..**.** 
29e0: 49 66 20 74 68 72 65 61 64 73 20 63 61 6e 6e 6f  If threads canno
29f0: 74 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20  t override each 
2a00: 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2c 20 74 68  others locks, th
2a10: 65 6e 20 77 65 20 73 65 74 20 74 68 65 0a 2a 2a  en we set the.**
2a20: 20 6c 6f 63 6b 4b 65 79 2e 74 69 64 20 66 69 65   lockKey.tid fie
2a30: 6c 64 20 74 6f 20 74 68 65 20 74 68 72 65 61 64  ld to the thread
2a40: 20 49 44 2e 20 20 49 66 20 74 68 72 65 61 64 73   ID.  If threads
2a50: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 0a 2a 2a   can override.**
2a60: 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63   each others loc
2a70: 6b 73 20 74 68 65 6e 20 74 69 64 20 69 73 20 61  ks then tid is a
2a80: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 7a 65 72  lways set to zer
2a90: 6f 2e 20 20 74 69 64 20 69 73 20 6f 6d 69 74 74  o.  tid is omitt
2aa0: 65 64 0a 2a 2a 20 69 66 20 77 65 20 63 6f 6d 70  ed.** if we comp
2ab0: 69 6c 65 20 77 69 74 68 6f 75 74 20 74 68 72 65  ile without thre
2ac0: 61 64 69 6e 67 20 73 75 70 70 6f 72 74 2e 0a 2a  ading support..*
2ad0: 2f 0a 73 74 72 75 63 74 20 6c 6f 63 6b 4b 65 79  /.struct lockKey
2ae0: 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20   {.  dev_t dev; 
2af0: 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20        /* Device 
2b00: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 6f 5f  number */.  ino_
2b10: 74 20 69 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20  t ino;       /* 
2b20: 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  Inode number */.
2b30: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
2b40: 44 53 41 46 45 0a 20 20 70 74 68 72 65 61 64 5f  DSAFE.  pthread_
2b50: 74 20 74 69 64 3b 20 20 20 2f 2a 20 54 68 72 65  t tid;   /* Thre
2b60: 61 64 20 49 44 20 6f 72 20 7a 65 72 6f 20 69 66  ad ID or zero if
2b70: 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65   threads can ove
2b80: 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72  rride each other
2b90: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
2ba0: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
2bb0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2bc0: 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  g structure is a
2bd0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63  llocated for eac
2be0: 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 20  h open.** inode 
2bf0: 6f 6e 20 65 61 63 68 20 74 68 72 65 61 64 20 77  on each thread w
2c00: 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20  ith a different 
2c10: 70 72 6f 63 65 73 73 20 49 44 2e 20 20 28 54 68  process ID.  (Th
2c20: 72 65 61 64 73 20 68 61 76 65 0a 2a 2a 20 64 69  reads have.** di
2c30: 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 20  fferent process 
2c40: 49 44 73 20 6f 6e 20 6c 69 6e 75 78 2c 20 62 75  IDs on linux, bu
2c50: 74 20 6e 6f 74 20 6f 6e 20 6d 6f 73 74 20 6f 74  t not on most ot
2c60: 68 65 72 20 75 6e 69 78 65 73 2e 29 0a 2a 2a 0a  her unixes.).**.
2c70: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64  ** A single inod
2c80: 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69  e can have multi
2c90: 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ple file descrip
2ca0: 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20 75 6e  tors, so each un
2cb0: 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  ixFile.** struct
2cc0: 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  ure contains a p
2cd0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73  ointer to an ins
2ce0: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
2cf0: 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a  ject and this.**
2d00: 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20   object keeps a 
2d10: 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  count of the num
2d20: 62 65 72 20 6f 66 20 75 6e 69 78 46 69 6c 65 20  ber of unixFile 
2d30: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a  pointing to it..
2d40: 2a 2f 0a 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e  */.struct lockIn
2d50: 66 6f 20 7b 0a 20 20 73 74 72 75 63 74 20 6c 6f  fo {.  struct lo
2d60: 63 6b 4b 65 79 20 6b 65 79 3b 20 20 2f 2a 20 54  ckKey key;  /* T
2d70: 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f  he lookup key */
2d80: 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20  .  int cnt;     
2d90: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2da0: 72 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63 6b  r of SHARED lock
2db0: 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20  s held */.  int 
2dc0: 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20  locktype;       
2dd0: 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52 45   /* One of SHARE
2de0: 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
2df0: 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20  _LOCK etc. */.  
2e00: 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
2e10: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2e20: 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  f pointers to th
2e30: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
2e40: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  };../*.** An ins
2e50: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
2e60: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
2e70: 20 73 65 72 76 65 73 20 61 73 20 74 68 65 20 6b   serves as the k
2e80: 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f  ey used.** to lo
2e90: 63 61 74 65 20 61 20 70 61 72 74 69 63 75 6c 61  cate a particula
2ea0: 72 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74  r openCnt struct
2eb0: 75 72 65 20 67 69 76 65 6e 20 69 74 73 20 69 6e  ure given its in
2ec0: 6f 64 65 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73  ode.  This.** is
2ed0: 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
2ee0: 20 6c 6f 63 6b 4b 65 79 20 65 78 63 65 70 74 20   lockKey except 
2ef0: 74 68 61 74 20 74 68 65 20 74 68 72 65 61 64 20  that the thread 
2f00: 49 44 20 69 73 20 6f 6d 69 74 74 65 64 2e 0a 2a  ID is omitted..*
2f10: 2f 0a 73 74 72 75 63 74 20 6f 70 65 6e 4b 65 79  /.struct openKey
2f20: 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20   {.  dev_t dev; 
2f30: 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62    /* Device numb
2f40: 65 72 20 2a 2f 0a 20 20 69 6e 6f 5f 74 20 69 6e  er */.  ino_t in
2f50: 6f 3b 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75  o;   /* Inode nu
2f60: 6d 62 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  mber */.};../*.*
2f70: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
2f80: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
2f90: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
2fa0: 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f  cated for each o
2fb0: 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 54  pen.** inode.  T
2fc0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 6b 65  his structure ke
2fd0: 65 70 73 20 74 72 61 63 6b 20 6f 66 20 74 68 65  eps track of the
2fe0: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   number of locks
2ff0: 20 6f 6e 20 74 68 61 74 0a 2a 2a 20 69 6e 6f 64   on that.** inod
3000: 65 2e 20 20 49 66 20 61 20 63 6c 6f 73 65 20 69  e.  If a close i
3010: 73 20 61 74 74 65 6d 70 74 65 64 20 61 67 61 69  s attempted agai
3020: 6e 73 74 20 61 6e 20 69 6e 6f 64 65 20 74 68 61  nst an inode tha
3030: 74 20 69 73 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20  t is holding.** 
3040: 6c 6f 63 6b 73 2c 20 74 68 65 20 63 6c 6f 73 65  locks, the close
3050: 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74   is deferred unt
3060: 69 6c 20 61 6c 6c 20 6c 6f 63 6b 73 20 63 6c 65  il all locks cle
3070: 61 72 20 62 79 20 61 64 64 69 6e 67 20 74 68 65  ar by adding the
3080: 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70  .** file descrip
3090: 74 6f 72 20 74 6f 20 62 65 20 63 6c 6f 73 65 64  tor to be closed
30a0: 20 74 6f 20 74 68 65 20 70 65 6e 64 69 6e 67 20   to the pending 
30b0: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  list..*/.struct 
30c0: 6f 70 65 6e 43 6e 74 20 7b 0a 20 20 73 74 72 75  openCnt {.  stru
30d0: 63 74 20 6f 70 65 6e 4b 65 79 20 6b 65 79 3b 20  ct openKey key; 
30e0: 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20    /* The lookup 
30f0: 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  key */.  int nRe
3100: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
3110: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e  * Number of poin
3120: 74 65 72 73 20 74 6f 20 74 68 69 73 20 73 74 72  ters to this str
3130: 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ucture */.  int 
3140: 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  nLock;          
3150: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
3160: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
3170: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69   */.  int nPendi
3180: 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ng;         /* N
3190: 75 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67  umber of pending
31a0: 20 63 6c 6f 73 65 28 29 20 6f 70 65 72 61 74 69   close() operati
31b0: 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50  ons */.  int *aP
31c0: 65 6e 64 69 6e 67 3b 20 20 20 20 20 20 20 20 2f  ending;        /
31d0: 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 70 61 63 65  * Malloced space
31e0: 20 68 6f 6c 64 69 6e 67 20 66 64 27 73 20 61 77   holding fd's aw
31f0: 61 69 74 69 6e 67 20 61 20 63 6c 6f 73 65 28 29  aiting a close()
3200: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54   */.};../* .** T
3210: 68 65 73 65 20 68 61 73 68 20 74 61 62 6c 65 73  hese hash tables
3220: 20 6d 61 70 20 69 6e 6f 64 65 73 20 61 6e 64 20   map inodes and 
3230: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
3240: 20 28 72 65 61 6c 6c 79 2c 20 6c 6f 63 6b 4b 65   (really, lockKe
3250: 79 20 61 6e 64 0a 2a 2a 20 6f 70 65 6e 4b 65 79  y and.** openKey
3260: 20 73 74 72 75 63 74 75 72 65 73 29 20 69 6e 74   structures) int
3270: 6f 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 6f  o lockInfo and o
3280: 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65  penCnt structure
3290: 73 2e 20 20 41 63 63 65 73 73 20 74 6f 20 0a 2a  s.  Access to .*
32a0: 2a 20 74 68 65 73 65 20 68 61 73 68 20 74 61 62  * these hash tab
32b0: 6c 65 73 20 6d 75 73 74 20 62 65 20 70 72 6f 74  les must be prot
32c0: 65 63 74 65 64 20 62 79 20 61 20 6d 75 74 65 78  ected by a mutex
32d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 48 61 73 68  ..*/.static Hash
32e0: 20 6c 6f 63 6b 48 61 73 68 20 3d 20 7b 53 51 4c   lockHash = {SQL
32f0: 49 54 45 5f 48 41 53 48 5f 42 49 4e 41 52 59 2c  ITE_HASH_BINARY,
3300: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 7d 3b   0, 0, 0, 0, 0};
3310: 0a 73 74 61 74 69 63 20 48 61 73 68 20 6f 70 65  .static Hash ope
3320: 6e 48 61 73 68 20 3d 20 7b 53 51 4c 49 54 45 5f  nHash = {SQLITE_
3330: 48 41 53 48 5f 42 49 4e 41 52 59 2c 20 30 2c 20  HASH_BINARY, 0, 
3340: 30 2c 20 30 2c 20 30 2c 20 30 7d 3b 0a 0a 23 69  0, 0, 0, 0};..#i
3350: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
3360: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
3370: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6c 6f 63 6b 69  ./*.** The locki
3380: 6e 67 20 73 74 79 6c 65 73 20 61 72 65 20 61 73  ng styles are as
3390: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
33a0: 65 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  e different file
33b0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 61 70 61   locking.** capa
33c0: 62 69 6c 69 74 69 65 73 20 73 75 70 70 6f 72 74  bilities support
33d0: 65 64 20 62 79 20 64 69 66 66 65 72 65 6e 74 20  ed by different 
33e0: 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 20 20 0a  file systems.  .
33f0: 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b  **.** POSIX lock
3400: 69 6e 67 20 73 74 79 6c 65 20 66 75 6c 6c 79 20  ing style fully 
3410: 73 75 70 70 6f 72 74 73 20 73 68 61 72 65 64 20  supports shared 
3420: 61 6e 64 20 65 78 63 6c 75 73 69 76 65 20 62 79  and exclusive by
3430: 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 0a  te-range locks .
3440: 2a 2a 20 41 44 50 20 6c 6f 63 6b 69 6e 67 20 6f  ** ADP locking o
3450: 6e 6c 79 20 73 75 70 70 6f 72 74 73 20 65 78 63  nly supports exc
3460: 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67  lusive byte-rang
3470: 65 20 6c 6f 63 6b 73 0a 2a 2a 20 46 4c 4f 43 4b  e locks.** FLOCK
3480: 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 73 20 61   only supports a
3490: 20 73 69 6e 67 6c 65 20 66 69 6c 65 2d 67 6c 6f   single file-glo
34a0: 62 61 6c 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  bal exclusive lo
34b0: 63 6b 0a 2a 2a 20 44 4f 54 4c 4f 43 4b 20 69 73  ck.** DOTLOCK is
34c0: 6e 27 74 20 61 20 74 72 75 65 20 6c 6f 63 6b 69  n't a true locki
34d0: 6e 67 20 73 74 79 6c 65 2c 20 69 74 20 72 65 66  ng style, it ref
34e0: 65 72 73 20 74 6f 20 74 68 65 20 75 73 65 20 6f  ers to the use o
34f0: 66 20 61 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20  f a special.**  
3500: 20 66 69 6c 65 20 6e 61 6d 65 64 20 74 68 65 20   file named the 
3510: 73 61 6d 65 20 61 73 20 74 68 65 20 64 61 74 61  same as the data
3520: 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 20 61  base file with a
3530: 20 27 2e 6c 6f 63 6b 27 20 65 78 74 65 6e 73 69   '.lock' extensi
3540: 6f 6e 2c 20 74 68 69 73 0a 2a 2a 20 20 20 63 61  on, this.**   ca
3550: 6e 20 62 65 20 75 73 65 64 20 6f 6e 20 66 69 6c  n be used on fil
3560: 65 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 64  e systems that d
3570: 6f 20 6e 6f 74 20 6f 66 66 65 72 20 61 6e 79 20  o not offer any 
3580: 72 65 6c 69 61 62 6c 65 20 66 69 6c 65 20 6c 6f  reliable file lo
3590: 63 6b 69 6e 67 0a 2a 2a 20 4e 4f 20 6c 6f 63 6b  cking.** NO lock
35a0: 69 6e 67 20 6d 65 61 6e 73 20 74 68 61 74 20 6e  ing means that n
35b0: 6f 20 6c 6f 63 6b 69 6e 67 20 77 69 6c 6c 20 62  o locking will b
35c0: 65 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69  e attempted, thi
35d0: 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66  s is only used f
35e0: 6f 72 0a 2a 2a 20 20 20 72 65 61 64 2d 6f 6e 6c  or.**   read-onl
35f0: 79 20 66 69 6c 65 20 73 79 73 74 65 6d 73 20 63  y file systems c
3600: 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 55 4e 53 55  urrently.** UNSU
3610: 50 50 4f 52 54 45 44 20 6d 65 61 6e 73 20 74 68  PPORTED means th
3620: 61 74 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 77 69  at no locking wi
3630: 6c 6c 20 62 65 20 61 74 74 65 6d 70 74 65 64 2c  ll be attempted,
3640: 20 74 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73   this is only us
3650: 65 64 20 66 6f 72 0a 2a 2a 20 20 20 66 69 6c 65  ed for.**   file
3660: 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 61 72   systems that ar
3670: 65 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 75 6e  e known to be un
3680: 73 75 70 70 6f 72 74 65 64 0a 2a 2f 0a 74 79 70  supported.*/.typ
3690: 65 64 65 66 20 65 6e 75 6d 20 7b 0a 20 20 20 20  edef enum {.    
36a0: 20 20 20 20 70 6f 73 69 78 4c 6f 63 6b 69 6e 67      posixLocking
36b0: 53 74 79 6c 65 20 3d 20 30 2c 20 20 20 20 20 20  Style = 0,      
36c0: 20 2f 2a 20 73 74 61 6e 64 61 72 64 20 70 6f 73   /* standard pos
36d0: 69 78 2d 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ix-advisory lock
36e0: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 66 70  s */.        afp
36f0: 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 2c 20 20 20  LockingStyle,   
3700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 75 73 65            /* use
3710: 20 61 66 70 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20   afp locks */.  
3720: 20 20 20 20 20 20 66 6c 6f 63 6b 4c 6f 63 6b 69        flockLocki
3730: 6e 67 53 74 79 6c 65 2c 20 20 20 20 20 20 20 20  ngStyle,        
3740: 20 20 20 2f 2a 20 75 73 65 20 66 6c 6f 63 6b 28     /* use flock(
3750: 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 64 6f 74  ) */.        dot
3760: 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  lockLockingStyle
3770: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 75 73 65  ,         /* use
3780: 20 3c 66 69 6c 65 3e 2e 6c 6f 63 6b 20 66 69 6c   <file>.lock fil
3790: 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 6f  es */.        no
37a0: 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 2c 20 20 20  LockingStyle,   
37b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 75 73             /* us
37c0: 65 66 75 6c 20 66 6f 72 20 72 65 61 64 2d 6f 6e  eful for read-on
37d0: 6c 79 20 66 69 6c 65 20 73 79 73 74 65 6d 20 2a  ly file system *
37e0: 2f 0a 20 20 20 20 20 20 20 20 75 6e 73 75 70 70  /.        unsupp
37f0: 6f 72 74 65 64 4c 6f 63 6b 69 6e 67 53 74 79 6c  ortedLockingStyl
3800: 65 20 20 20 20 20 20 2f 2a 20 69 6e 64 69 63 61  e      /* indica
3810: 74 65 73 20 75 6e 73 75 70 70 6f 72 74 65 64 20  tes unsupported 
3820: 66 69 6c 65 20 73 79 73 74 65 6d 20 2a 2f 0a 7d  file system */.}
3830: 20 73 71 6c 69 74 65 33 4c 6f 63 6b 69 6e 67 53   sqlite3LockingS
3840: 74 79 6c 65 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  tyle;.#endif /* 
3850: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
3860: 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a  CKING_STYLE */..
3870: 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
3880: 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e  ctions to obtain
3890: 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20   and relinquish 
38a0: 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
38b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
38c0: 20 65 6e 74 65 72 4d 75 74 65 78 28 29 7b 0a 20   enterMutex(){. 
38d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
38e0: 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d 75 74  nter(sqlite3_mut
38f0: 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
3900: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
3910: 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20  TER));.}.static 
3920: 76 6f 69 64 20 6c 65 61 76 65 4d 75 74 65 78 28  void leaveMutex(
3930: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
3940: 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33  ex_leave(sqlite3
3950: 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
3960: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
3970: 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 0a 23 69  _MASTER));.}..#i
3980: 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  f SQLITE_THREADS
3990: 41 46 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  AFE./*.** This v
39a0: 61 72 69 61 62 6c 65 20 72 65 63 6f 72 64 73 20  ariable records 
39b0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
39c0: 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72  hreads can overr
39d0: 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 0a  ide each others.
39e0: 2a 2a 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  ** locks..**.** 
39f0: 20 20 20 30 3a 20 20 4e 6f 2e 20 20 54 68 72 65     0:  No.  Thre
3a00: 61 64 73 20 63 61 6e 6e 6f 74 20 6f 76 65 72 72  ads cannot overr
3a10: 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20  ide each others 
3a20: 6c 6f 63 6b 73 2e 0a 2a 2a 20 20 20 20 31 3a 20  locks..**    1: 
3a30: 20 59 65 73 2e 20 20 54 68 72 65 61 64 73 20 63   Yes.  Threads c
3a40: 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63 68  an override each
3a50: 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a   others locks..*
3a60: 2a 20 20 20 2d 31 3a 20 20 57 65 20 64 6f 6e 27  *   -1:  We don'
3a70: 74 20 6b 6e 6f 77 20 79 65 74 2e 0a 2a 2a 0a 2a  t know yet..**.*
3a80: 2a 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  * On some system
3a90: 73 2c 20 77 65 20 6b 6e 6f 77 20 61 74 20 63 6f  s, we know at co
3aa0: 6d 70 69 6c 65 2d 74 69 6d 65 20 69 66 20 74 68  mpile-time if th
3ab0: 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69  reads can overri
3ac0: 64 65 20 65 61 63 68 0a 2a 2a 20 6f 74 68 65 72  de each.** other
3ad0: 73 20 6c 6f 63 6b 73 2e 20 20 4f 6e 20 74 68 6f  s locks.  On tho
3ae0: 73 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65 20  se systems, the 
3af0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56  SQLITE_THREAD_OV
3b00: 45 52 52 49 44 45 5f 4c 4f 43 4b 20 6d 61 63 72  ERRIDE_LOCK macr
3b10: 6f 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 73 65 74  o.** will be set
3b20: 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20   appropriately. 
3b30: 20 4f 6e 20 6f 74 68 65 72 20 73 79 73 74 65 6d   On other system
3b40: 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20 63 68  s, we have to ch
3b50: 65 63 6b 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d  eck at.** runtim
3b60: 65 2e 20 20 4f 6e 20 74 68 65 73 65 20 6c 61 74  e.  On these lat
3b70: 74 65 72 20 73 79 73 74 65 6d 73 2c 20 53 51 4c  ter systems, SQL
3b80: 54 49 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52  TIE_THREAD_OVERR
3b90: 49 44 45 5f 4c 4f 43 4b 20 69 73 0a 2a 2a 20 75  IDE_LOCK is.** u
3ba0: 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  ndefined..**.** 
3bb0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 6e 6f  This variable no
3bc0: 72 6d 61 6c 6c 79 20 68 61 73 20 66 69 6c 65 20  rmally has file 
3bd0: 73 63 6f 70 65 20 6f 6e 6c 79 2e 20 20 42 75 74  scope only.  But
3be0: 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2c   during testing,
3bf0: 20 77 65 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 61   we make.** it a
3c00: 20 67 6c 6f 62 61 6c 20 73 6f 20 74 68 61 74 20   global so that 
3c10: 74 68 65 20 74 65 73 74 20 63 6f 64 65 20 63 61  the test code ca
3c20: 6e 20 63 68 61 6e 67 65 20 69 74 73 20 76 61 6c  n change its val
3c30: 75 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 76  ue in order to v
3c40: 65 72 69 66 79 0a 2a 2a 20 74 68 61 74 20 74 68  erify.** that th
3c50: 65 20 72 69 67 68 74 20 73 74 75 66 66 20 68 61  e right stuff ha
3c60: 70 70 65 6e 73 20 69 6e 20 65 69 74 68 65 72 20  ppens in either 
3c70: 63 61 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  case..*/.#ifndef
3c80: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f   SQLITE_THREAD_O
3c90: 56 45 52 52 49 44 45 5f 4c 4f 43 4b 0a 23 20 64  VERRIDE_LOCK.# d
3ca0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 48 52  efine SQLITE_THR
3cb0: 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43  EAD_OVERRIDE_LOC
3cc0: 4b 20 2d 31 0a 23 65 6e 64 69 66 0a 23 69 66 64  K -1.#endif.#ifd
3cd0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
3ce0: 6e 74 20 74 68 72 65 61 64 73 4f 76 65 72 72 69  nt threadsOverri
3cf0: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
3d00: 73 20 3d 20 53 51 4c 49 54 45 5f 54 48 52 45 41  s = SQLITE_THREA
3d10: 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 3b  D_OVERRIDE_LOCK;
3d20: 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20 69 6e  .#else.static in
3d30: 74 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64  t threadsOverrid
3d40: 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73  eEachOthersLocks
3d50: 20 3d 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44   = SQLITE_THREAD
3d60: 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a  _OVERRIDE_LOCK;.
3d70: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
3d80: 69 73 20 73 74 72 75 63 74 75 72 65 20 68 6f 6c  is structure hol
3d90: 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70  ds information p
3da0: 61 73 73 65 64 20 69 6e 74 6f 20 69 6e 64 69 76  assed into indiv
3db0: 69 64 75 61 6c 20 74 65 73 74 0a 2a 2a 20 74 68  idual test.** th
3dc0: 72 65 61 64 73 20 62 79 20 74 68 65 20 74 65 73  reads by the tes
3dd0: 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65  tThreadLockingBe
3de0: 68 61 76 69 6f 72 28 29 20 72 6f 75 74 69 6e 65  havior() routine
3df0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 74 68 72 65  ..*/.struct thre
3e00: 61 64 54 65 73 74 44 61 74 61 20 7b 0a 20 20 69  adTestData {.  i
3e10: 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20  nt fd;          
3e20: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f        /* File to
3e30: 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20   be locked */.  
3e40: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
3e50: 6b 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f  k;     /* The lo
3e60: 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20  cking operation 
3e70: 2a 2f 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 3b  */.  int result;
3e80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
3e90: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6c 6f 63  esult of the loc
3ea0: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 2a  king operation *
3eb0: 2f 0a 7d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  /.};..#ifdef SQL
3ec0: 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f  ITE_LOCK_TRACE./
3ed0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20 69  *.** Print out i
3ee0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
3ef0: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70 65   all locking ope
3f00: 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54  rations..**.** T
3f10: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
3f20: 73 65 64 20 66 6f 72 20 74 72 6f 75 62 6c 65 73  sed for troubles
3f30: 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e  hooting locks on
3f40: 20 6d 75 6c 74 69 74 68 72 65 61 64 65 64 0a 2a   multithreaded.*
3f50: 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45 6e  * platforms.  En
3f60: 61 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e  able by compilin
3f70: 67 20 77 69 74 68 20 74 68 65 20 2d 44 53 51 4c  g with the -DSQL
3f80: 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a  ITE_LOCK_TRACE.*
3f90: 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f  * command-line o
3fa0: 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 6d  ption on the com
3fb0: 70 69 6c 65 72 2e 20 20 54 68 69 73 20 63 6f 64  piler.  This cod
3fc0: 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a  e is normally.**
3fd0: 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a   turned off..*/.
3fe0: 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54  static int lockT
3ff0: 72 61 63 65 28 69 6e 74 20 66 64 2c 20 69 6e 74  race(int fd, int
4000: 20 6f 70 2c 20 73 74 72 75 63 74 20 66 6c 6f 63   op, struct floc
4010: 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  k *p){.  char *z
4020: 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a  OpName, *zType;.
4030: 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20 73    int s;.  int s
4040: 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66 28  avedErrno;.  if(
4050: 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a   op==F_GETLK ){.
4060: 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 47      zOpName = "G
4070: 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69  ETLK";.  }else i
4080: 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 29  f( op==F_SETLK )
4090: 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20  {.    zOpName = 
40a0: 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65  "SETLK";.  }else
40b0: 7b 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28  {.    s = fcntl(
40c0: 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20  fd, op, p);.    
40d0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
40e0: 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77  tf("fcntl unknow
40f0: 6e 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 66  n %d %d %d\n", f
4100: 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72  d, op, s);.    r
4110: 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69  eturn s;.  }.  i
4120: 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  f( p->l_type==F_
4130: 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79  RDLCK ){.    zTy
4140: 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20  pe = "RDLCK";.  
4150: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74  }else if( p->l_t
4160: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a  ype==F_WRLCK ){.
4170: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c      zType = "WRL
4180: 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CK";.  }else if(
4190: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e   p->l_type==F_UN
41a0: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
41b0: 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65   = "UNLCK";.  }e
41c0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
41d0: 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65   0 );.  }.  asse
41e0: 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d  rt( p->l_whence=
41f0: 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73  =SEEK_SET );.  s
4200: 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20 6f 70 2c   = fcntl(fd, op,
4210: 20 70 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e   p);.  savedErrn
4220: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c  o = errno;.  sql
4230: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
4240: 22 66 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20  "fcntl %d %d %s 
4250: 25 73 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e  %s %d %d %d %d\n
4260: 22 2c 0a 20 20 20 20 20 74 68 72 65 61 64 69 64  ",.     threadid
4270: 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a  , fd, zOpName, z
4280: 54 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f  Type, (int)p->l_
4290: 73 74 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c  start, (int)p->l
42a0: 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29  _len,.     (int)
42b0: 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20  p->l_pid, s);.  
42c0: 69 66 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f  if( s==(-1) && o
42d0: 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70  p==F_SETLK && (p
42e0: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  ->l_type==F_RDLC
42f0: 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d  K || p->l_type==
4300: 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20  F_WRLCK) ){.    
4310: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b  struct flock l2;
4320: 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20  .    l2 = *p;.  
4330: 20 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45    fcntl(fd, F_GE
4340: 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69  TLK, &l2);.    i
4350: 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f  f( l2.l_type==F_
4360: 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a  RDLCK ){.      z
4370: 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a  Type = "RDLCK";.
4380: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32      }else if( l2
4390: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  .l_type==F_WRLCK
43a0: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
43b0: 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "WRLCK";.    }
43c0: 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79  else if( l2.l_ty
43d0: 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
43e0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e       zType = "UN
43f0: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LCK";.    }else{
4400: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30  .      assert( 0
4410: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
4420: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
4430: 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d  ("fcntl-failure-
4440: 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64  reason: %s %d %d
4450: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a   %d\n",.       z
4460: 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  Type, (int)l2.l_
4470: 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c  start, (int)l2.l
4480: 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  _len, (int)l2.l_
4490: 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e  pid);.  }.  errn
44a0: 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a  o = savedErrno;.
44b0: 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 64    return s;.}.#d
44c0: 65 66 69 6e 65 20 66 63 6e 74 6c 20 6c 6f 63 6b  efine fcntl lock
44d0: 54 72 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20  Trace.#endif /* 
44e0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43  SQLITE_LOCK_TRAC
44f0: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  E */../*.** The 
4500: 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e  testThreadLockin
4510: 67 42 65 68 61 76 69 6f 72 28 29 20 72 6f 75 74  gBehavior() rout
4520: 69 6e 65 20 6c 61 75 6e 63 68 65 73 20 74 77 6f  ine launches two
4530: 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 74 68 72   separate.** thr
4540: 65 61 64 73 20 6f 6e 20 74 68 69 73 20 72 6f 75  eads on this rou
4550: 74 69 6e 65 2e 20 20 54 68 69 73 20 72 6f 75 74  tine.  This rout
4560: 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
4570: 6c 6f 63 6b 20 61 20 66 69 6c 65 0a 2a 2a 20 64  lock a file.** d
4580: 65 73 63 72 69 70 74 6f 72 20 74 68 65 6e 20 72  escriptor then r
4590: 65 74 75 72 6e 73 2e 20 20 54 68 65 20 73 75 63  eturns.  The suc
45a0: 63 65 73 73 20 6f 72 20 66 61 69 6c 75 72 65 20  cess or failure 
45b0: 6f 66 20 74 68 61 74 20 61 74 74 65 6d 70 74 0a  of that attempt.
45c0: 2a 2a 20 61 6c 6c 6f 77 73 20 74 68 65 20 74 65  ** allows the te
45d0: 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42  stThreadLockingB
45e0: 65 68 61 76 69 6f 72 28 29 20 70 72 6f 63 65 64  ehavior() proced
45f0: 75 72 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ure to determine
4600: 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e  .** whether or n
4610: 6f 74 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f  ot threads can o
4620: 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68  verride each oth
4630: 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74  ers locks..*/.st
4640: 61 74 69 63 20 76 6f 69 64 20 2a 74 68 72 65 61  atic void *threa
4650: 64 4c 6f 63 6b 69 6e 67 54 65 73 74 28 76 6f 69  dLockingTest(voi
4660: 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 74 72 75  d *pArg){.  stru
4670: 63 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74  ct threadTestDat
4680: 61 20 2a 70 44 61 74 61 20 3d 20 28 73 74 72 75  a *pData = (stru
4690: 63 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74  ct threadTestDat
46a0: 61 2a 29 70 41 72 67 3b 0a 20 20 70 44 61 74 61  a*)pArg;.  pData
46b0: 2d 3e 72 65 73 75 6c 74 20 3d 20 66 63 6e 74 6c  ->result = fcntl
46c0: 28 70 44 61 74 61 2d 3e 66 64 2c 20 46 5f 53 45  (pData->fd, F_SE
46d0: 54 4c 4b 2c 20 26 70 44 61 74 61 2d 3e 6c 6f 63  TLK, &pData->loc
46e0: 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 41 72  k);.  return pAr
46f0: 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  g;.}../*.** This
4700: 20 70 72 6f 63 65 64 75 72 65 20 61 74 74 65 6d   procedure attem
4710: 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  pts to determine
4720: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
4730: 74 68 72 65 61 64 73 0a 2a 2a 20 63 61 6e 20 6f  threads.** can o
4740: 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68  verride each oth
4750: 65 72 73 20 6c 6f 63 6b 73 20 74 68 65 6e 20 73  ers locks then s
4760: 65 74 73 20 74 68 65 20 0a 2a 2a 20 74 68 72 65  ets the .** thre
4770: 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f  adsOverrideEachO
4780: 74 68 65 72 73 4c 6f 63 6b 73 20 76 61 72 69 61  thersLocks varia
4790: 62 6c 65 20 61 70 70 72 6f 70 72 69 61 74 65 6c  ble appropriatel
47a0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
47b0: 64 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b  d testThreadLock
47c0: 69 6e 67 42 65 68 61 76 69 6f 72 28 69 6e 74 20  ingBehavior(int 
47d0: 66 64 5f 6f 72 69 67 29 7b 0a 20 20 69 6e 74 20  fd_orig){.  int 
47e0: 66 64 3b 0a 20 20 73 74 72 75 63 74 20 74 68 72  fd;.  struct thr
47f0: 65 61 64 54 65 73 74 44 61 74 61 20 64 5b 32 5d  eadTestData d[2]
4800: 3b 0a 20 20 70 74 68 72 65 61 64 5f 74 20 74 5b  ;.  pthread_t t[
4810: 32 5d 3b 0a 0a 20 20 66 64 20 3d 20 64 75 70 28  2];..  fd = dup(
4820: 66 64 5f 6f 72 69 67 29 3b 0a 20 20 69 66 28 20  fd_orig);.  if( 
4830: 66 64 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  fd<0 ) return;. 
4840: 20 6d 65 6d 73 65 74 28 64 2c 20 30 2c 20 73 69   memset(d, 0, si
4850: 7a 65 6f 66 28 64 29 29 3b 0a 20 20 64 5b 30 5d  zeof(d));.  d[0]
4860: 2e 66 64 20 3d 20 66 64 3b 0a 20 20 64 5b 30 5d  .fd = fd;.  d[0]
4870: 2e 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46  .lock.l_type = F
4880: 5f 52 44 4c 43 4b 3b 0a 20 20 64 5b 30 5d 2e 6c  _RDLCK;.  d[0].l
4890: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  ock.l_len = 1;. 
48a0: 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 73 74 61   d[0].lock.l_sta
48b0: 72 74 20 3d 20 30 3b 0a 20 20 64 5b 30 5d 2e 6c  rt = 0;.  d[0].l
48c0: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
48d0: 45 45 4b 5f 53 45 54 3b 0a 20 20 64 5b 31 5d 20  EEK_SET;.  d[1] 
48e0: 3d 20 64 5b 30 5d 3b 0a 20 20 64 5b 31 5d 2e 6c  = d[0];.  d[1].l
48f0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
4900: 52 4c 43 4b 3b 0a 20 20 70 74 68 72 65 61 64 5f  RLCK;.  pthread_
4910: 63 72 65 61 74 65 28 26 74 5b 30 5d 2c 20 30 2c  create(&t[0], 0,
4920: 20 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65   threadLockingTe
4930: 73 74 2c 20 26 64 5b 30 5d 29 3b 0a 20 20 70 74  st, &d[0]);.  pt
4940: 68 72 65 61 64 5f 63 72 65 61 74 65 28 26 74 5b  hread_create(&t[
4950: 31 5d 2c 20 30 2c 20 74 68 72 65 61 64 4c 6f 63  1], 0, threadLoc
4960: 6b 69 6e 67 54 65 73 74 2c 20 26 64 5b 31 5d 29  kingTest, &d[1])
4970: 3b 0a 20 20 70 74 68 72 65 61 64 5f 6a 6f 69 6e  ;.  pthread_join
4980: 28 74 5b 30 5d 2c 20 30 29 3b 0a 20 20 70 74 68  (t[0], 0);.  pth
4990: 72 65 61 64 5f 6a 6f 69 6e 28 74 5b 31 5d 2c 20  read_join(t[1], 
49a0: 30 29 3b 0a 20 20 63 6c 6f 73 65 28 66 64 29 3b  0);.  close(fd);
49b0: 0a 20 20 74 68 72 65 61 64 73 4f 76 65 72 72 69  .  threadsOverri
49c0: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
49d0: 73 20 3d 20 20 64 5b 30 5d 2e 72 65 73 75 6c 74  s =  d[0].result
49e0: 3d 3d 30 20 26 26 20 64 5b 31 5d 2e 72 65 73 75  ==0 && d[1].resu
49f0: 6c 74 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  lt==0;.}.#endif 
4a00: 2f 2a 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  /* SQLITE_THREAD
4a10: 53 41 46 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  SAFE */../*.** R
4a20: 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b 49 6e 66  elease a lockInf
4a30: 6f 20 73 74 72 75 63 74 75 72 65 20 70 72 65 76  o structure prev
4a40: 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64  iously allocated
4a50: 20 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f   by findLockInfo
4a60: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
4a70: 69 64 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e  id releaseLockIn
4a80: 66 6f 28 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e  fo(struct lockIn
4a90: 66 6f 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 66  fo *pLock){.  if
4aa0: 20 28 70 4c 6f 63 6b 20 3d 3d 20 4e 55 4c 4c 29   (pLock == NULL)
4ab0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 70  .    return;.  p
4ac0: 4c 6f 63 6b 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  Lock->nRef--;.  
4ad0: 69 66 28 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 3d  if( pLock->nRef=
4ae0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
4af0: 33 48 61 73 68 49 6e 73 65 72 74 28 26 6c 6f 63  3HashInsert(&loc
4b00: 6b 48 61 73 68 2c 20 26 70 4c 6f 63 6b 2d 3e 6b  kHash, &pLock->k
4b10: 65 79 2c 20 73 69 7a 65 6f 66 28 70 4c 6f 63 6b  ey, sizeof(pLock
4b20: 2d 3e 6b 65 79 29 2c 20 30 29 3b 0a 20 20 20 20  ->key), 0);.    
4b30: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f  sqlite3_free(pLo
4b40: 63 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ck);.  }.}../*.*
4b50: 2a 20 52 65 6c 65 61 73 65 20 61 20 6f 70 65 6e  * Release a open
4b60: 43 6e 74 20 73 74 72 75 63 74 75 72 65 20 70 72  Cnt structure pr
4b70: 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
4b80: 65 64 20 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e  ed by findLockIn
4b90: 66 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fo()..*/.static 
4ba0: 76 6f 69 64 20 72 65 6c 65 61 73 65 4f 70 65 6e  void releaseOpen
4bb0: 43 6e 74 28 73 74 72 75 63 74 20 6f 70 65 6e 43  Cnt(struct openC
4bc0: 6e 74 20 2a 70 4f 70 65 6e 29 7b 0a 20 20 69 66  nt *pOpen){.  if
4bd0: 20 28 70 4f 70 65 6e 20 3d 3d 20 4e 55 4c 4c 29   (pOpen == NULL)
4be0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 70  .    return;.  p
4bf0: 4f 70 65 6e 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  Open->nRef--;.  
4c00: 69 66 28 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 3d  if( pOpen->nRef=
4c10: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
4c20: 33 48 61 73 68 49 6e 73 65 72 74 28 26 6f 70 65  3HashInsert(&ope
4c30: 6e 48 61 73 68 2c 20 26 70 4f 70 65 6e 2d 3e 6b  nHash, &pOpen->k
4c40: 65 79 2c 20 73 69 7a 65 6f 66 28 70 4f 70 65 6e  ey, sizeof(pOpen
4c50: 2d 3e 6b 65 79 29 2c 20 30 29 3b 0a 20 20 20 20  ->key), 0);.    
4c60: 66 72 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e  free(pOpen->aPen
4c70: 64 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  ding);.    sqlit
4c80: 65 33 5f 66 72 65 65 28 70 4f 70 65 6e 29 3b 0a  e3_free(pOpen);.
4c90: 20 20 7d 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51    }.}..#ifdef SQ
4ca0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
4cb0: 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20  ING_STYLE./*.** 
4cc0: 54 65 73 74 73 20 61 20 62 79 74 65 2d 72 61 6e  Tests a byte-ran
4cd0: 67 65 20 6c 6f 63 6b 69 6e 67 20 71 75 65 72 79  ge locking query
4ce0: 20 74 6f 20 73 65 65 20 69 66 20 62 79 74 65 20   to see if byte 
4cf0: 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20  range locks are 
4d00: 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 2c 20 69  .** supported, i
4d10: 66 20 6e 6f 74 20 77 65 20 66 61 6c 6c 20 62 61  f not we fall ba
4d20: 63 6b 20 74 6f 20 64 6f 74 6c 6f 63 6b 4c 6f 63  ck to dotlockLoc
4d30: 6b 69 6e 67 53 74 79 6c 65 2e 0a 2a 2f 0a 73 74  kingStyle..*/.st
4d40: 61 74 69 63 20 73 71 6c 69 74 65 33 4c 6f 63 6b  atic sqlite3Lock
4d50: 69 6e 67 53 74 79 6c 65 20 73 71 6c 69 74 65 33  ingStyle sqlite3
4d60: 54 65 73 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  TestLockingStyle
4d70: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
4d80: 66 69 6c 65 50 61 74 68 2c 20 0a 20 20 69 6e 74  filePath, .  int
4d90: 20 66 64 0a 29 7b 0a 20 20 2f 2a 20 74 65 73 74   fd.){.  /* test
4da0: 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
4db0: 20 75 73 69 6e 67 20 66 63 6e 74 6c 20 2a 2f 0a   using fcntl */.
4dc0: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
4dd0: 6f 63 6b 49 6e 66 6f 3b 0a 20 20 0a 20 20 6c 6f  ockInfo;.  .  lo
4de0: 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31  ckInfo.l_len = 1
4df0: 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73  ;.  lockInfo.l_s
4e00: 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b  tart = 0;.  lock
4e10: 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  Info.l_whence = 
4e20: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b  SEEK_SET;.  lock
4e30: 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  Info.l_type = F_
4e40: 52 44 4c 43 4b 3b 0a 20 20 0a 20 20 69 66 28 20  RDLCK;.  .  if( 
4e50: 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c  fcntl(fd, F_GETL
4e60: 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d  K, &lockInfo)!=-
4e70: 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  1 ) {.    return
4e80: 20 70 6f 73 69 78 4c 6f 63 6b 69 6e 67 53 74 79   posixLockingSty
4e90: 6c 65 3b 0a 20 20 7d 20 0a 20 20 0a 20 20 2f 2a  le;.  } .  .  /*
4ea0: 20 74 65 73 74 69 6e 67 20 66 6f 72 20 66 6c 6f   testing for flo
4eb0: 63 6b 20 63 61 6e 20 67 69 76 65 20 66 61 6c 73  ck can give fals
4ec0: 65 20 70 6f 73 69 74 69 76 65 73 2e 20 20 53 6f  e positives.  So
4ed0: 20 69 66 20 69 66 20 74 68 65 20 61 62 6f 76 65   if if the above
4ee0: 20 74 65 73 74 0a 20 20 2a 2a 20 66 61 69 6c 73   test.  ** fails
4ef0: 2c 20 74 68 65 6e 20 77 65 20 66 61 6c 6c 20 62  , then we fall b
4f00: 61 63 6b 20 74 6f 20 75 73 69 6e 67 20 64 6f 74  ack to using dot
4f10: 2d 6c 6f 63 6b 20 73 74 79 6c 65 20 6c 6f 63 6b  -lock style lock
4f20: 69 6e 67 2e 0a 20 20 2a 2f 20 20 0a 20 20 72 65  ing..  */  .  re
4f30: 74 75 72 6e 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b  turn dotlockLock
4f40: 69 6e 67 53 74 79 6c 65 3b 0a 7d 0a 0a 2f 2a 20  ingStyle;.}../* 
4f50: 0a 2a 2a 20 45 78 61 6d 69 6e 65 73 20 74 68 65  .** Examines the
4f60: 20 66 5f 66 73 74 79 70 65 6e 61 6d 65 20 65 6e   f_fstypename en
4f70: 74 72 79 20 69 6e 20 74 68 65 20 73 74 61 74 66  try in the statf
4f80: 73 20 73 74 72 75 63 74 75 72 65 20 61 73 20 72  s structure as r
4f90: 65 74 75 72 6e 65 64 20 62 79 20 0a 2a 2a 20 73  eturned by .** s
4fa0: 74 61 74 28 29 20 66 6f 72 20 74 68 65 20 66 69  tat() for the fi
4fb0: 6c 65 20 73 79 73 74 65 6d 20 68 6f 73 74 69 6e  le system hostin
4fc0: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
4fd0: 69 6c 65 2c 20 61 73 73 69 67 6e 73 20 74 68 65  ile, assigns the
4fe0: 20 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65   .** appropriate
4ff0: 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 62   locking style b
5000: 61 73 65 64 20 6f 6e 20 69 74 73 20 76 61 6c 75  ased on its valu
5010: 65 2e 20 20 54 68 65 73 65 20 76 61 6c 75 65 73  e.  These values
5020: 20 61 6e 64 20 0a 2a 2a 20 61 73 73 69 67 6e 6d   and .** assignm
5030: 65 6e 74 73 20 61 72 65 20 62 61 73 65 64 20 6f  ents are based o
5040: 6e 20 44 61 72 77 69 6e 2f 4f 53 58 20 62 65 68  n Darwin/OSX beh
5050: 61 76 69 6f 72 20 61 6e 64 20 68 61 76 65 20 6e  avior and have n
5060: 6f 74 20 62 65 65 6e 20 74 65 73 74 65 64 20 6f  ot been tested o
5070: 6e 20 0a 2a 2a 20 6f 74 68 65 72 20 73 79 73 74  n .** other syst
5080: 65 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ems..*/.static s
5090: 71 6c 69 74 65 33 4c 6f 63 6b 69 6e 67 53 74 79  qlite3LockingSty
50a0: 6c 65 20 73 71 6c 69 74 65 33 44 65 74 65 63 74  le sqlite3Detect
50b0: 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 0a 20 20  LockingStyle(.  
50c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
50d0: 50 61 74 68 2c 20 0a 20 20 69 6e 74 20 66 64 0a  Path, .  int fd.
50e0: 29 7b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ){..#ifdef SQLIT
50f0: 45 5f 46 49 58 45 44 5f 4c 4f 43 4b 49 4e 47 5f  E_FIXED_LOCKING_
5100: 53 54 59 4c 45 0a 20 20 72 65 74 75 72 6e 20 28  STYLE.  return (
5110: 73 71 6c 69 74 65 33 4c 6f 63 6b 69 6e 67 53 74  sqlite3LockingSt
5120: 79 6c 65 29 53 51 4c 49 54 45 5f 46 49 58 45 44  yle)SQLITE_FIXED
5130: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 3b 0a  _LOCKING_STYLE;.
5140: 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 73  #else.  struct s
5150: 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 0a 20  tatfs fsInfo;.. 
5160: 20 69 66 20 28 73 74 61 74 66 73 28 66 69 6c 65   if (statfs(file
5170: 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d  Path, &fsInfo) =
5180: 3d 20 2d 31 29 0a 20 20 20 20 72 65 74 75 72 6e  = -1).    return
5190: 20 73 71 6c 69 74 65 33 54 65 73 74 4c 6f 63 6b   sqlite3TestLock
51a0: 69 6e 67 53 74 79 6c 65 28 66 69 6c 65 50 61 74  ingStyle(filePat
51b0: 68 2c 20 66 64 29 3b 0a 20 20 0a 20 20 69 66 20  h, fd);.  .  if 
51c0: 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20  (fsInfo.f_flags 
51d0: 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 29 0a 20 20  & MNT_RDONLY).  
51e0: 20 20 72 65 74 75 72 6e 20 6e 6f 4c 6f 63 6b 69    return noLocki
51f0: 6e 67 53 74 79 6c 65 3b 0a 20 20 0a 20 20 69 66  ngStyle;.  .  if
5200: 28 20 28 21 73 74 72 63 6d 70 28 66 73 49 6e 66  ( (!strcmp(fsInf
5210: 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
5220: 22 68 66 73 22 29 29 20 7c 7c 0a 20 20 20 20 28  "hfs")) ||.    (
5230: 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66  !strcmp(fsInfo.f
5240: 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 75 66  _fstypename, "uf
5250: 73 22 29 29 20 29 0a 20 20 20 20 20 20 20 20 20  s")) ).         
5260: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 6f         return po
5270: 73 69 78 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b  sixLockingStyle;
5280: 0a 20 20 0a 20 20 69 66 28 21 73 74 72 63 6d 70  .  .  if(!strcmp
5290: 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65  (fsInfo.f_fstype
52a0: 6e 61 6d 65 2c 20 22 61 66 70 66 73 22 29 29 0a  name, "afpfs")).
52b0: 20 20 20 20 72 65 74 75 72 6e 20 61 66 70 4c 6f      return afpLo
52c0: 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 0a 20  ckingStyle;.  . 
52d0: 20 69 66 28 21 73 74 72 63 6d 70 28 66 73 49 6e   if(!strcmp(fsIn
52e0: 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
52f0: 20 22 6e 66 73 22 29 29 20 0a 20 20 20 20 72 65   "nfs")) .    re
5300: 74 75 72 6e 20 73 71 6c 69 74 65 33 54 65 73 74  turn sqlite3Test
5310: 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 66 69 6c  LockingStyle(fil
5320: 65 50 61 74 68 2c 20 66 64 29 3b 0a 20 20 0a 20  ePath, fd);.  . 
5330: 20 69 66 28 21 73 74 72 63 6d 70 28 66 73 49 6e   if(!strcmp(fsIn
5340: 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
5350: 20 22 73 6d 62 66 73 22 29 29 0a 20 20 20 20 72   "smbfs")).    r
5360: 65 74 75 72 6e 20 66 6c 6f 63 6b 4c 6f 63 6b 69  eturn flockLocki
5370: 6e 67 53 74 79 6c 65 3b 0a 20 20 0a 20 20 69 66  ngStyle;.  .  if
5380: 28 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e  (!strcmp(fsInfo.
5390: 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 6d  f_fstypename, "m
53a0: 73 64 6f 73 22 29 29 0a 20 20 20 20 72 65 74 75  sdos")).    retu
53b0: 72 6e 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  rn dotlockLockin
53c0: 67 53 74 79 6c 65 3b 0a 20 20 0a 20 20 69 66 28  gStyle;.  .  if(
53d0: 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66  !strcmp(fsInfo.f
53e0: 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 77 65  _fstypename, "we
53f0: 62 64 61 76 22 29 29 0a 20 20 20 20 72 65 74 75  bdav")).    retu
5400: 72 6e 20 75 6e 73 75 70 70 6f 72 74 65 64 4c 6f  rn unsupportedLo
5410: 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 0a 20  ckingStyle;.  . 
5420: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54   return sqlite3T
5430: 65 73 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28  estLockingStyle(
5440: 66 69 6c 65 50 61 74 68 2c 20 66 64 29 3b 20 20  filePath, fd);  
5450: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
5460: 45 5f 46 49 58 45 44 5f 4c 4f 43 4b 49 4e 47 5f  E_FIXED_LOCKING_
5470: 53 54 59 4c 45 20 2a 2f 0a 7d 0a 0a 23 65 6e 64  STYLE */.}..#end
5480: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
5490: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
54a0: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  E */../*.** Give
54b0: 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  n a file descrip
54c0: 74 6f 72 2c 20 6c 6f 63 61 74 65 20 6c 6f 63 6b  tor, locate lock
54d0: 49 6e 66 6f 20 61 6e 64 20 6f 70 65 6e 43 6e 74  Info and openCnt
54e0: 20 73 74 72 75 63 74 75 72 65 73 20 74 68 61 74   structures that
54f0: 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74 68  .** describes th
5500: 61 74 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  at file descript
5510: 6f 72 2e 20 20 43 72 65 61 74 65 20 6e 65 77 20  or.  Create new 
5520: 6f 6e 65 73 20 69 66 20 6e 65 63 65 73 73 61 72  ones if necessar
5530: 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74 75 72  y.  The.** retur
5540: 6e 20 76 61 6c 75 65 73 20 6d 69 67 68 74 20 62  n values might b
5550: 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  e uninitialized 
5560: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
5570: 72 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  rs..**.** Return
5580: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
5590: 72 72 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrors..*/.static
55a0: 20 69 6e 74 20 66 69 6e 64 4c 6f 63 6b 49 6e 66   int findLockInf
55b0: 6f 28 0a 20 20 69 6e 74 20 66 64 2c 20 20 20 20  o(.  int fd,    
55c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55d0: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
55e0: 73 63 72 69 70 74 6f 72 20 75 73 65 64 20 69 6e  scriptor used in
55f0: 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74   the key */.  st
5600: 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 2a  ruct lockInfo **
5610: 70 70 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 52 65  ppLock,    /* Re
5620: 74 75 72 6e 20 74 68 65 20 6c 6f 63 6b 49 6e 66  turn the lockInf
5630: 6f 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  o structure here
5640: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6f 70 65   */.  struct ope
5650: 6e 43 6e 74 20 2a 2a 70 70 4f 70 65 6e 20 20 20  nCnt **ppOpen   
5660: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
5670: 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75   openCnt structu
5680: 72 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  re here */.){.  
5690: 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74  int rc;.  struct
56a0: 20 6c 6f 63 6b 4b 65 79 20 6b 65 79 31 3b 0a 20   lockKey key1;. 
56b0: 20 73 74 72 75 63 74 20 6f 70 65 6e 4b 65 79 20   struct openKey 
56c0: 6b 65 79 32 3b 0a 20 20 73 74 72 75 63 74 20 73  key2;.  struct s
56d0: 74 61 74 20 73 74 61 74 62 75 66 3b 0a 20 20 73  tat statbuf;.  s
56e0: 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a  truct lockInfo *
56f0: 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20  pLock;.  struct 
5700: 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 0a  openCnt *pOpen;.
5710: 20 20 72 63 20 3d 20 66 73 74 61 74 28 66 64 2c    rc = fstat(fd,
5720: 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66   &statbuf);.  if
5730: 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
5740: 20 31 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 6b   1;..  memset(&k
5750: 65 79 31 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b  ey1, 0, sizeof(k
5760: 65 79 31 29 29 3b 0a 20 20 6b 65 79 31 2e 64 65  ey1));.  key1.de
5770: 76 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64  v = statbuf.st_d
5780: 65 76 3b 0a 20 20 6b 65 79 31 2e 69 6e 6f 20 3d  ev;.  key1.ino =
5790: 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b   statbuf.st_ino;
57a0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
57b0: 41 44 53 41 46 45 0a 20 20 69 66 28 20 74 68 72  ADSAFE.  if( thr
57c0: 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68  eadsOverrideEach
57d0: 4f 74 68 65 72 73 4c 6f 63 6b 73 3c 30 20 29 7b  OthersLocks<0 ){
57e0: 0a 20 20 20 20 74 65 73 74 54 68 72 65 61 64 4c  .    testThreadL
57f0: 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 66  ockingBehavior(f
5800: 64 29 3b 0a 20 20 7d 0a 20 20 6b 65 79 31 2e 74  d);.  }.  key1.t
5810: 69 64 20 3d 20 74 68 72 65 61 64 73 4f 76 65 72  id = threadsOver
5820: 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f  rideEachOthersLo
5830: 63 6b 73 20 3f 20 30 20 3a 20 70 74 68 72 65 61  cks ? 0 : pthrea
5840: 64 5f 73 65 6c 66 28 29 3b 0a 23 65 6e 64 69 66  d_self();.#endif
5850: 0a 20 20 6d 65 6d 73 65 74 28 26 6b 65 79 32 2c  .  memset(&key2,
5860: 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 32 29   0, sizeof(key2)
5870: 29 3b 0a 20 20 6b 65 79 32 2e 64 65 76 20 3d 20  );.  key2.dev = 
5880: 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a  statbuf.st_dev;.
5890: 20 20 6b 65 79 32 2e 69 6e 6f 20 3d 20 73 74 61    key2.ino = sta
58a0: 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 20 20 70  tbuf.st_ino;.  p
58b0: 4c 6f 63 6b 20 3d 20 28 73 74 72 75 63 74 20 6c  Lock = (struct l
58c0: 6f 63 6b 49 6e 66 6f 2a 29 73 71 6c 69 74 65 33  ockInfo*)sqlite3
58d0: 48 61 73 68 46 69 6e 64 28 26 6c 6f 63 6b 48 61  HashFind(&lockHa
58e0: 73 68 2c 20 26 6b 65 79 31 2c 20 73 69 7a 65 6f  sh, &key1, sizeo
58f0: 66 28 6b 65 79 31 29 29 3b 0a 20 20 69 66 28 20  f(key1));.  if( 
5900: 70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  pLock==0 ){.    
5910: 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20  struct lockInfo 
5920: 2a 70 4f 6c 64 3b 0a 20 20 20 20 70 4c 6f 63 6b  *pOld;.    pLock
5930: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
5940: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4c 6f 63 6b  c( sizeof(*pLock
5950: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  ) );.    if( pLo
5960: 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ck==0 ){.      r
5970: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74  c = 1;.      got
5980: 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69  o exit_findlocki
5990: 6e 66 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nfo;.    }.    p
59a0: 4c 6f 63 6b 2d 3e 6b 65 79 20 3d 20 6b 65 79 31  Lock->key = key1
59b0: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65  ;.    pLock->nRe
59c0: 66 20 3d 20 31 3b 0a 20 20 20 20 70 4c 6f 63 6b  f = 1;.    pLock
59d0: 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70  ->cnt = 0;.    p
59e0: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  Lock->locktype =
59f0: 20 30 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73   0;.    pOld = s
5a00: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
5a10: 28 26 6c 6f 63 6b 48 61 73 68 2c 20 26 70 4c 6f  (&lockHash, &pLo
5a20: 63 6b 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f 66 28  ck->key, sizeof(
5a30: 6b 65 79 31 29 2c 20 70 4c 6f 63 6b 29 3b 0a 20  key1), pLock);. 
5a40: 20 20 20 69 66 28 20 70 4f 6c 64 21 3d 30 20 29     if( pOld!=0 )
5a50: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
5a60: 70 4f 6c 64 3d 3d 70 4c 6f 63 6b 20 29 3b 0a 20  pOld==pLock );. 
5a70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
5a80: 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  e(pLock);.      
5a90: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  rc = 1;.      go
5aa0: 74 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b  to exit_findlock
5ab0: 69 6e 66 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  info;.    }.  }e
5ac0: 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  lse{.    pLock->
5ad0: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70  nRef++;.  }.  *p
5ae0: 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20  pLock = pLock;. 
5af0: 20 69 66 28 20 70 70 4f 70 65 6e 21 3d 30 20 29   if( ppOpen!=0 )
5b00: 7b 0a 20 20 20 20 70 4f 70 65 6e 20 3d 20 28 73  {.    pOpen = (s
5b10: 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 2a 29 73  truct openCnt*)s
5b20: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
5b30: 6f 70 65 6e 48 61 73 68 2c 20 26 6b 65 79 32 2c  openHash, &key2,
5b40: 20 73 69 7a 65 6f 66 28 6b 65 79 32 29 29 3b 0a   sizeof(key2));.
5b50: 20 20 20 20 69 66 28 20 70 4f 70 65 6e 3d 3d 30      if( pOpen==0
5b60: 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
5b70: 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 6c 64 3b 0a   openCnt *pOld;.
5b80: 20 20 20 20 20 20 70 4f 70 65 6e 20 3d 20 73 71        pOpen = sq
5b90: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
5ba0: 7a 65 6f 66 28 2a 70 4f 70 65 6e 29 20 29 3b 0a  zeof(*pOpen) );.
5bb0: 20 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e 3d        if( pOpen=
5bc0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
5bd0: 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 4c  leaseLockInfo(pL
5be0: 6f 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ock);.        rc
5bf0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 1;.        go
5c00: 74 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b  to exit_findlock
5c10: 69 6e 66 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  info;.      }.  
5c20: 20 20 20 20 70 4f 70 65 6e 2d 3e 6b 65 79 20 3d      pOpen->key =
5c30: 20 6b 65 79 32 3b 0a 20 20 20 20 20 20 70 4f 70   key2;.      pOp
5c40: 65 6e 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  en->nRef = 1;.  
5c50: 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b      pOpen->nLock
5c60: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 70 65   = 0;.      pOpe
5c70: 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30 3b  n->nPending = 0;
5c80: 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50  .      pOpen->aP
5c90: 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20  ending = 0;.    
5ca0: 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33    pOld = sqlite3
5cb0: 48 61 73 68 49 6e 73 65 72 74 28 26 6f 70 65 6e  HashInsert(&open
5cc0: 48 61 73 68 2c 20 26 70 4f 70 65 6e 2d 3e 6b 65  Hash, &pOpen->ke
5cd0: 79 2c 20 73 69 7a 65 6f 66 28 6b 65 79 32 29 2c  y, sizeof(key2),
5ce0: 20 70 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69   pOpen);.      i
5cf0: 66 28 20 70 4f 6c 64 21 3d 30 20 29 7b 0a 20 20  f( pOld!=0 ){.  
5d00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
5d10: 6c 64 3d 3d 70 4f 70 65 6e 20 29 3b 0a 20 20 20  ld==pOpen );.   
5d20: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
5d30: 65 28 70 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  e(pOpen);.      
5d40: 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66    releaseLockInf
5d50: 6f 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  o(pLock);.      
5d60: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
5d70: 20 20 67 6f 74 6f 20 65 78 69 74 5f 66 69 6e 64    goto exit_find
5d80: 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20 20 20 20  lockinfo;.      
5d90: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
5da0: 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 2b 2b     pOpen->nRef++
5db0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 70 4f  ;.    }.    *ppO
5dc0: 70 65 6e 20 3d 20 70 4f 70 65 6e 3b 0a 20 20 7d  pen = pOpen;.  }
5dd0: 0a 0a 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69  ..exit_findlocki
5de0: 6e 66 6f 3a 0a 20 20 72 65 74 75 72 6e 20 72 63  nfo:.  return rc
5df0: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
5e00: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 48  TE_DEBUG./*.** H
5e10: 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66  elper function f
5e20: 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75 74 20  or printing out 
5e30: 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f  trace informatio
5e40: 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69 6e 67  n from debugging
5e50: 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20 54 68  .** binaries. Th
5e60: 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  is returns the s
5e70: 74 72 69 6e 67 20 72 65 70 72 65 73 65 74 61 74  tring represetat
5e80: 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70 70 6c  ion of the suppl
5e90: 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6c  ied.** integer l
5ea0: 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74 61  ock-type..*/.sta
5eb0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
5ec0: 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 69 6e 74  locktypeName(int
5ed0: 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 73 77   locktype){.  sw
5ee0: 69 74 63 68 28 20 6c 6f 63 6b 74 79 70 65 20 29  itch( locktype )
5ef0: 7b 0a 20 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b  {.  case NO_LOCK
5f00: 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b  : return "NONE";
5f10: 0a 20 20 63 61 73 65 20 53 48 41 52 45 44 5f 4c  .  case SHARED_L
5f20: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53 48 41  OCK: return "SHA
5f30: 52 45 44 22 3b 0a 20 20 63 61 73 65 20 52 45 53  RED";.  case RES
5f40: 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75  ERVED_LOCK: retu
5f50: 72 6e 20 22 52 45 53 45 52 56 45 44 22 3b 0a 20  rn "RESERVED";. 
5f60: 20 63 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f   case PENDING_LO
5f70: 43 4b 3a 20 72 65 74 75 72 6e 20 22 50 45 4e 44  CK: return "PEND
5f80: 49 4e 47 22 3b 0a 20 20 63 61 73 65 20 45 58 43  ING";.  case EXC
5f90: 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74  LUSIVE_LOCK: ret
5fa0: 75 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22 3b  urn "EXCLUSIVE";
5fb0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 45  .  }.  return "E
5fc0: 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a  RROR";.}.#endif.
5fd0: 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65  ./*.** If we are
5fe0: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 61 20   currently in a 
5ff0: 64 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64  different thread
6000: 20 74 68 61 6e 20 74 68 65 20 74 68 72 65 61 64   than the thread
6010: 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 75 6e 69   that the.** uni
6020: 78 46 69 6c 65 20 61 72 67 75 6d 65 6e 74 20 62  xFile argument b
6030: 65 6c 6f 6e 67 73 20 74 6f 2c 20 74 68 65 6e 20  elongs to, then 
6040: 74 72 61 6e 73 66 65 72 20 6f 77 6e 65 72 73 68  transfer ownersh
6050: 69 70 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69  ip of the unixFi
6060: 6c 65 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 74 68  le.** over to th
6070: 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
6080: 2e 0a 2a 2a 0a 2a 2a 20 41 20 75 6e 69 78 46 69  ..**.** A unixFi
6090: 6c 65 20 69 73 20 6f 6e 6c 79 20 6f 77 6e 65 64  le is only owned
60a0: 20 62 79 20 61 20 74 68 72 65 61 64 20 6f 6e 20   by a thread on 
60b0: 73 79 73 74 65 6d 73 20 77 68 65 72 65 20 6f 6e  systems where on
60c0: 65 20 74 68 72 65 61 64 20 69 73 0a 2a 2a 20 75  e thread is.** u
60d0: 6e 61 62 6c 65 20 74 6f 20 6f 76 65 72 72 69 64  nable to overrid
60e0: 65 20 6c 6f 63 6b 73 20 63 72 65 61 74 65 64 20  e locks created 
60f0: 62 79 20 61 20 64 69 66 66 65 72 65 6e 74 20 74  by a different t
6100: 68 72 65 61 64 2e 20 20 52 65 64 48 61 74 39 20  hread.  RedHat9 
6110: 69 73 0a 2a 2a 20 61 6e 20 65 78 61 6d 70 6c 65  is.** an example
6120: 20 6f 66 20 73 75 63 68 20 61 20 73 79 73 74 65   of such a syste
6130: 6d 2e 0a 2a 2a 0a 2a 2a 20 4f 77 6e 65 72 73 68  m..**.** Ownersh
6140: 69 70 20 74 72 61 6e 73 66 65 72 20 69 73 20 6f  ip transfer is o
6150: 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 69 66 20 74  nly allowed if t
6160: 68 65 20 75 6e 69 78 46 69 6c 65 20 69 73 20 63  he unixFile is c
6170: 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65  urrently unlocke
6180: 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20 75 6e 69  d..** If the uni
6190: 78 46 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20  xFile is locked 
61a0: 61 6e 64 20 61 6e 20 6f 77 6e 65 72 73 68 69 70  and an ownership
61b0: 20 69 73 20 77 72 6f 6e 67 2c 20 74 68 65 6e 20   is wrong, then 
61c0: 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  return.** SQLITE
61d0: 5f 4d 49 53 55 53 45 2e 20 20 53 51 4c 49 54 45  _MISUSE.  SQLITE
61e0: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
61f0: 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
6200: 72 6b 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  rks..*/.#if SQLI
6210: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 73 74  TE_THREADSAFE.st
6220: 61 74 69 63 20 69 6e 74 20 74 72 61 6e 73 66 65  atic int transfe
6230: 72 4f 77 6e 65 72 73 68 69 70 28 75 6e 69 78 46  rOwnership(unixF
6240: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
6250: 6e 74 20 72 63 3b 0a 20 20 70 74 68 72 65 61 64  nt rc;.  pthread
6260: 5f 74 20 68 53 65 6c 66 3b 0a 20 20 69 66 28 20  _t hSelf;.  if( 
6270: 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45  threadsOverrideE
6280: 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 29  achOthersLocks )
6290: 7b 0a 20 20 20 20 2f 2a 20 4f 77 6e 65 72 73 68  {.    /* Ownersh
62a0: 69 70 20 74 72 61 6e 73 66 65 72 73 20 6e 6f 74  ip transfers not
62b0: 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 69 73 20   needed on this 
62c0: 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 72 65  system */.    re
62d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
62e0: 20 20 7d 0a 20 20 68 53 65 6c 66 20 3d 20 70 74    }.  hSelf = pt
62f0: 68 72 65 61 64 5f 73 65 6c 66 28 29 3b 0a 20 20  hread_self();.  
6300: 69 66 28 20 70 74 68 72 65 61 64 5f 65 71 75 61  if( pthread_equa
6310: 6c 28 70 46 69 6c 65 2d 3e 74 69 64 2c 20 68 53  l(pFile->tid, hS
6320: 65 6c 66 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57  elf) ){.    /* W
6330: 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74  e are still in t
6340: 68 65 20 73 61 6d 65 20 74 68 72 65 61 64 20 2a  he same thread *
6350: 2f 0a 20 20 20 20 4f 53 54 52 41 43 45 31 28 22  /.    OSTRACE1("
6360: 4e 6f 2d 74 72 61 6e 73 66 65 72 2c 20 73 61 6d  No-transfer, sam
6370: 65 20 74 68 72 65 61 64 5c 6e 22 29 3b 0a 20 20  e thread\n");.  
6380: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6390: 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46  OK;.  }.  if( pF
63a0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e  ile->locktype!=N
63b0: 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a  O_LOCK ){.    /*
63c0: 20 57 65 20 63 61 6e 6e 6f 74 20 63 68 61 6e 67   We cannot chang
63d0: 65 20 6f 77 6e 65 72 73 68 69 70 20 77 68 69 6c  e ownership whil
63e0: 65 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e 67  e we are holding
63f0: 20 61 20 6c 6f 63 6b 21 20 2a 2f 0a 20 20 20 20   a lock! */.    
6400: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
6410: 53 55 53 45 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  SUSE;.  }.  OSTR
6420: 41 43 45 34 28 22 54 72 61 6e 73 66 65 72 20 6f  ACE4("Transfer o
6430: 77 6e 65 72 73 68 69 70 20 6f 66 20 25 64 20 66  wnership of %d f
6440: 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c  rom %d to %d\n",
6450: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69  .            pFi
6460: 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 74 69  le->h, pFile->ti
6470: 64 2c 20 68 53 65 6c 66 29 3b 0a 20 20 70 46 69  d, hSelf);.  pFi
6480: 6c 65 2d 3e 74 69 64 20 3d 20 68 53 65 6c 66 3b  le->tid = hSelf;
6490: 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 70 4c  .  if (pFile->pL
64a0: 6f 63 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 20  ock != NULL) {. 
64b0: 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e     releaseLockIn
64c0: 66 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29  fo(pFile->pLock)
64d0: 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 4c  ;.    rc = findL
64e0: 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 68  ockInfo(pFile->h
64f0: 2c 20 26 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2c  , &pFile->pLock,
6500: 20 30 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45   0);.    OSTRACE
6510: 35 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 69 73  5("LOCK    %d is
6520: 20 6e 6f 77 20 25 73 28 25 73 2c 25 64 29 5c 6e   now %s(%s,%d)\n
6530: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
6540: 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65          locktype
6550: 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b  Name(pFile->lock
6560: 74 79 70 65 29 2c 0a 20 20 20 20 20 20 20 20 20  type),.         
6570: 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70    locktypeName(p
6580: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63  File->pLock->loc
6590: 6b 74 79 70 65 29 2c 20 70 46 69 6c 65 2d 3e 70  ktype), pFile->p
65a0: 4c 6f 63 6b 2d 3e 63 6e 74 29 3b 0a 20 20 20 20  Lock->cnt);.    
65b0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65  return rc;.  } e
65c0: 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  lse {.    return
65d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
65e0: 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4f 6e 20  }.#else.  /* On 
65f0: 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 20  single-threaded 
6600: 62 75 69 6c 64 73 2c 20 6f 77 6e 65 72 73 68 69  builds, ownershi
6610: 70 20 74 72 61 6e 73 66 65 72 20 69 73 20 61 20  p transfer is a 
6620: 6e 6f 2d 6f 70 20 2a 2f 0a 23 20 64 65 66 69 6e  no-op */.# defin
6630: 65 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73  e transferOwners
6640: 68 69 70 28 58 29 20 53 51 4c 49 54 45 5f 4f 4b  hip(X) SQLITE_OK
6650: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53  .#endif../*.** S
6660: 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65  eek to the offse
6670: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
6680: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
6690: 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 0a   then read cnt .
66a0: 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42  ** bytes into pB
66b0: 75 66 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e  uf. Return the n
66c0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
66d0: 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a  ctually read..**
66e0: 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75 20  .** NB:  If you 
66f0: 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44  define USE_PREAD
6700: 20 6f 72 20 55 53 45 5f 50 52 45 41 44 36 34 2c   or USE_PREAD64,
6710: 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 61   then it might a
6720: 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73  lso.** be necess
6730: 61 72 79 20 74 6f 20 64 65 66 69 6e 65 20 5f 58  ary to define _X
6740: 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62  OPEN_SOURCE to b
6750: 65 20 35 30 30 2e 20 20 54 68 69 73 20 76 61 72  e 500.  This var
6760: 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20  ies from.** one 
6770: 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65  system to anothe
6780: 72 2e 20 20 53 69 6e 63 65 20 53 51 4c 69 74 65  r.  Since SQLite
6790: 20 64 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e 65   does not define
67a0: 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20 61 6e   USE_PREAD.** an
67b0: 79 20 61 6e 79 20 66 6f 72 6d 20 62 79 20 64 65  y any form by de
67c0: 66 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c 20 6e  fault, we will n
67d0: 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65  ot attempt to de
67e0: 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52  fine _XOPEN_SOUR
67f0: 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65  CE..** See ticke
6800: 74 73 20 23 32 37 34 31 20 61 6e 64 20 23 32 36  ts #2741 and #26
6810: 38 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  81..*/.static in
6820: 74 20 73 65 65 6b 41 6e 64 52 65 61 64 28 75 6e  t seekAndRead(un
6830: 69 78 46 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69  ixFile *id, sqli
6840: 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
6850: 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e  , void *pBuf, in
6860: 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f  t cnt){.  int go
6870: 74 3b 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73  t;.  i64 newOffs
6880: 65 74 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41 52  et;.  TIMER_STAR
6890: 54 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  T;.#if defined(U
68a0: 53 45 5f 50 52 45 41 44 29 0a 20 20 67 6f 74 20  SE_PREAD).  got 
68b0: 3d 20 70 72 65 61 64 28 69 64 2d 3e 68 2c 20 70  = pread(id->h, p
68c0: 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
68d0: 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
68e0: 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29  rror( got = -1 )
68f0: 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
6900: 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 67  USE_PREAD64).  g
6910: 6f 74 20 3d 20 70 72 65 61 64 36 34 28 69 64 2d  ot = pread64(id-
6920: 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f  >h, pBuf, cnt, o
6930: 66 66 73 65 74 29 3b 0a 20 20 53 69 6d 75 6c 61  ffset);.  Simula
6940: 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d  teIOError( got =
6950: 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20 6e   -1 );.#else.  n
6960: 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b  ewOffset = lseek
6970: 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20  (id->h, offset, 
6980: 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 53 69 6d  SEEK_SET);.  Sim
6990: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 6e 65  ulateIOError( ne
69a0: 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20 20 69  wOffset-- );.  i
69b0: 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66  f( newOffset!=of
69c0: 66 73 65 74 20 29 7b 0a 20 20 20 20 72 65 74 75  fset ){.    retu
69d0: 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 67 6f 74  rn -1;.  }.  got
69e0: 20 3d 20 72 65 61 64 28 69 64 2d 3e 68 2c 20 70   = read(id->h, p
69f0: 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69  Buf, cnt);.#endi
6a00: 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20  f.  TIMER_END;. 
6a10: 20 4f 53 54 52 41 43 45 35 28 22 52 45 41 44 20   OSTRACE5("READ 
6a20: 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c     %-3d %5d %7ll
6a30: 64 20 25 64 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20  d %d\n", id->h, 
6a40: 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d  got, offset, TIM
6a50: 45 52 5f 45 4c 41 50 53 45 44 29 3b 0a 20 20 72  ER_ELAPSED);.  r
6a60: 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 2f 2a  eturn got;.}../*
6a70: 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72  .** Read data fr
6a80: 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61  om a file into a
6a90: 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e   buffer.  Return
6aa0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c   SQLITE_OK if al
6ab0: 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20  l.** bytes were 
6ac0: 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c  read successfull
6ad0: 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45  y and SQLITE_IOE
6ae0: 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  RR if anything g
6af0: 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f  oes.** wrong..*/
6b00: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
6b10: 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  Read(.  sqlite3_
6b20: 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f 69  file *id, .  voi
6b30: 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20  d *pBuf, .  int 
6b40: 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69  amt,.  sqlite3_i
6b50: 6e 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a 20  nt64 offset.){. 
6b60: 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65   int got;.  asse
6b70: 72 74 28 20 69 64 20 29 3b 0a 20 20 67 6f 74 20  rt( id );.  got 
6b80: 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 28 75  = seekAndRead((u
6b90: 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 6f 66 66  nixFile*)id, off
6ba0: 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b  set, pBuf, amt);
6bb0: 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20  .  if( got==amt 
6bc0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
6bd0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
6be0: 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20   if( got<0 ){.  
6bf0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6c00: 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d 65  IOERR_READ;.  }e
6c10: 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  lse{.    memset(
6c20: 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 67  &((char*)pBuf)[g
6c30: 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29  ot], 0, amt-got)
6c40: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
6c50: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
6c60: 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  READ;.  }.}../*.
6c70: 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f  ** Seek to the o
6c80: 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66  ffset in id->off
6c90: 73 65 74 20 74 68 65 6e 20 72 65 61 64 20 63 6e  set then read cn
6ca0: 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75  t bytes into pBu
6cb0: 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  f..** Return the
6cc0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
6cd0: 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 20   actually read. 
6ce0: 20 55 70 64 61 74 65 20 74 68 65 20 6f 66 66 73   Update the offs
6cf0: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  et..*/.static in
6d00: 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 75  t seekAndWrite(u
6d10: 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 69 36 34  nixFile *id, i64
6d20: 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74 20 76   offset, const v
6d30: 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63  oid *pBuf, int c
6d40: 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a  nt){.  int got;.
6d50: 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b    i64 newOffset;
6d60: 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a  .  TIMER_START;.
6d70: 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
6d80: 50 52 45 41 44 29 0a 20 20 67 6f 74 20 3d 20 70  PREAD).  got = p
6d90: 77 72 69 74 65 28 69 64 2d 3e 68 2c 20 70 42 75  write(id->h, pBu
6da0: 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b  f, cnt, offset);
6db0: 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55  .#elif defined(U
6dc0: 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 67 6f  SE_PREAD64).  go
6dd0: 74 20 3d 20 70 77 72 69 74 65 36 34 28 69 64 2d  t = pwrite64(id-
6de0: 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f  >h, pBuf, cnt, o
6df0: 66 66 73 65 74 29 3b 0a 23 65 6c 73 65 0a 20 20  ffset);.#else.  
6e00: 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65  newOffset = lsee
6e10: 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c  k(id->h, offset,
6e20: 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 69 66   SEEK_SET);.  if
6e30: 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66  ( newOffset!=off
6e40: 73 65 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  set ){.    retur
6e50: 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 67 6f 74 20  n -1;.  }.  got 
6e60: 3d 20 77 72 69 74 65 28 69 64 2d 3e 68 2c 20 70  = write(id->h, p
6e70: 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69  Buf, cnt);.#endi
6e80: 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20  f.  TIMER_END;. 
6e90: 20 4f 53 54 52 41 43 45 35 28 22 57 52 49 54 45   OSTRACE5("WRITE
6ea0: 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c     %-3d %5d %7ll
6eb0: 64 20 25 64 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20  d %d\n", id->h, 
6ec0: 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d  got, offset, TIM
6ed0: 45 52 5f 45 4c 41 50 53 45 44 29 3b 0a 20 20 72  ER_ELAPSED);.  r
6ee0: 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f  eturn got;.}.../
6ef0: 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20  *.** Write data 
6f00: 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e  from a buffer in
6f10: 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75  to a file.  Retu
6f20: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
6f30: 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f  success.** or so
6f40: 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
6f50: 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a  ode on failure..
6f60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
6f70: 69 78 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74  ixWrite(.  sqlit
6f80: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20  e3_file *id, .  
6f90: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66  const void *pBuf
6fa0: 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20  , .  int amt,.  
6fb0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
6fc0: 66 73 65 74 20 0a 29 7b 0a 20 20 69 6e 74 20 77  fset .){.  int w
6fd0: 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73 73 65  rote = 0;.  asse
6fe0: 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65  rt( id );.  asse
6ff0: 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 77  rt( amt>0 );.  w
7000: 68 69 6c 65 28 20 61 6d 74 3e 30 20 26 26 20 28  hile( amt>0 && (
7010: 77 72 6f 74 65 20 3d 20 73 65 65 6b 41 6e 64 57  wrote = seekAndW
7020: 72 69 74 65 28 28 75 6e 69 78 46 69 6c 65 2a 29  rite((unixFile*)
7030: 69 64 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66  id, offset, pBuf
7040: 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a 20 20 20  , amt))>0 ){.   
7050: 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20   amt -= wrote;. 
7060: 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77 72 6f     offset += wro
7070: 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26  te;.    pBuf = &
7080: 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72  ((char*)pBuf)[wr
7090: 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75  ote];.  }.  Simu
70a0: 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20 77 72  lateIOError(( wr
70b0: 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31 20  ote=(-1), amt=1 
70c0: 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69  ));.  SimulateDi
70d0: 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20 77 72  skfullError(( wr
70e0: 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29 3b  ote=0, amt=1 ));
70f0: 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a  .  if( amt>0 ){.
7100: 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c 30 20      if( wrote<0 
7110: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
7120: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
7130: 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  TE;.    }else{. 
7140: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
7150: 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
7160: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
7170: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66  TE_OK;.}..#ifdef
7180: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
7190: 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ** Count the num
71a0: 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73  ber of fullsyncs
71b0: 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63   and normal sync
71c0: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
71d0: 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74   to test.** that
71e0: 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73   syncs and fulls
71f0: 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 69 6e  yncs are occurin
7200: 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74  g at the right t
7210: 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  imes..*/.int sql
7220: 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20  ite3_sync_count 
7230: 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  = 0;.int sqlite3
7240: 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20  _fullsync_count 
7250: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
7260: 2a 2a 20 55 73 65 20 74 68 65 20 66 64 61 74 61  ** Use the fdata
7270: 73 79 6e 63 28 29 20 41 50 49 20 6f 6e 6c 79 20  sync() API only 
7280: 69 66 20 74 68 65 20 48 41 56 45 5f 46 44 41 54  if the HAVE_FDAT
7290: 41 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64  ASYNC macro is d
72a0: 65 66 69 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72  efined..** Other
72b0: 77 69 73 65 20 75 73 65 20 66 73 79 6e 63 28 29  wise use fsync()
72c0: 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 0a 2a   in its place..*
72d0: 2f 0a 23 69 66 6e 64 65 66 20 48 41 56 45 5f 46  /.#ifndef HAVE_F
72e0: 44 41 54 41 53 59 4e 43 0a 23 20 64 65 66 69 6e  DATASYNC.# defin
72f0: 65 20 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e  e fdatasync fsyn
7300: 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  c.#endif../*.** 
7310: 44 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c  Define HAVE_FULL
7320: 46 53 59 4e 43 20 74 6f 20 30 20 6f 72 20 31 20  FSYNC to 0 or 1 
7330: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
7340: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74  ther or not.** t
7350: 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d  he F_FULLFSYNC m
7360: 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e  acro is defined.
7370: 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73    F_FULLFSYNC is
7380: 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e   currently.** on
7390: 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ly available on 
73a0: 4d 61 63 20 4f 53 20 58 2e 20 20 42 75 74 20 74  Mac OS X.  But t
73b0: 68 61 74 20 63 6f 75 6c 64 20 63 68 61 6e 67 65  hat could change
73c0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46 55  ..*/.#ifdef F_FU
73d0: 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66 69 6e 65  LLFSYNC.# define
73e0: 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20   HAVE_FULLFSYNC 
73f0: 31 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  1.#else.# define
7400: 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20   HAVE_FULLFSYNC 
7410: 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  0.#endif.../*.**
7420: 20 54 68 65 20 66 73 79 6e 63 28 29 20 73 79 73   The fsync() sys
7430: 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f  tem call does no
7440: 74 20 77 6f 72 6b 20 61 73 20 61 64 76 65 72 74  t work as advert
7450: 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20  ised on many.** 
7460: 75 6e 69 78 20 73 79 73 74 65 6d 73 2e 20 20 54  unix systems.  T
7470: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f  he following pro
7480: 63 65 64 75 72 65 20 69 73 20 61 6e 20 61 74 74  cedure is an att
7490: 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20  empt to make.** 
74a0: 69 74 20 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a  it work better..
74b0: 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
74c0: 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64  _NO_SYNC macro d
74d0: 69 73 61 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e  isables all fsyn
74e0: 63 28 29 73 2e 20 20 54 68 69 73 20 69 73 20 75  c()s.  This is u
74f0: 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73  seful.** for tes
7500: 74 69 6e 67 20 77 68 65 6e 20 77 65 20 77 61 6e  ting when we wan
7510: 74 20 74 6f 20 72 75 6e 20 74 68 72 6f 75 67 68  t to run through
7520: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
7530: 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20  quickly..** You 
7540: 61 72 65 20 73 74 72 6f 6e 67 6c 79 20 61 64 76  are strongly adv
7550: 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65  ised *not* to de
7560: 70 6c 6f 79 20 77 69 74 68 20 53 51 4c 49 54 45  ploy with SQLITE
7570: 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62  _NO_SYNC.** enab
7580: 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c 20 73 69  led, however, si
7590: 6e 63 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f  nce with SQLITE_
75a0: 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c  NO_SYNC enabled,
75b0: 20 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20   an OS crash.** 
75c0: 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  or power failure
75d0: 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72   will likely cor
75e0: 72 75 70 74 20 74 68 65 20 64 61 74 61 62 61 73  rupt the databas
75f0: 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
7600: 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63  c int full_fsync
7610: 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75 6c  (int fd, int ful
7620: 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f  lSync, int dataO
7630: 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  nly){.  int rc;.
7640: 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65  .  /* Record the
7650: 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   number of times
7660: 20 74 68 61 74 20 77 65 20 64 6f 20 61 20 6e 6f   that we do a no
7670: 72 6d 61 6c 20 66 73 79 6e 63 28 29 20 61 6e 64  rmal fsync() and
7680: 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e   .  ** FULLSYNC.
7690: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 64    This is used d
76a0: 75 72 69 6e 67 20 74 65 73 74 69 6e 67 20 74 6f  uring testing to
76b0: 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 69   verify that thi
76c0: 73 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a  s procedure.  **
76d0: 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 69 74   gets called wit
76e0: 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 72  h the correct ar
76f0: 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69  guments..  */.#i
7700: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
7710: 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20  .  if( fullSync 
7720: 29 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79  ) sqlite3_fullsy
7730: 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71  nc_count++;.  sq
7740: 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
7750: 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  ++;.#endif..  /*
7760: 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20   If we compiled 
7770: 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f  with the SQLITE_
7780: 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68  NO_SYNC flag, th
7790: 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a  en syncing is a.
77a0: 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a    ** no-op.  */.
77b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  #ifdef SQLITE_NO
77c0: 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20 53 51 4c  _SYNC.  rc = SQL
77d0: 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 0a 23  ITE_OK;.#else..#
77e0: 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  if HAVE_FULLFSYN
77f0: 43 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63  C.  if( fullSync
7800: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 63 6e   ){.    rc = fcn
7810: 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59  tl(fd, F_FULLFSY
7820: 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  NC, 0);.  }else{
7830: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d  .    rc = 1;.  }
7840: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c  .  /* If the FUL
7850: 4c 46 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 66  LFSYNC failed, f
7860: 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74 74 65  all back to atte
7870: 6d 70 74 69 6e 67 20 61 6e 20 66 73 79 6e 63 28  mpting an fsync(
7880: 29 2e 0a 20 20 20 2a 20 49 74 20 73 68 6f 75 6c  )..   * It shoul
7890: 64 6e 27 74 20 62 65 20 70 6f 73 73 69 62 6c 65  dn't be possible
78a0: 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20 74   for fullfsync t
78b0: 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f  o fail on the lo
78c0: 63 61 6c 20 0a 20 20 20 2a 20 66 69 6c 65 20 73  cal .   * file s
78d0: 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20  ystem (on OSX), 
78e0: 73 6f 20 66 61 69 6c 75 72 65 20 69 6e 64 69 63  so failure indic
78f0: 61 74 65 73 20 74 68 61 74 20 46 55 4c 4c 46 53  ates that FULLFS
7900: 59 4e 43 0a 20 20 20 2a 20 69 73 6e 27 74 20 73  YNC.   * isn't s
7910: 75 70 70 6f 72 74 65 64 20 66 6f 72 20 74 68 69  upported for thi
7920: 73 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 53  s file system. S
7930: 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e 20 66 73  o, attempt an fs
7940: 79 6e 63 20 0a 20 20 20 2a 20 61 6e 64 20 28 66  ync .   * and (f
7950: 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74  or now) ignore t
7960: 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61  he overhead of a
7970: 20 73 75 70 65 72 66 6c 75 6f 75 73 20 66 63 6e   superfluous fcn
7980: 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 20 2a 20  tl call.  .   * 
7990: 49 74 27 64 20 62 65 20 62 65 74 74 65 72 20 74  It'd be better t
79a0: 6f 20 64 65 74 65 63 74 20 66 75 6c 6c 66 73 79  o detect fullfsy
79b0: 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e 63 65 20  nc support once 
79c0: 61 6e 64 20 61 76 6f 69 64 20 0a 20 20 20 2a 20  and avoid .   * 
79d0: 74 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65  the fcntl call e
79e0: 76 65 72 79 20 74 69 6d 65 20 73 79 6e 63 20 69  very time sync i
79f0: 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 2a 2f 0a  s called..   */.
7a00: 20 20 69 66 28 20 72 63 20 29 20 72 63 20 3d 20    if( rc ) rc = 
7a10: 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 73  fsync(fd);..#els
7a20: 65 20 0a 20 20 69 66 28 20 64 61 74 61 4f 6e 6c  e .  if( dataOnl
7a30: 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 64  y ){.    rc = fd
7a40: 61 74 61 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d  atasync(fd);.  }
7a50: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 66  else{.    rc = f
7a60: 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65  sync(fd);.  }.#e
7a70: 6e 64 69 66 20 2f 2a 20 48 41 56 45 5f 46 55 4c  ndif /* HAVE_FUL
7a80: 4c 46 53 59 4e 43 20 2a 2f 0a 23 65 6e 64 69 66  LFSYNC */.#endif
7a90: 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
7aa0: 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 2a 2f 0a 0a  TE_NO_SYNC) */..
7ab0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7ac0: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
7ad0: 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20  all writes to a 
7ae0: 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20  particular file 
7af0: 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f  are committed to
7b00: 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   disk..**.** If 
7b10: 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e  dataOnly==0 then
7b20: 20 62 6f 74 68 20 74 68 65 20 66 69 6c 65 20 69   both the file i
7b30: 74 73 65 6c 66 20 61 6e 64 20 69 74 73 20 6d 65  tself and its me
7b40: 74 61 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20  tadata (file.** 
7b50: 73 69 7a 65 2c 20 61 63 63 65 73 73 20 74 69 6d  size, access tim
7b60: 65 2c 20 65 74 63 29 20 61 72 65 20 73 79 6e 63  e, etc) are sync
7b70: 65 64 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c 79  ed.  If dataOnly
7b80: 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68  !=0 then only th
7b90: 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61 20 69  e.** file data i
7ba0: 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  s synced..**.** 
7bb0: 55 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f  Under Unix, also
7bc0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
7bd0: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e  the directory en
7be0: 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65  try for the file
7bf0: 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65  .** has been cre
7c00: 61 74 65 64 20 62 79 20 66 73 79 6e 63 2d 69 6e  ated by fsync-in
7c10: 67 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  g the directory 
7c20: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
7c30: 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65  e file..** If we
7c40: 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20   do not do this 
7c50: 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74 65 72  and we encounter
7c60: 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
7c70: 2c 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a  , the directory.
7c80: 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ** entry for the
7c90: 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e   journal might n
7ca0: 6f 74 20 65 78 69 73 74 20 61 66 74 65 72 20 77  ot exist after w
7cb0: 65 20 72 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e  e reboot.  The n
7cc0: 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f  ext.** SQLite to
7cd0: 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65   access the file
7ce0: 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74   will not know t
7cf0: 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
7d00: 65 78 69 73 74 73 20 28 62 65 63 61 75 73 65 0a  exists (because.
7d10: 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ** the directory
7d20: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a   entry for the j
7d30: 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65 76 65 72  ournal was never
7d40: 20 63 72 65 61 74 65 64 29 20 61 6e 64 20 74 68   created) and th
7d50: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e transaction.**
7d60: 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62   will not roll b
7d70: 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c  ack - possibly l
7d80: 65 61 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61  eading to databa
7d90: 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  se corruption..*
7da0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
7db0: 78 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69  xSync(sqlite3_fi
7dc0: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67  le *id, int flag
7dd0: 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
7de0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
7df0: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
7e00: 0a 0a 20 20 69 6e 74 20 69 73 44 61 74 61 4f 6e  ..  int isDataOn
7e10: 6c 79 20 3d 20 28 66 6c 61 67 73 26 53 51 4c 49  ly = (flags&SQLI
7e20: 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
7e30: 29 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c 6c 73  );.  int isFulls
7e40: 79 6e 63 20 3d 20 28 66 6c 61 67 73 26 30 78 30  ync = (flags&0x0
7e50: 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
7e60: 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  FULL;..  /* Chec
7e70: 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51  k that one of SQ
7e80: 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
7e90: 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73   or FULL was pas
7ea0: 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  sed */.  assert(
7eb0: 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
7ec0: 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
7ed0: 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73  .      || (flags
7ee0: 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
7ef0: 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20  YNC_FULL.  );.. 
7f00: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
7f10: 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22 53 59  ;.  OSTRACE2("SY
7f20: 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70  NC    %-3d\n", p
7f30: 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 72 63 20 3d  File->h);.  rc =
7f40: 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c   full_fsync(pFil
7f50: 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e 63  e->h, isFullsync
7f60: 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a 20  , isDataOnly);. 
7f70: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
7f80: 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20  ( rc=1 );.  if( 
7f90: 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
7fa0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
7fb0: 59 4e 43 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  YNC;.  }.  if( p
7fc0: 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29  File->dirfd>=0 )
7fd0: 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 34 28 22  {.    OSTRACE4("
7fe0: 44 49 52 53 59 4e 43 20 25 2d 33 64 20 28 68 61  DIRSYNC %-3d (ha
7ff0: 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20  ve_fullfsync=%d 
8000: 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c  fullsync=%d)\n",
8010: 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c 0a 20   pFile->dirfd,. 
8020: 20 20 20 20 20 20 20 20 20 20 20 48 41 56 45 5f             HAVE_
8030: 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c  FULLFSYNC, isFul
8040: 6c 73 79 6e 63 29 3b 0a 23 69 66 6e 64 65 66 20  lsync);.#ifndef 
8050: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44  SQLITE_DISABLE_D
8060: 49 52 53 59 4e 43 0a 20 20 20 20 2f 2a 20 54 68  IRSYNC.    /* Th
8070: 65 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63  e directory sync
8080: 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74   is only attempt
8090: 65 64 20 69 66 20 66 75 6c 6c 5f 66 73 79 6e 63  ed if full_fsync
80a0: 20 69 73 0a 20 20 20 20 2a 2a 20 74 75 72 6e 65   is.    ** turne
80b0: 64 20 6f 66 66 20 6f 72 20 75 6e 61 76 61 69 6c  d off or unavail
80c0: 61 62 6c 65 2e 20 20 49 66 20 61 20 66 75 6c 6c  able.  If a full
80d0: 5f 66 73 79 6e 63 20 6f 63 63 75 72 72 65 64 20  _fsync occurred 
80e0: 61 62 6f 76 65 2c 0a 20 20 20 20 2a 2a 20 74 68  above,.    ** th
80f0: 65 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  en the directory
8100: 20 73 79 6e 63 20 69 73 20 73 75 70 65 72 66 6c   sync is superfl
8110: 75 6f 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uous..    */.   
8120: 20 69 66 28 20 28 21 48 41 56 45 5f 46 55 4c 4c   if( (!HAVE_FULL
8130: 46 53 59 4e 43 20 7c 7c 20 21 69 73 46 75 6c 6c  FSYNC || !isFull
8140: 73 79 6e 63 29 20 26 26 20 66 75 6c 6c 5f 66 73  sync) && full_fs
8150: 79 6e 63 28 70 46 69 6c 65 2d 3e 64 69 72 66 64  ync(pFile->dirfd
8160: 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20 20 20 20  ,0,0) ){.       
8170: 2f 2a 0a 20 20 20 20 20 20 20 2a 2a 20 57 65 20  /*.       ** We 
8180: 68 61 76 65 20 72 65 63 65 69 76 65 64 20 6d 75  have received mu
8190: 6c 74 69 70 6c 65 20 72 65 70 6f 72 74 73 20 6f  ltiple reports o
81a0: 66 20 66 73 79 6e 63 28 29 20 72 65 74 75 72 6e  f fsync() return
81b0: 69 6e 67 0a 20 20 20 20 20 20 20 2a 2a 20 65 72  ing.       ** er
81c0: 72 6f 72 73 20 77 68 65 6e 20 61 70 70 6c 69 65  rors when applie
81d0: 64 20 74 6f 20 64 69 72 65 63 74 6f 72 69 65 73  d to directories
81e0: 20 6f 6e 20 63 65 72 74 61 69 6e 20 66 69 6c 65   on certain file
81f0: 20 73 79 73 74 65 6d 73 2e 0a 20 20 20 20 20 20   systems..      
8200: 20 2a 2a 20 41 20 66 61 69 6c 65 64 20 64 69 72   ** A failed dir
8210: 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20 6e  ectory sync is n
8220: 6f 74 20 61 20 62 69 67 20 64 65 61 6c 2e 20 20  ot a big deal.  
8230: 53 6f 20 69 74 20 73 65 65 6d 73 0a 20 20 20 20  So it seems.    
8240: 20 20 20 2a 2a 20 62 65 74 74 65 72 20 74 6f 20     ** better to 
8250: 69 67 6e 6f 72 65 20 74 68 65 20 65 72 72 6f 72  ignore the error
8260: 2e 20 20 54 69 63 6b 65 74 20 23 31 36 35 37 0a  .  Ticket #1657.
8270: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
8280: 20 2f 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   /* return SQLIT
8290: 45 5f 49 4f 45 52 52 3b 20 2a 2f 0a 20 20 20 20  E_IOERR; */.    
82a0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 6c 6f  }.#endif.    clo
82b0: 73 65 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 29  se(pFile->dirfd)
82c0: 3b 20 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 20  ;  /* Only need 
82d0: 74 6f 20 73 79 6e 63 20 6f 6e 63 65 2c 20 73 6f  to sync once, so
82e0: 20 63 6c 6f 73 65 20 74 68 65 20 64 69 72 65 63   close the direc
82f0: 74 6f 72 79 20 2a 2f 0a 20 20 20 20 70 46 69 6c  tory */.    pFil
8300: 65 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 20 20  e->dirfd = -1;  
8310: 20 20 2f 2a 20 77 68 65 6e 20 77 65 20 61 72 65    /* when we are
8320: 20 64 6f 6e 65 2e 20 2a 2f 0a 20 20 7d 0a 20 20   done. */.  }.  
8330: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
8340: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  ;.}../*.** Trunc
8350: 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65  ate an open file
8360: 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20   to a specified 
8370: 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  size.*/.static i
8380: 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65 28  nt unixTruncate(
8390: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
83a0: 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  , i64 nByte){.  
83b0: 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
83c0: 28 20 69 64 20 29 3b 0a 20 20 53 69 6d 75 6c 61  ( id );.  Simula
83d0: 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
83e0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  n SQLITE_IOERR_T
83f0: 52 55 4e 43 41 54 45 20 29 3b 0a 20 20 72 63 20  RUNCATE );.  rc 
8400: 3d 20 66 74 72 75 6e 63 61 74 65 28 28 28 75 6e  = ftruncate(((un
8410: 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20  ixFile*)id)->h, 
8420: 28 6f 66 66 5f 74 29 6e 42 79 74 65 29 3b 0a 20  (off_t)nByte);. 
8430: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
8440: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
8450: 52 52 5f 54 52 55 4e 43 41 54 45 3b 0a 20 20 7d  RR_TRUNCATE;.  }
8460: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
8470: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
8480: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  }../*.** Determi
8490: 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ne the current s
84a0: 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e  ize of a file in
84b0: 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63   bytes.*/.static
84c0: 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a   int unixFileSiz
84d0: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
84e0: 69 64 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b  id, i64 *pSize){
84f0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72  .  int rc;.  str
8500: 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
8510: 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20  assert( id );.  
8520: 72 63 20 3d 20 66 73 74 61 74 28 28 28 75 6e 69  rc = fstat(((uni
8530: 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26  xFile*)id)->h, &
8540: 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  buf);.  Simulate
8550: 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b  IOError( rc=1 );
8560: 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
8570: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8580: 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20  E_IOERR_FSTAT;. 
8590: 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75   }.  *pSize = bu
85a0: 66 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 72 65 74  f.st_size;.  ret
85b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
85c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
85d0: 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
85e0: 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
85f0: 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
8600: 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
8610: 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
8620: 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
8630: 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
8640: 63 6b 20 69 73 20 68 65 6c 64 2c 20 72 65 74 75  ck is held, retu
8650: 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  rn.** non-zero. 
8660: 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
8670: 75 6e 6c 6f 63 6b 65 64 20 6f 72 20 68 6f 6c 64  unlocked or hold
8680: 73 20 6f 6e 6c 79 20 53 48 41 52 45 44 20 6c 6f  s only SHARED lo
8690: 63 6b 73 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74  cks, then.** ret
86a0: 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  urn zero..*/.sta
86b0: 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63  tic int unixChec
86c0: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
86d0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
86e0: 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20  .  int r = 0;.  
86f0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
8700: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
8710: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
8720: 65 20 29 3b 0a 20 20 65 6e 74 65 72 4d 75 74 65  e );.  enterMute
8730: 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  x(); /* Because 
8740: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20  pFile->pLock is 
8750: 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
8760: 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43  reads */..  /* C
8770: 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
8780: 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
8790: 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
87a0: 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
87b0: 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79  e->pLock->lockty
87c0: 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  pe>SHARED_LOCK )
87d0: 7b 0a 20 20 20 20 72 20 3d 20 31 3b 0a 20 20 7d  {.    r = 1;.  }
87e0: 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65  ..  /* Otherwise
87f0: 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
8800: 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
8810: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
8820: 21 72 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  !r ){.    struct
8830: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20   flock lock;.   
8840: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
8850: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c   SEEK_SET;.    l
8860: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45  ock.l_start = RE
8870: 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20  SERVED_BYTE;.   
8880: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b   lock.l_len = 1;
8890: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
88a0: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20   = F_WRLCK;.    
88b0: 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  fcntl(pFile->h, 
88c0: 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b  F_GETLK, &lock);
88d0: 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f  .    if( lock.l_
88e0: 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type!=F_UNLCK ){
88f0: 0a 20 20 20 20 20 20 72 20 3d 20 31 3b 0a 20 20  .      r = 1;.  
8900: 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 6c 65 61    }.  }.  .  lea
8910: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
8920: 52 41 43 45 33 28 22 54 45 53 54 20 57 52 2d 4c  RACE3("TEST WR-L
8930: 4f 43 4b 20 25 64 20 25 64 5c 6e 22 2c 20 70 46  OCK %d %d\n", pF
8940: 69 6c 65 2d 3e 68 2c 20 72 29 3b 0a 0a 20 20 72  ile->h, r);..  r
8950: 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn r;.}../*.*
8960: 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
8970: 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
8980: 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
8990: 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20  eter locktype - 
89a0: 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
89b0: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
89c0: 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
89d0: 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
89e0: 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
89f0: 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
8a00: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
8a10: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
8a20: 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
8a30: 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
8a40: 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
8a50: 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
8a60: 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
8a70: 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
8a80: 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
8a90: 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
8aa0: 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
8ab0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
8ac0: 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
8ad0: 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
8ae0: 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
8af0: 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
8b00: 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
8b10: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
8b20: 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
8b30: 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
8b40: 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
8b50: 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
8b60: 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
8b70: 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
8b80: 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
8b90: 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
8ba0: 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
8bb0: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
8bc0: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
8bd0: 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
8be0: 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
8bf0: 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
8c00: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
8c10: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8c20: 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
8c30: 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
8c40: 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
8c50: 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
8c60: 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
8c70: 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
8c80: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f  tatic int unixLo
8c90: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
8ca0: 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
8cb0: 65 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  e){.  /* The fol
8cc0: 6c 6f 77 69 6e 67 20 64 65 73 63 72 69 62 65 73  lowing describes
8cd0: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
8ce0: 69 6f 6e 20 6f 66 20 74 68 65 20 76 61 72 69 6f  ion of the vario
8cf0: 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a  us locks and.  *
8d00: 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f  * lock transitio
8d10: 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74  ns in terms of t
8d20: 68 65 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  he POSIX advisor
8d30: 79 20 73 68 61 72 65 64 20 61 6e 64 20 65 78 63  y shared and exc
8d40: 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b  lusive.  ** lock
8d50: 20 70 72 69 6d 69 74 69 76 65 73 20 28 63 61 6c   primitives (cal
8d60: 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61  led read-locks a
8d70: 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62  nd write-locks b
8d80: 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20  elow, to avoid. 
8d90: 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69   ** confusion wi
8da0: 74 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e  th SQLite lock n
8db0: 61 6d 65 73 29 2e 20 54 68 65 20 61 6c 67 6f 72  ames). The algor
8dc0: 69 74 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69  ithms are compli
8dd0: 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68  cated.  ** sligh
8de0: 74 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  tly in order to 
8df0: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
8e00: 74 68 20 77 69 6e 64 6f 77 73 20 73 79 73 74 65  th windows syste
8e10: 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c  ms simultaneousl
8e20: 79 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67  y.  ** accessing
8e30: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
8e40: 73 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65  se file, in case
8e50: 20 74 68 61 74 20 69 73 20 65 76 65 72 20 72 65   that is ever re
8e60: 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  quired..  **.  *
8e70: 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65  * Symbols define
8e80: 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74  d in os.h indent
8e90: 69 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67  ify the 'pending
8ea0: 20 62 79 74 65 27 20 61 6e 64 20 74 68 65 20 27   byte' and the '
8eb0: 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79  reserved.  ** by
8ec0: 74 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65  te', each single
8ed0: 20 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b   bytes at well k
8ee0: 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e  nown offsets, an
8ef0: 64 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79  d the 'shared by
8f00: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20  te.  ** range', 
8f10: 61 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62  a range of 510 b
8f20: 79 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b  ytes at a well k
8f30: 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a  nown offset..  *
8f40: 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e  *.  ** To obtain
8f50: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20   a SHARED lock, 
8f60: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f  a read-lock is o
8f70: 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27  btained on the '
8f80: 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74  pending.  ** byt
8f90: 65 27 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  e'.  If this is 
8fa0: 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 72 61  successful, a ra
8fb0: 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 74  ndom byte from t
8fc0: 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a  he 'shared byte.
8fd0: 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 72    ** range' is r
8fe0: 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20 74  ead-locked and t
8ff0: 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27  he lock on the '
9000: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 72 65  pending byte' re
9010: 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  leased..  **.  *
9020: 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20  * A process may 
9030: 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52 45  only obtain a RE
9040: 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74 65  SERVED lock afte
9050: 72 20 69 74 20 68 61 73 20 61 20 53 48 41 52 45  r it has a SHARE
9060: 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52  D lock..  ** A R
9070: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
9080: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 67  implemented by g
9090: 72 61 62 62 69 6e 67 20 61 20 77 72 69 74 65 2d  rabbing a write-
90a0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  lock on the.  **
90b0: 20 27 72 65 73 65 72 76 65 64 20 62 79 74 65 27   'reserved byte'
90c0: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70  . .  **.  ** A p
90d0: 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20  rocess may only 
90e0: 6f 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e 47  obtain a PENDING
90f0: 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68   lock after it h
9100: 61 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20 20  as obtained a.  
9110: 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20  ** SHARED lock. 
9120: 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  A PENDING lock i
9130: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  s implemented by
9140: 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69   obtaining a wri
9150: 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20  te-lock.  ** on 
9160: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
9170: 65 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  e'. This ensures
9180: 20 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48 41   that no new SHA
9190: 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65  RED locks can be
91a0: 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20  .  ** obtained, 
91b0: 62 75 74 20 65 78 69 73 74 69 6e 67 20 53 48 41  but existing SHA
91c0: 52 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c  RED locks are al
91d0: 6c 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73 74  lowed to persist
91e0: 2e 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a  . A process.  **
91f0: 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
9200: 6f 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52  o obtain a RESER
9210: 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  VED lock on the 
9220: 77 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e 47  way to a PENDING
9230: 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73   lock..  ** This
9240: 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65   property is use
9250: 64 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69 74  d by the algorit
9260: 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62  hm for rolling b
9270: 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ack a journal fi
9280: 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 20  le.  ** after a 
9290: 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  crash..  **.  **
92a0: 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   An EXCLUSIVE lo
92b0: 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66 74  ck, obtained aft
92c0: 65 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  er a PENDING loc
92d0: 6b 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20 20  k is held, is.  
92e0: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  ** implemented b
92f0: 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72  y obtaining a wr
9300: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
9310: 65 6e 74 69 72 65 20 27 73 68 61 72 65 64 20 62  entire 'shared b
9320: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e  yte.  ** range'.
9330: 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72   Since all other
9340: 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20 61   locks require a
9350: 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e   read-lock on on
9360: 65 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a 20  e of the bytes. 
9370: 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20   ** within this 
9380: 72 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73 75  range, this ensu
9390: 72 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  res that no othe
93a0: 72 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64  r locks are held
93b0: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   on the.  ** dat
93c0: 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a  abase. .  **.  *
93d0: 2a 20 54 68 65 20 72 65 61 73 6f 6e 20 61 20 73  * The reason a s
93e0: 69 6e 67 6c 65 20 62 79 74 65 20 63 61 6e 6e 6f  ingle byte canno
93f0: 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61  t be used instea
9400: 64 20 6f 66 20 74 68 65 20 27 73 68 61 72 65 64  d of the 'shared
9410: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
9420: 27 20 69 73 20 74 68 61 74 20 73 6f 6d 65 20 76  ' is that some v
9430: 65 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64 6f  ersions of windo
9440: 77 73 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  ws do not suppor
9450: 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42 79  t read-locks. By
9460: 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61 20  .  ** locking a 
9470: 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d  random byte from
9480: 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75 72   a range, concur
9490: 72 65 6e 74 20 53 48 41 52 45 44 20 6c 6f 63 6b  rent SHARED lock
94a0: 73 20 6d 61 79 20 65 78 69 73 74 0a 20 20 2a 2a  s may exist.  **
94b0: 20 65 76 65 6e 20 69 66 20 74 68 65 20 6c 6f 63   even if the loc
94c0: 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 20 75  king primitive u
94d0: 73 65 64 20 69 73 20 61 6c 77 61 79 73 20 61 20  sed is always a 
94e0: 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f  write-lock..  */
94f0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
9500: 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
9510: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
9520: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 74 72 75  File*)id;.  stru
9530: 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f  ct lockInfo *pLo
9540: 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63  ck = pFile->pLoc
9550: 6b 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  k;.  struct floc
9560: 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 73 3b  k lock;.  int s;
9570: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
9580: 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 37 28  e );.  OSTRACE7(
9590: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77  "LOCK    %d %s w
95a0: 61 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64  as %s(%s,%d) pid
95b0: 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
95c0: 2c 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65  ,.      locktype
95d0: 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20  Name(locktype), 
95e0: 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69  locktypeName(pFi
95f0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 0a 20  le->locktype),. 
9600: 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d       locktypeNam
9610: 65 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70  e(pLock->locktyp
9620: 65 29 2c 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 2c  e), pLock->cnt ,
9630: 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 2f   getpid());..  /
9640: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
9650: 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
9660: 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
9670: 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
9680: 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69   the.  ** unixFi
9690: 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
96a0: 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e  Don't use the en
96b0: 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
96c0: 68 2c 20 61 73 0a 20 20 2a 2a 20 65 6e 74 65 72  h, as.  ** enter
96d0: 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62  Mutex() hasn't b
96e0: 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a  een called yet..
96f0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
9700: 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b  ->locktype>=lock
9710: 74 79 70 65 20 29 7b 0a 20 20 20 20 4f 53 54 52  type ){.    OSTR
9720: 41 43 45 33 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE3("LOCK    %d
9730: 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20   %s ok (already 
9740: 68 65 6c 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  held)\n", pFile-
9750: 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  >h,.            
9760: 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63  locktypeName(loc
9770: 6b 74 79 70 65 29 29 3b 0a 20 20 20 20 72 65 74  ktype));.    ret
9780: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
9790: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
97a0: 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73  re the locking s
97b0: 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65  equence is corre
97c0: 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ct.  */.  assert
97d0: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
97e0: 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f  e!=NO_LOCK || lo
97f0: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
9800: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
9810: 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49   locktype!=PENDI
9820: 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  NG_LOCK );.  ass
9830: 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52  ert( locktype!=R
9840: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
9850: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
9860: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
9870: 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78  .  /* This mutex
9880: 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75   is needed becau
9890: 73 65 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20  se pFile->pLock 
98a0: 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
98b0: 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20   threads.  */.  
98c0: 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20  enterMutex();.. 
98d0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
98e0: 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
98f0: 20 6f 77 6e 73 20 74 68 65 20 70 46 69 6c 65 2e   owns the pFile.
9900: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61  .  */.  rc = tra
9910: 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 70  nsferOwnership(p
9920: 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21  File);.  if( rc!
9930: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9940: 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a    leaveMutex();.
9950: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
9960: 20 7d 0a 20 20 70 4c 6f 63 6b 20 3d 20 70 46 69   }.  pLock = pFi
9970: 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a  le->pLock;..  /*
9980: 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20   If some thread 
9990: 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68  using this PID h
99a0: 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20  as a lock via a 
99b0: 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69  different unixFi
99c0: 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20  le*.  ** handle 
99d0: 74 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74  that precludes t
99e0: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
99f0: 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a  k, return BUSY..
9a00: 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c    */.  if( (pFil
9a10: 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 70 4c 6f  e->locktype!=pLo
9a20: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 26 26 20  ck->locktype && 
9a30: 0a 20 20 20 20 20 20 20 20 20 20 28 70 4c 6f 63  .          (pLoc
9a40: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50 45 4e  k->locktype>=PEN
9a50: 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63  DING_LOCK || loc
9a60: 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43  ktype>SHARED_LOC
9a70: 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  K)).  ){.    rc 
9a80: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
9a90: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
9aa0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
9ab0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20   SHARED lock is 
9ac0: 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73  requested, and s
9ad0: 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67  ome thread using
9ae0: 20 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64   this PID alread
9af0: 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41  y.  ** has a SHA
9b00: 52 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20  RED or RESERVED 
9b10: 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65  lock, then incre
9b20: 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63  ment reference c
9b30: 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72  ounts and.  ** r
9b40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
9b50: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
9b60: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
9b70: 4b 20 26 26 20 0a 20 20 20 20 20 20 28 70 4c 6f  K && .      (pLo
9b80: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  ck->locktype==SH
9b90: 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f  ARED_LOCK || pLo
9ba0: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45  ck->locktype==RE
9bb0: 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a  SERVED_LOCK) ){.
9bc0: 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b      assert( lock
9bd0: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
9be0: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
9bf0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
9c00: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
9c10: 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 30 20  t( pLock->cnt>0 
9c20: 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  );.    pFile->lo
9c30: 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f  cktype = SHARED_
9c40: 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  LOCK;.    pLock-
9c50: 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 70 46 69 6c  >cnt++;.    pFil
9c60: 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b  e->pOpen->nLock+
9c70: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  +;.    goto end_
9c80: 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 6c 6f 63  lock;.  }..  loc
9c90: 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 0a 20  k.l_len = 1L;.. 
9ca0: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
9cb0: 20 53 45 45 4b 5f 53 45 54 3b 0a 0a 20 20 2f 2a   SEEK_SET;..  /*
9cc0: 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
9cd0: 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65  is needed before
9ce0: 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41   acquiring a SHA
9cf0: 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66  RED lock and bef
9d00: 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69  ore.  ** acquiri
9d10: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
9d20: 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53  lock.  For the S
9d30: 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
9d40: 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a  PENDING will.  *
9d50: 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20  * be released.. 
9d60: 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
9d70: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
9d80: 0a 20 20 20 20 20 20 7c 7c 20 28 6c 6f 63 6b 74  .      || (lockt
9d90: 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
9da0: 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f  OCK && pFile->lo
9db0: 63 6b 74 79 70 65 3c 50 45 4e 44 49 4e 47 5f 4c  cktype<PENDING_L
9dc0: 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f  OCK).  ){.    lo
9dd0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 6c 6f 63  ck.l_type = (loc
9de0: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
9df0: 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c  CK?F_RDLCK:F_WRL
9e00: 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  CK);.    lock.l_
9e10: 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f  start = PENDING_
9e20: 42 59 54 45 3b 0a 20 20 20 20 73 20 3d 20 66 63  BYTE;.    s = fc
9e30: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
9e40: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20  SETLK, &lock);. 
9e50: 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 29     if( s==(-1) )
9e60: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 65 72  {.      rc = (er
9e70: 72 6e 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f 20 53  rno==EINVAL) ? S
9e80: 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53 51  QLITE_NOLFS : SQ
9e90: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
9ea0: 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a   goto end_lock;.
9eb0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a      }.  }...  /*
9ec0: 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73   If control gets
9ed0: 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
9ee0: 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f  then actually go
9ef0: 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a   ahead and make.
9f00: 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73    ** operating s
9f10: 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20  ystem calls for 
9f20: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f  the specified lo
9f30: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ck..  */.  if( l
9f40: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
9f50: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
9f60: 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d  rt( pLock->cnt==
9f70: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
9f80: 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65   pLock->locktype
9f90: 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e  ==0 );..    /* N
9fa0: 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d  ow get the read-
9fb0: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b  lock */.    lock
9fc0: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
9fd0: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63  D_FIRST;.    loc
9fe0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
9ff0: 5f 53 49 5a 45 3b 0a 20 20 20 20 73 20 3d 20 66  _SIZE;.    s = f
a000: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
a010: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a  _SETLK, &lock);.
a020: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65  .    /* Drop the
a030: 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49   temporary PENDI
a040: 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c  NG lock */.    l
a050: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45  ock.l_start = PE
a060: 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20  NDING_BYTE;.    
a070: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b  lock.l_len = 1L;
a080: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
a090: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
a0a0: 69 66 28 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d  if( fcntl(pFile-
a0b0: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  >h, F_SETLK, &lo
a0c0: 63 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ck)!=0 ){.      
a0d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
a0e0: 52 5f 55 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54 68  R_UNLOCK;  /* Th
a0f0: 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  is should never 
a100: 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20  happen */.      
a110: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
a120: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 3d 3d     }.    if( s==
a130: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 72 63  (-1) ){.      rc
a140: 20 3d 20 28 65 72 72 6e 6f 3d 3d 45 49 4e 56 41   = (errno==EINVA
a150: 4c 29 20 3f 20 53 51 4c 49 54 45 5f 4e 4f 4c 46  L) ? SQLITE_NOLF
a160: 53 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  S : SQLITE_BUSY;
a170: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a180: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
a190: 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  e = SHARED_LOCK;
a1a0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 4f  .      pFile->pO
a1b0: 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  pen->nLock++;.  
a1c0: 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d      pLock->cnt =
a1d0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
a1e0: 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d  e if( locktype==
a1f0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
a200: 26 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 31 20 29  & pLock->cnt>1 )
a210: 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20  {.    /* We are 
a220: 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78  trying for an ex
a230: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74  clusive lock but
a240: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
a250: 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 73  in this.    ** s
a260: 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73  ame process is s
a270: 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73  till holding a s
a280: 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20  hared lock. */. 
a290: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
a2a0: 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  USY;.  }else{.  
a2b0: 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
a2c0: 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52   was for a RESER
a2d0: 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
a2e0: 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20   lock.  It is.  
a2f0: 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61    ** assumed tha
a300: 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41  t there is a SHA
a310: 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
a320: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a  ock on the file.
a330: 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a      ** already..
a340: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
a350: 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 6c 6f 63  t( 0!=pFile->loc
a360: 6b 74 79 70 65 20 29 3b 0a 20 20 20 20 6c 6f 63  ktype );.    loc
a370: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c  k.l_type = F_WRL
a380: 43 4b 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20  CK;.    switch( 
a390: 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
a3a0: 20 20 63 61 73 65 20 52 45 53 45 52 56 45 44 5f    case RESERVED_
a3b0: 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 6c 6f  LOCK:.        lo
a3c0: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53  ck.l_start = RES
a3d0: 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20  ERVED_BYTE;.    
a3e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a3f0: 20 63 61 73 65 20 45 58 43 4c 55 53 49 56 45 5f   case EXCLUSIVE_
a400: 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 6c 6f  LOCK:.        lo
a410: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
a420: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20  RED_FIRST;.     
a430: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
a440: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
a450: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a460: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
a470: 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20     assert(0);.  
a480: 20 20 7d 0a 20 20 20 20 73 20 3d 20 66 63 6e 74    }.    s = fcnt
a490: 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45  l(pFile->h, F_SE
a4a0: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20  TLK, &lock);.   
a4b0: 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a   if( s==(-1) ){.
a4c0: 20 20 20 20 20 20 72 63 20 3d 20 28 65 72 72 6e        rc = (errn
a4d0: 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f 20 53 51 4c  o==EINVAL) ? SQL
a4e0: 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c 49  ITE_NOLFS : SQLI
a4f0: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20  TE_BUSY;.    }. 
a500: 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d   }.  .  if( rc==
a510: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a520: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
a530: 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20   = locktype;.   
a540: 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65   pLock->locktype
a550: 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d   = locktype;.  }
a560: 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70  else if( locktyp
a570: 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
a580: 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
a590: 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49  locktype = PENDI
a5a0: 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f  NG_LOCK;.    pLo
a5b0: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50  ck->locktype = P
a5c0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d  ENDING_LOCK;.  }
a5d0: 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 6c 65  ..end_lock:.  le
a5e0: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53  aveMutex();.  OS
a5f0: 54 52 41 43 45 34 28 22 4c 4f 43 4b 20 20 20 20  TRACE4("LOCK    
a600: 25 64 20 25 73 20 25 73 5c 6e 22 2c 20 70 46 69  %d %s %s\n", pFi
a610: 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 4e  le->h, locktypeN
a620: 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 0a  ame(locktype), .
a630: 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
a640: 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
a650: 69 6c 65 64 22 29 3b 0a 20 20 72 65 74 75 72 6e  iled");.  return
a660: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
a670: 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
a680: 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
a690: 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
a6a0: 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63  o locktype.  loc
a6b0: 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65  ktype.** must be
a6c0: 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
a6d0: 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
a6e0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
a6f0: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
a700: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
a710: 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
a720: 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
a730: 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
a740: 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
a750: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
a760: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a770: 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  unixUnlock(sqlit
a780: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
a790: 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 73 74   locktype){.  st
a7a0: 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70  ruct lockInfo *p
a7b0: 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20 66  Lock;.  struct f
a7c0: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74  lock lock;.  int
a7d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
a7e0: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
a7f0: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
a800: 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  id;..  assert( p
a810: 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
a820: 45 37 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E7("UNLOCK  %d %
a830: 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20  d was %d(%d,%d) 
a840: 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  pid=%d\n", pFile
a850: 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20  ->h, locktype,. 
a860: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b       pFile->lock
a870: 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f  type, pFile->pLo
a880: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46  ck->locktype, pF
a890: 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 2c  ile->pLock->cnt,
a8a0: 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 61   getpid());..  a
a8b0: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c  ssert( locktype<
a8c0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
a8d0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
a8e0: 6b 74 79 70 65 3c 3d 6c 6f 63 6b 74 79 70 65 20  ktype<=locktype 
a8f0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
a900: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
a910: 66 28 20 43 48 45 43 4b 5f 54 48 52 45 41 44 49  f( CHECK_THREADI
a920: 44 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20  D(pFile) ){.    
a930: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
a940: 53 55 53 45 3b 0a 20 20 7d 0a 20 20 65 6e 74 65  SUSE;.  }.  ente
a950: 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 4c 6f 63  rMutex();.  pLoc
a960: 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  k = pFile->pLock
a970: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63  ;.  assert( pLoc
a980: 6b 2d 3e 63 6e 74 21 3d 30 20 29 3b 0a 20 20 69  k->cnt!=0 );.  i
a990: 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
a9a0: 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  pe>SHARED_LOCK )
a9b0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  {.    assert( pL
a9c0: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 70  ock->locktype==p
a9d0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29  File->locktype )
a9e0: 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79  ;.    if( lockty
a9f0: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
aa00: 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ){.      lock.l_
aa10: 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
aa20: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
aa30: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
aa40: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
aa50: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
aa60: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
aa70: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
aa80: 45 3b 0a 20 20 20 20 20 20 69 66 28 20 66 63 6e  E;.      if( fcn
aa90: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
aaa0: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d  ETLK, &lock)==(-
aab0: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  1) ){.        /*
aac0: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76   This should nev
aad0: 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20  er happen */.   
aae0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
aaf0: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20  _IOERR_RDLOCK;. 
ab00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
ab10: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
ab20: 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b  _UNLCK;.    lock
ab30: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
ab40: 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  _SET;.    lock.l
ab50: 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47  _start = PENDING
ab60: 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e  _BYTE;.    lock.
ab70: 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73  l_len = 2L;  ass
ab80: 65 72 74 28 20 50 45 4e 44 49 4e 47 5f 42 59 54  ert( PENDING_BYT
ab90: 45 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f 42 59  E+1==RESERVED_BY
aba0: 54 45 20 29 3b 0a 20 20 20 20 69 66 28 20 66 63  TE );.    if( fc
abb0: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
abc0: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28  SETLK, &lock)!=(
abd0: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f  -1) ){.      pLo
abe0: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53  ck->locktype = S
abf0: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
ac00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
ac10: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
ac20: 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54 68 69 73 20  NLOCK;  /* This 
ac30: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
ac40: 70 65 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d  pen */.    }.  }
ac50: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
ac60: 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  =NO_LOCK ){.    
ac70: 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a  struct openCnt *
ac80: 70 4f 70 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 44  pOpen;..    /* D
ac90: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61  ecrement the sha
aca0: 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72  red lock counter
acb0: 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c  .  Release the l
acc0: 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20  ock using an.   
acd0: 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79   ** OS call only
ace0: 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64   when all thread
acf0: 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70  s in this same p
ad00: 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65  rocess have rele
ad10: 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20  ased.    ** the 
ad20: 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lock..    */.   
ad30: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2d 2d 3b 0a 20   pLock->cnt--;. 
ad40: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 63 6e     if( pLock->cn
ad50: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f  t==0 ){.      lo
ad60: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
ad70: 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  LCK;.      lock.
ad80: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
ad90: 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  SET;.      lock.
ada0: 6c 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c  l_start = lock.l
adb0: 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20  _len = 0L;.     
adc0: 20 69 66 28 20 66 63 6e 74 6c 28 70 46 69 6c 65   if( fcntl(pFile
add0: 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  ->h, F_SETLK, &l
ade0: 6f 63 6b 29 21 3d 28 2d 31 29 20 29 7b 0a 20 20  ock)!=(-1) ){.  
adf0: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63        pLock->loc
ae00: 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  ktype = NO_LOCK;
ae10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ae20: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
ae30: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20  E_IOERR_UNLOCK; 
ae40: 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20   /* This should 
ae50: 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a  never happen */.
ae60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
ae70: 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
ae80: 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63  the count of loc
ae90: 6b 73 20 61 67 61 69 6e 73 74 20 74 68 69 73 20  ks against this 
aea0: 73 61 6d 65 20 66 69 6c 65 2e 20 20 57 68 65 6e  same file.  When
aeb0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e   the.    ** coun
aec0: 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20  t reaches zero, 
aed0: 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65 72 20  close any other 
aee0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
aef0: 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20   whose close.   
af00: 20 2a 2a 20 77 61 73 20 64 65 66 65 72 72 65 64   ** was deferred
af10: 20 62 65 63 61 75 73 65 20 6f 66 20 6f 75 74 73   because of outs
af20: 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20  tanding locks.. 
af30: 20 20 20 2a 2f 0a 20 20 20 20 70 4f 70 65 6e 20     */.    pOpen 
af40: 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a  = pFile->pOpen;.
af50: 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b      pOpen->nLock
af60: 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
af70: 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20  pOpen->nLock>=0 
af80: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 65 6e  );.    if( pOpen
af90: 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 4f  ->nLock==0 && pO
afa0: 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3e 30 20  pen->nPending>0 
afb0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
afc0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
afd0: 3c 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67  <pOpen->nPending
afe0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
aff0: 63 6c 6f 73 65 28 70 4f 70 65 6e 2d 3e 61 50 65  close(pOpen->aPe
b000: 6e 64 69 6e 67 5b 69 5d 29 3b 0a 20 20 20 20 20  nding[i]);.     
b010: 20 7d 0a 20 20 20 20 20 20 66 72 65 65 28 70 4f   }.      free(pO
b020: 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 29 3b 0a  pen->aPending);.
b030: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65        pOpen->nPe
b040: 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  nding = 0;.     
b050: 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67   pOpen->aPending
b060: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
b070: 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a    leaveMutex();.
b080: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
b090: 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
b0a0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
b0b0: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
b0c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b0d0: 75 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65  unixClose(sqlite
b0e0: 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75  3_file *id){.  u
b0f0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
b100: 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b   (unixFile *)id;
b110: 0a 20 20 69 66 28 20 21 70 46 69 6c 65 20 29 20  .  if( !pFile ) 
b120: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
b130: 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 69  ;.  unixUnlock(i
b140: 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 69  d, NO_LOCK);.  i
b150: 66 28 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e  f( pFile->dirfd>
b160: 3d 30 20 29 20 63 6c 6f 73 65 28 70 46 69 6c 65  =0 ) close(pFile
b170: 2d 3e 64 69 72 66 64 29 3b 0a 20 20 70 46 69 6c  ->dirfd);.  pFil
b180: 65 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20  e->dirfd = -1;. 
b190: 20 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a   enterMutex();..
b1a0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4f 70    if( pFile->pOp
b1b0: 65 6e 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20  en->nLock ){.   
b1c0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
b1d0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63   outstanding loc
b1e0: 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61  ks, do not actua
b1f0: 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69  lly close the fi
b200: 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79  le just.    ** y
b210: 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20  et because that 
b220: 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73  would clear thos
b230: 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61  e locks.  Instea
b240: 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a  d, add the file.
b250: 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f      ** descripto
b260: 72 20 74 6f 20 70 4f 70 65 6e 2d 3e 61 50 65 6e  r to pOpen->aPen
b270: 64 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20 62  ding.  It will b
b280: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
b290: 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20 20 20  closed when.    
b2a0: 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b  ** the last lock
b2b0: 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20   is cleared..   
b2c0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 2a 61 4e 65   */.    int *aNe
b2d0: 77 3b 0a 20 20 20 20 73 74 72 75 63 74 20 6f 70  w;.    struct op
b2e0: 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 20 3d 20 70  enCnt *pOpen = p
b2f0: 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20 20  File->pOpen;.   
b300: 20 61 4e 65 77 20 3d 20 72 65 61 6c 6c 6f 63 28   aNew = realloc(
b310: 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67   pOpen->aPending
b320: 2c 20 28 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69  , (pOpen->nPendi
b330: 6e 67 2b 31 29 2a 73 69 7a 65 6f 66 28 69 6e 74  ng+1)*sizeof(int
b340: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65  ) );.    if( aNe
b350: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  w==0 ){.      /*
b360: 20 49 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   If a malloc fai
b370: 6c 73 2c 20 6a 75 73 74 20 6c 65 61 6b 20 74 68  ls, just leak th
b380: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
b390: 72 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  r */.    }else{.
b3a0: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65        pOpen->aPe
b3b0: 6e 64 69 6e 67 20 3d 20 61 4e 65 77 3b 0a 20 20  nding = aNew;.  
b3c0: 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64      pOpen->aPend
b3d0: 69 6e 67 5b 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64  ing[pOpen->nPend
b3e0: 69 6e 67 5d 20 3d 20 70 46 69 6c 65 2d 3e 68 3b  ing] = pFile->h;
b3f0: 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50  .      pOpen->nP
b400: 65 6e 64 69 6e 67 2b 2b 3b 0a 20 20 20 20 7d 0a  ending++;.    }.
b410: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
b420: 54 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  There are no out
b430: 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 73  standing locks s
b440: 6f 20 77 65 20 63 61 6e 20 63 6c 6f 73 65 20 74  o we can close t
b450: 68 65 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74  he file immediat
b460: 65 6c 79 20 2a 2f 0a 20 20 20 20 63 6c 6f 73 65  ely */.    close
b470: 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 7d 0a  (pFile->h);.  }.
b480: 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66    releaseLockInf
b490: 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29 3b  o(pFile->pLock);
b4a0: 0a 20 20 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e  .  releaseOpenCn
b4b0: 74 28 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 29 3b  t(pFile->pOpen);
b4c0: 0a 0a 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29  ..  leaveMutex()
b4d0: 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22 43 4c  ;.  OSTRACE2("CL
b4e0: 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70  OSE   %-3d\n", p
b4f0: 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e  File->h);.  Open
b500: 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 6d  Counter(-1);.  m
b510: 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20  emset(pFile, 0, 
b520: 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
b530: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
b540: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 64 65  TE_OK;.}...#ifde
b550: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
b560: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 70  LOCKING_STYLE.#p
b570: 72 61 67 6d 61 20 6d 61 72 6b 20 41 46 50 20 53  ragma mark AFP S
b580: 75 70 70 6f 72 74 0a 0a 2f 2a 0a 20 2a 2a 20 54  upport../*. ** T
b590: 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  he afpLockingCon
b5a0: 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20 63  text structure c
b5b0: 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66 70 20  ontains all afp 
b5c0: 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20 73 74  lock specific st
b5d0: 61 74 65 0a 20 2a 2f 0a 74 79 70 65 64 65 66 20  ate. */.typedef 
b5e0: 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e  struct afpLockin
b5f0: 67 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b  gContext afpLock
b600: 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75  ingContext;.stru
b610: 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  ct afpLockingCon
b620: 74 65 78 74 20 7b 0a 20 20 75 6e 73 69 67 6e 65  text {.  unsigne
b630: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72  d long long shar
b640: 65 64 4c 6f 63 6b 42 79 74 65 3b 0a 20 20 63 68  edLockByte;.  ch
b650: 61 72 20 2a 66 69 6c 65 50 61 74 68 3b 0a 7d 3b  ar *filePath;.};
b660: 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52 61 6e  ..struct ByteRan
b670: 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e  geLockPB2.{.  un
b680: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
b690: 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20   offset;        
b6a0: 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72  /* offset to fir
b6b0: 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20  st byte to lock 
b6c0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
b6d0: 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20  ng long length; 
b6e0: 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66         /* nbr of
b6f0: 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
b700: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
b710: 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53  g long retRangeS
b720: 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20  tart; /* nbr of 
b730: 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20  1st byte locked 
b740: 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f  if successful */
b750: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
b760: 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20   unLockFlag;    
b770: 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f       /* 1 = unlo
b780: 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a  ck, 0 = lock */.
b790: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
b7a0: 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20  startEndFlag;   
b7b0: 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20      /* 1=rel to 
b7c0: 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72  end of fork, 0=r
b7d0: 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20  el to start */. 
b7e0: 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20   int fd;        
b7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b800: 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20     /* file desc 
b810: 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f  to assoc this lo
b820: 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23  ck with */.};..#
b830: 64 65 66 69 6e 65 20 61 66 70 66 73 42 79 74 65  define afpfsByte
b840: 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20  RangeLock2FSCTL 
b850: 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27         _IOWR('z'
b860: 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74  , 23, struct Byt
b870: 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a  eRangeLockPB2)..
b880: 2f 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  /* .** Return 0 
b890: 6f 6e 20 73 75 63 63 65 73 73 2c 20 31 20 6f 6e  on success, 1 on
b8a0: 20 66 61 69 6c 75 72 65 2e 20 20 54 6f 20 6d 61   failure.  To ma
b8b0: 74 63 68 20 74 68 65 20 62 65 68 61 76 69 6f 72  tch the behavior
b8c0: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6e 6f 72 6d   of the .** norm
b8d0: 61 6c 20 70 6f 73 69 78 20 66 69 6c 65 20 6c 6f  al posix file lo
b8e0: 63 6b 69 6e 67 20 28 75 73 65 64 20 69 6e 20 75  cking (used in u
b8f0: 6e 69 78 4c 6f 63 6b 20 66 6f 72 20 65 78 61 6d  nixLock for exam
b900: 70 6c 65 29 2c 20 77 65 20 73 68 6f 75 6c 64 20  ple), we should 
b910: 0a 2a 2a 20 70 72 6f 76 69 64 65 20 27 72 69 63  .** provide 'ric
b920: 68 65 72 27 20 72 65 74 75 72 6e 20 63 6f 64 65  her' return code
b930: 73 20 2d 20 73 70 65 63 69 66 69 63 61 6c 6c 79  s - specifically
b940: 20 74 6f 20 64 69 66 66 65 72 65 6e 74 69 61 74   to differentiat
b950: 65 20 62 65 74 77 65 65 6e 0a 2a 2a 20 27 66 69  e between.** 'fi
b960: 6c 65 20 62 75 73 79 27 20 61 6e 64 20 27 66 69  le busy' and 'fi
b970: 6c 65 20 73 79 73 74 65 6d 20 65 72 72 6f 72 27  le system error'
b980: 20 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73 74 61   results..*/.sta
b990: 74 69 63 20 69 6e 74 20 5f 41 46 50 46 53 53 65  tic int _AFPFSSe
b9a0: 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63  tLock(.  const c
b9b0: 68 61 72 20 2a 70 61 74 68 2c 20 0a 20 20 69 6e  har *path, .  in
b9c0: 74 20 66 64 2c 20 0a 20 20 75 6e 73 69 67 6e 65  t fd, .  unsigne
b9d0: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73  d long long offs
b9e0: 65 74 2c 20 0a 20 20 75 6e 73 69 67 6e 65 64 20  et, .  unsigned 
b9f0: 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68  long long length
ba00: 2c 20 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b  , .  int setLock
ba10: 46 6c 61 67 0a 29 7b 0a 20 20 73 74 72 75 63 74  Flag.){.  struct
ba20: 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
ba30: 32 20 20 20 20 20 20 20 70 62 3b 0a 20 20 69 6e  2       pb;.  in
ba40: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
ba50: 20 20 20 20 20 20 65 72 72 3b 0a 20 20 0a 20 20        err;.  .  
ba60: 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20  pb.unLockFlag = 
ba70: 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30 20  setLockFlag ? 0 
ba80: 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72 74 45  : 1;.  pb.startE
ba90: 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70 62  ndFlag = 0;.  pb
baa0: 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74  .offset = offset
bab0: 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d 20  ;.  pb.length = 
bac0: 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66 64  length; .  pb.fd
bad0: 20 3d 20 66 64 3b 0a 20 20 4f 53 54 52 41 43 45   = fd;.  OSTRACE
bae0: 35 28 22 41 46 50 4c 4f 43 4b 20 73 65 74 74 69  5("AFPLOCK setti
baf0: 6e 67 20 6c 6f 63 6b 20 25 73 20 66 6f 72 20 25  ng lock %s for %
bb00: 64 20 69 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a  d in range %llx:
bb10: 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73  %llx\n", .    (s
bb20: 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a  etLockFlag?"ON":
bb30: 22 4f 46 46 22 29 2c 20 66 64 2c 20 6f 66 66 73  "OFF"), fd, offs
bb40: 65 74 2c 20 6c 65 6e 67 74 68 29 3b 0a 20 20 65  et, length);.  e
bb50: 72 72 20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c  rr = fsctl(path,
bb60: 20 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c   afpfsByteRangeL
bb70: 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c 20  ock2FSCTL, &pb, 
bb80: 30 29 3b 0a 20 20 69 66 20 28 20 65 72 72 3d 3d  0);.  if ( err==
bb90: 2d 31 20 29 20 7b 0a 20 20 20 20 4f 53 54 52 41  -1 ) {.    OSTRA
bba0: 43 45 34 28 22 41 46 50 4c 4f 43 4b 20 66 61 69  CE4("AFPLOCK fai
bbb0: 6c 65 64 20 74 6f 20 66 73 63 74 6c 28 29 20 27  led to fsctl() '
bbc0: 25 73 27 20 25 64 20 25 73 5c 6e 22 2c 20 70 61  %s' %d %s\n", pa
bbd0: 74 68 2c 20 65 72 72 6e 6f 2c 20 0a 20 20 20 20  th, errno, .    
bbe0: 20 20 73 74 72 65 72 72 6f 72 28 65 72 72 6e 6f    strerror(errno
bbf0: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ));.    return 1
bc00: 3b 20 2f 2a 20 65 72 72 6f 72 20 2a 2f 0a 20 20  ; /* error */.  
bc10: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74  } else {.    ret
bc20: 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 0;.  }.}../*
bc30: 0a 20 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  . ** This routin
bc40: 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
bc50: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
bc60: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
bc70: 20 73 70 65 63 69 66 69 65 64 0a 20 2a 2a 20 66   specified. ** f
bc80: 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
bc90: 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
bca0: 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
bcb0: 20 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e   is held, return
bcc0: 0a 20 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20  . ** non-zero.  
bcd0: 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  If the file is u
bce0: 6e 6c 6f 63 6b 65 64 20 6f 72 20 68 6f 6c 64 73  nlocked or holds
bcf0: 20 6f 6e 6c 79 20 53 48 41 52 45 44 20 6c 6f 63   only SHARED loc
bd00: 6b 73 2c 20 74 68 65 6e 0a 20 2a 2a 20 72 65 74  ks, then. ** ret
bd10: 75 72 6e 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 73 74  urn zero.. */.st
bd20: 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e 69 78  atic int afpUnix
bd30: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
bd40: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
bd50: 69 64 29 7b 0a 20 20 69 6e 74 20 72 20 3d 20 30  id){.  int r = 0
bd60: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
bd70: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
bd80: 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  )id;.  .  assert
bd90: 28 20 70 46 69 6c 65 20 29 3b 20 0a 20 20 61 66  ( pFile ); .  af
bda0: 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
bdb0: 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c  *context = (afpL
bdc0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
bdd0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
bde0: 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 2f 2a 20  ontext;.  .  /* 
bdf0: 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
be00: 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
be10: 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
be20: 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
be30: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41  le->locktype>SHA
be40: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
be50: 72 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20  r = 1;.  }.  .  
be60: 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
be70: 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
be80: 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
be90: 0a 20 20 20 2a 2f 0a 20 20 69 66 20 28 20 21 72  .   */.  if ( !r
bea0: 20 29 20 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b   ) {.    /* lock
beb0: 20 74 68 65 20 62 79 74 65 20 2a 2f 0a 20 20 20   the byte */.   
bec0: 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 5f 41   int failed = _A
bed0: 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74  FPFSSetLock(cont
bee0: 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70  ext->filePath, p
bef0: 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45  File->h, RESERVE
bf00: 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a  D_BYTE, 1,1);  .
bf10: 20 20 20 20 69 66 20 28 66 61 69 6c 65 64 29 20      if (failed) 
bf20: 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65  {.      /* if we
bf30: 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 74   failed to get t
bf40: 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d  he lock then som
bf50: 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74 20 68  eone else must h
bf60: 61 76 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20  ave it */.      
bf70: 72 20 3d 20 31 3b 0a 20 20 20 20 7d 20 65 6c 73  r = 1;.    } els
bf80: 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20  e {.      /* if 
bf90: 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20  we succeeded in 
bfa0: 74 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72  taking the reser
bfb0: 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b  ved lock, unlock
bfc0: 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20   it to restore. 
bfd0: 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67       ** the orig
bfe0: 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20  inal state */.  
bff0: 20 20 20 20 5f 41 46 50 46 53 53 65 74 4c 6f 63      _AFPFSSetLoc
c000: 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50  k(context->fileP
c010: 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 52  ath, pFile->h, R
c020: 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
c030: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   0);.    }.  }. 
c040: 20 4f 53 54 52 41 43 45 33 28 22 54 45 53 54 20   OSTRACE3("TEST 
c050: 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 5c 6e 22  WR-LOCK %d %d\n"
c060: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 29 3b 0a  , pFile->h, r);.
c070: 20 20 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d    .  return r;.}
c080: 0a 0a 2f 2a 20 41 46 50 2d 73 74 79 6c 65 20 6c  ../* AFP-style l
c090: 6f 63 6b 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67  ocking following
c0a0: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   the behavior of
c0b0: 20 75 6e 69 78 4c 6f 63 6b 2c 20 73 65 65 20 74   unixLock, see t
c0c0: 68 65 20 75 6e 69 78 4c 6f 63 6b 20 0a 2a 2a 20  he unixLock .** 
c0d0: 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 6d 65 6e 74  function comment
c0e0: 73 20 66 6f 72 20 64 65 74 61 69 6c 73 20 6f 66  s for details of
c0f0: 20 6c 6f 63 6b 20 6d 61 6e 61 67 65 6d 65 6e 74   lock management
c100: 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
c110: 61 66 70 55 6e 69 78 4c 6f 63 6b 28 73 71 6c 69  afpUnixLock(sqli
c120: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
c130: 74 20 6c 6f 63 6b 74 79 70 65 29 0a 7b 0a 20 20  t locktype).{.  
c140: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
c150: 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
c160: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
c170: 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b  e*)id;.  afpLock
c180: 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  ingContext *cont
c190: 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e  ext = (afpLockin
c1a0: 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c  gContext *) pFil
c1b0: 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
c1c0: 74 3b 0a 20 20 69 6e 74 20 67 6f 74 50 65 6e 64  t;.  int gotPend
c1d0: 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 0a  ingLock = 0;.  .
c1e0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
c1f0: 29 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22 4c  );.  OSTRACE5("L
c200: 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73  OCK    %d %s was
c210: 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70   %s pid=%d\n", p
c220: 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
c230: 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c    locktypeName(l
c240: 6f 63 6b 74 79 70 65 29 2c 20 6c 6f 63 6b 74 79  ocktype), lockty
c250: 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f  peName(pFile->lo
c260: 63 6b 74 79 70 65 29 2c 20 67 65 74 70 69 64 28  cktype), getpid(
c270: 29 29 3b 20 20 0a 20 20 2f 2a 20 49 66 20 74 68  ));  .  /* If th
c280: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
c290: 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
c2a0: 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
c2b0: 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
c2c0: 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64    ** unixFile, d
c2d0: 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74  o nothing. Don't
c2e0: 20 75 73 65 20 74 68 65 20 61 66 70 5f 65 6e 64   use the afp_end
c2f0: 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
c300: 2c 20 61 73 0a 20 20 20 20 2a 2a 20 65 6e 74 65  , as.    ** ente
c310: 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20  rMutex() hasn't 
c320: 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e  been called yet.
c330: 0a 20 20 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  .    */.  if( pF
c340: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c  ile->locktype>=l
c350: 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 4f  ocktype ){.    O
c360: 53 54 52 41 43 45 33 28 22 4c 4f 43 4b 20 20 20  STRACE3("LOCK   
c370: 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61   %d %s ok (alrea
c380: 64 79 20 68 65 6c 64 29 5c 6e 22 2c 20 70 46 69  dy held)\n", pFi
c390: 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
c3a0: 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c    locktypeName(l
c3b0: 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 20 20 72  ocktype));.    r
c3c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c3d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
c3e0: 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  sure the locking
c3f0: 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72   sequence is cor
c400: 72 65 63 74 0a 20 20 20 20 2a 2f 0a 20 20 61 73  rect.    */.  as
c410: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
c420: 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  ktype!=NO_LOCK |
c430: 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  | locktype==SHAR
c440: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
c450: 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50  ert( locktype!=P
c460: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20  ENDING_LOCK );. 
c470: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
c480: 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e!=RESERVED_LOCK
c490: 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   || pFile->lockt
c4a0: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
c4b0: 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73   );.  .  /* This
c4c0: 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64   mutex is needed
c4d0: 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e   because pFile->
c4e0: 70 4c 6f 63 6b 20 69 73 20 73 68 61 72 65 64 20  pLock is shared 
c4f0: 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20  across threads. 
c500: 20 20 20 2a 2f 0a 20 20 65 6e 74 65 72 4d 75 74     */.  enterMut
c510: 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ex();..  /* Make
c520: 20 73 75 72 65 20 74 68 65 20 63 75 72 72 65 6e   sure the curren
c530: 74 20 74 68 72 65 61 64 20 6f 77 6e 73 20 74 68  t thread owns th
c540: 65 20 70 46 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  e pFile..    */.
c550: 20 20 72 63 20 3d 20 74 72 61 6e 73 66 65 72 4f    rc = transferO
c560: 77 6e 65 72 73 68 69 70 28 70 46 69 6c 65 29 3b  wnership(pFile);
c570: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
c580: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6c 65 61 76  E_OK ){.    leav
c590: 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65  eMutex();.    re
c5a0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 20  turn rc;.  }.   
c5b0: 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47   .  /* A PENDING
c5c0: 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20   lock is needed 
c5d0: 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67  before acquiring
c5e0: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61   a SHARED lock a
c5f0: 6e 64 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  nd before.    **
c600: 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58   acquiring an EX
c610: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46  CLUSIVE lock.  F
c620: 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f  or the SHARED lo
c630: 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20  ck, the PENDING 
c640: 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72  will.    ** be r
c650: 65 6c 65 61 73 65 64 2e 0a 20 20 20 20 2a 2f 0a  eleased..    */.
c660: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
c670: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20  SHARED_LOCK .   
c680: 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65 3d     || (locktype=
c690: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
c6a0: 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  && pFile->lockty
c6b0: 70 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29  pe<PENDING_LOCK)
c6c0: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 69 6e  .      ){.    in
c6d0: 74 20 66 61 69 6c 65 64 20 3d 20 5f 41 46 50 46  t failed = _AFPF
c6e0: 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  SSetLock(context
c6f0: 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c  ->filePath, pFil
c700: 65 2d 3e 68 2c 20 0a 20 20 20 20 20 20 50 45 4e  e->h, .      PEN
c710: 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31 29  DING_BYTE, 1, 1)
c720: 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65 64  ;.    if (failed
c730: 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  ) {.      rc = S
c740: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
c750: 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
c760: 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ock;.    }.  }. 
c770: 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f   .  /* If contro
c780: 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70  l gets to this p
c790: 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61  oint, then actua
c7a0: 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64  lly go ahead and
c7b0: 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 6f 70 65   make.    ** ope
c7c0: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61  rating system ca
c7d0: 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63  lls for the spec
c7e0: 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 20 20  ified lock..    
c7f0: 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
c800: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
c810: 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 2c 20 66 61  {.    int lk, fa
c820: 69 6c 65 64 3b 0a 20 20 20 20 69 6e 74 20 74 72  iled;.    int tr
c830: 69 65 73 20 3d 20 30 3b 0a 20 20 20 20 0a 20 20  ies = 0;.    .  
c840: 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65    /* Now get the
c850: 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20   read-lock */.  
c860: 20 20 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74    /* note that t
c870: 68 65 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68  he quality of th
c880: 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65  e randomness doe
c890: 73 6e 27 74 20 6d 61 74 74 65 72 20 74 68 61 74  sn't matter that
c8a0: 20 6d 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20   much */.    lk 
c8b0: 3d 20 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20  = random(); .   
c8c0: 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64   context->shared
c8d0: 4c 6f 63 6b 42 79 74 65 20 3d 20 28 6c 6b 20 26  LockByte = (lk &
c8e0: 20 30 78 37 66 66 66 66 66 66 66 29 25 28 53 48   0x7fffffff)%(SH
c8f0: 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a  ARED_SIZE - 1);.
c900: 20 20 20 20 66 61 69 6c 65 64 20 3d 20 5f 41 46      failed = _AF
c910: 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  PFSSetLock(conte
c920: 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46  xt->filePath, pF
c930: 69 6c 65 2d 3e 68 2c 20 0a 20 20 20 20 20 20 53  ile->h, .      S
c940: 48 41 52 45 44 5f 46 49 52 53 54 2b 63 6f 6e 74  HARED_FIRST+cont
c950: 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ext->sharedLockB
c960: 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  yte, 1, 1);.    
c970: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65  .    /* Drop the
c980: 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49   temporary PENDI
c990: 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69  NG lock */.    i
c9a0: 66 20 28 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b  f (_AFPFSSetLock
c9b0: 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61  (context->filePa
c9c0: 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 50 45  th, pFile->h, PE
c9d0: 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30  NDING_BYTE, 1, 0
c9e0: 29 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  )) {.      rc = 
c9f0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
ca00: 4f 43 4b 3b 20 20 2f 2a 20 54 68 69 73 20 73 68  OCK;  /* This sh
ca10: 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65  ould never happe
ca20: 6e 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20  n */.      goto 
ca30: 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
ca40: 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 69 66 28    }.    .    if(
ca50: 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20   failed ){.     
ca60: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
ca70: 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  Y;.    } else {.
ca80: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
ca90: 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c  ktype = SHARED_L
caa0: 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  OCK;.    }.  }el
cab0: 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
cac0: 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20 61  equest was for a
cad0: 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
cae0: 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74  LUSIVE lock.  It
caf0: 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d   is.    ** assum
cb00: 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ed that there is
cb10: 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72 65   a SHARED or gre
cb20: 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
cb30: 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72   file.    ** alr
cb40: 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eady..    */.   
cb50: 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b   int failed = 0;
cb60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d  .    assert( 0!=
cb70: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
cb80: 29 3b 0a 20 20 20 20 69 66 20 28 6c 6f 63 6b 74  );.    if (lockt
cb90: 79 70 65 20 3e 3d 20 52 45 53 45 52 56 45 44 5f  ype >= RESERVED_
cba0: 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c  LOCK && pFile->l
cbb0: 6f 63 6b 74 79 70 65 20 3c 20 52 45 53 45 52 56  ocktype < RESERV
cbc0: 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20  ED_LOCK) {.     
cbd0: 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20     /* Acquire a 
cbe0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f  RESERVED lock */
cbf0: 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20  .        failed 
cc00: 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28  = _AFPFSSetLock(
cc10: 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74  context->filePat
cc20: 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53  h, pFile->h, RES
cc30: 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29  ERVED_BYTE, 1,1)
cc40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
cc50: 21 66 61 69 6c 65 64 20 26 26 20 6c 6f 63 6b 74  !failed && lockt
cc60: 79 70 65 20 3d 3d 20 45 58 43 4c 55 53 49 56 45  ype == EXCLUSIVE
cc70: 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 2f  _LOCK) {.      /
cc80: 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 58 43  * Acquire an EXC
cc90: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20  LUSIVE lock */. 
cca0: 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a         .      /*
ccb0: 20 52 65 6d 6f 76 65 20 74 68 65 20 73 68 61 72   Remove the shar
ccc0: 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20 74  ed lock before t
ccd0: 72 79 69 6e 67 20 74 68 65 20 72 61 6e 67 65 2e  rying the range.
cce0: 20 20 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f 20    we'll need to 
ccf0: 0a 20 20 20 20 20 20 2a 2a 20 72 65 65 73 74 61  .      ** reesta
cd00: 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64  blish the shared
cd10: 20 6c 6f 63 6b 20 69 66 20 77 65 20 63 61 6e 27   lock if we can'
cd20: 74 20 67 65 74 20 74 68 65 20 20 61 66 70 55 6e  t get the  afpUn
cd30: 69 78 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a  ixUnlock.      *
cd40: 2f 0a 20 20 20 20 20 20 69 66 20 28 21 5f 41 46  /.      if (!_AF
cd50: 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  PFSSetLock(conte
cd60: 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46  xt->filePath, pF
cd70: 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46  ile->h, SHARED_F
cd80: 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20 20  IRST +.         
cd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cda0: 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64 4c  context->sharedL
cdb0: 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 29 20  ockByte, 1, 0)) 
cdc0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 77  {.        /* now
cdd0: 20 61 74 74 65 6d 6d 70 74 20 74 6f 20 67 65 74   attemmpt to get
cde0: 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
cdf0: 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20  ock range */.   
ce00: 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 5f 41       failed = _A
ce10: 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74  FPFSSetLock(cont
ce20: 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70  ext->filePath, p
ce30: 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
ce40: 46 49 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20  FIRST, .        
ce50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce60: 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49         SHARED_SI
ce70: 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ZE, 1);.        
ce80: 69 66 20 28 66 61 69 6c 65 64 20 26 26 20 5f 41  if (failed && _A
ce90: 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74  FPFSSetLock(cont
cea0: 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70  ext->filePath, p
ceb0: 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
cec0: 46 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20  FIRST +.        
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cee0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
cef0: 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ext->sharedLockB
cf00: 79 74 65 2c 20 31 2c 20 31 29 29 20 7b 0a 20 20  yte, 1, 1)) {.  
cf10: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
cf20: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
cf30: 3b 20 2f 2a 20 74 68 69 73 20 73 68 6f 75 6c 64  ; /* this should
cf40: 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f   never happen */
cf50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
cf60: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
cf70: 20 20 2f 2a 20 2a 2f 0a 20 20 20 20 20 20 20 20    /* */.        
cf80: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
cf90: 52 5f 55 4e 4c 4f 43 4b 3b 20 2f 2a 20 74 68 69  R_UNLOCK; /* thi
cfa0: 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68  s should never h
cfb0: 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d  appen */.      }
cfc0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66  .    }.    if( f
cfd0: 61 69 6c 65 64 20 26 26 20 72 63 20 3d 3d 20 53  ailed && rc == S
cfe0: 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 20  QLITE_OK){.     
cff0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
d000: 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  Y;.    }.  }.  .
d010: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
d020: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  _OK ){.    pFile
d030: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
d040: 6b 74 79 70 65 3b 0a 20 20 7d 65 6c 73 65 20 69  ktype;.  }else i
d050: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  f( locktype==EXC
d060: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
d070: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
d080: 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  pe = PENDING_LOC
d090: 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f 65 6e  K;.  }.  .afp_en
d0a0: 64 5f 6c 6f 63 6b 3a 0a 20 20 20 20 6c 65 61 76  d_lock:.    leav
d0b0: 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
d0c0: 41 43 45 34 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE4("LOCK    %d
d0d0: 20 25 73 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65   %s %s\n", pFile
d0e0: 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d  ->h, locktypeNam
d0f0: 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 0a 20 20  e(locktype), .  
d100: 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
d110: 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66  E_OK ? "ok" : "f
d120: 61 69 6c 65 64 22 29 3b 0a 20 20 72 65 74 75 72  ailed");.  retur
d130: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20  n rc;.}../*. ** 
d140: 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
d150: 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
d160: 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
d170: 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c   to locktype.  l
d180: 6f 63 6b 74 79 70 65 0a 20 2a 2a 20 6d 75 73 74  ocktype. ** must
d190: 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
d1a0: 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
d1b0: 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74 68  K.. **. ** If th
d1c0: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
d1d0: 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
d1e0: 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
d1f0: 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20 2a  y at or below. *
d200: 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
d210: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
d220: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
d230: 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74   no-op.. */.stat
d240: 69 63 20 69 6e 74 20 61 66 70 55 6e 69 78 55 6e  ic int afpUnixUn
d250: 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
d260: 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
d270: 79 70 65 29 20 7b 0a 20 20 73 74 72 75 63 74 20  ype) {.  struct 
d280: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e  flock lock;.  in
d290: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
d2a0: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
d2b0: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
d2c0: 29 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e  )id;.  afpLockin
d2d0: 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  gContext *contex
d2e0: 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43  t = (afpLockingC
d2f0: 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d  ontext *) pFile-
d300: 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
d310: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
d320: 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 35 28  e );.  OSTRACE5(
d330: 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
d340: 61 73 20 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c  as %d pid=%d\n",
d350: 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74   pFile->h, lockt
d360: 79 70 65 2c 0a 20 20 20 20 20 20 20 20 20 70 46  ype,.         pF
d370: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 67  ile->locktype, g
d380: 65 74 70 69 64 28 29 29 3b 0a 20 20 0a 20 20 61  etpid());.  .  a
d390: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c  ssert( locktype<
d3a0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
d3b0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
d3c0: 6b 74 79 70 65 3c 3d 6c 6f 63 6b 74 79 70 65 20  ktype<=locktype 
d3d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
d3e0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
d3f0: 66 28 20 43 48 45 43 4b 5f 54 48 52 45 41 44 49  f( CHECK_THREADI
d400: 44 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20  D(pFile) ){.    
d410: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
d420: 53 55 53 45 3b 0a 20 20 7d 0a 20 20 65 6e 74 65  SUSE;.  }.  ente
d430: 72 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20  rMutex();.  if( 
d440: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
d450: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
d460: 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d     if( locktype=
d470: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
d480: 20 20 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64        int failed
d490: 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20   = 0;..      /* 
d4a0: 75 6e 6c 6f 63 6b 20 74 68 65 20 65 78 63 6c 75  unlock the exclu
d4b0: 73 69 76 65 20 72 61 6e 67 65 20 2d 20 74 68 65  sive range - the
d4c0: 6e 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20 74  n re-establish t
d4d0: 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a  he shared lock *
d4e0: 2f 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c  /.      if (pFil
d4f0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  e->locktype==EXC
d500: 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20  LUSIVE_LOCK) {. 
d510: 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20         failed = 
d520: 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f  _AFPFSSetLock(co
d530: 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c  ntext->filePath,
d540: 20 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45   pFile->h, SHARE
d550: 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20 20 20  D_FIRST, .      
d560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d570: 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
d580: 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20  D_SIZE, 0);.    
d590: 20 20 20 20 69 66 20 28 21 66 61 69 6c 65 64 29      if (!failed)
d5a0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20   {.          /* 
d5b0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 6d  successfully rem
d5c0: 6f 76 65 64 20 74 68 65 20 65 78 63 6c 75 73 69  oved the exclusi
d5d0: 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  ve lock */.     
d5e0: 20 20 20 20 20 69 66 20 28 5f 41 46 50 46 53 53       if (_AFPFSS
d5f0: 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
d600: 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d  filePath, pFile-
d610: 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
d620: 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +.              
d630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
d640: 6e 74 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63  ntext->sharedLoc
d650: 6b 42 79 74 65 2c 20 31 2c 20 31 29 29 20 7b 0a  kByte, 1, 1)) {.
d660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
d670: 61 69 6c 65 64 20 74 6f 20 72 65 2d 65 73 74 61  ailed to re-esta
d680: 62 6c 69 73 68 20 6f 75 72 20 73 68 61 72 65 64  blish our shared
d690: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20   lock */.       
d6a0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
d6b0: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b 20 2f  _IOERR_RDLOCK; /
d6c0: 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65  * This should ne
d6d0: 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20  ver happen */.  
d6e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d6f0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
d700: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 68 6f       /* This sho
d710: 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e  uld never happen
d720: 20 2d 20 66 61 69 6c 65 64 20 74 6f 20 75 6e 6c   - failed to unl
d730: 6f 63 6b 20 74 68 65 20 65 78 63 6c 75 73 69 76  ock the exclusiv
d740: 65 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20  e range */.     
d750: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
d760: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
d770: 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20         } .      
d780: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  }.    }.    if (
d790: 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20  rc == SQLITE_OK 
d7a0: 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  && pFile->lockty
d7b0: 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  pe>=PENDING_LOCK
d7c0: 29 20 7b 0a 20 20 20 20 20 20 69 66 20 28 5f 41  ) {.      if (_A
d7d0: 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74  FPFSSetLock(cont
d7e0: 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70  ext->filePath, p
d7f0: 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47  File->h, PENDING
d800: 5f 42 59 54 45 2c 20 31 2c 20 30 29 29 7b 0a 20  _BYTE, 1, 0)){. 
d810: 20 20 20 20 20 20 20 2f 2a 20 66 61 69 6c 65 64         /* failed
d820: 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20   to release the 
d830: 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a  pending lock */.
d840: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
d850: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
d860: 3b 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64  ; /* This should
d870: 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f   never happen */
d880: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 0a  .      }.    } .
d890: 20 20 20 20 69 66 20 28 72 63 20 3d 3d 20 53 51      if (rc == SQ
d8a0: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65  LITE_OK && pFile
d8b0: 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45  ->locktype>=RESE
d8c0: 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  RVED_LOCK) {.   
d8d0: 20 20 20 69 66 20 28 5f 41 46 50 46 53 53 65 74     if (_AFPFSSet
d8e0: 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69  Lock(context->fi
d8f0: 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68  lePath, pFile->h
d900: 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
d910: 20 31 2c 20 30 29 29 20 7b 0a 20 20 20 20 20 20   1, 0)) {.      
d920: 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 72    /* failed to r
d930: 65 6c 65 61 73 65 20 74 68 65 20 72 65 73 65 72  elease the reser
d940: 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ved lock */.    
d950: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
d960: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 20 2f  IOERR_UNLOCK;  /
d970: 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65  * This should ne
d980: 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20  ver happen */.  
d990: 20 20 20 20 7d 0a 20 20 20 20 7d 20 0a 20 20 7d      }.    } .  }
d9a0: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
d9b0: 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  =NO_LOCK ){.    
d9c0: 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 5f 41 46  int failed = _AF
d9d0: 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  PFSSetLock(conte
d9e0: 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46  xt->filePath, pF
d9f0: 69 6c 65 2d 3e 68 2c 20 0a 20 20 20 20 20 20 20  ile->h, .       
da00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da10: 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46          SHARED_F
da20: 49 52 53 54 20 2b 20 63 6f 6e 74 65 78 74 2d 3e  IRST + context->
da30: 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20  sharedLockByte, 
da40: 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 20 28 66  1, 0);.    if (f
da50: 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 72  ailed) {.      r
da60: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
da70: 5f 55 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54 68 69  _UNLOCK;  /* Thi
da80: 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68  s should never h
da90: 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20  appen */.    }. 
daa0: 20 7d 0a 20 20 69 66 20 28 72 63 20 3d 3d 20 53   }.  if (rc == S
dab0: 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 20 70 46  QLITE_OK).    pF
dac0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
dad0: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 6c 65 61 76  locktype;.  leav
dae0: 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75  eMutex();.  retu
daf0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a  rn rc;.}../*. **
db00: 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 26 20   Close a file & 
db10: 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70 65 63  cleanup AFP spec
db20: 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e  ific locking con
db30: 74 65 78 74 20 0a 20 2a 2f 0a 73 74 61 74 69 63  text . */.static
db40: 20 69 6e 74 20 61 66 70 55 6e 69 78 43 6c 6f 73   int afpUnixClos
db50: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
db60: 69 64 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  id) {.  unixFile
db70: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
db80: 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 66 28 20  ile*)id;..  if( 
db90: 21 70 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20  !pFile ) return 
dba0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 66 70  SQLITE_OK;.  afp
dbb0: 55 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e  UnixUnlock(id, N
dbc0: 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 2f 2a 20 66 72  O_LOCK);.  /* fr
dbd0: 65 65 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 69  ee the AFP locki
dbe0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ng structure */.
dbf0: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
dc00: 6b 69 6e 67 43 6f 6e 74 65 78 74 20 21 3d 20 4e  kingContext != N
dc10: 55 4c 4c 29 20 7b 0a 20 20 20 20 69 66 20 28 28  ULL) {.    if ((
dc20: 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
dc30: 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
dc40: 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 66 69 6c  ingContext)->fil
dc50: 65 50 61 74 68 20 21 3d 20 4e 55 4c 4c 29 0a 20  ePath != NULL). 
dc60: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
dc70: 65 28 28 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  e(((afpLockingCo
dc80: 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f  ntext*)pFile->lo
dc90: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 66  ckingContext)->f
dca0: 69 6c 65 50 61 74 68 29 3b 0a 20 20 20 20 73 71  ilePath);.    sq
dcb0: 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65  lite3_free(pFile
dcc0: 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
dcd0: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 46  );.  }..  if( pF
dce0: 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29 20  ile->dirfd>=0 ) 
dcf0: 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72  close(pFile->dir
dd00: 66 64 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 64 69  fd);.  pFile->di
dd10: 72 66 64 20 3d 20 2d 31 3b 0a 20 20 65 6e 74 65  rfd = -1;.  ente
dd20: 72 4d 75 74 65 78 28 29 3b 0a 20 20 63 6c 6f 73  rMutex();.  clos
dd30: 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 6c  e(pFile->h);.  l
dd40: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
dd50: 53 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20 20  STRACE2("CLOSE  
dd60: 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d   %-3d\n", pFile-
dd70: 3e 68 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74  >h);.  OpenCount
dd80: 65 72 28 2d 31 29 3b 0a 20 20 6d 65 6d 73 65 74  er(-1);.  memset
dd90: 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f  (pFile, 0, sizeo
dda0: 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20  f(unixFile));.  
ddb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ddc0: 3b 0a 7d 0a 0a 0a 23 70 72 61 67 6d 61 20 6d 61  ;.}...#pragma ma
ddd0: 72 6b 20 66 6c 6f 63 6b 28 29 20 73 74 79 6c 65  rk flock() style
dde0: 20 6c 6f 63 6b 69 6e 67 0a 0a 2f 2a 0a 20 2a 2a   locking../*. **
ddf0: 20 54 68 65 20 66 6c 6f 63 6b 4c 6f 63 6b 69 6e   The flockLockin
de00: 67 43 6f 6e 74 65 78 74 20 69 73 20 6e 6f 74 20  gContext is not 
de10: 75 73 65 64 0a 20 2a 2f 0a 74 79 70 65 64 65 66  used. */.typedef
de20: 20 76 6f 69 64 20 66 6c 6f 63 6b 4c 6f 63 6b 69   void flockLocki
de30: 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 73 74 61 74  ngContext;..stat
de40: 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 69 78  ic int flockUnix
de50: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
de60: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
de70: 69 64 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  id) {.  unixFile
de80: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
de90: 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 69 66  ile*)id;.  .  if
dea0: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70   (pFile->locktyp
deb0: 65 20 3d 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f  e == RESERVED_LO
dec0: 43 4b 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  CK) {.    return
ded0: 20 31 3b 20 2f 2a 20 61 6c 72 65 61 64 79 20 68   1; /* already h
dee0: 61 76 65 20 61 20 72 65 73 65 72 76 65 64 20 6c  ave a reserved l
def0: 6f 63 6b 20 2a 2f 0a 20 20 7d 20 65 6c 73 65 20  ock */.  } else 
df00: 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d 70 74  {.    /* attempt
df10: 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b   to get the lock
df20: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   */.    int rc =
df30: 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c   flock(pFile->h,
df40: 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f   LOCK_EX | LOCK_
df50: 4e 42 29 3b 0a 20 20 20 20 69 66 20 28 21 72 63  NB);.    if (!rc
df60: 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74  ) {.      /* got
df70: 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63   the lock, unloc
df80: 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 66 6c  k it */.      fl
df90: 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f  ock(pFile->h, LO
dfa0: 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20 20 72 65  CK_UN);.      re
dfb0: 74 75 72 6e 20 30 3b 20 20 2f 2a 20 6e 6f 20 6f  turn 0;  /* no o
dfc0: 6e 65 20 68 61 73 20 69 74 20 72 65 73 65 72 76  ne has it reserv
dfd0: 65 64 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  ed */.    }.    
dfe0: 72 65 74 75 72 6e 20 31 3b 20 2f 2a 20 73 6f 6d  return 1; /* som
dff0: 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68 74 20  eone else might 
e000: 68 61 76 65 20 69 74 20 72 65 73 65 72 76 65 64  have it reserved
e010: 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69   */.  }.}..stati
e020: 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 69 78 4c  c int flockUnixL
e030: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
e040: 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
e050: 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  pe) {.  unixFile
e060: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
e070: 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 2f 2a  ile*)id;.  .  /*
e080: 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68   if we already h
e090: 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69  ave a lock, it i
e0a0: 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20  s exclusive.  . 
e0b0: 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20   ** Just adjust 
e0c0: 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f  level and punt o
e0d0: 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f  n outta here. */
e0e0: 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f  .  if (pFile->lo
e0f0: 63 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b  cktype > NO_LOCK
e100: 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ) {.    pFile->l
e110: 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79  ocktype = lockty
e120: 70 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  pe;.    return S
e130: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
e140: 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78  .  /* grab an ex
e150: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a  clusive lock */.
e160: 20 20 69 6e 74 20 72 63 20 3d 20 66 6c 6f 63 6b    int rc = flock
e170: 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
e180: 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20  EX | LOCK_NB);. 
e190: 20 69 66 20 28 72 63 29 20 7b 0a 20 20 20 20 2f   if (rc) {.    /
e1a0: 2a 20 64 69 64 6e 27 74 20 67 65 74 2c 20 6d 75  * didn't get, mu
e1b0: 73 74 20 62 65 20 62 75 73 79 20 2a 2f 0a 20 20  st be busy */.  
e1c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e1d0: 42 55 53 59 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  BUSY;.  } else {
e1e0: 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20  .    /* got it, 
e1f0: 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  set the type and
e200: 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20   return ok */.  
e210: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
e220: 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
e230: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e240: 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  OK;.  }.}..stati
e250: 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 69 78 55  c int flockUnixU
e260: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
e270: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
e280: 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69  type) {.  unixFi
e290: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
e2a0: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20  xFile*)id;.  .  
e2b0: 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
e2c0: 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
e2d0: 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69  .  .  /* no-op i
e2e0: 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20  f possible */.  
e2f0: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
e300: 79 70 65 3d 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ype==locktype ){
e310: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
e320: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
e330: 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75  /* shared can ju
e340: 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73  st be set becaus
e350: 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65  e we always have
e360: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f   an exclusive */
e370: 0a 20 20 69 66 20 28 6c 6f 63 6b 74 79 70 65 3d  .  if (locktype=
e380: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a  =SHARED_LOCK) {.
e390: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
e3a0: 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
e3b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e3c0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
e3d0: 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e  * no, really, un
e3e0: 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 6e 74 20 72  lock. */.  int r
e3f0: 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  c = flock(pFile-
e400: 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20  >h, LOCK_UN);.  
e410: 69 66 20 28 72 63 29 0a 20 20 20 20 72 65 74 75  if (rc).    retu
e420: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
e430: 55 4e 4c 4f 43 4b 3b 0a 20 20 65 6c 73 65 20 7b  UNLOCK;.  else {
e440: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
e450: 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  type = NO_LOCK;.
e460: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e470: 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E_OK;.  }.}../*.
e480: 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65   ** Close a file
e490: 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .. */.static int
e4a0: 20 66 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73 65 28   flockUnixClose(
e4b0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
e4c0: 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
e4d0: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
e4e0: 65 2a 29 69 64 3b 0a 20 20 0a 20 20 69 66 28 20  e*)id;.  .  if( 
e4f0: 21 70 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20  !pFile ) return 
e500: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66 6c 6f  SQLITE_OK;.  flo
e510: 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c  ckUnixUnlock(id,
e520: 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 0a 20 20   NO_LOCK);.  .  
e530: 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72 66 64  if( pFile->dirfd
e540: 3e 3d 30 20 29 20 63 6c 6f 73 65 28 70 46 69 6c  >=0 ) close(pFil
e550: 65 2d 3e 64 69 72 66 64 29 3b 0a 20 20 70 46 69  e->dirfd);.  pFi
e560: 6c 65 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a  le->dirfd = -1;.
e570: 0a 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29 3b  .  enterMutex();
e580: 0a 20 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e  .  close(pFile->
e590: 68 29 3b 20 20 0a 20 20 6c 65 61 76 65 4d 75 74  h);  .  leaveMut
e5a0: 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 32  ex();.  OSTRACE2
e5b0: 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e  ("CLOSE   %-3d\n
e5c0: 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20  ", pFile->h);.  
e5d0: 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b  OpenCounter(-1);
e5e0: 0a 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c  .  memset(pFile,
e5f0: 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46   0, sizeof(unixF
e600: 69 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ile));.  return 
e610: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 70  SQLITE_OK;.}..#p
e620: 72 61 67 6d 61 20 6d 61 72 6b 20 4f 6c 64 2d 53  ragma mark Old-S
e630: 63 68 6f 6f 6c 20 2e 6c 6f 63 6b 20 66 69 6c 65  chool .lock file
e640: 20 62 61 73 65 64 20 6c 6f 63 6b 69 6e 67 0a 0a   based locking..
e650: 2f 2a 0a 20 2a 2a 20 54 68 65 20 64 6f 74 6c 6f  /*. ** The dotlo
e660: 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ckLockingContext
e670: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
e680: 69 6e 73 20 61 6c 6c 20 64 6f 74 6c 6f 63 6b 20  ins all dotlock 
e690: 28 2e 6c 6f 63 6b 29 20 6c 6f 63 6b 0a 20 2a 2a  (.lock) lock. **
e6a0: 20 73 70 65 63 69 66 69 63 20 73 74 61 74 65 0a   specific state.
e6b0: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
e6c0: 63 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  ct dotlockLockin
e6d0: 67 43 6f 6e 74 65 78 74 20 64 6f 74 6c 6f 63 6b  gContext dotlock
e6e0: 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  LockingContext;.
e6f0: 73 74 72 75 63 74 20 64 6f 74 6c 6f 63 6b 4c 6f  struct dotlockLo
e700: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20  ckingContext {. 
e710: 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 3b   char *lockPath;
e720: 0a 7d 3b 0a 0a 0a 73 74 61 74 69 63 20 69 6e 74  .};...static int
e730: 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 43 68 65 63   dotlockUnixChec
e740: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
e750: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
e760: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
e770: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
e780: 29 69 64 3b 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f  )id;.  dotlockLo
e790: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
e7a0: 6e 74 65 78 74 20 3d 20 0a 20 20 20 20 28 64 6f  ntext = .    (do
e7b0: 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
e7c0: 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
e7d0: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
e7e0: 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f  .  if (pFile->lo
e7f0: 63 6b 74 79 70 65 20 3d 3d 20 52 45 53 45 52 56  cktype == RESERV
e800: 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 72  ED_LOCK) {.    r
e810: 65 74 75 72 6e 20 31 3b 20 2f 2a 20 61 6c 72 65  eturn 1; /* alre
e820: 61 64 79 20 68 61 76 65 20 61 20 72 65 73 65 72  ady have a reser
e830: 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 20  ved lock */.  } 
e840: 65 6c 73 65 20 7b 0a 20 20 20 20 73 74 72 75 63  else {.    struc
e850: 74 20 73 74 61 74 20 73 74 61 74 42 75 66 3b 0a  t stat statBuf;.
e860: 20 20 20 20 69 66 20 28 6c 73 74 61 74 28 63 6f      if (lstat(co
e870: 6e 74 65 78 74 2d 3e 6c 6f 63 6b 50 61 74 68 2c  ntext->lockPath,
e880: 26 73 74 61 74 42 75 66 29 20 3d 3d 20 30 29 0a  &statBuf) == 0).
e890: 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 65 78        /* file ex
e8a0: 69 73 74 73 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c  ists, someone el
e8b0: 73 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20  se has the lock 
e8c0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
e8d0: 31 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20  1;.    else.    
e8e0: 20 20 2f 2a 20 66 69 6c 65 20 64 6f 65 73 20 6e    /* file does n
e8f0: 6f 74 20 65 78 69 73 74 2c 20 77 65 20 63 6f 75  ot exist, we cou
e900: 6c 64 20 68 61 76 65 20 69 74 20 69 66 20 77 65  ld have it if we
e910: 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20   want it */.    
e920: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
e930: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  }..static int do
e940: 74 6c 6f 63 6b 55 6e 69 78 4c 6f 63 6b 28 73 71  tlockUnixLock(sq
e950: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
e960: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a  int locktype) {.
e970: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
e980: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
e990: 64 3b 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b  d;.  dotlockLock
e9a0: 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  ingContext *cont
e9b0: 65 78 74 20 3d 20 0a 20 20 20 20 28 64 6f 74 6c  ext = .    (dotl
e9c0: 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
e9d0: 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  t *) pFile->lock
e9e0: 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20  ingContext;.  . 
e9f0: 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64   /* if we alread
ea00: 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69  y have a lock, i
ea10: 74 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  t is exclusive. 
ea20: 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75   .  ** Just adju
ea30: 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e  st level and pun
ea40: 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e  t on outta here.
ea50: 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d   */.  if (pFile-
ea60: 3e 6c 6f 63 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c  >locktype > NO_L
ea70: 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
ea80: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
ea90: 6b 74 79 70 65 3b 0a 20 20 20 20 0a 20 20 20 20  ktype;.    .    
eaa0: 2f 2a 20 41 6c 77 61 79 73 20 75 70 64 61 74 65  /* Always update
eab0: 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70 20 6f   the timestamp o
eac0: 6e 20 74 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a  n the old file *
ead0: 2f 0a 20 20 20 20 75 74 69 6d 65 73 28 63 6f 6e  /.    utimes(con
eae0: 74 65 78 74 2d 3e 6c 6f 63 6b 50 61 74 68 2c 4e  text->lockPath,N
eaf0: 55 4c 4c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ULL);.    return
eb00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
eb10: 20 20 0a 20 20 2f 2a 20 63 68 65 63 6b 20 74 6f    .  /* check to
eb20: 20 73 65 65 20 69 66 20 6c 6f 63 6b 20 66 69 6c   see if lock fil
eb30: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
eb40: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61   */.  struct sta
eb50: 74 20 73 74 61 74 42 75 66 3b 0a 20 20 69 66 20  t statBuf;.  if 
eb60: 28 6c 73 74 61 74 28 63 6f 6e 74 65 78 74 2d 3e  (lstat(context->
eb70: 6c 6f 63 6b 50 61 74 68 2c 26 73 74 61 74 42 75  lockPath,&statBu
eb80: 66 29 20 3d 3d 20 30 29 7b 0a 20 20 20 20 72 65  f) == 0){.    re
eb90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
eba0: 3b 20 2f 2a 20 69 74 20 64 6f 65 73 2c 20 62 75  ; /* it does, bu
ebb0: 73 79 20 2a 2f 0a 20 20 7d 0a 20 20 0a 20 20 2f  sy */.  }.  .  /
ebc0: 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73  * grab an exclus
ebd0: 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e  ive lock */.  in
ebe0: 74 20 66 64 20 3d 20 6f 70 65 6e 28 63 6f 6e 74  t fd = open(cont
ebf0: 65 78 74 2d 3e 6c 6f 63 6b 50 61 74 68 2c 4f 5f  ext->lockPath,O_
ec00: 52 44 4f 4e 4c 59 7c 4f 5f 43 52 45 41 54 7c 4f  RDONLY|O_CREAT|O
ec10: 5f 45 58 43 4c 2c 30 36 30 30 29 3b 0a 20 20 69  _EXCL,0600);.  i
ec20: 66 20 28 66 64 20 3c 20 30 29 20 7b 0a 20 20 20  f (fd < 0) {.   
ec30: 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f 70   /* failed to op
ec40: 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66 69  en/create the fi
ec50: 6c 65 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65  le, someone else
ec60: 20 6d 61 79 20 68 61 76 65 20 73 74 6f 6c 65 6e   may have stolen
ec70: 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20   the lock */.   
ec80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
ec90: 55 53 59 3b 20 0a 20 20 7d 0a 20 20 63 6c 6f 73  USY; .  }.  clos
eca0: 65 28 66 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 67  e(fd);.  .  /* g
ecb0: 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74  ot it, set the t
ecc0: 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f  ype and return o
ecd0: 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f  k */.  pFile->lo
ece0: 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70  cktype = locktyp
ecf0: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
ed00: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63  TE_OK;.}..static
ed10: 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 69 78   int dotlockUnix
ed20: 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
ed30: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
ed40: 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46  ktype) {.  unixF
ed50: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
ed60: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 64 6f  ixFile*)id;.  do
ed70: 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
ed80: 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 0a  ext *context = .
ed90: 20 20 20 20 28 64 6f 74 6c 6f 63 6b 4c 6f 63 6b      (dotlockLock
eda0: 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
edb0: 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
edc0: 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ext;.  .  assert
edd0: 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52  ( locktype<=SHAR
ede0: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
edf0: 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73  /* no-op if poss
ee00: 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46  ible */.  if( pF
ee10: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c  ile->locktype==l
ee20: 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
ee30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
ee40: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61  .  }.  .  /* sha
ee50: 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20  red can just be 
ee60: 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61  set because we a
ee70: 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78  lways have an ex
ee80: 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20  clusive */.  if 
ee90: 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  (locktype==SHARE
eea0: 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  D_LOCK) {.    pF
eeb0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
eec0: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 72 65  locktype;.    re
eed0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
eee0: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20    }.  .  /* no, 
eef0: 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20  really, unlock. 
ef00: 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 28 63 6f 6e 74  */.  unlink(cont
ef10: 65 78 74 2d 3e 6c 6f 63 6b 50 61 74 68 29 3b 0a  ext->lockPath);.
ef20: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
ef30: 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72  e = NO_LOCK;.  r
ef40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
ef50: 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65  .}../*. ** Close
ef60: 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61   a file.. */.sta
ef70: 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55  tic int dotlockU
ef80: 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  nixClose(sqlite3
ef90: 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 75  _file *id) {.  u
efa0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
efb0: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
efc0: 20 20 0a 20 20 69 66 28 20 21 70 46 69 6c 65 20    .  if( !pFile 
efd0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
efe0: 4f 4b 3b 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 69  OK;.  dotlockUni
eff0: 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  xUnlock(id, NO_L
f000: 4f 43 4b 29 3b 0a 20 20 2f 2a 20 66 72 65 65 20  OCK);.  /* free 
f010: 74 68 65 20 64 6f 74 6c 6f 63 6b 20 6c 6f 63 6b  the dotlock lock
f020: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ing structure */
f030: 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f  .  if (pFile->lo
f040: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 21 3d 20  ckingContext != 
f050: 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 69 66 20 28  NULL) {.    if (
f060: 28 28 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  ((dotlockLocking
f070: 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
f080: 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
f090: 2d 3e 6c 6f 63 6b 50 61 74 68 20 21 3d 20 4e 55  ->lockPath != NU
f0a0: 4c 4c 29 0a 20 20 20 20 20 20 73 71 6c 69 74 65  LL).      sqlite
f0b0: 33 5f 66 72 65 65 28 20 28 20 28 64 6f 74 6c 6f  3_free( ( (dotlo
f0c0: 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ckLockingContext
f0d0: 20 2a 29 0a 20 20 20 20 20 20 20 20 70 46 69 6c   *).        pFil
f0e0: 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
f0f0: 74 29 2d 3e 6c 6f 63 6b 50 61 74 68 29 3b 0a 20  t)->lockPath);. 
f100: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
f110: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
f120: 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20 20 0a 20  ntext);.  }.  . 
f130: 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72 66   if( pFile->dirf
f140: 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28 70 46 69  d>=0 ) close(pFi
f150: 6c 65 2d 3e 64 69 72 66 64 29 3b 0a 20 20 70 46  le->dirfd);.  pF
f160: 69 6c 65 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b  ile->dirfd = -1;
f170: 0a 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29 3b  .  enterMutex();
f180: 20 20 0a 20 20 63 6c 6f 73 65 28 70 46 69 6c 65    .  close(pFile
f190: 2d 3e 68 29 3b 0a 20 20 6c 65 61 76 65 4d 75 74  ->h);.  leaveMut
f1a0: 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 32  ex();.  OSTRACE2
f1b0: 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e  ("CLOSE   %-3d\n
f1c0: 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20  ", pFile->h);.  
f1d0: 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b  OpenCounter(-1);
f1e0: 0a 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c  .  memset(pFile,
f1f0: 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46   0, sizeof(unixF
f200: 69 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ile));.  return 
f210: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23  SQLITE_OK;.}...#
f220: 70 72 61 67 6d 61 20 6d 61 72 6b 20 4e 6f 20 6c  pragma mark No l
f230: 6f 63 6b 69 6e 67 0a 0a 2f 2a 0a 20 2a 2a 20 54  ocking../*. ** T
f240: 68 65 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  he nolockLocking
f250: 43 6f 6e 74 65 78 74 20 69 73 20 76 6f 69 64 0a  Context is void.
f260: 20 2a 2f 0a 74 79 70 65 64 65 66 20 76 6f 69 64   */.typedef void
f270: 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f   nolockLockingCo
f280: 6e 74 65 78 74 3b 0a 0a 73 74 61 74 69 63 20 69  ntext;..static i
f290: 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 69 78 43 68 65  nt nolockUnixChe
f2a0: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
f2b0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
f2c0: 20 7b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   {.  return 0;.}
f2d0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c  ..static int nol
f2e0: 6f 63 6b 55 6e 69 78 4c 6f 63 6b 28 73 71 6c 69  ockUnixLock(sqli
f2f0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
f300: 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20  t locktype) {.  
f310: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f320: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
f330: 6e 6f 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b  nolockUnixUnlock
f340: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
f350: 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
f360: 20 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   {.  return SQLI
f370: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a  TE_OK;.}../*. **
f380: 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20   Close a file.. 
f390: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  */.static int no
f3a0: 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73 65 28 73 71  lockUnixClose(sq
f3b0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
f3c0: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
f3d0: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
f3e0: 29 69 64 3b 0a 20 20 0a 20 20 69 66 28 20 21 70  )id;.  .  if( !p
f3f0: 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51  File ) return SQ
f400: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
f410: 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29  File->dirfd>=0 )
f420: 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69   close(pFile->di
f430: 72 66 64 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 64  rfd);.  pFile->d
f440: 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 65 6e 74  irfd = -1;.  ent
f450: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 63 6c 6f  erMutex();.  clo
f460: 73 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20  se(pFile->h);.  
f470: 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  leaveMutex();.  
f480: 4f 53 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20  OSTRACE2("CLOSE 
f490: 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65    %-3d\n", pFile
f4a0: 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e  ->h);.  OpenCoun
f4b0: 74 65 72 28 2d 31 29 3b 0a 20 20 6d 65 6d 73 65  ter(-1);.  memse
f4c0: 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65  t(pFile, 0, size
f4d0: 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20  of(unixFile));. 
f4e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
f4f0: 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  K;.}..#endif /* 
f500: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
f510: 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a  CKING_STYLE */..
f520: 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69  ./*.** Informati
f530: 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f  on and control o
f540: 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68  f an open file h
f550: 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
f560: 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e   int unixFileCon
f570: 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
f580: 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76  e *id, int op, v
f590: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 77  oid *pArg){.  sw
f5a0: 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
f5b0: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
f5c0: 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20  L_LOCKSTATE: {. 
f5d0: 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
f5e0: 20 3d 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69   = ((unixFile*)i
f5f0: 64 29 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  d)->locktype;.  
f600: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f610: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
f620: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f630: 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ERROR;.}../*.** 
f640: 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f  Return the secto
f650: 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  r size in bytes 
f660: 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  of the underlyin
f670: 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66  g block device f
f680: 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66  or.** the specif
f690: 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69  ied file. This i
f6a0: 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20  s almost always 
f6b0: 35 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d  512 bytes, but m
f6c0: 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20  ay be.** larger 
f6d0: 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73  for some devices
f6e0: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63  ..**.** SQLite c
f6f0: 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73  ode assumes this
f700: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74   function cannot
f710: 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61   fail. It also a
f720: 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69  ssumes that.** i
f730: 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20  f two files are 
f740: 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73  created in the s
f750: 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ame file-system 
f760: 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a  directory (i.e..
f770: 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e  ** a database an
f780: 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69  d its journal fi
f790: 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63  le) that the sec
f7a0: 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  tor size will be
f7b0: 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72   the.** same for
f7c0: 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63   both..*/.static
f7d0: 20 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53   int unixSectorS
f7e0: 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
f7f0: 20 2a 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20   *id){.  return 
f800: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
f810: 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f  ECTOR_SIZE;.}../
f820: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
f830: 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
f840: 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20 66  istics for the f
f850: 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 77  ile. This is alw
f860: 61 79 73 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  ays 0..*/.static
f870: 20 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43   int unixDeviceC
f880: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73  haracteristics(s
f890: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
f8a0: 7b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  {.  return 0;.}.
f8b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74  ./*.** This vect
f8c0: 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74  or defines all t
f8d0: 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20  he methods that 
f8e0: 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61  can operate on a
f8f0: 6e 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a  n sqlite3_file.*
f900: 2a 20 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f 0a 73  * for unix..*/.s
f910: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
f920: 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 73  te3_io_methods s
f930: 71 6c 69 74 65 33 55 6e 69 78 49 6f 4d 65 74 68  qlite3UnixIoMeth
f940: 6f 64 20 3d 20 7b 0a 20 20 31 2c 20 20 20 20 20  od = {.  1,     
f950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f960: 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
f970: 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 0a 20  /.  unixClose,. 
f980: 20 75 6e 69 78 52 65 61 64 2c 0a 20 20 75 6e 69   unixRead,.  uni
f990: 78 57 72 69 74 65 2c 0a 20 20 75 6e 69 78 54 72  xWrite,.  unixTr
f9a0: 75 6e 63 61 74 65 2c 0a 20 20 75 6e 69 78 53 79  uncate,.  unixSy
f9b0: 6e 63 2c 0a 20 20 75 6e 69 78 46 69 6c 65 53 69  nc,.  unixFileSi
f9c0: 7a 65 2c 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 0a  ze,.  unixLock,.
f9d0: 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 0a 20 20    unixUnlock,.  
f9e0: 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  unixCheckReserve
f9f0: 64 4c 6f 63 6b 2c 0a 20 20 75 6e 69 78 46 69 6c  dLock,.  unixFil
fa00: 65 43 6f 6e 74 72 6f 6c 2c 0a 20 20 75 6e 69 78  eControl,.  unix
fa10: 53 65 63 74 6f 72 53 69 7a 65 2c 0a 20 20 75 6e  SectorSize,.  un
fa20: 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65  ixDeviceCharacte
fa30: 72 69 73 74 69 63 73 0a 7d 3b 0a 0a 23 69 66 64  ristics.};..#ifd
fa40: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
fa50: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f  _LOCKING_STYLE./
fa60: 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72  *.** This vector
fa70: 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65   defines all the
fa80: 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63 61   methods that ca
fa90: 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 20  n operate on an 
faa0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20  sqlite3_file.** 
fab0: 66 6f 72 20 75 6e 69 78 20 77 69 74 68 20 41 46  for unix with AF
fac0: 50 20 73 74 79 6c 65 20 66 69 6c 65 20 6c 6f 63  P style file loc
fad0: 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
fae0: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
faf0: 5f 6d 65 74 68 6f 64 73 20 73 71 6c 69 74 65 33  _methods sqlite3
fb00: 41 46 50 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f  AFPLockingUnixIo
fb10: 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20 31 2c 20  Method = {.  1, 
fb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb30: 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
fb40: 6f 6e 20 2a 2f 0a 20 20 61 66 70 55 6e 69 78 43  on */.  afpUnixC
fb50: 6c 6f 73 65 2c 0a 20 20 75 6e 69 78 52 65 61 64  lose,.  unixRead
fb60: 2c 0a 20 20 75 6e 69 78 57 72 69 74 65 2c 0a 20  ,.  unixWrite,. 
fb70: 20 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 0a 20   unixTruncate,. 
fb80: 20 75 6e 69 78 53 79 6e 63 2c 0a 20 20 75 6e 69   unixSync,.  uni
fb90: 78 46 69 6c 65 53 69 7a 65 2c 0a 20 20 61 66 70  xFileSize,.  afp
fba0: 55 6e 69 78 4c 6f 63 6b 2c 0a 20 20 61 66 70 55  UnixLock,.  afpU
fbb0: 6e 69 78 55 6e 6c 6f 63 6b 2c 0a 20 20 61 66 70  nixUnlock,.  afp
fbc0: 55 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  UnixCheckReserve
fbd0: 64 4c 6f 63 6b 2c 0a 20 20 75 6e 69 78 46 69 6c  dLock,.  unixFil
fbe0: 65 43 6f 6e 74 72 6f 6c 2c 0a 20 20 75 6e 69 78  eControl,.  unix
fbf0: 53 65 63 74 6f 72 53 69 7a 65 2c 0a 20 20 75 6e  SectorSize,.  un
fc00: 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65  ixDeviceCharacte
fc10: 72 69 73 74 69 63 73 0a 7d 3b 0a 0a 2f 2a 0a 2a  ristics.};../*.*
fc20: 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20 64 65  * This vector de
fc30: 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65  fines all the me
fc40: 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f  thods that can o
fc50: 70 65 72 61 74 65 20 6f 6e 20 61 6e 20 73 71 6c  perate on an sql
fc60: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 66 6f 72  ite3_file.** for
fc70: 20 75 6e 69 78 20 77 69 74 68 20 66 6c 6f 63 6b   unix with flock
fc80: 28 29 20 73 74 79 6c 65 20 66 69 6c 65 20 6c 6f  () style file lo
fc90: 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
fca0: 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
fcb0: 6f 5f 6d 65 74 68 6f 64 73 20 73 71 6c 69 74 65  o_methods sqlite
fcc0: 33 46 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 55 6e 69  3FlockLockingUni
fcd0: 78 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20  xIoMethod = {.  
fce0: 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
fcf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
fd00: 72 73 69 6f 6e 20 2a 2f 0a 20 20 66 6c 6f 63 6b  rsion */.  flock
fd10: 55 6e 69 78 43 6c 6f 73 65 2c 0a 20 20 75 6e 69  UnixClose,.  uni
fd20: 78 52 65 61 64 2c 0a 20 20 75 6e 69 78 57 72 69  xRead,.  unixWri
fd30: 74 65 2c 0a 20 20 75 6e 69 78 54 72 75 6e 63 61  te,.  unixTrunca
fd40: 74 65 2c 0a 20 20 75 6e 69 78 53 79 6e 63 2c 0a  te,.  unixSync,.
fd50: 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 0a    unixFileSize,.
fd60: 20 20 66 6c 6f 63 6b 55 6e 69 78 4c 6f 63 6b 2c    flockUnixLock,
fd70: 0a 20 20 66 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f  .  flockUnixUnlo
fd80: 63 6b 2c 0a 20 20 66 6c 6f 63 6b 55 6e 69 78 43  ck,.  flockUnixC
fd90: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
fda0: 2c 0a 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74  ,.  unixFileCont
fdb0: 72 6f 6c 2c 0a 20 20 75 6e 69 78 53 65 63 74 6f  rol,.  unixSecto
fdc0: 72 53 69 7a 65 2c 0a 20 20 75 6e 69 78 44 65 76  rSize,.  unixDev
fdd0: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
fde0: 63 73 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  cs.};../*.** Thi
fdf0: 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73  s vector defines
fe00: 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73   all the methods
fe10: 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74   that can operat
fe20: 65 20 6f 6e 20 61 6e 20 73 71 6c 69 74 65 33 5f  e on an sqlite3_
fe30: 66 69 6c 65 0a 2a 2a 20 66 6f 72 20 75 6e 69 78  file.** for unix
fe40: 20 77 69 74 68 20 64 6f 74 6c 6f 63 6b 20 73 74   with dotlock st
fe50: 79 6c 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  yle file locking
fe60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
fe70: 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
fe80: 68 6f 64 73 20 73 71 6c 69 74 65 33 44 6f 74 6c  hods sqlite3Dotl
fe90: 6f 63 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f  ockLockingUnixIo
fea0: 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20 31 2c 20  Method = {.  1, 
feb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fec0: 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
fed0: 6f 6e 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55  on */.  dotlockU
fee0: 6e 69 78 43 6c 6f 73 65 2c 0a 20 20 75 6e 69 78  nixClose,.  unix
fef0: 52 65 61 64 2c 0a 20 20 75 6e 69 78 57 72 69 74  Read,.  unixWrit
ff00: 65 2c 0a 20 20 75 6e 69 78 54 72 75 6e 63 61 74  e,.  unixTruncat
ff10: 65 2c 0a 20 20 75 6e 69 78 53 79 6e 63 2c 0a 20  e,.  unixSync,. 
ff20: 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 0a 20   unixFileSize,. 
ff30: 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 4c 6f 63 6b   dotlockUnixLock
ff40: 2c 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 55  ,.  dotlockUnixU
ff50: 6e 6c 6f 63 6b 2c 0a 20 20 64 6f 74 6c 6f 63 6b  nlock,.  dotlock
ff60: 55 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  UnixCheckReserve
ff70: 64 4c 6f 63 6b 2c 0a 20 20 75 6e 69 78 46 69 6c  dLock,.  unixFil
ff80: 65 43 6f 6e 74 72 6f 6c 2c 0a 20 20 75 6e 69 78  eControl,.  unix
ff90: 53 65 63 74 6f 72 53 69 7a 65 2c 0a 20 20 75 6e  SectorSize,.  un
ffa0: 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65  ixDeviceCharacte
ffb0: 72 69 73 74 69 63 73 0a 7d 3b 0a 0a 2f 2a 0a 2a  ristics.};../*.*
ffc0: 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20 64 65  * This vector de
ffd0: 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65  fines all the me
ffe0: 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f  thods that can o
fff0: 70 65 72 61 74 65 20 6f 6e 20 61 6e 20 73 71 6c  perate on an sql
10000 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 66 6f 72  ite3_file.** for
10010 20 75 6e 69 78 20 77 69 74 68 20 64 6f 74 6c 6f   unix with dotlo
10020 63 6b 20 73 74 79 6c 65 20 66 69 6c 65 20 6c 6f  ck style file lo
10030 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
10040 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
10050 6f 5f 6d 65 74 68 6f 64 73 20 73 71 6c 69 74 65  o_methods sqlite
10060 33 4e 6f 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 55 6e  3NolockLockingUn
10070 69 78 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20  ixIoMethod = {. 
10080 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
10090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
100a0 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 6e 6f 6c 6f  ersion */.  nolo
100b0 63 6b 55 6e 69 78 43 6c 6f 73 65 2c 0a 20 20 75  ckUnixClose,.  u
100c0 6e 69 78 52 65 61 64 2c 0a 20 20 75 6e 69 78 57  nixRead,.  unixW
100d0 72 69 74 65 2c 0a 20 20 75 6e 69 78 54 72 75 6e  rite,.  unixTrun
100e0 63 61 74 65 2c 0a 20 20 75 6e 69 78 53 79 6e 63  cate,.  unixSync
100f0 2c 0a 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65  ,.  unixFileSize
10100 2c 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 69 78 4c 6f  ,.  nolockUnixLo
10110 63 6b 2c 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 69 78  ck,.  nolockUnix
10120 55 6e 6c 6f 63 6b 2c 0a 20 20 6e 6f 6c 6f 63 6b  Unlock,.  nolock
10130 55 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  UnixCheckReserve
10140 64 4c 6f 63 6b 2c 0a 20 20 75 6e 69 78 46 69 6c  dLock,.  unixFil
10150 65 43 6f 6e 74 72 6f 6c 2c 0a 20 20 75 6e 69 78  eControl,.  unix
10160 53 65 63 74 6f 72 53 69 7a 65 2c 0a 20 20 75 6e  SectorSize,.  un
10170 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65  ixDeviceCharacte
10180 72 69 73 74 69 63 73 0a 7d 3b 0a 0a 23 65 6e 64  ristics.};..#end
10190 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
101a0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
101b0 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  E */../*.** Allo
101c0 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20  cate memory for 
101d0 61 20 6e 65 77 20 75 6e 69 78 46 69 6c 65 20 61  a new unixFile a
101e0 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  nd initialize th
101f0 61 74 20 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20  at unixFile..** 
10200 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20  Write a pointer 
10210 74 6f 20 74 68 65 20 6e 65 77 20 75 6e 69 78 46  to the new unixF
10220 69 6c 65 20 69 6e 74 6f 20 2a 70 49 64 2e 0a 2a  ile into *pId..*
10230 2a 20 49 66 20 77 65 20 72 75 6e 20 6f 75 74 20  * If we run out 
10240 6f 66 20 6d 65 6d 6f 72 79 2c 20 63 6c 6f 73 65  of memory, close
10250 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65   the file and re
10260 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  turn an error..*
10270 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
10280 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
10290 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 57 68 65 6e  TYLE./* .** When
102a0 20 6c 6f 63 6b 69 6e 67 20 65 78 74 65 6e 73 69   locking extensi
102b0 6f 6e 73 20 61 72 65 20 65 6e 61 62 6c 65 64 2c  ons are enabled,
102c0 20 74 68 65 20 66 69 6c 65 70 61 74 68 20 61 6e   the filepath an
102d0 64 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20  d locking style 
102e0 0a 2a 2a 20 61 72 65 20 6e 65 65 64 65 64 20 74  .** are needed t
102f0 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
10300 75 6e 69 78 46 69 6c 65 20 70 4d 65 74 68 6f 64  unixFile pMethod
10310 20 74 6f 20 75 73 65 20 66 6f 72 20 6c 6f 63 6b   to use for lock
10320 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a  ing operations..
10330 2a 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67 2d 73  ** The locking-s
10340 74 79 6c 65 20 73 70 65 63 69 66 69 63 20 6c 6f  tyle specific lo
10350 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 64 61 74  ckingContext dat
10360 61 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63  a structure is c
10370 72 65 61 74 65 64 20 0a 2a 2a 20 61 6e 64 20 61  reated .** and a
10380 73 73 69 67 6e 65 64 20 68 65 72 65 20 61 6c 73  ssigned here als
10390 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
103a0 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
103b0 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20  .  int h,       
103c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
103d0 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
103e0 6f 72 20 6f 66 20 66 69 6c 65 20 62 65 69 6e 67  or of file being
103f0 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74   opened */.  int
10400 20 64 69 72 66 64 2c 20 20 20 20 20 20 20 20 20   dirfd,         
10410 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72       /* Director
10420 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
10430 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  r */.  sqlite3_f
10440 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20 2f  ile *pId,      /
10450 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 75  * Write to the u
10460 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
10470 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  e here */.  cons
10480 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
10490 65 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e   /* Name of t
104a0 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  he file being op
104b0 65 6e 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ened */.){.  sql
104c0 69 74 65 33 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  ite3LockingStyle
104d0 20 6c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20   lockingStyle;. 
104e0 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20   unixFile *pNew 
104f0 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 49  = (unixFile *)pI
10500 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69  d;.  int rc;..#i
10510 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a  fdef FD_CLOEXEC.
10520 20 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54    fcntl(h, F_SET
10530 46 44 2c 20 66 63 6e 74 6c 28 68 2c 20 46 5f 47  FD, fcntl(h, F_G
10540 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c  ETFD, 0) | FD_CL
10550 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 0a  OEXEC);.#endif..
10560 20 20 6c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d    lockingStyle =
10570 20 73 71 6c 69 74 65 33 44 65 74 65 63 74 4c 6f   sqlite3DetectLo
10580 63 6b 69 6e 67 53 74 79 6c 65 28 7a 46 69 6c 65  ckingStyle(zFile
10590 6e 61 6d 65 2c 20 68 29 3b 0a 20 20 69 66 20 28  name, h);.  if (
105a0 20 6c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d   lockingStyle ==
105b0 20 70 6f 73 69 78 4c 6f 63 6b 69 6e 67 53 74 79   posixLockingSty
105c0 6c 65 20 29 20 7b 0a 20 20 20 20 20 20 0a 20 20  le ) {.      .  
105d0 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a    enterMutex();.
105e0 20 20 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63      rc = findLoc
105f0 6b 49 6e 66 6f 28 68 2c 20 26 70 4e 65 77 2d 3e  kInfo(h, &pNew->
10600 70 4c 6f 63 6b 2c 20 26 70 4e 65 77 2d 3e 70 4f  pLock, &pNew->pO
10610 70 65 6e 29 3b 0a 20 20 20 20 6c 65 61 76 65 4d  pen);.    leaveM
10620 75 74 65 78 28 29 3b 0a 20 20 20 20 69 66 28 20  utex();.    if( 
10630 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  rc ){.      if( 
10640 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65  dirfd>=0 ) close
10650 28 64 69 72 66 64 29 3b 0a 20 20 20 20 20 20 63  (dirfd);.      c
10660 6c 6f 73 65 28 68 29 3b 0a 20 20 20 20 20 20 72  lose(h);.      r
10670 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
10680 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c  EM;.    }.  } el
10690 73 65 20 7b 0a 20 20 20 20 2f 2a 20 20 70 4c 6f  se {.    /*  pLo
106a0 63 6b 20 61 6e 64 20 70 4f 70 65 6e 20 61 72 65  ck and pOpen are
106b0 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 70   only used for p
106c0 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
106d0 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 70 4e 65  cking */.    pNe
106e0 77 2d 3e 70 4c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b  w->pLock = NULL;
106f0 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4f 70 65 6e  .    pNew->pOpen
10700 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 20 20   = NULL;.  }..  
10710 4f 53 54 52 41 43 45 33 28 22 4f 50 45 4e 20 20  OSTRACE3("OPEN  
10720 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c    %-3d %s\n", h,
10730 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 20 20 20 20   zFilename);    
10740 0a 20 20 70 4e 65 77 2d 3e 64 69 72 66 64 20 3d  .  pNew->dirfd =
10750 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d   -1;.  pNew->h =
10760 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 72 66   h;.  pNew->dirf
10770 64 20 3d 20 64 69 72 66 64 3b 0a 20 20 53 45 54  d = dirfd;.  SET
10780 5f 54 48 52 45 41 44 49 44 28 70 4e 65 77 29 3b  _THREADID(pNew);
10790 0a 20 20 20 20 0a 20 20 73 77 69 74 63 68 28 6c  .    .  switch(l
107a0 6f 63 6b 69 6e 67 53 74 79 6c 65 29 20 7b 0a 20  ockingStyle) {. 
107b0 20 20 20 63 61 73 65 20 61 66 70 4c 6f 63 6b 69     case afpLocki
107c0 6e 67 53 74 79 6c 65 3a 20 7b 0a 20 20 20 20 20  ngStyle: {.     
107d0 20 2f 2a 20 61 66 70 20 6c 6f 63 6b 69 6e 67 20   /* afp locking 
107e0 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61  uses the file pa
107f0 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74  th so it needs t
10800 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e  o be included in
10810 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 61 66  .      ** the af
10820 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
10830 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 69  */.      int nFi
10840 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70 4e  lename;.      pN
10850 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 73  ew->pMethod = &s
10860 71 6c 69 74 65 33 41 46 50 4c 6f 63 6b 69 6e 67  qlite3AFPLocking
10870 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a 20 20  UnixIoMethod;.  
10880 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e      pNew->lockin
10890 67 43 6f 6e 74 65 78 74 20 3d 20 0a 20 20 20 20  gContext = .    
108a0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c      sqlite3_mall
108b0 6f 63 28 73 69 7a 65 6f 66 28 61 66 70 4c 6f 63  oc(sizeof(afpLoc
108c0 6b 69 6e 67 43 6f 6e 74 65 78 74 29 29 3b 0a 20  kingContext));. 
108d0 20 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d       nFilename =
108e0 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d   strlen(zFilenam
108f0 65 29 2b 31 3b 0a 20 20 20 20 20 20 28 28 61 66  e)+1;.      ((af
10900 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
10910 2a 29 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43  *)pNew->lockingC
10920 6f 6e 74 65 78 74 29 2d 3e 66 69 6c 65 50 61 74  ontext)->filePat
10930 68 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c  h = .        sql
10940 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6c  ite3_malloc(nFil
10950 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6d 65  ename);.      me
10960 6d 63 70 79 28 28 28 61 66 70 4c 6f 63 6b 69 6e  mcpy(((afpLockin
10970 67 43 6f 6e 74 65 78 74 20 2a 29 70 4e 65 77 2d  gContext *)pNew-
10980 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
10990 2d 3e 66 69 6c 65 50 61 74 68 2c 20 0a 20 20 20  ->filePath, .   
109a0 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e            zFilen
109b0 61 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b  ame, nFilename);
109c0 0a 20 20 20 20 20 20 73 72 61 6e 64 6f 6d 64 65  .      srandomde
109d0 76 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  v();.      break
109e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
109f0 20 66 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79   flockLockingSty
10a00 6c 65 3a 0a 20 20 20 20 20 20 2f 2a 20 66 6c 6f  le:.      /* flo
10a10 63 6b 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 6e  ck locking doesn
10a20 27 74 20 6e 65 65 64 20 61 64 64 69 74 69 6f 6e  't need addition
10a30 61 6c 20 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  al lockingContex
10a40 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  t information */
10a50 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65  .      pNew->pMe
10a60 74 68 6f 64 20 3d 20 26 73 71 6c 69 74 65 33 46  thod = &sqlite3F
10a70 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78 49  lockLockingUnixI
10a80 6f 4d 65 74 68 6f 64 3b 0a 20 20 20 20 20 20 62  oMethod;.      b
10a90 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 64  reak;.    case d
10aa0 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79  otlockLockingSty
10ab0 6c 65 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 64  le: {.      /* d
10ac0 6f 74 6c 6f 63 6b 20 6c 6f 63 6b 69 6e 67 20 75  otlock locking u
10ad0 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
10ae0 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
10af0 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a   be included in.
10b00 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 6f         ** the do
10b10 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
10b20 65 78 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ext */.      int
10b30 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20   nFilename;.    
10b40 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20    pNew->pMethod 
10b50 3d 20 26 73 71 6c 69 74 65 33 44 6f 74 6c 6f 63  = &sqlite3Dotloc
10b60 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65  kLockingUnixIoMe
10b70 74 68 6f 64 3b 0a 20 20 20 20 20 20 70 4e 65 77  thod;.      pNew
10b80 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
10b90 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
10ba0 63 28 0a 20 20 20 20 20 20 20 20 73 69 7a 65 6f  c(.        sizeo
10bb0 66 28 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  f(dotlockLocking
10bc0 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 20 20 20  Context));.     
10bd0 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73 74 72   nFilename = str
10be0 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b  len(zFilename) +
10bf0 20 36 3b 0a 20 20 20 20 20 20 28 28 64 6f 74 6c   6;.      ((dotl
10c00 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
10c10 74 20 2a 29 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e  t *)pNew->lockin
10c20 67 43 6f 6e 74 65 78 74 29 2d 3e 6c 6f 63 6b 50  gContext)->lockP
10c30 61 74 68 20 3d 20 0a 20 20 20 20 20 20 20 20 20  ath = .         
10c40 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
10c50 20 6e 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20   nFilename );.  
10c60 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
10c70 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c 20  intf(nFilename, 
10c80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
10c90 28 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43  (dotlockLockingC
10ca0 6f 6e 74 65 78 74 20 2a 29 70 4e 65 77 2d 3e 6c  ontext *)pNew->l
10cb0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e  ockingContext)->
10cc0 6c 6f 63 6b 50 61 74 68 2c 20 0a 20 20 20 20 20  lockPath, .     
10cd0 20 20 20 20 20 20 20 20 20 22 25 73 2e 6c 6f 63           "%s.loc
10ce0 6b 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  k", zFilename);.
10cf0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10d00 20 7d 0a 20 20 20 20 63 61 73 65 20 70 6f 73 69   }.    case posi
10d10 78 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3a 0a 20  xLockingStyle:. 
10d20 20 20 20 20 20 2f 2a 20 70 6f 73 69 78 20 6c 6f       /* posix lo
10d30 63 6b 69 6e 67 20 64 6f 65 73 6e 27 74 20 6e 65  cking doesn't ne
10d40 65 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  ed additional lo
10d50 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 69 6e 66  ckingContext inf
10d60 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  ormation */.    
10d70 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20    pNew->pMethod 
10d80 3d 20 26 73 71 6c 69 74 65 33 55 6e 69 78 49 6f  = &sqlite3UnixIo
10d90 4d 65 74 68 6f 64 3b 0a 20 20 20 20 20 20 62 72  Method;.      br
10da0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 6e 6f  eak;.    case no
10db0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3a 0a 20 20  LockingStyle:.  
10dc0 20 20 63 61 73 65 20 75 6e 73 75 70 70 6f 72 74    case unsupport
10dd0 65 64 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3a 0a  edLockingStyle:.
10de0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 0a 20 20      default: .  
10df0 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f      pNew->pMetho
10e00 64 20 3d 20 26 73 71 6c 69 74 65 33 4e 6f 6c 6f  d = &sqlite3Nolo
10e10 63 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d  ckLockingUnixIoM
10e20 65 74 68 6f 64 3b 0a 20 20 7d 0a 20 20 4f 70 65  ethod;.  }.  Ope
10e30 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20  nCounter(+1);.  
10e40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10e50 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 53 51 4c  ;.}.#else /* SQL
10e60 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
10e70 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 73 74 61 74  NG_STYLE */.stat
10e80 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69  ic int fillInUni
10e90 78 46 69 6c 65 28 0a 20 20 69 6e 74 20 68 2c 20  xFile(.  int h, 
10ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10eb0 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73  /* Open file des
10ec0 63 72 69 70 74 6f 72 20 6f 6e 20 66 69 6c 65 20  criptor on file 
10ed0 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a  being opened */.
10ee0 20 20 69 6e 74 20 64 69 72 66 64 2c 0a 20 20 73    int dirfd,.  s
10ef0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49 64  qlite3_file *pId
10f00 2c 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  ,     /* Write t
10f10 6f 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73  o the unixFile s
10f20 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
10f30 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
10f40 46 69 6c 65 6e 61 6d 65 20 20 2f 2a 20 4e 61 6d  Filename  /* Nam
10f50 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65  e of the file be
10f60 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 29 7b  ing opened */.){
10f70 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
10f80 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  w = (unixFile *)
10f90 70 49 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  pId;.  int rc;..
10fa0 23 69 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45  #ifdef FD_CLOEXE
10fb0 43 0a 20 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53  C.  fcntl(h, F_S
10fc0 45 54 46 44 2c 20 66 63 6e 74 6c 28 68 2c 20 46  ETFD, fcntl(h, F
10fd0 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f  _GETFD, 0) | FD_
10fe0 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66  CLOEXEC);.#endif
10ff0 0a 0a 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29  ..  enterMutex()
11000 3b 0a 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63  ;.  rc = findLoc
11010 6b 49 6e 66 6f 28 68 2c 20 26 70 4e 65 77 2d 3e  kInfo(h, &pNew->
11020 70 4c 6f 63 6b 2c 20 26 70 4e 65 77 2d 3e 70 4f  pLock, &pNew->pO
11030 70 65 6e 29 3b 0a 20 20 6c 65 61 76 65 4d 75 74  pen);.  leaveMut
11040 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ex();.  if( rc )
11050 7b 0a 20 20 20 20 69 66 28 20 64 69 72 66 64 3e  {.    if( dirfd>
11060 3d 30 20 29 20 63 6c 6f 73 65 28 64 69 72 66 64  =0 ) close(dirfd
11070 29 3b 0a 20 20 20 20 63 6c 6f 73 65 28 68 29 3b  );.    close(h);
11080 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11090 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
110a0 20 4f 53 54 52 41 43 45 33 28 22 4f 50 45 4e 20   OSTRACE3("OPEN 
110b0 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68     %-3d %s\n", h
110c0 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
110d0 70 4e 65 77 2d 3e 64 69 72 66 64 20 3d 20 2d 31  pNew->dirfd = -1
110e0 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b  ;.  pNew->h = h;
110f0 0a 20 20 70 4e 65 77 2d 3e 64 69 72 66 64 20 3d  .  pNew->dirfd =
11100 20 64 69 72 66 64 3b 0a 20 20 53 45 54 5f 54 48   dirfd;.  SET_TH
11110 52 45 41 44 49 44 28 70 4e 65 77 29 3b 0a 0a 20  READID(pNew);.. 
11120 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d   pNew->pMethod =
11130 20 26 73 71 6c 69 74 65 33 55 6e 69 78 49 6f 4d   &sqlite3UnixIoM
11140 65 74 68 6f 64 3b 0a 20 20 4f 70 65 6e 43 6f 75  ethod;.  OpenCou
11150 6e 74 65 72 28 2b 31 29 3b 0a 20 20 72 65 74 75  nter(+1);.  retu
11160 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
11170 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
11180 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
11190 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  STYLE */../*.** 
111a0 4f 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63  Open a file desc
111b0 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 64 69  riptor to the di
111c0 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69  rectory containi
111d0 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d  ng file zFilenam
111e0 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  e..** If success
111f0 66 75 6c 2c 20 2a 70 46 64 20 69 73 20 73 65 74  ful, *pFd is set
11200 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66   to the opened f
11210 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61  ile descriptor a
11220 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
11230 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
11240 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
11250 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4e   either SQLITE_N
11260 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  OMEM.** or SQLIT
11270 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20 72 65  E_CANTOPEN is re
11280 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 46 64 20  turned and *pFd 
11290 69 73 20 73 65 74 20 74 6f 20 61 6e 20 75 6e 64  is set to an und
112a0 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 2e  efined.** value.
112b0 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
112c0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c  _OK is returned,
112d0 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   the caller is r
112e0 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
112f0 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69  losing.** the fi
11300 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 70  le descriptor *p
11310 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65 28 29  Fd using close()
11320 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11330 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f  openDirectory(co
11340 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
11350 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b 0a  ame, int *pFd){.
11360 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20    int ii;.  int 
11370 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72 20  fd = -1;.  char 
11380 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54  zDirname[MAX_PAT
11390 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c  HNAME+1];..  sql
113a0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
113b0 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72  X_PATHNAME, zDir
113c0 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c  name, "%s", zFil
113d0 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69  ename);.  for(ii
113e0 3d 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65  =strlen(zDirname
113f0 29 3b 20 69 69 3e 3d 30 20 26 26 20 7a 44 69 72  ); ii>=0 && zDir
11400 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69  name[ii]!='/'; i
11410 69 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e 30  i--);.  if( ii>0
11420 20 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65   ){.    zDirname
11430 5b 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  [ii] = '\0';.   
11440 20 66 64 20 3d 20 6f 70 65 6e 28 7a 44 69 72 6e   fd = open(zDirn
11450 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f  ame, O_RDONLY|O_
11460 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20 20  BINARY, 0);.    
11470 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 23 69 66  if( fd>=0 ){.#if
11480 64 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20  def FD_CLOEXEC. 
11490 20 20 20 20 20 66 63 6e 74 6c 28 66 64 2c 20 46       fcntl(fd, F
114a0 5f 53 45 54 46 44 2c 20 66 63 6e 74 6c 28 66 64  _SETFD, fcntl(fd
114b0 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20  , F_GETFD, 0) | 
114c0 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e  FD_CLOEXEC);.#en
114d0 64 69 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43  dif.      OSTRAC
114e0 45 33 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64  E3("OPENDIR %-3d
114f0 20 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72   %s\n", fd, zDir
11500 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  name);.    }.  }
11510 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20  .  *pFd = fd;.  
11520 72 65 74 75 72 6e 20 28 66 64 3e 3d 30 3f 53 51  return (fd>=0?SQ
11530 4c 49 54 45 5f 4f 4b 3a 53 51 4c 49 54 45 5f 43  LITE_OK:SQLITE_C
11540 41 4e 54 4f 50 45 4e 29 3b 0a 7d 0a 0a 2f 2a 0a  ANTOPEN);.}../*.
11550 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65  ** Open the file
11560 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50   zPath..** .** P
11570 72 65 76 69 6f 75 73 6c 79 2c 20 74 68 65 20 53  reviously, the S
11580 51 4c 69 74 65 20 4f 53 20 6c 61 79 65 72 20 75  QLite OS layer u
11590 73 65 64 20 74 68 72 65 65 20 66 75 6e 63 74 69  sed three functi
115a0 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  ons in place of 
115b0 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a  this.** one:.**.
115c0 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  **     sqlite3Os
115d0 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 29 3b  OpenReadWrite();
115e0 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f  .**     sqlite3O
115f0 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b  sOpenReadOnly();
11600 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f  .**     sqlite3O
11610 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29  sOpenExclusive()
11620 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61  ;.**.** These ca
11630 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  lls correspond t
11640 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
11650 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20  combinations of 
11660 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  flags:.**.**    
11670 20 52 65 61 64 57 72 69 74 65 28 29 20 2d 3e 20   ReadWrite() -> 
11680 20 20 20 20 28 52 45 41 44 57 52 49 54 45 20 7c      (READWRITE |
11690 20 43 52 45 41 54 45 29 0a 2a 2a 20 20 20 20 20   CREATE).**     
116a0 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20  ReadOnly()  ->  
116b0 20 20 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a     (READONLY) .*
116c0 2a 20 20 20 20 20 4f 70 65 6e 45 78 63 6c 75 73  *     OpenExclus
116d0 69 76 65 28 29 20 2d 3e 20 28 52 45 41 44 57 52  ive() -> (READWR
116e0 49 54 45 20 7c 20 43 52 45 41 54 45 20 7c 20 45  ITE | CREATE | E
116f0 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20  XCLUSIVE).**.** 
11700 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c  The old OpenExcl
11710 75 73 69 76 65 28 29 20 61 63 63 65 70 74 65 64  usive() accepted
11720 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d   a boolean argum
11730 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e  ent - "delFlag".
11740 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65   If.** true, the
11750 20 66 69 6c 65 20 77 61 73 20 63 6f 6e 66 69 67   file was config
11760 75 72 65 64 20 74 6f 20 62 65 20 61 75 74 6f 6d  ured to be autom
11770 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
11780 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c   when the.** fil
11790 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e  e handle closed.
117a0 20 54 6f 20 61 63 68 69 65 76 65 20 74 68 65 20   To achieve the 
117b0 73 61 6d 65 20 65 66 66 65 63 74 20 75 73 69 6e  same effect usin
117c0 67 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69  g this new .** i
117d0 6e 74 65 72 66 61 63 65 2c 20 61 64 64 20 74 68  nterface, add th
117e0 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  e DELETEONCLOSE 
117f0 66 6c 61 67 20 74 6f 20 74 68 6f 73 65 20 73 70  flag to those sp
11800 65 63 69 66 69 65 64 20 61 62 6f 76 65 20 66 6f  ecified above fo
11810 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73  r .** OpenExclus
11820 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ive()..*/.static
11830 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20   int unixOpen(. 
11840 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
11850 66 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  fs, .  const cha
11860 72 20 2a 7a 50 61 74 68 2c 20 0a 20 20 73 71 6c  r *zPath, .  sql
11870 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
11880 2c 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 0a 20  ,.  int flags,. 
11890 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 0a   int *pOutFlags.
118a0 29 7b 0a 20 20 69 6e 74 20 66 64 20 3d 20 30 3b  ){.  int fd = 0;
118b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118c0 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
118d0 72 69 70 74 6f 72 20 72 65 74 75 72 6e 65 64 20  riptor returned 
118e0 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69  by open() */.  i
118f0 6e 74 20 64 69 72 66 64 20 3d 20 2d 31 3b 20 20  nt dirfd = -1;  
11900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11910 20 44 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20   Directory file 
11920 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
11930 69 6e 74 20 6f 66 6c 61 67 73 20 3d 20 30 3b 20  int oflags = 0; 
11940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11950 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20  * Flags to pass 
11960 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69  to open() */.  i
11970 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73  nt eType = flags
11980 26 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a  &0xFFFFFF00;  /*
11990 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f   Type of file to
119a0 20 6f 70 65 6e 20 2a 2f 0a 0a 20 20 69 6e 74 20   open */..  int 
119b0 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28  isExclusive  = (
119c0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
119d0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a  PEN_EXCLUSIVE);.
119e0 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20    int isDelete  
119f0 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
11a00 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
11a10 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20  ONCLOSE);.  int 
11a20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d 20 28  isCreate     = (
11a30 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
11a40 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69  PEN_CREATE);.  i
11a50 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20  nt isReadonly   
11a60 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
11a70 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
11a80 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57 72  ;.  int isReadWr
11a90 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ite  = (flags & 
11aa0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
11ab0 57 52 49 54 45 29 3b 0a 0a 20 20 2f 2a 20 49 66  WRITE);..  /* If
11ac0 20 63 72 65 61 74 69 6e 67 20 61 20 6d 61 73 74   creating a mast
11ad0 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20  er or main-file 
11ae0 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20 66 75  journal, this fu
11af0 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e  nction will open
11b00 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73  .  ** a file-des
11b10 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 64  criptor on the d
11b20 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68  irectory too. Th
11b30 65 20 66 69 72 73 74 20 74 69 6d 65 20 75 6e 69  e first time uni
11b40 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20  xSync().  ** is 
11b50 63 61 6c 6c 65 64 20 74 68 65 20 64 69 72 65 63  called the direc
11b60 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69  tory file descri
11b70 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 66 73 79  ptor will be fsy
11b80 6e 63 28 29 65 64 20 61 6e 64 20 63 6c 6f 73 65  nc()ed and close
11b90 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  ()d..  */.  int 
11ba0 69 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20  isOpenDirectory 
11bb0 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20 0a  = (isCreate && .
11bc0 20 20 20 20 20 20 28 65 54 79 70 65 3d 3d 53 51        (eType==SQ
11bd0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
11be0 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70  _JOURNAL || eTyp
11bf0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
11c00 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 29  AIN_JOURNAL).  )
11c10 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
11c20 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74  e following stat
11c30 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65 3a  ements are true:
11c40 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61   .  **.  **   (a
11c50 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66  ) Exactly one of
11c60 20 74 68 65 20 52 45 41 44 57 52 49 54 45 20 61   the READWRITE a
11c70 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67  nd READONLY flag
11c80 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61  s must be set, a
11c90 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29 20 69  nd .  **   (b) i
11ca0 66 20 43 52 45 41 54 45 20 69 73 20 73 65 74 2c  f CREATE is set,
11cb0 20 74 68 65 6e 20 52 45 41 44 57 52 49 54 45 20   then READWRITE 
11cc0 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
11cd0 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29  , and.  **   (c)
11ce0 20 69 66 20 45 58 43 4c 55 53 49 56 45 20 69 73   if EXCLUSIVE is
11cf0 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54   set, then CREAT
11d00 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
11d10 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69  et..  **   (d) i
11d20 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  f DELETEONCLOSE 
11d30 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45  is set, then CRE
11d40 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ATE must also be
11d50 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   set..  */.  ass
11d60 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d  ert((isReadonly=
11d70 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74  =0 || isReadWrit
11d80 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61 64  e==0) && (isRead
11d90 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f  Write || isReado
11da0 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28  nly));.  assert(
11db0 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69  isCreate==0 || i
11dc0 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61  sReadWrite);.  a
11dd0 73 73 65 72 74 28 69 73 45 78 63 6c 75 73 69 76  ssert(isExclusiv
11de0 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65  e==0 || isCreate
11df0 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44 65  );.  assert(isDe
11e00 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65  lete==0 || isCre
11e10 61 74 65 29 3b 0a 0a 0a 20 20 2f 2a 20 54 68 65  ate);...  /* The
11e20 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a   main DB, main j
11e30 6f 75 72 6e 61 6c 2c 20 61 6e 64 20 6d 61 73 74  ournal, and mast
11e40 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e  er journal are n
11e50 65 76 65 72 20 61 75 74 6f 6d 61 74 69 63 61 6c  ever automatical
11e60 6c 79 0a 20 20 2a 2a 20 64 65 6c 65 74 65 64 0a  ly.  ** deleted.
11e70 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65    */.  assert( e
11e80 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
11e90 4e 5f 4d 41 49 4e 5f 44 42 20 7c 7c 20 21 69 73  N_MAIN_DB || !is
11ea0 44 65 6c 65 74 65 20 29 3b 0a 20 20 61 73 73 65  Delete );.  asse
11eb0 72 74 28 20 65 54 79 70 65 21 3d 53 51 4c 49 54  rt( eType!=SQLIT
11ec0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
11ed0 4e 41 4c 20 7c 7c 20 21 69 73 44 65 6c 65 74 65  NAL || !isDelete
11ee0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 54   );.  assert( eT
11ef0 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
11f00 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
11f10 7c 7c 20 21 69 73 44 65 6c 65 74 65 20 29 3b 0a  || !isDelete );.
11f20 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
11f30 74 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  t the upper laye
11f40 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66  r has set one of
11f50 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22   the "file-type"
11f60 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73   flags. */.  ass
11f70 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49  ert( eType==SQLI
11f80 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
11f90 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
11fa0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
11fb0 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  DB .       || eT
11fc0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
11fd0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c  _MAIN_JOURNAL ||
11fe0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
11ff0 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
12000 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
12010 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  e==SQLITE_OPEN_S
12020 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65  UBJOURNAL   || e
12030 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
12040 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
12050 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
12060 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
12070 52 41 4e 53 49 45 4e 54 5f 44 42 0a 20 20 29 3b  RANSIENT_DB.  );
12080 0a 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e  ..  if( isReadon
12090 6c 79 20 29 20 20 6f 66 6c 61 67 73 20 7c 3d 20  ly )  oflags |= 
120a0 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20  O_RDONLY;.  if( 
120b0 69 73 52 65 61 64 57 72 69 74 65 20 29 20 6f 66  isReadWrite ) of
120c0 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a  lags |= O_RDWR;.
120d0 20 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29    if( isCreate )
120e0 20 20 20 20 6f 66 6c 61 67 73 20 7c 3d 20 4f 5f      oflags |= O_
120f0 43 52 45 41 54 3b 0a 20 20 69 66 28 20 69 73 45  CREAT;.  if( isE
12100 78 63 6c 75 73 69 76 65 20 29 20 6f 66 6c 61 67  xclusive ) oflag
12110 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e  s |= (O_EXCL|O_N
12120 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 66 6c 61  OFOLLOW);.  ofla
12130 67 73 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49  gs |= (O_LARGEFI
12140 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 20  LE|O_BINARY);.. 
12150 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30   memset(pFile, 0
12160 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  , sizeof(unixFil
12170 65 29 29 3b 0a 20 20 66 64 20 3d 20 6f 70 65 6e  e));.  fd = open
12180 28 7a 50 61 74 68 2c 20 6f 66 6c 61 67 73 2c 20  (zPath, oflags, 
12190 69 73 44 65 6c 65 74 65 3f 30 36 30 30 3a 53 51  isDelete?0600:SQ
121a0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
121b0 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a  E_PERMISSIONS);.
121c0 20 20 69 66 28 20 66 64 3c 30 20 26 26 20 65 72    if( fd<0 && er
121d0 72 6e 6f 21 3d 45 49 53 44 49 52 20 26 26 20 69  rno!=EISDIR && i
121e0 73 52 65 61 64 57 72 69 74 65 20 26 26 20 21 69  sReadWrite && !i
121f0 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20  sExclusive ){.  
12200 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f    /* Failed to o
12210 70 65 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72  pen the file for
12220 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
12230 73 73 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c  ss. Try read-onl
12240 79 2e 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20  y. */.    flags 
12250 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e  &= ~(SQLITE_OPEN
12260 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
12270 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a  E_OPEN_CREATE);.
12280 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
12290 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
122a0 59 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e  Y;.    return un
122b0 69 78 4f 70 65 6e 28 70 56 66 73 2c 20 7a 50 61  ixOpen(pVfs, zPa
122c0 74 68 2c 20 70 46 69 6c 65 2c 20 66 6c 61 67 73  th, pFile, flags
122d0 2c 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20  , pOutFlags);.  
122e0 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a  }.  if( fd<0 ){.
122f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12300 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a  E_CANTOPEN;.  }.
12310 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29    if( isDelete )
12320 7b 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 50 61  {.    unlink(zPa
12330 74 68 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  th);.  }.  if( p
12340 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  OutFlags ){.    
12350 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61  *pOutFlags = fla
12360 67 73 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  gs;.  }..  asser
12370 74 28 66 64 21 3d 30 29 3b 0a 20 20 69 66 28 20  t(fd!=0);.  if( 
12380 69 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20  isOpenDirectory 
12390 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
123a0 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 7a 50  openDirectory(zP
123b0 61 74 68 2c 20 26 64 69 72 66 64 29 3b 0a 20 20  ath, &dirfd);.  
123c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
123d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f  _OK ){.      clo
123e0 73 65 28 66 64 29 3b 0a 20 20 20 20 20 20 72 65  se(fd);.      re
123f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
12400 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69 6c 6c   }.  return fill
12410 49 6e 55 6e 69 78 46 69 6c 65 28 66 64 2c 20 64  InUnixFile(fd, d
12420 69 72 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61  irfd, pFile, zPa
12430 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  th);.}../*.** De
12440 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20 61 74  lete the file at
12450 20 7a 50 61 74 68 2e 20 49 66 20 74 68 65 20 64   zPath. If the d
12460 69 72 53 79 6e 63 20 61 72 67 75 6d 65 6e 74 20  irSync argument 
12470 69 73 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29  is true, fsync()
12480 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72  .** the director
12490 79 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67  y after deleting
124a0 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74   the file..*/.st
124b0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 6c  atic int unixDel
124c0 65 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ete(sqlite3_vfs 
124d0 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61  *pVfs, const cha
124e0 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 64 69  r *zPath, int di
124f0 72 53 79 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63  rSync){.  int rc
12500 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12510 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
12520 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
12530 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 75  ERR_DELETE);.  u
12540 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3b 0a 20 20  nlink(zPath);.  
12550 69 66 28 20 64 69 72 53 79 6e 63 20 29 7b 0a 20  if( dirSync ){. 
12560 20 20 20 69 6e 74 20 66 64 3b 0a 20 20 20 20 72     int fd;.    r
12570 63 20 3d 20 6f 70 65 6e 44 69 72 65 63 74 6f 72  c = openDirector
12580 79 28 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a 20  y(zPath, &fd);. 
12590 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
125a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
125b0 28 20 66 73 79 6e 63 28 66 64 29 20 29 7b 0a 20  ( fsync(fd) ){. 
125c0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
125d0 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59  TE_IOERR_DIR_FSY
125e0 4e 43 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NC;.      }.    
125f0 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20    close(fd);.   
12600 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
12610 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73  rc;.}../*.** Tes
12620 74 20 74 68 65 20 65 78 69 73 74 61 6e 63 65 20  t the existance 
12630 6f 66 20 6f 72 20 61 63 63 65 73 73 20 70 65 72  of or access per
12640 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65  missions of file
12650 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74   zPath. The.** t
12660 65 73 74 20 70 65 72 66 6f 72 6d 65 64 20 64 65  est performed de
12670 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c  pends on the val
12680 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a  ue of flags:.**.
12690 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43  **     SQLITE_AC
126a0 43 45 53 53 5f 45 58 49 53 54 53 3a 20 52 65 74  CESS_EXISTS: Ret
126b0 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c  urn 1 if the fil
126c0 65 20 65 78 69 73 74 73 0a 2a 2a 20 20 20 20 20  e exists.**     
126d0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
126e0 41 44 57 52 49 54 45 3a 20 52 65 74 75 72 6e 20  ADWRITE: Return 
126f0 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  1 if the file is
12700 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 61 62   read and writab
12710 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  le..**     SQLIT
12720 45 5f 41 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c  E_ACCESS_READONL
12730 59 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  Y: Return 1 if t
12740 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 61  he file is reada
12750 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ble..**.** Other
12760 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a  wise return 0..*
12770 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
12780 78 41 63 63 65 73 73 28 73 71 6c 69 74 65 33 5f  xAccess(sqlite3_
12790 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74  vfs *pVfs, const
127a0 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e   char *zPath, in
127b0 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
127c0 61 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 73 77 69  amode = 0;.  swi
127d0 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20  tch( flags ){.  
127e0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
127f0 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20  CESS_EXISTS:.   
12800 20 20 20 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b     amode = F_OK;
12810 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12820 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
12830 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a  CESS_READWRITE:.
12840 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 57 5f        amode = W_
12850 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62  OK|R_OK;.      b
12860 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
12870 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
12880 44 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d  D:.      amode =
12890 20 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65   R_OK;.      bre
128a0 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74  ak;..    default
128b0 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 21  :.      assert(!
128c0 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61  "Invalid flags a
128d0 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20  rgument");.  }. 
128e0 20 72 65 74 75 72 6e 20 28 61 63 63 65 73 73 28   return (access(
128f0 7a 50 61 74 68 2c 20 61 6d 6f 64 65 29 3d 3d 30  zPath, amode)==0
12900 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  );.}../*.** Crea
12910 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  te a temporary f
12920 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66  ile name in zBuf
12930 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20  .  zBuf must be 
12940 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20  allocated.** by 
12950 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  the calling proc
12960 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20  ess and must be 
12970 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  big enough to ho
12980 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70  ld at least.** p
12990 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
129a0 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bytes..*/.static
129b0 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70   int unixGetTemp
129c0 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73  name(sqlite3_vfs
129d0 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
129e0 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
129f0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
12a00 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b  ar *azDirs[] = {
12a10 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f  .     0,.     "/
12a20 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22  var/tmp",.     "
12a30 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /usr/tmp",.     
12a40 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2e 22  "/tmp",.     "."
12a50 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20  ,.  };.  static 
12a60 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
12a70 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20  har zChars[] =. 
12a80 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c     "abcdefghijkl
12a90 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a  mnopqrstuvwxyz".
12aa0 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b      "ABCDEFGHIJK
12ab0 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22  LMNOPQRSTUVWXYZ"
12ac0 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38 39  .    "0123456789
12ad0 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ";.  int i, j;. 
12ae0 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
12af0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
12b00 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 0a 20 20 2f  zDir = ".";..  /
12b10 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
12b20 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
12b30 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
12b40 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
12b50 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
12b60 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
12b70 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
12b80 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
12b90 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
12ba0 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20  nction failing. 
12bb0 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
12bc0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
12bd0 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
12be0 0a 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73  .  azDirs[0] = s
12bf0 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
12c00 63 74 6f 72 79 3b 0a 20 20 66 6f 72 28 69 3d 30  ctory;.  for(i=0
12c10 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72  ; i<sizeof(azDir
12c20 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73  s)/sizeof(azDirs
12c30 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
12c40 69 66 28 20 61 7a 44 69 72 73 5b 69 5d 3d 3d 30  if( azDirs[i]==0
12c50 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
12c60 20 69 66 28 20 73 74 61 74 28 61 7a 44 69 72 73   if( stat(azDirs
12c70 5b 69 5d 2c 20 26 62 75 66 29 20 29 20 63 6f 6e  [i], &buf) ) con
12c80 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21  tinue;.    if( !
12c90 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d  S_ISDIR(buf.st_m
12ca0 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ode) ) continue;
12cb0 0a 20 20 20 20 69 66 28 20 61 63 63 65 73 73 28  .    if( access(
12cc0 61 7a 44 69 72 73 5b 69 5d 2c 20 30 37 29 20 29  azDirs[i], 07) )
12cd0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a   continue;.    z
12ce0 44 69 72 20 3d 20 61 7a 44 69 72 73 5b 69 5d 3b  Dir = azDirs[i];
12cf0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
12d00 20 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 44 69    if( strlen(zDi
12d10 72 29 20 2d 20 73 69 7a 65 6f 66 28 53 51 4c 49  r) - sizeof(SQLI
12d20 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45  TE_TEMP_FILE_PRE
12d30 46 49 58 29 20 2d 20 31 37 20 3c 3d 30 20 29 7b  FIX) - 17 <=0 ){
12d40 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12d50 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
12d60 64 6f 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  do{.    assert( 
12d70 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
12d80 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 29  ==MAX_PATHNAME )
12d90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
12da0 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 37 2c 20  printf(nBuf-17, 
12db0 7a 42 75 66 2c 20 22 25 73 2f 22 53 51 4c 49 54  zBuf, "%s/"SQLIT
12dc0 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  E_TEMP_FILE_PREF
12dd0 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a  IX, zDir);.    j
12de0 20 3d 20 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b   = strlen(zBuf);
12df0 0a 20 20 20 20 73 71 6c 69 74 65 33 52 61 6e 64  .    sqlite3Rand
12e00 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66  omness(15, &zBuf
12e10 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  [j]);.    for(i=
12e20 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b  0; i<15; i++, j+
12e30 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 6a  +){.      zBuf[j
12e40 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73  ] = (char)zChars
12e50 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  [ ((unsigned cha
12e60 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65  r)zBuf[j])%(size
12e70 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b  of(zChars)-1) ];
12e80 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b  .    }.    zBuf[
12e90 6a 5d 20 3d 20 30 3b 0a 20 20 7d 77 68 69 6c 65  j] = 0;.  }while
12ea0 28 20 61 63 63 65 73 73 28 7a 42 75 66 2c 30 29  ( access(zBuf,0)
12eb0 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
12ec0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
12ed0 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61  *.** Turn a rela
12ee0 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e  tive pathname in
12ef0 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61  to a full pathna
12f00 6d 65 2e 20 54 68 65 20 72 65 6c 61 74 69 76 65  me. The relative
12f10 20 70 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f 72   path.** is stor
12f20 65 64 20 61 73 20 61 20 6e 75 6c 2d 74 65 72 6d  ed as a nul-term
12f30 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 69 6e  inated string in
12f40 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
12f50 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50 61  ted to by.** zPa
12f60 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20  th. .**.** zOut 
12f70 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66  points to a buff
12f80 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 73  er of at least s
12f90 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
12fa0 68 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a 20  hname bytes .** 
12fb0 28 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20 4d  (in this case, M
12fc0 41 58 5f 50 41 54 48 4e 41 4d 45 20 62 79 74 65  AX_PATHNAME byte
12fd0 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61 74  s). The full-pat
12fe0 68 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a  h is written to.
12ff0 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72 20 62  ** this buffer b
13000 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
13010 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
13020 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  nixFullPathname(
13030 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
13040 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20  pVfs,           
13050 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76   /* Pointer to v
13060 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  fs object */.  c
13070 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
13080 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
13090 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76  Possibly relativ
130a0 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a  e input path */.
130b0 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20    int nOut,     
130c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130d0 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75  /* Size of outpu
130e0 74 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65  t buffer in byte
130f0 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75  s */.  char *zOu
13100 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
13110 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62       /* Output b
13120 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20 20 2f  uffer */.){..  /
13130 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
13140 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
13150 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
13160 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
13170 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
13180 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
13190 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
131a0 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
131b0 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
131c0 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20  nction failing. 
131d0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
131e0 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72  uld fail if, for
131f0 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20   example, the.  
13200 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69  ** current worki
13210 6e 67 20 64 69 72 65 63 74 6c 79 20 68 61 73 20  ng directly has 
13220 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20  been unlinked.. 
13230 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   */.  SimulateIO
13240 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
13250 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20  LITE_ERROR );.. 
13260 20 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e 6d   assert( pVfs->m
13270 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50  xPathname==MAX_P
13280 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20 7a 4f 75  ATHNAME );.  zOu
13290 74 5b 6e 4f 75 74 2d 31 5d 20 3d 20 27 5c 30 27  t[nOut-1] = '\0'
132a0 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d  ;.  if( zPath[0]
132b0 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 73 71 6c  =='/' ){.    sql
132c0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f  ite3_snprintf(nO
132d0 75 74 2c 20 7a 4f 75 74 2c 20 22 25 73 22 2c 20  ut, zOut, "%s", 
132e0 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b  zPath);.  }else{
132f0 0a 20 20 20 20 69 6e 74 20 6e 43 77 64 3b 0a 20  .    int nCwd;. 
13300 20 20 20 69 66 28 20 67 65 74 63 77 64 28 7a 4f     if( getcwd(zO
13310 75 74 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30 20 29  ut, nOut-1)==0 )
13320 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
13330 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
13340 20 20 20 20 7d 0a 20 20 20 20 6e 43 77 64 20 3d      }.    nCwd =
13350 20 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20   strlen(zOut);. 
13360 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
13370 6e 74 66 28 6e 4f 75 74 2d 6e 43 77 64 2c 20 26  ntf(nOut-nCwd, &
13380 7a 4f 75 74 5b 6e 43 77 64 5d 2c 20 22 2f 25 73  zOut[nCwd], "/%s
13390 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20  ", zPath);.  }. 
133a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
133b0 4b 3b 0a 0a 23 69 66 20 30 0a 20 20 2f 2a 0a 20  K;..#if 0.  /*. 
133c0 20 2a 2a 20 52 65 6d 6f 76 65 20 22 2f 2e 2f 22   ** Remove "/./"
133d0 20 70 61 74 68 20 65 6c 65 6d 65 6e 74 73 20 61   path elements a
133e0 6e 64 20 63 6f 6e 76 65 72 74 20 22 2f 41 2f 2e  nd convert "/A/.
133f0 2f 22 20 70 61 74 68 20 65 6c 65 6d 65 6e 74 73  /" path elements
13400 0a 20 20 2a 2a 20 74 6f 20 6a 75 73 74 20 22 2f  .  ** to just "/
13410 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  "..  */.  if( zF
13420 75 6c 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ull ){.    int i
13430 2c 20 6a 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6a  , j;.    for(i=j
13440 3d 30 3b 20 7a 46 75 6c 6c 5b 69 5d 3b 20 69 2b  =0; zFull[i]; i+
13450 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 46  +){.      if( zF
13460 75 6c 6c 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20  ull[i]=='/' ){. 
13470 20 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c         if( zFull
13480 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e  [i+1]=='/' ) con
13490 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
134a0 66 28 20 7a 46 75 6c 6c 5b 69 2b 31 5d 3d 3d 27  f( zFull[i+1]=='
134b0 2e 27 20 26 26 20 7a 46 75 6c 6c 5b 69 2b 32 5d  .' && zFull[i+2]
134c0 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='/' ){.       
134d0 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20     i += 1;.     
134e0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
134f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13500 20 69 66 28 20 7a 46 75 6c 6c 5b 69 2b 31 5d 3d   if( zFull[i+1]=
13510 3d 27 2e 27 20 26 26 20 7a 46 75 6c 6c 5b 69 2b  ='.' && zFull[i+
13520 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 46 75 6c 6c  2]=='.' && zFull
13530 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  [i+3]=='/' ){.  
13540 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a          while( j
13550 3e 30 20 26 26 20 7a 46 75 6c 6c 5b 6a 2d 31 5d  >0 && zFull[j-1]
13560 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a  !='/' ){ j--; }.
13570 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 33            i += 3
13580 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
13590 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
135a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 46        }.      zF
135b0 75 6c 6c 5b 6a 2b 2b 5d 20 3d 20 7a 46 75 6c 6c  ull[j++] = zFull
135c0 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  [i];.    }.    z
135d0 46 75 6c 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d  Full[j] = 0;.  }
135e0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 23 69 66 6e  .#endif.}...#ifn
135f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13600 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f  LOAD_EXTENSION./
13610 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20  *.** Interfaces 
13620 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68  for opening a sh
13630 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69  ared library, fi
13640 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e  nding entry poin
13650 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ts.** within the
13660 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
13670 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65   and closing the
13680 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e   shared library.
13690 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c  .*/.#include <dl
136a0 66 63 6e 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f  fcn.h>.static vo
136b0 69 64 20 2a 75 6e 69 78 44 6c 4f 70 65 6e 28 73  id *unixDlOpen(s
136c0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
136d0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
136e0 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 72 65 74 75  ilename){.  retu
136f0 72 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e  rn dlopen(zFilen
13700 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20  ame, RTLD_NOW | 
13710 52 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a  RTLD_GLOBAL);.}.
13720 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 61  ./*.** SQLite ca
13730 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  lls this functio
13740 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  n immediately af
13750 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 75 6e  ter a call to un
13760 69 78 44 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a 20  ixDlSym() or.** 
13770 75 6e 69 78 44 6c 4f 70 65 6e 28 29 20 66 61 69  unixDlOpen() fai
13780 6c 73 20 28 72 65 74 75 72 6e 73 20 61 20 6e 75  ls (returns a nu
13790 6c 6c 20 70 6f 69 6e 74 65 72 29 2e 20 49 66 20  ll pointer). If 
137a0 61 20 6d 6f 72 65 20 64 65 74 61 69 6c 65 64 20  a more detailed 
137b0 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65  error.** message
137c0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 69   is available, i
137d0 74 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  t is written to 
137e0 7a 42 75 66 4f 75 74 2e 20 49 66 20 6e 6f 20 65  zBufOut. If no e
137f0 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20  rror message.** 
13800 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 7a 42  is available, zB
13810 75 66 4f 75 74 20 69 73 20 6c 65 66 74 20 75 6e  ufOut is left un
13820 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 53 51 4c  modified and SQL
13830 69 74 65 20 75 73 65 73 20 61 20 64 65 66 61 75  ite uses a defau
13840 6c 74 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73  lt.** error mess
13850 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
13860 6f 69 64 20 75 6e 69 78 44 6c 45 72 72 6f 72 28  oid unixDlError(
13870 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
13880 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
13890 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63  r *zBufOut){.  c
138a0 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 65 6e 74  har *zErr;.  ent
138b0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a 45 72  erMutex();.  zEr
138c0 72 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b 0a 20  r = dlerror();. 
138d0 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20   if( zErr ){.   
138e0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
138f0 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 2c  f(nBuf, zBufOut,
13900 20 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20 20   "%s", zErr);.  
13910 7d 0a 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29  }.  leaveMutex()
13920 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
13930 2a 75 6e 69 78 44 6c 53 79 6d 28 73 71 6c 69 74  *unixDlSym(sqlit
13940 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f  e3_vfs *pVfs, vo
13950 69 64 20 2a 70 48 61 6e 64 6c 65 2c 20 63 6f 6e  id *pHandle, con
13960 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 62 6f 6c  st char *zSymbol
13970 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 6c 73 79  ){.  return dlsy
13980 6d 28 70 48 61 6e 64 6c 65 2c 20 7a 53 79 6d 62  m(pHandle, zSymb
13990 6f 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ol);.}.static vo
139a0 69 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73  id unixDlClose(s
139b0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
139c0 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29  , void *pHandle)
139d0 7b 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e  {.  dlclose(pHan
139e0 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a  dle);.}.#else /*
139f0 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
13a00 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69  LOAD_EXTENSION i
13a10 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20  s defined: */.  
13a20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70  #define unixDlOp
13a30 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  en  0.  #define 
13a40 75 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a 20 20  unixDlError 0.  
13a50 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 53 79  #define unixDlSy
13a60 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  m   0.  #define 
13a70 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65  unixDlClose 0.#e
13a80 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
13a90 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20  e nBuf bytes of 
13aa0 72 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f 20 74  random data to t
13ab0 68 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66  he supplied buff
13ac0 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74  er zBuf..*/.stat
13ad0 69 63 20 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f  ic int unixRando
13ae0 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66  mness(sqlite3_vf
13af0 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75  s *pVfs, int nBu
13b00 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
13b10 0a 20 20 61 73 73 65 72 74 28 6e 42 75 66 3e 3d  .  assert(nBuf>=
13b20 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29 2b  (sizeof(time_t)+
13b30 73 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a 0a  sizeof(int)));..
13b40 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20    /* We have to 
13b50 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20  initialize zBuf 
13b60 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72  to prevent valgr
13b70 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69  ind from reporti
13b80 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20  ng.  ** errors. 
13b90 20 54 68 65 20 72 65 70 6f 72 74 73 20 69 73 73   The reports iss
13ba0 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20  ued by valgrind 
13bb0 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20  are incorrect - 
13bc0 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72  we would.  ** pr
13bd0 65 66 65 72 20 74 68 61 74 20 74 68 65 20 72 61  efer that the ra
13be0 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72  ndomness be incr
13bf0 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20  eased by making 
13c00 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  use of the.  ** 
13c10 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70  uninitialized sp
13c20 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75  ace in zBuf - bu
13c30 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72  t valgrind error
13c40 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a  s tend to worry.
13c50 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e    ** some users.
13c60 20 20 52 61 74 68 65 72 20 74 68 61 6e 20 61 72    Rather than ar
13c70 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61  gue, it seems ea
13c80 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69  sier just to ini
13c90 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65  tialize.  ** the
13ca0 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64   whole array and
13cb0 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e   silence valgrin
13cc0 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  d, even if that 
13cd0 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f  means less rando
13ce0 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68  mness.  ** in th
13cf0 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20  e random seed.. 
13d00 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65   **.  ** When te
13d10 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a  sting, initializ
13d20 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65  ing zBuf[] to ze
13d30 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e  ro is all we do.
13d40 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a    That means.  *
13d50 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61 79 73  * that we always
13d60 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 61   use the same ra
13d70 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75  ndom number sequ
13d80 65 6e 63 65 2e 20 20 54 68 69 73 20 6d 61 6b 65  ence.  This make
13d90 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73  s the.  ** tests
13da0 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a   repeatable..  *
13db0 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c  /.  memset(zBuf,
13dc0 20 30 2c 20 6e 42 75 66 29 3b 0a 23 69 66 20 21   0, nBuf);.#if !
13dd0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
13de0 45 53 54 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74  EST).  {.    int
13df0 20 70 69 64 2c 20 66 64 3b 0a 20 20 20 20 66 64   pid, fd;.    fd
13e00 20 3d 20 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72   = open("/dev/ur
13e10 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59  andom", O_RDONLY
13e20 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20  );.    if( fd<0 
13e30 29 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74 20  ){.      time_t 
13e40 74 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26 74  t;.      time(&t
13e50 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
13e60 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66  zBuf, &t, sizeof
13e70 28 74 29 29 3b 0a 20 20 20 20 20 20 70 69 64 20  (t));.      pid 
13e80 3d 20 67 65 74 70 69 64 28 29 3b 0a 20 20 20 20  = getpid();.    
13e90 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 73    memcpy(&zBuf[s
13ea0 69 7a 65 6f 66 28 74 29 5d 2c 20 26 70 69 64 2c  izeof(t)], &pid,
13eb0 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20   sizeof(pid));. 
13ec0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13ed0 72 65 61 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e  read(fd, zBuf, n
13ee0 42 75 66 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73  Buf);.      clos
13ef0 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e(fd);.    }.  }
13f00 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
13f10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
13f20 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20  /*.** Sleep for 
13f30 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20  a little while. 
13f40 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75   Return the amou
13f50 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74  nt of time slept
13f60 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  ..** The argumen
13f70 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  t is the number 
13f80 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20  of microseconds 
13f90 77 65 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70  we want to sleep
13fa0 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
13fb0 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
13fc0 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f  ber of microseco
13fd0 6e 64 73 20 6f 66 20 73 6c 65 65 70 20 61 63 74  nds of sleep act
13fe0 75 61 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74  ually.** request
13ff0 65 64 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65  ed from the unde
14000 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
14010 20 73 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65   system, a numbe
14020 72 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74  r which.** might
14030 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
14040 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
14050 20 61 72 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e   argument, but n
14060 6f 74 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20  ot less.** than 
14070 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  the argument..*/
14080 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
14090 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66  Sleep(sqlite3_vf
140a0 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6d 69 63  s *pVfs, int mic
140b0 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20  roseconds){.#if 
140c0 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c  defined(HAVE_USL
140d0 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c  EEP) && HAVE_USL
140e0 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d 69 63  EEP.  usleep(mic
140f0 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20 72 65  roseconds);.  re
14100 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64  turn microsecond
14110 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 73  s;.#else.  int s
14120 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73  econds = (micros
14130 65 63 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f 31  econds+999999)/1
14140 30 30 30 30 30 30 3b 0a 20 20 73 6c 65 65 70 28  000000;.  sleep(
14150 73 65 63 6f 6e 64 73 29 3b 0a 20 20 72 65 74 75  seconds);.  retu
14160 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30 30  rn seconds*10000
14170 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  00;.#endif.}../*
14180 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
14190 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73  g variable, if s
141a0 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  et to a non-zero
141b0 20 76 61 6c 75 65 2c 20 62 65 63 6f 6d 65 73 20   value, becomes 
141c0 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 72 65  the result.** re
141d0 74 75 72 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  turned from sqli
141e0 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65  te3OsCurrentTime
141f0 28 29 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  ().  This is use
14200 64 20 66 6f 72 20 74 65 73 74 69 6e 67 2e 0a 2a  d for testing..*
14210 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
14220 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
14230 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20  _current_time = 
14240 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
14250 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
14260 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
14270 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
14280 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74   Time).  Write t
14290 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69  he.** current ti
142a0 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
142b0 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
142c0 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61  er into *prNow a
142d0 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20  nd.** return 0. 
142e0 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
142f0 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63   time and date c
14300 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
14310 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
14320 69 78 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71  ixCurrentTime(sq
14330 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
14340 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b   double *prNow){
14350 0a 23 69 66 64 65 66 20 4e 4f 5f 47 45 54 54 4f  .#ifdef NO_GETTO
14360 44 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20  D.  time_t t;.  
14370 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70 72 4e  time(&t);.  *prN
14380 6f 77 20 3d 20 74 2f 38 36 34 30 30 2e 30 20 2b  ow = t/86400.0 +
14390 20 32 34 34 30 35 38 37 2e 35 3b 0a 23 65 6c 73   2440587.5;.#els
143a0 65 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 76  e.  struct timev
143b0 61 6c 20 73 4e 6f 77 3b 0a 20 20 67 65 74 74 69  al sNow;.  getti
143c0 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30  meofday(&sNow, 0
143d0 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 32 34  );.  *prNow = 24
143e0 34 30 35 38 37 2e 35 20 2b 20 73 4e 6f 77 2e 74  40587.5 + sNow.t
143f0 76 5f 73 65 63 2f 38 36 34 30 30 2e 30 20 2b 20  v_sec/86400.0 + 
14400 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 38 36 34  sNow.tv_usec/864
14410 30 30 30 30 30 30 30 30 2e 30 3b 0a 23 65 6e 64  00000000.0;.#end
14420 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
14430 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69  _TEST.  if( sqli
14440 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
14450 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d   ){.    *prNow =
14460 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
14470 5f 74 69 6d 65 2f 38 36 34 30 30 2e 30 20 2b 20  _time/86400.0 + 
14480 32 34 34 30 35 38 37 2e 35 3b 0a 20 20 7d 0a 23  2440587.5;.  }.#
14490 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 30  endif.  return 0
144a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
144b0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
144c0 68 65 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c  he sqlite3Defaul
144d0 74 56 66 73 20 73 74 72 75 63 74 75 72 65 2e 20  tVfs structure. 
144e0 20 20 57 65 20 75 73 65 0a 2a 2a 20 61 20 66 75    We use.** a fu
144f0 6e 63 74 69 6f 6e 20 72 61 74 68 65 72 20 74 68  nction rather th
14500 61 6e 20 67 69 76 65 20 74 68 65 20 73 74 72 75  an give the stru
14510 63 74 75 72 65 20 67 6c 6f 62 61 6c 20 73 63 6f  cture global sco
14520 70 65 20 62 65 63 61 75 73 65 0a 2a 2a 20 73 6f  pe because.** so
14530 6d 65 20 63 6f 6d 70 69 6c 65 72 73 20 28 4d 53  me compilers (MS
14540 56 43 29 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77  VC) do not allow
14550 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   forward declara
14560 74 69 6f 6e 73 20 6f 66 0a 2a 2a 20 69 6e 69 74  tions of.** init
14570 69 61 6c 69 7a 65 64 20 73 74 72 75 63 74 75 72  ialized structur
14580 65 73 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76  es..*/.sqlite3_v
14590 66 73 20 2a 73 71 6c 69 74 65 33 4f 73 44 65 66  fs *sqlite3OsDef
145a0 61 75 6c 74 56 66 73 28 76 6f 69 64 29 7b 0a 20  aultVfs(void){. 
145b0 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f   static sqlite3_
145c0 76 66 73 20 75 6e 69 78 56 66 73 20 3d 20 7b 0a  vfs unixVfs = {.
145d0 20 20 20 20 31 2c 20 20 20 20 20 20 20 20 20 20      1,          
145e0 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
145f0 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f  ion */.    sizeo
14600 66 28 75 6e 69 78 46 69 6c 65 29 2c 20 20 20 2f  f(unixFile),   /
14610 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20  * szOsFile */.  
14620 20 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20    MAX_PATHNAME, 
14630 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e        /* mxPathn
14640 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ame */.    0,   
14650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14660 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22  * pNext */.    "
14670 75 6e 69 78 22 2c 20 20 20 20 20 20 20 20 20 20  unix",          
14680 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20     /* zName */. 
14690 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
146a0 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61         /* pAppDa
146b0 74 61 20 2a 2f 0a 20 20 0a 20 20 20 20 75 6e 69  ta */.  .    uni
146c0 78 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  xOpen,          
146d0 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20   /* xOpen */.   
146e0 20 75 6e 69 78 44 65 6c 65 74 65 2c 20 20 20 20   unixDelete,    
146f0 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20       /* xDelete 
14700 2a 2f 0a 20 20 20 20 75 6e 69 78 41 63 63 65 73  */.    unixAcces
14710 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41  s,         /* xA
14720 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 75 6e 69  ccess */.    uni
14730 78 47 65 74 54 65 6d 70 6e 61 6d 65 2c 20 20 20  xGetTempname,   
14740 20 2f 2a 20 78 47 65 74 54 65 6d 70 4e 61 6d 65   /* xGetTempName
14750 20 2a 2f 0a 20 20 20 20 75 6e 69 78 46 75 6c 6c   */.    unixFull
14760 50 61 74 68 6e 61 6d 65 2c 20 20 20 2f 2a 20 78  Pathname,   /* x
14770 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  FullPathname */.
14780 20 20 20 20 75 6e 69 78 44 6c 4f 70 65 6e 2c 20      unixDlOpen, 
14790 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70          /* xDlOp
147a0 65 6e 20 2a 2f 0a 20 20 20 20 75 6e 69 78 44 6c  en */.    unixDl
147b0 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 2f 2a  Error,        /*
147c0 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20   xDlError */.   
147d0 20 75 6e 69 78 44 6c 53 79 6d 2c 20 20 20 20 20   unixDlSym,     
147e0 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a       /* xDlSym *
147f0 2f 0a 20 20 20 20 75 6e 69 78 44 6c 43 6c 6f 73  /.    unixDlClos
14800 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c  e,        /* xDl
14810 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 75 6e 69  Close */.    uni
14820 78 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20  xRandomness,    
14830 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20   /* xRandomness 
14840 2a 2f 0a 20 20 20 20 75 6e 69 78 53 6c 65 65 70  */.    unixSleep
14850 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53  ,          /* xS
14860 6c 65 65 70 20 2a 2f 0a 20 20 20 20 75 6e 69 78  leep */.    unix
14870 43 75 72 72 65 6e 74 54 69 6d 65 20 20 20 20 20  CurrentTime     
14880 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20  /* xCurrentTime 
14890 2a 2f 0a 20 20 7d 3b 0a 20 20 0a 20 20 72 65 74  */.  };.  .  ret
148a0 75 72 6e 20 26 75 6e 69 78 56 66 73 3b 0a 7d 0a  urn &unixVfs;.}.
148b0 20 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 55   .#endif /* OS_U
148c0 4e 49 58 20 2a 2f 0a                             NIX */.