/ Hex Artifact Content
Login

Artifact 8cf512c4321c3114f053dc9eaae394db2dc03ebe:


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 70 6f  edef enum {.  po
36a0: 73 69 78 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  sixLockingStyle 
36b0: 3d 20 30 2c 20 20 20 20 20 20 20 2f 2a 20 73 74  = 0,       /* st
36c0: 61 6e 64 61 72 64 20 70 6f 73 69 78 2d 61 64 76  andard posix-adv
36d0: 69 73 6f 72 79 20 6c 6f 63 6b 73 20 2a 2f 0a 20  isory locks */. 
36e0: 20 61 66 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65   afpLockingStyle
36f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
3700: 20 75 73 65 20 61 66 70 20 6c 6f 63 6b 73 20 2a   use afp locks *
3710: 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  /.  flockLocking
3720: 53 74 79 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Style,          
3730: 20 2f 2a 20 75 73 65 20 66 6c 6f 63 6b 28 29 20   /* use flock() 
3740: 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b  */.  dotlockLock
3750: 69 6e 67 53 74 79 6c 65 2c 20 20 20 20 20 20 20  ingStyle,       
3760: 20 20 2f 2a 20 75 73 65 20 3c 66 69 6c 65 3e 2e    /* use <file>.
3770: 6c 6f 63 6b 20 66 69 6c 65 73 20 2a 2f 0a 20 20  lock files */.  
3780: 6e 6f 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 2c 20  noLockingStyle, 
3790: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37a0: 75 73 65 66 75 6c 20 66 6f 72 20 72 65 61 64 2d  useful for read-
37b0: 6f 6e 6c 79 20 66 69 6c 65 20 73 79 73 74 65 6d  only file system
37c0: 20 2a 2f 0a 20 20 75 6e 73 75 70 70 6f 72 74 65   */.  unsupporte
37d0: 64 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 20 20  dLockingStyle   
37e0: 20 20 20 2f 2a 20 69 6e 64 69 63 61 74 65 73 20     /* indicates 
37f0: 75 6e 73 75 70 70 6f 72 74 65 64 20 66 69 6c 65  unsupported file
3800: 20 73 79 73 74 65 6d 20 2a 2f 0a 7d 20 73 71 6c   system */.} sql
3810: 69 74 65 33 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  ite3LockingStyle
3820: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
3830: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
3840: 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  G_STYLE */../*.*
3850: 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f  * Helper functio
3860: 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64  ns to obtain and
3870: 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20   relinquish the 
3880: 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 0a 2a 2f  global mutex..*/
3890: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 6e 74  .static void ent
38a0: 65 72 4d 75 74 65 78 28 29 7b 0a 20 20 73 71 6c  erMutex(){.  sql
38b0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
38c0: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61  (sqlite3_mutex_a
38d0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
38e0: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
38f0: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
3900: 20 6c 65 61 76 65 4d 75 74 65 78 28 29 7b 0a 20   leaveMutex(){. 
3910: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
3920: 65 61 76 65 28 73 71 6c 69 74 65 33 5f 6d 75 74  eave(sqlite3_mut
3930: 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
3940: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
3950: 54 45 52 29 29 3b 0a 7d 0a 0a 23 69 66 20 53 51  TER));.}..#if SQ
3960: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
3970: 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72 69 61  /*.** This varia
3980: 62 6c 65 20 72 65 63 6f 72 64 73 20 77 68 65 74  ble records whet
3990: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61  her or not threa
39a0: 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20  ds can override 
39b0: 65 61 63 68 20 6f 74 68 65 72 73 0a 2a 2a 20 6c  each others.** l
39c0: 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 30  ocks..**.**    0
39d0: 3a 20 20 4e 6f 2e 20 20 54 68 72 65 61 64 73 20  :  No.  Threads 
39e0: 63 61 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20  cannot override 
39f0: 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b  each others lock
3a00: 73 2e 0a 2a 2a 20 20 20 20 31 3a 20 20 59 65 73  s..**    1:  Yes
3a10: 2e 20 20 54 68 72 65 61 64 73 20 63 61 6e 20 6f  .  Threads can o
3a20: 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68  verride each oth
3a30: 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2a 20 20 20  ers locks..**   
3a40: 2d 31 3a 20 20 57 65 20 64 6f 6e 27 74 20 6b 6e  -1:  We don't kn
3a50: 6f 77 20 79 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  ow yet..**.** On
3a60: 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 77   some systems, w
3a70: 65 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c  e know at compil
3a80: 65 2d 74 69 6d 65 20 69 66 20 74 68 72 65 61 64  e-time if thread
3a90: 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65  s can override e
3aa0: 61 63 68 0a 2a 2a 20 6f 74 68 65 72 73 20 6c 6f  ach.** others lo
3ab0: 63 6b 73 2e 20 20 4f 6e 20 74 68 6f 73 65 20 73  cks.  On those s
3ac0: 79 73 74 65 6d 73 2c 20 74 68 65 20 53 51 4c 49  ystems, the SQLI
3ad0: 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49  TE_THREAD_OVERRI
3ae0: 44 45 5f 4c 4f 43 4b 20 6d 61 63 72 6f 0a 2a 2a  DE_LOCK macro.**
3af0: 20 77 69 6c 6c 20 62 65 20 73 65 74 20 61 70 70   will be set app
3b00: 72 6f 70 72 69 61 74 65 6c 79 2e 20 20 4f 6e 20  ropriately.  On 
3b10: 6f 74 68 65 72 20 73 79 73 74 65 6d 73 2c 20 77  other systems, w
3b20: 65 20 68 61 76 65 20 74 6f 20 63 68 65 63 6b 20  e have to check 
3b30: 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2e 20 20  at.** runtime.  
3b40: 4f 6e 20 74 68 65 73 65 20 6c 61 74 74 65 72 20  On these latter 
3b50: 73 79 73 74 65 6d 73 2c 20 53 51 4c 54 49 45 5f  systems, SQLTIE_
3b60: 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f  THREAD_OVERRIDE_
3b70: 4c 4f 43 4b 20 69 73 0a 2a 2a 20 75 6e 64 65 66  LOCK is.** undef
3b80: 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ined..**.** This
3b90: 20 76 61 72 69 61 62 6c 65 20 6e 6f 72 6d 61 6c   variable normal
3ba0: 6c 79 20 68 61 73 20 66 69 6c 65 20 73 63 6f 70  ly has file scop
3bb0: 65 20 6f 6e 6c 79 2e 20 20 42 75 74 20 64 75 72  e only.  But dur
3bc0: 69 6e 67 20 74 65 73 74 69 6e 67 2c 20 77 65 20  ing testing, we 
3bd0: 6d 61 6b 65 0a 2a 2a 20 69 74 20 61 20 67 6c 6f  make.** it a glo
3be0: 62 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20  bal so that the 
3bf0: 74 65 73 74 20 63 6f 64 65 20 63 61 6e 20 63 68  test code can ch
3c00: 61 6e 67 65 20 69 74 73 20 76 61 6c 75 65 20 69  ange its value i
3c10: 6e 20 6f 72 64 65 72 20 74 6f 20 76 65 72 69 66  n order to verif
3c20: 79 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 72 69  y.** that the ri
3c30: 67 68 74 20 73 74 75 66 66 20 68 61 70 70 65 6e  ght stuff happen
3c40: 73 20 69 6e 20 65 69 74 68 65 72 20 63 61 73 65  s in either case
3c50: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
3c60: 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52  ITE_THREAD_OVERR
3c70: 49 44 45 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e  IDE_LOCK.# defin
3c80: 65 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f  e SQLITE_THREAD_
3c90: 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 20 2d 31  OVERRIDE_LOCK -1
3ca0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
3cb0: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 74  QLITE_TEST.int t
3cc0: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
3cd0: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20  chOthersLocks = 
3ce0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56  SQLITE_THREAD_OV
3cf0: 45 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a 23 65 6c  ERRIDE_LOCK;.#el
3d00: 73 65 0a 73 74 61 74 69 63 20 69 6e 74 20 74 68  se.static int th
3d10: 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63  readsOverrideEac
3d20: 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20 53  hOthersLocks = S
3d30: 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45  QLITE_THREAD_OVE
3d40: 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a 23 65 6e 64  RRIDE_LOCK;.#end
3d50: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 73  if../*.** This s
3d60: 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 69  tructure holds i
3d70: 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73 65  nformation passe
3d80: 64 20 69 6e 74 6f 20 69 6e 64 69 76 69 64 75 61  d into individua
3d90: 6c 20 74 65 73 74 0a 2a 2a 20 74 68 72 65 61 64  l test.** thread
3da0: 73 20 62 79 20 74 68 65 20 74 65 73 74 54 68 72  s by the testThr
3db0: 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69  eadLockingBehavi
3dc0: 6f 72 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  or() routine..*/
3dd0: 0a 73 74 72 75 63 74 20 74 68 72 65 61 64 54 65  .struct threadTe
3de0: 73 74 44 61 74 61 20 7b 0a 20 20 69 6e 74 20 66  stData {.  int f
3df0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
3e00: 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 62 65 20    /* File to be 
3e10: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 73 74 72 75  locked */.  stru
3e20: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 20 20  ct flock lock;  
3e30: 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e     /* The lockin
3e40: 67 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  g operation */. 
3e50: 20 69 6e 74 20 72 65 73 75 6c 74 3b 20 20 20 20   int result;    
3e60: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
3e70: 74 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  t of the locking
3e80: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b   operation */.};
3e90: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
3ea0: 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a  LOCK_TRACE./*.**
3eb0: 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72   Print out infor
3ec0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c  mation about all
3ed0: 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69   locking operati
3ee0: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
3ef0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3f00: 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74  for troubleshoot
3f10: 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c  ing locks on mul
3f20: 74 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c  tithreaded.** pl
3f30: 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65  atforms.  Enable
3f40: 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69   by compiling wi
3f50: 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f  th the -DSQLITE_
3f60: 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f  LOCK_TRACE.** co
3f70: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f  mmand-line optio
3f80: 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65  n on the compile
3f90: 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73  r.  This code is
3fa0: 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72   normally.** tur
3fb0: 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74  ned off..*/.stat
3fc0: 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65  ic int lockTrace
3fd0: 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c  (int fd, int op,
3fe0: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70   struct flock *p
3ff0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61  ){.  char *zOpNa
4000: 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e  me, *zType;.  in
4010: 74 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64  t s;.  int saved
4020: 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d  Errno;.  if( op=
4030: 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20  =F_GETLK ){.    
4040: 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b  zOpName = "GETLK
4050: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  ";.  }else if( o
4060: 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20  p==F_SETLK ){.  
4070: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54    zOpName = "SET
4080: 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  LK";.  }else{.  
4090: 20 20 73 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20    s = fcntl(fd, 
40a0: 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69  op, p);.    sqli
40b0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
40c0: 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64  fcntl unknown %d
40d0: 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f   %d %d\n", fd, o
40e0: 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74 75 72  p, s);.    retur
40f0: 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n s;.  }.  if( p
4100: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  ->l_type==F_RDLC
4110: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
4120: 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "RDLCK";.  }els
4130: 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d  e if( p->l_type=
4140: 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_WRLCK ){.    
4150: 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b  zType = "WRLCK";
4160: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
4170: 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  l_type==F_UNLCK 
4180: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
4190: 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b  UNLCK";.  }else{
41a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29  .    assert( 0 )
41b0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
41c0: 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45  p->l_whence==SEE
41d0: 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d 20 66  K_SET );.  s = f
41e0: 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b  cntl(fd, op, p);
41f0: 0a 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20  .  savedErrno = 
4200: 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33  errno;.  sqlite3
4210: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
4220: 74 6c 20 25 64 20 25 64 20 25 73 20 25 73 20 25  tl %d %d %s %s %
4230: 64 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20  d %d %d %d\n",. 
4240: 20 20 20 20 74 68 72 65 61 64 69 64 2c 20 66 64      threadid, fd
4250: 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65  , zOpName, zType
4260: 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72  , (int)p->l_star
4270: 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e  t, (int)p->l_len
4280: 2c 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c  ,.     (int)p->l
4290: 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20  _pid, s);.  if( 
42a0: 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46  s==(-1) && op==F
42b0: 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f  _SETLK && (p->l_
42c0: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c  type==F_RDLCK ||
42d0: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52   p->l_type==F_WR
42e0: 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75  LCK) ){.    stru
42f0: 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20  ct flock l2;.   
4300: 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20 66 63   l2 = *p;.    fc
4310: 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c  ntl(fd, F_GETLK,
4320: 20 26 6c 32 29 3b 0a 20 20 20 20 69 66 28 20 6c   &l2);.    if( l
4330: 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  2.l_type==F_RDLC
4340: 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65  K ){.      zType
4350: 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 20 20   = "RDLCK";.    
4360: 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74  }else if( l2.l_t
4370: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a  ype==F_WRLCK ){.
4380: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57        zType = "W
4390: 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  RLCK";.    }else
43a0: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
43b0: 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
43c0: 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22   zType = "UNLCK"
43d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
43e0: 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a     assert( 0 );.
43f0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
4400: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63  3DebugPrintf("fc
4410: 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65 61 73  ntl-failure-reas
4420: 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25 64 5c  on: %s %d %d %d\
4430: 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54 79 70 65  n",.       zType
4440: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74 61 72  , (int)l2.l_star
4450: 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e  t, (int)l2.l_len
4460: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69 64 29  , (int)l2.l_pid)
4470: 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20 3d 20  ;.  }.  errno = 
4480: 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 72 65  savedErrno;.  re
4490: 74 75 72 6e 20 73 3b 0a 7d 0a 23 64 65 66 69 6e  turn s;.}.#defin
44a0: 65 20 66 63 6e 74 6c 20 6c 6f 63 6b 54 72 61 63  e fcntl lockTrac
44b0: 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
44c0: 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a 2f  TE_LOCK_TRACE */
44d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 65 73 74  ../*.** The test
44e0: 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68  ThreadLockingBeh
44f0: 61 76 69 6f 72 28 29 20 72 6f 75 74 69 6e 65 20  avior() routine 
4500: 6c 61 75 6e 63 68 65 73 20 74 77 6f 20 73 65 70  launches two sep
4510: 61 72 61 74 65 0a 2a 2a 20 74 68 72 65 61 64 73  arate.** threads
4520: 20 6f 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65   on this routine
4530: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
4540: 61 74 74 65 6d 70 74 73 20 74 6f 20 6c 6f 63 6b  attempts to lock
4550: 20 61 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72   a file.** descr
4560: 69 70 74 6f 72 20 74 68 65 6e 20 72 65 74 75 72  iptor then retur
4570: 6e 73 2e 20 20 54 68 65 20 73 75 63 63 65 73 73  ns.  The success
4580: 20 6f 72 20 66 61 69 6c 75 72 65 20 6f 66 20 74   or failure of t
4590: 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20 61  hat attempt.** a
45a0: 6c 6c 6f 77 73 20 74 68 65 20 74 65 73 74 54 68  llows the testTh
45b0: 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76  readLockingBehav
45c0: 69 6f 72 28 29 20 70 72 6f 63 65 64 75 72 65 20  ior() procedure 
45d0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20  to determine.** 
45e0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
45f0: 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72  hreads can overr
4600: 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20  ide each others 
4610: 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  locks..*/.static
4620: 20 76 6f 69 64 20 2a 74 68 72 65 61 64 4c 6f 63   void *threadLoc
4630: 6b 69 6e 67 54 65 73 74 28 76 6f 69 64 20 2a 70  kingTest(void *p
4640: 41 72 67 29 7b 0a 20 20 73 74 72 75 63 74 20 74  Arg){.  struct t
4650: 68 72 65 61 64 54 65 73 74 44 61 74 61 20 2a 70  hreadTestData *p
4660: 44 61 74 61 20 3d 20 28 73 74 72 75 63 74 20 74  Data = (struct t
4670: 68 72 65 61 64 54 65 73 74 44 61 74 61 2a 29 70  hreadTestData*)p
4680: 41 72 67 3b 0a 20 20 70 44 61 74 61 2d 3e 72 65  Arg;.  pData->re
4690: 73 75 6c 74 20 3d 20 66 63 6e 74 6c 28 70 44 61  sult = fcntl(pDa
46a0: 74 61 2d 3e 66 64 2c 20 46 5f 53 45 54 4c 4b 2c  ta->fd, F_SETLK,
46b0: 20 26 70 44 61 74 61 2d 3e 6c 6f 63 6b 29 3b 0a   &pData->lock);.
46c0: 20 20 72 65 74 75 72 6e 20 70 41 72 67 3b 0a 7d    return pArg;.}
46d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f  ../*.** This pro
46e0: 63 65 64 75 72 65 20 61 74 74 65 6d 70 74 73 20  cedure attempts 
46f0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
4700: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65  ther or not thre
4710: 61 64 73 0a 2a 2a 20 63 61 6e 20 6f 76 65 72 72  ads.** can overr
4720: 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20  ide each others 
4730: 6c 6f 63 6b 73 20 74 68 65 6e 20 73 65 74 73 20  locks then sets 
4740: 74 68 65 20 0a 2a 2a 20 74 68 72 65 61 64 73 4f  the .** threadsO
4750: 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72  verrideEachOther
4760: 73 4c 6f 63 6b 73 20 76 61 72 69 61 62 6c 65 20  sLocks variable 
4770: 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 0a 2a  appropriately..*
4780: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  /.static void te
4790: 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42  stThreadLockingB
47a0: 65 68 61 76 69 6f 72 28 69 6e 74 20 66 64 5f 6f  ehavior(int fd_o
47b0: 72 69 67 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a  rig){.  int fd;.
47c0: 20 20 73 74 72 75 63 74 20 74 68 72 65 61 64 54    struct threadT
47d0: 65 73 74 44 61 74 61 20 64 5b 32 5d 3b 0a 20 20  estData d[2];.  
47e0: 70 74 68 72 65 61 64 5f 74 20 74 5b 32 5d 3b 0a  pthread_t t[2];.
47f0: 0a 20 20 66 64 20 3d 20 64 75 70 28 66 64 5f 6f  .  fd = dup(fd_o
4800: 72 69 67 29 3b 0a 20 20 69 66 28 20 66 64 3c 30  rig);.  if( fd<0
4810: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d   ) return;.  mem
4820: 73 65 74 28 64 2c 20 30 2c 20 73 69 7a 65 6f 66  set(d, 0, sizeof
4830: 28 64 29 29 3b 0a 20 20 64 5b 30 5d 2e 66 64 20  (d));.  d[0].fd 
4840: 3d 20 66 64 3b 0a 20 20 64 5b 30 5d 2e 6c 6f 63  = fd;.  d[0].loc
4850: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  k.l_type = F_RDL
4860: 43 4b 3b 0a 20 20 64 5b 30 5d 2e 6c 6f 63 6b 2e  CK;.  d[0].lock.
4870: 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 64 5b 30  l_len = 1;.  d[0
4880: 5d 2e 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d  ].lock.l_start =
4890: 20 30 3b 0a 20 20 64 5b 30 5d 2e 6c 6f 63 6b 2e   0;.  d[0].lock.
48a0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
48b0: 53 45 54 3b 0a 20 20 64 5b 31 5d 20 3d 20 64 5b  SET;.  d[1] = d[
48c0: 30 5d 3b 0a 20 20 64 5b 31 5d 2e 6c 6f 63 6b 2e  0];.  d[1].lock.
48d0: 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b  l_type = F_WRLCK
48e0: 3b 0a 20 20 70 74 68 72 65 61 64 5f 63 72 65 61  ;.  pthread_crea
48f0: 74 65 28 26 74 5b 30 5d 2c 20 30 2c 20 74 68 72  te(&t[0], 0, thr
4900: 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73 74 2c 20  eadLockingTest, 
4910: 26 64 5b 30 5d 29 3b 0a 20 20 70 74 68 72 65 61  &d[0]);.  pthrea
4920: 64 5f 63 72 65 61 74 65 28 26 74 5b 31 5d 2c 20  d_create(&t[1], 
4930: 30 2c 20 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67  0, threadLocking
4940: 54 65 73 74 2c 20 26 64 5b 31 5d 29 3b 0a 20 20  Test, &d[1]);.  
4950: 70 74 68 72 65 61 64 5f 6a 6f 69 6e 28 74 5b 30  pthread_join(t[0
4960: 5d 2c 20 30 29 3b 0a 20 20 70 74 68 72 65 61 64  ], 0);.  pthread
4970: 5f 6a 6f 69 6e 28 74 5b 31 5d 2c 20 30 29 3b 0a  _join(t[1], 0);.
4980: 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 74    close(fd);.  t
4990: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
49a0: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20  chOthersLocks = 
49b0: 20 64 5b 30 5d 2e 72 65 73 75 6c 74 3d 3d 30 20   d[0].result==0 
49c0: 26 26 20 64 5b 31 5d 2e 72 65 73 75 6c 74 3d 3d  && d[1].result==
49d0: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  0;.}.#endif /* S
49e0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
49f0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61   */../*.** Relea
4a00: 73 65 20 61 20 6c 6f 63 6b 49 6e 66 6f 20 73 74  se a lockInfo st
4a10: 72 75 63 74 75 72 65 20 70 72 65 76 69 6f 75 73  ructure previous
4a20: 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ly allocated by 
4a30: 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e 0a  findLockInfo()..
4a40: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
4a50: 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 73  eleaseLockInfo(s
4a60: 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a  truct lockInfo *
4a70: 70 4c 6f 63 6b 29 7b 0a 20 20 69 66 20 28 70 4c  pLock){.  if (pL
4a80: 6f 63 6b 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20  ock == NULL).   
4a90: 20 72 65 74 75 72 6e 3b 0a 20 20 70 4c 6f 63 6b   return;.  pLock
4aa0: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
4ab0: 70 4c 6f 63 6b 2d 3e 6e 52 65 66 3d 3d 30 20 29  pLock->nRef==0 )
4ac0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73  {.    sqlite3Has
4ad0: 68 49 6e 73 65 72 74 28 26 6c 6f 63 6b 48 61 73  hInsert(&lockHas
4ae0: 68 2c 20 26 70 4c 6f 63 6b 2d 3e 6b 65 79 2c 20  h, &pLock->key, 
4af0: 73 69 7a 65 6f 66 28 70 4c 6f 63 6b 2d 3e 6b 65  sizeof(pLock->ke
4b00: 79 29 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  y), 0);.    sqli
4b10: 74 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b  te3_free(pLock);
4b20: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
4b30: 6c 65 61 73 65 20 61 20 6f 70 65 6e 43 6e 74 20  lease a openCnt 
4b40: 73 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f  structure previo
4b50: 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62  usly allocated b
4b60: 79 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29  y findLockInfo()
4b70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4b80: 20 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28   releaseOpenCnt(
4b90: 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a  struct openCnt *
4ba0: 70 4f 70 65 6e 29 7b 0a 20 20 69 66 20 28 70 4f  pOpen){.  if (pO
4bb0: 70 65 6e 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20  pen == NULL).   
4bc0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 65 6e   return;.  pOpen
4bd0: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
4be0: 70 4f 70 65 6e 2d 3e 6e 52 65 66 3d 3d 30 20 29  pOpen->nRef==0 )
4bf0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73  {.    sqlite3Has
4c00: 68 49 6e 73 65 72 74 28 26 6f 70 65 6e 48 61 73  hInsert(&openHas
4c10: 68 2c 20 26 70 4f 70 65 6e 2d 3e 6b 65 79 2c 20  h, &pOpen->key, 
4c20: 73 69 7a 65 6f 66 28 70 4f 70 65 6e 2d 3e 6b 65  sizeof(pOpen->ke
4c30: 79 29 2c 20 30 29 3b 0a 20 20 20 20 66 72 65 65  y), 0);.    free
4c40: 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67  (pOpen->aPending
4c50: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
4c60: 72 65 65 28 70 4f 70 65 6e 29 3b 0a 20 20 7d 0a  ree(pOpen);.  }.
4c70: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
4c80: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
4c90: 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 65 73 74  STYLE./*.** Test
4ca0: 73 20 61 20 62 79 74 65 2d 72 61 6e 67 65 20 6c  s a byte-range l
4cb0: 6f 63 6b 69 6e 67 20 71 75 65 72 79 20 74 6f 20  ocking query to 
4cc0: 73 65 65 20 69 66 20 62 79 74 65 20 72 61 6e 67  see if byte rang
4cd0: 65 20 6c 6f 63 6b 73 20 61 72 65 20 0a 2a 2a 20  e locks are .** 
4ce0: 73 75 70 70 6f 72 74 65 64 2c 20 69 66 20 6e 6f  supported, if no
4cf0: 74 20 77 65 20 66 61 6c 6c 20 62 61 63 6b 20 74  t we fall back t
4d00: 6f 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  o dotlockLocking
4d10: 53 74 79 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  Style..*/.static
4d20: 20 73 71 6c 69 74 65 33 4c 6f 63 6b 69 6e 67 53   sqlite3LockingS
4d30: 74 79 6c 65 20 73 71 6c 69 74 65 33 54 65 73 74  tyle sqlite3Test
4d40: 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 0a 20 20  LockingStyle(.  
4d50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
4d60: 50 61 74 68 2c 20 0a 20 20 69 6e 74 20 66 64 0a  Path, .  int fd.
4d70: 29 7b 0a 20 20 2f 2a 20 74 65 73 74 20 62 79 74  ){.  /* test byt
4d80: 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69  e-range lock usi
4d90: 6e 67 20 66 63 6e 74 6c 20 2a 2f 0a 20 20 73 74  ng fcntl */.  st
4da0: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49  ruct flock lockI
4db0: 6e 66 6f 3b 0a 20 20 0a 20 20 6c 6f 63 6b 49 6e  nfo;.  .  lockIn
4dc0: 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20  fo.l_len = 1;.  
4dd0: 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74  lockInfo.l_start
4de0: 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f   = 0;.  lockInfo
4df0: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
4e00: 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f  _SET;.  lockInfo
4e10: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
4e20: 4b 3b 0a 20 20 0a 20 20 69 66 28 20 66 63 6e 74  K;.  .  if( fcnt
4e30: 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  l(fd, F_GETLK, &
4e40: 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20  lockInfo)!=-1 ) 
4e50: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 6f 73  {.    return pos
4e60: 69 78 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a  ixLockingStyle;.
4e70: 20 20 7d 20 0a 20 20 0a 20 20 2f 2a 20 74 65 73    } .  .  /* tes
4e80: 74 69 6e 67 20 66 6f 72 20 66 6c 6f 63 6b 20 63  ting for flock c
4e90: 61 6e 20 67 69 76 65 20 66 61 6c 73 65 20 70 6f  an give false po
4ea0: 73 69 74 69 76 65 73 2e 20 20 53 6f 20 69 66 20  sitives.  So if 
4eb0: 69 66 20 74 68 65 20 61 62 6f 76 65 20 74 65 73  if the above tes
4ec0: 74 0a 20 20 2a 2a 20 66 61 69 6c 73 2c 20 74 68  t.  ** fails, th
4ed0: 65 6e 20 77 65 20 66 61 6c 6c 20 62 61 63 6b 20  en we fall back 
4ee0: 74 6f 20 75 73 69 6e 67 20 64 6f 74 2d 6c 6f 63  to using dot-loc
4ef0: 6b 20 73 74 79 6c 65 20 6c 6f 63 6b 69 6e 67 2e  k style locking.
4f00: 0a 20 20 2a 2f 20 20 0a 20 20 72 65 74 75 72 6e  .  */  .  return
4f10: 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53   dotlockLockingS
4f20: 74 79 6c 65 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  tyle;.}../* .** 
4f30: 45 78 61 6d 69 6e 65 73 20 74 68 65 20 66 5f 66  Examines the f_f
4f40: 73 74 79 70 65 6e 61 6d 65 20 65 6e 74 72 79 20  stypename entry 
4f50: 69 6e 20 74 68 65 20 73 74 61 74 66 73 20 73 74  in the statfs st
4f60: 72 75 63 74 75 72 65 20 61 73 20 72 65 74 75 72  ructure as retur
4f70: 6e 65 64 20 62 79 20 0a 2a 2a 20 73 74 61 74 28  ned by .** stat(
4f80: 29 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 73  ) for the file s
4f90: 79 73 74 65 6d 20 68 6f 73 74 69 6e 67 20 74 68  ystem hosting th
4fa0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
4fb0: 20 61 73 73 69 67 6e 73 20 74 68 65 20 0a 2a 2a   assigns the .**
4fc0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63   appropriate loc
4fd0: 6b 69 6e 67 20 73 74 79 6c 65 20 62 61 73 65 64  king style based
4fe0: 20 6f 6e 20 69 74 73 20 76 61 6c 75 65 2e 20 20   on its value.  
4ff0: 54 68 65 73 65 20 76 61 6c 75 65 73 20 61 6e 64  These values and
5000: 20 0a 2a 2a 20 61 73 73 69 67 6e 6d 65 6e 74 73   .** assignments
5010: 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20 44 61   are based on Da
5020: 72 77 69 6e 2f 4f 53 58 20 62 65 68 61 76 69 6f  rwin/OSX behavio
5030: 72 20 61 6e 64 20 68 61 76 65 20 6e 6f 74 20 62  r and have not b
5040: 65 65 6e 20 74 65 73 74 65 64 20 6f 6e 20 0a 2a  een tested on .*
5050: 2a 20 6f 74 68 65 72 20 73 79 73 74 65 6d 73 2e  * other systems.
5060: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
5070: 65 33 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 73  e3LockingStyle s
5080: 71 6c 69 74 65 33 44 65 74 65 63 74 4c 6f 63 6b  qlite3DetectLock
5090: 69 6e 67 53 74 79 6c 65 28 0a 20 20 63 6f 6e 73  ingStyle(.  cons
50a0: 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68  t char *filePath
50b0: 2c 20 0a 20 20 69 6e 74 20 66 64 0a 29 7b 0a 0a  , .  int fd.){..
50c0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 46 49  #ifdef SQLITE_FI
50d0: 58 45 44 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  XED_LOCKING_STYL
50e0: 45 0a 20 20 72 65 74 75 72 6e 20 28 73 71 6c 69  E.  return (sqli
50f0: 74 65 33 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 29  te3LockingStyle)
5100: 53 51 4c 49 54 45 5f 46 49 58 45 44 5f 4c 4f 43  SQLITE_FIXED_LOC
5110: 4b 49 4e 47 5f 53 54 59 4c 45 3b 0a 23 65 6c 73  KING_STYLE;.#els
5120: 65 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66  e.  struct statf
5130: 73 20 66 73 49 6e 66 6f 3b 0a 0a 20 20 69 66 28  s fsInfo;..  if(
5140: 20 73 74 61 74 66 73 28 66 69 6c 65 50 61 74 68   statfs(filePath
5150: 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31  , &fsInfo) == -1
5160: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
5170: 71 6c 69 74 65 33 54 65 73 74 4c 6f 63 6b 69 6e  qlite3TestLockin
5180: 67 53 74 79 6c 65 28 66 69 6c 65 50 61 74 68 2c  gStyle(filePath,
5190: 20 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20   fd);.  }.  if( 
51a0: 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26  fsInfo.f_flags &
51b0: 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20   MNT_RDONLY ){. 
51c0: 20 20 20 72 65 74 75 72 6e 20 6e 6f 4c 6f 63 6b     return noLock
51d0: 69 6e 67 53 74 79 6c 65 3b 0a 20 20 7d 0a 20 20  ingStyle;.  }.  
51e0: 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66  if( strcmp(fsInf
51f0: 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
5200: 22 68 66 73 22 29 3d 3d 30 20 7c 7c 0a 20 20 20  "hfs")==0 ||.   
5210: 20 20 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f     strcmp(fsInfo
5220: 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22  .f_fstypename, "
5230: 75 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ufs")==0 ){.    
5240: 72 65 74 75 72 6e 20 70 6f 73 69 78 4c 6f 63 6b  return posixLock
5250: 69 6e 67 53 74 79 6c 65 3b 0a 20 20 7d 0a 20 20  ingStyle;.  }.  
5260: 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66  if( strcmp(fsInf
5270: 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
5280: 22 61 66 70 66 73 22 29 3d 3d 30 20 29 7b 0a 20  "afpfs")==0 ){. 
5290: 20 20 20 72 65 74 75 72 6e 20 61 66 70 4c 6f 63     return afpLoc
52a0: 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 7d 0a 20  kingStyle;.  }. 
52b0: 20 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e   if( strcmp(fsIn
52c0: 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
52d0: 20 22 6e 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20   "nfs")==0 ){.  
52e0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
52f0: 54 65 73 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  TestLockingStyle
5300: 28 66 69 6c 65 50 61 74 68 2c 20 66 64 29 3b 0a  (filePath, fd);.
5310: 20 20 7d 0a 20 20 69 66 28 20 73 74 72 63 6d 70    }.  if( strcmp
5320: 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65  (fsInfo.f_fstype
5330: 6e 61 6d 65 2c 20 22 73 6d 62 66 73 22 29 3d 3d  name, "smbfs")==
5340: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
5350: 66 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79 6c  flockLockingStyl
5360: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 72  e;.  }.  if( str
5370: 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74  cmp(fsInfo.f_fst
5380: 79 70 65 6e 61 6d 65 2c 20 22 6d 73 64 6f 73 22  ypename, "msdos"
5390: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
53a0: 72 6e 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  rn dotlockLockin
53b0: 67 53 74 79 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  gStyle;.  }.  if
53c0: 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e  ( strcmp(fsInfo.
53d0: 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 77  f_fstypename, "w
53e0: 65 62 64 61 76 22 29 3d 3d 30 20 29 7b 0a 20 20  ebdav")==0 ){.  
53f0: 20 20 72 65 74 75 72 6e 20 75 6e 73 75 70 70 6f    return unsuppo
5400: 72 74 65 64 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  rtedLockingStyle
5410: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
5420: 71 6c 69 74 65 33 54 65 73 74 4c 6f 63 6b 69 6e  qlite3TestLockin
5430: 67 53 74 79 6c 65 28 66 69 6c 65 50 61 74 68 2c  gStyle(filePath,
5440: 20 66 64 29 3b 20 20 0a 23 65 6e 64 69 66 20 2f   fd);  .#endif /
5450: 2a 20 53 51 4c 49 54 45 5f 46 49 58 45 44 5f 4c  * SQLITE_FIXED_L
5460: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
5470: 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
5480: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
5490: 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a  NG_STYLE */../*.
54a0: 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65 20  ** Given a file 
54b0: 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61  descriptor, loca
54c0: 74 65 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e 64 20  te lockInfo and 
54d0: 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72  openCnt structur
54e0: 65 73 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72  es that.** descr
54f0: 69 62 65 73 20 74 68 61 74 20 66 69 6c 65 20 64  ibes that file d
5500: 65 73 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61  escriptor.  Crea
5510: 74 65 20 6e 65 77 20 6f 6e 65 73 20 69 66 20 6e  te new ones if n
5520: 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a  ecessary.  The.*
5530: 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20  * return values 
5540: 6d 69 67 68 74 20 62 65 20 75 6e 69 6e 69 74 69  might be uniniti
5550: 61 6c 69 7a 65 64 20 69 66 20 61 6e 20 65 72 72  alized if an err
5560: 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  or occurs..**.**
5570: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
5580: 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2f  er of errors..*/
5590: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64  .static int find
55a0: 4c 6f 63 6b 49 6e 66 6f 28 0a 20 20 69 6e 74 20  LockInfo(.  int 
55b0: 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fd,             
55c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
55d0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
55e0: 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79 20  used in the key 
55f0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b  */.  struct lock
5600: 49 6e 66 6f 20 2a 2a 70 70 4c 6f 63 6b 2c 20 20  Info **ppLock,  
5610: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
5620: 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75  lockInfo structu
5630: 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72  re here */.  str
5640: 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 2a 70 70  uct openCnt **pp
5650: 4f 70 65 6e 20 20 20 20 20 20 2f 2a 20 52 65 74  Open      /* Ret
5660: 75 72 6e 20 74 68 65 20 6f 70 65 6e 43 6e 74 20  urn the openCnt 
5670: 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
5680: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
5690: 20 73 74 72 75 63 74 20 6c 6f 63 6b 4b 65 79 20   struct lockKey 
56a0: 6b 65 79 31 3b 0a 20 20 73 74 72 75 63 74 20 6f  key1;.  struct o
56b0: 70 65 6e 4b 65 79 20 6b 65 79 32 3b 0a 20 20 73  penKey key2;.  s
56c0: 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74 62  truct stat statb
56d0: 75 66 3b 0a 20 20 73 74 72 75 63 74 20 6c 6f 63  uf;.  struct loc
56e0: 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 0a 20 20  kInfo *pLock;.  
56f0: 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a  struct openCnt *
5700: 70 4f 70 65 6e 3b 0a 20 20 72 63 20 3d 20 66 73  pOpen;.  rc = fs
5710: 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66  tat(fd, &statbuf
5720: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
5730: 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 6d 65   return 1;..  me
5740: 6d 73 65 74 28 26 6b 65 79 31 2c 20 30 2c 20 73  mset(&key1, 0, s
5750: 69 7a 65 6f 66 28 6b 65 79 31 29 29 3b 0a 20 20  izeof(key1));.  
5760: 6b 65 79 31 2e 64 65 76 20 3d 20 73 74 61 74 62  key1.dev = statb
5770: 75 66 2e 73 74 5f 64 65 76 3b 0a 20 20 6b 65 79  uf.st_dev;.  key
5780: 31 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e  1.ino = statbuf.
5790: 73 74 5f 69 6e 6f 3b 0a 23 69 66 20 53 51 4c 49  st_ino;.#if SQLI
57a0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20  TE_THREADSAFE.  
57b0: 69 66 28 20 74 68 72 65 61 64 73 4f 76 65 72 72  if( threadsOverr
57c0: 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63  ideEachOthersLoc
57d0: 6b 73 3c 30 20 29 7b 0a 20 20 20 20 74 65 73 74  ks<0 ){.    test
57e0: 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68  ThreadLockingBeh
57f0: 61 76 69 6f 72 28 66 64 29 3b 0a 20 20 7d 0a 20  avior(fd);.  }. 
5800: 20 6b 65 79 31 2e 74 69 64 20 3d 20 74 68 72 65   key1.tid = thre
5810: 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f  adsOverrideEachO
5820: 74 68 65 72 73 4c 6f 63 6b 73 20 3f 20 30 20 3a  thersLocks ? 0 :
5830: 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 3b   pthread_self();
5840: 0a 23 65 6e 64 69 66 0a 20 20 6d 65 6d 73 65 74  .#endif.  memset
5850: 28 26 6b 65 79 32 2c 20 30 2c 20 73 69 7a 65 6f  (&key2, 0, sizeo
5860: 66 28 6b 65 79 32 29 29 3b 0a 20 20 6b 65 79 32  f(key2));.  key2
5870: 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66 2e 73  .dev = statbuf.s
5880: 74 5f 64 65 76 3b 0a 20 20 6b 65 79 32 2e 69 6e  t_dev;.  key2.in
5890: 6f 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 69  o = statbuf.st_i
58a0: 6e 6f 3b 0a 20 20 70 4c 6f 63 6b 20 3d 20 28 73  no;.  pLock = (s
58b0: 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 2a 29  truct lockInfo*)
58c0: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
58d0: 26 6c 6f 63 6b 48 61 73 68 2c 20 26 6b 65 79 31  &lockHash, &key1
58e0: 2c 20 73 69 7a 65 6f 66 28 6b 65 79 31 29 29 3b  , sizeof(key1));
58f0: 0a 20 20 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20  .  if( pLock==0 
5900: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 6c 6f  ){.    struct lo
5910: 63 6b 49 6e 66 6f 20 2a 70 4f 6c 64 3b 0a 20 20  ckInfo *pOld;.  
5920: 20 20 70 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65    pLock = sqlite
5930: 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
5940: 28 2a 70 4c 6f 63 6b 29 20 29 3b 0a 20 20 20 20  (*pLock) );.    
5950: 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  if( pLock==0 ){.
5960: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
5970: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 66 69      goto exit_fi
5980: 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20 20  ndlockinfo;.    
5990: 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6b 65 79  }.    pLock->key
59a0: 20 3d 20 6b 65 79 31 3b 0a 20 20 20 20 70 4c 6f   = key1;.    pLo
59b0: 63 6b 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ck->nRef = 1;.  
59c0: 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 30    pLock->cnt = 0
59d0: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63  ;.    pLock->loc
59e0: 6b 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70  ktype = 0;.    p
59f0: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73  Old = sqlite3Has
5a00: 68 49 6e 73 65 72 74 28 26 6c 6f 63 6b 48 61 73  hInsert(&lockHas
5a10: 68 2c 20 26 70 4c 6f 63 6b 2d 3e 6b 65 79 2c 20  h, &pLock->key, 
5a20: 73 69 7a 65 6f 66 28 6b 65 79 31 29 2c 20 70 4c  sizeof(key1), pL
5a30: 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  ock);.    if( pO
5a40: 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ld!=0 ){.      a
5a50: 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 4c 6f  ssert( pOld==pLo
5a60: 63 6b 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ck );.      sqli
5a70: 74 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b  te3_free(pLock);
5a80: 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
5a90: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 66       goto exit_f
5aa0: 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20  indlockinfo;.   
5ab0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
5ac0: 70 4c 6f 63 6b 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  pLock->nRef++;. 
5ad0: 20 7d 0a 20 20 2a 70 70 4c 6f 63 6b 20 3d 20 70   }.  *ppLock = p
5ae0: 4c 6f 63 6b 3b 0a 20 20 69 66 28 20 70 70 4f 70  Lock;.  if( ppOp
5af0: 65 6e 21 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70  en!=0 ){.    pOp
5b00: 65 6e 20 3d 20 28 73 74 72 75 63 74 20 6f 70 65  en = (struct ope
5b10: 6e 43 6e 74 2a 29 73 71 6c 69 74 65 33 48 61 73  nCnt*)sqlite3Has
5b20: 68 46 69 6e 64 28 26 6f 70 65 6e 48 61 73 68 2c  hFind(&openHash,
5b30: 20 26 6b 65 79 32 2c 20 73 69 7a 65 6f 66 28 6b   &key2, sizeof(k
5b40: 65 79 32 29 29 3b 0a 20 20 20 20 69 66 28 20 70  ey2));.    if( p
5b50: 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Open==0 ){.     
5b60: 20 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20   struct openCnt 
5b70: 2a 70 4f 6c 64 3b 0a 20 20 20 20 20 20 70 4f 70  *pOld;.      pOp
5b80: 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  en = sqlite3_mal
5b90: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4f 70  loc( sizeof(*pOp
5ba0: 65 6e 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  en) );.      if(
5bb0: 20 70 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20   pOpen==0 ){.   
5bc0: 20 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b       releaseLock
5bd0: 49 6e 66 6f 28 70 4c 6f 63 6b 29 3b 0a 20 20 20  Info(pLock);.   
5be0: 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
5bf0: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 66       goto exit_f
5c00: 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20  indlockinfo;.   
5c10: 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 65 6e     }.      pOpen
5c20: 2d 3e 6b 65 79 20 3d 20 6b 65 79 32 3b 0a 20 20  ->key = key2;.  
5c30: 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 20      pOpen->nRef 
5c40: 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e  = 1;.      pOpen
5c50: 2d 3e 6e 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20  ->nLock = 0;.   
5c60: 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69     pOpen->nPendi
5c70: 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  ng = 0;.      pO
5c80: 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d 20  pen->aPending = 
5c90: 30 3b 0a 20 20 20 20 20 20 70 4f 6c 64 20 3d 20  0;.      pOld = 
5ca0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
5cb0: 74 28 26 6f 70 65 6e 48 61 73 68 2c 20 26 70 4f  t(&openHash, &pO
5cc0: 70 65 6e 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f 66  pen->key, sizeof
5cd0: 28 6b 65 79 32 29 2c 20 70 4f 70 65 6e 29 3b 0a  (key2), pOpen);.
5ce0: 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64 21 3d        if( pOld!=
5cf0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
5d00: 65 72 74 28 20 70 4f 6c 64 3d 3d 70 4f 70 65 6e  ert( pOld==pOpen
5d10: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
5d20: 74 65 33 5f 66 72 65 65 28 70 4f 70 65 6e 29 3b  te3_free(pOpen);
5d30: 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
5d40: 4c 6f 63 6b 49 6e 66 6f 28 70 4c 6f 63 6b 29 3b  LockInfo(pLock);
5d50: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
5d60: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
5d70: 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b  it_findlockinfo;
5d80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
5d90: 73 65 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d  se{.      pOpen-
5da0: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20  >nRef++;.    }. 
5db0: 20 20 20 2a 70 70 4f 70 65 6e 20 3d 20 70 4f 70     *ppOpen = pOp
5dc0: 65 6e 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 66 69  en;.  }..exit_fi
5dd0: 6e 64 6c 6f 63 6b 69 6e 66 6f 3a 0a 20 20 72 65  ndlockinfo:.  re
5de0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
5df0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
5e00: 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
5e10: 63 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69  ction for printi
5e20: 6e 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66  ng out trace inf
5e30: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65  ormation from de
5e40: 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72  bugging.** binar
5e50: 69 65 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e  ies. This return
5e60: 73 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70  s the string rep
5e70: 72 65 73 65 74 61 74 69 6f 6e 20 6f 66 20 74 68  resetation of th
5e80: 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e  e supplied.** in
5e90: 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e  teger lock-type.
5ea0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
5eb0: 20 63 68 61 72 20 2a 6c 6f 63 6b 74 79 70 65 4e   char *locktypeN
5ec0: 61 6d 65 28 69 6e 74 20 6c 6f 63 6b 74 79 70 65  ame(int locktype
5ed0: 29 7b 0a 20 20 73 77 69 74 63 68 28 20 6c 6f 63  ){.  switch( loc
5ee0: 6b 74 79 70 65 20 29 7b 0a 20 20 63 61 73 65 20  ktype ){.  case 
5ef0: 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  NO_LOCK: return 
5f00: 22 4e 4f 4e 45 22 3b 0a 20 20 63 61 73 65 20 53  "NONE";.  case S
5f10: 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75  HARED_LOCK: retu
5f20: 72 6e 20 22 53 48 41 52 45 44 22 3b 0a 20 20 63  rn "SHARED";.  c
5f30: 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  ase RESERVED_LOC
5f40: 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53 45 52  K: return "RESER
5f50: 56 45 44 22 3b 0a 20 20 63 61 73 65 20 50 45 4e  VED";.  case PEN
5f60: 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  DING_LOCK: retur
5f70: 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20 63  n "PENDING";.  c
5f80: 61 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ase EXCLUSIVE_LO
5f90: 43 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43 4c  CK: return "EXCL
5fa0: 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65  USIVE";.  }.  re
5fb0: 74 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a  turn "ERROR";.}.
5fc0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
5fd0: 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c   we are currentl
5fe0: 79 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74  y in a different
5ff0: 20 74 68 72 65 61 64 20 74 68 61 6e 20 74 68 65   thread than the
6000: 20 74 68 72 65 61 64 20 74 68 61 74 20 74 68 65   thread that the
6010: 0a 2a 2a 20 75 6e 69 78 46 69 6c 65 20 61 72 67  .** unixFile arg
6020: 75 6d 65 6e 74 20 62 65 6c 6f 6e 67 73 20 74 6f  ument belongs to
6030: 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
6040: 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65  ownership of the
6050: 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 6f 76 65   unixFile.** ove
6060: 72 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  r to the current
6070: 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41   thread..**.** A
6080: 20 75 6e 69 78 46 69 6c 65 20 69 73 20 6f 6e 6c   unixFile is onl
6090: 79 20 6f 77 6e 65 64 20 62 79 20 61 20 74 68 72  y owned by a thr
60a0: 65 61 64 20 6f 6e 20 73 79 73 74 65 6d 73 20 77  ead on systems w
60b0: 68 65 72 65 20 6f 6e 65 20 74 68 72 65 61 64 20  here one thread 
60c0: 69 73 0a 2a 2a 20 75 6e 61 62 6c 65 20 74 6f 20  is.** unable to 
60d0: 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20 63  override locks c
60e0: 72 65 61 74 65 64 20 62 79 20 61 20 64 69 66 66  reated by a diff
60f0: 65 72 65 6e 74 20 74 68 72 65 61 64 2e 20 20 52  erent thread.  R
6100: 65 64 48 61 74 39 20 69 73 0a 2a 2a 20 61 6e 20  edHat9 is.** an 
6110: 65 78 61 6d 70 6c 65 20 6f 66 20 73 75 63 68 20  example of such 
6120: 61 20 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  a system..**.** 
6130: 4f 77 6e 65 72 73 68 69 70 20 74 72 61 6e 73 66  Ownership transf
6140: 65 72 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77  er is only allow
6150: 65 64 20 69 66 20 74 68 65 20 75 6e 69 78 46 69  ed if the unixFi
6160: 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  le is currently 
6170: 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2a 20 49 66 20  unlocked..** If 
6180: 74 68 65 20 75 6e 69 78 46 69 6c 65 20 69 73 20  the unixFile is 
6190: 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 6f 77  locked and an ow
61a0: 6e 65 72 73 68 69 70 20 69 73 20 77 72 6f 6e 67  nership is wrong
61b0: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a 2a  , then return.**
61c0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e 20   SQLITE_MISUSE. 
61d0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
61e0: 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74  turned if everyt
61f0: 68 69 6e 67 20 77 6f 72 6b 73 2e 0a 2a 2f 0a 23  hing works..*/.#
6200: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
6210: 53 41 46 45 0a 73 74 61 74 69 63 20 69 6e 74 20  SAFE.static int 
6220: 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68 69  transferOwnershi
6230: 70 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  p(unixFile *pFil
6240: 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
6250: 70 74 68 72 65 61 64 5f 74 20 68 53 65 6c 66 3b  pthread_t hSelf;
6260: 0a 20 20 69 66 28 20 74 68 72 65 61 64 73 4f 76  .  if( threadsOv
6270: 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73  errideEachOthers
6280: 4c 6f 63 6b 73 20 29 7b 0a 20 20 20 20 2f 2a 20  Locks ){.    /* 
6290: 4f 77 6e 65 72 73 68 69 70 20 74 72 61 6e 73 66  Ownership transf
62a0: 65 72 73 20 6e 6f 74 20 6e 65 65 64 65 64 20 6f  ers not needed o
62b0: 6e 20 74 68 69 73 20 73 79 73 74 65 6d 20 2a 2f  n this system */
62c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
62d0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 68 53 65  TE_OK;.  }.  hSe
62e0: 6c 66 20 3d 20 70 74 68 72 65 61 64 5f 73 65 6c  lf = pthread_sel
62f0: 66 28 29 3b 0a 20 20 69 66 28 20 70 74 68 72 65  f();.  if( pthre
6300: 61 64 5f 65 71 75 61 6c 28 70 46 69 6c 65 2d 3e  ad_equal(pFile->
6310: 74 69 64 2c 20 68 53 65 6c 66 29 20 29 7b 0a 20  tid, hSelf) ){. 
6320: 20 20 20 2f 2a 20 57 65 20 61 72 65 20 73 74 69     /* We are sti
6330: 6c 6c 20 69 6e 20 74 68 65 20 73 61 6d 65 20 74  ll in the same t
6340: 68 72 65 61 64 20 2a 2f 0a 20 20 20 20 4f 53 54  hread */.    OST
6350: 52 41 43 45 31 28 22 4e 6f 2d 74 72 61 6e 73 66  RACE1("No-transf
6360: 65 72 2c 20 73 61 6d 65 20 74 68 72 65 61 64 5c  er, same thread\
6370: 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  n");.    return 
6380: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
6390: 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
63a0: 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b  type!=NO_LOCK ){
63b0: 0a 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 6e 6f  .    /* We canno
63c0: 74 20 63 68 61 6e 67 65 20 6f 77 6e 65 72 73 68  t change ownersh
63d0: 69 70 20 77 68 69 6c 65 20 77 65 20 61 72 65 20  ip while we are 
63e0: 68 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 21 20  holding a lock! 
63f0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
6400: 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d  LITE_MISUSE;.  }
6410: 0a 20 20 4f 53 54 52 41 43 45 34 28 22 54 72 61  .  OSTRACE4("Tra
6420: 6e 73 66 65 72 20 6f 77 6e 65 72 73 68 69 70 20  nsfer ownership 
6430: 6f 66 20 25 64 20 66 72 6f 6d 20 25 64 20 74 6f  of %d from %d to
6440: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %d\n",.        
6450: 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46      pFile->h, pF
6460: 69 6c 65 2d 3e 74 69 64 2c 20 68 53 65 6c 66 29  ile->tid, hSelf)
6470: 3b 0a 20 20 70 46 69 6c 65 2d 3e 74 69 64 20 3d  ;.  pFile->tid =
6480: 20 68 53 65 6c 66 3b 0a 20 20 69 66 20 28 70 46   hSelf;.  if (pF
6490: 69 6c 65 2d 3e 70 4c 6f 63 6b 20 21 3d 20 4e 55  ile->pLock != NU
64a0: 4c 4c 29 20 7b 0a 20 20 20 20 72 65 6c 65 61 73  LL) {.    releas
64b0: 65 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d  eLockInfo(pFile-
64c0: 3e 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20  >pLock);.    rc 
64d0: 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70  = findLockInfo(p
64e0: 46 69 6c 65 2d 3e 68 2c 20 26 70 46 69 6c 65 2d  File->h, &pFile-
64f0: 3e 70 4c 6f 63 6b 2c 20 30 29 3b 0a 20 20 20 20  >pLock, 0);.    
6500: 4f 53 54 52 41 43 45 35 28 22 4c 4f 43 4b 20 20  OSTRACE5("LOCK  
6510: 20 20 25 64 20 69 73 20 6e 6f 77 20 25 73 28 25    %d is now %s(%
6520: 73 2c 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  s,%d)\n", pFile-
6530: 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c  >h,.           l
6540: 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69 6c  ocktypeName(pFil
6550: 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 0a 20 20  e->locktype),.  
6560: 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70           locktyp
6570: 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 4c 6f  eName(pFile->pLo
6580: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 70  ck->locktype), p
6590: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74  File->pLock->cnt
65a0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
65b0: 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
65c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
65d0: 4b 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 20  K;.  }.}.#else. 
65e0: 20 2f 2a 20 4f 6e 20 73 69 6e 67 6c 65 2d 74 68   /* On single-th
65f0: 72 65 61 64 65 64 20 62 75 69 6c 64 73 2c 20 6f  readed builds, o
6600: 77 6e 65 72 73 68 69 70 20 74 72 61 6e 73 66 65  wnership transfe
6610: 72 20 69 73 20 61 20 6e 6f 2d 6f 70 20 2a 2f 0a  r is a no-op */.
6620: 23 20 64 65 66 69 6e 65 20 74 72 61 6e 73 66 65  # define transfe
6630: 72 4f 77 6e 65 72 73 68 69 70 28 58 29 20 53 51  rOwnership(X) SQ
6640: 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a  LITE_OK.#endif..
6650: 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68  /*.** Seek to th
6660: 65 20 6f 66 66 73 65 74 20 70 61 73 73 65 64 20  e offset passed 
6670: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
6680: 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65 61  gument, then rea
6690: 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20  d cnt .** bytes 
66a0: 69 6e 74 6f 20 70 42 75 66 2e 20 52 65 74 75 72  into pBuf. Retur
66b0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
66c0: 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72  bytes actually r
66d0: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20  ead..**.** NB:  
66e0: 49 66 20 79 6f 75 20 64 65 66 69 6e 65 20 55 53  If you define US
66f0: 45 5f 50 52 45 41 44 20 6f 72 20 55 53 45 5f 50  E_PREAD or USE_P
6700: 52 45 41 44 36 34 2c 20 74 68 65 6e 20 69 74 20  READ64, then it 
6710: 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65  might also.** be
6720: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 65   necessary to de
6730: 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52  fine _XOPEN_SOUR
6740: 43 45 20 74 6f 20 62 65 20 35 30 30 2e 20 20 54  CE to be 500.  T
6750: 68 69 73 20 76 61 72 69 65 73 20 66 72 6f 6d 0a  his varies from.
6760: 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f  ** one system to
6770: 20 61 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63 65   another.  Since
6780: 20 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74   SQLite does not
6790: 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41   define USE_PREA
67a0: 44 0a 2a 2a 20 61 6e 79 20 61 6e 79 20 66 6f 72  D.** any any for
67b0: 6d 20 62 79 20 64 65 66 61 75 6c 74 2c 20 77 65  m by default, we
67c0: 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70   will not attemp
67d0: 74 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50  t to define _XOP
67e0: 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65  EN_SOURCE..** Se
67f0: 65 20 74 69 63 6b 65 74 73 20 23 32 37 34 31 20  e tickets #2741 
6800: 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2f 0a 73 74  and #2681..*/.st
6810: 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64  atic int seekAnd
6820: 52 65 61 64 28 75 6e 69 78 46 69 6c 65 20 2a 69  Read(unixFile *i
6830: 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
6840: 20 6f 66 66 73 65 74 2c 20 76 6f 69 64 20 2a 70   offset, void *p
6850: 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20  Buf, int cnt){. 
6860: 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69 36 34 20   int got;.  i64 
6870: 6e 65 77 4f 66 66 73 65 74 3b 0a 20 20 54 49 4d  newOffset;.  TIM
6880: 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65  ER_START;.#if de
6890: 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
68a0: 0a 20 20 67 6f 74 20 3d 20 70 72 65 61 64 28 69  .  got = pread(i
68b0: 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
68c0: 20 6f 66 66 73 65 74 29 3b 0a 20 20 53 69 6d 75   offset);.  Simu
68d0: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74  lateIOError( got
68e0: 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69 66 20 64   = -1 );.#elif d
68f0: 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
6900: 36 34 29 0a 20 20 67 6f 74 20 3d 20 70 72 65 61  64).  got = prea
6910: 64 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  d64(id->h, pBuf,
6920: 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20   cnt, offset);. 
6930: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
6940: 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65  ( got = -1 );.#e
6950: 6c 73 65 0a 20 20 6e 65 77 4f 66 66 73 65 74 20  lse.  newOffset 
6960: 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f  = lseek(id->h, o
6970: 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29  ffset, SEEK_SET)
6980: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
6990: 72 6f 72 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d  ror( newOffset--
69a0: 20 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f 66 66   );.  if( newOff
69b0: 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20  set!=offset ){. 
69c0: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
69d0: 7d 0a 20 20 67 6f 74 20 3d 20 72 65 61 64 28 69  }.  got = read(i
69e0: 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29  d->h, pBuf, cnt)
69f0: 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52  ;.#endif.  TIMER
6a00: 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 35  _END;.  OSTRACE5
6a10: 28 22 52 45 41 44 20 20 20 20 25 2d 33 64 20 25  ("READ    %-3d %
6a20: 35 64 20 25 37 6c 6c 64 20 25 64 5c 6e 22 2c 20  5d %7lld %d\n", 
6a30: 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73  id->h, got, offs
6a40: 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45  et, TIMER_ELAPSE
6a50: 44 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74  D);.  return got
6a60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
6a70: 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65  data from a file
6a80: 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20   into a buffer. 
6a90: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
6aa0: 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65  K if all.** byte
6ab0: 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63  s were read succ
6ac0: 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c  essfully and SQL
6ad0: 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79  ITE_IOERR if any
6ae0: 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
6af0: 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
6b00: 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20 73  nt unixRead(.  s
6b10: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
6b20: 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20   .  void *pBuf, 
6b30: 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71  .  int amt,.  sq
6b40: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
6b50: 65 74 0a 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b  et.){.  int got;
6b60: 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b  .  assert( id );
6b70: 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64  .  got = seekAnd
6b80: 52 65 61 64 28 28 75 6e 69 78 46 69 6c 65 2a 29  Read((unixFile*)
6b90: 69 64 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66  id, offset, pBuf
6ba0: 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f  , amt);.  if( go
6bb0: 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72 65  t==amt ){.    re
6bc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6bd0: 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3c    }else if( got<
6be0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
6bf0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
6c00: 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
6c10: 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29  memset(&((char*)
6c20: 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61  pBuf)[got], 0, a
6c30: 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74  mt-got);.    ret
6c40: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
6c50: 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d  _SHORT_READ;.  }
6c60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74  .}../*.** Seek t
6c70: 6f 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 20  o the offset in 
6c80: 69 64 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e 20  id->offset then 
6c90: 72 65 61 64 20 63 6e 74 20 62 79 74 65 73 20 69  read cnt bytes i
6ca0: 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74  nto pBuf..** Ret
6cb0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
6cc0: 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79  f bytes actually
6cd0: 20 72 65 61 64 2e 20 20 55 70 64 61 74 65 20 74   read.  Update t
6ce0: 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2f 0a 73 74  he offset..*/.st
6cf0: 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64  atic int seekAnd
6d00: 57 72 69 74 65 28 75 6e 69 78 46 69 6c 65 20 2a  Write(unixFile *
6d10: 69 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20  id, i64 offset, 
6d20: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66  const void *pBuf
6d30: 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e  , int cnt){.  in
6d40: 74 20 67 6f 74 3b 0a 20 20 69 36 34 20 6e 65 77  t got;.  i64 new
6d50: 4f 66 66 73 65 74 3b 0a 20 20 54 49 4d 45 52 5f  Offset;.  TIMER_
6d60: 53 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e  START;.#if defin
6d70: 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20  ed(USE_PREAD).  
6d80: 67 6f 74 20 3d 20 70 77 72 69 74 65 28 69 64 2d  got = pwrite(id-
6d90: 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f  >h, pBuf, cnt, o
6da0: 66 66 73 65 74 29 3b 0a 23 65 6c 69 66 20 64 65  ffset);.#elif de
6db0: 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36  fined(USE_PREAD6
6dc0: 34 29 0a 20 20 67 6f 74 20 3d 20 70 77 72 69 74  4).  got = pwrit
6dd0: 65 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  e64(id->h, pBuf,
6de0: 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 23   cnt, offset);.#
6df0: 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66 73 65 74  else.  newOffset
6e00: 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20   = lseek(id->h, 
6e10: 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54  offset, SEEK_SET
6e20: 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f 66 66 73  );.  if( newOffs
6e30: 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20  et!=offset ){.  
6e40: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d    return -1;.  }
6e50: 0a 20 20 67 6f 74 20 3d 20 77 72 69 74 65 28 69  .  got = write(i
6e60: 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29  d->h, pBuf, cnt)
6e70: 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52  ;.#endif.  TIMER
6e80: 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 35  _END;.  OSTRACE5
6e90: 28 22 57 52 49 54 45 20 20 20 25 2d 33 64 20 25  ("WRITE   %-3d %
6ea0: 35 64 20 25 37 6c 6c 64 20 25 64 5c 6e 22 2c 20  5d %7lld %d\n", 
6eb0: 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73  id->h, got, offs
6ec0: 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45  et, TIMER_ELAPSE
6ed0: 44 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74  D);.  return got
6ee0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
6ef0: 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  e data from a bu
6f00: 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65  ffer into a file
6f10: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
6f20: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a  _OK on success.*
6f30: 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
6f40: 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61  error code on fa
6f50: 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
6f60: 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28 0a   int unixWrite(.
6f70: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
6f80: 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69  id, .  const voi
6f90: 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20  d *pBuf, .  int 
6fa0: 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69  amt,.  sqlite3_i
6fb0: 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b 0a  nt64 offset .){.
6fc0: 20 20 69 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b    int wrote = 0;
6fd0: 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b  .  assert( id );
6fe0: 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30  .  assert( amt>0
6ff0: 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 61 6d 74   );.  while( amt
7000: 3e 30 20 26 26 20 28 77 72 6f 74 65 20 3d 20 73  >0 && (wrote = s
7010: 65 65 6b 41 6e 64 57 72 69 74 65 28 28 75 6e 69  eekAndWrite((uni
7020: 78 46 69 6c 65 2a 29 69 64 2c 20 6f 66 66 73 65  xFile*)id, offse
7030: 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 29 3e 30  t, pBuf, amt))>0
7040: 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77   ){.    amt -= w
7050: 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66 73 65 74  rote;.    offset
7060: 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70   += wrote;.    p
7070: 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70  Buf = &((char*)p
7080: 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d  Buf)[wrote];.  }
7090: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
70a0: 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c  or(( wrote=(-1),
70b0: 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d   amt=1 ));.  Sim
70c0: 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
70d0: 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d  or(( wrote=0, am
70e0: 74 3d 31 20 29 29 3b 0a 20 20 69 66 28 20 61 6d  t=1 ));.  if( am
70f0: 74 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77  t>0 ){.    if( w
7100: 72 6f 74 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  rote<0 ){.      
7110: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
7120: 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d  ERR_WRITE;.    }
7130: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
7140: 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
7150: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
7160: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
7170: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
7180: 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20  EST./*.** Count 
7190: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75  the number of fu
71a0: 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d  llsyncs and norm
71b0: 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20  al syncs.  This 
71c0: 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a  is used to test.
71d0: 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e  ** that syncs an
71e0: 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20  d fullsyncs are 
71f0: 6f 63 63 75 72 69 6e 67 20 61 74 20 74 68 65 20  occuring at the 
7200: 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a  right times..*/.
7210: 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  int sqlite3_sync
7220: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20  _count = 0;.int 
7230: 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
7240: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
7250: 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 65 20 74 68  if../*.** Use th
7260: 65 20 66 64 61 74 61 73 79 6e 63 28 29 20 41 50  e fdatasync() AP
7270: 49 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 48 41  I only if the HA
7280: 56 45 5f 46 44 41 54 41 53 59 4e 43 20 6d 61 63  VE_FDATASYNC mac
7290: 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a  ro is defined..*
72a0: 2a 20 4f 74 68 65 72 77 69 73 65 20 75 73 65 20  * Otherwise use 
72b0: 66 73 79 6e 63 28 29 20 69 6e 20 69 74 73 20 70  fsync() in its p
72c0: 6c 61 63 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  lace..*/.#ifndef
72d0: 20 48 41 56 45 5f 46 44 41 54 41 53 59 4e 43 0a   HAVE_FDATASYNC.
72e0: 23 20 64 65 66 69 6e 65 20 66 64 61 74 61 73 79  # define fdatasy
72f0: 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a  nc fsync.#endif.
7300: 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41  ./*.** Define HA
7310: 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20  VE_FULLFSYNC to 
7320: 30 20 6f 72 20 31 20 64 65 70 65 6e 64 69 6e 67  0 or 1 depending
7330: 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
7340: 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c  ot.** the F_FULL
7350: 46 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64  FSYNC macro is d
7360: 65 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46  efined.  F_FULLF
7370: 53 59 4e 43 20 69 73 20 63 75 72 72 65 6e 74 6c  SYNC is currentl
7380: 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61  y.** only availa
7390: 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e  ble on Mac OS X.
73a0: 20 20 42 75 74 20 74 68 61 74 20 63 6f 75 6c 64    But that could
73b0: 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64   change..*/.#ifd
73c0: 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23  ef F_FULLFSYNC.#
73d0: 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   define HAVE_FUL
73e0: 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23  LFSYNC 1.#else.#
73f0: 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   define HAVE_FUL
7400: 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a  LFSYNC 0.#endif.
7410: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e  ../*.** The fsyn
7420: 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  c() system call 
7430: 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73  does not work as
7440: 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e 20 6d   advertised on m
7450: 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74  any.** unix syst
7460: 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ems.  The follow
7470: 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69 73  ing procedure is
7480: 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d   an attempt to m
7490: 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62  ake.** it work b
74a0: 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  etter..**.** The
74b0: 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
74c0: 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73 20 61  macro disables a
74d0: 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20 54 68  ll fsync()s.  Th
74e0: 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20  is is useful.** 
74f0: 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68 65 6e  for testing when
7500: 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75 6e 20   we want to run 
7510: 74 68 72 6f 75 67 68 20 74 68 65 20 74 65 73 74  through the test
7520: 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a   suite quickly..
7530: 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72 6f 6e  ** You are stron
7540: 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e 6f 74  gly advised *not
7550: 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74 68  * to deploy with
7560: 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
7570: 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65  ** enabled, howe
7580: 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68 20  ver, since with 
7590: 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65  SQLITE_NO_SYNC e
75a0: 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72  nabled, an OS cr
75b0: 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20  ash.** or power 
75c0: 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b  failure will lik
75d0: 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20  ely corrupt the 
75e0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
75f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 75 6c  /.static int ful
7600: 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66 64 2c 20  l_fsync(int fd, 
7610: 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e  int fullSync, in
7620: 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69  t dataOnly){.  i
7630: 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 52 65 63  nt rc;..  /* Rec
7640: 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ord the number o
7650: 66 20 74 69 6d 65 73 20 74 68 61 74 20 77 65 20  f times that we 
7660: 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e  do a normal fsyn
7670: 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55  c() and .  ** FU
7680: 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73 20 69 73  LLSYNC.  This is
7690: 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 65 73   used during tes
76a0: 74 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20 74  ting to verify t
76b0: 68 61 74 20 74 68 69 73 20 70 72 6f 63 65 64 75  hat this procedu
76c0: 72 65 0a 20 20 2a 2a 20 67 65 74 73 20 63 61 6c  re.  ** gets cal
76d0: 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 6f 72  led with the cor
76e0: 72 65 63 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a  rect arguments..
76f0: 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
7700: 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 66 75  TE_TEST.  if( fu
7710: 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69 74 65 33  llSync ) sqlite3
7720: 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b  _fullsync_count+
7730: 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e  +;.  sqlite3_syn
7740: 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69  c_count++;.#endi
7750: 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f  f..  /* If we co
7760: 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 20  mpiled with the 
7770: 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66  SQLITE_NO_SYNC f
7780: 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e  lag, then syncin
7790: 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f  g is a.  ** no-o
77a0: 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  p.  */.#ifdef SQ
77b0: 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72  LITE_NO_SYNC.  r
77c0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  c = SQLITE_OK;.#
77d0: 65 6c 73 65 0a 0a 23 69 66 20 48 41 56 45 5f 46  else..#if HAVE_F
77e0: 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28 20 66  ULLFSYNC.  if( f
77f0: 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  ullSync ){.    r
7800: 63 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f  c = fcntl(fd, F_
7810: 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 20  FULLFSYNC, 0);. 
7820: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
7830: 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20   1;.  }.  /* If 
7840: 74 68 65 20 46 55 4c 4c 46 53 59 4e 43 20 66 61  the FULLFSYNC fa
7850: 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61 63 6b 20  iled, fall back 
7860: 74 6f 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  to attempting an
7870: 20 66 73 79 6e 63 28 29 2e 0a 20 20 20 2a 20 49   fsync()..   * I
7880: 74 20 73 68 6f 75 6c 64 6e 27 74 20 62 65 20 70  t shouldn't be p
7890: 6f 73 73 69 62 6c 65 20 66 6f 72 20 66 75 6c 6c  ossible for full
78a0: 66 73 79 6e 63 20 74 6f 20 66 61 69 6c 20 6f 6e  fsync to fail on
78b0: 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20 20 2a   the local .   *
78c0: 20 66 69 6c 65 20 73 79 73 74 65 6d 20 28 6f 6e   file system (on
78d0: 20 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c 75 72   OSX), so failur
78e0: 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  e indicates that
78f0: 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20 20 2a 20   FULLFSYNC.   * 
7900: 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20  isn't supported 
7910: 66 6f 72 20 74 68 69 73 20 66 69 6c 65 20 73 79  for this file sy
7920: 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65 6d 70  stem. So, attemp
7930: 74 20 61 6e 20 66 73 79 6e 63 20 0a 20 20 20 2a  t an fsync .   *
7940: 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29 20 69   and (for now) i
7950: 67 6e 6f 72 65 20 74 68 65 20 6f 76 65 72 68 65  gnore the overhe
7960: 61 64 20 6f 66 20 61 20 73 75 70 65 72 66 6c 75  ad of a superflu
7970: 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c 2e 20  ous fcntl call. 
7980: 20 0a 20 20 20 2a 20 49 74 27 64 20 62 65 20 62   .   * It'd be b
7990: 65 74 74 65 72 20 74 6f 20 64 65 74 65 63 74 20  etter to detect 
79a0: 66 75 6c 6c 66 73 79 6e 63 20 73 75 70 70 6f 72  fullfsync suppor
79b0: 74 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f 69 64  t once and avoid
79c0: 20 0a 20 20 20 2a 20 74 68 65 20 66 63 6e 74 6c   .   * the fcntl
79d0: 20 63 61 6c 6c 20 65 76 65 72 79 20 74 69 6d 65   call every time
79e0: 20 73 79 6e 63 20 69 73 20 63 61 6c 6c 65 64 2e   sync is called.
79f0: 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 20  .   */.  if( rc 
7a00: 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29  ) rc = fsync(fd)
7a10: 3b 0a 0a 23 65 6c 73 65 20 0a 20 20 69 66 28 20  ;..#else .  if( 
7a20: 64 61 74 61 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  dataOnly ){.    
7a30: 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66  rc = fdatasync(f
7a40: 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
7a50: 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b   rc = fsync(fd);
7a60: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 48  .  }.#endif /* H
7a70: 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f  AVE_FULLFSYNC */
7a80: 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
7a90: 65 64 28 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ed(SQLITE_NO_SYN
7aa0: 43 29 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20  C) */..  return 
7ab0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  rc;.}../*.** Mak
7ac0: 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65  e sure all write
7ad0: 73 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61  s to a particula
7ae0: 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69  r file are commi
7af0: 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  tted to disk..**
7b00: 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e 6c 79 3d  .** If dataOnly=
7b10: 3d 30 20 74 68 65 6e 20 62 6f 74 68 20 74 68 65  =0 then both the
7b20: 20 66 69 6c 65 20 69 74 73 65 6c 66 20 61 6e 64   file itself and
7b30: 20 69 74 73 20 6d 65 74 61 64 61 74 61 20 28 66   its metadata (f
7b40: 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20 61 63 63  ile.** size, acc
7b50: 65 73 73 20 74 69 6d 65 2c 20 65 74 63 29 20 61  ess time, etc) a
7b60: 72 65 20 73 79 6e 63 65 64 2e 20 20 49 66 20 64  re synced.  If d
7b70: 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68 65 6e 20  ataOnly!=0 then 
7b80: 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 69 6c 65  only the.** file
7b90: 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 2e   data is synced.
7ba0: 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e 69  .**.** Under Uni
7bb0: 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75 72  x, also make sur
7bc0: 65 20 74 68 61 74 20 74 68 65 20 64 69 72 65 63  e that the direc
7bd0: 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74  tory entry for t
7be0: 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62  he file.** has b
7bf0: 65 65 6e 20 63 72 65 61 74 65 64 20 62 79 20 66  een created by f
7c00: 73 79 6e 63 2d 69 6e 67 20 74 68 65 20 64 69 72  sync-ing the dir
7c10: 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74  ectory that cont
7c20: 61 69 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a  ains the file..*
7c30: 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 64  * If we do not d
7c40: 6f 20 74 68 69 73 20 61 6e 64 20 77 65 20 65 6e  o this and we en
7c50: 63 6f 75 6e 74 65 72 20 61 20 70 6f 77 65 72 20  counter a power 
7c60: 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64 69 72  failure, the dir
7c70: 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79 20  ectory.** entry 
7c80: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
7c90: 6d 69 67 68 74 20 6e 6f 74 20 65 78 69 73 74 20  might not exist 
7ca0: 61 66 74 65 72 20 77 65 20 72 65 62 6f 6f 74 2e  after we reboot.
7cb0: 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53 51    The next.** SQ
7cc0: 4c 69 74 65 20 74 6f 20 61 63 63 65 73 73 20 74  Lite to access t
7cd0: 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f 74  he file will not
7ce0: 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6a   know that the j
7cf0: 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 28 62  ournal exists (b
7d00: 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 64 69  ecause.** the di
7d10: 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f  rectory entry fo
7d20: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  r the journal wa
7d30: 73 20 6e 65 76 65 72 20 63 72 65 61 74 65 64 29  s never created)
7d40: 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63   and the transac
7d50: 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  tion.** will not
7d60: 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f 73   roll back - pos
7d70: 73 69 62 6c 79 20 6c 65 61 64 69 6e 67 20 74 6f  sibly leading to
7d80: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
7d90: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
7da0: 69 6e 74 20 75 6e 69 78 53 79 6e 63 28 73 71 6c  int unixSync(sql
7db0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
7dc0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74  nt flags){.  int
7dd0: 20 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20   rc;.  unixFile 
7de0: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
7df0: 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e 74 20 69  le*)id;..  int i
7e00: 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28 66 6c 61  sDataOnly = (fla
7e10: 67 73 26 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44  gs&SQLITE_SYNC_D
7e20: 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20  ATAONLY);.  int 
7e30: 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20 28 66 6c  isFullsync = (fl
7e40: 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
7e50: 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20  E_SYNC_FULL;..  
7e60: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e  /* Check that on
7e70: 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43  e of SQLITE_SYNC
7e80: 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20  _NORMAL or FULL 
7e90: 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20  was passed */.  
7ea0: 61 73 73 65 72 74 28 28 66 6c 61 67 73 26 30 78  assert((flags&0x
7eb0: 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
7ec0: 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c  _NORMAL.      ||
7ed0: 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53   (flags&0x0F)==S
7ee0: 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a  QLITE_SYNC_FULL.
7ef0: 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20    );..  assert( 
7f00: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
7f10: 43 45 32 28 22 53 59 4e 43 20 20 20 20 25 2d 33  CE2("SYNC    %-3
7f20: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b  d\n", pFile->h);
7f30: 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f 66 73 79  .  rc = full_fsy
7f40: 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20 69 73 46  nc(pFile->h, isF
7f50: 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61 74 61 4f  ullsync, isDataO
7f60: 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  nly);.  Simulate
7f70: 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b  IOError( rc=1 );
7f80: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
7f90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
7fa0: 4f 45 52 52 5f 46 53 59 4e 43 3b 0a 20 20 7d 0a  OERR_FSYNC;.  }.
7fb0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72    if( pFile->dir
7fc0: 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54  fd>=0 ){.    OST
7fd0: 52 41 43 45 34 28 22 44 49 52 53 59 4e 43 20 25  RACE4("DIRSYNC %
7fe0: 2d 33 64 20 28 68 61 76 65 5f 66 75 6c 6c 66 73  -3d (have_fullfs
7ff0: 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d  ync=%d fullsync=
8000: 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 64  %d)\n", pFile->d
8010: 69 72 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20  irfd,.          
8020: 20 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43    HAVE_FULLFSYNC
8030: 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29 3b 0a 23  , isFullsync);.#
8040: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49  ifndef SQLITE_DI
8050: 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20  SABLE_DIRSYNC.  
8060: 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74 6f    /* The directo
8070: 72 79 20 73 79 6e 63 20 69 73 20 6f 6e 6c 79 20  ry sync is only 
8080: 61 74 74 65 6d 70 74 65 64 20 69 66 20 66 75 6c  attempted if ful
8090: 6c 5f 66 73 79 6e 63 20 69 73 0a 20 20 20 20 2a  l_fsync is.    *
80a0: 2a 20 74 75 72 6e 65 64 20 6f 66 66 20 6f 72 20  * turned off or 
80b0: 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66  unavailable.  If
80c0: 20 61 20 66 75 6c 6c 5f 66 73 79 6e 63 20 6f 63   a full_fsync oc
80d0: 63 75 72 72 65 64 20 61 62 6f 76 65 2c 0a 20 20  curred above,.  
80e0: 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 64 69    ** then the di
80f0: 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20  rectory sync is 
8100: 73 75 70 65 72 66 6c 75 6f 75 73 2e 0a 20 20 20  superfluous..   
8110: 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 48 41   */.    if( (!HA
8120: 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 7c 20  VE_FULLFSYNC || 
8130: 21 69 73 46 75 6c 6c 73 79 6e 63 29 20 26 26 20  !isFullsync) && 
8140: 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65  full_fsync(pFile
8150: 2d 3e 64 69 72 66 64 2c 30 2c 30 29 20 29 7b 0a  ->dirfd,0,0) ){.
8160: 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20         /*.      
8170: 20 2a 2a 20 57 65 20 68 61 76 65 20 72 65 63 65   ** We have rece
8180: 69 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 72 65  ived multiple re
8190: 70 6f 72 74 73 20 6f 66 20 66 73 79 6e 63 28 29  ports of fsync()
81a0: 20 72 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20   returning.     
81b0: 20 20 2a 2a 20 65 72 72 6f 72 73 20 77 68 65 6e    ** errors when
81c0: 20 61 70 70 6c 69 65 64 20 74 6f 20 64 69 72 65   applied to dire
81d0: 63 74 6f 72 69 65 73 20 6f 6e 20 63 65 72 74 61  ctories on certa
81e0: 69 6e 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e  in file systems.
81f0: 0a 20 20 20 20 20 20 20 2a 2a 20 41 20 66 61 69  .       ** A fai
8200: 6c 65 64 20 64 69 72 65 63 74 6f 72 79 20 73 79  led directory sy
8210: 6e 63 20 69 73 20 6e 6f 74 20 61 20 62 69 67 20  nc is not a big 
8220: 64 65 61 6c 2e 20 20 53 6f 20 69 74 20 73 65 65  deal.  So it see
8230: 6d 73 0a 20 20 20 20 20 20 20 2a 2a 20 62 65 74  ms.       ** bet
8240: 74 65 72 20 74 6f 20 69 67 6e 6f 72 65 20 74 68  ter to ignore th
8250: 65 20 65 72 72 6f 72 2e 20 20 54 69 63 6b 65 74  e error.  Ticket
8260: 20 23 31 36 35 37 0a 20 20 20 20 20 20 20 2a 2f   #1657.       */
8270: 0a 20 20 20 20 20 20 20 2f 2a 20 72 65 74 75 72  .       /* retur
8280: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 20  n SQLITE_IOERR; 
8290: 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  */.    }.#endif.
82a0: 20 20 20 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d      close(pFile-
82b0: 3e 64 69 72 66 64 29 3b 20 20 2f 2a 20 4f 6e 6c  >dirfd);  /* Onl
82c0: 79 20 6e 65 65 64 20 74 6f 20 73 79 6e 63 20 6f  y need to sync o
82d0: 6e 63 65 2c 20 73 6f 20 63 6c 6f 73 65 20 74 68  nce, so close th
82e0: 65 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20  e directory */. 
82f0: 20 20 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 20     pFile->dirfd 
8300: 3d 20 2d 31 3b 20 20 20 20 2f 2a 20 77 68 65 6e  = -1;    /* when
8310: 20 77 65 20 61 72 65 20 64 6f 6e 65 2e 20 2a 2f   we are done. */
8320: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
8330: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
8340: 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70  * Truncate an op
8350: 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65  en file to a spe
8360: 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73  cified size.*/.s
8370: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72  tatic int unixTr
8380: 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66  uncate(sqlite3_f
8390: 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79  ile *id, i64 nBy
83a0: 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  te){.  int rc;. 
83b0: 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20   assert( id );. 
83c0: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
83d0: 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
83e0: 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 20 29  IOERR_TRUNCATE )
83f0: 3b 0a 20 20 72 63 20 3d 20 66 74 72 75 6e 63 61  ;.  rc = ftrunca
8400: 74 65 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  te(((unixFile*)i
8410: 64 29 2d 3e 68 2c 20 28 6f 66 66 5f 74 29 6e 42  d)->h, (off_t)nB
8420: 79 74 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  yte);.  if( rc )
8430: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
8440: 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
8450: 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  TE;.  }else{.   
8460: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8470: 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
8480: 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75  Determine the cu
8490: 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20  rrent size of a 
84a0: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f  file in bytes.*/
84b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
84c0: 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33  FileSize(sqlite3
84d0: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a  _file *id, i64 *
84e0: 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63  pSize){.  int rc
84f0: 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  ;.  struct stat 
8500: 62 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20 69  buf;.  assert( i
8510: 64 20 29 3b 0a 20 20 72 63 20 3d 20 66 73 74 61  d );.  rc = fsta
8520: 74 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  t(((unixFile*)id
8530: 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 53  )->h, &buf);.  S
8540: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
8550: 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63  rc=1 );.  if( rc
8560: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
8570: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  n SQLITE_IOERR_F
8580: 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69  STAT;.  }.  *pSi
8590: 7a 65 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65  ze = buf.st_size
85a0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
85b0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
85c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
85d0: 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
85e0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
85f0: 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
8600: 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
8610: 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
8620: 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
8630: 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
8640: 64 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e  d, return.** non
8650: 2d 7a 65 72 6f 2e 20 20 49 66 20 74 68 65 20 66  -zero.  If the f
8660: 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20  ile is unlocked 
8670: 6f 72 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 53 48  or holds only SH
8680: 41 52 45 44 20 6c 6f 63 6b 73 2c 20 74 68 65 6e  ARED locks, then
8690: 0a 2a 2a 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e  .** return zero.
86a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
86b0: 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
86c0: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
86d0: 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 20  e *id){.  int r 
86e0: 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
86f0: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
8700: 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72  le*)id;..  asser
8710: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 65 6e  t( pFile );.  en
8720: 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42  terMutex(); /* B
8730: 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 4c  ecause pFile->pL
8740: 6f 63 6b 20 69 73 20 73 68 61 72 65 64 20 61 63  ock is shared ac
8750: 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a  ross threads */.
8760: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
8770: 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
8780: 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
8790: 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
87a0: 66 28 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d  f( pFile->pLock-
87b0: 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44  >locktype>SHARED
87c0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 20 3d  _LOCK ){.    r =
87d0: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74   1;.  }..  /* Ot
87e0: 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
87f0: 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
8800: 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f  s holds it..  */
8810: 0a 20 20 69 66 28 20 21 72 20 29 7b 0a 20 20 20  .  if( !r ){.   
8820: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
8830: 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  ck;.    lock.l_w
8840: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
8850: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
8860: 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59  rt = RESERVED_BY
8870: 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  TE;.    lock.l_l
8880: 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b  en = 1;.    lock
8890: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43  .l_type = F_WRLC
88a0: 4b 3b 0a 20 20 20 20 66 63 6e 74 6c 28 70 46 69  K;.    fcntl(pFi
88b0: 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  le->h, F_GETLK, 
88c0: 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20  &lock);.    if( 
88d0: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55  lock.l_type!=F_U
88e0: 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 20  NLCK ){.      r 
88f0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
8900: 20 0a 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29   .  leaveMutex()
8910: 3b 0a 20 20 4f 53 54 52 41 43 45 33 28 22 54 45  ;.  OSTRACE3("TE
8920: 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
8930: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
8940: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a  );..  return r;.
8950: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
8960: 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
8970: 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
8980: 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b  y parameter lock
8990: 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  type - one.** of
89a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
89b0: 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
89c0: 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
89d0: 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
89e0: 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
89f0: 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
8a00: 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
8a10: 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
8a20: 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
8a30: 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
8a40: 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
8a50: 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
8a60: 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
8a70: 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
8a80: 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
8a90: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
8aa0: 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
8ab0: 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
8ac0: 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
8ad0: 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
8ae0: 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
8af0: 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
8b00: 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
8b10: 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
8b20: 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
8b30: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
8b40: 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
8b50: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
8b60: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
8b70: 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
8b80: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
8b90: 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
8ba0: 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
8bb0: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
8bc0: 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
8bd0: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
8be0: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
8bf0: 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
8c00: 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
8c10: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
8c20: 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
8c30: 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
8c40: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
8c50: 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
8c60: 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
8c70: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
8c80: 20 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65   unixLock(sqlite
8c90: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
8ca0: 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 2f 2a 20  locktype){.  /* 
8cb0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65  The following de
8cc0: 73 63 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c  scribes the impl
8cd0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
8ce0: 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20  e various locks 
8cf0: 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72  and.  ** lock tr
8d00: 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72  ansitions in ter
8d10: 6d 73 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20  ms of the POSIX 
8d20: 61 64 76 69 73 6f 72 79 20 73 68 61 72 65 64 20  advisory shared 
8d30: 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20  and exclusive.  
8d40: 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76  ** lock primitiv
8d50: 65 73 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d  es (called read-
8d60: 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d  locks and write-
8d70: 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20  locks below, to 
8d80: 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75  avoid.  ** confu
8d90: 73 69 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65  sion with SQLite
8da0: 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68   lock names). Th
8db0: 65 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65  e algorithms are
8dc0: 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a   complicated.  *
8dd0: 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72  * slightly in or
8de0: 64 65 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74  der to be compat
8df0: 69 62 6c 65 20 77 69 74 68 20 77 69 6e 64 6f 77  ible with window
8e00: 73 20 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74  s systems simult
8e10: 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63  aneously.  ** ac
8e20: 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
8e30: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
8e40: 69 6e 20 63 61 73 65 20 74 68 61 74 20 69 73 20  in case that is 
8e50: 65 76 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20  ever required.. 
8e60: 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73   **.  ** Symbols
8e70: 20 64 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68   defined in os.h
8e80: 20 69 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27   indentify the '
8e90: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e  pending byte' an
8ea0: 64 20 74 68 65 20 27 72 65 73 65 72 76 65 64 0a  d the 'reserved.
8eb0: 20 20 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68    ** byte', each
8ec0: 20 73 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74   single bytes at
8ed0: 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73   well known offs
8ee0: 65 74 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68  ets, and the 'sh
8ef0: 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72  ared byte.  ** r
8f00: 61 6e 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f  ange', a range o
8f10: 66 20 35 31 30 20 62 79 74 65 73 20 61 74 20 61  f 510 bytes at a
8f20: 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73   well known offs
8f30: 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f  et..  **.  ** To
8f40: 20 6f 62 74 61 69 6e 20 61 20 53 48 41 52 45 44   obtain a SHARED
8f50: 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f   lock, a read-lo
8f60: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f  ck is obtained o
8f70: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20  n the 'pending. 
8f80: 20 2a 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74   ** byte'.  If t
8f90: 68 69 73 20 69 73 20 73 75 63 63 65 73 73 66 75  his is successfu
8fa0: 6c 2c 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65  l, a random byte
8fb0: 20 66 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65   from the 'share
8fc0: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
8fd0: 65 27 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65  e' is read-locke
8fe0: 64 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  d and the lock o
8ff0: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  n the 'pending b
9000: 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e 0a 20  yte' released.. 
9010: 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65   **.  ** A proce
9020: 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61  ss may only obta
9030: 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
9040: 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20  ck after it has 
9050: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20  a SHARED lock.. 
9060: 20 2a 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c   ** A RESERVED l
9070: 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ock is implement
9080: 65 64 20 62 79 20 67 72 61 62 62 69 6e 67 20 61  ed by grabbing a
9090: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
90a0: 68 65 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65  he.  ** 'reserve
90b0: 64 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20  d byte'. .  **. 
90c0: 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61   ** A process ma
90d0: 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20  y only obtain a 
90e0: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74  PENDING lock aft
90f0: 65 72 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e  er it has obtain
9100: 65 64 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44  ed a.  ** SHARED
9110: 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47   lock. A PENDING
9120: 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65   lock is impleme
9130: 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e  nted by obtainin
9140: 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20  g a write-lock. 
9150: 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64   ** on the 'pend
9160: 69 6e 67 20 62 79 74 65 27 2e 20 54 68 69 73 20  ing byte'. This 
9170: 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20  ensures that no 
9180: 6e 65 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  new SHARED locks
9190: 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74   can be.  ** obt
91a0: 61 69 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74  ained, but exist
91b0: 69 6e 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  ing SHARED locks
91c0: 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
91d0: 70 65 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65  persist. A proce
91e0: 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  ss.  ** does not
91f0: 20 68 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20   have to obtain 
9200: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
9210: 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 61 20  on the way to a 
9220: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20  PENDING lock..  
9230: 2a 2a 20 54 68 69 73 20 70 72 6f 70 65 72 74 79  ** This property
9240: 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
9250: 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f  algorithm for ro
9260: 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75  lling back a jou
9270: 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61  rnal file.  ** a
9280: 66 74 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20  fter a crash..  
9290: 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55  **.  ** An EXCLU
92a0: 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69  SIVE lock, obtai
92b0: 6e 65 64 20 61 66 74 65 72 20 61 20 50 45 4e 44  ned after a PEND
92c0: 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ING lock is held
92d0: 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d  , is.  ** implem
92e0: 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69  ented by obtaini
92f0: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ng a write-lock 
9300: 6f 6e 20 74 68 65 20 65 6e 74 69 72 65 20 27 73  on the entire 's
9310: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
9320: 72 61 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c  range'. Since al
9330: 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65  l other locks re
9340: 71 75 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63  quire a read-loc
9350: 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  k on one of the 
9360: 62 79 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69  bytes.  ** withi
9370: 6e 20 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68  n this range, th
9380: 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  is ensures that 
9390: 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61  no other locks a
93a0: 72 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20  re held on the. 
93b0: 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20   ** database. . 
93c0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65 61   **.  ** The rea
93d0: 73 6f 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74  son a single byt
93e0: 65 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  e cannot be used
93f0: 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
9400: 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a  'shared byte.  *
9410: 2a 20 72 61 6e 67 65 27 20 69 73 20 74 68 61 74  * range' is that
9420: 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
9430: 66 20 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74  f windows do not
9440: 20 73 75 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f   support read-lo
9450: 63 6b 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63  cks. By.  ** loc
9460: 6b 69 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62 79  king a random by
9470: 74 65 20 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c  te from a range,
9480: 20 63 6f 6e 63 75 72 72 65 6e 74 20 53 48 41 52   concurrent SHAR
9490: 45 44 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69  ED locks may exi
94a0: 73 74 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20  st.  ** even if 
94b0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d  the locking prim
94c0: 69 74 69 76 65 20 75 73 65 64 20 69 73 20 61 6c  itive used is al
94d0: 77 61 79 73 20 61 20 77 72 69 74 65 2d 6c 6f 63  ways a write-loc
94e0: 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63  k..  */.  int rc
94f0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
9500: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
9510: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
9520: 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e  .  struct lockIn
9530: 66 6f 20 2a 70 4c 6f 63 6b 20 3d 20 70 46 69 6c  fo *pLock = pFil
9540: 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75  e->pLock;.  stru
9550: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
9560: 20 69 6e 74 20 73 3b 0a 0a 20 20 61 73 73 65 72   int s;..  asser
9570: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
9580: 54 52 41 43 45 37 28 22 4c 4f 43 4b 20 20 20 20  TRACE7("LOCK    
9590: 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c  %d %s was %s(%s,
95a0: 25 64 29 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70  %d) pid=%d\n", p
95b0: 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 6c  File->h,.      l
95c0: 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b  ocktypeName(lock
95d0: 74 79 70 65 29 2c 20 6c 6f 63 6b 74 79 70 65 4e  type), locktypeN
95e0: 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  ame(pFile->lockt
95f0: 79 70 65 29 2c 0a 20 20 20 20 20 20 6c 6f 63 6b  ype),.      lock
9600: 74 79 70 65 4e 61 6d 65 28 70 4c 6f 63 6b 2d 3e  typeName(pLock->
9610: 6c 6f 63 6b 74 79 70 65 29 2c 20 70 4c 6f 63 6b  locktype), pLock
9620: 2d 3e 63 6e 74 20 2c 20 67 65 74 70 69 64 28 29  ->cnt , getpid()
9630: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
9640: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c  e is already a l
9650: 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65  ock of this type
9660: 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63   or more restric
9670: 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  tive on the.  **
9680: 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f   unixFile, do no
9690: 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65  thing. Don't use
96a0: 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65   the end_lock: e
96b0: 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a  xit path, as.  *
96c0: 2a 20 65 6e 74 65 72 4d 75 74 65 78 28 29 20 68  * enterMutex() h
96d0: 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65  asn't been calle
96e0: 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  d yet..  */.  if
96f0: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
9700: 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e>=locktype ){. 
9710: 20 20 20 4f 53 54 52 41 43 45 33 28 22 4c 4f 43     OSTRACE3("LOC
9720: 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61  K    %d %s ok (a
9730: 6c 72 65 61 64 79 20 68 65 6c 64 29 5c 6e 22 2c  lready held)\n",
9740: 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
9750: 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e         locktypeN
9760: 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  ame(locktype));.
9770: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9780: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
9790: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f  Make sure the lo
97a0: 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  cking sequence i
97b0: 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20  s correct.  */. 
97c0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
97d0: 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43  locktype!=NO_LOC
97e0: 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  K || locktype==S
97f0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
9800: 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
9810: 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  !=PENDING_LOCK )
9820: 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
9830: 74 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c  type!=RESERVED_L
9840: 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f  OCK || pFile->lo
9850: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
9860: 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  OCK );..  /* Thi
9870: 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65  s mutex is neede
9880: 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d  d because pFile-
9890: 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61 72 65 64  >pLock is shared
98a0: 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a   across threads.
98b0: 20 20 2a 2f 0a 20 20 65 6e 74 65 72 4d 75 74 65    */.  enterMute
98c0: 78 28 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  x();..  /* Make 
98d0: 73 75 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  sure the current
98e0: 20 74 68 72 65 61 64 20 6f 77 6e 73 20 74 68 65   thread owns the
98f0: 20 70 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72   pFile..  */.  r
9900: 63 20 3d 20 74 72 61 6e 73 66 65 72 4f 77 6e 65  c = transferOwne
9910: 72 73 68 69 70 28 70 46 69 6c 65 29 3b 0a 20 20  rship(pFile);.  
9920: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
9930: 4b 20 29 7b 0a 20 20 20 20 6c 65 61 76 65 4d 75  K ){.    leaveMu
9940: 74 65 78 28 29 3b 0a 20 20 20 20 72 65 74 75 72  tex();.    retur
9950: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 4c 6f 63  n rc;.  }.  pLoc
9960: 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  k = pFile->pLock
9970: 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20  ;..  /* If some 
9980: 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69  thread using thi
9990: 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b  s PID has a lock
99a0: 20 76 69 61 20 61 20 64 69 66 66 65 72 65 6e 74   via a different
99b0: 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20   unixFile*.  ** 
99c0: 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63  handle that prec
99d0: 6c 75 64 65 73 20 74 68 65 20 72 65 71 75 65 73  ludes the reques
99e0: 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e  ted lock, return
99f0: 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66   BUSY..  */.  if
9a00: 28 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  ( (pFile->lockty
9a10: 70 65 21 3d 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  pe!=pLock->lockt
9a20: 79 70 65 20 26 26 20 0a 20 20 20 20 20 20 20 20  ype && .        
9a30: 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79    (pLock->lockty
9a40: 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  pe>=PENDING_LOCK
9a50: 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3e 53 48 41   || locktype>SHA
9a60: 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a  RED_LOCK)).  ){.
9a70: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
9a80: 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65  BUSY;.    goto e
9a90: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  nd_lock;.  }..  
9aa0: 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c  /* If a SHARED l
9ab0: 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
9ac0: 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61  , and some threa
9ad0: 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
9ae0: 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61   already.  ** ha
9af0: 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45  s a SHARED or RE
9b00: 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SERVED lock, the
9b10: 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65  n increment refe
9b20: 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64  rence counts and
9b30: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  .  ** return SQL
9b40: 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69  ITE_OK..  */.  i
9b50: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
9b60: 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20  RED_LOCK && .   
9b70: 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74     (pLock->lockt
9b80: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
9b90: 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74   || pLock->lockt
9ba0: 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype==RESERVED_LO
9bb0: 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  CK) ){.    asser
9bc0: 74 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  t( locktype==SHA
9bd0: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
9be0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
9bf0: 6f 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 20 20  ocktype==0 );.  
9c00: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
9c10: 3e 63 6e 74 3e 30 20 29 3b 0a 20 20 20 20 70 46  >cnt>0 );.    pF
9c20: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
9c30: 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
9c40: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2b 2b 3b 0a 20   pLock->cnt++;. 
9c50: 20 20 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d     pFile->pOpen-
9c60: 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f  >nLock++;.    go
9c70: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  to end_lock;.  }
9c80: 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  ..  lock.l_len =
9c90: 20 31 4c 3b 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f 77   1L;..  lock.l_w
9ca0: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
9cb0: 3b 0a 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e  ;..  /* A PENDIN
9cc0: 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64  G lock is needed
9cd0: 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e   before acquirin
9ce0: 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  g a SHARED lock 
9cf0: 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20  and before.  ** 
9d00: 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43  acquiring an EXC
9d10: 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f  LUSIVE lock.  Fo
9d20: 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63  r the SHARED loc
9d30: 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77  k, the PENDING w
9d40: 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65  ill.  ** be rele
9d50: 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ased..  */.  if(
9d60: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
9d70: 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c  D_LOCK .      ||
9d80: 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c   (locktype==EXCL
9d90: 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46  USIVE_LOCK && pF
9da0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 50 45  ile->locktype<PE
9db0: 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b  NDING_LOCK).  ){
9dc0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
9dd0: 20 3d 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   = (locktype==SH
9de0: 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43  ARED_LOCK?F_RDLC
9df0: 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20  K:F_WRLCK);.    
9e00: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
9e10: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
9e20: 20 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65   s = fcntl(pFile
9e30: 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  ->h, F_SETLK, &l
9e40: 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 73 3d  ock);.    if( s=
9e50: 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 72  =(-1) ){.      r
9e60: 63 20 3d 20 28 65 72 72 6e 6f 3d 3d 45 49 4e 56  c = (errno==EINV
9e70: 41 4c 29 20 3f 20 53 51 4c 49 54 45 5f 4e 4f 4c  AL) ? SQLITE_NOL
9e80: 46 53 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59  FS : SQLITE_BUSY
9e90: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  ;.      goto end
9ea0: 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  _lock;.    }.  }
9eb0: 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72  ...  /* If contr
9ec0: 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73 20  ol gets to this 
9ed0: 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75  point, then actu
9ee0: 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e  ally go ahead an
9ef0: 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72  d make.  ** oper
9f00: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c  ating system cal
9f10: 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ls for the speci
9f20: 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a  fied lock..  */.
9f30: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
9f40: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
9f50: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
9f60: 2d 3e 63 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20  ->cnt==0 );.    
9f70: 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c  assert( pLock->l
9f80: 6f 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 0a 20  ocktype==0 );.. 
9f90: 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68     /* Now get th
9fa0: 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20  e read-lock */. 
9fb0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
9fc0: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
9fd0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
9fe0: 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20   SHARED_SIZE;.  
9ff0: 20 20 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c    s = fcntl(pFil
a000: 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
a010: 6c 6f 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 44  lock);..    /* D
a020: 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72  rop the temporar
a030: 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a  y PENDING lock *
a040: 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  /.    lock.l_sta
a050: 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rt = PENDING_BYT
a060: 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  E;.    lock.l_le
a070: 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b  n = 1L;.    lock
a080: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
a090: 4b 3b 0a 20 20 20 20 69 66 28 20 66 63 6e 74 6c  K;.    if( fcntl
a0a0: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54  (pFile->h, F_SET
a0b0: 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 30 20 29 7b  LK, &lock)!=0 ){
a0c0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
a0d0: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
a0e0: 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64    /* This should
a0f0: 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f   never happen */
a100: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
a110: 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  lock;.    }.    
a120: 69 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a 20  if( s==(-1) ){. 
a130: 20 20 20 20 20 72 63 20 3d 20 28 65 72 72 6e 6f       rc = (errno
a140: 3d 3d 45 49 4e 56 41 4c 29 20 3f 20 53 51 4c 49  ==EINVAL) ? SQLI
a150: 54 45 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c 49 54  TE_NOLFS : SQLIT
a160: 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73  E_BUSY;.    }els
a170: 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e{.      pFile->
a180: 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45  locktype = SHARE
a190: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46  D_LOCK;.      pF
a1a0: 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63  ile->pOpen->nLoc
a1b0: 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b  k++;.      pLock
a1c0: 2d 3e 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 7d  ->cnt = 1;.    }
a1d0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63  .  }else if( loc
a1e0: 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
a1f0: 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e  _LOCK && pLock->
a200: 63 6e 74 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  cnt>1 ){.    /* 
a210: 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f  We are trying fo
a220: 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  r an exclusive l
a230: 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20  ock but another 
a240: 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20  thread in this. 
a250: 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65     ** same proce
a260: 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64  ss is still hold
a270: 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ing a shared loc
a280: 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53  k. */.    rc = S
a290: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65  QLITE_BUSY;.  }e
a2a0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
a2b0: 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20  request was for 
a2c0: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
a2d0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49  CLUSIVE lock.  I
a2e0: 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75  t is.    ** assu
a2f0: 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69  med that there i
a300: 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72  s a SHARED or gr
a310: 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
a320: 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c  e file.    ** al
a330: 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
a340: 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46 69    assert( 0!=pFi
a350: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a  le->locktype );.
a360: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
a370: 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 73  = F_WRLCK;.    s
a380: 77 69 74 63 68 28 20 6c 6f 63 6b 74 79 70 65 20  witch( locktype 
a390: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 52 45  ){.      case RE
a3a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 0a 20 20 20  SERVED_LOCK:.   
a3b0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
a3c0: 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54  t = RESERVED_BYT
a3d0: 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  E;.        break
a3e0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 45 58 43  ;.      case EXC
a3f0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 0a 20 20 20  LUSIVE_LOCK:.   
a400: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
a410: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
a420: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
a430: 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
a440: 5a 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ZE;.        brea
a450: 6b 3b 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  k;.      default
a460: 3a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  :.        assert
a470: 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  (0);.    }.    s
a480: 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e   = fcntl(pFile->
a490: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
a4a0: 6b 29 3b 0a 20 20 20 20 69 66 28 20 73 3d 3d 28  k);.    if( s==(
a4b0: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  -1) ){.      rc 
a4c0: 3d 20 28 65 72 72 6e 6f 3d 3d 45 49 4e 56 41 4c  = (errno==EINVAL
a4d0: 29 20 3f 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53  ) ? SQLITE_NOLFS
a4e0: 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   : SQLITE_BUSY;.
a4f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69      }.  }.  .  i
a500: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
a510: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
a520: 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79  ocktype = lockty
a530: 70 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c  pe;.    pLock->l
a540: 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79  ocktype = lockty
a550: 70 65 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  pe;.  }else if( 
a560: 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
a570: 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
a580: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
a590: 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
a5a0: 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74      pLock->lockt
a5b0: 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ype = PENDING_LO
a5c0: 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63  CK;.  }..end_loc
a5d0: 6b 3a 0a 20 20 6c 65 61 76 65 4d 75 74 65 78 28  k:.  leaveMutex(
a5e0: 29 3b 0a 20 20 4f 53 54 52 41 43 45 34 28 22 4c  );.  OSTRACE4("L
a5f0: 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 5c  OCK    %d %s %s\
a600: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f  n", pFile->h, lo
a610: 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74  cktypeName(lockt
a620: 79 70 65 29 2c 20 0a 20 20 20 20 20 20 72 63 3d  ype), .      rc=
a630: 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
a640: 22 20 3a 20 22 66 61 69 6c 65 64 22 29 3b 0a 20  " : "failed");. 
a650: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
a660: 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
a670: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
a680: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
a690: 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70  pFile to locktyp
a6a0: 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20  e.  locktype.** 
a6b0: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
a6c0: 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
a6d0: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
a6e0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
a6f0: 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
a700: 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
a710: 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
a720: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
a730: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
a740: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
a750: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
a760: 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63  ic int unixUnloc
a770: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
a780: 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
a790: 29 7b 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b  ){.  struct lock
a7a0: 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 0a 20 20 73  Info *pLock;.  s
a7b0: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
a7c0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
a7d0: 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
a7e0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
a7f0: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
a800: 20 68 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   h;..  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 68 20 3d 20  rMutex();.  h = 
a960: 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 70 4c 6f 63  pFile->h;.  pLoc
a970: 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  k = pFile->pLock
a980: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63  ;.  assert( pLoc
a990: 6b 2d 3e 63 6e 74 21 3d 30 20 29 3b 0a 20 20 69  k->cnt!=0 );.  i
a9a0: 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
a9b0: 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  pe>SHARED_LOCK )
a9c0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  {.    assert( pL
a9d0: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 70  ock->locktype==p
a9e0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29  File->locktype )
a9f0: 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
aa00: 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
aa10: 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
aa20: 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20  ror( h=(-1) ).  
aa30: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
aa40: 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
aa50: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
aa60: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
aa70: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
aa80: 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20   F_RDLCK;.      
aa90: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
aaa0: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
aab0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
aac0: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
aad0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
aae0: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
aaf0: 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c 20     if( fcntl(h, 
ab00: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d  F_SETLK, &lock)=
ab10: 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  =(-1) ){.       
ab20: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
ab30: 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20 20  RR_RDLOCK;.     
ab40: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63   }.    }.    loc
ab50: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
ab60: 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  CK;.    lock.l_w
ab70: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
ab80: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
ab90: 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rt = PENDING_BYT
aba0: 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  E;.    lock.l_le
abb0: 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28  n = 2L;  assert(
abc0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d   PENDING_BYTE+1=
abd0: 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 29  =RESERVED_BYTE )
abe0: 3b 0a 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28  ;.    if( fcntl(
abf0: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
ac00: 6b 29 21 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20  k)!=(-1) ){.    
ac10: 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70    pLock->locktyp
ac20: 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  e = SHARED_LOCK;
ac30: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ac40: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
ac50: 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_UNLOCK;.    
ac60: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b  }.  }.  if( lock
ac70: 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b  type==NO_LOCK ){
ac80: 0a 20 20 20 20 73 74 72 75 63 74 20 6f 70 65 6e  .    struct open
ac90: 43 6e 74 20 2a 70 4f 70 65 6e 3b 0a 0a 20 20 20  Cnt *pOpen;..   
aca0: 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
acb0: 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f  e shared lock co
acc0: 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20  unter.  Release 
acd0: 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61  the lock using a
ace0: 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c  n.    ** OS call
acf0: 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74   only when all t
ad00: 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73  hreads in this s
ad10: 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65  ame process have
ad20: 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a   released.    **
ad30: 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a   the lock..    *
ad40: 2f 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74  /.    pLock->cnt
ad50: 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63  --;.    if( pLoc
ad60: 6b 2d 3e 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  k->cnt==0 ){.   
ad70: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
ad80: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20   F_UNLCK;.      
ad90: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
ada0: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
adb0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c  lock.l_start = l
adc0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a  ock.l_len = 0L;.
add0: 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
ade0: 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
adf0: 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
ae00: 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a  Error( h=(-1) ).
ae10: 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
ae20: 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
ae30: 20 20 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28        if( fcntl(
ae40: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
ae50: 6b 29 21 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20  k)!=(-1) ){.    
ae60: 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74      pLock->lockt
ae70: 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ype = NO_LOCK;. 
ae80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ae90: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
aea0: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  IOERR_UNLOCK;.  
aeb0: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74        pLock->cnt
aec0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
aed0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72    }..    /* Decr
aee0: 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20  ement the count 
aef0: 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74  of locks against
af00: 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e   this same file.
af10: 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a    When the.    *
af20: 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  * count reaches 
af30: 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20  zero, close any 
af40: 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72  other file descr
af50: 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f  iptors whose clo
af60: 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65  se.    ** was de
af70: 66 65 72 72 65 64 20 62 65 63 61 75 73 65 20 6f  ferred because o
af80: 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  f outstanding lo
af90: 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  cks..    */.    
afa0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
afb0: 4b 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e  K ){.      pOpen
afc0: 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b   = pFile->pOpen;
afd0: 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c  .      pOpen->nL
afe0: 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73  ock--;.      ass
aff0: 65 72 74 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63  ert( pOpen->nLoc
b000: 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  k>=0 );.      if
b010: 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3d 3d  ( pOpen->nLock==
b020: 30 20 26 26 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e  0 && pOpen->nPen
b030: 64 69 6e 67 3e 30 20 29 7b 0a 20 20 20 20 20 20  ding>0 ){.      
b040: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
b050: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 70 65   for(i=0; i<pOpe
b060: 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3b 20 69 2b 2b  n->nPending; i++
b070: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  ){.          clo
b080: 73 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69  se(pOpen->aPendi
b090: 6e 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ng[i]);.        
b0a0: 7d 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 70  }.        free(p
b0b0: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 29 3b  Open->aPending);
b0c0: 0a 20 20 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  .        pOpen->
b0d0: 6e 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20  nPending = 0;.  
b0e0: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65        pOpen->aPe
b0f0: 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  nding = 0;.     
b100: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6c   }.    }.  }.  l
b110: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69  eaveMutex();.  i
b120: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
b130: 20 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79   ) pFile->lockty
b140: 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
b150: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b160: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
b170: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
b180: 20 75 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69 74   unixClose(sqlit
b190: 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
b1a0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
b1b0: 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64  = (unixFile *)id
b1c0: 3b 0a 20 20 69 66 28 20 21 70 46 69 6c 65 20 29  ;.  if( !pFile )
b1d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b1e0: 4b 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28  K;.  unixUnlock(
b1f0: 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
b200: 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72 66 64  if( pFile->dirfd
b210: 3e 3d 30 20 29 20 63 6c 6f 73 65 28 70 46 69 6c  >=0 ) close(pFil
b220: 65 2d 3e 64 69 72 66 64 29 3b 0a 20 20 70 46 69  e->dirfd);.  pFi
b230: 6c 65 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a  le->dirfd = -1;.
b240: 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a    enterMutex();.
b250: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4f  .  if( pFile->pO
b260: 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20  pen->nLock ){.  
b270: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
b280: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  e outstanding lo
b290: 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75  cks, do not actu
b2a0: 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66  ally close the f
b2b0: 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20  ile just.    ** 
b2c0: 79 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74  yet because that
b2d0: 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f   would clear tho
b2e0: 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65  se locks.  Inste
b2f0: 61 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65  ad, add the file
b300: 0a 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74  .    ** descript
b310: 6f 72 20 74 6f 20 70 4f 70 65 6e 2d 3e 61 50 65  or to pOpen->aPe
b320: 6e 64 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20  nding.  It will 
b330: 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
b340: 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20 20   closed when.   
b350: 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f 63   ** the last loc
b360: 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20  k is cleared..  
b370: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 2a 61 4e    */.    int *aN
b380: 65 77 3b 0a 20 20 20 20 73 74 72 75 63 74 20 6f  ew;.    struct o
b390: 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 20 3d 20  penCnt *pOpen = 
b3a0: 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20  pFile->pOpen;.  
b3b0: 20 20 61 4e 65 77 20 3d 20 72 65 61 6c 6c 6f 63    aNew = realloc
b3c0: 28 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e  ( pOpen->aPendin
b3d0: 67 2c 20 28 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64  g, (pOpen->nPend
b3e0: 69 6e 67 2b 31 29 2a 73 69 7a 65 6f 66 28 69 6e  ing+1)*sizeof(in
b3f0: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61 4e  t) );.    if( aN
b400: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ew==0 ){.      /
b410: 2a 20 49 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61  * If a malloc fa
b420: 69 6c 73 2c 20 6a 75 73 74 20 6c 65 61 6b 20 74  ils, just leak t
b430: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
b440: 6f 72 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b  or */.    }else{
b450: 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50  .      pOpen->aP
b460: 65 6e 64 69 6e 67 20 3d 20 61 4e 65 77 3b 0a 20  ending = aNew;. 
b470: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e       pOpen->aPen
b480: 64 69 6e 67 5b 70 4f 70 65 6e 2d 3e 6e 50 65 6e  ding[pOpen->nPen
b490: 64 69 6e 67 5d 20 3d 20 70 46 69 6c 65 2d 3e 68  ding] = pFile->h
b4a0: 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e  ;.      pOpen->n
b4b0: 50 65 6e 64 69 6e 67 2b 2b 3b 0a 20 20 20 20 7d  Pending++;.    }
b4c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
b4d0: 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   There are no ou
b4e0: 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 20  tstanding locks 
b4f0: 73 6f 20 77 65 20 63 61 6e 20 63 6c 6f 73 65 20  so we can close 
b500: 74 68 65 20 66 69 6c 65 20 69 6d 6d 65 64 69 61  the file immedia
b510: 74 65 6c 79 20 2a 2f 0a 20 20 20 20 63 6c 6f 73  tely */.    clos
b520: 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 7d  e(pFile->h);.  }
b530: 0a 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e  .  releaseLockIn
b540: 66 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29  fo(pFile->pLock)
b550: 3b 0a 20 20 72 65 6c 65 61 73 65 4f 70 65 6e 43  ;.  releaseOpenC
b560: 6e 74 28 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 29  nt(pFile->pOpen)
b570: 3b 0a 0a 20 20 6c 65 61 76 65 4d 75 74 65 78 28  ;..  leaveMutex(
b580: 29 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22 43  );.  OSTRACE2("C
b590: 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20  LOSE   %-3d\n", 
b5a0: 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 4f 70 65  pFile->h);.  Ope
b5b0: 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20  nCounter(-1);.  
b5c0: 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c  memset(pFile, 0,
b5d0: 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65   sizeof(unixFile
b5e0: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
b5f0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 64  ITE_OK;.}...#ifd
b600: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
b610: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23  _LOCKING_STYLE.#
b620: 70 72 61 67 6d 61 20 6d 61 72 6b 20 41 46 50 20  pragma mark AFP 
b630: 53 75 70 70 6f 72 74 0a 0a 2f 2a 0a 20 2a 2a 20  Support../*. ** 
b640: 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  The afpLockingCo
b650: 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20  ntext structure 
b660: 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66 70  contains all afp
b670: 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20 73   lock specific s
b680: 74 61 74 65 0a 20 2a 2f 0a 74 79 70 65 64 65 66  tate. */.typedef
b690: 20 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69   struct afpLocki
b6a0: 6e 67 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63  ngContext afpLoc
b6b0: 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72  kingContext;.str
b6c0: 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  uct afpLockingCo
b6d0: 6e 74 65 78 74 20 7b 0a 20 20 75 6e 73 69 67 6e  ntext {.  unsign
b6e0: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61  ed long long sha
b6f0: 72 65 64 4c 6f 63 6b 42 79 74 65 3b 0a 20 20 63  redLockByte;.  c
b700: 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50  onst char *fileP
b710: 61 74 68 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  ath;.};..struct 
b720: 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
b730: 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  .{.  unsigned lo
b740: 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20  ng long offset; 
b750: 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74         /* offset
b760: 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74   to first byte t
b770: 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69  o lock */.  unsi
b780: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c  gned long long l
b790: 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f 2a  ength;        /*
b7a0: 20 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74 6f   nbr of bytes to
b7b0: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67   lock */.  unsig
b7c0: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65  ned long long re
b7d0: 74 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20  tRangeStart; /* 
b7e0: 6e 62 72 20 6f 66 20 31 73 74 20 62 79 74 65 20  nbr of 1st byte 
b7f0: 6c 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65 73  locked if succes
b800: 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  sful */.  unsign
b810: 65 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c  ed char unLockFl
b820: 61 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 31  ag;         /* 1
b830: 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c   = unlock, 0 = l
b840: 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ock */.  unsigne
b850: 64 20 63 68 61 72 20 73 74 61 72 74 45 6e 64 46  d char startEndF
b860: 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d  lag;       /* 1=
b870: 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f  rel to end of fo
b880: 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74 61  rk, 0=rel to sta
b890: 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20  rt */.  int fd; 
b8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c            /* fil
b8c0: 65 20 64 65 73 63 20 74 6f 20 61 73 73 6f 63 20  e desc to assoc 
b8d0: 74 68 69 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a  this lock with *
b8e0: 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66  /.};..#define af
b8f0: 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  pfsByteRangeLock
b900: 32 46 53 43 54 4c 20 20 20 20 20 20 20 20 5f 49  2FSCTL        _I
b910: 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72  OWR('z', 23, str
b920: 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
b930: 6b 50 42 32 29 0a 0a 2f 2a 20 0a 2a 2a 20 52 65  kPB2)../* .** Re
b940: 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73  turn 0 on succes
b950: 73 2c 20 31 20 6f 6e 20 66 61 69 6c 75 72 65 2e  s, 1 on failure.
b960: 20 20 54 6f 20 6d 61 74 63 68 20 74 68 65 20 62    To match the b
b970: 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 0a  ehavior of the .
b980: 2a 2a 20 6e 6f 72 6d 61 6c 20 70 6f 73 69 78 20  ** normal posix 
b990: 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 28 75 73  file locking (us
b9a0: 65 64 20 69 6e 20 75 6e 69 78 4c 6f 63 6b 20 66  ed in unixLock f
b9b0: 6f 72 20 65 78 61 6d 70 6c 65 29 2c 20 77 65 20  or example), we 
b9c0: 73 68 6f 75 6c 64 20 0a 2a 2a 20 70 72 6f 76 69  should .** provi
b9d0: 64 65 20 27 72 69 63 68 65 72 27 20 72 65 74 75  de 'richer' retu
b9e0: 72 6e 20 63 6f 64 65 73 20 2d 20 73 70 65 63 69  rn codes - speci
b9f0: 66 69 63 61 6c 6c 79 20 74 6f 20 64 69 66 66 65  fically to diffe
ba00: 72 65 6e 74 69 61 74 65 20 62 65 74 77 65 65 6e  rentiate between
ba10: 0a 2a 2a 20 27 66 69 6c 65 20 62 75 73 79 27 20  .** 'file busy' 
ba20: 61 6e 64 20 27 66 69 6c 65 20 73 79 73 74 65 6d  and 'file system
ba30: 20 65 72 72 6f 72 27 20 72 65 73 75 6c 74 73 2e   error' results.
ba40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 5f  .*/.static int _
ba50: 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 0a 20 20  AFPFSSetLock(.  
ba60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
ba70: 2c 20 0a 20 20 69 6e 74 20 66 64 2c 20 0a 20 20  , .  int fd, .  
ba80: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
ba90: 6e 67 20 6f 66 66 73 65 74 2c 20 0a 20 20 75 6e  ng offset, .  un
baa0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
bab0: 20 6c 65 6e 67 74 68 2c 20 0a 20 20 69 6e 74 20   length, .  int 
bac0: 73 65 74 4c 6f 63 6b 46 6c 61 67 0a 29 7b 0a 20  setLockFlag.){. 
bad0: 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67   struct ByteRang
bae0: 65 4c 6f 63 6b 50 42 32 20 20 20 20 20 20 20 70  eLockPB2       p
baf0: 62 3b 0a 20 20 69 6e 74 20 20 20 20 20 20 20 20  b;.  int        
bb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
bb10: 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b  ;.  .  pb.unLock
bb20: 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c  Flag = setLockFl
bb30: 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62  ag ? 0 : 1;.  pb
bb40: 2e 73 74 61 72 74 45 6e 64 46 6c 61 67 20 3d 20  .startEndFlag = 
bb50: 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74 20 3d  0;.  pb.offset =
bb60: 20 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65   offset;.  pb.le
bb70: 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a  ngth = length; .
bb80: 20 20 70 62 2e 66 64 20 3d 20 66 64 3b 0a 20 20    pb.fd = fd;.  
bb90: 4f 53 54 52 41 43 45 35 28 22 41 46 50 4c 4f 43  OSTRACE5("AFPLOC
bba0: 4b 20 73 65 74 74 69 6e 67 20 6c 6f 63 6b 20 25  K setting lock %
bbb0: 73 20 66 6f 72 20 25 64 20 69 6e 20 72 61 6e 67  s for %d in rang
bbc0: 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20  e %llx:%llx\n", 
bbd0: 0a 20 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61  .    (setLockFla
bbe0: 67 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 66  g?"ON":"OFF"), f
bbf0: 64 2c 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74  d, offset, lengt
bc00: 68 29 3b 0a 20 20 65 72 72 20 3d 20 66 73 63 74  h);.  err = fsct
bc10: 6c 28 70 61 74 68 2c 20 61 66 70 66 73 42 79 74  l(path, afpfsByt
bc20: 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c  eRangeLock2FSCTL
bc30: 2c 20 26 70 62 2c 20 30 29 3b 0a 20 20 69 66 20  , &pb, 0);.  if 
bc40: 28 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20  ( err==-1 ) {.  
bc50: 20 20 4f 53 54 52 41 43 45 34 28 22 41 46 50 4c    OSTRACE4("AFPL
bc60: 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73  OCK failed to fs
bc70: 63 74 6c 28 29 20 27 25 73 27 20 25 64 20 25 73  ctl() '%s' %d %s
bc80: 5c 6e 22 2c 20 70 61 74 68 2c 20 65 72 72 6e 6f  \n", path, errno
bc90: 2c 20 0a 20 20 20 20 20 20 73 74 72 65 72 72 6f  , .      strerro
bca0: 72 28 65 72 72 6e 6f 29 29 3b 0a 20 20 20 20 72  r(errno));.    r
bcb0: 65 74 75 72 6e 20 31 3b 20 2f 2a 20 65 72 72 6f  eturn 1; /* erro
bcc0: 72 20 2a 2f 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  r */.  } else {.
bcd0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
bce0: 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 69 73  }.}../*. ** This
bcf0: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
bd00: 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
bd10: 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
bd20: 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
bd30: 64 0a 20 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  d. ** file by th
bd40: 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
bd50: 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
bd60: 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
bd70: 20 72 65 74 75 72 6e 0a 20 2a 2a 20 6e 6f 6e 2d   return. ** non-
bd80: 7a 65 72 6f 2e 20 20 49 66 20 74 68 65 20 66 69  zero.  If the fi
bd90: 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 6f  le is unlocked o
bda0: 72 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 53 48 41  r holds only SHA
bdb0: 52 45 44 20 6c 6f 63 6b 73 2c 20 74 68 65 6e 0a  RED locks, then.
bdc0: 20 2a 2a 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e   ** return zero.
bdd0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
bde0: 61 66 70 55 6e 69 78 43 68 65 63 6b 52 65 73 65  afpUnixCheckRese
bdf0: 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
be00: 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e  _file *id){.  in
be10: 74 20 72 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  t r = 0;.  unixF
be20: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
be30: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20  ixFile*)id;.  . 
be40: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
be50: 3b 20 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  ; .  afpLockingC
be60: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20  ontext *context 
be70: 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
be80: 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
be90: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
bea0: 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
beb0: 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
bec0: 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
bed0: 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
bee0: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
bef0: 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ype>SHARED_LOCK 
bf00: 29 7b 0a 20 20 20 20 72 20 3d 20 31 3b 0a 20 20  ){.    r = 1;.  
bf10: 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77  }.  .  /* Otherw
bf20: 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
bf30: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
bf40: 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20  lds it..   */.  
bf50: 69 66 20 28 20 21 72 20 29 20 7b 0a 20 20 20 20  if ( !r ) {.    
bf60: 2f 2a 20 6c 6f 63 6b 20 74 68 65 20 62 79 74 65  /* lock the byte
bf70: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61 69 6c   */.    int fail
bf80: 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f  ed = _AFPFSSetLo
bf90: 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65  ck(context->file
bfa0: 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  Path, pFile->h, 
bfb0: 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
bfc0: 2c 31 29 3b 20 20 0a 20 20 20 20 69 66 20 28 66  ,1);  .    if (f
bfd0: 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 2f  ailed) {.      /
bfe0: 2a 20 69 66 20 77 65 20 66 61 69 6c 65 64 20 74  * if we failed t
bff0: 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 74  o get the lock t
c000: 68 65 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65  hen someone else
c010: 20 6d 75 73 74 20 68 61 76 65 20 69 74 20 2a 2f   must have it */
c020: 0a 20 20 20 20 20 20 72 20 3d 20 31 3b 0a 20 20  .      r = 1;.  
c030: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
c040: 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63 65 65   /* if we succee
c050: 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20 74 68  ded in taking th
c060: 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c  e reserved lock,
c070: 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65   unlock it to re
c080: 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 74  store.      ** t
c090: 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  he original stat
c0a0: 65 20 2a 2f 0a 20 20 20 20 20 20 5f 41 46 50 46  e */.      _AFPF
c0b0: 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  SSetLock(context
c0c0: 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c  ->filePath, pFil
c0d0: 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42  e->h, RESERVED_B
c0e0: 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  YTE, 1, 0);.    
c0f0: 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 33  }.  }.  OSTRACE3
c100: 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
c110: 64 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d %d\n", pFile->
c120: 68 2c 20 72 29 3b 0a 20 20 0a 20 20 72 65 74 75  h, r);.  .  retu
c130: 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 20 41 46 50 2d  rn r;.}../* AFP-
c140: 73 74 79 6c 65 20 6c 6f 63 6b 69 6e 67 20 66 6f  style locking fo
c150: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 62 65 68 61  llowing the beha
c160: 76 69 6f 72 20 6f 66 20 75 6e 69 78 4c 6f 63 6b  vior of unixLock
c170: 2c 20 73 65 65 20 74 68 65 20 75 6e 69 78 4c 6f  , see the unixLo
c180: 63 6b 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ck .** function 
c190: 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 64 65 74  comments for det
c1a0: 61 69 6c 73 20 6f 66 20 6c 6f 63 6b 20 6d 61 6e  ails of lock man
c1b0: 61 67 65 6d 65 6e 74 2e 20 2a 2f 0a 73 74 61 74  agement. */.stat
c1c0: 69 63 20 69 6e 74 20 61 66 70 55 6e 69 78 4c 6f  ic int afpUnixLo
c1d0: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
c1e0: 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
c1f0: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
c200: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
c210: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
c220: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61  nixFile*)id;.  a
c230: 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
c240: 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70   *context = (afp
c250: 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
c260: 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  ) pFile->locking
c270: 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 67  Context;.  int g
c280: 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20  otPendingLock = 
c290: 30 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  0;.  .  assert( 
c2a0: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
c2b0: 43 45 35 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE5("LOCK    %d 
c2c0: 25 73 20 77 61 73 20 25 73 20 70 69 64 3d 25 64  %s was %s pid=%d
c2d0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
c2e0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65          locktype
c2f0: 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20  Name(locktype), 
c300: 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69  locktypeName(pFi
c310: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 67  le->locktype), g
c320: 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 2f 2a 20  etpid());..  /* 
c330: 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
c340: 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68  ady a lock of th
c350: 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20  is type or more 
c360: 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74  restrictive on t
c370: 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65  he.  ** unixFile
c380: 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f  , do nothing. Do
c390: 6e 27 74 20 75 73 65 20 74 68 65 20 61 66 70 5f  n't use the afp_
c3a0: 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70  end_lock: exit p
c3b0: 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 65 6e 74  ath, as.  ** ent
c3c0: 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74  erMutex() hasn't
c3d0: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74   been called yet
c3e0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
c3f0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f  le->locktype>=lo
c400: 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 4f 53  cktype ){.    OS
c410: 54 52 41 43 45 33 28 22 4c 4f 43 4b 20 20 20 20  TRACE3("LOCK    
c420: 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64  %d %s ok (alread
c430: 79 20 68 65 6c 64 29 5c 6e 22 2c 20 70 46 69 6c  y held)\n", pFil
c440: 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
c450: 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f   locktypeName(lo
c460: 63 6b 74 79 70 65 29 29 3b 0a 20 20 20 20 72 65  cktype));.    re
c470: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c480: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
c490: 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ure the locking 
c4a0: 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72  sequence is corr
c4b0: 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ect.  */.  asser
c4c0: 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
c4d0: 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c  pe!=NO_LOCK || l
c4e0: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
c4f0: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
c500: 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44  ( locktype!=PEND
c510: 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  ING_LOCK );.  as
c520: 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d  sert( locktype!=
c530: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
c540: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
c550: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
c560: 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75  .  .  /* This mu
c570: 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62 65  tex is needed be
c580: 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 4c 6f  cause pFile->pLo
c590: 63 6b 20 69 73 20 73 68 61 72 65 64 20 61 63 72  ck is shared acr
c5a0: 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f  oss threads.  */
c5b0: 0a 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29 3b  .  enterMutex();
c5c0: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
c5d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72   the current thr
c5e0: 65 61 64 20 6f 77 6e 73 20 74 68 65 20 70 46 69  ead owns the pFi
c5f0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  le..  */.  rc = 
c600: 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68 69  transferOwnershi
c610: 70 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  p(pFile);.  if( 
c620: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
c630: 0a 20 20 20 20 6c 65 61 76 65 4d 75 74 65 78 28  .    leaveMutex(
c640: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
c650: 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20  ;.  }.    .  /* 
c660: 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  A PENDING lock i
c670: 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20  s needed before 
c680: 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52  acquiring a SHAR
c690: 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f  ED lock and befo
c6a0: 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e  re.  ** acquirin
c6b0: 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  g an EXCLUSIVE l
c6c0: 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48  ock.  For the SH
c6d0: 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50  ARED lock, the P
c6e0: 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a  ENDING will.  **
c6f0: 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20   be released..  
c700: 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
c710: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a  e==SHARED_LOCK .
c720: 20 20 20 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79        || (lockty
c730: 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
c740: 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK && pFile->loc
c750: 6b 74 79 70 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f  ktype<PENDING_LO
c760: 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74  CK).  ){.    int
c770: 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 66 61 69   failed;.    fai
c780: 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c  led = _AFPFSSetL
c790: 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c  ock(context->fil
c7a0: 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c  ePath, pFile->h,
c7b0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31   PENDING_BYTE, 1
c7c0: 2c 20 31 29 3b 0a 20 20 20 20 69 66 20 28 66 61  , 1);.    if (fa
c7d0: 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 72 63  iled) {.      rc
c7e0: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
c7f0: 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65        goto afp_e
c800: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  nd_lock;.    }. 
c810: 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f   }.  .  /* If co
c820: 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68  ntrol gets to th
c830: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61  is point, then a
c840: 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64  ctually go ahead
c850: 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f   and make.  ** o
c860: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
c870: 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70  calls for the sp
c880: 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20  ecified lock..  
c890: 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
c8a0: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
c8b0: 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 2c 20 66 61  {.    int lk, fa
c8c0: 69 6c 65 64 3b 0a 20 20 20 20 69 6e 74 20 74 72  iled;.    int tr
c8d0: 69 65 73 20 3d 20 30 3b 0a 20 20 20 20 0a 20 20  ies = 0;.    .  
c8e0: 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65    /* Now get the
c8f0: 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20   read-lock */.  
c900: 20 20 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74    /* note that t
c910: 68 65 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68  he quality of th
c920: 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65  e randomness doe
c930: 73 6e 27 74 20 6d 61 74 74 65 72 20 74 68 61 74  sn't matter that
c940: 20 6d 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20   much */.    lk 
c950: 3d 20 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20  = random(); .   
c960: 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64   context->shared
c970: 4c 6f 63 6b 42 79 74 65 20 3d 20 28 6c 6b 20 26  LockByte = (lk &
c980: 20 30 78 37 66 66 66 66 66 66 66 29 25 28 53 48   0x7fffffff)%(SH
c990: 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a  ARED_SIZE - 1);.
c9a0: 20 20 20 20 66 61 69 6c 65 64 20 3d 20 5f 41 46      failed = _AF
c9b0: 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  PFSSetLock(conte
c9c0: 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46  xt->filePath, pF
c9d0: 69 6c 65 2d 3e 68 2c 20 0a 20 20 20 20 20 20 53  ile->h, .      S
c9e0: 48 41 52 45 44 5f 46 49 52 53 54 2b 63 6f 6e 74  HARED_FIRST+cont
c9f0: 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ext->sharedLockB
ca00: 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  yte, 1, 1);.    
ca10: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65  .    /* Drop the
ca20: 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49   temporary PENDI
ca30: 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69  NG lock */.    i
ca40: 66 20 28 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b  f (_AFPFSSetLock
ca50: 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61  (context->filePa
ca60: 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 50 45  th, pFile->h, PE
ca70: 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30  NDING_BYTE, 1, 0
ca80: 29 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  )) {.      rc = 
ca90: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
caa0: 4f 43 4b 3b 20 20 2f 2a 20 54 68 69 73 20 73 68  OCK;  /* This sh
cab0: 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65  ould never happe
cac0: 6e 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20  n */.      goto 
cad0: 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
cae0: 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 69 66 28    }.    .    if(
caf0: 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20   failed ){.     
cb00: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
cb10: 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  Y;.    } else {.
cb20: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
cb30: 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c  ktype = SHARED_L
cb40: 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  OCK;.    }.  }el
cb50: 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
cb60: 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20 61  equest was for a
cb70: 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
cb80: 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74  LUSIVE lock.  It
cb90: 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d   is.    ** assum
cba0: 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ed that there is
cbb0: 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72 65   a SHARED or gre
cbc0: 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
cbd0: 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72   file.    ** alr
cbe0: 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eady..    */.   
cbf0: 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b   int failed = 0;
cc00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d  .    assert( 0!=
cc10: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
cc20: 29 3b 0a 20 20 20 20 69 66 20 28 6c 6f 63 6b 74  );.    if (lockt
cc30: 79 70 65 20 3e 3d 20 52 45 53 45 52 56 45 44 5f  ype >= RESERVED_
cc40: 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c  LOCK && pFile->l
cc50: 6f 63 6b 74 79 70 65 20 3c 20 52 45 53 45 52 56  ocktype < RESERV
cc60: 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20  ED_LOCK) {.     
cc70: 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20     /* Acquire a 
cc80: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f  RESERVED lock */
cc90: 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20  .        failed 
cca0: 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28  = _AFPFSSetLock(
ccb0: 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74  context->filePat
ccc0: 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53  h, pFile->h, RES
ccd0: 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29  ERVED_BYTE, 1,1)
cce0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
ccf0: 21 66 61 69 6c 65 64 20 26 26 20 6c 6f 63 6b 74  !failed && lockt
cd00: 79 70 65 20 3d 3d 20 45 58 43 4c 55 53 49 56 45  ype == EXCLUSIVE
cd10: 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 2f  _LOCK) {.      /
cd20: 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 58 43  * Acquire an EXC
cd30: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20  LUSIVE lock */. 
cd40: 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a         .      /*
cd50: 20 52 65 6d 6f 76 65 20 74 68 65 20 73 68 61 72   Remove the shar
cd60: 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20 74  ed lock before t
cd70: 72 79 69 6e 67 20 74 68 65 20 72 61 6e 67 65 2e  rying the range.
cd80: 20 20 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f 20    we'll need to 
cd90: 0a 20 20 20 20 20 20 2a 2a 20 72 65 65 73 74 61  .      ** reesta
cda0: 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64  blish the shared
cdb0: 20 6c 6f 63 6b 20 69 66 20 77 65 20 63 61 6e 27   lock if we can'
cdc0: 74 20 67 65 74 20 74 68 65 20 20 61 66 70 55 6e  t get the  afpUn
cdd0: 69 78 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a  ixUnlock.      *
cde0: 2f 0a 20 20 20 20 20 20 69 66 20 28 21 5f 41 46  /.      if (!_AF
cdf0: 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  PFSSetLock(conte
ce00: 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46  xt->filePath, pF
ce10: 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46  ile->h, SHARED_F
ce20: 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20 20  IRST +.         
ce30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce40: 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64 4c  context->sharedL
ce50: 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 29 20  ockByte, 1, 0)) 
ce60: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 77  {.        /* now
ce70: 20 61 74 74 65 6d 6d 70 74 20 74 6f 20 67 65 74   attemmpt to get
ce80: 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
ce90: 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20  ock range */.   
cea0: 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 5f 41       failed = _A
ceb0: 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74  FPFSSetLock(cont
cec0: 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70  ext->filePath, p
ced0: 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
cee0: 46 49 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20  FIRST, .        
cef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf00: 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49         SHARED_SI
cf10: 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ZE, 1);.        
cf20: 69 66 20 28 66 61 69 6c 65 64 20 26 26 20 5f 41  if (failed && _A
cf30: 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74  FPFSSetLock(cont
cf40: 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70  ext->filePath, p
cf50: 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
cf60: 46 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20  FIRST +.        
cf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf80: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
cf90: 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ext->sharedLockB
cfa0: 79 74 65 2c 20 31 2c 20 31 29 29 20 7b 0a 20 20  yte, 1, 1)) {.  
cfb0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
cfc0: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
cfd0: 3b 20 2f 2a 20 74 68 69 73 20 73 68 6f 75 6c 64  ; /* this should
cfe0: 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f   never happen */
cff0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d000: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
d010: 20 20 2f 2a 20 2a 2f 0a 20 20 20 20 20 20 20 20    /* */.        
d020: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
d030: 52 5f 55 4e 4c 4f 43 4b 3b 20 2f 2a 20 74 68 69  R_UNLOCK; /* thi
d040: 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68  s should never h
d050: 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d  appen */.      }
d060: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66  .    }.    if( f
d070: 61 69 6c 65 64 20 26 26 20 72 63 20 3d 3d 20 53  ailed && rc == S
d080: 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 20  QLITE_OK){.     
d090: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
d0a0: 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  Y;.    }.  }.  .
d0b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
d0c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  _OK ){.    pFile
d0d0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
d0e0: 6b 74 79 70 65 3b 0a 20 20 7d 65 6c 73 65 20 69  ktype;.  }else i
d0f0: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  f( locktype==EXC
d100: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
d110: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
d120: 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  pe = PENDING_LOC
d130: 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f 65 6e  K;.  }.  .afp_en
d140: 64 5f 6c 6f 63 6b 3a 0a 20 20 6c 65 61 76 65 4d  d_lock:.  leaveM
d150: 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
d160: 45 34 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E4("LOCK    %d %
d170: 73 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  s %s\n", pFile->
d180: 68 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28  h, locktypeName(
d190: 6c 6f 63 6b 74 79 70 65 29 2c 20 0a 20 20 20 20  locktype), .    
d1a0: 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
d1b0: 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
d1c0: 6c 65 64 22 29 3b 0a 20 20 72 65 74 75 72 6e 20  led");.  return 
d1d0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
d1e0: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
d1f0: 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
d200: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
d210: 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b   locktype.  lock
d220: 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20  type.** must be 
d230: 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
d240: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
d250: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
d260: 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
d270: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
d280: 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
d290: 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
d2a0: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
d2b0: 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
d2c0: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
d2d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
d2e0: 66 70 55 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c  fpUnixUnlock(sql
d2f0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
d300: 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20  nt locktype) {. 
d310: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
d320: 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ck;.  int rc = S
d330: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
d340: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
d350: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61  nixFile*)id;.  a
d360: 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
d370: 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70   *context = (afp
d380: 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
d390: 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  ) pFile->locking
d3a0: 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 61 73 73 65  Context;..  asse
d3b0: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
d3c0: 53 54 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20  STRACE5("UNLOCK 
d3d0: 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69   %d %d was %d pi
d3e0: 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d=%d\n", pFile->
d3f0: 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20  h, locktype,.   
d400: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
d410: 6b 74 79 70 65 2c 20 67 65 74 70 69 64 28 29 29  ktype, getpid())
d420: 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 6c  ;.  .  assert( l
d430: 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f  ocktype<=SHARED_
d440: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46  LOCK );.  if( pF
d450: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c  ile->locktype<=l
d460: 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
d470: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d480: 0a 20 20 7d 0a 20 20 69 66 28 20 43 48 45 43 4b  .  }.  if( CHECK
d490: 5f 54 48 52 45 41 44 49 44 28 70 46 69 6c 65 29  _THREADID(pFile)
d4a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
d4b0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
d4c0: 7d 0a 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29  }.  enterMutex()
d4d0: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  ;.  if( pFile->l
d4e0: 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c  ocktype>SHARED_L
d4f0: 4f 43 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c  OCK ){.    if( l
d500: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
d510: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  LOCK ){.      in
d520: 74 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 0a 20  t failed = 0;.. 
d530: 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 74       /* unlock t
d540: 68 65 20 65 78 63 6c 75 73 69 76 65 20 72 61 6e  he exclusive ran
d550: 67 65 20 2d 20 74 68 65 6e 20 72 65 2d 65 73 74  ge - then re-est
d560: 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65  ablish the share
d570: 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  d lock */.      
d580: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if (pFile->lockt
d590: 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
d5a0: 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 66  OCK) {.        f
d5b0: 61 69 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65  ailed = _AFPFSSe
d5c0: 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66  tLock(context->f
d5d0: 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e  ilePath, pFile->
d5e0: 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  h, SHARED_FIRST,
d5f0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
d600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d610: 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20     SHARED_SIZE, 
d620: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28  0);.        if (
d630: 21 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20  !failed) {.     
d640: 20 20 20 20 20 2f 2a 20 73 75 63 63 65 73 73 66       /* successf
d650: 75 6c 6c 79 20 72 65 6d 6f 76 65 64 20 74 68 65  ully removed the
d660: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
d670: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  */.          if 
d680: 28 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63  (_AFPFSSetLock(c
d690: 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68  ontext->filePath
d6a0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52  , pFile->h, SHAR
d6b0: 45 44 5f 46 49 52 53 54 2b 0a 20 20 20 20 20 20  ED_FIRST+.      
d6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6d0: 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 73        context->s
d6e0: 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31  haredLockByte, 1
d6f0: 2c 20 31 29 29 20 7b 0a 20 20 20 20 20 20 20 20  , 1)) {.        
d700: 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f      /* failed to
d710: 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20 6f 75   re-establish ou
d720: 72 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f  r shared lock */
d730: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
d740: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  = SQLITE_IOERR_R
d750: 44 4c 4f 43 4b 3b 20 2f 2a 20 54 68 69 73 20 73  DLOCK; /* This s
d760: 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70  hould never happ
d770: 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  en */.          
d780: 7d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  }.        } else
d790: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20   {.          /* 
d7a0: 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65  This should neve
d7b0: 72 20 68 61 70 70 65 6e 20 2d 20 66 61 69 6c 65  r happen - faile
d7c0: 64 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  d to unlock the 
d7d0: 65 78 63 6c 75 73 69 76 65 20 72 61 6e 67 65 20  exclusive range 
d7e0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
d7f0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
d800: 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d  NLOCK;.        }
d810: 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a   .      }.    }.
d820: 20 20 20 20 69 66 20 28 72 63 20 3d 3d 20 53 51      if (rc == SQ
d830: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65  LITE_OK && pFile
d840: 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50 45 4e 44  ->locktype>=PEND
d850: 49 4e 47 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  ING_LOCK) {.    
d860: 20 20 69 66 20 28 5f 41 46 50 46 53 53 65 74 4c    if (_AFPFSSetL
d870: 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c  ock(context->fil
d880: 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c  ePath, pFile->h,
d890: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31   PENDING_BYTE, 1
d8a0: 2c 20 30 29 29 7b 0a 20 20 20 20 20 20 20 20 2f  , 0)){.        /
d8b0: 2a 20 66 61 69 6c 65 64 20 74 6f 20 72 65 6c 65  * failed to rele
d8c0: 61 73 65 20 74 68 65 20 70 65 6e 64 69 6e 67 20  ase the pending 
d8d0: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
d8e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
d8f0: 52 5f 55 4e 4c 4f 43 4b 3b 20 2f 2a 20 54 68 69  R_UNLOCK; /* Thi
d900: 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68  s should never h
d910: 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d  appen */.      }
d920: 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66 20 28  .    } .    if (
d930: 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20  rc == SQLITE_OK 
d940: 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  && pFile->lockty
d950: 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe>=RESERVED_LOC
d960: 4b 29 20 7b 0a 20 20 20 20 20 20 69 66 20 28 5f  K) {.      if (_
d970: 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e  AFPFSSetLock(con
d980: 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20  text->filePath, 
d990: 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56  pFile->h, RESERV
d9a0: 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 29 20  ED_BYTE, 1, 0)) 
d9b0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 61 69  {.        /* fai
d9c0: 6c 65 64 20 74 6f 20 72 65 6c 65 61 73 65 20 74  led to release t
d9d0: 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b  he reserved lock
d9e0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
d9f0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
da00: 4c 4f 43 4b 3b 20 20 2f 2a 20 54 68 69 73 20 73  LOCK;  /* This s
da10: 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70  hould never happ
da20: 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  en */.      }.  
da30: 20 20 7d 20 0a 20 20 7d 0a 20 20 69 66 28 20 6c    } .  }.  if( l
da40: 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b  ocktype==NO_LOCK
da50: 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69 6c   ){.    int fail
da60: 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f  ed = _AFPFSSetLo
da70: 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65  ck(context->file
da80: 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  Path, pFile->h, 
da90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
daa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dab0: 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20 63  SHARED_FIRST + c
dac0: 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f  ontext->sharedLo
dad0: 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20  ckByte, 1, 0);. 
dae0: 20 20 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b     if (failed) {
daf0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
db00: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
db10: 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64    /* This should
db20: 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f   never happen */
db30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 20  .    }.  }.  if 
db40: 28 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b  (rc == SQLITE_OK
db50: 29 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  ).    pFile->loc
db60: 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
db70: 3b 0a 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29  ;.  leaveMutex()
db80: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
db90: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
dba0: 66 69 6c 65 20 26 20 63 6c 65 61 6e 75 70 20 41  file & cleanup A
dbb0: 46 50 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b  FP specific lock
dbc0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a  ing context .*/.
dbd0: 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e  static int afpUn
dbe0: 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ixClose(sqlite3_
dbf0: 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 75 6e  file *id) {.  un
dc00: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
dc10: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
dc20: 20 20 69 66 28 20 21 70 46 69 6c 65 20 29 20 72    if( !pFile ) r
dc30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
dc40: 0a 20 20 61 66 70 55 6e 69 78 55 6e 6c 6f 63 6b  .  afpUnixUnlock
dc50: 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
dc60: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
dc70: 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
dc80: 65 78 74 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  ext);.  if( pFil
dc90: 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29 20 63 6c  e->dirfd>=0 ) cl
dca0: 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72 66 64  ose(pFile->dirfd
dcb0: 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 64 69 72 66  );.  pFile->dirf
dcc0: 64 20 3d 20 2d 31 3b 0a 20 20 65 6e 74 65 72 4d  d = -1;.  enterM
dcd0: 75 74 65 78 28 29 3b 0a 20 20 63 6c 6f 73 65 28  utex();.  close(
dce0: 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 6c 65 61  pFile->h);.  lea
dcf0: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
dd00: 52 41 43 45 32 28 22 43 4c 4f 53 45 20 20 20 25  RACE2("CLOSE   %
dd10: 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  -3d\n", pFile->h
dd20: 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  );.  OpenCounter
dd30: 28 2d 31 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  (-1);.  memset(p
dd40: 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  File, 0, sizeof(
dd50: 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 72 65  unixFile));.  re
dd60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
dd70: 7d 0a 0a 0a 23 70 72 61 67 6d 61 20 6d 61 72 6b  }...#pragma mark
dd80: 20 66 6c 6f 63 6b 28 29 20 73 74 79 6c 65 20 6c   flock() style l
dd90: 6f 63 6b 69 6e 67 0a 0a 2f 2a 0a 2a 2a 20 54 68  ocking../*.** Th
dda0: 65 20 66 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  e flockLockingCo
ddb0: 6e 74 65 78 74 20 69 73 20 6e 6f 74 20 75 73 65  ntext is not use
ddc0: 64 0a 2a 2f 0a 74 79 70 65 64 65 66 20 76 6f 69  d.*/.typedef voi
ddd0: 64 20 66 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  d flockLockingCo
dde0: 6e 74 65 78 74 3b 0a 0a 73 74 61 74 69 63 20 69  ntext;..static i
ddf0: 6e 74 20 66 6c 6f 63 6b 55 6e 69 78 43 68 65 63  nt flockUnixChec
de00: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
de10: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
de20: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
de30: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
de40: 69 64 3b 0a 20 20 0a 20 20 69 66 20 28 70 46 69  id;.  .  if (pFi
de50: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 3d 20  le->locktype == 
de60: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b  RESERVED_LOCK) {
de70: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20 2f  .    return 1; /
de80: 2a 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61  * already have a
de90: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a   reserved lock *
dea0: 2f 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  /.  } else {.   
deb0: 20 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 67   /* attempt to g
dec0: 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20  et the lock */. 
ded0: 20 20 20 69 6e 74 20 72 63 20 3d 20 66 6c 6f 63     int rc = floc
dee0: 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
def0: 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a  _EX | LOCK_NB);.
df00: 20 20 20 20 69 66 20 28 21 72 63 29 20 7b 0a 20      if (!rc) {. 
df10: 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65 20       /* got the 
df20: 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20  lock, unlock it 
df30: 2a 2f 0a 20 20 20 20 20 20 66 6c 6f 63 6b 28 70  */.      flock(p
df40: 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e  File->h, LOCK_UN
df50: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
df60: 30 3b 20 20 2f 2a 20 6e 6f 20 6f 6e 65 20 68 61  0;  /* no one ha
df70: 73 20 69 74 20 72 65 73 65 72 76 65 64 20 2a 2f  s it reserved */
df80: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
df90: 6e 20 31 3b 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20  n 1; /* someone 
dfa0: 65 6c 73 65 20 6d 69 67 68 74 20 68 61 76 65 20  else might have 
dfb0: 69 74 20 72 65 73 65 72 76 65 64 20 2a 2f 0a 20  it reserved */. 
dfc0: 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74   }.}..static int
dfd0: 20 66 6c 6f 63 6b 55 6e 69 78 4c 6f 63 6b 28 73   flockUnixLock(s
dfe0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
dff0: 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b   int locktype) {
e000: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
e010: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
e020: 69 64 3b 0a 20 20 0a 20 20 2f 2a 20 69 66 20 77  id;.  .  /* if w
e030: 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61  e already have a
e040: 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63   lock, it is exc
e050: 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a  lusive.  .  ** J
e060: 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c  ust adjust level
e070: 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74   and punt on out
e080: 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66  ta here. */.  if
e090: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70   (pFile->locktyp
e0a0: 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20  e > NO_LOCK) {. 
e0b0: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
e0c0: 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
e0d0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e0e0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
e0f0: 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69   grab an exclusi
e100: 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74  ve lock */.  int
e110: 20 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c   rc = flock(pFil
e120: 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20  e->h, LOCK_EX | 
e130: 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20 69 66 20 28  LOCK_NB);.  if (
e140: 72 63 29 20 7b 0a 20 20 20 20 2f 2a 20 64 69 64  rc) {.    /* did
e150: 6e 27 74 20 67 65 74 2c 20 6d 75 73 74 20 62 65  n't get, must be
e160: 20 62 75 73 79 20 2a 2f 0a 20 20 20 20 72 65 74   busy */.    ret
e170: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
e180: 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
e190: 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74  /* got it, set t
e1a0: 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75  he type and retu
e1b0: 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69  rn ok */.    pFi
e1c0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c  le->locktype = l
e1d0: 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 72 65 74  ocktype;.    ret
e1e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
e1f0: 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74   }.}..static int
e200: 20 66 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b   flockUnixUnlock
e210: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
e220: 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
e230: 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
e240: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
e250: 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65 72  *)id;.  .  asser
e260: 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41  t( locktype<=SHA
e270: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
e280: 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
e290: 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
e2a0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
e2b0: 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
e2c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e2d0: 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68  ;.  }.  .  /* sh
e2e0: 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65  ared can just be
e2f0: 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20   set because we 
e300: 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65  always have an e
e310: 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66  xclusive */.  if
e320: 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52   (locktype==SHAR
e330: 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70  ED_LOCK) {.    p
e340: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
e350: 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 72   locktype;.    r
e360: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e370: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c  .  }.  .  /* no,
e380: 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e   really, unlock.
e390: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 66   */.  int rc = f
e3a0: 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
e3b0: 4f 43 4b 5f 55 4e 29 3b 0a 20 20 69 66 20 28 72  OCK_UN);.  if (r
e3c0: 63 29 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  c).    return SQ
e3d0: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
e3e0: 4b 3b 0a 20 20 65 6c 73 65 20 7b 0a 20 20 20 20  K;.  else {.    
e3f0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
e400: 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72  = NO_LOCK;.    r
e410: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e420: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
e430: 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73  ose a file..*/.s
e440: 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55  tatic int flockU
e450: 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  nixClose(sqlite3
e460: 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 75  _file *id) {.  u
e470: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
e480: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
e490: 20 20 0a 20 20 69 66 28 20 21 70 46 69 6c 65 20    .  if( !pFile 
e4a0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
e4b0: 4f 4b 3b 0a 20 20 66 6c 6f 63 6b 55 6e 69 78 55  OK;.  flockUnixU
e4c0: 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
e4d0: 4b 29 3b 0a 20 20 0a 20 20 69 66 28 20 70 46 69  K);.  .  if( pFi
e4e0: 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29 20 63  le->dirfd>=0 ) c
e4f0: 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72 66  lose(pFile->dirf
e500: 64 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 64 69 72  d);.  pFile->dir
e510: 66 64 20 3d 20 2d 31 3b 0a 0a 20 20 65 6e 74 65  fd = -1;..  ente
e520: 72 4d 75 74 65 78 28 29 3b 0a 20 20 63 6c 6f 73  rMutex();.  clos
e530: 65 28 70 46 69 6c 65 2d 3e 68 29 3b 20 20 0a 20  e(pFile->h);  . 
e540: 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20   leaveMutex();. 
e550: 20 4f 53 54 52 41 43 45 32 28 22 43 4c 4f 53 45   OSTRACE2("CLOSE
e560: 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c     %-3d\n", pFil
e570: 65 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e 43 6f 75  e->h);.  OpenCou
e580: 6e 74 65 72 28 2d 31 29 3b 0a 20 20 6d 65 6d 73  nter(-1);.  mems
e590: 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a  et(pFile, 0, siz
e5a0: 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
e5b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e5c0: 4f 4b 3b 0a 7d 0a 0a 23 70 72 61 67 6d 61 20 6d  OK;.}..#pragma m
e5d0: 61 72 6b 20 4f 6c 64 2d 53 63 68 6f 6f 6c 20 2e  ark Old-School .
e5e0: 6c 6f 63 6b 20 66 69 6c 65 20 62 61 73 65 64 20  lock file based 
e5f0: 6c 6f 63 6b 69 6e 67 0a 0a 2f 2a 0a 2a 2a 20 54  locking../*.** T
e600: 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  he dotlockLockin
e610: 67 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75  gContext structu
e620: 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20  re contains all 
e630: 64 6f 74 6c 6f 63 6b 20 28 2e 6c 6f 63 6b 29 20  dotlock (.lock) 
e640: 6c 6f 63 6b 0a 2a 2a 20 73 70 65 63 69 66 69 63  lock.** specific
e650: 20 73 74 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65   state.*/.typede
e660: 66 20 73 74 72 75 63 74 20 64 6f 74 6c 6f 63 6b  f struct dotlock
e670: 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 64  LockingContext d
e680: 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e  otlockLockingCon
e690: 74 65 78 74 3b 0a 73 74 72 75 63 74 20 64 6f 74  text;.struct dot
e6a0: 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  lockLockingConte
e6b0: 78 74 20 7b 0a 20 20 63 68 61 72 20 2a 6c 6f 63  xt {.  char *loc
e6c0: 6b 50 61 74 68 3b 0a 7d 3b 0a 0a 0a 73 74 61 74  kPath;.};...stat
e6d0: 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e  ic int dotlockUn
e6e0: 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
e6f0: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
e700: 20 2a 69 64 29 20 7b 0a 20 20 75 6e 69 78 46 69   *id) {.  unixFi
e710: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
e720: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 64 6f 74  xFile*)id;.  dot
e730: 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  lockLockingConte
e740: 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 0a 20 20  xt *context;..  
e750: 63 6f 6e 74 65 78 74 20 3d 20 28 64 6f 74 6c 6f  context = (dotlo
e760: 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ckLockingContext
e770: 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
e780: 43 6f 6e 74 65 78 74 3b 0a 20 20 69 66 20 28 70  Context;.  if (p
e790: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
e7a0: 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  = RESERVED_LOCK)
e7b0: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b   {.    return 1;
e7c0: 20 2f 2a 20 61 6c 72 65 61 64 79 20 68 61 76 65   /* already have
e7d0: 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
e7e0: 20 2a 2f 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20   */.  } else {. 
e7f0: 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
e800: 74 61 74 42 75 66 3b 0a 20 20 20 20 69 66 20 28  tatBuf;.    if (
e810: 6c 73 74 61 74 28 63 6f 6e 74 65 78 74 2d 3e 6c  lstat(context->l
e820: 6f 63 6b 50 61 74 68 2c 26 73 74 61 74 42 75 66  ockPath,&statBuf
e830: 29 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 2f  ) == 0){.      /
e840: 2a 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 73  * file exists, s
e850: 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61 73 20  omeone else has 
e860: 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  the lock */.    
e870: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
e880: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
e890: 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
e8a0: 69 73 74 2c 20 77 65 20 63 6f 75 6c 64 20 68 61  ist, we could ha
e8b0: 76 65 20 69 74 20 69 66 20 77 65 20 77 61 6e 74  ve it if we want
e8c0: 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74   it */.      ret
e8d0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
e8e0: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .}..static int d
e8f0: 6f 74 6c 6f 63 6b 55 6e 69 78 4c 6f 63 6b 28 73  otlockUnixLock(s
e900: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
e910: 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b   int locktype) {
e920: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
e930: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
e940: 69 64 3b 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63  id;.  dotlockLoc
e950: 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e  kingContext *con
e960: 74 65 78 74 3b 0a 20 20 69 6e 74 20 66 64 3b 0a  text;.  int fd;.
e970: 0a 20 20 63 6f 6e 74 65 78 74 20 3d 20 28 64 6f  .  context = (do
e980: 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
e990: 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ext*)pFile->lock
e9a0: 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20  ingContext;.  . 
e9b0: 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64   /* if we alread
e9c0: 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69  y have a lock, i
e9d0: 74 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  t is exclusive. 
e9e0: 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75   .  ** Just adju
e9f0: 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e  st level and pun
ea00: 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e  t on outta here.
ea10: 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d   */.  if (pFile-
ea20: 3e 6c 6f 63 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c  >locktype > NO_L
ea30: 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
ea40: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
ea50: 6b 74 79 70 65 3b 0a 20 20 20 20 0a 20 20 20 20  ktype;.    .    
ea60: 2f 2a 20 41 6c 77 61 79 73 20 75 70 64 61 74 65  /* Always update
ea70: 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70 20 6f   the timestamp o
ea80: 6e 20 74 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a  n the old file *
ea90: 2f 0a 20 20 20 20 75 74 69 6d 65 73 28 63 6f 6e  /.    utimes(con
eaa0: 74 65 78 74 2d 3e 6c 6f 63 6b 50 61 74 68 2c 4e  text->lockPath,N
eab0: 55 4c 4c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ULL);.    return
eac0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
ead0: 20 20 0a 20 20 2f 2a 20 63 68 65 63 6b 20 74 6f    .  /* check to
eae0: 20 73 65 65 20 69 66 20 6c 6f 63 6b 20 66 69 6c   see if lock fil
eaf0: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
eb00: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61   */.  struct sta
eb10: 74 20 73 74 61 74 42 75 66 3b 0a 20 20 69 66 20  t statBuf;.  if 
eb20: 28 6c 73 74 61 74 28 63 6f 6e 74 65 78 74 2d 3e  (lstat(context->
eb30: 6c 6f 63 6b 50 61 74 68 2c 26 73 74 61 74 42 75  lockPath,&statBu
eb40: 66 29 20 3d 3d 20 30 29 7b 0a 20 20 20 20 72 65  f) == 0){.    re
eb50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
eb60: 3b 20 2f 2a 20 69 74 20 64 6f 65 73 2c 20 62 75  ; /* it does, bu
eb70: 73 79 20 2a 2f 0a 20 20 7d 0a 20 20 0a 20 20 2f  sy */.  }.  .  /
eb80: 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73  * grab an exclus
eb90: 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 66 64  ive lock */.  fd
eba0: 20 3d 20 6f 70 65 6e 28 63 6f 6e 74 65 78 74 2d   = open(context-
ebb0: 3e 6c 6f 63 6b 50 61 74 68 2c 4f 5f 52 44 4f 4e  >lockPath,O_RDON
ebc0: 4c 59 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43  LY|O_CREAT|O_EXC
ebd0: 4c 2c 30 36 30 30 29 3b 0a 20 20 69 66 28 20 66  L,0600);.  if( f
ebe0: 64 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 66 61  d<0 ){.    /* fa
ebf0: 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63 72 65  iled to open/cre
ec00: 61 74 65 20 74 68 65 20 66 69 6c 65 2c 20 73 6f  ate the file, so
ec10: 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 61 79 20 68  meone else may h
ec20: 61 76 65 20 73 74 6f 6c 65 6e 20 74 68 65 20 6c  ave stolen the l
ec30: 6f 63 6b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ock */.    retur
ec40: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 20 0a  n SQLITE_BUSY; .
ec50: 20 20 7d 0a 20 20 63 6c 6f 73 65 28 66 64 29 3b    }.  close(fd);
ec60: 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c  .  .  /* got it,
ec70: 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e   set the type an
ec80: 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20  d return ok */. 
ec90: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
eca0: 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72   = locktype;.  r
ecb0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
ecc0: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .}..static int d
ecd0: 6f 74 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b  otlockUnixUnlock
ece0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
ecf0: 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
ed00: 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
ed10: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
ed20: 2a 29 69 64 3b 0a 20 20 64 6f 74 6c 6f 63 6b 4c  *)id;.  dotlockL
ed30: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63  ockingContext *c
ed40: 6f 6e 74 65 78 74 3b 0a 0a 20 20 63 6f 6e 74 65  ontext;..  conte
ed50: 78 74 20 3d 20 28 64 6f 74 6c 6f 63 6b 4c 6f 63  xt = (dotlockLoc
ed60: 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69  kingContext*)pFi
ed70: 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
ed80: 78 74 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28  xt;.  .  assert(
ed90: 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45   locktype<=SHARE
eda0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
edb0: 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69  * no-op if possi
edc0: 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ble */.  if( pFi
edd0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c 6f  le->locktype==lo
ede0: 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65  cktype ){.    re
edf0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ee00: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72    }.  .  /* shar
ee10: 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73  ed can just be s
ee20: 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61 6c  et because we al
ee30: 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78 63  ways have an exc
ee40: 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28  lusive */.  if (
ee50: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
ee60: 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69  _LOCK) {.    pFi
ee70: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c  le->locktype = l
ee80: 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 72 65 74  ocktype;.    ret
ee90: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
eea0: 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72   }.  .  /* no, r
eeb0: 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a  eally, unlock. *
eec0: 2f 0a 20 20 75 6e 6c 69 6e 6b 28 63 6f 6e 74 65  /.  unlink(conte
eed0: 78 74 2d 3e 6c 6f 63 6b 50 61 74 68 29 3b 0a 20  xt->lockPath);. 
eee0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
eef0: 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65   = NO_LOCK;.  re
ef00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ef10: 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20  }../*. ** Close 
ef20: 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74  a file.. */.stat
ef30: 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e  ic int dotlockUn
ef40: 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ixClose(sqlite3_
ef50: 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 75 6e  file *id) {.  un
ef60: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
ef70: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
ef80: 20 0a 20 20 69 66 28 20 21 70 46 69 6c 65 20 29   .  if( !pFile )
ef90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
efa0: 4b 3b 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 69 78  K;.  dotlockUnix
efb0: 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
efc0: 43 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  CK);.  sqlite3_f
efd0: 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  ree(pFile->locki
efe0: 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 69 66  ngContext);.  if
eff0: 28 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d  ( pFile->dirfd>=
f000: 30 20 29 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d  0 ) close(pFile-
f010: 3e 64 69 72 66 64 29 3b 0a 20 20 70 46 69 6c 65  >dirfd);.  pFile
f020: 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20  ->dirfd = -1;.  
f030: 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 20 0a  enterMutex();  .
f040: 20 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 68    close(pFile->h
f050: 29 3b 0a 20 20 6c 65 61 76 65 4d 75 74 65 78 28  );.  leaveMutex(
f060: 29 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22 43  );.  OSTRACE2("C
f070: 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20  LOSE   %-3d\n", 
f080: 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 4f 70 65  pFile->h);.  Ope
f090: 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20  nCounter(-1);.  
f0a0: 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c  memset(pFile, 0,
f0b0: 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65   sizeof(unixFile
f0c0: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
f0d0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 70 72 61  ITE_OK;.}...#pra
f0e0: 67 6d 61 20 6d 61 72 6b 20 4e 6f 20 6c 6f 63 6b  gma mark No lock
f0f0: 69 6e 67 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e  ing../*.** The n
f100: 6f 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  olockLockingCont
f110: 65 78 74 20 69 73 20 76 6f 69 64 0a 2a 2f 0a 74  ext is void.*/.t
f120: 79 70 65 64 65 66 20 76 6f 69 64 20 6e 6f 6c 6f  ypedef void nolo
f130: 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ckLockingContext
f140: 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  ;..static int no
f150: 6c 6f 63 6b 55 6e 69 78 43 68 65 63 6b 52 65 73  lockUnixCheckRes
f160: 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
f170: 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
f180: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61  return 0;.}..sta
f190: 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e  tic int nolockUn
f1a0: 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ixLock(sqlite3_f
f1b0: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
f1c0: 6b 74 79 70 65 29 20 7b 0a 20 20 72 65 74 75 72  ktype) {.  retur
f1d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
f1e0: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
f1f0: 6b 55 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69  kUnixUnlock(sqli
f200: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
f210: 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20  t locktype) {.  
f220: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f230: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
f240: 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
f250: 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 69  ic int nolockUni
f260: 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  xClose(sqlite3_f
f270: 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 75 6e 69  ile *id) {.  uni
f280: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
f290: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
f2a0: 0a 20 20 69 66 28 20 21 70 46 69 6c 65 20 29 20  .  if( !pFile ) 
f2b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f2c0: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64  ;.  if( pFile->d
f2d0: 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28  irfd>=0 ) close(
f2e0: 70 46 69 6c 65 2d 3e 64 69 72 66 64 29 3b 0a 20  pFile->dirfd);. 
f2f0: 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 20 3d 20   pFile->dirfd = 
f300: 2d 31 3b 0a 20 20 65 6e 74 65 72 4d 75 74 65 78  -1;.  enterMutex
f310: 28 29 3b 0a 20 20 63 6c 6f 73 65 28 70 46 69 6c  ();.  close(pFil
f320: 65 2d 3e 68 29 3b 0a 20 20 6c 65 61 76 65 4d 75  e->h);.  leaveMu
f330: 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45  tex();.  OSTRACE
f340: 32 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c  2("CLOSE   %-3d\
f350: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20  n", pFile->h);. 
f360: 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29   OpenCounter(-1)
f370: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65  ;.  memset(pFile
f380: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78  , 0, sizeof(unix
f390: 46 69 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 6e  File));.  return
f3a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
f3b0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
f3c0: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
f3d0: 54 59 4c 45 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20  TYLE */.../*.** 
f3e0: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20  Information and 
f3f0: 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f 70  control of an op
f400: 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a  en file handle..
f410: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
f420: 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  ixFileControl(sq
f430: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
f440: 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41  int op, void *pA
f450: 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28 20 6f  rg){.  switch( o
f460: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  p ){.    case SQ
f470: 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53  LITE_FCNTL_LOCKS
f480: 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28  TATE: {.      *(
f490: 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 28 75 6e  int*)pArg = ((un
f4a0: 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 6f 63  ixFile*)id)->loc
f4b0: 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 72 65 74  ktype;.      ret
f4c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
f4d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
f4e0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
f4f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
f500: 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
f510: 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  in bytes of the 
f520: 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b  underlying block
f530: 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74   device for.** t
f540: 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
f550: 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73  e. This is almos
f560: 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74  t always 512 byt
f570: 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a  es, but may be.*
f580: 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d  * larger for som
f590: 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a  e devices..**.**
f5a0: 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73   SQLite code ass
f5b0: 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74 69  umes this functi
f5c0: 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20  on cannot fail. 
f5d0: 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20  It also assumes 
f5e0: 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66  that.** if two f
f5f0: 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64  iles are created
f600: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c   in the same fil
f610: 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f  e-system directo
f620: 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61  ry (i.e..** a da
f630: 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a  tabase and its j
f640: 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61  ournal file) tha
f650: 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  t the sector siz
f660: 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a  e will be the.**
f670: 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a   same for both..
f680: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
f690: 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c  ixSectorSize(sql
f6a0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
f6b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f6c0: 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53  DEFAULT_SECTOR_S
f6d0: 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  IZE;.}../*.** Re
f6e0: 74 75 72 6e 20 74 68 65 20 64 65 76 69 63 65 20  turn the device 
f6f0: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
f700: 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 20 54 68  for the file. Th
f710: 69 73 20 69 73 20 61 6c 77 61 79 73 20 30 2e 0a  is is always 0..
f720: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
f730: 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65  ixDeviceCharacte
f740: 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f  ristics(sqlite3_
f750: 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 72 65 74  file *id){.  ret
f760: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
f770: 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69  This vector defi
f780: 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68  nes all the meth
f790: 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65  ods that can ope
f7a0: 72 61 74 65 20 6f 6e 20 61 6e 20 73 71 6c 69 74  rate on an sqlit
f7b0: 65 33 5f 66 69 6c 65 0a 2a 2a 20 66 6f 72 20 75  e3_file.** for u
f7c0: 6e 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  nix..*/.static c
f7d0: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
f7e0: 6d 65 74 68 6f 64 73 20 73 71 6c 69 74 65 33 55  methods sqlite3U
f7f0: 6e 69 78 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a  nixIoMethod = {.
f800: 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
f810: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
f820: 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69  Version */.  uni
f830: 78 43 6c 6f 73 65 2c 0a 20 20 75 6e 69 78 52 65  xClose,.  unixRe
f840: 61 64 2c 0a 20 20 75 6e 69 78 57 72 69 74 65 2c  ad,.  unixWrite,
f850: 0a 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65 2c  .  unixTruncate,
f860: 0a 20 20 75 6e 69 78 53 79 6e 63 2c 0a 20 20 75  .  unixSync,.  u
f870: 6e 69 78 46 69 6c 65 53 69 7a 65 2c 0a 20 20 75  nixFileSize,.  u
f880: 6e 69 78 4c 6f 63 6b 2c 0a 20 20 75 6e 69 78 55  nixLock,.  unixU
f890: 6e 6c 6f 63 6b 2c 0a 20 20 75 6e 69 78 43 68 65  nlock,.  unixChe
f8a0: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a  ckReservedLock,.
f8b0: 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f    unixFileContro
f8c0: 6c 2c 0a 20 20 75 6e 69 78 53 65 63 74 6f 72 53  l,.  unixSectorS
f8d0: 69 7a 65 2c 0a 20 20 75 6e 69 78 44 65 76 69 63  ize,.  unixDevic
f8e0: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
f8f0: 0a 7d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .};..#ifdef SQLI
f900: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
f910: 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68  G_STYLE./*.** Th
f920: 69 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65  is vector define
f930: 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64  s all the method
f940: 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61  s that can opera
f950: 74 65 20 6f 6e 20 61 6e 20 73 71 6c 69 74 65 33  te on an sqlite3
f960: 5f 66 69 6c 65 0a 2a 2a 20 66 6f 72 20 75 6e 69  _file.** for uni
f970: 78 20 77 69 74 68 20 41 46 50 20 73 74 79 6c 65  x with AFP style
f980: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a   file locking..*
f990: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
f9a0: 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
f9b0: 73 20 73 71 6c 69 74 65 33 41 46 50 4c 6f 63 6b  s sqlite3AFPLock
f9c0: 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64 20  ingUnixIoMethod 
f9d0: 3d 20 7b 0a 20 20 31 2c 20 20 20 20 20 20 20 20  = {.  1,        
f9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9f0: 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20  /* iVersion */. 
fa00: 20 61 66 70 55 6e 69 78 43 6c 6f 73 65 2c 0a 20   afpUnixClose,. 
fa10: 20 75 6e 69 78 52 65 61 64 2c 0a 20 20 75 6e 69   unixRead,.  uni
fa20: 78 57 72 69 74 65 2c 0a 20 20 75 6e 69 78 54 72  xWrite,.  unixTr
fa30: 75 6e 63 61 74 65 2c 0a 20 20 75 6e 69 78 53 79  uncate,.  unixSy
fa40: 6e 63 2c 0a 20 20 75 6e 69 78 46 69 6c 65 53 69  nc,.  unixFileSi
fa50: 7a 65 2c 0a 20 20 61 66 70 55 6e 69 78 4c 6f 63  ze,.  afpUnixLoc
fa60: 6b 2c 0a 20 20 61 66 70 55 6e 69 78 55 6e 6c 6f  k,.  afpUnixUnlo
fa70: 63 6b 2c 0a 20 20 61 66 70 55 6e 69 78 43 68 65  ck,.  afpUnixChe
fa80: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a  ckReservedLock,.
fa90: 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f    unixFileContro
faa0: 6c 2c 0a 20 20 75 6e 69 78 53 65 63 74 6f 72 53  l,.  unixSectorS
fab0: 69 7a 65 2c 0a 20 20 75 6e 69 78 44 65 76 69 63  ize,.  unixDevic
fac0: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
fad0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .};../*.** This 
fae0: 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61  vector defines a
faf0: 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74  ll the methods t
fb00: 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20  hat can operate 
fb10: 6f 6e 20 61 6e 20 73 71 6c 69 74 65 33 5f 66 69  on an sqlite3_fi
fb20: 6c 65 0a 2a 2a 20 66 6f 72 20 75 6e 69 78 20 77  le.** for unix w
fb30: 69 74 68 20 66 6c 6f 63 6b 28 29 20 73 74 79 6c  ith flock() styl
fb40: 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a  e file locking..
fb50: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
fb60: 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
fb70: 64 73 20 73 71 6c 69 74 65 33 46 6c 6f 63 6b 4c  ds sqlite3FlockL
fb80: 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68  ockingUnixIoMeth
fb90: 6f 64 20 3d 20 7b 0a 20 20 31 2c 20 20 20 20 20  od = {.  1,     
fba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbb0: 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
fbc0: 2f 0a 20 20 66 6c 6f 63 6b 55 6e 69 78 43 6c 6f  /.  flockUnixClo
fbd0: 73 65 2c 0a 20 20 75 6e 69 78 52 65 61 64 2c 0a  se,.  unixRead,.
fbe0: 20 20 75 6e 69 78 57 72 69 74 65 2c 0a 20 20 75    unixWrite,.  u
fbf0: 6e 69 78 54 72 75 6e 63 61 74 65 2c 0a 20 20 75  nixTruncate,.  u
fc00: 6e 69 78 53 79 6e 63 2c 0a 20 20 75 6e 69 78 46  nixSync,.  unixF
fc10: 69 6c 65 53 69 7a 65 2c 0a 20 20 66 6c 6f 63 6b  ileSize,.  flock
fc20: 55 6e 69 78 4c 6f 63 6b 2c 0a 20 20 66 6c 6f 63  UnixLock,.  floc
fc30: 6b 55 6e 69 78 55 6e 6c 6f 63 6b 2c 0a 20 20 66  kUnixUnlock,.  f
fc40: 6c 6f 63 6b 55 6e 69 78 43 68 65 63 6b 52 65 73  lockUnixCheckRes
fc50: 65 72 76 65 64 4c 6f 63 6b 2c 0a 20 20 75 6e 69  ervedLock,.  uni
fc60: 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 0a 20 20  xFileControl,.  
fc70: 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 0a  unixSectorSize,.
fc80: 20 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72    unixDeviceChar
fc90: 61 63 74 65 72 69 73 74 69 63 73 0a 7d 3b 0a 0a  acteristics.};..
fca0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74 6f  /*.** This vecto
fcb0: 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68  r defines all th
fcc0: 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63  e methods that c
fcd0: 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e  an operate on an
fce0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a   sqlite3_file.**
fcf0: 20 66 6f 72 20 75 6e 69 78 20 77 69 74 68 20 64   for unix with d
fd00: 6f 74 6c 6f 63 6b 20 73 74 79 6c 65 20 66 69 6c  otlock style fil
fd10: 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74  e locking..*/.st
fd20: 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
fd30: 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 73 71  e3_io_methods sq
fd40: 6c 69 74 65 33 44 6f 74 6c 6f 63 6b 4c 6f 63 6b  lite3DotlockLock
fd50: 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64 20  ingUnixIoMethod 
fd60: 3d 20 7b 0a 20 20 31 2c 20 20 20 20 20 20 20 20  = {.  1,        
fd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd80: 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20  /* iVersion */. 
fd90: 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73   dotlockUnixClos
fda0: 65 2c 0a 20 20 75 6e 69 78 52 65 61 64 2c 0a 20  e,.  unixRead,. 
fdb0: 20 75 6e 69 78 57 72 69 74 65 2c 0a 20 20 75 6e   unixWrite,.  un
fdc0: 69 78 54 72 75 6e 63 61 74 65 2c 0a 20 20 75 6e  ixTruncate,.  un
fdd0: 69 78 53 79 6e 63 2c 0a 20 20 75 6e 69 78 46 69  ixSync,.  unixFi
fde0: 6c 65 53 69 7a 65 2c 0a 20 20 64 6f 74 6c 6f 63  leSize,.  dotloc
fdf0: 6b 55 6e 69 78 4c 6f 63 6b 2c 0a 20 20 64 6f 74  kUnixLock,.  dot
fe00: 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b 2c 0a  lockUnixUnlock,.
fe10: 20 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 43 68 65    dotlockUnixChe
fe20: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a  ckReservedLock,.
fe30: 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f    unixFileContro
fe40: 6c 2c 0a 20 20 75 6e 69 78 53 65 63 74 6f 72 53  l,.  unixSectorS
fe50: 69 7a 65 2c 0a 20 20 75 6e 69 78 44 65 76 69 63  ize,.  unixDevic
fe60: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
fe70: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .};../*.** This 
fe80: 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61  vector defines a
fe90: 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74  ll the methods t
fea0: 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20  hat can operate 
feb0: 6f 6e 20 61 6e 20 73 71 6c 69 74 65 33 5f 66 69  on an sqlite3_fi
fec0: 6c 65 0a 2a 2a 20 66 6f 72 20 75 6e 69 78 20 77  le.** for unix w
fed0: 69 74 68 20 6e 6f 6c 6f 63 6b 20 73 74 79 6c 65  ith nolock style
fee0: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a   file locking..*
fef0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
ff00: 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
ff10: 73 20 73 71 6c 69 74 65 33 4e 6f 6c 6f 63 6b 4c  s sqlite3NolockL
ff20: 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68  ockingUnixIoMeth
ff30: 6f 64 20 3d 20 7b 0a 20 20 31 2c 20 20 20 20 20  od = {.  1,     
ff40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff50: 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
ff60: 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 69 78 43 6c  /.  nolockUnixCl
ff70: 6f 73 65 2c 0a 20 20 75 6e 69 78 52 65 61 64 2c  ose,.  unixRead,
ff80: 0a 20 20 75 6e 69 78 57 72 69 74 65 2c 0a 20 20  .  unixWrite,.  
ff90: 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 0a 20 20  unixTruncate,.  
ffa0: 75 6e 69 78 53 79 6e 63 2c 0a 20 20 75 6e 69 78  unixSync,.  unix
ffb0: 46 69 6c 65 53 69 7a 65 2c 0a 20 20 6e 6f 6c 6f  FileSize,.  nolo
ffc0: 63 6b 55 6e 69 78 4c 6f 63 6b 2c 0a 20 20 6e 6f  ckUnixLock,.  no
ffd0: 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b 2c 0a  lockUnixUnlock,.
ffe0: 20 20 6e 6f 6c 6f 63 6b 55 6e 69 78 43 68 65 63    nolockUnixChec
fff0: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 20  kReservedLock,. 
10000 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c   unixFileControl
10010 2c 0a 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69  ,.  unixSectorSi
10020 7a 65 2c 0a 20 20 75 6e 69 78 44 65 76 69 63 65  ze,.  unixDevice
10030 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 0a  Characteristics.
10040 7d 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  };..#endif /* SQ
10050 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
10060 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a  ING_STYLE */../*
10070 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d  .** Allocate mem
10080 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20 75 6e  ory for a new un
10090 69 78 46 69 6c 65 20 61 6e 64 20 69 6e 69 74 69  ixFile and initi
100a0 61 6c 69 7a 65 20 74 68 61 74 20 75 6e 69 78 46  alize that unixF
100b0 69 6c 65 2e 0a 2a 2a 20 57 72 69 74 65 20 61 20  ile..** Write a 
100c0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
100d0 65 77 20 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f  ew unixFile into
100e0 20 2a 70 49 64 2e 0a 2a 2a 20 49 66 20 77 65 20   *pId..** If we 
100f0 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  run out of memor
10100 79 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  y, close the fil
10110 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20  e and return an 
10120 65 72 72 6f 72 2e 0a 2a 2f 0a 23 69 66 64 65 66  error..*/.#ifdef
10130 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
10140 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20  OCKING_STYLE./* 
10150 0a 2a 2a 20 57 68 65 6e 20 6c 6f 63 6b 69 6e 67  .** When locking
10160 20 65 78 74 65 6e 73 69 6f 6e 73 20 61 72 65 20   extensions are 
10170 65 6e 61 62 6c 65 64 2c 20 74 68 65 20 66 69 6c  enabled, the fil
10180 65 70 61 74 68 20 61 6e 64 20 6c 6f 63 6b 69 6e  epath and lockin
10190 67 20 73 74 79 6c 65 20 0a 2a 2a 20 61 72 65 20  g style .** are 
101a0 6e 65 65 64 65 64 20 74 6f 20 64 65 74 65 72 6d  needed to determ
101b0 69 6e 65 20 74 68 65 20 75 6e 69 78 46 69 6c 65  ine the unixFile
101c0 20 70 4d 65 74 68 6f 64 20 74 6f 20 75 73 65 20   pMethod to use 
101d0 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72  for locking oper
101e0 61 74 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 6c  ations..** The l
101f0 6f 63 6b 69 6e 67 2d 73 74 79 6c 65 20 73 70 65  ocking-style spe
10200 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 43 6f 6e  cific lockingCon
10210 74 65 78 74 20 64 61 74 61 20 73 74 72 75 63 74  text data struct
10220 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20 0a  ure is created .
10230 2a 2a 20 61 6e 64 20 61 73 73 69 67 6e 65 64 20  ** and assigned 
10240 68 65 72 65 20 61 6c 73 6f 2e 0a 2a 2f 0a 73 74  here also..*/.st
10250 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55  atic int fillInU
10260 6e 69 78 46 69 6c 65 28 0a 20 20 69 6e 74 20 68  nixFile(.  int h
10270 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10280 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20     /* Open file 
10290 64 65 73 63 72 69 70 74 6f 72 20 6f 66 20 66 69  descriptor of fi
102a0 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
102b0 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64 2c 20  */.  int dirfd, 
102c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
102d0 44 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64  Directory file d
102e0 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73  escriptor */.  s
102f0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49 64  qlite3_file *pId
10300 2c 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ,      /* Write 
10310 74 6f 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20  to the unixFile 
10320 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
10330 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
10340 7a 46 69 6c 65 6e 61 6d 65 20 20 20 2f 2a 20 4e  zFilename   /* N
10350 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
10360 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a  being opened */.
10370 29 7b 0a 20 20 73 71 6c 69 74 65 33 4c 6f 63 6b  ){.  sqlite3Lock
10380 69 6e 67 53 74 79 6c 65 20 6c 6f 63 6b 69 6e 67  ingStyle locking
10390 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c  Style;.  unixFil
103a0 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78 46  e *pNew = (unixF
103b0 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74  ile *)pId;.  int
103c0 20 72 63 3b 0a 0a 23 69 66 64 65 66 20 46 44 5f   rc;..#ifdef FD_
103d0 43 4c 4f 45 58 45 43 0a 20 20 66 63 6e 74 6c 28  CLOEXEC.  fcntl(
103e0 68 2c 20 46 5f 53 45 54 46 44 2c 20 66 63 6e 74  h, F_SETFD, fcnt
103f0 6c 28 68 2c 20 46 5f 47 45 54 46 44 2c 20 30 29  l(h, F_GETFD, 0)
10400 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a   | FD_CLOEXEC);.
10410 23 65 6e 64 69 66 0a 0a 20 20 6c 6f 63 6b 69 6e  #endif..  lockin
10420 67 53 74 79 6c 65 20 3d 20 73 71 6c 69 74 65 33  gStyle = sqlite3
10430 44 65 74 65 63 74 4c 6f 63 6b 69 6e 67 53 74 79  DetectLockingSty
10440 6c 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 68 29  le(zFilename, h)
10450 3b 0a 20 20 69 66 20 28 20 6c 6f 63 6b 69 6e 67  ;.  if ( locking
10460 53 74 79 6c 65 3d 3d 70 6f 73 69 78 4c 6f 63 6b  Style==posixLock
10470 69 6e 67 53 74 79 6c 65 20 29 7b 0a 20 20 20 20  ingStyle ){.    
10480 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  enterMutex();.  
10490 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49    rc = findLockI
104a0 6e 66 6f 28 68 2c 20 26 70 4e 65 77 2d 3e 70 4c  nfo(h, &pNew->pL
104b0 6f 63 6b 2c 20 26 70 4e 65 77 2d 3e 70 4f 70 65  ock, &pNew->pOpe
104c0 6e 29 3b 0a 20 20 20 20 6c 65 61 76 65 4d 75 74  n);.    leaveMut
104d0 65 78 28 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ex();.    if( rc
104e0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64 69   ){.      if( di
104f0 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28 64  rfd>=0 ) close(d
10500 69 72 66 64 29 3b 0a 20 20 20 20 20 20 63 6c 6f  irfd);.      clo
10510 73 65 28 68 29 3b 0a 20 20 20 20 20 20 72 65 74  se(h);.      ret
10520 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
10530 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65  ;.    }.  } else
10540 20 7b 0a 20 20 20 20 2f 2a 20 20 70 4c 6f 63 6b   {.    /*  pLock
10550 20 61 6e 64 20 70 4f 70 65 6e 20 61 72 65 20 6f   and pOpen are o
10560 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 70 6f 73  nly used for pos
10570 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ix advisory lock
10580 69 6e 67 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d  ing */.    pNew-
10590 3e 70 4c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20  >pLock = NULL;. 
105a0 20 20 20 70 4e 65 77 2d 3e 70 4f 70 65 6e 20 3d     pNew->pOpen =
105b0 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 20 20 4f 53   NULL;.  }..  OS
105c0 54 52 41 43 45 33 28 22 4f 50 45 4e 20 20 20 20  TRACE3("OPEN    
105d0 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20 7a  %-3d %s\n", h, z
105e0 46 69 6c 65 6e 61 6d 65 29 3b 20 20 20 20 0a 20  Filename);    . 
105f0 20 70 4e 65 77 2d 3e 64 69 72 66 64 20 3d 20 2d   pNew->dirfd = -
10600 31 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68  1;.  pNew->h = h
10610 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 72 66 64 20  ;.  pNew->dirfd 
10620 3d 20 64 69 72 66 64 3b 0a 20 20 53 45 54 5f 54  = dirfd;.  SET_T
10630 48 52 45 41 44 49 44 28 70 4e 65 77 29 3b 0a 20  HREADID(pNew);. 
10640 20 20 20 0a 20 20 73 77 69 74 63 68 28 6c 6f 63     .  switch(loc
10650 6b 69 6e 67 53 74 79 6c 65 29 20 7b 0a 20 20 20  kingStyle) {.   
10660 20 63 61 73 65 20 61 66 70 4c 6f 63 6b 69 6e 67   case afpLocking
10670 53 74 79 6c 65 3a 20 7b 0a 20 20 20 20 20 20 2f  Style: {.      /
10680 2a 20 61 66 70 20 6c 6f 63 6b 69 6e 67 20 75 73  * afp locking us
10690 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68  es the file path
106a0 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   so it needs to 
106b0 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20  be included in. 
106c0 20 20 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c       ** the afpL
106d0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 2f  ockingContext */
106e0 0a 20 20 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e  .      afpLockin
106f0 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  gContext *contex
10700 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  t;.      pNew->p
10710 4d 65 74 68 6f 64 20 3d 20 26 73 71 6c 69 74 65  Method = &sqlite
10720 33 41 46 50 4c 6f 63 6b 69 6e 67 55 6e 69 78 49  3AFPLockingUnixI
10730 6f 4d 65 74 68 6f 64 3b 0a 20 20 20 20 20 20 70  oMethod;.      p
10740 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  New->lockingCont
10750 65 78 74 20 3d 20 63 6f 6e 74 65 78 74 20 3d 20  ext = context = 
10760 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
10770 73 69 7a 65 6f 66 28 2a 63 6f 6e 74 65 78 74 29  sizeof(*context)
10780 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6f   );.      if( co
10790 6e 74 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ntext==0 ){.    
107a0 20 20 20 20 63 6c 6f 73 65 28 68 29 3b 0a 20 20      close(h);.  
107b0 20 20 20 20 20 20 69 66 28 20 64 69 72 66 64 3e        if( dirfd>
107c0 3d 30 20 29 20 63 6c 6f 73 65 28 64 69 72 66 64  =0 ) close(dirfd
107d0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
107e0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
107f0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
10800 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20  * NB: zFilename 
10810 65 78 69 73 74 73 20 61 6e 64 20 72 65 6d 61 69  exists and remai
10820 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 74  ns valid until t
10830 68 65 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65  he file is close
10840 64 0a 20 20 20 20 20 20 2a 2a 20 61 63 63 6f 72  d.      ** accor
10850 64 69 6e 67 20 74 6f 20 72 65 71 75 69 72 65 6d  ding to requirem
10860 65 6e 74 20 46 31 31 31 34 31 2e 20 20 53 6f 20  ent F11141.  So 
10870 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  we do not need t
10880 6f 20 6d 61 6b 65 20 61 0a 20 20 20 20 20 20 2a  o make a.      *
10890 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69  * copy of the fi
108a0 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20  lename. */.     
108b0 20 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61   context->filePa
108c0 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  th = zFilename;.
108d0 20 20 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76        srandomdev
108e0 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ();.      break;
108f0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
10900 66 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79 6c  flockLockingStyl
10910 65 3a 0a 20 20 20 20 20 20 2f 2a 20 66 6c 6f 63  e:.      /* floc
10920 6b 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 6e 27  k locking doesn'
10930 74 20 6e 65 65 64 20 61 64 64 69 74 69 6f 6e 61  t need additiona
10940 6c 20 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  l lockingContext
10950 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
10960 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74        pNew->pMet
10970 68 6f 64 20 3d 20 26 73 71 6c 69 74 65 33 46 6c  hod = &sqlite3Fl
10980 6f 63 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f  ockLockingUnixIo
10990 4d 65 74 68 6f 64 3b 0a 20 20 20 20 20 20 62 72  Method;.      br
109a0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 64 6f  eak;.    case do
109b0 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79 6c  tlockLockingStyl
109c0 65 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 64 6f  e: {.      /* do
109d0 74 6c 6f 63 6b 20 6c 6f 63 6b 69 6e 67 20 75 73  tlock locking us
109e0 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68  es the file path
109f0 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   so it needs to 
10a00 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20  be included in. 
10a10 20 20 20 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c       ** the dotl
10a20 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
10a30 74 20 2a 2f 0a 20 20 20 20 20 20 64 6f 74 6c 6f  t */.      dotlo
10a40 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ckLockingContext
10a50 20 2a 63 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20   *context;.     
10a60 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a   int nFilename;.
10a70 20 20 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20        nFilename 
10a80 3d 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61  = strlen(zFilena
10a90 6d 65 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  me);.      pNew-
10aa0 3e 70 4d 65 74 68 6f 64 20 3d 20 26 73 71 6c 69  >pMethod = &sqli
10ab0 74 65 33 44 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  te3DotlockLockin
10ac0 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a 20  gUnixIoMethod;. 
10ad0 20 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69       pNew->locki
10ae0 6e 67 43 6f 6e 74 65 78 74 20 3d 20 63 6f 6e 74  ngContext = cont
10af0 65 78 74 20 3d 20 0a 20 20 20 20 20 20 20 20 20  ext = .         
10b00 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
10b10 73 69 7a 65 6f 66 28 2a 63 6f 6e 74 65 78 74 29  sizeof(*context)
10b20 20 2b 20 6e 46 69 6c 65 6e 61 6d 65 20 2b 20 36   + nFilename + 6
10b30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6f   );.      if( co
10b40 6e 74 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ntext==0 ){.    
10b50 20 20 20 20 63 6c 6f 73 65 28 68 29 3b 0a 20 20      close(h);.  
10b60 20 20 20 20 20 20 69 66 28 20 64 69 72 66 64 3e        if( dirfd>
10b70 3d 30 20 29 20 63 6c 6f 73 65 28 64 69 72 66 64  =0 ) close(dirfd
10b80 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
10b90 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
10ba0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f        }.      co
10bb0 6e 74 65 78 74 2d 3e 6c 6f 63 6b 50 61 74 68 20  ntext->lockPath 
10bc0 3d 20 28 63 68 61 72 2a 29 26 63 6f 6e 74 65 78  = (char*)&contex
10bd0 74 5b 31 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  t[1];.      sqli
10be0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46 69  te3_snprintf(nFi
10bf0 6c 65 6e 61 6d 65 2c 20 63 6f 6e 74 65 78 74 2d  lename, context-
10c00 3e 6c 6f 63 6b 50 61 74 68 2c 0a 20 20 20 20 20  >lockPath,.     
10c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c20 20 20 22 25 73 2e 6c 6f 63 6b 22 2c 20 7a 46 69    "%s.lock", zFi
10c30 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62  lename);.      b
10c40 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
10c50 63 61 73 65 20 70 6f 73 69 78 4c 6f 63 6b 69 6e  case posixLockin
10c60 67 53 74 79 6c 65 3a 0a 20 20 20 20 20 20 2f 2a  gStyle:.      /*
10c70 20 70 6f 73 69 78 20 6c 6f 63 6b 69 6e 67 20 64   posix locking d
10c80 6f 65 73 6e 27 74 20 6e 65 65 64 20 61 64 64 69  oesn't need addi
10c90 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 43 6f  tional lockingCo
10ca0 6e 74 65 78 74 20 69 6e 66 6f 72 6d 61 74 69 6f  ntext informatio
10cb0 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  n */.      pNew-
10cc0 3e 70 4d 65 74 68 6f 64 20 3d 20 26 73 71 6c 69  >pMethod = &sqli
10cd0 74 65 33 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b  te3UnixIoMethod;
10ce0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10cf0 20 20 63 61 73 65 20 6e 6f 4c 6f 63 6b 69 6e 67    case noLocking
10d00 53 74 79 6c 65 3a 0a 20 20 20 20 63 61 73 65 20  Style:.    case 
10d10 75 6e 73 75 70 70 6f 72 74 65 64 4c 6f 63 6b 69  unsupportedLocki
10d20 6e 67 53 74 79 6c 65 3a 0a 20 20 20 20 64 65 66  ngStyle:.    def
10d30 61 75 6c 74 3a 20 0a 20 20 20 20 20 20 70 4e 65  ault: .      pNe
10d40 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 73 71  w->pMethod = &sq
10d50 6c 69 74 65 33 4e 6f 6c 6f 63 6b 4c 6f 63 6b 69  lite3NolockLocki
10d60 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a  ngUnixIoMethod;.
10d70 20 20 7d 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65    }.  OpenCounte
10d80 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  r(+1);.  return 
10d90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6c  SQLITE_OK;.}.#el
10da0 73 65 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  se /* SQLITE_ENA
10db0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
10dc0 45 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  E */.static int 
10dd0 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 0a  fillInUnixFile(.
10de0 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20    int h,        
10df0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
10e00 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
10e10 20 6f 6e 20 66 69 6c 65 20 62 65 69 6e 67 20 6f   on file being o
10e20 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64  pened */.  int d
10e30 69 72 66 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f  irfd,.  sqlite3_
10e40 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 2f  file *pId,     /
10e50 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 75  * Write to the u
10e60 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
10e70 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  e here */.  cons
10e80 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
10e90 65 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  e  /* Name of th
10ea0 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  e file being ope
10eb0 6e 65 64 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78  ned */.){.  unix
10ec0 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e  File *pNew = (un
10ed0 69 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20  ixFile *)pId;.  
10ee0 69 6e 74 20 72 63 3b 0a 0a 23 69 66 64 65 66 20  int rc;..#ifdef 
10ef0 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20 66 63 6e  FD_CLOEXEC.  fcn
10f00 74 6c 28 68 2c 20 46 5f 53 45 54 46 44 2c 20 66  tl(h, F_SETFD, f
10f10 63 6e 74 6c 28 68 2c 20 46 5f 47 45 54 46 44 2c  cntl(h, F_GETFD,
10f20 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43   0) | FD_CLOEXEC
10f30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6e 74  );.#endif..  ent
10f40 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 72 63 20  erMutex();.  rc 
10f50 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 68  = findLockInfo(h
10f60 2c 20 26 70 4e 65 77 2d 3e 70 4c 6f 63 6b 2c 20  , &pNew->pLock, 
10f70 26 70 4e 65 77 2d 3e 70 4f 70 65 6e 29 3b 0a 20  &pNew->pOpen);. 
10f80 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20   leaveMutex();. 
10f90 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69   if( rc ){.    i
10fa0 66 28 20 64 69 72 66 64 3e 3d 30 20 29 20 63 6c  f( dirfd>=0 ) cl
10fb0 6f 73 65 28 64 69 72 66 64 29 3b 0a 20 20 20 20  ose(dirfd);.    
10fc0 63 6c 6f 73 65 28 68 29 3b 0a 20 20 20 20 72 65  close(h);.    re
10fd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
10fe0 4d 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43  M;.  }..  OSTRAC
10ff0 45 33 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64  E3("OPEN    %-3d
11000 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65   %s\n", h, zFile
11010 6e 61 6d 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 64  name);.  pNew->d
11020 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  irfd = -1;.  pNe
11030 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e 65 77  w->h = h;.  pNew
11040 2d 3e 64 69 72 66 64 20 3d 20 64 69 72 66 64 3b  ->dirfd = dirfd;
11050 0a 20 20 53 45 54 5f 54 48 52 45 41 44 49 44 28  .  SET_THREADID(
11060 70 4e 65 77 29 3b 0a 0a 20 20 70 4e 65 77 2d 3e  pNew);..  pNew->
11070 70 4d 65 74 68 6f 64 20 3d 20 26 73 71 6c 69 74  pMethod = &sqlit
11080 65 33 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a  e3UnixIoMethod;.
11090 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31    OpenCounter(+1
110a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
110b0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
110c0 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
110d0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
110e0 2f 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  /../*.** Open a 
110f0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
11100 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  to the directory
11110 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c 65   containing file
11120 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49   zFilename..** I
11130 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70  f successful, *p
11140 46 64 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  Fd is set to the
11150 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64 65 73   opened file des
11160 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20 53  criptor and.** S
11170 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
11180 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  rned. If an erro
11190 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68 65 72  r occurs, either
111a0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a   SQLITE_NOMEM.**
111b0 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f   or SQLITE_CANTO
111c0 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64 20  PEN is returned 
111d0 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65 74 20  and *pFd is set 
111e0 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65 64 0a  to an undefined.
111f0 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  ** value..**.** 
11200 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
11210 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61  returned, the ca
11220 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
11230 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a  ble for closing.
11240 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ** the file desc
11250 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73 69 6e  riptor *pFd usin
11260 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74  g close()..*/.st
11270 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72  atic int openDir
11280 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61  ectory(const cha
11290 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e  r *zFilename, in
112a0 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 69  t *pFd){.  int i
112b0 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31  i;.  int fd = -1
112c0 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e 61 6d  ;.  char zDirnam
112d0 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  e[MAX_PATHNAME+1
112e0 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
112f0 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e  printf(MAX_PATHN
11300 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22  AME, zDirname, "
11310 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  %s", zFilename);
11320 0a 20 20 66 6f 72 28 69 69 3d 73 74 72 6c 65 6e  .  for(ii=strlen
11330 28 7a 44 69 72 6e 61 6d 65 29 3b 20 69 69 3e 3d  (zDirname); ii>=
11340 30 20 26 26 20 7a 44 69 72 6e 61 6d 65 5b 69 69  0 && zDirname[ii
11350 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20  ]!='/'; ii--);. 
11360 20 69 66 28 20 69 69 3e 30 20 29 7b 0a 20 20 20   if( ii>0 ){.   
11370 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 20 3d 20   zDirname[ii] = 
11380 27 5c 30 27 3b 0a 20 20 20 20 66 64 20 3d 20 6f  '\0';.    fd = o
11390 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f  pen(zDirname, O_
113a0 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c  RDONLY|O_BINARY,
113b0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3e   0);.    if( fd>
113c0 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 46 44 5f  =0 ){.#ifdef FD_
113d0 43 4c 4f 45 58 45 43 0a 20 20 20 20 20 20 66 63  CLOEXEC.      fc
113e0 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c  ntl(fd, F_SETFD,
113f0 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54   fcntl(fd, F_GET
11400 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45  FD, 0) | FD_CLOE
11410 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  XEC);.#endif.   
11420 20 20 20 4f 53 54 52 41 43 45 33 28 22 4f 50 45     OSTRACE3("OPE
11430 4e 44 49 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c  NDIR %-3d %s\n",
11440 20 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29 3b 0a   fd, zDirname);.
11450 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 46 64      }.  }.  *pFd
11460 20 3d 20 66 64 3b 0a 20 20 72 65 74 75 72 6e 20   = fd;.  return 
11470 28 66 64 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b  (fd>=0?SQLITE_OK
11480 3a 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  :SQLITE_CANTOPEN
11490 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  );.}../*.** Open
114a0 20 74 68 65 20 66 69 6c 65 20 7a 50 61 74 68 2e   the file zPath.
114b0 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73  .** .** Previous
114c0 6c 79 2c 20 74 68 65 20 53 51 4c 69 74 65 20 4f  ly, the SQLite O
114d0 53 20 6c 61 79 65 72 20 75 73 65 64 20 74 68 72  S layer used thr
114e0 65 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20  ee functions in 
114f0 70 6c 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a  place of this.**
11500 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20   one:.**.**     
11510 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
11520 64 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20  dWrite();.**    
11530 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
11540 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20  adOnly();.**    
11550 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78   sqlite3OsOpenEx
11560 63 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a  clusive();.**.**
11570 20 54 68 65 73 65 20 63 61 6c 6c 73 20 63 6f 72   These calls cor
11580 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66  respond to the f
11590 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61  ollowing combina
115a0 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a  tions of flags:.
115b0 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72  **.**     ReadWr
115c0 69 74 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45  ite() ->     (RE
115d0 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45  ADWRITE | CREATE
115e0 29 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c  ).**     ReadOnl
115f0 79 28 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41  y()  ->     (REA
11600 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f  DONLY) .**     O
11610 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d  penExclusive() -
11620 3e 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43  > (READWRITE | C
11630 52 45 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56  REATE | EXCLUSIV
11640 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64  E).**.** The old
11650 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29   OpenExclusive()
11660 20 61 63 63 65 70 74 65 64 20 61 20 62 6f 6f 6c   accepted a bool
11670 65 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20 22  ean argument - "
11680 64 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20  delFlag". If.** 
11690 74 72 75 65 2c 20 74 68 65 20 66 69 6c 65 20 77  true, the file w
116a0 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  as configured to
116b0 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   be automaticall
116c0 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74  y deleted when t
116d0 68 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c  he.** file handl
116e0 65 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68  e closed. To ach
116f0 69 65 76 65 20 74 68 65 20 73 61 6d 65 20 65 66  ieve the same ef
11700 66 65 63 74 20 75 73 69 6e 67 20 74 68 69 73 20  fect using this 
11710 6e 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63  new .** interfac
11720 65 2c 20 61 64 64 20 74 68 65 20 44 45 4c 45 54  e, add the DELET
11730 45 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f  EONCLOSE flag to
11740 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64   those specified
11750 20 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f   above for .** O
11760 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 2e 0a  penExclusive()..
11770 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
11780 69 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  ixOpen(.  sqlite
11790 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a 20 20  3_vfs *pVfs, .  
117a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
117b0 68 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  h, .  sqlite3_fi
117c0 6c 65 20 2a 70 46 69 6c 65 2c 0a 20 20 69 6e 74  le *pFile,.  int
117d0 20 66 6c 61 67 73 2c 0a 20 20 69 6e 74 20 2a 70   flags,.  int *p
117e0 4f 75 74 46 6c 61 67 73 0a 29 7b 0a 20 20 69 6e  OutFlags.){.  in
117f0 74 20 66 64 20 3d 20 30 3b 20 20 20 20 20 20 20  t fd = 0;       
11800 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11810 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
11820 72 65 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e  returned by open
11830 28 29 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66  () */.  int dirf
11840 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  d = -1;         
11850 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74         /* Direct
11860 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  ory file descrip
11870 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 6c  tor */.  int ofl
11880 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ags = 0;        
11890 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
118a0 20 74 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e   to pass to open
118b0 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70  () */.  int eTyp
118c0 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46  e = flags&0xFFFF
118d0 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f  FF00;  /* Type o
118e0 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  f file to open *
118f0 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75  /..  int isExclu
11900 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26  sive  = (flags &
11910 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
11920 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69  LUSIVE);.  int i
11930 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66  sDelete     = (f
11940 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
11950 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
11960 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74  );.  int isCreat
11970 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26  e     = (flags &
11980 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
11990 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65  ATE);.  int isRe
119a0 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67  adonly   = (flag
119b0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
119c0 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74  READONLY);.  int
119d0 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d 20   isReadWrite  = 
119e0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
119f0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b  OPEN_READWRITE);
11a00 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69  ..  /* If creati
11a10 6e 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d  ng a master or m
11a20 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c  ain-file journal
11a30 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
11a40 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61  will open.  ** a
11a50 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
11a60 20 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72   on the director
11a70 79 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74  y too. The first
11a80 20 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29   time unixSync()
11a90 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  .  ** is called 
11aa0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69  the directory fi
11ab0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69  le descriptor wi
11ac0 6c 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64 20  ll be fsync()ed 
11ad0 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20  and close()d..  
11ae0 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 44  */.  int isOpenD
11af0 69 72 65 63 74 6f 72 79 20 3d 20 28 69 73 43 72  irectory = (isCr
11b00 65 61 74 65 20 26 26 20 0a 20 20 20 20 20 20 28  eate && .      (
11b10 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
11b20 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
11b30 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  L || eType==SQLI
11b40 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
11b50 52 4e 41 4c 29 0a 20 20 29 3b 0a 0a 20 20 2f 2a  RNAL).  );..  /*
11b60 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f   Check the follo
11b70 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
11b80 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a  are true: .  **.
11b90 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74    **   (a) Exact
11ba0 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45  ly one of the RE
11bb0 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44  ADWRITE and READ
11bc0 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20  ONLY flags must 
11bd0 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a  be set, and .  *
11be0 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54  *   (b) if CREAT
11bf0 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52  E is set, then R
11c00 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c  EADWRITE must al
11c10 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20  so be set, and. 
11c20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43   **   (c) if EXC
11c30 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74  LUSIVE is set, t
11c40 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
11c50 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
11c60 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54  *   (d) if DELET
11c70 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c  EONCLOSE is set,
11c80 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
11c90 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
11ca0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73   */.  assert((is
11cb0 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69  Readonly==0 || i
11cc0 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26  sReadWrite==0) &
11cd0 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c  & (isReadWrite |
11ce0 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a  | isReadonly));.
11cf0 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74    assert(isCreat
11d00 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  e==0 || isReadWr
11d10 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ite);.  assert(i
11d20 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c  sExclusive==0 ||
11d30 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73   isCreate);.  as
11d40 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30  sert(isDelete==0
11d50 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a   || isCreate);..
11d60 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44  .  /* The main D
11d70 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c  B, main journal,
11d80 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72   and master jour
11d90 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 61 75  nal are never au
11da0 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a  tomatically.  **
11db0 20 64 65 6c 65 74 65 64 0a 20 20 2a 2f 0a 20 20   deleted.  */.  
11dc0 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 53  assert( eType!=S
11dd0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
11de0 44 42 20 7c 7c 20 21 69 73 44 65 6c 65 74 65 20  DB || !isDelete 
11df0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  );.  assert( eTy
11e00 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
11e10 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20  MAIN_JOURNAL || 
11e20 21 69 73 44 65 6c 65 74 65 20 29 3b 0a 20 20 61  !isDelete );.  a
11e30 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 53 51  ssert( eType!=SQ
11e40 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
11e50 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 21 69 73 44  _JOURNAL || !isD
11e60 65 6c 65 74 65 20 29 3b 0a 0a 20 20 2f 2a 20 41  elete );..  /* A
11e70 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 75  ssert that the u
11e80 70 70 65 72 20 6c 61 79 65 72 20 68 61 73 20 73  pper layer has s
11e90 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66  et one of the "f
11ea0 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e  ile-type" flags.
11eb0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54   */.  assert( eT
11ec0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
11ed0 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c  _MAIN_DB      ||
11ee0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
11ef0 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20  PEN_TEMP_DB .   
11f00 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
11f10 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
11f20 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d  OURNAL || eType=
11f30 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  =SQLITE_OPEN_TEM
11f40 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  P_JOURNAL .     
11f50 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
11f60 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
11f70 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53  AL   || eType==S
11f80 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
11f90 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  R_JOURNAL .     
11fa0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
11fb0 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e  TE_OPEN_TRANSIEN
11fc0 54 5f 44 42 0a 20 20 29 3b 0a 0a 20 20 69 66 28  T_DB.  );..  if(
11fd0 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f   isReadonly )  o
11fe0 66 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c  flags |= O_RDONL
11ff0 59 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 57  Y;.  if( isReadW
12000 72 69 74 65 20 29 20 6f 66 6c 61 67 73 20 7c 3d  rite ) oflags |=
12010 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66 28 20 69   O_RDWR;.  if( i
12020 73 43 72 65 61 74 65 20 29 20 20 20 20 6f 66 6c  sCreate )    ofl
12030 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a  ags |= O_CREAT;.
12040 20 20 69 66 28 20 69 73 45 78 63 6c 75 73 69 76    if( isExclusiv
12050 65 20 29 20 6f 66 6c 61 67 73 20 7c 3d 20 28 4f  e ) oflags |= (O
12060 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57  _EXCL|O_NOFOLLOW
12070 29 3b 0a 20 20 6f 66 6c 61 67 73 20 7c 3d 20 28  );.  oflags |= (
12080 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49  O_LARGEFILE|O_BI
12090 4e 41 52 59 29 3b 0a 0a 20 20 6d 65 6d 73 65 74  NARY);..  memset
120a0 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f  (pFile, 0, sizeo
120b0 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20  f(unixFile));.  
120c0 66 64 20 3d 20 6f 70 65 6e 28 7a 50 61 74 68 2c  fd = open(zPath,
120d0 20 6f 66 6c 61 67 73 2c 20 69 73 44 65 6c 65 74   oflags, isDelet
120e0 65 3f 30 36 30 30 3a 53 51 4c 49 54 45 5f 44 45  e?0600:SQLITE_DE
120f0 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
12100 53 53 49 4f 4e 53 29 3b 0a 20 20 69 66 28 20 66  SSIONS);.  if( f
12110 64 3c 30 20 26 26 20 65 72 72 6e 6f 21 3d 45 49  d<0 && errno!=EI
12120 53 44 49 52 20 26 26 20 69 73 52 65 61 64 57 72  SDIR && isReadWr
12130 69 74 65 20 26 26 20 21 69 73 45 78 63 6c 75 73  ite && !isExclus
12140 69 76 65 20 29 7b 0a 20 20 20 20 2f 2a 20 46 61  ive ){.    /* Fa
12150 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65  iled to open the
12160 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2f 77   file for read/w
12170 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 72 79  rite access. Try
12180 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20   read-only. */. 
12190 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51     flags &= ~(SQ
121a0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
121b0 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
121c0 43 52 45 41 54 45 29 3b 0a 20 20 20 20 66 6c 61  CREATE);.    fla
121d0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
121e0 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  N_READONLY;.    
121f0 72 65 74 75 72 6e 20 75 6e 69 78 4f 70 65 6e 28  return unixOpen(
12200 70 56 66 73 2c 20 7a 50 61 74 68 2c 20 70 46 69  pVfs, zPath, pFi
12210 6c 65 2c 20 66 6c 61 67 73 2c 20 70 4f 75 74 46  le, flags, pOutF
12220 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  lags);.  }.  if(
12230 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 72 65 74   fd<0 ){.    ret
12240 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
12250 50 45 4e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  PEN;.  }.  if( i
12260 73 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 75  sDelete ){.    u
12270 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3b 0a 20 20  nlink(zPath);.  
12280 7d 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67  }.  if( pOutFlag
12290 73 20 29 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c  s ){.    *pOutFl
122a0 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d  ags = flags;.  }
122b0 0a 0a 20 20 61 73 73 65 72 74 28 66 64 21 3d 30  ..  assert(fd!=0
122c0 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 44  );.  if( isOpenD
122d0 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20  irectory ){.    
122e0 69 6e 74 20 72 63 20 3d 20 6f 70 65 6e 44 69 72  int rc = openDir
122f0 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 64  ectory(zPath, &d
12300 69 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72  irfd);.    if( r
12310 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12320 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b        close(fd);
12330 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
12340 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
12350 74 75 72 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46  turn fillInUnixF
12360 69 6c 65 28 66 64 2c 20 64 69 72 66 64 2c 20 70  ile(fd, dirfd, p
12370 46 69 6c 65 2c 20 7a 50 61 74 68 29 3b 0a 7d 0a  File, zPath);.}.
12380 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
12390 65 20 66 69 6c 65 20 61 74 20 7a 50 61 74 68 2e  e file at zPath.
123a0 20 49 66 20 74 68 65 20 64 69 72 53 79 6e 63 20   If the dirSync 
123b0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65  argument is true
123c0 2c 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65  , fsync().** the
123d0 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72   directory after
123e0 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69   deleting the fi
123f0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
12400 74 20 75 6e 69 78 44 65 6c 65 74 65 28 73 71 6c  t unixDelete(sql
12410 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
12420 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
12430 68 2c 20 69 6e 74 20 64 69 72 53 79 6e 63 29 7b  h, int dirSync){
12440 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
12450 54 45 5f 4f 4b 3b 0a 20 20 53 69 6d 75 6c 61 74  TE_OK;.  Simulat
12460 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
12470 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
12480 45 54 45 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28 7a  ETE);.  unlink(z
12490 50 61 74 68 29 3b 0a 20 20 69 66 28 20 64 69 72  Path);.  if( dir
124a0 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 6e 74 20  Sync ){.    int 
124b0 66 64 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65  fd;.    rc = ope
124c0 6e 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68  nDirectory(zPath
124d0 2c 20 26 66 64 29 3b 0a 20 20 20 20 69 66 28 20  , &fd);.    if( 
124e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
124f0 0a 20 20 20 20 20 20 69 66 28 20 66 73 79 6e 63  .      if( fsync
12500 28 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (fd) ){.        
12510 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
12520 52 5f 44 49 52 5f 46 53 59 4e 43 3b 0a 20 20 20  R_DIR_FSYNC;.   
12530 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 6f 73 65     }.      close
12540 28 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (fd);.    }.  }.
12550 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12560 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 65  /*.** Test the e
12570 78 69 73 74 61 6e 63 65 20 6f 66 20 6f 72 20 61  xistance of or a
12580 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e  ccess permission
12590 73 20 6f 66 20 66 69 6c 65 20 7a 50 61 74 68 2e  s of file zPath.
125a0 20 54 68 65 0a 2a 2a 20 74 65 73 74 20 70 65 72   The.** test per
125b0 66 6f 72 6d 65 64 20 64 65 70 65 6e 64 73 20 6f  formed depends o
125c0 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 66  n the value of f
125d0 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lags:.**.**     
125e0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
125f0 49 53 54 53 3a 20 52 65 74 75 72 6e 20 31 20 69  ISTS: Return 1 i
12600 66 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74  f the file exist
12610 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  s.**     SQLITE_
12620 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
12630 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  : Return 1 if th
12640 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 20 61  e file is read a
12650 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2a 20  nd writable..** 
12660 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53      SQLITE_ACCES
12670 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74 75  S_READONLY: Retu
12680 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65  rn 1 if the file
12690 20 69 73 20 72 65 61 64 61 62 6c 65 2e 0a 2a 2a   is readable..**
126a0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 72 65  .** Otherwise re
126b0 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
126c0 63 20 69 6e 74 20 75 6e 69 78 41 63 63 65 73 73  c int unixAccess
126d0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
126e0 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  fs, const char *
126f0 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c 61 67 73  zPath, int flags
12700 29 7b 0a 20 20 69 6e 74 20 61 6d 6f 64 65 20 3d  ){.  int amode =
12710 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c   0;.  switch( fl
12720 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ags ){.    case 
12730 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
12740 49 53 54 53 3a 0a 20 20 20 20 20 20 61 6d 6f 64  ISTS:.      amod
12750 65 20 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20 20 20  e = F_OK;.      
12760 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
12770 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
12780 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20 61  ADWRITE:.      a
12790 6d 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b  mode = W_OK|R_OK
127a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
127b0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
127c0 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20  CCESS_READ:.    
127d0 20 20 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b 0a    amode = R_OK;.
127e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
127f0 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
12800 20 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69   assert(!"Invali
12810 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74  d flags argument
12820 22 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ");.  }.  return
12830 20 28 61 63 63 65 73 73 28 7a 50 61 74 68 2c 20   (access(zPath, 
12840 61 6d 6f 64 65 29 3d 3d 30 29 3b 0a 7d 0a 0a 2f  amode)==0);.}../
12850 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65  *.** Create a te
12860 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  mporary file nam
12870 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66  e in zBuf.  zBuf
12880 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74   must be allocat
12890 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  ed.** by the cal
128a0 6c 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64  ling process and
128b0 20 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f   must be big eno
128c0 75 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c  ugh to hold at l
128d0 65 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78  east.** pVfs->mx
128e0 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a  Pathname bytes..
128f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
12900 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 73 71  ixGetTempname(sq
12910 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
12920 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
12930 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63  *zBuf){.  static
12940 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44   const char *azD
12950 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30  irs[] = {.     0
12960 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70  ,.     "/var/tmp
12970 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f 74 6d  ",.     "/usr/tm
12980 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c  p",.     "/tmp",
12990 0a 20 20 20 20 20 22 2e 22 2c 0a 20 20 7d 3b 0a  .     ".",.  };.
129a0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
129b0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 43 68  nsigned char zCh
129c0 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63  ars[] =.    "abc
129d0 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
129e0 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42  tuvwxyz".    "AB
129f0 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
12a00 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30  STUVWXYZ".    "0
12a10 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 69 6e  123456789";.  in
12a20 74 20 69 2c 20 6a 3b 0a 20 20 73 74 72 75 63 74  t i, j;.  struct
12a30 20 73 74 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e   stat buf;.  con
12a40 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20  st char *zDir = 
12a50 22 2e 22 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20  ".";..  /* It's 
12a60 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
12a70 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
12a80 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
12a90 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
12aa0 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
12ab0 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
12ac0 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
12ad0 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
12ae0 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
12af0 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20  failing. .  */. 
12b00 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
12b10 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
12b20 45 52 52 4f 52 20 29 3b 0a 0a 20 20 61 7a 44 69  ERROR );..  azDi
12b30 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f  rs[0] = sqlite3_
12b40 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a  temp_directory;.
12b50 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
12b60 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65  eof(azDirs)/size
12b70 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 69  of(azDirs[0]); i
12b80 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 7a 44  ++){.    if( azD
12b90 69 72 73 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74  irs[i]==0 ) cont
12ba0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 74  inue;.    if( st
12bb0 61 74 28 61 7a 44 69 72 73 5b 69 5d 2c 20 26 62  at(azDirs[i], &b
12bc0 75 66 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  uf) ) continue;.
12bd0 20 20 20 20 69 66 28 20 21 53 5f 49 53 44 49 52      if( !S_ISDIR
12be0 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20  (buf.st_mode) ) 
12bf0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
12c00 28 20 61 63 63 65 73 73 28 61 7a 44 69 72 73 5b  ( access(azDirs[
12c10 69 5d 2c 20 30 37 29 20 29 20 63 6f 6e 74 69 6e  i], 07) ) contin
12c20 75 65 3b 0a 20 20 20 20 7a 44 69 72 20 3d 20 61  ue;.    zDir = a
12c30 7a 44 69 72 73 5b 69 5d 3b 0a 20 20 20 20 62 72  zDirs[i];.    br
12c40 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  eak;.  }..  /* C
12c50 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6f 75  heck that the ou
12c60 74 70 75 74 20 62 75 66 66 65 72 20 69 73 20 6c  tput buffer is l
12c70 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20  arge enough for 
12c80 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  the temporary fi
12c90 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49  le .  ** name. I
12ca0 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 72 65 74  f it is not, ret
12cb0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
12cc0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 73 74  ..  */.  if( (st
12cd0 72 6c 65 6e 28 7a 44 69 72 29 20 2b 20 73 74 72  rlen(zDir) + str
12ce0 6c 65 6e 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f  len(SQLITE_TEMP_
12cf0 46 49 4c 45 5f 50 52 45 46 49 58 29 20 2b 20 31  FILE_PREFIX) + 1
12d00 37 29 20 3e 3d 20 6e 42 75 66 20 29 7b 0a 20 20  7) >= nBuf ){.  
12d10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12d20 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f  ERROR;.  }..  do
12d30 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 56  {.    assert( pV
12d40 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d  fs->mxPathname==
12d50 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a  MAX_PATHNAME );.
12d60 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
12d70 69 6e 74 66 28 6e 42 75 66 2d 31 37 2c 20 7a 42  intf(nBuf-17, zB
12d80 75 66 2c 20 22 25 73 2f 22 53 51 4c 49 54 45 5f  uf, "%s/"SQLITE_
12d90 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
12da0 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d  , zDir);.    j =
12db0 20 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20   strlen(zBuf);. 
12dc0 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
12dd0 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b  mness(15, &zBuf[
12de0 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  j]);.    for(i=0
12df0 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b  ; i<15; i++, j++
12e00 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 6a 5d  ){.      zBuf[j]
12e10 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b   = (char)zChars[
12e20 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72   ((unsigned char
12e30 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f  )zBuf[j])%(sizeo
12e40 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a  f(zChars)-1) ];.
12e50 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6a      }.    zBuf[j
12e60 5d 20 3d 20 30 3b 0a 20 20 7d 77 68 69 6c 65 28  ] = 0;.  }while(
12e70 20 61 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d   access(zBuf,0)=
12e80 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  =0 );.  return S
12e90 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
12ea0 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74  .** Turn a relat
12eb0 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74  ive pathname int
12ec0 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  o a full pathnam
12ed0 65 2e 20 54 68 65 20 72 65 6c 61 74 69 76 65 20  e. The relative 
12ee0 70 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f 72 65  path.** is store
12ef0 64 20 61 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69  d as a nul-termi
12f00 6e 61 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20  nated string in 
12f10 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
12f20 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50 61 74  ed to by.** zPat
12f30 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70  h. .**.** zOut p
12f40 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65  oints to a buffe
12f50 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 73 71  r of at least sq
12f60 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68  lite3_vfs.mxPath
12f70 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a 20 28  name bytes .** (
12f80 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20 4d 41  in this case, MA
12f90 58 5f 50 41 54 48 4e 41 4d 45 20 62 79 74 65 73  X_PATHNAME bytes
12fa0 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61 74 68  ). The full-path
12fb0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a   is written to.*
12fc0 2a 20 74 68 69 73 20 62 75 66 66 65 72 20 62 65  * this buffer be
12fd0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
12fe0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
12ff0 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a  ixFullPathname(.
13000 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
13010 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  Vfs,            
13020 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66  /* Pointer to vf
13030 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f  s object */.  co
13040 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
13050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
13060 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65  ossibly relative
13070 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20   input path */. 
13080 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20 20   int nOut,      
13090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
130a0 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74  * Size of output
130b0 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73   buffer in bytes
130c0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74   */.  char *zOut
130d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130e0 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75      /* Output bu
130f0 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a  ffer */.){..  /*
13100 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d   It's odd to sim
13110 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f  ulate an io-erro
13120 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c  r here, but real
13130 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a  ly this is just.
13140 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69    ** using the i
13150 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72  o-error infrastr
13160 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74  ucture to test t
13170 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c  hat SQLite handl
13180 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  es this.  ** fun
13190 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54  ction failing. T
131a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75  his function cou
131b0 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20  ld fail if, for 
131c0 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a  example, the.  *
131d0 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e  * current workin
131e0 67 20 64 69 72 65 63 74 6c 79 20 68 61 73 20 62  g directly has b
131f0 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20  een unlinked..  
13200 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
13210 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
13220 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20  ITE_ERROR );..  
13230 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e 6d 78  assert( pVfs->mx
13240 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41  Pathname==MAX_PA
13250 54 48 4e 41 4d 45 20 29 3b 0a 20 20 7a 4f 75 74  THNAME );.  zOut
13260 5b 6e 4f 75 74 2d 31 5d 20 3d 20 27 5c 30 27 3b  [nOut-1] = '\0';
13270 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d  .  if( zPath[0]=
13280 3d 27 2f 27 20 29 7b 0a 20 20 20 20 73 71 6c 69  ='/' ){.    sqli
13290 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75  te3_snprintf(nOu
132a0 74 2c 20 7a 4f 75 74 2c 20 22 25 73 22 2c 20 7a  t, zOut, "%s", z
132b0 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Path);.  }else{.
132c0 20 20 20 20 69 6e 74 20 6e 43 77 64 3b 0a 20 20      int nCwd;.  
132d0 20 20 69 66 28 20 67 65 74 63 77 64 28 7a 4f 75    if( getcwd(zOu
132e0 74 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30 20 29 7b  t, nOut-1)==0 ){
132f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
13300 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
13310 20 20 20 7d 0a 20 20 20 20 6e 43 77 64 20 3d 20     }.    nCwd = 
13320 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20 20  strlen(zOut);.  
13330 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
13340 74 66 28 6e 4f 75 74 2d 6e 43 77 64 2c 20 26 7a  tf(nOut-nCwd, &z
13350 4f 75 74 5b 6e 43 77 64 5d 2c 20 22 2f 25 73 22  Out[nCwd], "/%s"
13360 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20  , zPath);.  }.  
13370 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13380 3b 0a 0a 23 69 66 20 30 0a 20 20 2f 2a 0a 20 20  ;..#if 0.  /*.  
13390 2a 2a 20 52 65 6d 6f 76 65 20 22 2f 2e 2f 22 20  ** Remove "/./" 
133a0 70 61 74 68 20 65 6c 65 6d 65 6e 74 73 20 61 6e  path elements an
133b0 64 20 63 6f 6e 76 65 72 74 20 22 2f 41 2f 2e 2f  d convert "/A/./
133c0 22 20 70 61 74 68 20 65 6c 65 6d 65 6e 74 73 0a  " path elements.
133d0 20 20 2a 2a 20 74 6f 20 6a 75 73 74 20 22 2f 22    ** to just "/"
133e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 75  ..  */.  if( zFu
133f0 6c 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c  ll ){.    int i,
13400 20 6a 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d   j;.    for(i=j=
13410 30 3b 20 7a 46 75 6c 6c 5b 69 5d 3b 20 69 2b 2b  0; zFull[i]; i++
13420 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 46 75  ){.      if( zFu
13430 6c 6c 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  ll[i]=='/' ){.  
13440 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 5b        if( zFull[
13450 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74  i+1]=='/' ) cont
13460 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
13470 28 20 7a 46 75 6c 6c 5b 69 2b 31 5d 3d 3d 27 2e  ( zFull[i+1]=='.
13480 27 20 26 26 20 7a 46 75 6c 6c 5b 69 2b 32 5d 3d  ' && zFull[i+2]=
13490 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='/' ){.        
134a0 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20    i += 1;.      
134b0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
134c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
134d0 69 66 28 20 7a 46 75 6c 6c 5b 69 2b 31 5d 3d 3d  if( zFull[i+1]==
134e0 27 2e 27 20 26 26 20 7a 46 75 6c 6c 5b 69 2b 32  '.' && zFull[i+2
134f0 5d 3d 3d 27 2e 27 20 26 26 20 7a 46 75 6c 6c 5b  ]=='.' && zFull[
13500 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  i+3]=='/' ){.   
13510 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e         while( j>
13520 30 20 26 26 20 7a 46 75 6c 6c 5b 6a 2d 31 5d 21  0 && zFull[j-1]!
13530 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20  ='/' ){ j--; }. 
13540 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 33 3b           i += 3;
13550 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
13560 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
13570 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 46 75       }.      zFu
13580 6c 6c 5b 6a 2b 2b 5d 20 3d 20 7a 46 75 6c 6c 5b  ll[j++] = zFull[
13590 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46  i];.    }.    zF
135a0 75 6c 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 0a  ull[j] = 0;.  }.
135b0 23 65 6e 64 69 66 0a 7d 0a 0a 0a 23 69 66 6e 64  #endif.}...#ifnd
135c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
135d0 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a  OAD_EXTENSION./*
135e0 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66  .** Interfaces f
135f0 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61  or opening a sha
13600 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e  red library, fin
13610 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74  ding entry point
13620 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  s.** within the 
13630 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
13640 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  and closing the 
13650 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a  shared library..
13660 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66  */.#include <dlf
13670 63 6e 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f 69  cn.h>.static voi
13680 64 20 2a 75 6e 69 78 44 6c 4f 70 65 6e 28 73 71  d *unixDlOpen(sq
13690 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
136a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
136b0 6c 65 6e 61 6d 65 29 7b 0a 20 20 72 65 74 75 72  lename){.  retur
136c0 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61  n dlopen(zFilena
136d0 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52  me, RTLD_NOW | R
136e0 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a  TLD_GLOBAL);.}..
136f0 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 61 6c  /*.** SQLite cal
13700 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ls this function
13710 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
13720 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 75 6e 69  er a call to uni
13730 78 44 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a 20 75  xDlSym() or.** u
13740 6e 69 78 44 6c 4f 70 65 6e 28 29 20 66 61 69 6c  nixDlOpen() fail
13750 73 20 28 72 65 74 75 72 6e 73 20 61 20 6e 75 6c  s (returns a nul
13760 6c 20 70 6f 69 6e 74 65 72 29 2e 20 49 66 20 61  l pointer). If a
13770 20 6d 6f 72 65 20 64 65 74 61 69 6c 65 64 20 65   more detailed e
13780 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20  rror.** message 
13790 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 69 74  is available, it
137a0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 7a   is written to z
137b0 42 75 66 4f 75 74 2e 20 49 66 20 6e 6f 20 65 72  BufOut. If no er
137c0 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69  ror message.** i
137d0 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 7a 42 75  s available, zBu
137e0 66 4f 75 74 20 69 73 20 6c 65 66 74 20 75 6e 6d  fOut is left unm
137f0 6f 64 69 66 69 65 64 20 61 6e 64 20 53 51 4c 69  odified and SQLi
13800 74 65 20 75 73 65 73 20 61 20 64 65 66 61 75 6c  te uses a defaul
13810 74 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61  t.** error messa
13820 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
13830 69 64 20 75 6e 69 78 44 6c 45 72 72 6f 72 28 73  id unixDlError(s
13840 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
13850 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
13860 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63 68   *zBufOut){.  ch
13870 61 72 20 2a 7a 45 72 72 3b 0a 20 20 65 6e 74 65  ar *zErr;.  ente
13880 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a 45 72 72  rMutex();.  zErr
13890 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b 0a 20 20   = dlerror();.  
138a0 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20  if( zErr ){.    
138b0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
138c0 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 2c 20  (nBuf, zBufOut, 
138d0 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20 20 7d  "%s", zErr);.  }
138e0 0a 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b  .  leaveMutex();
138f0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  .}.static void *
13900 75 6e 69 78 44 6c 53 79 6d 28 73 71 6c 69 74 65  unixDlSym(sqlite
13910 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69  3_vfs *pVfs, voi
13920 64 20 2a 70 48 61 6e 64 6c 65 2c 20 63 6f 6e 73  d *pHandle, cons
13930 74 20 63 68 61 72 20 2a 7a 53 79 6d 62 6f 6c 29  t char *zSymbol)
13940 7b 0a 20 20 72 65 74 75 72 6e 20 64 6c 73 79 6d  {.  return dlsym
13950 28 70 48 61 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f  (pHandle, zSymbo
13960 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  l);.}.static voi
13970 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73 71  d unixDlClose(sq
13980 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
13990 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b   void *pHandle){
139a0 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64  .  dlclose(pHand
139b0 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20  le);.}.#else /* 
139c0 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  if SQLITE_OMIT_L
139d0 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73  OAD_EXTENSION is
139e0 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23   defined: */.  #
139f0 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70 65  define unixDlOpe
13a00 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75  n  0.  #define u
13a10 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a 20 20 23  nixDlError 0.  #
13a20 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 53 79 6d  define unixDlSym
13a30 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75     0.  #define u
13a40 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e  nixDlClose 0.#en
13a50 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  dif../*.** Write
13a60 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 72   nBuf bytes of r
13a70 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f 20 74 68  andom data to th
13a80 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66 65  e supplied buffe
13a90 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69  r zBuf..*/.stati
13aa0 63 20 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f 6d  c int unixRandom
13ab0 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73  ness(sqlite3_vfs
13ac0 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
13ad0 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 0a  , char *zBuf){..
13ae0 20 20 61 73 73 65 72 74 28 6e 42 75 66 3e 3d 28    assert(nBuf>=(
13af0 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29 2b 73  sizeof(time_t)+s
13b00 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a 0a 20  izeof(int)));.. 
13b10 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20 69   /* We have to i
13b20 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20 74  nitialize zBuf t
13b30 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72 69  o prevent valgri
13b40 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e  nd from reportin
13b50 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20  g.  ** errors.  
13b60 54 68 65 20 72 65 70 6f 72 74 73 20 69 73 73 75  The reports issu
13b70 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20 61  ed by valgrind a
13b80 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20 77  re incorrect - w
13b90 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65  e would.  ** pre
13ba0 66 65 72 20 74 68 61 74 20 74 68 65 20 72 61 6e  fer that the ran
13bb0 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72 65  domness be incre
13bc0 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20 75  ased by making u
13bd0 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75  se of the.  ** u
13be0 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61  ninitialized spa
13bf0 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75 74  ce in zBuf - but
13c00 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 73   valgrind errors
13c10 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20   tend to worry. 
13c20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e 20   ** some users. 
13c30 20 52 61 74 68 65 72 20 74 68 61 6e 20 61 72 67   Rather than arg
13c40 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61 73  ue, it seems eas
13c50 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69 74  ier just to init
13c60 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20  ialize.  ** the 
13c70 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64 20  whole array and 
13c80 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e 64  silence valgrind
13c90 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  , even if that m
13ca0 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d  eans less random
13cb0 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ness.  ** in the
13cc0 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20   random seed..  
13cd0 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65 73  **.  ** When tes
13ce0 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69  ting, initializi
13cf0 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72  ng zBuf[] to zer
13d00 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20  o is all we do. 
13d10 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a   That means.  **
13d20 20 74 68 61 74 20 77 65 20 61 6c 77 61 79 73 20   that we always 
13d30 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 61 6e  use the same ran
13d40 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75 65  dom number seque
13d50 6e 63 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73  nce.  This makes
13d60 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73 20   the.  ** tests 
13d70 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f  repeatable..  */
13d80 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20  .  memset(zBuf, 
13d90 30 2c 20 6e 42 75 66 29 3b 0a 23 69 66 20 21 64  0, nBuf);.#if !d
13da0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
13db0 53 54 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ST).  {.    int 
13dc0 70 69 64 2c 20 66 64 3b 0a 20 20 20 20 66 64 20  pid, fd;.    fd 
13dd0 3d 20 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61  = open("/dev/ura
13de0 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29  ndom", O_RDONLY)
13df0 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29  ;.    if( fd<0 )
13e00 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74 20 74  {.      time_t t
13e10 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26 74 29  ;.      time(&t)
13e20 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
13e30 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28  Buf, &t, sizeof(
13e40 74 29 29 3b 0a 20 20 20 20 20 20 70 69 64 20 3d  t));.      pid =
13e50 20 67 65 74 70 69 64 28 29 3b 0a 20 20 20 20 20   getpid();.     
13e60 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69   memcpy(&zBuf[si
13e70 7a 65 6f 66 28 74 29 5d 2c 20 26 70 69 64 2c 20  zeof(t)], &pid, 
13e80 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20  sizeof(pid));.  
13e90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
13ea0 65 61 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42  ead(fd, zBuf, nB
13eb0 75 66 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65  uf);.      close
13ec0 28 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (fd);.    }.  }.
13ed0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
13ee0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
13ef0 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
13f00 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
13f10 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
13f20 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
13f30 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
13f40 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
13f50 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 77  f microseconds w
13f60 65 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e  e want to sleep.
13f70 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
13f80 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62  alue is the numb
13f90 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e  er of microsecon
13fa0 64 73 20 6f 66 20 73 6c 65 65 70 20 61 63 74 75  ds of sleep actu
13fb0 61 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74 65  ally.** requeste
13fc0 64 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72  d from the under
13fd0 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20  lying operating 
13fe0 73 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72  system, a number
13ff0 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20   which.** might 
14000 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
14010 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
14020 61 72 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f  argument, but no
14030 74 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74  t less.** than t
14040 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  he argument..*/.
14050 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
14060 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73  leep(sqlite3_vfs
14070 20 2a 70 56 66 73 2c 20 69 6e 74 20 6d 69 63 72   *pVfs, int micr
14080 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 64  oseconds){.#if d
14090 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c 45  efined(HAVE_USLE
140a0 45 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c 45  EP) && HAVE_USLE
140b0 45 50 0a 20 20 75 73 6c 65 65 70 28 6d 69 63 72  EP.  usleep(micr
140c0 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20 72 65 74  oseconds);.  ret
140d0 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  urn microseconds
140e0 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 73 65  ;.#else.  int se
140f0 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73 65  conds = (microse
14100 63 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f 31 30  conds+999999)/10
14110 30 30 30 30 30 3b 0a 20 20 73 6c 65 65 70 28 73  00000;.  sleep(s
14120 65 63 6f 6e 64 73 29 3b 0a 20 20 72 65 74 75 72  econds);.  retur
14130 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30 30 30  n seconds*100000
14140 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  0;.#endif.}../*.
14150 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
14160 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65   variable, if se
14170 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  t to a non-zero 
14180 76 61 6c 75 65 2c 20 62 65 63 6f 6d 65 73 20 74  value, becomes t
14190 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 72 65 74  he result.** ret
141a0 75 72 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  urned from sqlit
141b0 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28  e3OsCurrentTime(
141c0 29 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  ).  This is used
141d0 20 66 6f 72 20 74 65 73 74 69 6e 67 2e 0a 2a 2f   for testing..*/
141e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
141f0 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
14200 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30  current_time = 0
14210 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
14220 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  Find the current
14230 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72   time (in Univer
14240 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20  sal Coordinated 
14250 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68  Time).  Write th
14260 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d  e.** current tim
14270 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20  e and date as a 
14280 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65  Julian Day numbe
14290 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e  r into *prNow an
142a0 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20  d.** return 0.  
142b0 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
142c0 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61  time and date ca
142d0 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a  nnot be found..*
142e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
142f0 78 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c  xCurrentTime(sql
14300 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
14310 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a  double *prNow){.
14320 23 69 66 64 65 66 20 4e 4f 5f 47 45 54 54 4f 44  #ifdef NO_GETTOD
14330 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74  .  time_t t;.  t
14340 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70 72 4e 6f  ime(&t);.  *prNo
14350 77 20 3d 20 74 2f 38 36 34 30 30 2e 30 20 2b 20  w = t/86400.0 + 
14360 32 34 34 30 35 38 37 2e 35 3b 0a 23 65 6c 73 65  2440587.5;.#else
14370 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 76 61  .  struct timeva
14380 6c 20 73 4e 6f 77 3b 0a 20 20 67 65 74 74 69 6d  l sNow;.  gettim
14390 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30 29  eofday(&sNow, 0)
143a0 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 32 34 34  ;.  *prNow = 244
143b0 30 35 38 37 2e 35 20 2b 20 73 4e 6f 77 2e 74 76  0587.5 + sNow.tv
143c0 5f 73 65 63 2f 38 36 34 30 30 2e 30 20 2b 20 73  _sec/86400.0 + s
143d0 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 38 36 34 30  Now.tv_usec/8640
143e0 30 30 30 30 30 30 30 2e 30 3b 0a 23 65 6e 64 69  0000000.0;.#endi
143f0 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
14400 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74  TEST.  if( sqlit
14410 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
14420 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20  ){.    *prNow = 
14430 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
14440 74 69 6d 65 2f 38 36 34 30 30 2e 30 20 2b 20 32  time/86400.0 + 2
14450 34 34 30 35 38 37 2e 35 3b 0a 20 20 7d 0a 23 65  440587.5;.  }.#e
14460 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 30 3b  ndif.  return 0;
14470 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
14480 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
14490 65 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74  e sqlite3Default
144a0 56 66 73 20 73 74 72 75 63 74 75 72 65 2e 20 20  Vfs structure.  
144b0 20 57 65 20 75 73 65 0a 2a 2a 20 61 20 66 75 6e   We use.** a fun
144c0 63 74 69 6f 6e 20 72 61 74 68 65 72 20 74 68 61  ction rather tha
144d0 6e 20 67 69 76 65 20 74 68 65 20 73 74 72 75 63  n give the struc
144e0 74 75 72 65 20 67 6c 6f 62 61 6c 20 73 63 6f 70  ture global scop
144f0 65 20 62 65 63 61 75 73 65 0a 2a 2a 20 73 6f 6d  e because.** som
14500 65 20 63 6f 6d 70 69 6c 65 72 73 20 28 4d 53 56  e compilers (MSV
14510 43 29 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  C) do not allow 
14520 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  forward declarat
14530 69 6f 6e 73 20 6f 66 0a 2a 2a 20 69 6e 69 74 69  ions of.** initi
14540 61 6c 69 7a 65 64 20 73 74 72 75 63 74 75 72 65  alized structure
14550 73 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 66  s..*/.sqlite3_vf
14560 73 20 2a 73 71 6c 69 74 65 33 4f 73 44 65 66 61  s *sqlite3OsDefa
14570 75 6c 74 56 66 73 28 76 6f 69 64 29 7b 0a 20 20  ultVfs(void){.  
14580 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76  static sqlite3_v
14590 66 73 20 75 6e 69 78 56 66 73 20 3d 20 7b 0a 20  fs unixVfs = {. 
145a0 20 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20     1,           
145b0 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
145c0 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66  on */.    sizeof
145d0 28 75 6e 69 78 46 69 6c 65 29 2c 20 20 20 2f 2a  (unixFile),   /*
145e0 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20   szOsFile */.   
145f0 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 20   MAX_PATHNAME,  
14600 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61       /* mxPathna
14610 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  me */.    0,    
14620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14630 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 75   pNext */.    "u
14640 6e 69 78 22 2c 20 20 20 20 20 20 20 20 20 20 20  nix",           
14650 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20    /* zName */.  
14660 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
14670 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74        /* pAppDat
14680 61 20 2a 2f 0a 20 20 0a 20 20 20 20 75 6e 69 78  a */.  .    unix
14690 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
146a0 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20  /* xOpen */.    
146b0 75 6e 69 78 44 65 6c 65 74 65 2c 20 20 20 20 20  unixDelete,     
146c0 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a      /* xDelete *
146d0 2f 0a 20 20 20 20 75 6e 69 78 41 63 63 65 73 73  /.    unixAccess
146e0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63  ,         /* xAc
146f0 63 65 73 73 20 2a 2f 0a 20 20 20 20 75 6e 69 78  cess */.    unix
14700 47 65 74 54 65 6d 70 6e 61 6d 65 2c 20 20 20 20  GetTempname,    
14710 2f 2a 20 78 47 65 74 54 65 6d 70 4e 61 6d 65 20  /* xGetTempName 
14720 2a 2f 0a 20 20 20 20 75 6e 69 78 46 75 6c 6c 50  */.    unixFullP
14730 61 74 68 6e 61 6d 65 2c 20 20 20 2f 2a 20 78 46  athname,   /* xF
14740 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20  ullPathname */. 
14750 20 20 20 75 6e 69 78 44 6c 4f 70 65 6e 2c 20 20     unixDlOpen,  
14760 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65         /* xDlOpe
14770 6e 20 2a 2f 0a 20 20 20 20 75 6e 69 78 44 6c 45  n */.    unixDlE
14780 72 72 6f 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  rror,        /* 
14790 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20  xDlError */.    
147a0 75 6e 69 78 44 6c 53 79 6d 2c 20 20 20 20 20 20  unixDlSym,      
147b0 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f      /* xDlSym */
147c0 0a 20 20 20 20 75 6e 69 78 44 6c 43 6c 6f 73 65  .    unixDlClose
147d0 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43  ,        /* xDlC
147e0 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 75 6e 69 78  lose */.    unix
147f0 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20  Randomness,     
14800 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a  /* xRandomness *
14810 2f 0a 20 20 20 20 75 6e 69 78 53 6c 65 65 70 2c  /.    unixSleep,
14820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c            /* xSl
14830 65 65 70 20 2a 2f 0a 20 20 20 20 75 6e 69 78 43  eep */.    unixC
14840 75 72 72 65 6e 74 54 69 6d 65 20 20 20 20 20 2f  urrentTime     /
14850 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a  * xCurrentTime *
14860 2f 0a 20 20 7d 3b 0a 20 20 0a 20 20 72 65 74 75  /.  };.  .  retu
14870 72 6e 20 26 75 6e 69 78 56 66 73 3b 0a 7d 0a 20  rn &unixVfs;.}. 
14880 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 55 4e  .#endif /* OS_UN
14890 49 58 20 2a 2f 0a                                IX */.