/ Hex Artifact Content
Login

Artifact 4e67737fec1d1c950e9c3723b424829f7bc22fc9:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 55 6e 69 78 20 73 79 73  ific to Unix sys
01b0: 74 65 6d 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  tems..*/.#includ
01c0: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
01d0: 23 69 66 20 4f 53 5f 55 4e 49 58 20 20 20 20 20  #if OS_UNIX     
01e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
01f0: 20 66 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e   file is used on
0200: 20 75 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f   unix only */../
0210: 2a 20 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  * #define SQLITE
0220: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
0230: 53 54 59 4c 45 20 30 20 2a 2f 0a 0a 2f 2a 0a 2a  STYLE 0 */../*.*
0240: 2a 20 54 68 65 73 65 20 23 64 65 66 69 6e 65 73  * These #defines
0250: 20 73 68 6f 75 6c 64 20 65 6e 61 62 6c 65 20 3e   should enable >
0260: 32 47 42 20 66 69 6c 65 20 73 75 70 70 6f 72 74  2GB file support
0270: 20 6f 6e 20 50 6f 73 69 78 20 69 66 20 74 68 65   on Posix if the
0280: 0a 2a 2a 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f  .** underlying o
0290: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
02a0: 73 75 70 70 6f 72 74 73 20 69 74 2e 20 20 49 66  supports it.  If
02b0: 20 74 68 65 20 4f 53 20 6c 61 63 6b 73 0a 2a 2a   the OS lacks.**
02c0: 20 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70   large file supp
02d0: 6f 72 74 2c 20 74 68 65 73 65 20 73 68 6f 75 6c  ort, these shoul
02e0: 64 20 62 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2a 0a  d be no-ops..**.
02f0: 2a 2a 20 4c 61 72 67 65 20 66 69 6c 65 20 73 75  ** Large file su
0300: 70 70 6f 72 74 20 63 61 6e 20 62 65 20 64 69 73  pport can be dis
0310: 61 62 6c 65 64 20 75 73 69 6e 67 20 74 68 65 20  abled using the 
0320: 2d 44 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  -DSQLITE_DISABLE
0330: 5f 4c 46 53 20 73 77 69 74 63 68 0a 2a 2a 20 6f  _LFS switch.** o
0340: 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 63  n the compiler c
0350: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20 20 54 68  ommand line.  Th
0360: 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
0370: 69 66 20 79 6f 75 20 61 72 65 20 63 6f 6d 70 69  if you are compi
0380: 6c 69 6e 67 0a 2a 2a 20 6f 6e 20 61 20 72 65 63  ling.** on a rec
0390: 65 6e 74 20 6d 61 63 68 69 6e 65 20 28 65 78 3a  ent machine (ex:
03a0: 20 52 65 64 48 61 74 20 37 2e 32 29 20 62 75 74   RedHat 7.2) but
03b0: 20 79 6f 75 20 77 61 6e 74 20 79 6f 75 72 20 63   you want your c
03c0: 6f 64 65 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 6f  ode to work.** o
03d0: 6e 20 61 6e 20 6f 6c 64 65 72 20 6d 61 63 68 69  n an older machi
03e0: 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20 36  ne (ex: RedHat 6
03f0: 2e 30 29 2e 20 20 49 66 20 79 6f 75 20 63 6f 6d  .0).  If you com
0400: 70 69 6c 65 20 6f 6e 20 52 65 64 48 61 74 20 37  pile on RedHat 7
0410: 2e 32 0a 2a 2a 20 77 69 74 68 6f 75 74 20 74 68  .2.** without th
0420: 69 73 20 6f 70 74 69 6f 6e 2c 20 4c 46 53 20 69  is option, LFS i
0430: 73 20 65 6e 61 62 6c 65 2e 20 20 42 75 74 20 4c  s enable.  But L
0440: 46 53 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  FS does not exis
0450: 74 20 69 6e 20 74 68 65 20 6b 65 72 6e 65 6c 0a  t in the kernel.
0460: 2a 2a 20 69 6e 20 52 65 64 48 61 74 20 36 2e 30  ** in RedHat 6.0
0470: 2c 20 73 6f 20 74 68 65 20 63 6f 64 65 20 77 6f  , so the code wo
0480: 6e 27 74 20 77 6f 72 6b 2e 20 20 48 65 6e 63 65  n't work.  Hence
0490: 2c 20 66 6f 72 20 6d 61 78 69 6d 75 6d 20 62 69  , for maximum bi
04a0: 6e 61 72 79 0a 2a 2a 20 70 6f 72 74 61 62 69 6c  nary.** portabil
04b0: 69 74 79 20 79 6f 75 20 73 68 6f 75 6c 64 20 6f  ity you should o
04c0: 6d 69 74 20 4c 46 53 2e 0a 2a 2f 0a 23 69 66 6e  mit LFS..*/.#ifn
04d0: 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
04e0: 4c 45 5f 4c 46 53 0a 23 20 64 65 66 69 6e 65 20  LE_LFS.# define 
04f0: 5f 4c 41 52 47 45 5f 46 49 4c 45 20 20 20 20 20  _LARGE_FILE     
0500: 20 20 31 0a 23 20 69 66 6e 64 65 66 20 5f 46 49    1.# ifndef _FI
0510: 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 0a 23  LE_OFFSET_BITS.#
0520: 20 20 20 64 65 66 69 6e 65 20 5f 46 49 4c 45 5f     define _FILE_
0530: 4f 46 46 53 45 54 5f 42 49 54 53 20 36 34 0a 23  OFFSET_BITS 64.#
0540: 20 65 6e 64 69 66 0a 23 20 64 65 66 69 6e 65 20   endif.# define 
0550: 5f 4c 41 52 47 45 46 49 4c 45 5f 53 4f 55 52 43  _LARGEFILE_SOURC
0560: 45 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  E 1.#endif../*.*
0570: 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 63 6c 75  * standard inclu
0580: 64 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a 23 69 6e  de files..*/.#in
0590: 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73  clude <sys/types
05a0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
05b0: 73 2f 73 74 61 74 2e 68 3e 0a 23 69 6e 63 6c 75  s/stat.h>.#inclu
05c0: 64 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 69 6e  de <fcntl.h>.#in
05d0: 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e  clude <unistd.h>
05e0: 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e  .#include <time.
05f0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
0600: 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  /time.h>.#includ
0610: 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69 66 64  e <errno.h>.#ifd
0620: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
0630: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23  _LOCKING_STYLE.#
0640: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63  include <sys/ioc
0650: 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  tl.h>.#include <
0660: 73 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 69 6e  sys/param.h>.#in
0670: 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6f 75 6e 74  clude <sys/mount
0680: 2e 68 3e 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .h>.#endif /* SQ
0690: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
06a0: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a  ING_STYLE */../*
06b0: 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 74 6f  .** If we are to
06c0: 20 62 65 20 74 68 72 65 61 64 2d 73 61 66 65 2c   be thread-safe,
06d0: 20 69 6e 63 6c 75 64 65 20 74 68 65 20 70 74 68   include the pth
06e0: 72 65 61 64 73 20 68 65 61 64 65 72 20 61 6e 64  reads header and
06f0: 20 64 65 66 69 6e 65 0a 2a 2a 20 74 68 65 20 53   define.** the S
0700: 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41  QLITE_UNIX_THREA
0710: 44 53 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66  DS macro..*/.#if
0720: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
0730: 46 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 70 74  FE.# include <pt
0740: 68 72 65 61 64 2e 68 3e 0a 23 20 64 65 66 69 6e  hread.h>.# defin
0750: 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48  e SQLITE_UNIX_TH
0760: 52 45 41 44 53 20 31 0a 23 65 6e 64 69 66 0a 0a  READS 1.#endif..
0770: 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 70 65  /*.** Default pe
0780: 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63  rmissions when c
0790: 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 66 69  reating a new fi
07a0: 6c 65 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  le.*/.#ifndef SQ
07b0: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
07c0: 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20  E_PERMISSIONS.# 
07d0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 45  define SQLITE_DE
07e0: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
07f0: 53 53 49 4f 4e 53 20 30 36 34 34 0a 23 65 6e 64  SSIONS 0644.#end
0800: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75  if../*.** Maximu
0810: 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 74 68  m supported path
0820: 2d 6c 65 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65 66  -length..*/.#def
0830: 69 6e 65 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ine MAX_PATHNAME
0840: 20 35 31 32 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   512.../*.** The
0850: 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
0860: 75 72 65 20 69 73 20 73 75 62 63 6c 61 73 73 20  ure is subclass 
0870: 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  of sqlite3_file 
0880: 73 70 65 63 69 66 69 63 20 66 6f 72 20 74 68 65  specific for the
0890: 20 75 6e 69 78 0a 2a 2a 20 70 72 6f 74 61 62 69   unix.** protabi
08a0: 6c 69 74 79 20 6c 61 79 65 72 2e 0a 2a 2f 0a 74  lity layer..*/.t
08b0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e  ypedef struct un
08c0: 69 78 46 69 6c 65 20 75 6e 69 78 46 69 6c 65 3b  ixFile unixFile;
08d0: 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65  .struct unixFile
08e0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f   {.  sqlite3_io_
08f0: 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70  methods const *p
0900: 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c 77 61  Method;  /* Alwa
0910: 79 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  ys the first ent
0920: 72 79 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ry */.#ifdef SQL
0930: 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e  ITE_TEST.  /* In
0940: 20 74 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72   test mode, incr
0950: 65 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66  ease the size of
0960: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
0970: 61 20 62 69 74 20 73 6f 20 74 68 61 74 20 0a 20  a bit so that . 
0980: 20 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72   ** it is larger
0990: 20 74 68 61 6e 20 74 68 65 20 73 74 72 75 63 74   than the struct
09a0: 20 43 72 61 73 68 46 69 6c 65 20 64 65 66 69 6e   CrashFile defin
09b0: 65 64 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20  ed in test6.c.. 
09c0: 20 2a 2f 0a 20 20 63 68 61 72 20 61 50 61 64 64   */.  char aPadd
09d0: 69 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a  ing[32];.#endif.
09e0: 20 20 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74    struct openCnt
09f0: 20 2a 70 4f 70 65 6e 3b 20 20 20 20 2f 2a 20 49   *pOpen;    /* I
0a00: 6e 66 6f 20 61 62 6f 75 74 20 61 6c 6c 20 6f 70  nfo about all op
0a10: 65 6e 20 66 64 27 73 20 6f 6e 20 74 68 69 73 20  en fd's on this 
0a20: 69 6e 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63  inode */.  struc
0a30: 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63  t lockInfo *pLoc
0a40: 6b 3b 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f  k;   /* Info abo
0a50: 75 74 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 69 73  ut locks on this
0a60: 20 69 6e 6f 64 65 20 2a 2f 0a 23 69 66 64 65 66   inode */.#ifdef
0a70: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
0a80: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 76  OCKING_STYLE.  v
0a90: 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oid *lockingCont
0aa0: 65 78 74 3b 20 20 20 20 20 2f 2a 20 4c 6f 63 6b  ext;     /* Lock
0ab0: 69 6e 67 20 73 74 79 6c 65 20 73 70 65 63 69 66  ing style specif
0ac0: 69 63 20 73 74 61 74 65 20 2a 2f 0a 23 65 6e 64  ic state */.#end
0ad0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
0ae0: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
0af0: 45 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20  E */.  int h;   
0b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b10: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
0b20: 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 75 6e 73  criptor */.  uns
0b30: 69 67 6e 65 64 20 63 68 61 72 20 6c 6f 63 6b 74  igned char lockt
0b40: 79 70 65 3b 20 20 20 2f 2a 20 54 68 65 20 74 79  ype;   /* The ty
0b50: 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64 20  pe of lock held 
0b60: 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20 20  on this fd */.  
0b70: 69 6e 74 20 64 69 72 66 64 3b 20 20 20 20 20 20  int dirfd;      
0b80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
0b90: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
0ba0: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 2a   the directory *
0bb0: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  /.#if SQLITE_THR
0bc0: 45 41 44 53 41 46 45 0a 20 20 70 74 68 72 65 61  EADSAFE.  pthrea
0bd0: 64 5f 74 20 74 69 64 3b 20 20 20 20 20 20 20 20  d_t tid;        
0be0: 20 20 20 20 2f 2a 20 54 68 65 20 74 68 72 65 61      /* The threa
0bf0: 64 20 74 68 61 74 20 22 6f 77 6e 73 22 20 74 68  d that "owns" th
0c00: 69 73 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 23  is unixFile */.#
0c10: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
0c20: 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61  Include code tha
0c30: 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61  t is common to a
0c40: 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a  ll os_*.c files.
0c50: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f  */.#include "os_
0c60: 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a  common.h"../*.**
0c70: 20 44 65 66 69 6e 65 20 76 61 72 69 6f 75 73 20   Define various 
0c80: 6d 61 63 72 6f 73 20 74 68 61 74 20 61 72 65 20  macros that are 
0c90: 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d  missing from som
0ca0: 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69  e systems..*/.#i
0cb0: 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c  fndef O_LARGEFIL
0cc0: 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52  E.# define O_LAR
0cd0: 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a  GEFILE 0.#endif.
0ce0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
0cf0: 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65  SABLE_LFS.# unde
0d00: 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20  f O_LARGEFILE.# 
0d10: 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49  define O_LARGEFI
0d20: 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e  LE 0.#endif.#ifn
0d30: 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23  def O_NOFOLLOW.#
0d40: 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c   define O_NOFOLL
0d50: 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e  OW 0.#endif.#ifn
0d60: 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64  def O_BINARY.# d
0d70: 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30  efine O_BINARY 0
0d80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0d90: 68 65 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65  he DJGPP compile
0da0: 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f  r environment lo
0db0: 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20  oks mostly like 
0dc0: 55 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20  Unix, but it.** 
0dd0: 6c 61 63 6b 73 20 74 68 65 20 66 63 6e 74 6c 28  lacks the fcntl(
0de0: 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20  ) system call.  
0df0: 53 6f 20 72 65 64 65 66 69 6e 65 20 66 63 6e 74  So redefine fcnt
0e00: 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d 65 74 68  l() to be someth
0e10: 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61  ing.** that alwa
0e20: 79 73 20 73 75 63 63 65 65 64 73 2e 20 20 54 68  ys succeeds.  Th
0e30: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f  is means that lo
0e40: 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f  cking does not o
0e50: 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a  ccur under.** DJ
0e60: 47 50 50 2e 20 20 42 75 74 20 69 74 20 69 73 20  GPP.  But it is 
0e70: 44 4f 53 20 2d 20 77 68 61 74 20 64 69 64 20 79  DOS - what did y
0e80: 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69  ou expect?.*/.#i
0e90: 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 23  fdef __DJGPP__.#
0ea0: 20 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 41 2c   define fcntl(A,
0eb0: 42 2c 43 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  B,C) 0.#endif../
0ec0: 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64 69  *.** The threadi
0ed0: 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65 73  d macro resolves
0ee0: 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d 69   to the thread-i
0ef0: 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65 64  d or to 0.  Used
0f00: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
0f10: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
0f20: 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ly..*/.#if SQLIT
0f30: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64 65  E_THREADSAFE.#de
0f40: 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 70 74  fine threadid pt
0f50: 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65 6c  hread_self().#el
0f60: 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61  se.#define threa
0f70: 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  did 0.#endif../*
0f80: 0a 2a 2a 20 53 65 74 20 6f 72 20 63 68 65 63 6b  .** Set or check
0f90: 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e 74 69   the unixFile.ti
0fa0: 64 20 66 69 65 6c 64 2e 20 20 54 68 69 73 20 66  d field.  This f
0fb0: 69 65 6c 64 20 69 73 20 73 65 74 20 77 68 65 6e  ield is set when
0fc0: 20 61 6e 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20   an unixFile.** 
0fd0: 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e  is first opened.
0fe0: 20 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74    All subsequent
0ff0: 20 75 73 65 73 20 6f 66 20 74 68 65 20 75 6e 69   uses of the uni
1000: 78 46 69 6c 65 20 76 65 72 69 66 79 20 74 68 61  xFile verify tha
1010: 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 74 68  t the.** same th
1020: 72 65 61 64 20 69 73 20 6f 70 65 72 61 74 69 6e  read is operatin
1030: 67 20 6f 6e 20 74 68 65 20 75 6e 69 78 46 69 6c  g on the unixFil
1040: 65 2e 20 20 53 6f 6d 65 20 6f 70 65 72 61 74 69  e.  Some operati
1050: 6e 67 20 73 79 73 74 65 6d 73 20 64 6f 0a 2a 2a  ng systems do.**
1060: 20 6e 6f 74 20 61 6c 6c 6f 77 20 6c 6f 63 6b 73   not allow locks
1070: 20 74 6f 20 62 65 20 6f 76 65 72 72 69 64 64 65   to be overridde
1080: 6e 20 62 79 20 6f 74 68 65 72 20 74 68 72 65 61  n by other threa
1090: 64 73 20 61 6e 64 20 74 68 61 74 20 72 65 73 74  ds and that rest
10a0: 72 69 63 74 69 6f 6e 0a 2a 2a 20 6d 65 61 6e 73  riction.** means
10b0: 20 74 68 61 74 20 73 71 6c 69 74 65 33 2a 20 64   that sqlite3* d
10c0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20  atabase handles 
10d0: 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 76 65 64 20  cannot be moved 
10e0: 66 72 6f 6d 20 6f 6e 65 20 74 68 72 65 61 64 0a  from one thread.
10f0: 2a 2a 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20  ** to another.  
1100: 54 68 69 73 20 6c 6f 67 69 63 20 6d 61 6b 65 73  This logic makes
1110: 20 73 75 72 65 20 61 20 75 73 65 72 20 64 6f 65   sure a user doe
1120: 73 20 6e 6f 74 20 74 72 79 20 74 6f 20 64 6f 20  s not try to do 
1130: 74 68 61 74 0a 2a 2a 20 62 79 20 6d 69 73 74 61  that.** by mista
1140: 6b 65 2e 0a 2a 2a 0a 2a 2a 20 56 65 72 73 69 6f  ke..**.** Versio
1150: 6e 20 33 2e 33 2e 31 20 28 32 30 30 36 2d 30 31  n 3.3.1 (2006-01
1160: 2d 31 35 29 3a 20 20 75 6e 69 78 46 69 6c 65 20  -15):  unixFile 
1170: 63 61 6e 20 62 65 20 6d 6f 76 65 64 20 66 72 6f  can be moved fro
1180: 6d 20 6f 6e 65 20 74 68 72 65 61 64 20 74 6f 0a  m one thread to.
1190: 2a 2a 20 61 6e 6f 74 68 65 72 20 61 73 20 6c 6f  ** another as lo
11a0: 6e 67 20 61 73 20 77 65 20 61 72 65 20 72 75 6e  ng as we are run
11b0: 6e 69 6e 67 20 6f 6e 20 61 20 73 79 73 74 65 6d  ning on a system
11c0: 20 74 68 61 74 20 73 75 70 70 6f 72 74 73 20 74   that supports t
11d0: 68 72 65 61 64 73 0a 2a 2a 20 6f 76 65 72 72 69  hreads.** overri
11e0: 64 69 6e 67 20 65 61 63 68 20 6f 74 68 65 72 73  ding each others
11f0: 20 6c 6f 63 6b 73 20 28 77 68 69 63 68 20 6e 6f   locks (which no
1200: 77 20 74 68 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f  w the most commo
1210: 6e 20 62 65 68 61 76 69 6f 72 29 0a 2a 2a 20 6f  n behavior).** o
1220: 72 20 69 66 20 6e 6f 20 6c 6f 63 6b 73 20 61 72  r if no locks ar
1230: 65 20 68 65 6c 64 2e 20 20 42 75 74 20 74 68 65  e held.  But the
1240: 20 75 6e 69 78 46 69 6c 65 2e 70 4c 6f 63 6b 20   unixFile.pLock 
1250: 66 69 65 6c 64 20 6e 65 65 64 73 20 74 6f 20 62  field needs to b
1260: 65 0a 2a 2a 20 72 65 63 6f 6d 70 75 74 65 64 20  e.** recomputed 
1270: 62 65 63 61 75 73 65 20 69 74 73 20 6b 65 79 20  because its key 
1280: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 74 68 72  includes the thr
1290: 65 61 64 2d 69 64 2e 20 20 53 65 65 20 74 68 65  ead-id.  See the
12a0: 20 0a 2a 2a 20 74 72 61 6e 73 66 65 72 4f 77 6e   .** transferOwn
12b0: 65 72 73 68 69 70 28 29 20 66 75 6e 63 74 69 6f  ership() functio
12c0: 6e 20 62 65 6c 6f 77 20 66 6f 72 20 61 64 64 69  n below for addi
12d0: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
12e0: 6f 6e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  on.*/.#if SQLITE
12f0: 5f 54 48 52 45 41 44 53 41 46 45 0a 23 20 64 65  _THREADSAFE.# de
1300: 66 69 6e 65 20 53 45 54 5f 54 48 52 45 41 44 49  fine SET_THREADI
1310: 44 28 58 29 20 20 20 28 58 29 2d 3e 74 69 64 20  D(X)   (X)->tid 
1320: 3d 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29  = pthread_self()
1330: 0a 23 20 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  .# define CHECK_
1340: 54 48 52 45 41 44 49 44 28 58 29 20 28 74 68 72  THREADID(X) (thr
1350: 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68  eadsOverrideEach
1360: 4f 74 68 65 72 73 4c 6f 63 6b 73 3d 3d 30 20 26  OthersLocks==0 &
1370: 26 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  & \.            
1380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1390: 21 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28 28  !pthread_equal((
13a0: 58 29 2d 3e 74 69 64 2c 20 70 74 68 72 65 61 64  X)->tid, pthread
13b0: 5f 73 65 6c 66 28 29 29 29 0a 23 65 6c 73 65 0a  _self())).#else.
13c0: 23 20 64 65 66 69 6e 65 20 53 45 54 5f 54 48 52  # define SET_THR
13d0: 45 41 44 49 44 28 58 29 0a 23 20 64 65 66 69 6e  EADID(X).# defin
13e0: 65 20 43 48 45 43 4b 5f 54 48 52 45 41 44 49 44  e CHECK_THREADID
13f0: 28 58 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (X) 0.#endif../*
1400: 0a 2a 2a 20 48 65 72 65 20 69 73 20 74 68 65 20  .** Here is the 
1410: 64 69 72 74 20 6f 6e 20 50 4f 53 49 58 20 61 64  dirt on POSIX ad
1420: 76 69 73 6f 72 79 20 6c 6f 63 6b 73 3a 20 20 41  visory locks:  A
1430: 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31 20 28  NSI STD 1003.1 (
1440: 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e  1996).** section
1450: 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34   6.5.2.2 lines 4
1460: 38 33 20 74 68 72 6f 75 67 68 20 34 39 30 20 73  83 through 490 s
1470: 70 65 63 69 66 79 20 74 68 61 74 20 77 68 65 6e  pecify that when
1480: 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65   a process.** se
1490: 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c  ts or clears a l
14a0: 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74  ock, that operat
14b0: 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e  ion overrides an
14c0: 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65  y prior locks se
14d0: 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65  t.** by the same
14e0: 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f   process.  It do
14f0: 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c  es not explicitl
1500: 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68  y say so, but th
1510: 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68  is implies.** th
1520: 61 74 20 69 74 20 6f 76 65 72 72 69 64 65 73 20  at it overrides 
1530: 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68 65  locks set by the
1540: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73   same process us
1550: 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a  ing a different.
1560: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
1570: 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68  or.  Consider th
1580: 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a  is test case:.**
1590: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64  .**       int fd
15a0: 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65  1 = open("./file
15b0: 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  1", O_RDWR|O_CRE
15c0: 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20  AT, 0644);.**   
15d0: 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70      int fd2 = op
15e0: 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f  en("./file2", O_
15f0: 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36  RDWR|O_CREAT, 06
1600: 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f  44);.**.** Suppo
1610: 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e  se ./file1 and .
1620: 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c  /file2 are reall
1630: 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  y the same file 
1640: 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20  (because.** one 
1650: 69 73 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d  is a hard or sym
1660: 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68  bolic link to th
1670: 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66  e other) then if
1680: 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65   you set.** an e
1690: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
16a0: 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74   fd1, then try t
16b0: 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69  o get an exclusi
16c0: 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64  ve lock.** on fd
16d0: 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20  2, it works.  I 
16e0: 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70 65 63  would have expec
16f0: 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c  ted the second l
1700: 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73  ock to.** fail s
1710: 69 6e 63 65 20 74 68 65 72 65 20 77 61 73 20 61  ince there was a
1720: 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e  lready a lock on
1730: 20 74 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f   the file due to
1740: 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74   fd1..** But not
1750: 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68   so.  Since both
1760: 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d   locks came from
1770: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
1780: 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64  s, the.** second
1790: 20 6f 76 65 72 72 69 64 65 73 20 74 68 65 20 66   overrides the f
17a0: 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67  irst, even thoug
17b0: 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64  h they were on d
17c0: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65  ifferent.** file
17d0: 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65   descriptors ope
17e0: 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74  ned on different
17f0: 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a   file names..**.
1800: 2a 2a 20 42 75 6d 6d 65 72 2e 20 20 49 66 20 79  ** Bummer.  If y
1810: 6f 75 20 61 73 6b 20 6d 65 2c 20 74 68 69 73 20  ou ask me, this 
1820: 69 73 20 62 72 6f 6b 65 6e 2e 20 20 42 61 64 6c  is broken.  Badl
1830: 79 20 62 72 6f 6b 65 6e 2e 20 20 49 74 20 6d 65  y broken.  It me
1840: 61 6e 73 0a 2a 2a 20 74 68 61 74 20 77 65 20 63  ans.** that we c
1850: 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49 58 20  annot use POSIX 
1860: 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f  locks to synchro
1870: 6e 69 7a 65 20 66 69 6c 65 20 61 63 63 65 73 73  nize file access
1880: 20 61 6d 6f 6e 67 0a 2a 2a 20 63 6f 6d 70 65 74   among.** compet
1890: 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66 20 74  ing threads of t
18a0: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e  he same process.
18b0: 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69    POSIX locks wi
18c0: 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20  ll work fine.** 
18d0: 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61  to synchronize a
18e0: 63 63 65 73 73 20 66 6f 72 20 74 68 72 65 61 64  ccess for thread
18f0: 73 20 69 6e 20 73 65 70 61 72 61 74 65 20 70 72  s in separate pr
1900: 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e 6f 74  ocesses, but not
1910: 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69 74 68  .** threads with
1920: 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  in the same proc
1930: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f  ess..**.** To wo
1940: 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 70 72  rk around the pr
1950: 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20 68 61  oblem, SQLite ha
1960: 73 20 74 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65  s to manage file
1970: 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c   locks internall
1980: 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e  y.** on its own.
1990: 20 20 57 68 65 6e 65 76 65 72 20 61 20 6e 65 77    Whenever a new
19a0: 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
19b0: 6e 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20  ned, we have to 
19c0: 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70 65 63  find the.** spec
19d0: 69 66 69 63 20 69 6e 6f 64 65 20 6f 66 20 74 68  ific inode of th
19e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
19f0: 28 74 68 65 20 69 6e 6f 64 65 20 69 73 20 64 65  (the inode is de
1a00: 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 0a  termined by the.
1a10: 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64 20 73 74  ** st_dev and st
1a20: 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66 20 74  _ino fields of t
1a30: 68 65 20 73 74 61 74 20 73 74 72 75 63 74 75 72  he stat structur
1a40: 65 20 74 68 61 74 20 66 73 74 61 74 28 29 20 66  e that fstat() f
1a50: 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20  ills in).** and 
1a60: 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20  check for locks 
1a70: 61 6c 72 65 61 64 79 20 65 78 69 73 74 69 6e 67  already existing
1a80: 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65 2e 20   on that inode. 
1a90: 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a   When locks are.
1aa0: 2a 2a 20 63 72 65 61 74 65 64 20 6f 72 20 72 65  ** created or re
1ab0: 6d 6f 76 65 64 2c 20 77 65 20 68 61 76 65 20 74  moved, we have t
1ac0: 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77  o look at our ow
1ad0: 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72  n internal recor
1ae0: 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b  d of the.** lock
1af0: 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74  s to see if anot
1b00: 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20 70  her thread has p
1b10: 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20 61 20  reviously set a 
1b20: 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d  lock on that sam
1b30: 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a  e.** inode..**.*
1b40: 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 66 69  * The sqlite3_fi
1b50: 6c 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  le structure for
1b60: 20 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e   POSIX is no lon
1b70: 67 65 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65  ger just an inte
1b80: 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  ger file.** desc
1b90: 72 69 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e  riptor.  It is n
1ba0: 6f 77 20 61 20 73 74 72 75 63 74 75 72 65 20 74  ow a structure t
1bb0: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e  hat holds the in
1bc0: 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65  teger file.** de
1bd0: 73 63 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70  scriptor and a p
1be0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75  ointer to a stru
1bf0: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
1c00: 69 62 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61  ibes the interna
1c10: 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  l.** locks on th
1c20: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
1c30: 69 6e 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73  inode.  There is
1c40: 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72   one locking str
1c50: 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e  ucture.** per in
1c60: 6f 64 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73  ode, so if the s
1c70: 61 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65  ame inode is ope
1c80: 6e 65 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20  ned twice, both 
1c90: 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
1ca0: 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20  res.** point to 
1cb0: 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67  the same locking
1cc0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
1cd0: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
1ce0: 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65  re keeps.** a re
1cf0: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73  ference count (s
1d00: 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77  o we will know w
1d10: 68 65 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74  hen to delete it
1d20: 29 20 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a  ) and a "cnt".**
1d30: 20 66 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c   field that tell
1d40: 73 20 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61  s us its interna
1d50: 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20  l lock status.  
1d60: 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65  cnt==0 means the
1d70: 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  .** file is unlo
1d80: 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d  cked.  cnt==-1 m
1d90: 65 61 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61  eans the file ha
1da0: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
1db0: 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65  ock..** cnt>0 me
1dc0: 61 6e 73 20 74 68 65 72 65 20 61 72 65 20 63 6e  ans there are cn
1dd0: 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f  t shared locks o
1de0: 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  n the file..**.*
1df0: 2a 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f  * Any attempt to
1e00: 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20   lock or unlock 
1e10: 61 20 66 69 6c 65 20 66 69 72 73 74 20 63 68 65  a file first che
1e20: 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a  cks the locking.
1e30: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  ** structure.  T
1e40: 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65  he fcntl() syste
1e50: 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69  m call is only i
1e60: 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20  nvoked to set a 
1e70: 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69  .** POSIX lock i
1e80: 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c  f the internal l
1e90: 6f 63 6b 20 73 74 72 75 63 74 75 72 65 20 74 72  ock structure tr
1ea0: 61 6e 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65  ansitions betwee
1eb0: 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e  n.** a locked an
1ec0: 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74  d an unlocked st
1ed0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 34 2d  ate..**.** 2004-
1ee0: 4a 61 6e 2d 31 31 3a 0a 2a 2a 20 4d 6f 72 65 20  Jan-11:.** More 
1ef0: 72 65 63 65 6e 74 20 64 69 73 63 6f 76 65 72 69  recent discoveri
1f00: 65 73 20 61 62 6f 75 74 20 50 4f 53 49 58 20 61  es about POSIX a
1f10: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 20 20  dvisory locks.  
1f20: 28 54 68 65 20 6d 6f 72 65 0a 2a 2a 20 49 20 64  (The more.** I d
1f30: 69 73 63 6f 76 65 72 2c 20 74 68 65 20 6d 6f 72  iscover, the mor
1f40: 65 20 49 20 72 65 61 6c 69 7a 65 20 74 68 65 20  e I realize the 
1f50: 61 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  a POSIX advisory
1f60: 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 61 6e   locks are.** an
1f70: 20 61 62 6f 6d 69 6e 61 74 69 6f 6e 2e 29 0a 2a   abomination.).*
1f80: 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73  *.** If you clos
1f90: 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  e a file descrip
1fa0: 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20  tor that points 
1fb0: 74 6f 20 61 20 66 69 6c 65 20 74 68 61 74 20 68  to a file that h
1fc0: 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c  as locks,.** all
1fd0: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20 66   locks on that f
1fe0: 69 6c 65 20 74 68 61 74 20 61 72 65 20 6f 77 6e  ile that are own
1ff0: 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  ed by the curren
2000: 74 20 70 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a  t process are.**
2010: 20 72 65 6c 65 61 73 65 64 2e 20 20 54 6f 20 77   released.  To w
2020: 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20  ork around this 
2030: 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e  problem, each un
2040: 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
2050: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 70   contains.** a p
2060: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 65  ointer to an ope
2070: 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 2e 20  nCnt structure. 
2080: 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6f 70   There is one op
2090: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 0a  enCnt structure.
20a0: 2a 2a 20 70 65 72 20 6f 70 65 6e 20 69 6e 6f 64  ** per open inod
20b0: 65 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74  e, which means t
20c0: 68 61 74 20 6d 75 6c 74 69 70 6c 65 20 75 6e 69  hat multiple uni
20d0: 78 46 69 6c 65 20 63 61 6e 20 70 6f 69 6e 74 20  xFile can point 
20e0: 74 6f 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 6f  to a single.** o
20f0: 70 65 6e 43 6e 74 2e 20 20 57 68 65 6e 20 61 6e  penCnt.  When an
2100: 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
2110: 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69   to close an uni
2120: 78 46 69 6c 65 2c 20 69 66 20 74 68 65 72 65 20  xFile, if there 
2130: 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69  are.** other uni
2140: 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68  xFile open on th
2150: 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 74 68 61  e same inode tha
2160: 74 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f  t are holding lo
2170: 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a  cks, the call.**
2180: 20 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65 20   to close() the 
2190: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
21a0: 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
21b0: 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63  l all of the loc
21c0: 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65  ks clear..** The
21d0: 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75   openCnt structu
21e0: 72 65 20 6b 65 65 70 73 20 61 20 6c 69 73 74 20  re keeps a list 
21f0: 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  of file descript
2200: 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ors that need to
2210: 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20 61 6e  .** be closed an
2220: 64 20 74 68 61 74 20 6c 69 73 74 20 69 73 20 77  d that list is w
2230: 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65 61 72  alked (and clear
2240: 65 64 29 20 77 68 65 6e 20 74 68 65 20 6c 61 73  ed) when the las
2250: 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73  t lock.** clears
2260: 2e 0a 2a 2a 0a 2a 2a 20 46 69 72 73 74 2c 20 75  ..**.** First, u
2270: 6e 64 65 72 20 4c 69 6e 75 78 20 74 68 72 65 61  nder Linux threa
2280: 64 73 2c 20 62 65 63 61 75 73 65 20 65 61 63 68  ds, because each
2290: 20 74 68 72 65 61 64 20 68 61 73 20 61 20 73 65   thread has a se
22a0: 70 61 72 61 74 65 0a 2a 2a 20 70 72 6f 63 65 73  parate.** proces
22b0: 73 20 49 44 2c 20 6c 6f 63 6b 20 6f 70 65 72 61  s ID, lock opera
22c0: 74 69 6f 6e 73 20 69 6e 20 6f 6e 65 20 74 68 72  tions in one thr
22d0: 65 61 64 20 64 6f 20 6e 6f 74 20 6f 76 65 72 72  ead do not overr
22e0: 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 74 6f 20  ide locks.** to 
22f0: 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 69 6e  the same file in
2300: 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 2e 20   other threads. 
2310: 20 4c 69 6e 75 78 20 74 68 72 65 61 64 73 20 62   Linux threads b
2320: 65 68 61 76 65 20 6c 69 6b 65 0a 2a 2a 20 73 65  ehave like.** se
2330: 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 65 73  parate processes
2340: 20 69 6e 20 74 68 69 73 20 72 65 73 70 65 63 74   in this respect
2350: 2e 20 20 42 75 74 2c 20 69 66 20 79 6f 75 20 63  .  But, if you c
2360: 6c 6f 73 65 20 61 20 66 69 6c 65 0a 2a 2a 20 64  lose a file.** d
2370: 65 73 63 72 69 70 74 6f 72 20 69 6e 20 6c 69 6e  escriptor in lin
2380: 75 78 20 74 68 72 65 61 64 73 2c 20 61 6c 6c 20  ux threads, all 
2390: 6c 6f 63 6b 73 20 61 72 65 20 63 6c 65 61 72 65  locks are cleare
23a0: 64 2c 20 65 76 65 6e 20 6c 6f 63 6b 73 0a 2a 2a  d, even locks.**
23b0: 20 6f 6e 20 6f 74 68 65 72 20 74 68 72 65 61 64   on other thread
23c0: 73 20 61 6e 64 20 65 76 65 6e 20 74 68 6f 75 67  s and even thoug
23d0: 68 20 74 68 65 20 6f 74 68 65 72 20 74 68 72 65  h the other thre
23e0: 61 64 73 20 68 61 76 65 20 64 69 66 66 65 72 65  ads have differe
23f0: 6e 74 0a 2a 2a 20 70 72 6f 63 65 73 73 20 49 44  nt.** process ID
2400: 73 2e 20 20 4c 69 6e 75 78 20 74 68 72 65 61 64  s.  Linux thread
2410: 73 20 69 73 20 69 6e 63 6f 6e 73 69 73 74 65 6e  s is inconsisten
2420: 74 20 69 6e 20 74 68 69 73 20 72 65 73 70 65 63  t in this respec
2430: 74 2e 0a 2a 2a 20 28 49 27 6d 20 62 65 67 69 6e  t..** (I'm begin
2440: 6e 69 6e 67 20 74 6f 20 74 68 69 6e 6b 20 74 68  ning to think th
2450: 61 74 20 6c 69 6e 75 78 20 74 68 72 65 61 64 73  at linux threads
2460: 20 69 73 20 61 6e 20 61 62 6f 6d 69 6e 61 74 69   is an abominati
2470: 6f 6e 20 74 6f 6f 2e 29 0a 2a 2a 20 54 68 65 20  on too.).** The 
2480: 63 6f 6e 73 65 71 75 65 6e 63 65 20 6f 66 20 74  consequence of t
2490: 68 69 73 20 61 6c 6c 20 69 73 20 74 68 61 74 20  his all is that 
24a0: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 66  the hash table f
24b0: 6f 72 20 74 68 65 20 6c 6f 63 6b 49 6e 66 6f 0a  or the lockInfo.
24c0: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 68 61 73  ** structure has
24d0: 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20   to include the 
24e0: 70 72 6f 63 65 73 73 20 69 64 20 61 73 20 70 61  process id as pa
24f0: 72 74 20 6f 66 20 69 74 73 20 6b 65 79 20 62 65  rt of its key be
2500: 63 61 75 73 65 0a 2a 2a 20 6c 6f 63 6b 73 20 69  cause.** locks i
2510: 6e 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65  n different thre
2520: 61 64 73 20 61 72 65 20 74 72 65 61 74 65 64 20  ads are treated 
2530: 61 73 20 64 69 73 74 69 6e 63 74 2e 20 20 42 75  as distinct.  Bu
2540: 74 20 74 68 65 20 0a 2a 2a 20 6f 70 65 6e 43 6e  t the .** openCn
2550: 74 20 73 74 72 75 63 74 75 72 65 20 73 68 6f 75  t structure shou
2560: 6c 64 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74  ld not include t
2570: 68 65 20 70 72 6f 63 65 73 73 20 69 64 20 69 6e  he process id in
2580: 20 69 74 73 0a 2a 2a 20 6b 65 79 20 62 65 63 61   its.** key beca
2590: 75 73 65 20 63 6c 6f 73 65 28 29 20 63 6c 65 61  use close() clea
25a0: 72 73 20 6c 6f 63 6b 20 6f 6e 20 61 6c 6c 20 74  rs lock on all t
25b0: 68 72 65 61 64 73 2c 20 6e 6f 74 20 6a 75 73 74  hreads, not just
25c0: 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
25d0: 74 68 72 65 61 64 2e 20 20 57 65 72 65 20 69 74  thread.  Were it
25e0: 20 6e 6f 74 20 66 6f 72 20 74 68 69 73 20 67 6f   not for this go
25f0: 6f 66 69 6e 65 73 73 20 69 6e 20 6c 69 6e 75 78  ofiness in linux
2600: 20 74 68 72 65 61 64 73 2c 20 77 65 20 63 6f 75   threads, we cou
2610: 6c 64 0a 2a 2a 20 63 6f 6d 62 69 6e 65 20 74 68  ld.** combine th
2620: 65 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 6f  e lockInfo and o
2630: 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65  penCnt structure
2640: 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  s into a single 
2650: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
2660: 20 32 30 30 34 2d 4a 75 6e 2d 32 38 3a 0a 2a 2a   2004-Jun-28:.**
2670: 20 4f 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e   On some version
2680: 73 20 6f 66 20 6c 69 6e 75 78 2c 20 74 68 72 65  s of linux, thre
2690: 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65  ads can override
26a0: 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63   each others loc
26b0: 6b 73 2e 0a 2a 2a 20 4f 6e 20 6f 74 68 65 72 73  ks..** On others
26c0: 20 6e 6f 74 2e 20 20 53 6f 6d 65 74 69 6d 65 73   not.  Sometimes
26d0: 20 79 6f 75 20 63 61 6e 20 63 68 61 6e 67 65 20   you can change 
26e0: 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 6e 20  the behavior on 
26f0: 74 68 65 20 73 61 6d 65 0a 2a 2a 20 73 79 73 74  the same.** syst
2700: 65 6d 20 62 79 20 73 65 74 74 69 6e 67 20 74 68  em by setting th
2710: 65 20 4c 44 5f 41 53 53 55 4d 45 5f 4b 45 52 4e  e LD_ASSUME_KERN
2720: 45 4c 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76  EL environment v
2730: 61 72 69 61 62 6c 65 2e 20 20 54 68 65 0a 2a 2a  ariable.  The.**
2740: 20 50 4f 53 49 58 20 73 74 61 6e 64 61 72 64 20   POSIX standard 
2750: 69 73 20 73 69 6c 65 6e 74 20 61 73 20 74 6f 20  is silent as to 
2760: 77 68 69 63 68 20 62 65 68 61 76 69 6f 72 20 69  which behavior i
2770: 73 20 63 6f 72 72 65 63 74 2c 20 61 73 20 66 61  s correct, as fa
2780: 72 0a 2a 2a 20 61 73 20 49 20 63 61 6e 20 74 65  r.** as I can te
2790: 6c 6c 2c 20 73 6f 20 6f 74 68 65 72 20 76 65 72  ll, so other ver
27a0: 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78 20 6d 69  sions of unix mi
27b0: 67 68 74 20 73 68 6f 77 20 74 68 65 20 73 61 6d  ght show the sam
27c0: 65 0a 2a 2a 20 69 6e 63 6f 6e 73 69 73 74 65 6e  e.** inconsisten
27d0: 63 79 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  cy.  There is no
27e0: 20 6c 69 74 74 6c 65 20 64 6f 75 62 74 20 69 6e   little doubt in
27f0: 20 6d 79 20 6d 69 6e 64 20 74 68 61 74 20 70 6f   my mind that po
2800: 73 69 78 0a 2a 2a 20 61 64 76 69 73 6f 72 79 20  six.** advisory 
2810: 6c 6f 63 6b 73 20 61 6e 64 20 6c 69 6e 75 78 20  locks and linux 
2820: 74 68 72 65 61 64 73 20 61 72 65 20 70 72 6f 66  threads are prof
2830: 6f 75 6e 64 6c 79 20 62 72 6f 6b 65 6e 2e 0a 2a  oundly broken..*
2840: 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f  *.** To work aro
2850: 75 6e 64 20 74 68 65 20 69 6e 63 6f 6e 73 69 73  und the inconsis
2860: 74 65 6e 63 69 65 73 2c 20 77 65 20 68 61 76 65  tencies, we have
2870: 20 74 6f 20 74 65 73 74 20 61 74 20 72 75 6e 74   to test at runt
2880: 69 6d 65 20 0a 2a 2a 20 77 68 65 74 68 65 72 20  ime .** whether 
2890: 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 73 20 63  or not threads c
28a0: 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63 68  an override each
28b0: 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 20 20   others locks.  
28c0: 54 68 69 73 20 74 65 73 74 0a 2a 2a 20 69 73 20  This test.** is 
28d0: 72 75 6e 20 6f 6e 63 65 2c 20 74 68 65 20 66 69  run once, the fi
28e0: 72 73 74 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63  rst time any loc
28f0: 6b 20 69 73 20 61 74 74 65 6d 70 74 65 64 2e 20  k is attempted. 
2900: 20 41 20 73 74 61 74 69 63 20 0a 2a 2a 20 76 61   A static .** va
2910: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
2920: 20 72 65 63 6f 72 64 20 74 68 65 20 72 65 73 75   record the resu
2930: 6c 74 73 20 6f 66 20 74 68 69 73 20 74 65 73 74  lts of this test
2940: 20 66 6f 72 20 66 75 74 75 72 65 0a 2a 2a 20 75   for future.** u
2950: 73 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e  se..*/../*.** An
2960: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
2970: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
2980: 74 75 72 65 20 73 65 72 76 65 73 20 61 73 20 74  ture serves as t
2990: 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74  he key used.** t
29a0: 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69  o locate a parti
29b0: 63 75 6c 61 72 20 6c 6f 63 6b 49 6e 66 6f 20 73  cular lockInfo s
29c0: 74 72 75 63 74 75 72 65 20 67 69 76 65 6e 20 69  tructure given i
29d0: 74 73 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ts inode..**.** 
29e0: 49 66 20 74 68 72 65 61 64 73 20 63 61 6e 6e 6f  If threads canno
29f0: 74 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20  t override each 
2a00: 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2c 20 74 68  others locks, th
2a10: 65 6e 20 77 65 20 73 65 74 20 74 68 65 0a 2a 2a  en we set the.**
2a20: 20 6c 6f 63 6b 4b 65 79 2e 74 69 64 20 66 69 65   lockKey.tid fie
2a30: 6c 64 20 74 6f 20 74 68 65 20 74 68 72 65 61 64  ld to the thread
2a40: 20 49 44 2e 20 20 49 66 20 74 68 72 65 61 64 73   ID.  If threads
2a50: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 0a 2a 2a   can override.**
2a60: 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63   each others loc
2a70: 6b 73 20 74 68 65 6e 20 74 69 64 20 69 73 20 61  ks then tid is a
2a80: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 7a 65 72  lways set to zer
2a90: 6f 2e 20 20 74 69 64 20 69 73 20 6f 6d 69 74 74  o.  tid is omitt
2aa0: 65 64 0a 2a 2a 20 69 66 20 77 65 20 63 6f 6d 70  ed.** if we comp
2ab0: 69 6c 65 20 77 69 74 68 6f 75 74 20 74 68 72 65  ile without thre
2ac0: 61 64 69 6e 67 20 73 75 70 70 6f 72 74 2e 0a 2a  ading support..*
2ad0: 2f 0a 73 74 72 75 63 74 20 6c 6f 63 6b 4b 65 79  /.struct lockKey
2ae0: 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20   {.  dev_t dev; 
2af0: 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20        /* Device 
2b00: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 6f 5f  number */.  ino_
2b10: 74 20 69 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20  t ino;       /* 
2b20: 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  Inode number */.
2b30: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
2b40: 44 53 41 46 45 0a 20 20 70 74 68 72 65 61 64 5f  DSAFE.  pthread_
2b50: 74 20 74 69 64 3b 20 20 20 2f 2a 20 54 68 72 65  t tid;   /* Thre
2b60: 61 64 20 49 44 20 6f 72 20 7a 65 72 6f 20 69 66  ad ID or zero if
2b70: 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65   threads can ove
2b80: 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72  rride each other
2b90: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
2ba0: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
2bb0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2bc0: 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  g structure is a
2bd0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63  llocated for eac
2be0: 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 20  h open.** inode 
2bf0: 6f 6e 20 65 61 63 68 20 74 68 72 65 61 64 20 77  on each thread w
2c00: 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20  ith a different 
2c10: 70 72 6f 63 65 73 73 20 49 44 2e 20 20 28 54 68  process ID.  (Th
2c20: 72 65 61 64 73 20 68 61 76 65 0a 2a 2a 20 64 69  reads have.** di
2c30: 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 20  fferent process 
2c40: 49 44 73 20 6f 6e 20 6c 69 6e 75 78 2c 20 62 75  IDs on linux, bu
2c50: 74 20 6e 6f 74 20 6f 6e 20 6d 6f 73 74 20 6f 74  t not on most ot
2c60: 68 65 72 20 75 6e 69 78 65 73 2e 29 0a 2a 2a 0a  her unixes.).**.
2c70: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64  ** A single inod
2c80: 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69  e can have multi
2c90: 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ple file descrip
2ca0: 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20 75 6e  tors, so each un
2cb0: 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  ixFile.** struct
2cc0: 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  ure contains a p
2cd0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73  ointer to an ins
2ce0: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
2cf0: 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a  ject and this.**
2d00: 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20   object keeps a 
2d10: 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  count of the num
2d20: 62 65 72 20 6f 66 20 75 6e 69 78 46 69 6c 65 20  ber of unixFile 
2d30: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a  pointing to it..
2d40: 2a 2f 0a 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e  */.struct lockIn
2d50: 66 6f 20 7b 0a 20 20 73 74 72 75 63 74 20 6c 6f  fo {.  struct lo
2d60: 63 6b 4b 65 79 20 6b 65 79 3b 20 20 2f 2a 20 54  ckKey key;  /* T
2d70: 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f  he lookup key */
2d80: 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20  .  int cnt;     
2d90: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2da0: 72 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63 6b  r of SHARED lock
2db0: 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20  s held */.  int 
2dc0: 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20  locktype;       
2dd0: 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52 45   /* One of SHARE
2de0: 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
2df0: 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20  _LOCK etc. */.  
2e00: 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
2e10: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2e20: 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  f pointers to th
2e30: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
2e40: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  };../*.** An ins
2e50: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
2e60: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
2e70: 20 73 65 72 76 65 73 20 61 73 20 74 68 65 20 6b   serves as the k
2e80: 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f  ey used.** to lo
2e90: 63 61 74 65 20 61 20 70 61 72 74 69 63 75 6c 61  cate a particula
2ea0: 72 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74  r openCnt struct
2eb0: 75 72 65 20 67 69 76 65 6e 20 69 74 73 20 69 6e  ure given its in
2ec0: 6f 64 65 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73  ode.  This.** is
2ed0: 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
2ee0: 20 6c 6f 63 6b 4b 65 79 20 65 78 63 65 70 74 20   lockKey except 
2ef0: 74 68 61 74 20 74 68 65 20 74 68 72 65 61 64 20  that the thread 
2f00: 49 44 20 69 73 20 6f 6d 69 74 74 65 64 2e 0a 2a  ID is omitted..*
2f10: 2f 0a 73 74 72 75 63 74 20 6f 70 65 6e 4b 65 79  /.struct openKey
2f20: 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20   {.  dev_t dev; 
2f30: 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62    /* Device numb
2f40: 65 72 20 2a 2f 0a 20 20 69 6e 6f 5f 74 20 69 6e  er */.  ino_t in
2f50: 6f 3b 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75  o;   /* Inode nu
2f60: 6d 62 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  mber */.};../*.*
2f70: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
2f80: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
2f90: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
2fa0: 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f  cated for each o
2fb0: 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 54  pen.** inode.  T
2fc0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 6b 65  his structure ke
2fd0: 65 70 73 20 74 72 61 63 6b 20 6f 66 20 74 68 65  eps track of the
2fe0: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   number of locks
2ff0: 20 6f 6e 20 74 68 61 74 0a 2a 2a 20 69 6e 6f 64   on that.** inod
3000: 65 2e 20 20 49 66 20 61 20 63 6c 6f 73 65 20 69  e.  If a close i
3010: 73 20 61 74 74 65 6d 70 74 65 64 20 61 67 61 69  s attempted agai
3020: 6e 73 74 20 61 6e 20 69 6e 6f 64 65 20 74 68 61  nst an inode tha
3030: 74 20 69 73 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20  t is holding.** 
3040: 6c 6f 63 6b 73 2c 20 74 68 65 20 63 6c 6f 73 65  locks, the close
3050: 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74   is deferred unt
3060: 69 6c 20 61 6c 6c 20 6c 6f 63 6b 73 20 63 6c 65  il all locks cle
3070: 61 72 20 62 79 20 61 64 64 69 6e 67 20 74 68 65  ar by adding the
3080: 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70  .** file descrip
3090: 74 6f 72 20 74 6f 20 62 65 20 63 6c 6f 73 65 64  tor to be closed
30a0: 20 74 6f 20 74 68 65 20 70 65 6e 64 69 6e 67 20   to the pending 
30b0: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  list..*/.struct 
30c0: 6f 70 65 6e 43 6e 74 20 7b 0a 20 20 73 74 72 75  openCnt {.  stru
30d0: 63 74 20 6f 70 65 6e 4b 65 79 20 6b 65 79 3b 20  ct openKey key; 
30e0: 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20    /* The lookup 
30f0: 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  key */.  int nRe
3100: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
3110: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e  * Number of poin
3120: 74 65 72 73 20 74 6f 20 74 68 69 73 20 73 74 72  ters to this str
3130: 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ucture */.  int 
3140: 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  nLock;          
3150: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
3160: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
3170: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69   */.  int nPendi
3180: 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ng;         /* N
3190: 75 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67  umber of pending
31a0: 20 63 6c 6f 73 65 28 29 20 6f 70 65 72 61 74 69   close() operati
31b0: 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50  ons */.  int *aP
31c0: 65 6e 64 69 6e 67 3b 20 20 20 20 20 20 20 20 2f  ending;        /
31d0: 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 70 61 63 65  * Malloced space
31e0: 20 68 6f 6c 64 69 6e 67 20 66 64 27 73 20 61 77   holding fd's aw
31f0: 61 69 74 69 6e 67 20 61 20 63 6c 6f 73 65 28 29  aiting a close()
3200: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54   */.};../* .** T
3210: 68 65 73 65 20 68 61 73 68 20 74 61 62 6c 65 73  hese hash tables
3220: 20 6d 61 70 20 69 6e 6f 64 65 73 20 61 6e 64 20   map inodes and 
3230: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
3240: 20 28 72 65 61 6c 6c 79 2c 20 6c 6f 63 6b 4b 65   (really, lockKe
3250: 79 20 61 6e 64 0a 2a 2a 20 6f 70 65 6e 4b 65 79  y and.** openKey
3260: 20 73 74 72 75 63 74 75 72 65 73 29 20 69 6e 74   structures) int
3270: 6f 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 6f  o lockInfo and o
3280: 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65  penCnt structure
3290: 73 2e 20 20 41 63 63 65 73 73 20 74 6f 20 0a 2a  s.  Access to .*
32a0: 2a 20 74 68 65 73 65 20 68 61 73 68 20 74 61 62  * these hash tab
32b0: 6c 65 73 20 6d 75 73 74 20 62 65 20 70 72 6f 74  les must be prot
32c0: 65 63 74 65 64 20 62 79 20 61 20 6d 75 74 65 78  ected by a mutex
32d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 48 61 73 68  ..*/.static Hash
32e0: 20 6c 6f 63 6b 48 61 73 68 20 3d 20 7b 53 51 4c   lockHash = {SQL
32f0: 49 54 45 5f 48 41 53 48 5f 42 49 4e 41 52 59 2c  ITE_HASH_BINARY,
3300: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 7d 3b   0, 0, 0, 0, 0};
3310: 0a 73 74 61 74 69 63 20 48 61 73 68 20 6f 70 65  .static Hash ope
3320: 6e 48 61 73 68 20 3d 20 7b 53 51 4c 49 54 45 5f  nHash = {SQLITE_
3330: 48 41 53 48 5f 42 49 4e 41 52 59 2c 20 30 2c 20  HASH_BINARY, 0, 
3340: 30 2c 20 30 2c 20 30 2c 20 30 7d 3b 0a 0a 23 69  0, 0, 0, 0};..#i
3350: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
3360: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
3370: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6c 6f 63 6b 69  ./*.** The locki
3380: 6e 67 20 73 74 79 6c 65 73 20 61 72 65 20 61 73  ng styles are as
3390: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
33a0: 65 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  e different file
33b0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 61 70 61   locking.** capa
33c0: 62 69 6c 69 74 69 65 73 20 73 75 70 70 6f 72 74  bilities support
33d0: 65 64 20 62 79 20 64 69 66 66 65 72 65 6e 74 20  ed by different 
33e0: 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 20 20 0a  file systems.  .
33f0: 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b  **.** POSIX lock
3400: 69 6e 67 20 73 74 79 6c 65 20 66 75 6c 6c 79 20  ing style fully 
3410: 73 75 70 70 6f 72 74 73 20 73 68 61 72 65 64 20  supports shared 
3420: 61 6e 64 20 65 78 63 6c 75 73 69 76 65 20 62 79  and exclusive by
3430: 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 0a  te-range locks .
3440: 2a 2a 20 41 44 50 20 6c 6f 63 6b 69 6e 67 20 6f  ** ADP locking o
3450: 6e 6c 79 20 73 75 70 70 6f 72 74 73 20 65 78 63  nly supports exc
3460: 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67  lusive byte-rang
3470: 65 20 6c 6f 63 6b 73 0a 2a 2a 20 46 4c 4f 43 4b  e locks.** FLOCK
3480: 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 73 20 61   only supports a
3490: 20 73 69 6e 67 6c 65 20 66 69 6c 65 2d 67 6c 6f   single file-glo
34a0: 62 61 6c 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  bal exclusive lo
34b0: 63 6b 0a 2a 2a 20 44 4f 54 4c 4f 43 4b 20 69 73  ck.** DOTLOCK is
34c0: 6e 27 74 20 61 20 74 72 75 65 20 6c 6f 63 6b 69  n't a true locki
34d0: 6e 67 20 73 74 79 6c 65 2c 20 69 74 20 72 65 66  ng style, it ref
34e0: 65 72 73 20 74 6f 20 74 68 65 20 75 73 65 20 6f  ers to the use o
34f0: 66 20 61 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20  f a special.**  
3500: 20 66 69 6c 65 20 6e 61 6d 65 64 20 74 68 65 20   file named the 
3510: 73 61 6d 65 20 61 73 20 74 68 65 20 64 61 74 61  same as the data
3520: 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 20 61  base file with a
3530: 20 27 2e 6c 6f 63 6b 27 20 65 78 74 65 6e 73 69   '.lock' extensi
3540: 6f 6e 2c 20 74 68 69 73 0a 2a 2a 20 20 20 63 61  on, this.**   ca
3550: 6e 20 62 65 20 75 73 65 64 20 6f 6e 20 66 69 6c  n be used on fil
3560: 65 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 64  e systems that d
3570: 6f 20 6e 6f 74 20 6f 66 66 65 72 20 61 6e 79 20  o not offer any 
3580: 72 65 6c 69 61 62 6c 65 20 66 69 6c 65 20 6c 6f  reliable file lo
3590: 63 6b 69 6e 67 0a 2a 2a 20 4e 4f 20 6c 6f 63 6b  cking.** NO lock
35a0: 69 6e 67 20 6d 65 61 6e 73 20 74 68 61 74 20 6e  ing means that n
35b0: 6f 20 6c 6f 63 6b 69 6e 67 20 77 69 6c 6c 20 62  o locking will b
35c0: 65 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69  e attempted, thi
35d0: 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66  s is only used f
35e0: 6f 72 0a 2a 2a 20 20 20 72 65 61 64 2d 6f 6e 6c  or.**   read-onl
35f0: 79 20 66 69 6c 65 20 73 79 73 74 65 6d 73 20 63  y file systems c
3600: 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 55 4e 53 55  urrently.** UNSU
3610: 50 50 4f 52 54 45 44 20 6d 65 61 6e 73 20 74 68  PPORTED means th
3620: 61 74 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 77 69  at no locking wi
3630: 6c 6c 20 62 65 20 61 74 74 65 6d 70 74 65 64 2c  ll be attempted,
3640: 20 74 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73   this is only us
3650: 65 64 20 66 6f 72 0a 2a 2a 20 20 20 66 69 6c 65  ed for.**   file
3660: 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 61 72   systems that ar
3670: 65 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 75 6e  e known to be un
3680: 73 75 70 70 6f 72 74 65 64 0a 2a 2f 0a 74 79 70  supported.*/.typ
3690: 65 64 65 66 20 65 6e 75 6d 20 7b 0a 20 20 20 20  edef enum {.    
36a0: 20 20 20 20 70 6f 73 69 78 4c 6f 63 6b 69 6e 67      posixLocking
36b0: 53 74 79 6c 65 20 3d 20 30 2c 20 20 20 20 20 20  Style = 0,      
36c0: 20 2f 2a 20 73 74 61 6e 64 61 72 64 20 70 6f 73   /* standard pos
36d0: 69 78 2d 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ix-advisory lock
36e0: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 66 70  s */.        afp
36f0: 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 2c 20 20 20  LockingStyle,   
3700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 75 73 65            /* use
3710: 20 61 66 70 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20   afp locks */.  
3720: 20 20 20 20 20 20 66 6c 6f 63 6b 4c 6f 63 6b 69        flockLocki
3730: 6e 67 53 74 79 6c 65 2c 20 20 20 20 20 20 20 20  ngStyle,        
3740: 20 20 20 2f 2a 20 75 73 65 20 66 6c 6f 63 6b 28     /* use flock(
3750: 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 64 6f 74  ) */.        dot
3760: 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  lockLockingStyle
3770: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 75 73 65  ,         /* use
3780: 20 3c 66 69 6c 65 3e 2e 6c 6f 63 6b 20 66 69 6c   <file>.lock fil
3790: 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 6f  es */.        no
37a0: 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 2c 20 20 20  LockingStyle,   
37b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 75 73             /* us
37c0: 65 66 75 6c 20 66 6f 72 20 72 65 61 64 2d 6f 6e  eful for read-on
37d0: 6c 79 20 66 69 6c 65 20 73 79 73 74 65 6d 20 2a  ly file system *
37e0: 2f 0a 20 20 20 20 20 20 20 20 75 6e 73 75 70 70  /.        unsupp
37f0: 6f 72 74 65 64 4c 6f 63 6b 69 6e 67 53 74 79 6c  ortedLockingStyl
3800: 65 20 20 20 20 20 20 2f 2a 20 69 6e 64 69 63 61  e      /* indica
3810: 74 65 73 20 75 6e 73 75 70 70 6f 72 74 65 64 20  tes unsupported 
3820: 66 69 6c 65 20 73 79 73 74 65 6d 20 2a 2f 0a 7d  file system */.}
3830: 20 73 71 6c 69 74 65 33 4c 6f 63 6b 69 6e 67 53   sqlite3LockingS
3840: 74 79 6c 65 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  tyle;.#endif /* 
3850: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
3860: 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a  CKING_STYLE */..
3870: 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
3880: 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e  ctions to obtain
3890: 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20   and relinquish 
38a0: 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
38b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
38c0: 20 65 6e 74 65 72 4d 75 74 65 78 28 29 7b 0a 20   enterMutex(){. 
38d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
38e0: 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d 75 74  nter(sqlite3_mut
38f0: 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
3900: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
3910: 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20  TER));.}.static 
3920: 76 6f 69 64 20 6c 65 61 76 65 4d 75 74 65 78 28  void leaveMutex(
3930: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
3940: 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33  ex_leave(sqlite3
3950: 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
3960: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
3970: 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 0a 23 69  _MASTER));.}..#i
3980: 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  f SQLITE_THREADS
3990: 41 46 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  AFE./*.** This v
39a0: 61 72 69 61 62 6c 65 20 72 65 63 6f 72 64 73 20  ariable records 
39b0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
39c0: 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72  hreads can overr
39d0: 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 0a  ide each others.
39e0: 2a 2a 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  ** locks..**.** 
39f0: 20 20 20 30 3a 20 20 4e 6f 2e 20 20 54 68 72 65     0:  No.  Thre
3a00: 61 64 73 20 63 61 6e 6e 6f 74 20 6f 76 65 72 72  ads cannot overr
3a10: 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20  ide each others 
3a20: 6c 6f 63 6b 73 2e 0a 2a 2a 20 20 20 20 31 3a 20  locks..**    1: 
3a30: 20 59 65 73 2e 20 20 54 68 72 65 61 64 73 20 63   Yes.  Threads c
3a40: 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63 68  an override each
3a50: 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a   others locks..*
3a60: 2a 20 20 20 2d 31 3a 20 20 57 65 20 64 6f 6e 27  *   -1:  We don'
3a70: 74 20 6b 6e 6f 77 20 79 65 74 2e 0a 2a 2a 0a 2a  t know yet..**.*
3a80: 2a 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  * On some system
3a90: 73 2c 20 77 65 20 6b 6e 6f 77 20 61 74 20 63 6f  s, we know at co
3aa0: 6d 70 69 6c 65 2d 74 69 6d 65 20 69 66 20 74 68  mpile-time if th
3ab0: 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69  reads can overri
3ac0: 64 65 20 65 61 63 68 0a 2a 2a 20 6f 74 68 65 72  de each.** other
3ad0: 73 20 6c 6f 63 6b 73 2e 20 20 4f 6e 20 74 68 6f  s locks.  On tho
3ae0: 73 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65 20  se systems, the 
3af0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56  SQLITE_THREAD_OV
3b00: 45 52 52 49 44 45 5f 4c 4f 43 4b 20 6d 61 63 72  ERRIDE_LOCK macr
3b10: 6f 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 73 65 74  o.** will be set
3b20: 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20   appropriately. 
3b30: 20 4f 6e 20 6f 74 68 65 72 20 73 79 73 74 65 6d   On other system
3b40: 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20 63 68  s, we have to ch
3b50: 65 63 6b 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d  eck at.** runtim
3b60: 65 2e 20 20 4f 6e 20 74 68 65 73 65 20 6c 61 74  e.  On these lat
3b70: 74 65 72 20 73 79 73 74 65 6d 73 2c 20 53 51 4c  ter systems, SQL
3b80: 54 49 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52  TIE_THREAD_OVERR
3b90: 49 44 45 5f 4c 4f 43 4b 20 69 73 0a 2a 2a 20 75  IDE_LOCK is.** u
3ba0: 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  ndefined..**.** 
3bb0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 6e 6f  This variable no
3bc0: 72 6d 61 6c 6c 79 20 68 61 73 20 66 69 6c 65 20  rmally has file 
3bd0: 73 63 6f 70 65 20 6f 6e 6c 79 2e 20 20 42 75 74  scope only.  But
3be0: 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2c   during testing,
3bf0: 20 77 65 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 61   we make.** it a
3c00: 20 67 6c 6f 62 61 6c 20 73 6f 20 74 68 61 74 20   global so that 
3c10: 74 68 65 20 74 65 73 74 20 63 6f 64 65 20 63 61  the test code ca
3c20: 6e 20 63 68 61 6e 67 65 20 69 74 73 20 76 61 6c  n change its val
3c30: 75 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 76  ue in order to v
3c40: 65 72 69 66 79 0a 2a 2a 20 74 68 61 74 20 74 68  erify.** that th
3c50: 65 20 72 69 67 68 74 20 73 74 75 66 66 20 68 61  e right stuff ha
3c60: 70 70 65 6e 73 20 69 6e 20 65 69 74 68 65 72 20  ppens in either 
3c70: 63 61 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  case..*/.#ifndef
3c80: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f   SQLITE_THREAD_O
3c90: 56 45 52 52 49 44 45 5f 4c 4f 43 4b 0a 23 20 64  VERRIDE_LOCK.# d
3ca0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 48 52  efine SQLITE_THR
3cb0: 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43  EAD_OVERRIDE_LOC
3cc0: 4b 20 2d 31 0a 23 65 6e 64 69 66 0a 23 69 66 64  K -1.#endif.#ifd
3cd0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
3ce0: 6e 74 20 74 68 72 65 61 64 73 4f 76 65 72 72 69  nt threadsOverri
3cf0: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
3d00: 73 20 3d 20 53 51 4c 49 54 45 5f 54 48 52 45 41  s = SQLITE_THREA
3d10: 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 3b  D_OVERRIDE_LOCK;
3d20: 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20 69 6e  .#else.static in
3d30: 74 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64  t threadsOverrid
3d40: 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73  eEachOthersLocks
3d50: 20 3d 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44   = SQLITE_THREAD
3d60: 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a  _OVERRIDE_LOCK;.
3d70: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
3d80: 69 73 20 73 74 72 75 63 74 75 72 65 20 68 6f 6c  is structure hol
3d90: 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70  ds information p
3da0: 61 73 73 65 64 20 69 6e 74 6f 20 69 6e 64 69 76  assed into indiv
3db0: 69 64 75 61 6c 20 74 65 73 74 0a 2a 2a 20 74 68  idual test.** th
3dc0: 72 65 61 64 73 20 62 79 20 74 68 65 20 74 65 73  reads by the tes
3dd0: 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65  tThreadLockingBe
3de0: 68 61 76 69 6f 72 28 29 20 72 6f 75 74 69 6e 65  havior() routine
3df0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 74 68 72 65  ..*/.struct thre
3e00: 61 64 54 65 73 74 44 61 74 61 20 7b 0a 20 20 69  adTestData {.  i
3e10: 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20  nt fd;          
3e20: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f        /* File to
3e30: 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20   be locked */.  
3e40: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
3e50: 6b 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f  k;     /* The lo
3e60: 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20  cking operation 
3e70: 2a 2f 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 3b  */.  int result;
3e80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
3e90: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6c 6f 63  esult of the loc
3ea0: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 2a  king operation *
3eb0: 2f 0a 7d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  /.};..#ifdef SQL
3ec0: 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f  ITE_LOCK_TRACE./
3ed0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20 69  *.** Print out i
3ee0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
3ef0: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70 65   all locking ope
3f00: 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54  rations..**.** T
3f10: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
3f20: 73 65 64 20 66 6f 72 20 74 72 6f 75 62 6c 65 73  sed for troubles
3f30: 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e  hooting locks on
3f40: 20 6d 75 6c 74 69 74 68 72 65 61 64 65 64 0a 2a   multithreaded.*
3f50: 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45 6e  * platforms.  En
3f60: 61 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e  able by compilin
3f70: 67 20 77 69 74 68 20 74 68 65 20 2d 44 53 51 4c  g with the -DSQL
3f80: 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a  ITE_LOCK_TRACE.*
3f90: 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f  * command-line o
3fa0: 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 6d  ption on the com
3fb0: 70 69 6c 65 72 2e 20 20 54 68 69 73 20 63 6f 64  piler.  This cod
3fc0: 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a  e is normally.**
3fd0: 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a   turned off..*/.
3fe0: 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54  static int lockT
3ff0: 72 61 63 65 28 69 6e 74 20 66 64 2c 20 69 6e 74  race(int fd, int
4000: 20 6f 70 2c 20 73 74 72 75 63 74 20 66 6c 6f 63   op, struct floc
4010: 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  k *p){.  char *z
4020: 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a  OpName, *zType;.
4030: 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20 73    int s;.  int s
4040: 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66 28  avedErrno;.  if(
4050: 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a   op==F_GETLK ){.
4060: 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 47      zOpName = "G
4070: 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69  ETLK";.  }else i
4080: 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 29  f( op==F_SETLK )
4090: 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20  {.    zOpName = 
40a0: 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65  "SETLK";.  }else
40b0: 7b 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28  {.    s = fcntl(
40c0: 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20  fd, op, p);.    
40d0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
40e0: 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77  tf("fcntl unknow
40f0: 6e 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 66  n %d %d %d\n", f
4100: 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72  d, op, s);.    r
4110: 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69  eturn s;.  }.  i
4120: 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  f( p->l_type==F_
4130: 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79  RDLCK ){.    zTy
4140: 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20  pe = "RDLCK";.  
4150: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74  }else if( p->l_t
4160: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a  ype==F_WRLCK ){.
4170: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c      zType = "WRL
4180: 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CK";.  }else if(
4190: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e   p->l_type==F_UN
41a0: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
41b0: 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65   = "UNLCK";.  }e
41c0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
41d0: 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65   0 );.  }.  asse
41e0: 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d  rt( p->l_whence=
41f0: 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73  =SEEK_SET );.  s
4200: 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20 6f 70 2c   = fcntl(fd, op,
4210: 20 70 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e   p);.  savedErrn
4220: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c  o = errno;.  sql
4230: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
4240: 22 66 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20  "fcntl %d %d %s 
4250: 25 73 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e  %s %d %d %d %d\n
4260: 22 2c 0a 20 20 20 20 20 74 68 72 65 61 64 69 64  ",.     threadid
4270: 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a  , fd, zOpName, z
4280: 54 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f  Type, (int)p->l_
4290: 73 74 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c  start, (int)p->l
42a0: 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29  _len,.     (int)
42b0: 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20  p->l_pid, s);.  
42c0: 69 66 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f  if( s==(-1) && o
42d0: 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70  p==F_SETLK && (p
42e0: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  ->l_type==F_RDLC
42f0: 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d  K || p->l_type==
4300: 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20  F_WRLCK) ){.    
4310: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b  struct flock l2;
4320: 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20  .    l2 = *p;.  
4330: 20 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45    fcntl(fd, F_GE
4340: 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69  TLK, &l2);.    i
4350: 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f  f( l2.l_type==F_
4360: 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a  RDLCK ){.      z
4370: 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a  Type = "RDLCK";.
4380: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32      }else if( l2
4390: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  .l_type==F_WRLCK
43a0: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
43b0: 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "WRLCK";.    }
43c0: 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79  else if( l2.l_ty
43d0: 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
43e0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e       zType = "UN
43f0: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LCK";.    }else{
4400: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30  .      assert( 0
4410: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
4420: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
4430: 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d  ("fcntl-failure-
4440: 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64  reason: %s %d %d
4450: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a   %d\n",.       z
4460: 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  Type, (int)l2.l_
4470: 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c  start, (int)l2.l
4480: 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  _len, (int)l2.l_
4490: 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e  pid);.  }.  errn
44a0: 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a  o = savedErrno;.
44b0: 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 64    return s;.}.#d
44c0: 65 66 69 6e 65 20 66 63 6e 74 6c 20 6c 6f 63 6b  efine fcntl lock
44d0: 54 72 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20  Trace.#endif /* 
44e0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43  SQLITE_LOCK_TRAC
44f0: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  E */../*.** The 
4500: 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e  testThreadLockin
4510: 67 42 65 68 61 76 69 6f 72 28 29 20 72 6f 75 74  gBehavior() rout
4520: 69 6e 65 20 6c 61 75 6e 63 68 65 73 20 74 77 6f  ine launches two
4530: 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 74 68 72   separate.** thr
4540: 65 61 64 73 20 6f 6e 20 74 68 69 73 20 72 6f 75  eads on this rou
4550: 74 69 6e 65 2e 20 20 54 68 69 73 20 72 6f 75 74  tine.  This rout
4560: 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
4570: 6c 6f 63 6b 20 61 20 66 69 6c 65 0a 2a 2a 20 64  lock a file.** d
4580: 65 73 63 72 69 70 74 6f 72 20 74 68 65 6e 20 72  escriptor then r
4590: 65 74 75 72 6e 73 2e 20 20 54 68 65 20 73 75 63  eturns.  The suc
45a0: 63 65 73 73 20 6f 72 20 66 61 69 6c 75 72 65 20  cess or failure 
45b0: 6f 66 20 74 68 61 74 20 61 74 74 65 6d 70 74 0a  of that attempt.
45c0: 2a 2a 20 61 6c 6c 6f 77 73 20 74 68 65 20 74 65  ** allows the te
45d0: 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42  stThreadLockingB
45e0: 65 68 61 76 69 6f 72 28 29 20 70 72 6f 63 65 64  ehavior() proced
45f0: 75 72 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ure to determine
4600: 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e  .** whether or n
4610: 6f 74 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f  ot threads can o
4620: 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68  verride each oth
4630: 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74  ers locks..*/.st
4640: 61 74 69 63 20 76 6f 69 64 20 2a 74 68 72 65 61  atic void *threa
4650: 64 4c 6f 63 6b 69 6e 67 54 65 73 74 28 76 6f 69  dLockingTest(voi
4660: 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 74 72 75  d *pArg){.  stru
4670: 63 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74  ct threadTestDat
4680: 61 20 2a 70 44 61 74 61 20 3d 20 28 73 74 72 75  a *pData = (stru
4690: 63 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74  ct threadTestDat
46a0: 61 2a 29 70 41 72 67 3b 0a 20 20 70 44 61 74 61  a*)pArg;.  pData
46b0: 2d 3e 72 65 73 75 6c 74 20 3d 20 66 63 6e 74 6c  ->result = fcntl
46c0: 28 70 44 61 74 61 2d 3e 66 64 2c 20 46 5f 53 45  (pData->fd, F_SE
46d0: 54 4c 4b 2c 20 26 70 44 61 74 61 2d 3e 6c 6f 63  TLK, &pData->loc
46e0: 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 41 72  k);.  return pAr
46f0: 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  g;.}../*.** This
4700: 20 70 72 6f 63 65 64 75 72 65 20 61 74 74 65 6d   procedure attem
4710: 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  pts to determine
4720: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
4730: 74 68 72 65 61 64 73 0a 2a 2a 20 63 61 6e 20 6f  threads.** can o
4740: 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68  verride each oth
4750: 65 72 73 20 6c 6f 63 6b 73 20 74 68 65 6e 20 73  ers locks then s
4760: 65 74 73 20 74 68 65 20 0a 2a 2a 20 74 68 72 65  ets the .** thre
4770: 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f  adsOverrideEachO
4780: 74 68 65 72 73 4c 6f 63 6b 73 20 76 61 72 69 61  thersLocks varia
4790: 62 6c 65 20 61 70 70 72 6f 70 72 69 61 74 65 6c  ble appropriatel
47a0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
47b0: 64 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b  d testThreadLock
47c0: 69 6e 67 42 65 68 61 76 69 6f 72 28 69 6e 74 20  ingBehavior(int 
47d0: 66 64 5f 6f 72 69 67 29 7b 0a 20 20 69 6e 74 20  fd_orig){.  int 
47e0: 66 64 3b 0a 20 20 73 74 72 75 63 74 20 74 68 72  fd;.  struct thr
47f0: 65 61 64 54 65 73 74 44 61 74 61 20 64 5b 32 5d  eadTestData d[2]
4800: 3b 0a 20 20 70 74 68 72 65 61 64 5f 74 20 74 5b  ;.  pthread_t t[
4810: 32 5d 3b 0a 0a 20 20 66 64 20 3d 20 64 75 70 28  2];..  fd = dup(
4820: 66 64 5f 6f 72 69 67 29 3b 0a 20 20 69 66 28 20  fd_orig);.  if( 
4830: 66 64 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  fd<0 ) return;. 
4840: 20 6d 65 6d 73 65 74 28 64 2c 20 30 2c 20 73 69   memset(d, 0, si
4850: 7a 65 6f 66 28 64 29 29 3b 0a 20 20 64 5b 30 5d  zeof(d));.  d[0]
4860: 2e 66 64 20 3d 20 66 64 3b 0a 20 20 64 5b 30 5d  .fd = fd;.  d[0]
4870: 2e 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46  .lock.l_type = F
4880: 5f 52 44 4c 43 4b 3b 0a 20 20 64 5b 30 5d 2e 6c  _RDLCK;.  d[0].l
4890: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  ock.l_len = 1;. 
48a0: 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 73 74 61   d[0].lock.l_sta
48b0: 72 74 20 3d 20 30 3b 0a 20 20 64 5b 30 5d 2e 6c  rt = 0;.  d[0].l
48c0: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
48d0: 45 45 4b 5f 53 45 54 3b 0a 20 20 64 5b 31 5d 20  EEK_SET;.  d[1] 
48e0: 3d 20 64 5b 30 5d 3b 0a 20 20 64 5b 31 5d 2e 6c  = d[0];.  d[1].l
48f0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
4900: 52 4c 43 4b 3b 0a 20 20 70 74 68 72 65 61 64 5f  RLCK;.  pthread_
4910: 63 72 65 61 74 65 28 26 74 5b 30 5d 2c 20 30 2c  create(&t[0], 0,
4920: 20 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65   threadLockingTe
4930: 73 74 2c 20 26 64 5b 30 5d 29 3b 0a 20 20 70 74  st, &d[0]);.  pt
4940: 68 72 65 61 64 5f 63 72 65 61 74 65 28 26 74 5b  hread_create(&t[
4950: 31 5d 2c 20 30 2c 20 74 68 72 65 61 64 4c 6f 63  1], 0, threadLoc
4960: 6b 69 6e 67 54 65 73 74 2c 20 26 64 5b 31 5d 29  kingTest, &d[1])
4970: 3b 0a 20 20 70 74 68 72 65 61 64 5f 6a 6f 69 6e  ;.  pthread_join
4980: 28 74 5b 30 5d 2c 20 30 29 3b 0a 20 20 70 74 68  (t[0], 0);.  pth
4990: 72 65 61 64 5f 6a 6f 69 6e 28 74 5b 31 5d 2c 20  read_join(t[1], 
49a0: 30 29 3b 0a 20 20 63 6c 6f 73 65 28 66 64 29 3b  0);.  close(fd);
49b0: 0a 20 20 74 68 72 65 61 64 73 4f 76 65 72 72 69  .  threadsOverri
49c0: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
49d0: 73 20 3d 20 20 64 5b 30 5d 2e 72 65 73 75 6c 74  s =  d[0].result
49e0: 3d 3d 30 20 26 26 20 64 5b 31 5d 2e 72 65 73 75  ==0 && d[1].resu
49f0: 6c 74 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  lt==0;.}.#endif 
4a00: 2f 2a 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  /* SQLITE_THREAD
4a10: 53 41 46 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  SAFE */../*.** R
4a20: 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b 49 6e 66  elease a lockInf
4a30: 6f 20 73 74 72 75 63 74 75 72 65 20 70 72 65 76  o structure prev
4a40: 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64  iously allocated
4a50: 20 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f   by findLockInfo
4a60: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
4a70: 69 64 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e  id releaseLockIn
4a80: 66 6f 28 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e  fo(struct lockIn
4a90: 66 6f 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 66  fo *pLock){.  if
4aa0: 20 28 70 4c 6f 63 6b 20 3d 3d 20 4e 55 4c 4c 29   (pLock == NULL)
4ab0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 70  .    return;.  p
4ac0: 4c 6f 63 6b 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  Lock->nRef--;.  
4ad0: 69 66 28 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 3d  if( pLock->nRef=
4ae0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
4af0: 33 48 61 73 68 49 6e 73 65 72 74 28 26 6c 6f 63  3HashInsert(&loc
4b00: 6b 48 61 73 68 2c 20 26 70 4c 6f 63 6b 2d 3e 6b  kHash, &pLock->k
4b10: 65 79 2c 20 73 69 7a 65 6f 66 28 70 4c 6f 63 6b  ey, sizeof(pLock
4b20: 2d 3e 6b 65 79 29 2c 20 30 29 3b 0a 20 20 20 20  ->key), 0);.    
4b30: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f  sqlite3_free(pLo
4b40: 63 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ck);.  }.}../*.*
4b50: 2a 20 52 65 6c 65 61 73 65 20 61 20 6f 70 65 6e  * Release a open
4b60: 43 6e 74 20 73 74 72 75 63 74 75 72 65 20 70 72  Cnt structure pr
4b70: 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
4b80: 65 64 20 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e  ed by findLockIn
4b90: 66 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fo()..*/.static 
4ba0: 76 6f 69 64 20 72 65 6c 65 61 73 65 4f 70 65 6e  void releaseOpen
4bb0: 43 6e 74 28 73 74 72 75 63 74 20 6f 70 65 6e 43  Cnt(struct openC
4bc0: 6e 74 20 2a 70 4f 70 65 6e 29 7b 0a 20 20 69 66  nt *pOpen){.  if
4bd0: 20 28 70 4f 70 65 6e 20 3d 3d 20 4e 55 4c 4c 29   (pOpen == NULL)
4be0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 70  .    return;.  p
4bf0: 4f 70 65 6e 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  Open->nRef--;.  
4c00: 69 66 28 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 3d  if( pOpen->nRef=
4c10: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
4c20: 33 48 61 73 68 49 6e 73 65 72 74 28 26 6f 70 65  3HashInsert(&ope
4c30: 6e 48 61 73 68 2c 20 26 70 4f 70 65 6e 2d 3e 6b  nHash, &pOpen->k
4c40: 65 79 2c 20 73 69 7a 65 6f 66 28 70 4f 70 65 6e  ey, sizeof(pOpen
4c50: 2d 3e 6b 65 79 29 2c 20 30 29 3b 0a 20 20 20 20  ->key), 0);.    
4c60: 66 72 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e  free(pOpen->aPen
4c70: 64 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  ding);.    sqlit
4c80: 65 33 5f 66 72 65 65 28 70 4f 70 65 6e 29 3b 0a  e3_free(pOpen);.
4c90: 20 20 7d 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51    }.}..#ifdef SQ
4ca0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
4cb0: 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20  ING_STYLE./*.** 
4cc0: 54 65 73 74 73 20 61 20 62 79 74 65 2d 72 61 6e  Tests a byte-ran
4cd0: 67 65 20 6c 6f 63 6b 69 6e 67 20 71 75 65 72 79  ge locking query
4ce0: 20 74 6f 20 73 65 65 20 69 66 20 62 79 74 65 20   to see if byte 
4cf0: 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20  range locks are 
4d00: 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 2c 20 69  .** supported, i
4d10: 66 20 6e 6f 74 20 77 65 20 66 61 6c 6c 20 62 61  f not we fall ba
4d20: 63 6b 20 74 6f 20 64 6f 74 6c 6f 63 6b 4c 6f 63  ck to dotlockLoc
4d30: 6b 69 6e 67 53 74 79 6c 65 2e 0a 2a 2f 0a 73 74  kingStyle..*/.st
4d40: 61 74 69 63 20 73 71 6c 69 74 65 33 4c 6f 63 6b  atic sqlite3Lock
4d50: 69 6e 67 53 74 79 6c 65 20 73 71 6c 69 74 65 33  ingStyle sqlite3
4d60: 54 65 73 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  TestLockingStyle
4d70: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
4d80: 66 69 6c 65 50 61 74 68 2c 20 0a 20 20 69 6e 74  filePath, .  int
4d90: 20 66 64 0a 29 7b 0a 20 20 2f 2a 20 74 65 73 74   fd.){.  /* test
4da0: 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
4db0: 20 75 73 69 6e 67 20 66 63 6e 74 6c 20 2a 2f 0a   using fcntl */.
4dc0: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
4dd0: 6f 63 6b 49 6e 66 6f 3b 0a 20 20 0a 20 20 6c 6f  ockInfo;.  .  lo
4de0: 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31  ckInfo.l_len = 1
4df0: 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73  ;.  lockInfo.l_s
4e00: 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b  tart = 0;.  lock
4e10: 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  Info.l_whence = 
4e20: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b  SEEK_SET;.  lock
4e30: 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  Info.l_type = F_
4e40: 52 44 4c 43 4b 3b 0a 20 20 0a 20 20 69 66 28 20  RDLCK;.  .  if( 
4e50: 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c  fcntl(fd, F_GETL
4e60: 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d  K, &lockInfo)!=-
4e70: 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  1 ) {.    return
4e80: 20 70 6f 73 69 78 4c 6f 63 6b 69 6e 67 53 74 79   posixLockingSty
4e90: 6c 65 3b 0a 20 20 7d 20 0a 20 20 0a 20 20 2f 2a  le;.  } .  .  /*
4ea0: 20 74 65 73 74 69 6e 67 20 66 6f 72 20 66 6c 6f   testing for flo
4eb0: 63 6b 20 63 61 6e 20 67 69 76 65 20 66 61 6c 73  ck can give fals
4ec0: 65 20 70 6f 73 69 74 69 76 65 73 2e 20 20 53 6f  e positives.  So
4ed0: 20 69 66 20 69 66 20 74 68 65 20 61 62 6f 76 65   if if the above
4ee0: 20 74 65 73 74 0a 20 20 2a 2a 20 66 61 69 6c 73   test.  ** fails
4ef0: 2c 20 74 68 65 6e 20 77 65 20 66 61 6c 6c 20 62  , then we fall b
4f00: 61 63 6b 20 74 6f 20 75 73 69 6e 67 20 64 6f 74  ack to using dot
4f10: 2d 6c 6f 63 6b 20 73 74 79 6c 65 20 6c 6f 63 6b  -lock style lock
4f20: 69 6e 67 2e 0a 20 20 2a 2f 20 20 0a 20 20 72 65  ing..  */  .  re
4f30: 74 75 72 6e 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b  turn dotlockLock
4f40: 69 6e 67 53 74 79 6c 65 3b 0a 7d 0a 0a 2f 2a 20  ingStyle;.}../* 
4f50: 0a 2a 2a 20 45 78 61 6d 69 6e 65 73 20 74 68 65  .** Examines the
4f60: 20 66 5f 66 73 74 79 70 65 6e 61 6d 65 20 65 6e   f_fstypename en
4f70: 74 72 79 20 69 6e 20 74 68 65 20 73 74 61 74 66  try in the statf
4f80: 73 20 73 74 72 75 63 74 75 72 65 20 61 73 20 72  s structure as r
4f90: 65 74 75 72 6e 65 64 20 62 79 20 0a 2a 2a 20 73  eturned by .** s
4fa0: 74 61 74 28 29 20 66 6f 72 20 74 68 65 20 66 69  tat() for the fi
4fb0: 6c 65 20 73 79 73 74 65 6d 20 68 6f 73 74 69 6e  le system hostin
4fc0: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
4fd0: 69 6c 65 2c 20 61 73 73 69 67 6e 73 20 74 68 65  ile, assigns the
4fe0: 20 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65   .** appropriate
4ff0: 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 62   locking style b
5000: 61 73 65 64 20 6f 6e 20 69 74 73 20 76 61 6c 75  ased on its valu
5010: 65 2e 20 20 54 68 65 73 65 20 76 61 6c 75 65 73  e.  These values
5020: 20 61 6e 64 20 0a 2a 2a 20 61 73 73 69 67 6e 6d   and .** assignm
5030: 65 6e 74 73 20 61 72 65 20 62 61 73 65 64 20 6f  ents are based o
5040: 6e 20 44 61 72 77 69 6e 2f 4f 53 58 20 62 65 68  n Darwin/OSX beh
5050: 61 76 69 6f 72 20 61 6e 64 20 68 61 76 65 20 6e  avior and have n
5060: 6f 74 20 62 65 65 6e 20 74 65 73 74 65 64 20 6f  ot been tested o
5070: 6e 20 0a 2a 2a 20 6f 74 68 65 72 20 73 79 73 74  n .** other syst
5080: 65 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ems..*/.static s
5090: 71 6c 69 74 65 33 4c 6f 63 6b 69 6e 67 53 74 79  qlite3LockingSty
50a0: 6c 65 20 73 71 6c 69 74 65 33 44 65 74 65 63 74  le sqlite3Detect
50b0: 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 0a 20 20  LockingStyle(.  
50c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
50d0: 50 61 74 68 2c 20 0a 20 20 69 6e 74 20 66 64 0a  Path, .  int fd.
50e0: 29 7b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ){..#ifdef SQLIT
50f0: 45 5f 46 49 58 45 44 5f 4c 4f 43 4b 49 4e 47 5f  E_FIXED_LOCKING_
5100: 53 54 59 4c 45 0a 20 20 72 65 74 75 72 6e 20 28  STYLE.  return (
5110: 73 71 6c 69 74 65 33 4c 6f 63 6b 69 6e 67 53 74  sqlite3LockingSt
5120: 79 6c 65 29 53 51 4c 49 54 45 5f 46 49 58 45 44  yle)SQLITE_FIXED
5130: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 3b 0a  _LOCKING_STYLE;.
5140: 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 73  #else.  struct s
5150: 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 0a 20  tatfs fsInfo;.. 
5160: 20 69 66 20 28 73 74 61 74 66 73 28 66 69 6c 65   if (statfs(file
5170: 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d  Path, &fsInfo) =
5180: 3d 20 2d 31 29 0a 20 20 20 20 72 65 74 75 72 6e  = -1).    return
5190: 20 73 71 6c 69 74 65 33 54 65 73 74 4c 6f 63 6b   sqlite3TestLock
51a0: 69 6e 67 53 74 79 6c 65 28 66 69 6c 65 50 61 74  ingStyle(filePat
51b0: 68 2c 20 66 64 29 3b 0a 20 20 0a 20 20 69 66 20  h, fd);.  .  if 
51c0: 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20  (fsInfo.f_flags 
51d0: 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 29 0a 20 20  & MNT_RDONLY).  
51e0: 20 20 72 65 74 75 72 6e 20 6e 6f 4c 6f 63 6b 69    return noLocki
51f0: 6e 67 53 74 79 6c 65 3b 0a 20 20 0a 20 20 69 66  ngStyle;.  .  if
5200: 28 20 28 21 73 74 72 63 6d 70 28 66 73 49 6e 66  ( (!strcmp(fsInf
5210: 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
5220: 22 68 66 73 22 29 29 20 7c 7c 0a 20 20 20 20 28  "hfs")) ||.    (
5230: 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66  !strcmp(fsInfo.f
5240: 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 75 66  _fstypename, "uf
5250: 73 22 29 29 20 29 0a 20 20 20 20 20 20 20 20 20  s")) ).         
5260: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 6f         return po
5270: 73 69 78 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b  sixLockingStyle;
5280: 0a 20 20 0a 20 20 69 66 28 21 73 74 72 63 6d 70  .  .  if(!strcmp
5290: 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65  (fsInfo.f_fstype
52a0: 6e 61 6d 65 2c 20 22 61 66 70 66 73 22 29 29 0a  name, "afpfs")).
52b0: 20 20 20 20 72 65 74 75 72 6e 20 61 66 70 4c 6f      return afpLo
52c0: 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 0a 20  ckingStyle;.  . 
52d0: 20 69 66 28 21 73 74 72 63 6d 70 28 66 73 49 6e   if(!strcmp(fsIn
52e0: 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
52f0: 20 22 6e 66 73 22 29 29 20 0a 20 20 20 20 72 65   "nfs")) .    re
5300: 74 75 72 6e 20 73 71 6c 69 74 65 33 54 65 73 74  turn sqlite3Test
5310: 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 66 69 6c  LockingStyle(fil
5320: 65 50 61 74 68 2c 20 66 64 29 3b 0a 20 20 0a 20  ePath, fd);.  . 
5330: 20 69 66 28 21 73 74 72 63 6d 70 28 66 73 49 6e   if(!strcmp(fsIn
5340: 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
5350: 20 22 73 6d 62 66 73 22 29 29 0a 20 20 20 20 72   "smbfs")).    r
5360: 65 74 75 72 6e 20 66 6c 6f 63 6b 4c 6f 63 6b 69  eturn flockLocki
5370: 6e 67 53 74 79 6c 65 3b 0a 20 20 0a 20 20 69 66  ngStyle;.  .  if
5380: 28 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e  (!strcmp(fsInfo.
5390: 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 6d  f_fstypename, "m
53a0: 73 64 6f 73 22 29 29 0a 20 20 20 20 72 65 74 75  sdos")).    retu
53b0: 72 6e 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  rn dotlockLockin
53c0: 67 53 74 79 6c 65 3b 0a 20 20 0a 20 20 69 66 28  gStyle;.  .  if(
53d0: 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66  !strcmp(fsInfo.f
53e0: 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 77 65  _fstypename, "we
53f0: 62 64 61 76 22 29 29 0a 20 20 20 20 72 65 74 75  bdav")).    retu
5400: 72 6e 20 75 6e 73 75 70 70 6f 72 74 65 64 4c 6f  rn unsupportedLo
5410: 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 0a 20  ckingStyle;.  . 
5420: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54   return sqlite3T
5430: 65 73 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28  estLockingStyle(
5440: 66 69 6c 65 50 61 74 68 2c 20 66 64 29 3b 20 20  filePath, fd);  
5450: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
5460: 45 5f 46 49 58 45 44 5f 4c 4f 43 4b 49 4e 47 5f  E_FIXED_LOCKING_
5470: 53 54 59 4c 45 20 2a 2f 0a 7d 0a 0a 23 65 6e 64  STYLE */.}..#end
5480: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
5490: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
54a0: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  E */../*.** Give
54b0: 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  n a file descrip
54c0: 74 6f 72 2c 20 6c 6f 63 61 74 65 20 6c 6f 63 6b  tor, locate lock
54d0: 49 6e 66 6f 20 61 6e 64 20 6f 70 65 6e 43 6e 74  Info and openCnt
54e0: 20 73 74 72 75 63 74 75 72 65 73 20 74 68 61 74   structures that
54f0: 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74 68  .** describes th
5500: 61 74 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  at file descript
5510: 6f 72 2e 20 20 43 72 65 61 74 65 20 6e 65 77 20  or.  Create new 
5520: 6f 6e 65 73 20 69 66 20 6e 65 63 65 73 73 61 72  ones if necessar
5530: 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74 75 72  y.  The.** retur
5540: 6e 20 76 61 6c 75 65 73 20 6d 69 67 68 74 20 62  n values might b
5550: 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  e uninitialized 
5560: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
5570: 72 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  rs..**.** Return
5580: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
5590: 72 72 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrors..*/.static
55a0: 20 69 6e 74 20 66 69 6e 64 4c 6f 63 6b 49 6e 66   int findLockInf
55b0: 6f 28 0a 20 20 69 6e 74 20 66 64 2c 20 20 20 20  o(.  int fd,    
55c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55d0: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
55e0: 73 63 72 69 70 74 6f 72 20 75 73 65 64 20 69 6e  scriptor used in
55f0: 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74   the key */.  st
5600: 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 2a  ruct lockInfo **
5610: 70 70 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 52 65  ppLock,    /* Re
5620: 74 75 72 6e 20 74 68 65 20 6c 6f 63 6b 49 6e 66  turn the lockInf
5630: 6f 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  o structure here
5640: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6f 70 65   */.  struct ope
5650: 6e 43 6e 74 20 2a 2a 70 70 4f 70 65 6e 20 20 20  nCnt **ppOpen   
5660: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
5670: 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75   openCnt structu
5680: 72 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  re here */.){.  
5690: 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74  int rc;.  struct
56a0: 20 6c 6f 63 6b 4b 65 79 20 6b 65 79 31 3b 0a 20   lockKey key1;. 
56b0: 20 73 74 72 75 63 74 20 6f 70 65 6e 4b 65 79 20   struct openKey 
56c0: 6b 65 79 32 3b 0a 20 20 73 74 72 75 63 74 20 73  key2;.  struct s
56d0: 74 61 74 20 73 74 61 74 62 75 66 3b 0a 20 20 73  tat statbuf;.  s
56e0: 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a  truct lockInfo *
56f0: 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20  pLock;.  struct 
5700: 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 0a  openCnt *pOpen;.
5710: 20 20 72 63 20 3d 20 66 73 74 61 74 28 66 64 2c    rc = fstat(fd,
5720: 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66   &statbuf);.  if
5730: 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
5740: 20 31 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 6b   1;..  memset(&k
5750: 65 79 31 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b  ey1, 0, sizeof(k
5760: 65 79 31 29 29 3b 0a 20 20 6b 65 79 31 2e 64 65  ey1));.  key1.de
5770: 76 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64  v = statbuf.st_d
5780: 65 76 3b 0a 20 20 6b 65 79 31 2e 69 6e 6f 20 3d  ev;.  key1.ino =
5790: 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b   statbuf.st_ino;
57a0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
57b0: 41 44 53 41 46 45 0a 20 20 69 66 28 20 74 68 72  ADSAFE.  if( thr
57c0: 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68  eadsOverrideEach
57d0: 4f 74 68 65 72 73 4c 6f 63 6b 73 3c 30 20 29 7b  OthersLocks<0 ){
57e0: 0a 20 20 20 20 74 65 73 74 54 68 72 65 61 64 4c  .    testThreadL
57f0: 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 66  ockingBehavior(f
5800: 64 29 3b 0a 20 20 7d 0a 20 20 6b 65 79 31 2e 74  d);.  }.  key1.t
5810: 69 64 20 3d 20 74 68 72 65 61 64 73 4f 76 65 72  id = threadsOver
5820: 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f  rideEachOthersLo
5830: 63 6b 73 20 3f 20 30 20 3a 20 70 74 68 72 65 61  cks ? 0 : pthrea
5840: 64 5f 73 65 6c 66 28 29 3b 0a 23 65 6e 64 69 66  d_self();.#endif
5850: 0a 20 20 6d 65 6d 73 65 74 28 26 6b 65 79 32 2c  .  memset(&key2,
5860: 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 32 29   0, sizeof(key2)
5870: 29 3b 0a 20 20 6b 65 79 32 2e 64 65 76 20 3d 20  );.  key2.dev = 
5880: 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a  statbuf.st_dev;.
5890: 20 20 6b 65 79 32 2e 69 6e 6f 20 3d 20 73 74 61    key2.ino = sta
58a0: 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 20 20 70  tbuf.st_ino;.  p
58b0: 4c 6f 63 6b 20 3d 20 28 73 74 72 75 63 74 20 6c  Lock = (struct l
58c0: 6f 63 6b 49 6e 66 6f 2a 29 73 71 6c 69 74 65 33  ockInfo*)sqlite3
58d0: 48 61 73 68 46 69 6e 64 28 26 6c 6f 63 6b 48 61  HashFind(&lockHa
58e0: 73 68 2c 20 26 6b 65 79 31 2c 20 73 69 7a 65 6f  sh, &key1, sizeo
58f0: 66 28 6b 65 79 31 29 29 3b 0a 20 20 69 66 28 20  f(key1));.  if( 
5900: 70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  pLock==0 ){.    
5910: 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20  struct lockInfo 
5920: 2a 70 4f 6c 64 3b 0a 20 20 20 20 70 4c 6f 63 6b  *pOld;.    pLock
5930: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
5940: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4c 6f 63 6b  c( sizeof(*pLock
5950: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  ) );.    if( pLo
5960: 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ck==0 ){.      r
5970: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74  c = 1;.      got
5980: 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69  o exit_findlocki
5990: 6e 66 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nfo;.    }.    p
59a0: 4c 6f 63 6b 2d 3e 6b 65 79 20 3d 20 6b 65 79 31  Lock->key = key1
59b0: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65  ;.    pLock->nRe
59c0: 66 20 3d 20 31 3b 0a 20 20 20 20 70 4c 6f 63 6b  f = 1;.    pLock
59d0: 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70  ->cnt = 0;.    p
59e0: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  Lock->locktype =
59f0: 20 30 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73   0;.    pOld = s
5a00: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
5a10: 28 26 6c 6f 63 6b 48 61 73 68 2c 20 26 70 4c 6f  (&lockHash, &pLo
5a20: 63 6b 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f 66 28  ck->key, sizeof(
5a30: 6b 65 79 31 29 2c 20 70 4c 6f 63 6b 29 3b 0a 20  key1), pLock);. 
5a40: 20 20 20 69 66 28 20 70 4f 6c 64 21 3d 30 20 29     if( pOld!=0 )
5a50: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
5a60: 70 4f 6c 64 3d 3d 70 4c 6f 63 6b 20 29 3b 0a 20  pOld==pLock );. 
5a70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
5a80: 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  e(pLock);.      
5a90: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  rc = 1;.      go
5aa0: 74 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b  to exit_findlock
5ab0: 69 6e 66 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  info;.    }.  }e
5ac0: 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  lse{.    pLock->
5ad0: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70  nRef++;.  }.  *p
5ae0: 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20  pLock = pLock;. 
5af0: 20 69 66 28 20 70 70 4f 70 65 6e 21 3d 30 20 29   if( ppOpen!=0 )
5b00: 7b 0a 20 20 20 20 70 4f 70 65 6e 20 3d 20 28 73  {.    pOpen = (s
5b10: 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 2a 29 73  truct openCnt*)s
5b20: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
5b30: 6f 70 65 6e 48 61 73 68 2c 20 26 6b 65 79 32 2c  openHash, &key2,
5b40: 20 73 69 7a 65 6f 66 28 6b 65 79 32 29 29 3b 0a   sizeof(key2));.
5b50: 20 20 20 20 69 66 28 20 70 4f 70 65 6e 3d 3d 30      if( pOpen==0
5b60: 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
5b70: 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 6c 64 3b 0a   openCnt *pOld;.
5b80: 20 20 20 20 20 20 70 4f 70 65 6e 20 3d 20 73 71        pOpen = sq
5b90: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
5ba0: 7a 65 6f 66 28 2a 70 4f 70 65 6e 29 20 29 3b 0a  zeof(*pOpen) );.
5bb0: 20 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e 3d        if( pOpen=
5bc0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
5bd0: 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 4c  leaseLockInfo(pL
5be0: 6f 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ock);.        rc
5bf0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 1;.        go
5c00: 74 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b  to exit_findlock
5c10: 69 6e 66 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  info;.      }.  
5c20: 20 20 20 20 70 4f 70 65 6e 2d 3e 6b 65 79 20 3d      pOpen->key =
5c30: 20 6b 65 79 32 3b 0a 20 20 20 20 20 20 70 4f 70   key2;.      pOp
5c40: 65 6e 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  en->nRef = 1;.  
5c50: 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b      pOpen->nLock
5c60: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 70 65   = 0;.      pOpe
5c70: 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30 3b  n->nPending = 0;
5c80: 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50  .      pOpen->aP
5c90: 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20  ending = 0;.    
5ca0: 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33    pOld = sqlite3
5cb0: 48 61 73 68 49 6e 73 65 72 74 28 26 6f 70 65 6e  HashInsert(&open
5cc0: 48 61 73 68 2c 20 26 70 4f 70 65 6e 2d 3e 6b 65  Hash, &pOpen->ke
5cd0: 79 2c 20 73 69 7a 65 6f 66 28 6b 65 79 32 29 2c  y, sizeof(key2),
5ce0: 20 70 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69   pOpen);.      i
5cf0: 66 28 20 70 4f 6c 64 21 3d 30 20 29 7b 0a 20 20  f( pOld!=0 ){.  
5d00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
5d10: 6c 64 3d 3d 70 4f 70 65 6e 20 29 3b 0a 20 20 20  ld==pOpen );.   
5d20: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
5d30: 65 28 70 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  e(pOpen);.      
5d40: 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66    releaseLockInf
5d50: 6f 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  o(pLock);.      
5d60: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
5d70: 20 20 67 6f 74 6f 20 65 78 69 74 5f 66 69 6e 64    goto exit_find
5d80: 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20 20 20 20  lockinfo;.      
5d90: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
5da0: 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 2b 2b     pOpen->nRef++
5db0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 70 4f  ;.    }.    *ppO
5dc0: 70 65 6e 20 3d 20 70 4f 70 65 6e 3b 0a 20 20 7d  pen = pOpen;.  }
5dd0: 0a 0a 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69  ..exit_findlocki
5de0: 6e 66 6f 3a 0a 20 20 72 65 74 75 72 6e 20 72 63  nfo:.  return rc
5df0: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
5e00: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 48  TE_DEBUG./*.** H
5e10: 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66  elper function f
5e20: 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75 74 20  or printing out 
5e30: 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f  trace informatio
5e40: 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69 6e 67  n from debugging
5e50: 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20 54 68  .** binaries. Th
5e60: 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  is returns the s
5e70: 74 72 69 6e 67 20 72 65 70 72 65 73 65 74 61 74  tring represetat
5e80: 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70 70 6c  ion of the suppl
5e90: 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6c  ied.** integer l
5ea0: 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74 61  ock-type..*/.sta
5eb0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
5ec0: 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 69 6e 74  locktypeName(int
5ed0: 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 73 77   locktype){.  sw
5ee0: 69 74 63 68 28 20 6c 6f 63 6b 74 79 70 65 20 29  itch( locktype )
5ef0: 7b 0a 20 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b  {.  case NO_LOCK
5f00: 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b  : return "NONE";
5f10: 0a 20 20 63 61 73 65 20 53 48 41 52 45 44 5f 4c  .  case SHARED_L
5f20: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53 48 41  OCK: return "SHA
5f30: 52 45 44 22 3b 0a 20 20 63 61 73 65 20 52 45 53  RED";.  case RES
5f40: 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75  ERVED_LOCK: retu
5f50: 72 6e 20 22 52 45 53 45 52 56 45 44 22 3b 0a 20  rn "RESERVED";. 
5f60: 20 63 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f   case PENDING_LO
5f70: 43 4b 3a 20 72 65 74 75 72 6e 20 22 50 45 4e 44  CK: return "PEND
5f80: 49 4e 47 22 3b 0a 20 20 63 61 73 65 20 45 58 43  ING";.  case EXC
5f90: 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74  LUSIVE_LOCK: ret
5fa0: 75 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22 3b  urn "EXCLUSIVE";
5fb0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 45  .  }.  return "E
5fc0: 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a  RROR";.}.#endif.
5fd0: 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65  ./*.** If we are
5fe0: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 61 20   currently in a 
5ff0: 64 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64  different thread
6000: 20 74 68 61 6e 20 74 68 65 20 74 68 72 65 61 64   than the thread
6010: 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 75 6e 69   that the.** uni
6020: 78 46 69 6c 65 20 61 72 67 75 6d 65 6e 74 20 62  xFile argument b
6030: 65 6c 6f 6e 67 73 20 74 6f 2c 20 74 68 65 6e 20  elongs to, then 
6040: 74 72 61 6e 73 66 65 72 20 6f 77 6e 65 72 73 68  transfer ownersh
6050: 69 70 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69  ip of the unixFi
6060: 6c 65 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 74 68  le.** over to th
6070: 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
6080: 2e 0a 2a 2a 0a 2a 2a 20 41 20 75 6e 69 78 46 69  ..**.** A unixFi
6090: 6c 65 20 69 73 20 6f 6e 6c 79 20 6f 77 6e 65 64  le is only owned
60a0: 20 62 79 20 61 20 74 68 72 65 61 64 20 6f 6e 20   by a thread on 
60b0: 73 79 73 74 65 6d 73 20 77 68 65 72 65 20 6f 6e  systems where on
60c0: 65 20 74 68 72 65 61 64 20 69 73 0a 2a 2a 20 75  e thread is.** u
60d0: 6e 61 62 6c 65 20 74 6f 20 6f 76 65 72 72 69 64  nable to overrid
60e0: 65 20 6c 6f 63 6b 73 20 63 72 65 61 74 65 64 20  e locks created 
60f0: 62 79 20 61 20 64 69 66 66 65 72 65 6e 74 20 74  by a different t
6100: 68 72 65 61 64 2e 20 20 52 65 64 48 61 74 39 20  hread.  RedHat9 
6110: 69 73 0a 2a 2a 20 61 6e 20 65 78 61 6d 70 6c 65  is.** an example
6120: 20 6f 66 20 73 75 63 68 20 61 20 73 79 73 74 65   of such a syste
6130: 6d 2e 0a 2a 2a 0a 2a 2a 20 4f 77 6e 65 72 73 68  m..**.** Ownersh
6140: 69 70 20 74 72 61 6e 73 66 65 72 20 69 73 20 6f  ip transfer is o
6150: 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 69 66 20 74  nly allowed if t
6160: 68 65 20 75 6e 69 78 46 69 6c 65 20 69 73 20 63  he unixFile is c
6170: 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65  urrently unlocke
6180: 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20 75 6e 69  d..** If the uni
6190: 78 46 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20  xFile is locked 
61a0: 61 6e 64 20 61 6e 20 6f 77 6e 65 72 73 68 69 70  and an ownership
61b0: 20 69 73 20 77 72 6f 6e 67 2c 20 74 68 65 6e 20   is wrong, then 
61c0: 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  return.** SQLITE
61d0: 5f 4d 49 53 55 53 45 2e 20 20 53 51 4c 49 54 45  _MISUSE.  SQLITE
61e0: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
61f0: 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
6200: 72 6b 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  rks..*/.#if SQLI
6210: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 73 74  TE_THREADSAFE.st
6220: 61 74 69 63 20 69 6e 74 20 74 72 61 6e 73 66 65  atic int transfe
6230: 72 4f 77 6e 65 72 73 68 69 70 28 75 6e 69 78 46  rOwnership(unixF
6240: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
6250: 6e 74 20 72 63 3b 0a 20 20 70 74 68 72 65 61 64  nt rc;.  pthread
6260: 5f 74 20 68 53 65 6c 66 3b 0a 20 20 69 66 28 20  _t hSelf;.  if( 
6270: 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45  threadsOverrideE
6280: 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 29  achOthersLocks )
6290: 7b 0a 20 20 20 20 2f 2a 20 4f 77 6e 65 72 73 68  {.    /* Ownersh
62a0: 69 70 20 74 72 61 6e 73 66 65 72 73 20 6e 6f 74  ip transfers not
62b0: 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 69 73 20   needed on this 
62c0: 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 72 65  system */.    re
62d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
62e0: 20 20 7d 0a 20 20 68 53 65 6c 66 20 3d 20 70 74    }.  hSelf = pt
62f0: 68 72 65 61 64 5f 73 65 6c 66 28 29 3b 0a 20 20  hread_self();.  
6300: 69 66 28 20 70 74 68 72 65 61 64 5f 65 71 75 61  if( pthread_equa
6310: 6c 28 70 46 69 6c 65 2d 3e 74 69 64 2c 20 68 53  l(pFile->tid, hS
6320: 65 6c 66 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57  elf) ){.    /* W
6330: 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74  e are still in t
6340: 68 65 20 73 61 6d 65 20 74 68 72 65 61 64 20 2a  he same thread *
6350: 2f 0a 20 20 20 20 4f 53 54 52 41 43 45 31 28 22  /.    OSTRACE1("
6360: 4e 6f 2d 74 72 61 6e 73 66 65 72 2c 20 73 61 6d  No-transfer, sam
6370: 65 20 74 68 72 65 61 64 5c 6e 22 29 3b 0a 20 20  e thread\n");.  
6380: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6390: 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46  OK;.  }.  if( pF
63a0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e  ile->locktype!=N
63b0: 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a  O_LOCK ){.    /*
63c0: 20 57 65 20 63 61 6e 6e 6f 74 20 63 68 61 6e 67   We cannot chang
63d0: 65 20 6f 77 6e 65 72 73 68 69 70 20 77 68 69 6c  e ownership whil
63e0: 65 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e 67  e we are holding
63f0: 20 61 20 6c 6f 63 6b 21 20 2a 2f 0a 20 20 20 20   a lock! */.    
6400: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
6410: 53 55 53 45 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  SUSE;.  }.  OSTR
6420: 41 43 45 34 28 22 54 72 61 6e 73 66 65 72 20 6f  ACE4("Transfer o
6430: 77 6e 65 72 73 68 69 70 20 6f 66 20 25 64 20 66  wnership of %d f
6440: 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c  rom %d to %d\n",
6450: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69  .            pFi
6460: 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 74 69  le->h, pFile->ti
6470: 64 2c 20 68 53 65 6c 66 29 3b 0a 20 20 70 46 69  d, hSelf);.  pFi
6480: 6c 65 2d 3e 74 69 64 20 3d 20 68 53 65 6c 66 3b  le->tid = hSelf;
6490: 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 70 4c  .  if (pFile->pL
64a0: 6f 63 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 20  ock != NULL) {. 
64b0: 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e     releaseLockIn
64c0: 66 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29  fo(pFile->pLock)
64d0: 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 4c  ;.    rc = findL
64e0: 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 68  ockInfo(pFile->h
64f0: 2c 20 26 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2c  , &pFile->pLock,
6500: 20 30 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45   0);.    OSTRACE
6510: 35 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 69 73  5("LOCK    %d is
6520: 20 6e 6f 77 20 25 73 28 25 73 2c 25 64 29 5c 6e   now %s(%s,%d)\n
6530: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
6540: 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65          locktype
6550: 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b  Name(pFile->lock
6560: 74 79 70 65 29 2c 0a 20 20 20 20 20 20 20 20 20  type),.         
6570: 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70    locktypeName(p
6580: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63  File->pLock->loc
6590: 6b 74 79 70 65 29 2c 20 70 46 69 6c 65 2d 3e 70  ktype), pFile->p
65a0: 4c 6f 63 6b 2d 3e 63 6e 74 29 3b 0a 20 20 20 20  Lock->cnt);.    
65b0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65  return rc;.  } e
65c0: 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  lse {.    return
65d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
65e0: 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4f 6e 20  }.#else.  /* On 
65f0: 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 20  single-threaded 
6600: 62 75 69 6c 64 73 2c 20 6f 77 6e 65 72 73 68 69  builds, ownershi
6610: 70 20 74 72 61 6e 73 66 65 72 20 69 73 20 61 20  p transfer is a 
6620: 6e 6f 2d 6f 70 20 2a 2f 0a 23 20 64 65 66 69 6e  no-op */.# defin
6630: 65 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73  e transferOwners
6640: 68 69 70 28 58 29 20 53 51 4c 49 54 45 5f 4f 4b  hip(X) SQLITE_OK
6650: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53  .#endif../*.** S
6660: 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65  eek to the offse
6670: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
6680: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
6690: 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 0a   then read cnt .
66a0: 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42  ** bytes into pB
66b0: 75 66 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e  uf. Return the n
66c0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
66d0: 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a  ctually read..**
66e0: 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75 20  .** NB:  If you 
66f0: 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44  define USE_PREAD
6700: 20 6f 72 20 55 53 45 5f 50 52 45 41 44 36 34 2c   or USE_PREAD64,
6710: 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 61   then it might a
6720: 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73  lso.** be necess
6730: 61 72 79 20 74 6f 20 64 65 66 69 6e 65 20 5f 58  ary to define _X
6740: 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62  OPEN_SOURCE to b
6750: 65 20 35 30 30 2e 20 20 54 68 69 73 20 76 61 72  e 500.  This var
6760: 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20  ies from.** one 
6770: 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65  system to anothe
6780: 72 2e 20 20 53 69 6e 63 65 20 53 51 4c 69 74 65  r.  Since SQLite
6790: 20 64 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e 65   does not define
67a0: 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20 61 6e   USE_PREAD.** an
67b0: 79 20 61 6e 79 20 66 6f 72 6d 20 62 79 20 64 65  y any form by de
67c0: 66 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c 20 6e  fault, we will n
67d0: 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65  ot attempt to de
67e0: 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52  fine _XOPEN_SOUR
67f0: 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65  CE..** See ticke
6800: 74 73 20 23 32 37 34 31 20 61 6e 64 20 23 32 36  ts #2741 and #26
6810: 38 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  81..*/.static in
6820: 74 20 73 65 65 6b 41 6e 64 52 65 61 64 28 75 6e  t seekAndRead(un
6830: 69 78 46 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69  ixFile *id, sqli
6840: 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
6850: 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e  , void *pBuf, in
6860: 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f  t cnt){.  int go
6870: 74 3b 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73  t;.  i64 newOffs
6880: 65 74 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41 52  et;.  TIMER_STAR
6890: 54 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  T;.#if defined(U
68a0: 53 45 5f 50 52 45 41 44 29 0a 20 20 67 6f 74 20  SE_PREAD).  got 
68b0: 3d 20 70 72 65 61 64 28 69 64 2d 3e 68 2c 20 70  = pread(id->h, p
68c0: 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
68d0: 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
68e0: 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29  rror( got = -1 )
68f0: 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
6900: 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 67  USE_PREAD64).  g
6910: 6f 74 20 3d 20 70 72 65 61 64 36 34 28 69 64 2d  ot = pread64(id-
6920: 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f  >h, pBuf, cnt, o
6930: 66 66 73 65 74 29 3b 0a 20 20 53 69 6d 75 6c 61  ffset);.  Simula
6940: 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d  teIOError( got =
6950: 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20 6e   -1 );.#else.  n
6960: 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b  ewOffset = lseek
6970: 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20  (id->h, offset, 
6980: 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 53 69 6d  SEEK_SET);.  Sim
6990: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 6e 65  ulateIOError( ne
69a0: 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20 20 69  wOffset-- );.  i
69b0: 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66  f( newOffset!=of
69c0: 66 73 65 74 20 29 7b 0a 20 20 20 20 72 65 74 75  fset ){.    retu
69d0: 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 67 6f 74  rn -1;.  }.  got
69e0: 20 3d 20 72 65 61 64 28 69 64 2d 3e 68 2c 20 70   = read(id->h, p
69f0: 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69  Buf, cnt);.#endi
6a00: 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20  f.  TIMER_END;. 
6a10: 20 4f 53 54 52 41 43 45 35 28 22 52 45 41 44 20   OSTRACE5("READ 
6a20: 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c     %-3d %5d %7ll
6a30: 64 20 25 64 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20  d %d\n", id->h, 
6a40: 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d  got, offset, TIM
6a50: 45 52 5f 45 4c 41 50 53 45 44 29 3b 0a 20 20 72  ER_ELAPSED);.  r
6a60: 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 2f 2a  eturn got;.}../*
6a70: 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72  .** Read data fr
6a80: 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61  om a file into a
6a90: 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e   buffer.  Return
6aa0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c   SQLITE_OK if al
6ab0: 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20  l.** bytes were 
6ac0: 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c  read successfull
6ad0: 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45  y and SQLITE_IOE
6ae0: 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  RR if anything g
6af0: 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f  oes.** wrong..*/
6b00: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
6b10: 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  Read(.  sqlite3_
6b20: 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f 69  file *id, .  voi
6b30: 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20  d *pBuf, .  int 
6b40: 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69  amt,.  sqlite3_i
6b50: 6e 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a 20  nt64 offset.){. 
6b60: 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65   int got;.  asse
6b70: 72 74 28 20 69 64 20 29 3b 0a 20 20 67 6f 74 20  rt( id );.  got 
6b80: 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 28 75  = seekAndRead((u
6b90: 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 6f 66 66  nixFile*)id, off
6ba0: 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b  set, pBuf, amt);
6bb0: 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20  .  if( got==amt 
6bc0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
6bd0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
6be0: 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20   if( got<0 ){.  
6bf0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6c00: 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d 65  IOERR_READ;.  }e
6c10: 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  lse{.    memset(
6c20: 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 67  &((char*)pBuf)[g
6c30: 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29  ot], 0, amt-got)
6c40: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
6c50: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
6c60: 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  READ;.  }.}../*.
6c70: 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f  ** Seek to the o
6c80: 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66  ffset in id->off
6c90: 73 65 74 20 74 68 65 6e 20 72 65 61 64 20 63 6e  set then read cn
6ca0: 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75  t bytes into pBu
6cb0: 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  f..** Return the
6cc0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
6cd0: 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 20   actually read. 
6ce0: 20 55 70 64 61 74 65 20 74 68 65 20 6f 66 66 73   Update the offs
6cf0: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  et..*/.static in
6d00: 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 75  t seekAndWrite(u
6d10: 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 69 36 34  nixFile *id, i64
6d20: 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74 20 76   offset, const v
6d30: 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63  oid *pBuf, int c
6d40: 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a  nt){.  int got;.
6d50: 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b    i64 newOffset;
6d60: 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a  .  TIMER_START;.
6d70: 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
6d80: 50 52 45 41 44 29 0a 20 20 67 6f 74 20 3d 20 70  PREAD).  got = p
6d90: 77 72 69 74 65 28 69 64 2d 3e 68 2c 20 70 42 75  write(id->h, pBu
6da0: 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b  f, cnt, offset);
6db0: 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55  .#elif defined(U
6dc0: 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 67 6f  SE_PREAD64).  go
6dd0: 74 20 3d 20 70 77 72 69 74 65 36 34 28 69 64 2d  t = pwrite64(id-
6de0: 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f  >h, pBuf, cnt, o
6df0: 66 66 73 65 74 29 3b 0a 23 65 6c 73 65 0a 20 20  ffset);.#else.  
6e00: 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65  newOffset = lsee
6e10: 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c  k(id->h, offset,
6e20: 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 69 66   SEEK_SET);.  if
6e30: 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66  ( newOffset!=off
6e40: 73 65 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  set ){.    retur
6e50: 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 67 6f 74 20  n -1;.  }.  got 
6e60: 3d 20 77 72 69 74 65 28 69 64 2d 3e 68 2c 20 70  = write(id->h, p
6e70: 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69  Buf, cnt);.#endi
6e80: 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20  f.  TIMER_END;. 
6e90: 20 4f 53 54 52 41 43 45 35 28 22 57 52 49 54 45   OSTRACE5("WRITE
6ea0: 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c     %-3d %5d %7ll
6eb0: 64 20 25 64 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20  d %d\n", id->h, 
6ec0: 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d  got, offset, TIM
6ed0: 45 52 5f 45 4c 41 50 53 45 44 29 3b 0a 20 20 72  ER_ELAPSED);.  r
6ee0: 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f  eturn got;.}.../
6ef0: 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20  *.** Write data 
6f00: 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e  from a buffer in
6f10: 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75  to a file.  Retu
6f20: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
6f30: 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f  success.** or so
6f40: 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
6f50: 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a  ode on failure..
6f60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
6f70: 69 78 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74  ixWrite(.  sqlit
6f80: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20  e3_file *id, .  
6f90: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66  const void *pBuf
6fa0: 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20  , .  int amt,.  
6fb0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
6fc0: 66 73 65 74 20 0a 29 7b 0a 20 20 69 6e 74 20 77  fset .){.  int w
6fd0: 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73 73 65  rote = 0;.  asse
6fe0: 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65  rt( id );.  asse
6ff0: 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 77  rt( amt>0 );.  w
7000: 68 69 6c 65 28 20 61 6d 74 3e 30 20 26 26 20 28  hile( amt>0 && (
7010: 77 72 6f 74 65 20 3d 20 73 65 65 6b 41 6e 64 57  wrote = seekAndW
7020: 72 69 74 65 28 28 75 6e 69 78 46 69 6c 65 2a 29  rite((unixFile*)
7030: 69 64 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66  id, offset, pBuf
7040: 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a 20 20 20  , amt))>0 ){.   
7050: 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20   amt -= wrote;. 
7060: 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77 72 6f     offset += wro
7070: 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26  te;.    pBuf = &
7080: 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72  ((char*)pBuf)[wr
7090: 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75  ote];.  }.  Simu
70a0: 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20 77 72  lateIOError(( wr
70b0: 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31 20  ote=(-1), amt=1 
70c0: 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69  ));.  SimulateDi
70d0: 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20 77 72  skfullError(( wr
70e0: 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29 3b  ote=0, amt=1 ));
70f0: 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a  .  if( amt>0 ){.
7100: 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c 30 20      if( wrote<0 
7110: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
7120: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
7130: 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  TE;.    }else{. 
7140: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
7150: 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
7160: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
7170: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66  TE_OK;.}..#ifdef
7180: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
7190: 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ** Count the num
71a0: 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73  ber of fullsyncs
71b0: 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63   and normal sync
71c0: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
71d0: 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74   to test.** that
71e0: 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73   syncs and fulls
71f0: 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 69 6e  yncs are occurin
7200: 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74  g at the right t
7210: 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  imes..*/.int sql
7220: 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20  ite3_sync_count 
7230: 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  = 0;.int sqlite3
7240: 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20  _fullsync_count 
7250: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
7260: 2a 2a 20 55 73 65 20 74 68 65 20 66 64 61 74 61  ** Use the fdata
7270: 73 79 6e 63 28 29 20 41 50 49 20 6f 6e 6c 79 20  sync() API only 
7280: 69 66 20 74 68 65 20 48 41 56 45 5f 46 44 41 54  if the HAVE_FDAT
7290: 41 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64  ASYNC macro is d
72a0: 65 66 69 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72  efined..** Other
72b0: 77 69 73 65 20 75 73 65 20 66 73 79 6e 63 28 29  wise use fsync()
72c0: 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 0a 2a   in its place..*
72d0: 2f 0a 23 69 66 6e 64 65 66 20 48 41 56 45 5f 46  /.#ifndef HAVE_F
72e0: 44 41 54 41 53 59 4e 43 0a 23 20 64 65 66 69 6e  DATASYNC.# defin
72f0: 65 20 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e  e fdatasync fsyn
7300: 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  c.#endif../*.** 
7310: 44 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c  Define HAVE_FULL
7320: 46 53 59 4e 43 20 74 6f 20 30 20 6f 72 20 31 20  FSYNC to 0 or 1 
7330: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
7340: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74  ther or not.** t
7350: 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d  he F_FULLFSYNC m
7360: 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e  acro is defined.
7370: 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73    F_FULLFSYNC is
7380: 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e   currently.** on
7390: 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ly available on 
73a0: 4d 61 63 20 4f 53 20 58 2e 20 20 42 75 74 20 74  Mac OS X.  But t
73b0: 68 61 74 20 63 6f 75 6c 64 20 63 68 61 6e 67 65  hat could change
73c0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46 55  ..*/.#ifdef F_FU
73d0: 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66 69 6e 65  LLFSYNC.# define
73e0: 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20   HAVE_FULLFSYNC 
73f0: 31 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  1.#else.# define
7400: 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20   HAVE_FULLFSYNC 
7410: 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  0.#endif.../*.**
7420: 20 54 68 65 20 66 73 79 6e 63 28 29 20 73 79 73   The fsync() sys
7430: 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f  tem call does no
7440: 74 20 77 6f 72 6b 20 61 73 20 61 64 76 65 72 74  t work as advert
7450: 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20  ised on many.** 
7460: 75 6e 69 78 20 73 79 73 74 65 6d 73 2e 20 20 54  unix systems.  T
7470: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f  he following pro
7480: 63 65 64 75 72 65 20 69 73 20 61 6e 20 61 74 74  cedure is an att
7490: 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20  empt to make.** 
74a0: 69 74 20 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a  it work better..
74b0: 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
74c0: 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64  _NO_SYNC macro d
74d0: 69 73 61 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e  isables all fsyn
74e0: 63 28 29 73 2e 20 20 54 68 69 73 20 69 73 20 75  c()s.  This is u
74f0: 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73  seful.** for tes
7500: 74 69 6e 67 20 77 68 65 6e 20 77 65 20 77 61 6e  ting when we wan
7510: 74 20 74 6f 20 72 75 6e 20 74 68 72 6f 75 67 68  t to run through
7520: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
7530: 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20  quickly..** You 
7540: 61 72 65 20 73 74 72 6f 6e 67 6c 79 20 61 64 76  are strongly adv
7550: 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65  ised *not* to de
7560: 70 6c 6f 79 20 77 69 74 68 20 53 51 4c 49 54 45  ploy with SQLITE
7570: 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62  _NO_SYNC.** enab
7580: 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c 20 73 69  led, however, si
7590: 6e 63 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f  nce with SQLITE_
75a0: 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c  NO_SYNC enabled,
75b0: 20 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20   an OS crash.** 
75c0: 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  or power failure
75d0: 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72   will likely cor
75e0: 72 75 70 74 20 74 68 65 20 64 61 74 61 62 61 73  rupt the databas
75f0: 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
7600: 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63  c int full_fsync
7610: 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75 6c  (int fd, int ful
7620: 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f  lSync, int dataO
7630: 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  nly){.  int rc;.
7640: 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65  .  /* Record the
7650: 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   number of times
7660: 20 74 68 61 74 20 77 65 20 64 6f 20 61 20 6e 6f   that we do a no
7670: 72 6d 61 6c 20 66 73 79 6e 63 28 29 20 61 6e 64  rmal fsync() and
7680: 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e   .  ** FULLSYNC.
7690: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 64    This is used d
76a0: 75 72 69 6e 67 20 74 65 73 74 69 6e 67 20 74 6f  uring testing to
76b0: 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 69   verify that thi
76c0: 73 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a  s procedure.  **
76d0: 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 69 74   gets called wit
76e0: 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 72  h the correct ar
76f0: 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69  guments..  */.#i
7700: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
7710: 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20  .  if( fullSync 
7720: 29 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79  ) sqlite3_fullsy
7730: 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71  nc_count++;.  sq
7740: 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
7750: 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  ++;.#endif..  /*
7760: 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20   If we compiled 
7770: 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f  with the SQLITE_
7780: 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68  NO_SYNC flag, th
7790: 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a  en syncing is a.
77a0: 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a    ** no-op.  */.
77b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  #ifdef SQLITE_NO
77c0: 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20 53 51 4c  _SYNC.  rc = SQL
77d0: 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 0a 23  ITE_OK;.#else..#
77e0: 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  if HAVE_FULLFSYN
77f0: 43 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63  C.  if( fullSync
7800: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 63 6e   ){.    rc = fcn
7810: 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59  tl(fd, F_FULLFSY
7820: 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  NC, 0);.  }else{
7830: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d  .    rc = 1;.  }
7840: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c  .  /* If the FUL
7850: 4c 46 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 66  LFSYNC failed, f
7860: 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74 74 65  all back to atte
7870: 6d 70 74 69 6e 67 20 61 6e 20 66 73 79 6e 63 28  mpting an fsync(
7880: 29 2e 0a 20 20 20 2a 20 49 74 20 73 68 6f 75 6c  )..   * It shoul
7890: 64 6e 27 74 20 62 65 20 70 6f 73 73 69 62 6c 65  dn't be possible
78a0: 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20 74   for fullfsync t
78b0: 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f  o fail on the lo
78c0: 63 61 6c 20 0a 20 20 20 2a 20 66 69 6c 65 20 73  cal .   * file s
78d0: 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20  ystem (on OSX), 
78e0: 73 6f 20 66 61 69 6c 75 72 65 20 69 6e 64 69 63  so failure indic
78f0: 61 74 65 73 20 74 68 61 74 20 46 55 4c 4c 46 53  ates that FULLFS
7900: 59 4e 43 0a 20 20 20 2a 20 69 73 6e 27 74 20 73  YNC.   * isn't s
7910: 75 70 70 6f 72 74 65 64 20 66 6f 72 20 74 68 69  upported for thi
7920: 73 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 53  s file system. S
7930: 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e 20 66 73  o, attempt an fs
7940: 79 6e 63 20 0a 20 20 20 2a 20 61 6e 64 20 28 66  ync .   * and (f
7950: 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74  or now) ignore t
7960: 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61  he overhead of a
7970: 20 73 75 70 65 72 66 6c 75 6f 75 73 20 66 63 6e   superfluous fcn
7980: 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 20 2a 20  tl call.  .   * 
7990: 49 74 27 64 20 62 65 20 62 65 74 74 65 72 20 74  It'd be better t
79a0: 6f 20 64 65 74 65 63 74 20 66 75 6c 6c 66 73 79  o detect fullfsy
79b0: 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e 63 65 20  nc support once 
79c0: 61 6e 64 20 61 76 6f 69 64 20 0a 20 20 20 2a 20  and avoid .   * 
79d0: 74 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65  the fcntl call e
79e0: 76 65 72 79 20 74 69 6d 65 20 73 79 6e 63 20 69  very time sync i
79f0: 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 2a 2f 0a  s called..   */.
7a00: 20 20 69 66 28 20 72 63 20 29 20 72 63 20 3d 20    if( rc ) rc = 
7a10: 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 73  fsync(fd);..#els
7a20: 65 20 0a 20 20 69 66 28 20 64 61 74 61 4f 6e 6c  e .  if( dataOnl
7a30: 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 64  y ){.    rc = fd
7a40: 61 74 61 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d  atasync(fd);.  }
7a50: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 66  else{.    rc = f
7a60: 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65  sync(fd);.  }.#e
7a70: 6e 64 69 66 20 2f 2a 20 48 41 56 45 5f 46 55 4c  ndif /* HAVE_FUL
7a80: 4c 46 53 59 4e 43 20 2a 2f 0a 23 65 6e 64 69 66  LFSYNC */.#endif
7a90: 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
7aa0: 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 2a 2f 0a 0a  TE_NO_SYNC) */..
7ab0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7ac0: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
7ad0: 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20  all writes to a 
7ae0: 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20  particular file 
7af0: 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f  are committed to
7b00: 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   disk..**.** If 
7b10: 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e  dataOnly==0 then
7b20: 20 62 6f 74 68 20 74 68 65 20 66 69 6c 65 20 69   both the file i
7b30: 74 73 65 6c 66 20 61 6e 64 20 69 74 73 20 6d 65  tself and its me
7b40: 74 61 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20  tadata (file.** 
7b50: 73 69 7a 65 2c 20 61 63 63 65 73 73 20 74 69 6d  size, access tim
7b60: 65 2c 20 65 74 63 29 20 61 72 65 20 73 79 6e 63  e, etc) are sync
7b70: 65 64 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c 79  ed.  If dataOnly
7b80: 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68  !=0 then only th
7b90: 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61 20 69  e.** file data i
7ba0: 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  s synced..**.** 
7bb0: 55 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f  Under Unix, also
7bc0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
7bd0: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e  the directory en
7be0: 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65  try for the file
7bf0: 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65  .** has been cre
7c00: 61 74 65 64 20 62 79 20 66 73 79 6e 63 2d 69 6e  ated by fsync-in
7c10: 67 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  g the directory 
7c20: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
7c30: 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65  e file..** If we
7c40: 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20   do not do this 
7c50: 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74 65 72  and we encounter
7c60: 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
7c70: 2c 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a  , the directory.
7c80: 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ** entry for the
7c90: 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e   journal might n
7ca0: 6f 74 20 65 78 69 73 74 20 61 66 74 65 72 20 77  ot exist after w
7cb0: 65 20 72 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e  e reboot.  The n
7cc0: 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f  ext.** SQLite to
7cd0: 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65   access the file
7ce0: 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74   will not know t
7cf0: 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
7d00: 65 78 69 73 74 73 20 28 62 65 63 61 75 73 65 0a  exists (because.
7d10: 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ** the directory
7d20: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a   entry for the j
7d30: 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65 76 65 72  ournal was never
7d40: 20 63 72 65 61 74 65 64 29 20 61 6e 64 20 74 68   created) and th
7d50: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e transaction.**
7d60: 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62   will not roll b
7d70: 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c  ack - possibly l
7d80: 65 61 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61  eading to databa
7d90: 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  se corruption..*
7da0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
7db0: 78 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69  xSync(sqlite3_fi
7dc0: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67  le *id, int flag
7dd0: 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
7de0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
7df0: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
7e00: 0a 0a 20 20 69 6e 74 20 69 73 44 61 74 61 4f 6e  ..  int isDataOn
7e10: 6c 79 20 3d 20 28 66 6c 61 67 73 26 53 51 4c 49  ly = (flags&SQLI
7e20: 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
7e30: 29 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c 6c 73  );.  int isFulls
7e40: 79 6e 63 20 3d 20 28 66 6c 61 67 73 26 30 78 30  ync = (flags&0x0
7e50: 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
7e60: 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  FULL;..  /* Chec
7e70: 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51  k that one of SQ
7e80: 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
7e90: 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73   or FULL was pas
7ea0: 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  sed */.  assert(
7eb0: 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
7ec0: 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
7ed0: 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73  .      || (flags
7ee0: 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
7ef0: 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20  YNC_FULL.  );.. 
7f00: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
7f10: 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22 53 59  ;.  OSTRACE2("SY
7f20: 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70  NC    %-3d\n", p
7f30: 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 72 63 20 3d  File->h);.  rc =
7f40: 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c   full_fsync(pFil
7f50: 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e 63  e->h, isFullsync
7f60: 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a 20  , isDataOnly);. 
7f70: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
7f80: 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20  ( rc=1 );.  if( 
7f90: 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
7fa0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
7fb0: 59 4e 43 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  YNC;.  }.  if( p
7fc0: 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29  File->dirfd>=0 )
7fd0: 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 34 28 22  {.    OSTRACE4("
7fe0: 44 49 52 53 59 4e 43 20 25 2d 33 64 20 28 68 61  DIRSYNC %-3d (ha
7ff0: 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20  ve_fullfsync=%d 
8000: 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c  fullsync=%d)\n",
8010: 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c 0a 20   pFile->dirfd,. 
8020: 20 20 20 20 20 20 20 20 20 20 20 48 41 56 45 5f             HAVE_
8030: 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c  FULLFSYNC, isFul
8040: 6c 73 79 6e 63 29 3b 0a 23 69 66 6e 64 65 66 20  lsync);.#ifndef 
8050: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44  SQLITE_DISABLE_D
8060: 49 52 53 59 4e 43 0a 20 20 20 20 2f 2a 20 54 68  IRSYNC.    /* Th
8070: 65 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63  e directory sync
8080: 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74   is only attempt
8090: 65 64 20 69 66 20 66 75 6c 6c 5f 66 73 79 6e 63  ed if full_fsync
80a0: 20 69 73 0a 20 20 20 20 2a 2a 20 74 75 72 6e 65   is.    ** turne
80b0: 64 20 6f 66 66 20 6f 72 20 75 6e 61 76 61 69 6c  d off or unavail
80c0: 61 62 6c 65 2e 20 20 49 66 20 61 20 66 75 6c 6c  able.  If a full
80d0: 5f 66 73 79 6e 63 20 6f 63 63 75 72 72 65 64 20  _fsync occurred 
80e0: 61 62 6f 76 65 2c 0a 20 20 20 20 2a 2a 20 74 68  above,.    ** th
80f0: 65 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  en the directory
8100: 20 73 79 6e 63 20 69 73 20 73 75 70 65 72 66 6c   sync is superfl
8110: 75 6f 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uous..    */.   
8120: 20 69 66 28 20 28 21 48 41 56 45 5f 46 55 4c 4c   if( (!HAVE_FULL
8130: 46 53 59 4e 43 20 7c 7c 20 21 69 73 46 75 6c 6c  FSYNC || !isFull
8140: 73 79 6e 63 29 20 26 26 20 66 75 6c 6c 5f 66 73  sync) && full_fs
8150: 79 6e 63 28 70 46 69 6c 65 2d 3e 64 69 72 66 64  ync(pFile->dirfd
8160: 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20 20 20 20  ,0,0) ){.       
8170: 2f 2a 0a 20 20 20 20 20 20 20 2a 2a 20 57 65 20  /*.       ** We 
8180: 68 61 76 65 20 72 65 63 65 69 76 65 64 20 6d 75  have received mu
8190: 6c 74 69 70 6c 65 20 72 65 70 6f 72 74 73 20 6f  ltiple reports o
81a0: 66 20 66 73 79 6e 63 28 29 20 72 65 74 75 72 6e  f fsync() return
81b0: 69 6e 67 0a 20 20 20 20 20 20 20 2a 2a 20 65 72  ing.       ** er
81c0: 72 6f 72 73 20 77 68 65 6e 20 61 70 70 6c 69 65  rors when applie
81d0: 64 20 74 6f 20 64 69 72 65 63 74 6f 72 69 65 73  d to directories
81e0: 20 6f 6e 20 63 65 72 74 61 69 6e 20 66 69 6c 65   on certain file
81f0: 20 73 79 73 74 65 6d 73 2e 0a 20 20 20 20 20 20   systems..      
8200: 20 2a 2a 20 41 20 66 61 69 6c 65 64 20 64 69 72   ** A failed dir
8210: 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20 6e  ectory sync is n
8220: 6f 74 20 61 20 62 69 67 20 64 65 61 6c 2e 20 20  ot a big deal.  
8230: 53 6f 20 69 74 20 73 65 65 6d 73 0a 20 20 20 20  So it seems.    
8240: 20 20 20 2a 2a 20 62 65 74 74 65 72 20 74 6f 20     ** better to 
8250: 69 67 6e 6f 72 65 20 74 68 65 20 65 72 72 6f 72  ignore the error
8260: 2e 20 20 54 69 63 6b 65 74 20 23 31 36 35 37 0a  .  Ticket #1657.
8270: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
8280: 20 2f 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   /* return SQLIT
8290: 45 5f 49 4f 45 52 52 3b 20 2a 2f 0a 20 20 20 20  E_IOERR; */.    
82a0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 6c 6f  }.#endif.    clo
82b0: 73 65 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 29  se(pFile->dirfd)
82c0: 3b 20 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 20  ;  /* Only need 
82d0: 74 6f 20 73 79 6e 63 20 6f 6e 63 65 2c 20 73 6f  to sync once, so
82e0: 20 63 6c 6f 73 65 20 74 68 65 20 64 69 72 65 63   close the direc
82f0: 74 6f 72 79 20 2a 2f 0a 20 20 20 20 70 46 69 6c  tory */.    pFil
8300: 65 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 20 20  e->dirfd = -1;  
8310: 20 20 2f 2a 20 77 68 65 6e 20 77 65 20 61 72 65    /* when we are
8320: 20 64 6f 6e 65 2e 20 2a 2f 0a 20 20 7d 0a 20 20   done. */.  }.  
8330: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
8340: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  ;.}../*.** Trunc
8350: 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65  ate an open file
8360: 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20   to a specified 
8370: 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  size.*/.static i
8380: 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65 28  nt unixTruncate(
8390: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
83a0: 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  , i64 nByte){.  
83b0: 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
83c0: 28 20 69 64 20 29 3b 0a 20 20 72 63 20 3d 20 66  ( id );.  rc = f
83d0: 74 72 75 6e 63 61 74 65 28 28 28 75 6e 69 78 46  truncate(((unixF
83e0: 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 28 6f 66  ile*)id)->h, (of
83f0: 66 5f 74 29 6e 42 79 74 65 29 3b 0a 20 20 53 69  f_t)nByte);.  Si
8400: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
8410: 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63 20  c=1 );.  if( rc 
8420: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8430: 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
8440: 41 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ATE;.  }else{.  
8450: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8460: 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
8470: 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63   Determine the c
8480: 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61  urrent size of a
8490: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a   file in bytes.*
84a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
84b0: 78 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65  xFileSize(sqlite
84c0: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  3_file *id, i64 
84d0: 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72  *pSize){.  int r
84e0: 63 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  c;.  struct stat
84f0: 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20   buf;.  assert( 
8500: 69 64 20 29 3b 0a 20 20 72 63 20 3d 20 66 73 74  id );.  rc = fst
8510: 61 74 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  at(((unixFile*)i
8520: 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20  d)->h, &buf);.  
8530: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
8540: 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72   rc=1 );.  if( r
8550: 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  c!=0 ){.    retu
8560: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
8570: 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53  FSTAT;.  }.  *pS
8580: 69 7a 65 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a  ize = buf.st_siz
8590: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
85a0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
85b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
85c0: 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
85d0: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
85e0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
85f0: 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
8600: 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
8610: 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
8620: 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
8630: 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f  ld, return.** no
8640: 6e 2d 7a 65 72 6f 2e 20 20 49 66 20 74 68 65 20  n-zero.  If the 
8650: 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64  file is unlocked
8660: 20 6f 72 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 53   or holds only S
8670: 48 41 52 45 44 20 6c 6f 63 6b 73 2c 20 74 68 65  HARED locks, the
8680: 6e 0a 2a 2a 20 72 65 74 75 72 6e 20 7a 65 72 6f  n.** return zero
8690: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
86a0: 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  unixCheckReserve
86b0: 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
86c0: 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72  le *id){.  int r
86d0: 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
86e0: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
86f0: 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65  ile*)id;..  asse
8700: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 65  rt( pFile );.  e
8710: 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20  nterMutex(); /* 
8720: 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70  Because pFile->p
8730: 4c 6f 63 6b 20 69 73 20 73 68 61 72 65 64 20 61  Lock is shared a
8740: 63 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f  cross threads */
8750: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
8760: 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
8770: 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
8780: 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
8790: 69 66 28 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  if( pFile->pLock
87a0: 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45  ->locktype>SHARE
87b0: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 20  D_LOCK ){.    r 
87c0: 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  = 1;.  }..  /* O
87d0: 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
87e0: 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
87f0: 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a  ss holds it..  *
8800: 2f 0a 20 20 69 66 28 20 21 72 20 29 7b 0a 20 20  /.  if( !r ){.  
8810: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
8820: 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ock;.    lock.l_
8830: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
8840: 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  T;.    lock.l_st
8850: 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42  art = RESERVED_B
8860: 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  YTE;.    lock.l_
8870: 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63  len = 1;.    loc
8880: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c  k.l_type = F_WRL
8890: 43 4b 3b 0a 20 20 20 20 66 63 6e 74 6c 28 70 46  CK;.    fcntl(pF
88a0: 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c  ile->h, F_GETLK,
88b0: 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28   &lock);.    if(
88c0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f   lock.l_type!=F_
88d0: 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 72  UNLCK ){.      r
88e0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
88f0: 20 20 0a 20 20 6c 65 61 76 65 4d 75 74 65 78 28    .  leaveMutex(
8900: 29 3b 0a 20 20 4f 53 54 52 41 43 45 33 28 22 54  );.  OSTRACE3("T
8910: 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
8920: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
8930: 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 3b  r);..  return r;
8940: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
8950: 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
8960: 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
8970: 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63  by parameter loc
8980: 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  ktype - one.** o
8990: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
89a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
89b0: 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
89c0: 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
89d0: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
89e0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
89f0: 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
8a00: 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
8a10: 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
8a20: 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
8a30: 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
8a40: 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
8a50: 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
8a60: 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
8a70: 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
8a80: 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
8a90: 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
8aa0: 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
8ab0: 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
8ac0: 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
8ad0: 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
8ae0: 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
8af0: 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
8b00: 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
8b10: 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
8b20: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
8b30: 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
8b40: 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
8b50: 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
8b60: 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
8b70: 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
8b80: 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
8b90: 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
8ba0: 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
8bb0: 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
8bc0: 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
8bd0: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
8be0: 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
8bf0: 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  USIVE.**.** This
8c00: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
8c10: 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
8c20: 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
8c30: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
8c40: 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
8c50: 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
8c60: 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
8c70: 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74  t unixLock(sqlit
8c80: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
8c90: 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 2f 2a   locktype){.  /*
8ca0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64   The following d
8cb0: 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6d 70  escribes the imp
8cc0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
8cd0: 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73  he various locks
8ce0: 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74   and.  ** lock t
8cf0: 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74 65  ransitions in te
8d00: 72 6d 73 20 6f 66 20 74 68 65 20 50 4f 53 49 58  rms of the POSIX
8d10: 20 61 64 76 69 73 6f 72 79 20 73 68 61 72 65 64   advisory shared
8d20: 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 20   and exclusive. 
8d30: 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69   ** lock primiti
8d40: 76 65 73 20 28 63 61 6c 6c 65 64 20 72 65 61 64  ves (called read
8d50: 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69 74 65  -locks and write
8d60: 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f  -locks below, to
8d70: 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66   avoid.  ** conf
8d80: 75 73 69 6f 6e 20 77 69 74 68 20 53 51 4c 69 74  usion with SQLit
8d90: 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54  e lock names). T
8da0: 68 65 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 72  he algorithms ar
8db0: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20  e complicated.  
8dc0: 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f  ** slightly in o
8dd0: 72 64 65 72 20 74 6f 20 62 65 20 63 6f 6d 70 61  rder to be compa
8de0: 74 69 62 6c 65 20 77 69 74 68 20 77 69 6e 64 6f  tible with windo
8df0: 77 73 20 73 79 73 74 65 6d 73 20 73 69 6d 75 6c  ws systems simul
8e00: 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61  taneously.  ** a
8e10: 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d  ccessing the sam
8e20: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
8e30: 20 69 6e 20 63 61 73 65 20 74 68 61 74 20 69 73   in case that is
8e40: 20 65 76 65 72 20 72 65 71 75 69 72 65 64 2e 0a   ever required..
8e50: 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c    **.  ** Symbol
8e60: 73 20 64 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e  s defined in os.
8e70: 68 20 69 6e 64 65 6e 74 69 66 79 20 74 68 65 20  h indentify the 
8e80: 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 61  'pending byte' a
8e90: 6e 64 20 74 68 65 20 27 72 65 73 65 72 76 65 64  nd the 'reserved
8ea0: 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20 65 61 63  .  ** byte', eac
8eb0: 68 20 73 69 6e 67 6c 65 20 62 79 74 65 73 20 61  h single bytes a
8ec0: 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66  t well known off
8ed0: 73 65 74 73 2c 20 61 6e 64 20 74 68 65 20 27 73  sets, and the 's
8ee0: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
8ef0: 72 61 6e 67 65 27 2c 20 61 20 72 61 6e 67 65 20  range', a range 
8f00: 6f 66 20 35 31 30 20 62 79 74 65 73 20 61 74 20  of 510 bytes at 
8f10: 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66  a well known off
8f20: 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  set..  **.  ** T
8f30: 6f 20 6f 62 74 61 69 6e 20 61 20 53 48 41 52 45  o obtain a SHARE
8f40: 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c  D lock, a read-l
8f50: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
8f60: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 0a  on the 'pending.
8f70: 20 20 2a 2a 20 62 79 74 65 27 2e 20 20 49 66 20    ** byte'.  If 
8f80: 74 68 69 73 20 69 73 20 73 75 63 63 65 73 73 66  this is successf
8f90: 75 6c 2c 20 61 20 72 61 6e 64 6f 6d 20 62 79 74  ul, a random byt
8fa0: 65 20 66 72 6f 6d 20 74 68 65 20 27 73 68 61 72  e from the 'shar
8fb0: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
8fc0: 67 65 27 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b  ge' is read-lock
8fd0: 65 64 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  ed and the lock 
8fe0: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  on the 'pending 
8ff0: 62 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e 0a  byte' released..
9000: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63    **.  ** A proc
9010: 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74  ess may only obt
9020: 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  ain a RESERVED l
9030: 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73  ock after it has
9040: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a   a SHARED lock..
9050: 20 20 2a 2a 20 41 20 52 45 53 45 52 56 45 44 20    ** A RESERVED 
9060: 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e  lock is implemen
9070: 74 65 64 20 62 79 20 67 72 61 62 62 69 6e 67 20  ted by grabbing 
9080: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
9090: 74 68 65 0a 20 20 2a 2a 20 27 72 65 73 65 72 76  the.  ** 'reserv
90a0: 65 64 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a  ed byte'. .  **.
90b0: 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d    ** A process m
90c0: 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61  ay only obtain a
90d0: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66   PENDING lock af
90e0: 74 65 72 20 69 74 20 68 61 73 20 6f 62 74 61 69  ter it has obtai
90f0: 6e 65 64 20 61 0a 20 20 2a 2a 20 53 48 41 52 45  ned a.  ** SHARE
9100: 44 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e  D lock. A PENDIN
9110: 47 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d  G lock is implem
9120: 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69  ented by obtaini
9130: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a  ng a write-lock.
9140: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e    ** on the 'pen
9150: 64 69 6e 67 20 62 79 74 65 27 2e 20 54 68 69 73  ding byte'. This
9160: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f   ensures that no
9170: 20 6e 65 77 20 53 48 41 52 45 44 20 6c 6f 63 6b   new SHARED lock
9180: 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62  s can be.  ** ob
9190: 74 61 69 6e 65 64 2c 20 62 75 74 20 65 78 69 73  tained, but exis
91a0: 74 69 6e 67 20 53 48 41 52 45 44 20 6c 6f 63 6b  ting SHARED lock
91b0: 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f  s are allowed to
91c0: 20 70 65 72 73 69 73 74 2e 20 41 20 70 72 6f 63   persist. A proc
91d0: 65 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f  ess.  ** does no
91e0: 74 20 68 61 76 65 20 74 6f 20 6f 62 74 61 69 6e  t have to obtain
91f0: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
9200: 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 61   on the way to a
9210: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20   PENDING lock.. 
9220: 20 2a 2a 20 54 68 69 73 20 70 72 6f 70 65 72 74   ** This propert
9230: 79 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  y is used by the
9240: 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 72   algorithm for r
9250: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f  olling back a jo
9260: 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20  urnal file.  ** 
9270: 61 66 74 65 72 20 61 20 63 72 61 73 68 2e 0a 20  after a crash.. 
9280: 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c   **.  ** An EXCL
9290: 55 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61  USIVE lock, obta
92a0: 69 6e 65 64 20 61 66 74 65 72 20 61 20 50 45 4e  ined after a PEN
92b0: 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c  DING lock is hel
92c0: 64 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65  d, is.  ** imple
92d0: 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e  mented by obtain
92e0: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
92f0: 20 6f 6e 20 74 68 65 20 65 6e 74 69 72 65 20 27   on the entire '
9300: 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a  shared byte.  **
9310: 20 72 61 6e 67 65 27 2e 20 53 69 6e 63 65 20 61   range'. Since a
9320: 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72  ll other locks r
9330: 65 71 75 69 72 65 20 61 20 72 65 61 64 2d 6c 6f  equire a read-lo
9340: 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  ck on one of the
9350: 20 62 79 74 65 73 0a 20 20 2a 2a 20 77 69 74 68   bytes.  ** with
9360: 69 6e 20 74 68 69 73 20 72 61 6e 67 65 2c 20 74  in this range, t
9370: 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
9380: 20 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20   no other locks 
9390: 61 72 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a  are held on the.
93a0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 0a    ** database. .
93b0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65    **.  ** The re
93c0: 61 73 6f 6e 20 61 20 73 69 6e 67 6c 65 20 62 79  ason a single by
93d0: 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  te cannot be use
93e0: 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  d instead of the
93f0: 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20   'shared byte.  
9400: 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 74 68 61  ** range' is tha
9410: 74 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20  t some versions 
9420: 6f 66 20 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f  of windows do no
9430: 74 20 73 75 70 70 6f 72 74 20 72 65 61 64 2d 6c  t support read-l
9440: 6f 63 6b 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f  ocks. By.  ** lo
9450: 63 6b 69 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62  cking a random b
9460: 79 74 65 20 66 72 6f 6d 20 61 20 72 61 6e 67 65  yte from a range
9470: 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 53 48 41  , concurrent SHA
9480: 52 45 44 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78  RED locks may ex
9490: 69 73 74 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66  ist.  ** even if
94a0: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69   the locking pri
94b0: 6d 69 74 69 76 65 20 75 73 65 64 20 69 73 20 61  mitive used is a
94c0: 6c 77 61 79 73 20 61 20 77 72 69 74 65 2d 6c 6f  lways a write-lo
94d0: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72  ck..  */.  int r
94e0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
94f0: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
9500: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
9510: 3b 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49  ;.  struct lockI
9520: 6e 66 6f 20 2a 70 4c 6f 63 6b 20 3d 20 70 46 69  nfo *pLock = pFi
9530: 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 73 74 72  le->pLock;.  str
9540: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
9550: 20 20 69 6e 74 20 73 3b 0a 0a 20 20 61 73 73 65    int s;..  asse
9560: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
9570: 53 54 52 41 43 45 37 28 22 4c 4f 43 4b 20 20 20  STRACE7("LOCK   
9580: 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73   %d %s was %s(%s
9590: 2c 25 64 29 20 70 69 64 3d 25 64 5c 6e 22 2c 20  ,%d) pid=%d\n", 
95a0: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
95b0: 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63  locktypeName(loc
95c0: 6b 74 79 70 65 29 2c 20 6c 6f 63 6b 74 79 70 65  ktype), locktype
95d0: 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b  Name(pFile->lock
95e0: 74 79 70 65 29 2c 0a 20 20 20 20 20 20 6c 6f 63  type),.      loc
95f0: 6b 74 79 70 65 4e 61 6d 65 28 70 4c 6f 63 6b 2d  ktypeName(pLock-
9600: 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 70 4c 6f 63  >locktype), pLoc
9610: 6b 2d 3e 63 6e 74 20 2c 20 67 65 74 70 69 64 28  k->cnt , getpid(
9620: 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ));..  /* If the
9630: 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
9640: 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70  lock of this typ
9650: 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69  e or more restri
9660: 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a  ctive on the.  *
9670: 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e  * unixFile, do n
9680: 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73  othing. Don't us
9690: 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20  e the end_lock: 
96a0: 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20  exit path, as.  
96b0: 2a 2a 20 65 6e 74 65 72 4d 75 74 65 78 28 29 20  ** enterMutex() 
96c0: 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c  hasn't been call
96d0: 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ed yet..  */.  i
96e0: 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
96f0: 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe>=locktype ){.
9700: 20 20 20 20 4f 53 54 52 41 43 45 33 28 22 4c 4f      OSTRACE3("LO
9710: 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28  CK    %d %s ok (
9720: 61 6c 72 65 61 64 79 20 68 65 6c 64 29 5c 6e 22  already held)\n"
9730: 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
9740: 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65          locktype
9750: 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 29 3b  Name(locktype));
9760: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
9770: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
9780: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c   Make sure the l
9790: 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20  ocking sequence 
97a0: 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a  is correct.  */.
97b0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
97c0: 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f  >locktype!=NO_LO
97d0: 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK || locktype==
97e0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
97f0: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
9800: 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  e!=PENDING_LOCK 
9810: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
9820: 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f  ktype!=RESERVED_
9830: 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c  LOCK || pFile->l
9840: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
9850: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  LOCK );..  /* Th
9860: 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64  is mutex is need
9870: 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65  ed because pFile
9880: 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61 72 65  ->pLock is share
9890: 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
98a0: 0a 20 20 2a 2f 0a 20 20 65 6e 74 65 72 4d 75 74  .  */.  enterMut
98b0: 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ex();..  /* Make
98c0: 20 73 75 72 65 20 74 68 65 20 63 75 72 72 65 6e   sure the curren
98d0: 74 20 74 68 72 65 61 64 20 6f 77 6e 73 20 74 68  t thread owns th
98e0: 65 20 70 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  e pFile..  */.  
98f0: 72 63 20 3d 20 74 72 61 6e 73 66 65 72 4f 77 6e  rc = transferOwn
9900: 65 72 73 68 69 70 28 70 46 69 6c 65 29 3b 0a 20  ership(pFile);. 
9910: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
9920: 4f 4b 20 29 7b 0a 20 20 20 20 6c 65 61 76 65 4d  OK ){.    leaveM
9930: 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 74 75  utex();.    retu
9940: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 4c 6f  rn rc;.  }.  pLo
9950: 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63  ck = pFile->pLoc
9960: 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65  k;..  /* If some
9970: 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68   thread using th
9980: 69 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63  is PID has a loc
9990: 6b 20 76 69 61 20 61 20 64 69 66 66 65 72 65 6e  k via a differen
99a0: 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a  t unixFile*.  **
99b0: 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65   handle that pre
99c0: 63 6c 75 64 65 73 20 74 68 65 20 72 65 71 75 65  cludes the reque
99d0: 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72  sted lock, retur
99e0: 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69  n BUSY..  */.  i
99f0: 66 28 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  f( (pFile->lockt
9a00: 79 70 65 21 3d 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  ype!=pLock->lock
9a10: 74 79 70 65 20 26 26 20 0a 20 20 20 20 20 20 20  type && .       
9a20: 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74     (pLock->lockt
9a30: 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ype>=PENDING_LOC
9a40: 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3e 53 48  K || locktype>SH
9a50: 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b  ARED_LOCK)).  ){
9a60: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
9a70: 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
9a80: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20  end_lock;.  }.. 
9a90: 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20   /* If a SHARED 
9aa0: 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
9ab0: 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65  d, and some thre
9ac0: 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
9ad0: 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68  D already.  ** h
9ae0: 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52  as a SHARED or R
9af0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68  ESERVED lock, th
9b00: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66  en increment ref
9b10: 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e  erence counts an
9b20: 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51  d.  ** return SQ
9b30: 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20  LITE_OK..  */.  
9b40: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
9b50: 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20  ARED_LOCK && .  
9b60: 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b      (pLock->lock
9b70: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
9b80: 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  K || pLock->lock
9b90: 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c  type==RESERVED_L
9ba0: 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65  OCK) ){.    asse
9bb0: 72 74 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  rt( locktype==SH
9bc0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
9bd0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
9be0: 6c 6f 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 20  locktype==0 );. 
9bf0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
9c00: 2d 3e 63 6e 74 3e 30 20 29 3b 0a 20 20 20 20 70  ->cnt>0 );.    p
9c10: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
9c20: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
9c30: 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2b 2b 3b 0a    pLock->cnt++;.
9c40: 20 20 20 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e      pFile->pOpen
9c50: 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67  ->nLock++;.    g
9c60: 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  oto end_lock;.  
9c70: 7d 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  }..  lock.l_len 
9c80: 3d 20 31 4c 3b 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f  = 1L;..  lock.l_
9c90: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
9ca0: 54 3b 0a 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49  T;..  /* A PENDI
9cb0: 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65  NG lock is neede
9cc0: 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69  d before acquiri
9cd0: 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ng a SHARED lock
9ce0: 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a   and before.  **
9cf0: 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58   acquiring an EX
9d00: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46  CLUSIVE lock.  F
9d10: 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f  or the SHARED lo
9d20: 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20  ck, the PENDING 
9d30: 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c  will.  ** be rel
9d40: 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  eased..  */.  if
9d50: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
9d60: 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c  ED_LOCK .      |
9d70: 7c 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  | (locktype==EXC
9d80: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
9d90: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 50  File->locktype<P
9da0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29  ENDING_LOCK).  )
9db0: 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  {.    lock.l_typ
9dc0: 65 20 3d 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53  e = (locktype==S
9dd0: 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c  HARED_LOCK?F_RDL
9de0: 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20  CK:F_WRLCK);.   
9df0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
9e00: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
9e10: 20 20 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c    s = fcntl(pFil
9e20: 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
9e30: 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 73  lock);.    if( s
9e40: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
9e50: 72 63 20 3d 20 28 65 72 72 6e 6f 3d 3d 45 49 4e  rc = (errno==EIN
9e60: 56 41 4c 29 20 3f 20 53 51 4c 49 54 45 5f 4e 4f  VAL) ? SQLITE_NO
9e70: 4c 46 53 20 3a 20 53 51 4c 49 54 45 5f 42 55 53  LFS : SQLITE_BUS
9e80: 59 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  Y;.      goto en
9e90: 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
9ea0: 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74  }...  /* If cont
9eb0: 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73  rol gets to this
9ec0: 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74   point, then act
9ed0: 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61  ually go ahead a
9ee0: 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65  nd make.  ** ope
9ef0: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61  rating system ca
9f00: 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63  lls for the spec
9f10: 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f  ified lock..  */
9f20: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
9f30: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
9f40: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
9f50: 6b 2d 3e 63 6e 74 3d 3d 30 20 29 3b 0a 20 20 20  k->cnt==0 );.   
9f60: 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
9f70: 6c 6f 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 0a  locktype==0 );..
9f80: 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74      /* Now get t
9f90: 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a  he read-lock */.
9fa0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
9fb0: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
9fc0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
9fd0: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
9fe0: 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 70 46 69     s = fcntl(pFi
9ff0: 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  le->h, F_SETLK, 
a000: 26 6c 6f 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20  &lock);..    /* 
a010: 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61  Drop the tempora
a020: 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20  ry PENDING lock 
a030: 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  */.    lock.l_st
a040: 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59  art = PENDING_BY
a050: 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  TE;.    lock.l_l
a060: 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f 63  en = 1L;.    loc
a070: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
a080: 43 4b 3b 0a 20 20 20 20 69 66 28 20 66 63 6e 74  CK;.    if( fcnt
a090: 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45  l(pFile->h, F_SE
a0a0: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 30 20 29  TLK, &lock)!=0 )
a0b0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
a0c0: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
a0d0: 3b 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c  ;  /* This shoul
a0e0: 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a  d never happen *
a0f0: 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  /.      goto end
a100: 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  _lock;.    }.   
a110: 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a   if( s==(-1) ){.
a120: 20 20 20 20 20 20 72 63 20 3d 20 28 65 72 72 6e        rc = (errn
a130: 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f 20 53 51 4c  o==EINVAL) ? SQL
a140: 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c 49  ITE_NOLFS : SQLI
a150: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c  TE_BUSY;.    }el
a160: 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  se{.      pFile-
a170: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52  >locktype = SHAR
a180: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70  ED_LOCK;.      p
a190: 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f  File->pOpen->nLo
a1a0: 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 4c 6f 63  ck++;.      pLoc
a1b0: 6b 2d 3e 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20  k->cnt = 1;.    
a1c0: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f  }.  }else if( lo
a1d0: 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
a1e0: 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b 2d  E_LOCK && pLock-
a1f0: 3e 63 6e 74 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  >cnt>1 ){.    /*
a200: 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66   We are trying f
a210: 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
a220: 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72  lock but another
a230: 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a   thread in this.
a240: 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63      ** same proc
a250: 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c  ess is still hol
a260: 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f  ding a shared lo
a270: 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ck. */.    rc = 
a280: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
a290: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
a2a0: 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72   request was for
a2b0: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
a2c0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
a2d0: 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73  It is.    ** ass
a2e0: 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20  umed that there 
a2f0: 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67  is a SHARED or g
a300: 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
a310: 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61  he file.    ** a
a320: 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
a330: 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46     assert( 0!=pF
a340: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b  ile->locktype );
a350: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
a360: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20   = F_WRLCK;.    
a370: 73 77 69 74 63 68 28 20 6c 6f 63 6b 74 79 70 65  switch( locktype
a380: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 52   ){.      case R
a390: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 0a 20 20  ESERVED_LOCK:.  
a3a0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
a3b0: 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59  rt = RESERVED_BY
a3c0: 54 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  TE;.        brea
a3d0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 45 58  k;.      case EX
a3e0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 0a 20 20  CLUSIVE_LOCK:.  
a3f0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
a400: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
a410: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
a420: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
a430: 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65  IZE;.        bre
a440: 61 6b 3b 0a 20 20 20 20 20 20 64 65 66 61 75 6c  ak;.      defaul
a450: 74 3a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t:.        asser
a460: 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t(0);.    }.    
a470: 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d  s = fcntl(pFile-
a480: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  >h, F_SETLK, &lo
a490: 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 73 3d 3d  ck);.    if( s==
a4a0: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 72 63  (-1) ){.      rc
a4b0: 20 3d 20 28 65 72 72 6e 6f 3d 3d 45 49 4e 56 41   = (errno==EINVA
a4c0: 4c 29 20 3f 20 53 51 4c 49 54 45 5f 4e 4f 4c 46  L) ? SQLITE_NOLF
a4d0: 53 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  S : SQLITE_BUSY;
a4e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
a4f0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
a500: 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
a510: 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
a520: 79 70 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  ype;.    pLock->
a530: 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
a540: 79 70 65 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ype;.  }else if(
a550: 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55   locktype==EXCLU
a560: 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
a570: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
a580: 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b   = PENDING_LOCK;
a590: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  .    pLock->lock
a5a0: 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  type = PENDING_L
a5b0: 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f  OCK;.  }..end_lo
a5c0: 63 6b 3a 0a 20 20 6c 65 61 76 65 4d 75 74 65 78  ck:.  leaveMutex
a5d0: 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 34 28 22  ();.  OSTRACE4("
a5e0: 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73  LOCK    %d %s %s
a5f0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c  \n", pFile->h, l
a600: 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b  ocktypeName(lock
a610: 74 79 70 65 29 2c 20 0a 20 20 20 20 20 20 72 63  type), .      rc
a620: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
a630: 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 3b 0a  k" : "failed");.
a640: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
a650: 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
a660: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
a670: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
a680: 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79   pFile to lockty
a690: 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a  pe.  locktype.**
a6a0: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
a6b0: 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
a6c0: 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
a6d0: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
a6e0: 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
a6f0: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
a700: 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
a710: 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
a720: 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
a730: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
a740: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
a750: 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f  tic int unixUnlo
a760: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
a770: 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
a780: 65 29 7b 0a 20 20 73 74 72 75 63 74 20 6c 6f 63  e){.  struct loc
a790: 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 0a 20 20  kInfo *pLock;.  
a7a0: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
a7b0: 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  k;.  int rc = SQ
a7c0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
a7d0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
a7e0: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61  ixFile*)id;..  a
a7f0: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
a800: 20 20 4f 53 54 52 41 43 45 37 28 22 55 4e 4c 4f    OSTRACE7("UNLO
a810: 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
a820: 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 5c 6e  (%d,%d) pid=%d\n
a830: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63  ", pFile->h, loc
a840: 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 70 46 69  ktype,.      pFi
a850: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46  le->locktype, pF
a860: 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  ile->pLock->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 63 6e 74 2c 20 67 65 74 70 69 64 28  ck->cnt, getpid(
a890: 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6c  ));..  assert( l
a8a0: 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f  ocktype<=SHARED_
a8b0: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46  LOCK );.  if( pF
a8c0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c  ile->locktype<=l
a8d0: 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
a8e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
a8f0: 0a 20 20 7d 0a 20 20 69 66 28 20 43 48 45 43 4b  .  }.  if( CHECK
a900: 5f 54 48 52 45 41 44 49 44 28 70 46 69 6c 65 29  _THREADID(pFile)
a910: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
a920: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
a930: 7d 0a 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29  }.  enterMutex()
a940: 3b 0a 20 20 70 4c 6f 63 6b 20 3d 20 70 46 69 6c  ;.  pLock = pFil
a950: 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 61 73 73 65  e->pLock;.  asse
a960: 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 21 3d  rt( pLock->cnt!=
a970: 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  0 );.  if( pFile
a980: 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45  ->locktype>SHARE
a990: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  D_LOCK ){.    as
a9a0: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63  sert( pLock->loc
a9b0: 6b 74 79 70 65 3d 3d 70 46 69 6c 65 2d 3e 6c 6f  ktype==pFile->lo
a9c0: 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20 69 66  cktype );.    if
a9d0: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
a9e0: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  ED_LOCK ){.     
a9f0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
aa00: 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f  _RDLCK;.      lo
aa10: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
aa20: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f  EK_SET;.      lo
aa30: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
aa40: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20  RED_FIRST;.     
aa50: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
aa60: 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20  ARED_SIZE;.     
aa70: 20 69 66 28 20 66 63 6e 74 6c 28 70 46 69 6c 65   if( fcntl(pFile
aa80: 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  ->h, F_SETLK, &l
aa90: 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  ock)==(-1) ){.  
aaa0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 68        /* This sh
aab0: 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65  ould never happe
aac0: 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  n */.        rc 
aad0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  = SQLITE_IOERR_R
aae0: 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  DLOCK;.      }. 
aaf0: 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f     }.    lock.l_
ab00: 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
ab10: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
ab20: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
ab30: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
ab40: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20   PENDING_BYTE;. 
ab50: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
ab60: 32 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e  2L;  assert( PEN
ab70: 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53  DING_BYTE+1==RES
ab80: 45 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20  ERVED_BYTE );.  
ab90: 20 20 69 66 28 20 66 63 6e 74 6c 28 70 46 69 6c    if( fcntl(pFil
aba0: 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
abb0: 6c 6f 63 6b 29 21 3d 28 2d 31 29 20 29 7b 0a 20  lock)!=(-1) ){. 
abc0: 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b       pLock->lock
abd0: 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f  type = SHARED_LO
abe0: 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  CK;.    }else{. 
abf0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
ac00: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 20  _IOERR_UNLOCK;  
ac10: 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  /* This should n
ac20: 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20  ever happen */. 
ac30: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6c     }.  }.  if( l
ac40: 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b  ocktype==NO_LOCK
ac50: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 6f   ){.    struct o
ac60: 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 0a 0a  penCnt *pOpen;..
ac70: 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
ac80: 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
ac90: 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61   counter.  Relea
aca0: 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e  se the lock usin
acb0: 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63  g an.    ** OS c
acc0: 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c  all only when al
acd0: 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74 68 69  l threads in thi
ace0: 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68  s same process h
acf0: 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20  ave released.   
ad00: 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20   ** the lock..  
ad10: 20 20 2a 2f 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e    */.    pLock->
ad20: 63 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  cnt--;.    if( p
ad30: 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 7b 0a  Lock->cnt==0 ){.
ad40: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
ad50: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
ad60: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
ad70: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
ad80: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
ad90: 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30  = lock.l_len = 0
ada0: 4c 3b 0a 20 20 20 20 20 20 69 66 28 20 66 63 6e  L;.      if( fcn
adb0: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
adc0: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d  ETLK, &lock)!=(-
add0: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  1) ){.        pL
ade0: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ock->locktype = 
adf0: 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  NO_LOCK;.      }
ae00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
ae10: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
ae20: 55 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54 68 69 73  UNLOCK;  /* This
ae30: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61   should never ha
ae40: 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  ppen */.      }.
ae50: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
ae60: 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e  crement the coun
ae70: 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e  t of locks again
ae80: 73 74 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c  st this same fil
ae90: 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20  e.  When the.   
aea0: 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65   ** count reache
aeb0: 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e  s zero, close an
aec0: 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73  y other file des
aed0: 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63  criptors whose c
aee0: 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20  lose.    ** was 
aef0: 64 65 66 65 72 72 65 64 20 62 65 63 61 75 73 65  deferred because
af00: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
af10: 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  locks..    */.  
af20: 20 20 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d    pOpen = pFile-
af30: 3e 70 4f 70 65 6e 3b 0a 20 20 20 20 70 4f 70 65  >pOpen;.    pOpe
af40: 6e 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20  n->nLock--;.    
af50: 61 73 73 65 72 74 28 20 70 4f 70 65 6e 2d 3e 6e  assert( pOpen->n
af60: 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69  Lock>=0 );.    i
af70: 66 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3d  f( pOpen->nLock=
af80: 3d 30 20 26 26 20 70 4f 70 65 6e 2d 3e 6e 50 65  =0 && pOpen->nPe
af90: 6e 64 69 6e 67 3e 30 20 29 7b 0a 20 20 20 20 20  nding>0 ){.     
afa0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
afb0: 72 28 69 3d 30 3b 20 69 3c 70 4f 70 65 6e 2d 3e  r(i=0; i<pOpen->
afc0: 6e 50 65 6e 64 69 6e 67 3b 20 69 2b 2b 29 7b 0a  nPending; i++){.
afd0: 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 70 4f          close(pO
afe0: 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 69 5d  pen->aPending[i]
aff0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b000: 20 66 72 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65   free(pOpen->aPe
b010: 6e 64 69 6e 67 29 3b 0a 20 20 20 20 20 20 70 4f  nding);.      pO
b020: 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20  pen->nPending = 
b030: 30 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  0;.      pOpen->
b040: 61 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20  aPending = 0;.  
b050: 20 20 7d 0a 20 20 7d 0a 20 20 6c 65 61 76 65 4d    }.  }.  leaveM
b060: 75 74 65 78 28 29 3b 0a 20 20 70 46 69 6c 65 2d  utex();.  pFile-
b070: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b  >locktype = lock
b080: 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72  type;.  return r
b090: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  c;.}../*.** Clos
b0a0: 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  e a file..*/.sta
b0b0: 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73  tic int unixClos
b0c0: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
b0d0: 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  id){.  unixFile 
b0e0: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
b0f0: 6c 65 20 2a 29 69 64 3b 0a 20 20 69 66 28 20 21  le *)id;.  if( !
b100: 70 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53  pFile ) return S
b110: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
b120: 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
b130: 43 4b 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  CK);.  if( pFile
b140: 2d 3e 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f  ->dirfd>=0 ) clo
b150: 73 65 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 29  se(pFile->dirfd)
b160: 3b 0a 20 20 70 46 69 6c 65 2d 3e 64 69 72 66 64  ;.  pFile->dirfd
b170: 20 3d 20 2d 31 3b 0a 20 20 65 6e 74 65 72 4d 75   = -1;.  enterMu
b180: 74 65 78 28 29 3b 0a 0a 20 20 69 66 28 20 70 46  tex();..  if( pF
b190: 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63  ile->pOpen->nLoc
b1a0: 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  k ){.    /* If t
b1b0: 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
b1c0: 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e  ding locks, do n
b1d0: 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73  ot actually clos
b1e0: 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a  e the file just.
b1f0: 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75      ** yet becau
b200: 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c  se that would cl
b210: 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e  ear those locks.
b220: 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74    Instead, add t
b230: 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64  he file.    ** d
b240: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 4f 70  escriptor to pOp
b250: 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49  en->aPending.  I
b260: 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  t will be automa
b270: 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77  tically closed w
b280: 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  hen.    ** the l
b290: 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61  ast lock is clea
b2a0: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
b2b0: 69 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20 73  int *aNew;.    s
b2c0: 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70  truct openCnt *p
b2d0: 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d 3e 70 4f  Open = pFile->pO
b2e0: 70 65 6e 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20  pen;.    aNew = 
b2f0: 72 65 61 6c 6c 6f 63 28 20 70 4f 70 65 6e 2d 3e  realloc( pOpen->
b300: 61 50 65 6e 64 69 6e 67 2c 20 28 70 4f 70 65 6e  aPending, (pOpen
b310: 2d 3e 6e 50 65 6e 64 69 6e 67 2b 31 29 2a 73 69  ->nPending+1)*si
b320: 7a 65 6f 66 28 69 6e 74 29 20 29 3b 0a 20 20 20  zeof(int) );.   
b330: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
b340: 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 6d 61        /* If a ma
b350: 6c 6c 6f 63 20 66 61 69 6c 73 2c 20 6a 75 73 74  lloc fails, just
b360: 20 6c 65 61 6b 20 74 68 65 20 66 69 6c 65 20 64   leak the file d
b370: 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 20  escriptor */.   
b380: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f   }else{.      pO
b390: 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d 20  pen->aPending = 
b3a0: 61 4e 65 77 3b 0a 20 20 20 20 20 20 70 4f 70 65  aNew;.      pOpe
b3b0: 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 70 4f 70 65  n->aPending[pOpe
b3c0: 6e 2d 3e 6e 50 65 6e 64 69 6e 67 5d 20 3d 20 70  n->nPending] = p
b3d0: 46 69 6c 65 2d 3e 68 3b 0a 20 20 20 20 20 20 70  File->h;.      p
b3e0: 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b 2b  Open->nPending++
b3f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
b400: 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
b410: 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
b420: 20 6c 6f 63 6b 73 20 73 6f 20 77 65 20 63 61 6e   locks so we can
b430: 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
b440: 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 20  immediately */. 
b450: 20 20 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e     close(pFile->
b460: 68 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  h);.  }.  releas
b470: 65 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d  eLockInfo(pFile-
b480: 3e 70 4c 6f 63 6b 29 3b 0a 20 20 72 65 6c 65 61  >pLock);.  relea
b490: 73 65 4f 70 65 6e 43 6e 74 28 70 46 69 6c 65 2d  seOpenCnt(pFile-
b4a0: 3e 70 4f 70 65 6e 29 3b 0a 0a 20 20 6c 65 61 76  >pOpen);..  leav
b4b0: 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
b4c0: 41 43 45 32 28 22 43 4c 4f 53 45 20 20 20 25 2d  ACE2("CLOSE   %-
b4d0: 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  3d\n", pFile->h)
b4e0: 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28  ;.  OpenCounter(
b4f0: 2d 31 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46  -1);.  memset(pF
b500: 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75  ile, 0, sizeof(u
b510: 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 72 65 74  nixFile));.  ret
b520: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
b530: 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ...#ifdef SQLITE
b540: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
b550: 53 54 59 4c 45 0a 23 70 72 61 67 6d 61 20 6d 61  STYLE.#pragma ma
b560: 72 6b 20 41 46 50 20 53 75 70 70 6f 72 74 0a 0a  rk AFP Support..
b570: 2f 2a 0a 20 2a 2a 20 54 68 65 20 61 66 70 4c 6f  /*. ** The afpLo
b580: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74 72  ckingContext str
b590: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20  ucture contains 
b5a0: 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70 65  all afp lock spe
b5b0: 63 69 66 69 63 20 73 74 61 74 65 0a 20 2a 2f 0a  cific state. */.
b5c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 61  typedef struct a
b5d0: 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
b5e0: 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
b5f0: 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f  xt;.struct afpLo
b600: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20  ckingContext {. 
b610: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
b620: 6f 6e 67 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  ong sharedLockBy
b630: 74 65 3b 0a 20 20 63 68 61 72 20 2a 66 69 6c 65  te;.  char *file
b640: 50 61 74 68 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74  Path;.};..struct
b650: 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
b660: 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  2.{.  unsigned l
b670: 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b  ong long offset;
b680: 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65          /* offse
b690: 74 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20  t to first byte 
b6a0: 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73  to lock */.  uns
b6b0: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
b6c0: 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f  length;        /
b6d0: 2a 20 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74  * nbr of bytes t
b6e0: 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69  o lock */.  unsi
b6f0: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72  gned long long r
b700: 65 74 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a  etRangeStart; /*
b710: 20 6e 62 72 20 6f 66 20 31 73 74 20 62 79 74 65   nbr of 1st byte
b720: 20 6c 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65   locked if succe
b730: 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67  ssful */.  unsig
b740: 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46  ned char unLockF
b750: 6c 61 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  lag;         /* 
b760: 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20  1 = unlock, 0 = 
b770: 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  lock */.  unsign
b780: 65 64 20 63 68 61 72 20 73 74 61 72 74 45 6e 64  ed char startEnd
b790: 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 31  Flag;       /* 1
b7a0: 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66  =rel to end of f
b7b0: 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74  ork, 0=rel to st
b7c0: 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b  art */.  int fd;
b7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69             /* fi
b7f0: 6c 65 20 64 65 73 63 20 74 6f 20 61 73 73 6f 63  le desc to assoc
b800: 20 74 68 69 73 20 6c 6f 63 6b 20 77 69 74 68 20   this lock with 
b810: 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61  */.};..#define a
b820: 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63  fpfsByteRangeLoc
b830: 6b 32 46 53 43 54 4c 20 20 20 20 20 20 20 20 5f  k2FSCTL        _
b840: 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74  IOWR('z', 23, st
b850: 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
b860: 63 6b 50 42 32 29 0a 0a 2f 2a 20 0a 2a 2a 20 52  ckPB2)../* .** R
b870: 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65  eturn 0 on succe
b880: 73 73 2c 20 31 20 6f 6e 20 66 61 69 6c 75 72 65  ss, 1 on failure
b890: 2e 20 20 54 6f 20 6d 61 74 63 68 20 74 68 65 20  .  To match the 
b8a0: 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20  behavior of the 
b8b0: 0a 2a 2a 20 6e 6f 72 6d 61 6c 20 70 6f 73 69 78  .** normal posix
b8c0: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 28 75   file locking (u
b8d0: 73 65 64 20 69 6e 20 75 6e 69 78 4c 6f 63 6b 20  sed in unixLock 
b8e0: 66 6f 72 20 65 78 61 6d 70 6c 65 29 2c 20 77 65  for example), we
b8f0: 20 73 68 6f 75 6c 64 20 0a 2a 2a 20 70 72 6f 76   should .** prov
b900: 69 64 65 20 27 72 69 63 68 65 72 27 20 72 65 74  ide 'richer' ret
b910: 75 72 6e 20 63 6f 64 65 73 20 2d 20 73 70 65 63  urn codes - spec
b920: 69 66 69 63 61 6c 6c 79 20 74 6f 20 64 69 66 66  ifically to diff
b930: 65 72 65 6e 74 69 61 74 65 20 62 65 74 77 65 65  erentiate betwee
b940: 6e 0a 2a 2a 20 27 66 69 6c 65 20 62 75 73 79 27  n.** 'file busy'
b950: 20 61 6e 64 20 27 66 69 6c 65 20 73 79 73 74 65   and 'file syste
b960: 6d 20 65 72 72 6f 72 27 20 72 65 73 75 6c 74 73  m error' results
b970: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b980: 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 0a 20  _AFPFSSetLock(. 
b990: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74   const char *pat
b9a0: 68 2c 20 0a 20 20 69 6e 74 20 66 64 2c 20 0a 20  h, .  int fd, . 
b9b0: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
b9c0: 6f 6e 67 20 6f 66 66 73 65 74 2c 20 0a 20 20 75  ong offset, .  u
b9d0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
b9e0: 67 20 6c 65 6e 67 74 68 2c 20 0a 20 20 69 6e 74  g length, .  int
b9f0: 20 73 65 74 4c 6f 63 6b 46 6c 61 67 0a 29 7b 0a   setLockFlag.){.
ba00: 20 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e    struct ByteRan
ba10: 67 65 4c 6f 63 6b 50 42 32 20 20 20 20 20 20 20  geLockPB2       
ba20: 70 62 3b 0a 20 20 69 6e 74 20 20 20 20 20 20 20  pb;.  int       
ba30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72                er
ba40: 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63  r;.  .  pb.unLoc
ba50: 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46  kFlag = setLockF
ba60: 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70  lag ? 0 : 1;.  p
ba70: 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67 20 3d  b.startEndFlag =
ba80: 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74 20   0;.  pb.offset 
ba90: 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c  = offset;.  pb.l
baa0: 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20  ength = length; 
bab0: 0a 20 20 70 62 2e 66 64 20 3d 20 66 64 3b 0a 20  .  pb.fd = fd;. 
bac0: 20 4f 53 54 52 41 43 45 35 28 22 41 46 50 4c 4f   OSTRACE5("AFPLO
bad0: 43 4b 20 73 65 74 74 69 6e 67 20 6c 6f 63 6b 20  CK setting lock 
bae0: 25 73 20 66 6f 72 20 25 64 20 69 6e 20 72 61 6e  %s for %d in ran
baf0: 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c  ge %llx:%llx\n",
bb00: 20 0a 20 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c   .    (setLockFl
bb10: 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20  ag?"ON":"OFF"), 
bb20: 66 64 2c 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67  fd, offset, leng
bb30: 74 68 29 3b 0a 20 20 65 72 72 20 3d 20 66 73 63  th);.  err = fsc
bb40: 74 6c 28 70 61 74 68 2c 20 61 66 70 66 73 42 79  tl(path, afpfsBy
bb50: 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54  teRangeLock2FSCT
bb60: 4c 2c 20 26 70 62 2c 20 30 29 3b 0a 20 20 69 66  L, &pb, 0);.  if
bb70: 20 28 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20   ( err==-1 ) {. 
bb80: 20 20 20 4f 53 54 52 41 43 45 34 28 22 41 46 50     OSTRACE4("AFP
bb90: 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f 20 66  LOCK failed to f
bba0: 73 63 74 6c 28 29 20 27 25 73 27 20 25 64 20 25  sctl() '%s' %d %
bbb0: 73 5c 6e 22 2c 20 70 61 74 68 2c 20 65 72 72 6e  s\n", path, errn
bbc0: 6f 2c 20 0a 20 20 20 20 20 20 73 74 72 65 72 72  o, .      strerr
bbd0: 6f 72 28 65 72 72 6e 6f 29 29 3b 0a 20 20 20 20  or(errno));.    
bbe0: 72 65 74 75 72 6e 20 31 3b 20 2f 2a 20 65 72 72  return 1; /* err
bbf0: 6f 72 20 2a 2f 0a 20 20 7d 20 65 6c 73 65 20 7b  or */.  } else {
bc00: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
bc10: 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 69   }.}../*. ** Thi
bc20: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
bc30: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
bc40: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
bc50: 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
bc60: 65 64 0a 20 2a 2a 20 66 69 6c 65 20 62 79 20 74  ed. ** file by t
bc70: 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
bc80: 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
bc90: 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
bca0: 2c 20 72 65 74 75 72 6e 0a 20 2a 2a 20 6e 6f 6e  , return. ** non
bcb0: 2d 7a 65 72 6f 2e 20 20 49 66 20 74 68 65 20 66  -zero.  If the f
bcc0: 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20  ile is unlocked 
bcd0: 6f 72 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 53 48  or holds only SH
bce0: 41 52 45 44 20 6c 6f 63 6b 73 2c 20 74 68 65 6e  ARED locks, then
bcf0: 0a 20 2a 2a 20 72 65 74 75 72 6e 20 7a 65 72 6f  . ** return zero
bd00: 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .. */.static int
bd10: 20 61 66 70 55 6e 69 78 43 68 65 63 6b 52 65 73   afpUnixCheckRes
bd20: 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
bd30: 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69  3_file *id){.  i
bd40: 6e 74 20 72 20 3d 20 30 3b 0a 20 20 75 6e 69 78  nt r = 0;.  unix
bd50: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
bd60: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a  nixFile*)id;.  .
bd70: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
bd80: 29 3b 20 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67  ); .  afpLocking
bd90: 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
bda0: 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
bdb0: 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e  ntext *) pFile->
bdc0: 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
bdd0: 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66    .  /* Check if
bde0: 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
bdf0: 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
be00: 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
be10: 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
be20: 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  type>SHARED_LOCK
be30: 20 29 7b 0a 20 20 20 20 72 20 3d 20 31 3b 0a 20   ){.    r = 1;. 
be40: 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
be50: 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
be60: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
be70: 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20  olds it..   */. 
be80: 20 69 66 20 28 20 21 72 20 29 20 7b 0a 20 20 20   if ( !r ) {.   
be90: 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20 62 79 74   /* lock the byt
bea0: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61 69  e */.    int fai
beb0: 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c  led = _AFPFSSetL
bec0: 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c  ock(context->fil
bed0: 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c  ePath, pFile->h,
bee0: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
bef0: 31 2c 31 29 3b 20 20 0a 20 20 20 20 69 66 20 28  1,1);  .    if (
bf00: 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20  failed) {.      
bf10: 2f 2a 20 69 66 20 77 65 20 66 61 69 6c 65 64 20  /* if we failed 
bf20: 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20  to get the lock 
bf30: 74 68 65 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73  then someone els
bf40: 65 20 6d 75 73 74 20 68 61 76 65 20 69 74 20 2a  e must have it *
bf50: 2f 0a 20 20 20 20 20 20 72 20 3d 20 31 3b 0a 20  /.      r = 1;. 
bf60: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
bf70: 20 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63 65    /* if we succe
bf80: 65 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20 74  eded in taking t
bf90: 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b  he reserved lock
bfa0: 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72  , unlock it to r
bfb0: 65 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20  estore.      ** 
bfc0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  the original sta
bfd0: 74 65 20 2a 2f 0a 20 20 20 20 20 20 5f 41 46 50  te */.      _AFP
bfe0: 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  FSSetLock(contex
bff0: 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69  t->filePath, pFi
c000: 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f  le->h, RESERVED_
c010: 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20  BYTE, 1, 0);.   
c020: 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45   }.  }.  OSTRACE
c030: 33 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  3("TEST WR-LOCK 
c040: 25 64 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  %d %d\n", pFile-
c050: 3e 68 2c 20 72 29 3b 0a 20 20 0a 20 20 72 65 74  >h, r);.  .  ret
c060: 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 20 41 46 50  urn r;.}../* AFP
c070: 2d 73 74 79 6c 65 20 6c 6f 63 6b 69 6e 67 20 66  -style locking f
c080: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 62 65 68  ollowing the beh
c090: 61 76 69 6f 72 20 6f 66 20 75 6e 69 78 4c 6f 63  avior of unixLoc
c0a0: 6b 2c 20 73 65 65 20 74 68 65 20 75 6e 69 78 4c  k, see the unixL
c0b0: 6f 63 6b 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ock .** function
c0c0: 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 64 65   comments for de
c0d0: 74 61 69 6c 73 20 6f 66 20 6c 6f 63 6b 20 6d 61  tails of lock ma
c0e0: 6e 61 67 65 6d 65 6e 74 2e 20 2a 2f 0a 73 74 61  nagement. */.sta
c0f0: 74 69 63 20 69 6e 74 20 61 66 70 55 6e 69 78 4c  tic int afpUnixL
c100: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
c110: 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
c120: 70 65 29 0a 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pe).{.  int rc =
c130: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
c140: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
c150: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
c160: 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
c170: 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61  xt *context = (a
c180: 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
c190: 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
c1a0: 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74  ngContext;.  int
c1b0: 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
c1c0: 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  = 0;.  .  assert
c1d0: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
c1e0: 52 41 43 45 35 28 22 4c 4f 43 4b 20 20 20 20 25  RACE5("LOCK    %
c1f0: 64 20 25 73 20 77 61 73 20 25 73 20 70 69 64 3d  d %s was %s pid=
c200: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
c210: 0a 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79  .         lockty
c220: 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29  peName(locktype)
c230: 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70  , locktypeName(p
c240: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c  File->locktype),
c250: 20 67 65 74 70 69 64 28 29 29 3b 20 20 0a 20 20   getpid());  .  
c260: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
c270: 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66  lready a lock of
c280: 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f   this type or mo
c290: 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f  re restrictive o
c2a0: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 75 6e 69  n the.    ** uni
c2b0: 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e  xFile, do nothin
c2c0: 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65  g. Don't use the
c2d0: 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65   afp_end_lock: e
c2e0: 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 20  xit path, as.   
c2f0: 20 2a 2a 20 65 6e 74 65 72 4d 75 74 65 78 28 29   ** enterMutex()
c300: 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c   hasn't been cal
c310: 6c 65 64 20 79 65 74 2e 0a 20 20 20 20 2a 2f 0a  led yet..    */.
c320: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
c330: 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20  ktype>=locktype 
c340: 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 33 28  ){.    OSTRACE3(
c350: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f  "LOCK    %d %s o
c360: 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29  k (already held)
c370: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
c380: 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79            lockty
c390: 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29  peName(locktype)
c3a0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
c3b0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
c3c0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
c3d0: 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63   locking sequenc
c3e0: 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20 20  e is correct.   
c3f0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
c400: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e  ile->locktype!=N
c410: 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79  O_LOCK || lockty
c420: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
c430: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
c440: 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c  ktype!=PENDING_L
c450: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
c460: 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52   locktype!=RESER
c470: 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c  VED_LOCK || pFil
c480: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  e->locktype==SHA
c490: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
c4a0: 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69   /* This mutex i
c4b0: 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65  s needed because
c4c0: 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73   pFile->pLock is
c4d0: 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
c4e0: 68 72 65 61 64 73 0a 20 20 20 20 2a 2f 0a 20 20  hreads.    */.  
c4f0: 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20  enterMutex();.. 
c500: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
c510: 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
c520: 20 6f 77 6e 73 20 74 68 65 20 70 46 69 6c 65 2e   owns the pFile.
c530: 0a 20 20 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74  .    */.  rc = t
c540: 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70  ransferOwnership
c550: 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72  (pFile);.  if( r
c560: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
c570: 20 20 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29      leaveMutex()
c580: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
c590: 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41  .  }.    .  /* A
c5a0: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
c5b0: 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61   needed before a
c5c0: 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45  cquiring a SHARE
c5d0: 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72  D lock and befor
c5e0: 65 0a 20 20 20 20 2a 2a 20 61 63 71 75 69 72 69  e.    ** acquiri
c5f0: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
c600: 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53  lock.  For the S
c610: 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
c620: 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 20  PENDING will.   
c630: 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e   ** be released.
c640: 0a 20 20 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  .    */.  if( lo
c650: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
c660: 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 6c  OCK .      || (l
c670: 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
c680: 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  VE_LOCK && pFile
c690: 2d 3e 6c 6f 63 6b 74 79 70 65 3c 50 45 4e 44 49  ->locktype<PENDI
c6a0: 4e 47 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 29  NG_LOCK).      )
c6b0: 7b 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64  {.    int failed
c6c0: 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b   = _AFPFSSetLock
c6d0: 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61  (context->filePa
c6e0: 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 0a 20  th, pFile->h, . 
c6f0: 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54       PENDING_BYT
c700: 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66  E, 1, 1);.    if
c710: 20 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20   (failed) {.    
c720: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
c730: 53 59 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  SY;.      goto a
c740: 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
c750: 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49   }.  }.  .  /* I
c760: 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74  f control gets t
c770: 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
c780: 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61  en actually go a
c790: 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20  head and make.  
c7a0: 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73    ** operating s
c7b0: 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20  ystem calls for 
c7c0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f  the specified lo
c7d0: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 69 66 28  ck..    */.  if(
c7e0: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
c7f0: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e  D_LOCK ){.    in
c800: 74 20 6c 6b 2c 20 66 61 69 6c 65 64 3b 0a 20 20  t lk, failed;.  
c810: 20 20 69 6e 74 20 74 72 69 65 73 20 3d 20 30 3b    int tries = 0;
c820: 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77  .    .    /* Now
c830: 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f   get the read-lo
c840: 63 6b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74  ck */.    /* not
c850: 65 20 74 68 61 74 20 74 68 65 20 71 75 61 6c 69  e that the quali
c860: 74 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d  ty of the random
c870: 6e 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61 74  ness doesn't mat
c880: 74 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a 2f  ter that much */
c890: 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d  .    lk = random
c8a0: 28 29 3b 20 0a 20 20 20 20 63 6f 6e 74 65 78 74  (); .    context
c8b0: 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  ->sharedLockByte
c8c0: 20 3d 20 28 6c 6b 20 26 20 30 78 37 66 66 66 66   = (lk & 0x7ffff
c8d0: 66 66 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a  fff)%(SHARED_SIZ
c8e0: 45 20 2d 20 31 29 3b 0a 20 20 20 20 66 61 69 6c  E - 1);.    fail
c8f0: 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f  ed = _AFPFSSetLo
c900: 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65  ck(context->file
c910: 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  Path, pFile->h, 
c920: 0a 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49  .      SHARED_FI
c930: 52 53 54 2b 63 6f 6e 74 65 78 74 2d 3e 73 68 61  RST+context->sha
c940: 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20  redLockByte, 1, 
c950: 31 29 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20  1);.    .    /* 
c960: 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61  Drop the tempora
c970: 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20  ry PENDING lock 
c980: 2a 2f 0a 20 20 20 20 69 66 20 28 5f 41 46 50 46  */.    if (_AFPF
c990: 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  SSetLock(context
c9a0: 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c  ->filePath, pFil
c9b0: 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59  e->h, PENDING_BY
c9c0: 54 45 2c 20 31 2c 20 30 29 29 20 7b 0a 20 20 20  TE, 1, 0)) {.   
c9d0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
c9e0: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 20 2f 2a  OERR_UNLOCK;  /*
c9f0: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76   This should nev
ca00: 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20  er happen */.   
ca10: 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
ca20: 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  lock;.    }.    
ca30: 0a 20 20 20 20 69 66 28 20 66 61 69 6c 65 64 20  .    if( failed 
ca40: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
ca50: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
ca60: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 70 46   else {.      pF
ca70: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
ca80: 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
ca90: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
caa0: 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77  /* The request w
cab0: 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45  as for a RESERVE
cac0: 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
cad0: 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20  ock.  It is.    
cae0: 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  ** assumed that 
caf0: 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45  there is a SHARE
cb00: 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
cb10: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20  k on the file.  
cb20: 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20    ** already..  
cb30: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61 69    */.    int fai
cb40: 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  led = 0;.    ass
cb50: 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 6c  ert( 0!=pFile->l
cb60: 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20 69  ocktype );.    i
cb70: 66 20 28 6c 6f 63 6b 74 79 70 65 20 3e 3d 20 52  f (locktype >= R
cb80: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20  ESERVED_LOCK && 
cb90: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
cba0: 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  < RESERVED_LOCK)
cbb0: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63   {.        /* Ac
cbc0: 71 75 69 72 65 20 61 20 52 45 53 45 52 56 45 44  quire a RESERVED
cbd0: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20   lock */.       
cbe0: 20 66 61 69 6c 65 64 20 3d 20 5f 41 46 50 46 53   failed = _AFPFS
cbf0: 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
cc00: 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65  >filePath, pFile
cc10: 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ->h, RESERVED_BY
cc20: 54 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20 7d 0a  TE, 1,1);.    }.
cc30: 20 20 20 20 69 66 20 28 21 66 61 69 6c 65 64 20      if (!failed 
cc40: 26 26 20 6c 6f 63 6b 74 79 70 65 20 3d 3d 20 45  && locktype == E
cc50: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b  XCLUSIVE_LOCK) {
cc60: 0a 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72  .      /* Acquir
cc70: 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
cc80: 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a  ock */.        .
cc90: 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
cca0: 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
ccb0: 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74 68  before trying th
ccc0: 65 20 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20  e range.  we'll 
ccd0: 6e 65 65 64 20 74 6f 20 0a 20 20 20 20 20 20 2a  need to .      *
cce0: 2a 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68  * reestablish th
ccf0: 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66  e shared lock if
cd00: 20 77 65 20 63 61 6e 27 74 20 67 65 74 20 74 68   we can't get th
cd10: 65 20 20 61 66 70 55 6e 69 78 55 6e 6c 6f 63 6b  e  afpUnixUnlock
cd20: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
cd30: 69 66 20 28 21 5f 41 46 50 46 53 53 65 74 4c 6f  if (!_AFPFSSetLo
cd40: 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65  ck(context->file
cd50: 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  Path, pFile->h, 
cd60: 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20  SHARED_FIRST +. 
cd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd80: 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d          context-
cd90: 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c  >sharedLockByte,
cda0: 20 31 2c 20 30 29 29 20 7b 0a 20 20 20 20 20 20   1, 0)) {.      
cdb0: 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70    /* now attemmp
cdc0: 74 20 74 6f 20 67 65 74 20 74 68 65 20 65 78 63  t to get the exc
cdd0: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67  lusive lock rang
cde0: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69  e */.        fai
cdf0: 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c  led = _AFPFSSetL
ce00: 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c  ock(context->fil
ce10: 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c  ePath, pFile->h,
ce20: 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a   SHARED_FIRST, .
ce30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
ce50: 48 41 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a  HARED_SIZE, 1);.
ce60: 20 20 20 20 20 20 20 20 69 66 20 28 66 61 69 6c          if (fail
ce70: 65 64 20 26 26 20 5f 41 46 50 46 53 53 65 74 4c  ed && _AFPFSSetL
ce80: 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c  ock(context->fil
ce90: 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c  ePath, pFile->h,
cea0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a   SHARED_FIRST +.
ceb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ced0: 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61      context->sha
cee0: 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20  redLockByte, 1, 
cef0: 31 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  1)) {.          
cf00: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
cf10: 52 5f 52 44 4c 4f 43 4b 3b 20 2f 2a 20 74 68 69  R_RDLOCK; /* thi
cf20: 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68  s should never h
cf30: 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20  appen */.       
cf40: 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20   }.      } else 
cf50: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 2a 2f 0a  {.        /* */.
cf60: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
cf70: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
cf80: 3b 20 2f 2a 20 74 68 69 73 20 73 68 6f 75 6c 64  ; /* this should
cf90: 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f   never happen */
cfa0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
cfb0: 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 26 26     if( failed &&
cfc0: 20 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc == SQLITE_OK
cfd0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
cfe0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
cff0: 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63  .  }.  .  if( rc
d000: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
d010: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
d020: 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
d030: 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74   }else if( lockt
d040: 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
d050: 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
d060: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e  ->locktype = PEN
d070: 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20  DING_LOCK;.  }. 
d080: 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a   .afp_end_lock:.
d090: 20 20 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29      leaveMutex()
d0a0: 3b 0a 20 20 4f 53 54 52 41 43 45 34 28 22 4c 4f  ;.  OSTRACE4("LO
d0b0: 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 5c 6e  CK    %d %s %s\n
d0c0: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63  ", pFile->h, loc
d0d0: 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79  ktypeName(lockty
d0e0: 70 65 29 2c 20 0a 20 20 20 20 20 20 20 20 20 72  pe), .         r
d0f0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22  c==SQLITE_OK ? "
d100: 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 3b  ok" : "failed");
d110: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d120: 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20 74 68  ./*. ** Lower th
d130: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
d140: 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
d150: 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b  or pFile to lock
d160: 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a  type.  locktype.
d170: 20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68   ** must be eith
d180: 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
d190: 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20  ARED_LOCK.. **. 
d1a0: 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
d1b0: 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
d1c0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
d1d0: 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
d1e0: 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65  below. ** the re
d1f0: 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
d200: 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
d210: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
d220: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61   */.static int a
d230: 66 70 55 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c  fpUnixUnlock(sql
d240: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
d250: 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20  nt locktype) {. 
d260: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
d270: 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ck;.  int rc = S
d280: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
d290: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
d2a0: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61  nixFile*)id;.  a
d2b0: 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
d2c0: 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70   *context = (afp
d2d0: 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
d2e0: 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  ) pFile->locking
d2f0: 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 61 73 73 65  Context;..  asse
d300: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
d310: 53 54 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20  STRACE5("UNLOCK 
d320: 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69   %d %d was %d pi
d330: 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d=%d\n", pFile->
d340: 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20  h, locktype,.   
d350: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
d360: 6b 74 79 70 65 2c 20 67 65 74 70 69 64 28 29 29  ktype, getpid())
d370: 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 6c  ;.  .  assert( l
d380: 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f  ocktype<=SHARED_
d390: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46  LOCK );.  if( pF
d3a0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c  ile->locktype<=l
d3b0: 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
d3c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d3d0: 0a 20 20 7d 0a 20 20 69 66 28 20 43 48 45 43 4b  .  }.  if( CHECK
d3e0: 5f 54 48 52 45 41 44 49 44 28 70 46 69 6c 65 29  _THREADID(pFile)
d3f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
d400: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
d410: 7d 0a 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29  }.  enterMutex()
d420: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  ;.  if( pFile->l
d430: 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c  ocktype>SHARED_L
d440: 4f 43 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c  OCK ){.    if( l
d450: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
d460: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  LOCK ){.      in
d470: 74 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 0a 20  t failed = 0;.. 
d480: 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 74       /* unlock t
d490: 68 65 20 65 78 63 6c 75 73 69 76 65 20 72 61 6e  he exclusive ran
d4a0: 67 65 20 2d 20 74 68 65 6e 20 72 65 2d 65 73 74  ge - then re-est
d4b0: 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65  ablish the share
d4c0: 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  d lock */.      
d4d0: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if (pFile->lockt
d4e0: 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
d4f0: 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 66  OCK) {.        f
d500: 61 69 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65  ailed = _AFPFSSe
d510: 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66  tLock(context->f
d520: 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e  ilePath, pFile->
d530: 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  h, SHARED_FIRST,
d540: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
d550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d560: 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20     SHARED_SIZE, 
d570: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28  0);.        if (
d580: 21 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20  !failed) {.     
d590: 20 20 20 20 20 2f 2a 20 73 75 63 63 65 73 73 66       /* successf
d5a0: 75 6c 6c 79 20 72 65 6d 6f 76 65 64 20 74 68 65  ully removed the
d5b0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
d5c0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  */.          if 
d5d0: 28 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63  (_AFPFSSetLock(c
d5e0: 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68  ontext->filePath
d5f0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52  , pFile->h, SHAR
d600: 45 44 5f 46 49 52 53 54 2b 0a 20 20 20 20 20 20  ED_FIRST+.      
d610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d620: 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 73        context->s
d630: 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31  haredLockByte, 1
d640: 2c 20 31 29 29 20 7b 0a 20 20 20 20 20 20 20 20  , 1)) {.        
d650: 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f      /* failed to
d660: 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20 6f 75   re-establish ou
d670: 72 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f  r shared lock */
d680: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
d690: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  = SQLITE_IOERR_R
d6a0: 44 4c 4f 43 4b 3b 20 2f 2a 20 54 68 69 73 20 73  DLOCK; /* This s
d6b0: 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70  hould never happ
d6c0: 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  en */.          
d6d0: 7d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  }.        } else
d6e0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20   {.          /* 
d6f0: 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65  This should neve
d700: 72 20 68 61 70 70 65 6e 20 2d 20 66 61 69 6c 65  r happen - faile
d710: 64 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  d to unlock the 
d720: 65 78 63 6c 75 73 69 76 65 20 72 61 6e 67 65 20  exclusive range 
d730: 2a 2f 0a 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 55  = SQLITE_IOERR_U
d750: 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d  NLOCK;.        }
d760: 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a   .      }.    }.
d770: 20 20 20 20 69 66 20 28 72 63 20 3d 3d 20 53 51      if (rc == SQ
d780: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65  LITE_OK && pFile
d790: 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50 45 4e 44  ->locktype>=PEND
d7a0: 49 4e 47 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  ING_LOCK) {.    
d7b0: 20 20 69 66 20 28 5f 41 46 50 46 53 53 65 74 4c    if (_AFPFSSetL
d7c0: 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c  ock(context->fil
d7d0: 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c  ePath, pFile->h,
d7e0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31   PENDING_BYTE, 1
d7f0: 2c 20 30 29 29 7b 0a 20 20 20 20 20 20 20 20 2f  , 0)){.        /
d800: 2a 20 66 61 69 6c 65 64 20 74 6f 20 72 65 6c 65  * failed to rele
d810: 61 73 65 20 74 68 65 20 70 65 6e 64 69 6e 67 20  ase the pending 
d820: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
d830: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
d840: 52 5f 55 4e 4c 4f 43 4b 3b 20 2f 2a 20 54 68 69  R_UNLOCK; /* Thi
d850: 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68  s should never h
d860: 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d  appen */.      }
d870: 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66 20 28  .    } .    if (
d880: 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20  rc == SQLITE_OK 
d890: 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  && pFile->lockty
d8a0: 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe>=RESERVED_LOC
d8b0: 4b 29 20 7b 0a 20 20 20 20 20 20 69 66 20 28 5f  K) {.      if (_
d8c0: 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e  AFPFSSetLock(con
d8d0: 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20  text->filePath, 
d8e0: 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56  pFile->h, RESERV
d8f0: 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 29 20  ED_BYTE, 1, 0)) 
d900: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 61 69  {.        /* fai
d910: 6c 65 64 20 74 6f 20 72 65 6c 65 61 73 65 20 74  led to release t
d920: 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b  he reserved lock
d930: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
d940: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
d950: 4c 4f 43 4b 3b 20 20 2f 2a 20 54 68 69 73 20 73  LOCK;  /* This s
d960: 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70  hould never happ
d970: 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  en */.      }.  
d980: 20 20 7d 20 0a 20 20 7d 0a 20 20 69 66 28 20 6c    } .  }.  if( l
d990: 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b  ocktype==NO_LOCK
d9a0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69 6c   ){.    int fail
d9b0: 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f  ed = _AFPFSSetLo
d9c0: 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65  ck(context->file
d9d0: 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  Path, pFile->h, 
d9e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da00: 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20 63  SHARED_FIRST + c
da10: 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f  ontext->sharedLo
da20: 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20  ckByte, 1, 0);. 
da30: 20 20 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b     if (failed) {
da40: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
da50: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
da60: 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64    /* This should
da70: 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f   never happen */
da80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 20  .    }.  }.  if 
da90: 28 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b  (rc == SQLITE_OK
daa0: 29 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  ).    pFile->loc
dab0: 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
dac0: 3b 0a 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29  ;.  leaveMutex()
dad0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
dae0: 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61  ../*. ** Close a
daf0: 20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75 70 20   file & cleanup 
db00: 41 46 50 20 73 70 65 63 69 66 69 63 20 6c 6f 63  AFP specific loc
db10: 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a 20 2a  king context . *
db20: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
db30: 55 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65  UnixClose(sqlite
db40: 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
db50: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
db60: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 70 49 64  = (unixFile*)pId
db70: 3b 0a 0a 20 20 69 66 28 20 21 70 46 69 6c 65 20  ;..  if( !pFile 
db80: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
db90: 4f 4b 3b 0a 20 20 61 66 70 55 6e 69 78 55 6e 6c  OK;.  afpUnixUnl
dba0: 6f 63 6b 28 2a 70 49 64 2c 20 4e 4f 5f 4c 4f 43  ock(*pId, NO_LOC
dbb0: 4b 29 3b 0a 20 20 2f 2a 20 66 72 65 65 20 74 68  K);.  /* free th
dbc0: 65 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 73 74  e AFP locking st
dbd0: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 66 20  ructure */.  if 
dbe0: 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  (pFile->lockingC
dbf0: 6f 6e 74 65 78 74 20 21 3d 20 4e 55 4c 4c 29 20  ontext != NULL) 
dc00: 7b 0a 20 20 20 20 69 66 20 28 28 28 61 66 70 4c  {.    if (((afpL
dc10: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
dc20: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
dc30: 6e 74 65 78 74 29 2d 3e 66 69 6c 65 50 61 74 68  ntext)->filePath
dc40: 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20   != NULL).      
dc50: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 28 28 61  sqlite3_free(((a
dc60: 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
dc70: 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
dc80: 43 6f 6e 74 65 78 74 29 2d 3e 66 69 6c 65 50 61  Context)->filePa
dc90: 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  th);.    sqlite3
dca0: 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63  _free(pFile->loc
dcb0: 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20  kingContext);.  
dcc0: 7d 0a 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  }..  if( pFile->
dcd0: 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65  dirfd>=0 ) close
dce0: 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 29 3b 0a  (pFile->dirfd);.
dcf0: 20 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 20 3d    pFile->dirfd =
dd00: 20 2d 31 3b 0a 20 20 63 6c 6f 73 65 28 70 46 69   -1;.  close(pFi
dd10: 6c 65 2d 3e 68 29 3b 0a 20 20 4f 53 54 52 41 43  le->h);.  OSTRAC
dd20: 45 32 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64  E2("CLOSE   %-3d
dd30: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a  \n", pFile->h);.
dd40: 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31    OpenCounter(-1
dd50: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
dd60: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 70 72 61 67  TE_OK;.}...#prag
dd70: 6d 61 20 6d 61 72 6b 20 66 6c 6f 63 6b 28 29 20  ma mark flock() 
dd80: 73 74 79 6c 65 20 6c 6f 63 6b 69 6e 67 0a 0a 2f  style locking../
dd90: 2a 0a 20 2a 2a 20 54 68 65 20 66 6c 6f 63 6b 4c  *. ** The flockL
dda0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 69 73  ockingContext is
ddb0: 20 6e 6f 74 20 75 73 65 64 0a 20 2a 2f 0a 74 79   not used. */.ty
ddc0: 70 65 64 65 66 20 76 6f 69 64 20 66 6c 6f 63 6b  pedef void flock
ddd0: 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  LockingContext;.
dde0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
ddf0: 6b 55 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76  kUnixCheckReserv
de00: 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
de10: 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 75 6e 69  ile *id) {.  uni
de20: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
de30: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
de40: 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f  .  if (pFile->lo
de50: 63 6b 74 79 70 65 20 3d 3d 20 52 45 53 45 52 56  cktype == RESERV
de60: 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 72  ED_LOCK) {.    r
de70: 65 74 75 72 6e 20 31 3b 20 2f 2a 20 61 6c 72 65  eturn 1; /* alre
de80: 61 64 79 20 68 61 76 65 20 61 20 72 65 73 65 72  ady have a reser
de90: 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 20  ved lock */.  } 
dea0: 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 61 74  else {.    /* at
deb0: 74 65 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65  tempt to get the
dec0: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74   lock */.    int
ded0: 20 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c   rc = flock(pFil
dee0: 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20  e->h, LOCK_EX | 
def0: 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20 20 69 66  LOCK_NB);.    if
df00: 20 28 21 72 63 29 20 7b 0a 20 20 20 20 20 20 2f   (!rc) {.      /
df10: 2a 20 67 6f 74 20 74 68 65 20 6c 6f 63 6b 2c 20  * got the lock, 
df20: 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20 20 20  unlock it */.   
df30: 20 20 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e     flock(pFile->
df40: 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20  h, LOCK_UN);.   
df50: 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a     return 0;  /*
df60: 20 6e 6f 20 6f 6e 65 20 68 61 73 20 69 74 20 72   no one has it r
df70: 65 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 7d  eserved */.    }
df80: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20 2f  .    return 1; /
df90: 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d  * someone else m
dfa0: 69 67 68 74 20 68 61 76 65 20 69 74 20 72 65 73  ight have it res
dfb0: 65 72 76 65 64 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a  erved */.  }.}..
dfc0: 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
dfd0: 55 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33  UnixLock(sqlite3
dfe0: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  _file *id, int l
dff0: 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69  ocktype) {.  uni
e000: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
e010: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
e020: 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65  .  /* if we alre
e030: 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c  ady have a lock,
e040: 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76 65   it is exclusive
e050: 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64  .  .  ** Just ad
e060: 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70  just level and p
e070: 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72  unt on outta her
e080: 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c  e. */.  if (pFil
e090: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3e 20 4e 4f  e->locktype > NO
e0a0: 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69  _LOCK) {.    pFi
e0b0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c  le->locktype = l
e0c0: 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 72 65 74  ocktype;.    ret
e0d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
e0e0: 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20   }.  .  /* grab 
e0f0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
e100: 6b 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  k */.  int rc = 
e110: 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
e120: 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e  LOCK_EX | LOCK_N
e130: 42 29 3b 0a 20 20 69 66 20 28 72 63 29 20 7b 0a  B);.  if (rc) {.
e140: 20 20 20 20 2f 2a 20 64 69 64 6e 27 74 20 67 65      /* didn't ge
e150: 74 2c 20 6d 75 73 74 20 62 65 20 62 75 73 79 20  t, must be busy 
e160: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
e170: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 20 65  LITE_BUSY;.  } e
e180: 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74  lse {.    /* got
e190: 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70   it, set the typ
e1a0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20  e and return ok 
e1b0: 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  */.    pFile->lo
e1c0: 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70  cktype = locktyp
e1d0: 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e;.    return SQ
e1e0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
e1f0: 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
e200: 55 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  UnixUnlock(sqlit
e210: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
e220: 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75   locktype) {.  u
e230: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
e240: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
e250: 20 20 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63    .  assert( loc
e260: 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f  ktype<=SHARED_LO
e270: 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f  CK );.  .  /* no
e280: 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20  -op if possible 
e290: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
e2a0: 6c 6f 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74 79  locktype==lockty
e2b0: 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  pe ){.    return
e2c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
e2d0: 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63    .  /* shared c
e2e0: 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62  an just be set b
e2f0: 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73  ecause we always
e300: 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69   have an exclusi
e310: 76 65 20 2a 2f 0a 20 20 69 66 20 28 6c 6f 63 6b  ve */.  if (lock
e320: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
e330: 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
e340: 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
e350: 79 70 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ype;.    return 
e360: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
e370: 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c   .  /* no, reall
e380: 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  y, unlock. */.  
e390: 69 6e 74 20 72 63 20 3d 20 66 6c 6f 63 6b 28 70  int rc = flock(p
e3a0: 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e  File->h, LOCK_UN
e3b0: 29 3b 0a 20 20 69 66 20 28 72 63 29 0a 20 20 20  );.  if (rc).   
e3c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
e3d0: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 65  OERR_UNLOCK;.  e
e3e0: 6c 73 65 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  lse {.    pFile-
e3f0: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c  >locktype = NO_L
e400: 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  OCK;.    return 
e410: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
e420: 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61  ../*. ** Close a
e430: 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69   file.. */.stati
e440: 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 69 78 43  c int flockUnixC
e450: 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
e460: 65 20 2a 70 49 64 29 20 7b 0a 20 20 75 6e 69 78  e *pId) {.  unix
e470: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
e480: 6e 69 78 46 69 6c 65 2a 29 2a 70 49 64 3b 0a 20  nixFile*)*pId;. 
e490: 20 0a 20 20 69 66 28 20 21 70 46 69 6c 65 20 29   .  if( !pFile )
e4a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e4b0: 4b 3b 0a 20 20 66 6c 6f 63 6b 55 6e 69 78 55 6e  K;.  flockUnixUn
e4c0: 6c 6f 63 6b 28 2a 70 49 64 2c 20 4e 4f 5f 4c 4f  lock(*pId, NO_LO
e4d0: 43 4b 29 3b 0a 20 20 0a 20 20 69 66 28 20 70 46  CK);.  .  if( pF
e4e0: 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29 20  ile->dirfd>=0 ) 
e4f0: 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72  close(pFile->dir
e500: 66 64 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 64 69  fd);.  pFile->di
e510: 72 66 64 20 3d 20 2d 31 3b 0a 20 20 65 6e 74 65  rfd = -1;.  ente
e520: 72 4d 75 74 65 78 28 29 3b 0a 20 20 0a 20 20 63  rMutex();.  .  c
e530: 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 68 29 3b 20  lose(pFile->h); 
e540: 20 0a 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29   .  leaveMutex()
e550: 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22 43 4c  ;.  OSTRACE2("CL
e560: 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70  OSE   %-3d\n", p
e570: 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e  File->h);.  Open
e580: 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 72  Counter(-1);.  r
e590: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e5a0: 0a 7d 0a 0a 23 70 72 61 67 6d 61 20 6d 61 72 6b  .}..#pragma mark
e5b0: 20 4f 6c 64 2d 53 63 68 6f 6f 6c 20 2e 6c 6f 63   Old-School .loc
e5c0: 6b 20 66 69 6c 65 20 62 61 73 65 64 20 6c 6f 63  k file based loc
e5d0: 6b 69 6e 67 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 65  king../*. ** The
e5e0: 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43   dotlockLockingC
e5f0: 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65  ontext structure
e600: 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 64 6f   contains all do
e610: 74 6c 6f 63 6b 20 28 2e 6c 6f 63 6b 29 20 6c 6f  tlock (.lock) lo
e620: 63 6b 0a 20 2a 2a 20 73 70 65 63 69 66 69 63 20  ck. ** specific 
e630: 73 74 61 74 65 0a 20 2a 2f 0a 74 79 70 65 64 65  state. */.typede
e640: 66 20 73 74 72 75 63 74 20 64 6f 74 6c 6f 63 6b  f struct dotlock
e650: 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 64  LockingContext d
e660: 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e  otlockLockingCon
e670: 74 65 78 74 3b 0a 73 74 72 75 63 74 20 64 6f 74  text;.struct dot
e680: 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  lockLockingConte
e690: 78 74 20 7b 0a 20 20 63 68 61 72 20 2a 6c 6f 63  xt {.  char *loc
e6a0: 6b 50 61 74 68 3b 0a 7d 3b 0a 0a 0a 73 74 61 74  kPath;.};...stat
e6b0: 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e  ic int dotlockUn
e6c0: 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
e6d0: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
e6e0: 20 2a 69 64 29 20 7b 0a 20 20 75 6e 69 78 46 69   *id) {.  unixFi
e6f0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
e700: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 64 6f 74  xFile*)id;.  dot
e710: 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  lockLockingConte
e720: 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 0a 20  xt *context = . 
e730: 20 20 20 28 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69     (dotlockLocki
e740: 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69  ngContext *) pFi
e750: 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
e760: 78 74 3b 0a 20 20 0a 20 20 69 66 20 28 70 46 69  xt;.  .  if (pFi
e770: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 3d 20  le->locktype == 
e780: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b  RESERVED_LOCK) {
e790: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20 2f  .    return 1; /
e7a0: 2a 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61  * already have a
e7b0: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a   reserved lock *
e7c0: 2f 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  /.  } else {.   
e7d0: 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61   struct stat sta
e7e0: 74 42 75 66 3b 0a 20 20 20 20 69 66 20 28 6c 73  tBuf;.    if (ls
e7f0: 74 61 74 28 63 6f 6e 74 65 78 74 2d 3e 6c 6f 63  tat(context->loc
e800: 6b 50 61 74 68 2c 26 73 74 61 74 42 75 66 29 20  kPath,&statBuf) 
e810: 3d 3d 20 30 29 0a 20 20 20 20 20 20 2f 2a 20 66  == 0).      /* f
e820: 69 6c 65 20 65 78 69 73 74 73 2c 20 73 6f 6d 65  ile exists, some
e830: 6f 6e 65 20 65 6c 73 65 20 68 61 73 20 74 68 65  one else has the
e840: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72   lock */.      r
e850: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 65 6c 73  eturn 1;.    els
e860: 65 0a 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20  e.      /* file 
e870: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
e880: 77 65 20 63 6f 75 6c 64 20 68 61 76 65 20 69 74  we could have it
e890: 20 69 66 20 77 65 20 77 61 6e 74 20 69 74 20 2a   if we want it *
e8a0: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  /.      return 0
e8b0: 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
e8c0: 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 4c  int dotlockUnixL
e8d0: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
e8e0: 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
e8f0: 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  pe) {.  unixFile
e900: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
e910: 69 6c 65 2a 29 69 64 3b 0a 20 20 64 6f 74 6c 6f  ile*)id;.  dotlo
e920: 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ckLockingContext
e930: 20 2a 63 6f 6e 74 65 78 74 20 3d 20 0a 20 20 20   *context = .   
e940: 20 28 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67   (dotlockLocking
e950: 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65  Context *) pFile
e960: 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
e970: 3b 0a 20 20 0a 20 20 2f 2a 20 69 66 20 77 65 20  ;.  .  /* if we 
e980: 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c  already have a l
e990: 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75  ock, it is exclu
e9a0: 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73  sive.  .  ** Jus
e9b0: 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61  t adjust level a
e9c0: 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61  nd punt on outta
e9d0: 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28   here. */.  if (
e9e0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
e9f0: 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  > NO_LOCK) {.   
ea00: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
ea10: 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20   = locktype;.   
ea20: 20 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20   .    /* Always 
ea30: 75 70 64 61 74 65 20 74 68 65 20 74 69 6d 65 73  update the times
ea40: 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20  tamp on the old 
ea50: 66 69 6c 65 20 2a 2f 0a 20 20 20 20 75 74 69 6d  file */.    utim
ea60: 65 73 28 63 6f 6e 74 65 78 74 2d 3e 6c 6f 63 6b  es(context->lock
ea70: 50 61 74 68 2c 4e 55 4c 4c 29 3b 0a 20 20 20 20  Path,NULL);.    
ea80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ea90: 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 63 68  ;.  }.  .  /* ch
eaa0: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 6c 6f  eck to see if lo
eab0: 63 6b 20 66 69 6c 65 20 61 6c 72 65 61 64 79 20  ck file already 
eac0: 65 78 69 73 74 73 20 2a 2f 0a 20 20 73 74 72 75  exists */.  stru
ead0: 63 74 20 73 74 61 74 20 73 74 61 74 42 75 66 3b  ct stat statBuf;
eae0: 0a 20 20 69 66 20 28 6c 73 74 61 74 28 63 6f 6e  .  if (lstat(con
eaf0: 74 65 78 74 2d 3e 6c 6f 63 6b 50 61 74 68 2c 26  text->lockPath,&
eb00: 73 74 61 74 42 75 66 29 20 3d 3d 20 30 29 7b 0a  statBuf) == 0){.
eb10: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
eb20: 45 5f 42 55 53 59 3b 20 2f 2a 20 69 74 20 64 6f  E_BUSY; /* it do
eb30: 65 73 2c 20 62 75 73 79 20 2a 2f 0a 20 20 7d 0a  es, busy */.  }.
eb40: 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20    .  /* grab an 
eb50: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a  exclusive lock *
eb60: 2f 0a 20 20 69 6e 74 20 66 64 20 3d 20 6f 70 65  /.  int fd = ope
eb70: 6e 28 63 6f 6e 74 65 78 74 2d 3e 6c 6f 63 6b 50  n(context->lockP
eb80: 61 74 68 2c 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 43  ath,O_RDONLY|O_C
eb90: 52 45 41 54 7c 4f 5f 45 58 43 4c 2c 30 36 30 30  REAT|O_EXCL,0600
eba0: 29 3b 0a 20 20 69 66 20 28 66 64 20 3c 20 30 29  );.  if (fd < 0)
ebb0: 20 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65 64   {.    /* failed
ebc0: 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20   to open/create 
ebd0: 74 68 65 20 66 69 6c 65 2c 20 73 6f 6d 65 6f 6e  the file, someon
ebe0: 65 20 65 6c 73 65 20 6d 61 79 20 68 61 76 65 20  e else may have 
ebf0: 73 74 6f 6c 65 6e 20 74 68 65 20 6c 6f 63 6b 20  stolen the lock 
ec00: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
ec10: 4c 49 54 45 5f 42 55 53 59 3b 20 0a 20 20 7d 0a  LITE_BUSY; .  }.
ec20: 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 0a    close(fd);.  .
ec30: 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
ec40: 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
ec50: 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69  turn ok */.  pFi
ec60: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c  le->locktype = l
ec70: 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72  ocktype;.  retur
ec80: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
ec90: 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
eca0: 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c  ckUnixUnlock(sql
ecb0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
ecc0: 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20  nt locktype) {. 
ecd0: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
ece0: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
ecf0: 3b 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69  ;.  dotlockLocki
ed00: 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  ngContext *conte
ed10: 78 74 20 3d 20 0a 20 20 20 20 28 64 6f 74 6c 6f  xt = .    (dotlo
ed20: 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ckLockingContext
ed30: 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
ed40: 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20  ngContext;.  .  
ed50: 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
ed60: 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
ed70: 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69  .  .  /* no-op i
ed80: 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20  f possible */.  
ed90: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
eda0: 79 70 65 3d 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ype==locktype ){
edb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
edc0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
edd0: 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75  /* shared can ju
ede0: 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73  st be set becaus
edf0: 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65  e we always have
ee00: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f   an exclusive */
ee10: 0a 20 20 69 66 20 28 6c 6f 63 6b 74 79 70 65 3d  .  if (locktype=
ee20: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a  =SHARED_LOCK) {.
ee30: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
ee40: 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
ee50: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ee60: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
ee70: 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e  * no, really, un
ee80: 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 75 6e 6c 69 6e  lock. */.  unlin
ee90: 6b 28 63 6f 6e 74 65 78 74 2d 3e 6c 6f 63 6b 50  k(context->lockP
eea0: 61 74 68 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 6c  ath);.  pFile->l
eeb0: 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43  ocktype = NO_LOC
eec0: 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  K;.  return SQLI
eed0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a  TE_OK;.}../*. **
eee0: 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20   Close a file.. 
eef0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
ef00: 74 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73 65 28 73  tlockUnixClose(s
ef10: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
ef20: 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
ef30: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
ef40: 2a 29 69 64 3b 0a 20 20 0a 20 20 69 66 28 20 21  *)id;.  .  if( !
ef50: 70 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53  pFile ) return S
ef60: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 64 6f 74 6c  QLITE_OK;.  dotl
ef70: 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b 28 2a 70  ockUnixUnlock(*p
ef80: 49 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  Id, NO_LOCK);.  
ef90: 2f 2a 20 66 72 65 65 20 74 68 65 20 64 6f 74 6c  /* free the dotl
efa0: 6f 63 6b 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  ock locking stru
efb0: 63 74 75 72 65 20 2a 2f 0a 20 20 69 66 20 28 70  cture */.  if (p
efc0: 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
efd0: 74 65 78 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  text != NULL) {.
efe0: 20 20 20 20 69 66 20 28 28 28 64 6f 74 6c 6f 63      if (((dotloc
eff0: 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  kLockingContext 
f000: 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
f010: 43 6f 6e 74 65 78 74 29 2d 3e 6c 6f 63 6b 50 61  Context)->lockPa
f020: 74 68 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20  th != NULL).    
f030: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 20    sqlite3_free( 
f040: 28 20 28 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  ( (dotlockLockin
f050: 67 43 6f 6e 74 65 78 74 20 2a 29 0a 20 20 20 20  gContext *).    
f060: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69      pFile->locki
f070: 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 6c 6f 63 6b  ngContext)->lock
f080: 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  Path);.    sqlit
f090: 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c  e3_free(pFile->l
f0a0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a  ockingContext);.
f0b0: 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 70 46 69    }.  .  if( pFi
f0c0: 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29 20 63  le->dirfd>=0 ) c
f0d0: 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72 66  lose(pFile->dirf
f0e0: 64 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 64 69 72  d);.  pFile->dir
f0f0: 66 64 20 3d 20 2d 31 3b 0a 20 20 65 6e 74 65 72  fd = -1;.  enter
f100: 4d 75 74 65 78 28 29 3b 0a 20 20 0a 20 20 63 6c  Mutex();.  .  cl
f110: 6f 73 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20  ose(pFile->h);. 
f120: 20 0a 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29   .  leaveMutex()
f130: 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22 43 4c  ;.  OSTRACE2("CL
f140: 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70  OSE   %-3d\n", p
f150: 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e  File->h);.  Open
f160: 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 72  Counter(-1);.  r
f170: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f180: 0a 7d 0a 0a 0a 23 70 72 61 67 6d 61 20 6d 61 72  .}...#pragma mar
f190: 6b 20 4e 6f 20 6c 6f 63 6b 69 6e 67 0a 0a 2f 2a  k No locking../*
f1a0: 0a 20 2a 2a 20 54 68 65 20 6e 6f 6c 6f 63 6b 4c  . ** The nolockL
f1b0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 69 73  ockingContext is
f1c0: 20 76 6f 69 64 0a 20 2a 2f 0a 74 79 70 65 64 65   void. */.typede
f1d0: 66 20 76 6f 69 64 20 6e 6f 6c 6f 63 6b 4c 6f 63  f void nolockLoc
f1e0: 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 73 74  kingContext;..st
f1f0: 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55  atic int nolockU
f200: 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
f210: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
f220: 65 20 2a 69 64 29 20 7b 0a 20 20 72 65 74 75 72  e *id) {.  retur
f230: 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  n 0;.}..static i
f240: 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 69 78 4c 6f 63  nt nolockUnixLoc
f250: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
f260: 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
f270: 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ) {.  return SQL
f280: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69  ITE_OK;.}..stati
f290: 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 69 78  c int nolockUnix
f2a0: 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
f2b0: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
f2c0: 6b 74 79 70 65 29 20 7b 0a 20 20 72 65 74 75 72  ktype) {.  retur
f2d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
f2e0: 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66  /*. ** Close a f
f2f0: 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ile.. */.static 
f300: 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 69 78 43 6c  int nolockUnixCl
f310: 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
f320: 20 2a 69 64 29 20 7b 0a 20 20 75 6e 69 78 46 69   *id) {.  unixFi
f330: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
f340: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20  xFile*)id;.  .  
f350: 69 66 28 20 21 70 46 69 6c 65 20 29 20 72 65 74  if( !pFile ) ret
f360: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
f370: 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72 66   if( pFile->dirf
f380: 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28 70 46 69  d>=0 ) close(pFi
f390: 6c 65 2d 3e 64 69 72 66 64 29 3b 0a 20 20 70 46  le->dirfd);.  pF
f3a0: 69 6c 65 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b  ile->dirfd = -1;
f3b0: 0a 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29 3b  .  enterMutex();
f3c0: 0a 20 20 0a 20 20 63 6c 6f 73 65 28 70 46 69 6c  .  .  close(pFil
f3d0: 65 2d 3e 68 29 3b 0a 20 20 0a 20 20 6c 65 61 76  e->h);.  .  leav
f3e0: 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
f3f0: 41 43 45 32 28 22 43 4c 4f 53 45 20 20 20 25 2d  ACE2("CLOSE   %-
f400: 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  3d\n", pFile->h)
f410: 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28  ;.  OpenCounter(
f420: 2d 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  -1);.  return SQ
f430: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64  LITE_OK;.}..#end
f440: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
f450: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
f460: 45 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66  E */.../*.** Inf
f470: 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e  ormation and con
f480: 74 72 6f 6c 20 6f 66 20 61 6e 20 6f 70 65 6e 20  trol of an open 
f490: 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  file handle..*/.
f4a0: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46  static int unixF
f4b0: 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74  ileControl(sqlit
f4c0: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
f4d0: 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29   op, void *pArg)
f4e0: 7b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  {.  switch( op )
f4f0: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
f500: 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54  E_FCNTL_LOCKSTAT
f510: 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  E: {.      *(int
f520: 2a 29 70 41 72 67 20 3d 20 28 28 75 6e 69 78 46  *)pArg = ((unixF
f530: 69 6c 65 2a 29 69 64 29 2d 3e 6c 6f 63 6b 74 79  ile*)id)->lockty
f540: 70 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  pe;.      return
f550: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
f560: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
f570: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  QLITE_ERROR;.}..
f580: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
f590: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20   sector size in 
f5a0: 62 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64  bytes of the und
f5b0: 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65  erlying block de
f5c0: 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20  vice for.** the 
f5d0: 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20  specified file. 
f5e0: 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61  This is almost a
f5f0: 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c  lways 512 bytes,
f600: 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c   but may be.** l
f610: 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64  arger for some d
f620: 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51  evices..**.** SQ
f630: 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65  Lite code assume
f640: 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
f650: 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20  cannot fail. It 
f660: 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61  also assumes tha
f670: 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65  t.** if two file
f680: 73 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e  s are created in
f690: 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73   the same file-s
f6a0: 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20  ystem directory 
f6b0: 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62  (i.e..** a datab
f6c0: 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72  ase and its jour
f6d0: 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74  nal file) that t
f6e0: 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77  he sector size w
f6f0: 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61  ill be the.** sa
f700: 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a  me for both..*/.
f710: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
f720: 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65  ectorSize(sqlite
f730: 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 72  3_file *id){.  r
f740: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46  eturn SQLITE_DEF
f750: 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
f760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
f770: 6e 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61  n the device cha
f780: 72 61 63 74 65 72 69 73 74 69 63 73 20 66 6f 72  racteristics for
f790: 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20   the file. This 
f7a0: 69 73 20 61 6c 77 61 79 73 20 30 2e 0a 2a 2f 0a  is always 0..*/.
f7b0: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44  static int unixD
f7c0: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
f7d0: 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  tics(sqlite3_fil
f7e0: 65 20 2a 69 64 29 7b 0a 20 20 72 65 74 75 72 6e  e *id){.  return
f7f0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
f800: 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73  s vector defines
f810: 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73   all the methods
f820: 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74   that can operat
f830: 65 20 6f 6e 20 61 6e 20 73 71 6c 69 74 65 33 5f  e on an sqlite3_
f840: 66 69 6c 65 0a 2a 2a 20 66 6f 72 20 75 6e 69 78  file.** for unix
f850: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
f860: 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
f870: 68 6f 64 73 20 73 71 6c 69 74 65 33 55 6e 69 78  hods sqlite3Unix
f880: 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20 31  IoMethod = {.  1
f890: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f8a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
f8b0: 73 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78 43 6c  sion */.  unixCl
f8c0: 6f 73 65 2c 0a 20 20 75 6e 69 78 52 65 61 64 2c  ose,.  unixRead,
f8d0: 0a 20 20 75 6e 69 78 57 72 69 74 65 2c 0a 20 20  .  unixWrite,.  
f8e0: 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 0a 20 20  unixTruncate,.  
f8f0: 75 6e 69 78 53 79 6e 63 2c 0a 20 20 75 6e 69 78  unixSync,.  unix
f900: 46 69 6c 65 53 69 7a 65 2c 0a 20 20 75 6e 69 78  FileSize,.  unix
f910: 4c 6f 63 6b 2c 0a 20 20 75 6e 69 78 55 6e 6c 6f  Lock,.  unixUnlo
f920: 63 6b 2c 0a 20 20 75 6e 69 78 43 68 65 63 6b 52  ck,.  unixCheckR
f930: 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 20 20 75  eservedLock,.  u
f940: 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 0a  nixFileControl,.
f950: 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65    unixSectorSize
f960: 2c 0a 20 20 75 6e 69 78 44 65 76 69 63 65 43 68  ,.  unixDeviceCh
f970: 61 72 61 63 74 65 72 69 73 74 69 63 73 0a 7d 3b  aracteristics.};
f980: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
f990: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
f9a0: 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  TYLE./*.** This 
f9b0: 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61  vector defines a
f9c0: 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74  ll the methods t
f9d0: 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20  hat can operate 
f9e0: 6f 6e 20 61 6e 20 73 71 6c 69 74 65 33 5f 66 69  on an sqlite3_fi
f9f0: 6c 65 0a 2a 2a 20 66 6f 72 20 75 6e 69 78 20 77  le.** for unix w
fa00: 69 74 68 20 41 46 50 20 73 74 79 6c 65 20 66 69  ith AFP style fi
fa10: 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  le locking..*/.s
fa20: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
fa30: 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 73  te3_io_methods s
fa40: 71 6c 69 74 65 33 41 46 50 4c 6f 63 6b 69 6e 67  qlite3AFPLocking
fa50: 55 6e 69 78 49 6f 4d 65 74 68 6f 64 20 3d 20 7b  UnixIoMethod = {
fa60: 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
fa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fa80: 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 75 6e  iVersion */.  un
fa90: 69 78 43 6c 6f 73 65 2c 0a 20 20 75 6e 69 78 52  ixClose,.  unixR
faa0: 65 61 64 2c 0a 20 20 75 6e 69 78 57 72 69 74 65  ead,.  unixWrite
fab0: 2c 0a 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65  ,.  unixTruncate
fac0: 2c 0a 20 20 75 6e 69 78 53 79 6e 63 2c 0a 20 20  ,.  unixSync,.  
fad0: 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 0a 20 20  unixFileSize,.  
fae0: 61 66 70 55 6e 69 78 4c 6f 63 6b 2c 0a 20 20 61  afpUnixLock,.  a
faf0: 66 70 55 6e 69 78 55 6e 6c 6f 63 6b 2c 0a 20 20  fpUnixUnlock,.  
fb00: 61 66 70 55 6e 69 78 43 68 65 63 6b 52 65 73 65  afpUnixCheckRese
fb10: 72 76 65 64 4c 6f 63 6b 2c 0a 20 20 75 6e 69 78  rvedLock,.  unix
fb20: 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 0a 20 20 75  FileControl,.  u
fb30: 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 0a 20  nixSectorSize,. 
fb40: 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61   unixDeviceChara
fb50: 63 74 65 72 69 73 74 69 63 73 0a 7d 3b 0a 0a 2f  cteristics.};../
fb60: 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72  *.** This vector
fb70: 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65   defines all the
fb80: 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63 61   methods that ca
fb90: 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 20  n operate on an 
fba0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20  sqlite3_file.** 
fbb0: 66 6f 72 20 75 6e 69 78 20 77 69 74 68 20 66 6c  for unix with fl
fbc0: 6f 63 6b 28 29 20 73 74 79 6c 65 20 66 69 6c 65  ock() style file
fbd0: 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61   locking..*/.sta
fbe0: 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
fbf0: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 73 71 6c  3_io_methods sql
fc00: 69 74 65 33 46 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  ite3FlockLocking
fc10: 55 6e 69 78 49 6f 4d 65 74 68 6f 64 20 3d 20 7b  UnixIoMethod = {
fc20: 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
fc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fc40: 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 66 6c  iVersion */.  fl
fc50: 6f 63 6b 55 6e 69 78 43 6c 6f 73 65 2c 0a 20 20  ockUnixClose,.  
fc60: 75 6e 69 78 52 65 61 64 2c 0a 20 20 75 6e 69 78  unixRead,.  unix
fc70: 57 72 69 74 65 2c 0a 20 20 75 6e 69 78 54 72 75  Write,.  unixTru
fc80: 6e 63 61 74 65 2c 0a 20 20 75 6e 69 78 53 79 6e  ncate,.  unixSyn
fc90: 63 2c 0a 20 20 75 6e 69 78 46 69 6c 65 53 69 7a  c,.  unixFileSiz
fca0: 65 2c 0a 20 20 66 6c 6f 63 6b 55 6e 69 78 4c 6f  e,.  flockUnixLo
fcb0: 63 6b 2c 0a 20 20 66 6c 6f 63 6b 55 6e 69 78 55  ck,.  flockUnixU
fcc0: 6e 6c 6f 63 6b 2c 0a 20 20 66 6c 6f 63 6b 55 6e  nlock,.  flockUn
fcd0: 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
fce0: 6f 63 6b 2c 0a 20 20 75 6e 69 78 46 69 6c 65 43  ock,.  unixFileC
fcf0: 6f 6e 74 72 6f 6c 2c 0a 20 20 75 6e 69 78 53 65  ontrol,.  unixSe
fd00: 63 74 6f 72 53 69 7a 65 2c 0a 20 20 75 6e 69 78  ctorSize,.  unix
fd10: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
fd20: 73 74 69 63 73 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  stics.};../*.** 
fd30: 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69  This vector defi
fd40: 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68  nes all the meth
fd50: 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65  ods that can ope
fd60: 72 61 74 65 20 6f 6e 20 61 6e 20 73 71 6c 69 74  rate on an sqlit
fd70: 65 33 5f 66 69 6c 65 0a 2a 2a 20 66 6f 72 20 75  e3_file.** for u
fd80: 6e 69 78 20 77 69 74 68 20 64 6f 74 6c 6f 63 6b  nix with dotlock
fd90: 20 73 74 79 6c 65 20 66 69 6c 65 20 6c 6f 63 6b   style file lock
fda0: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ing..*/.static c
fdb0: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
fdc0: 6d 65 74 68 6f 64 73 20 73 71 6c 69 74 65 33 44  methods sqlite3D
fdd0: 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 55 6e 69  otlockLockingUni
fde0: 78 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20  xIoMethod = {.  
fdf0: 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
fe00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
fe10: 72 73 69 6f 6e 20 2a 2f 0a 20 20 64 6f 74 6c 6f  rsion */.  dotlo
fe20: 63 6b 55 6e 69 78 43 6c 6f 73 65 2c 0a 20 20 75  ckUnixClose,.  u
fe30: 6e 69 78 52 65 61 64 2c 0a 20 20 75 6e 69 78 57  nixRead,.  unixW
fe40: 72 69 74 65 2c 0a 20 20 75 6e 69 78 54 72 75 6e  rite,.  unixTrun
fe50: 63 61 74 65 2c 0a 20 20 75 6e 69 78 53 79 6e 63  cate,.  unixSync
fe60: 2c 0a 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65  ,.  unixFileSize
fe70: 2c 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 4c  ,.  dotlockUnixL
fe80: 6f 63 6b 2c 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e  ock,.  dotlockUn
fe90: 69 78 55 6e 6c 6f 63 6b 2c 0a 20 20 64 6f 74 6c  ixUnlock,.  dotl
fea0: 6f 63 6b 55 6e 69 78 43 68 65 63 6b 52 65 73 65  ockUnixCheckRese
feb0: 72 76 65 64 4c 6f 63 6b 2c 0a 20 20 75 6e 69 78  rvedLock,.  unix
fec0: 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 0a 20 20 75  FileControl,.  u
fed0: 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 0a 20  nixSectorSize,. 
fee0: 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61   unixDeviceChara
fef0: 63 74 65 72 69 73 74 69 63 73 0a 7d 3b 0a 0a 2f  cteristics.};../
ff00: 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72  *.** This vector
ff10: 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65   defines all the
ff20: 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63 61   methods that ca
ff30: 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 20  n operate on an 
ff40: 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20  sqlite3_file.** 
ff50: 66 6f 72 20 75 6e 69 78 20 77 69 74 68 20 64 6f  for unix with do
ff60: 74 6c 6f 63 6b 20 73 74 79 6c 65 20 66 69 6c 65  tlock style file
ff70: 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61   locking..*/.sta
ff80: 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
ff90: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 73 71 6c  3_io_methods sql
ffa0: 69 74 65 33 4e 6f 6c 6f 63 6b 4c 6f 63 6b 69 6e  ite3NolockLockin
ffb0: 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64 20 3d 20  gUnixIoMethod = 
ffc0: 7b 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  {.  1,          
ffd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ffe0: 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 6e   iVersion */.  n
fff0: 6f 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73 65 2c 0a  olockUnixClose,.
10000 20 20 75 6e 69 78 52 65 61 64 2c 0a 20 20 75 6e    unixRead,.  un
10010 69 78 57 72 69 74 65 2c 0a 20 20 75 6e 69 78 54  ixWrite,.  unixT
10020 72 75 6e 63 61 74 65 2c 0a 20 20 75 6e 69 78 53  runcate,.  unixS
10030 79 6e 63 2c 0a 20 20 75 6e 69 78 46 69 6c 65 53  ync,.  unixFileS
10040 69 7a 65 2c 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 69  ize,.  nolockUni
10050 78 4c 6f 63 6b 2c 0a 20 20 6e 6f 6c 6f 63 6b 55  xLock,.  nolockU
10060 6e 69 78 55 6e 6c 6f 63 6b 2c 0a 20 20 6e 6f 6c  nixUnlock,.  nol
10070 6f 63 6b 55 6e 69 78 43 68 65 63 6b 52 65 73 65  ockUnixCheckRese
10080 72 76 65 64 4c 6f 63 6b 2c 0a 20 20 75 6e 69 78  rvedLock,.  unix
10090 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 0a 20 20 75  FileControl,.  u
100a0 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 0a 20  nixSectorSize,. 
100b0 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61   unixDeviceChara
100c0 63 74 65 72 69 73 74 69 63 73 0a 7d 3b 0a 0a 23  cteristics.};..#
100d0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
100e0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
100f0 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  TYLE */../*.** A
10100 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
10110 6f 72 20 61 20 6e 65 77 20 75 6e 69 78 46 69 6c  or a new unixFil
10120 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
10130 20 74 68 61 74 20 75 6e 69 78 46 69 6c 65 2e 0a   that unixFile..
10140 2a 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74  ** Write a point
10150 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 75 6e  er to the new un
10160 69 78 46 69 6c 65 20 69 6e 74 6f 20 2a 70 49 64  ixFile into *pId
10170 2e 0a 2a 2a 20 49 66 20 77 65 20 72 75 6e 20 6f  ..** If we run o
10180 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2c 20 63 6c  ut of memory, cl
10190 6f 73 65 20 74 68 65 20 66 69 6c 65 20 61 6e 64  ose the file and
101a0 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
101b0 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
101c0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
101d0 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 57  G_STYLE./* .** W
101e0 68 65 6e 20 6c 6f 63 6b 69 6e 67 20 65 78 74 65  hen locking exte
101f0 6e 73 69 6f 6e 73 20 61 72 65 20 65 6e 61 62 6c  nsions are enabl
10200 65 64 2c 20 74 68 65 20 66 69 6c 65 70 61 74 68  ed, the filepath
10210 20 61 6e 64 20 6c 6f 63 6b 69 6e 67 20 73 74 79   and locking sty
10220 6c 65 20 0a 2a 2a 20 61 72 65 20 6e 65 65 64 65  le .** are neede
10230 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  d to determine t
10240 68 65 20 75 6e 69 78 46 69 6c 65 20 70 4d 65 74  he unixFile pMet
10250 68 6f 64 20 74 6f 20 75 73 65 20 66 6f 72 20 6c  hod to use for l
10260 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ocking operation
10270 73 2e 0a 2a 2a 20 54 68 65 20 6c 6f 63 6b 69 6e  s..** The lockin
10280 67 2d 73 74 79 6c 65 20 73 70 65 63 69 66 69 63  g-style specific
10290 20 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20   lockingContext 
102a0 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 69  data structure i
102b0 73 20 63 72 65 61 74 65 64 20 0a 2a 2a 20 61 6e  s created .** an
102c0 64 20 61 73 73 69 67 6e 65 64 20 68 65 72 65 20  d assigned here 
102d0 61 6c 73 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  also..*/.static 
102e0 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  int fillInUnixFi
102f0 6c 65 28 0a 20 20 69 6e 74 20 68 2c 20 20 20 20  le(.  int h,    
10300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10310 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72   Open file descr
10320 69 70 74 6f 72 20 6f 66 20 66 69 6c 65 20 62 65  iptor of file be
10330 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20  ing opened */.  
10340 69 6e 74 20 64 69 72 66 64 2c 20 20 20 20 20 20  int dirfd,      
10350 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63          /* Direc
10360 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69  tory file descri
10370 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ptor */.  sqlite
10380 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20  3_file *pId,    
10390 20 20 2f 2a 20 57 72 69 74 65 20 63 6f 6d 70 6c    /* Write compl
103a0 65 74 65 64 20 69 6e 69 74 69 61 6c 69 7a 61 74  eted initializat
103b0 69 6f 6e 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ion here */.  co
103c0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
103d0 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
103e0 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20   the file being 
103f0 6f 70 65 6e 65 64 20 2a 2f 0a 29 7b 0a 20 20 73  opened */.){.  s
10400 71 6c 69 74 65 33 4c 6f 63 6b 69 6e 67 53 74 79  qlite3LockingSty
10410 6c 65 20 6c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b  le lockingStyle;
10420 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
10430 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  w = (unixFile *)
10440 70 49 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  pId;.  int rc;..
10450 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30    memset(pNew, 0
10460 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  , sizeof(unixFil
10470 65 29 29 3b 0a 20 20 6c 6f 63 6b 69 6e 67 53 74  e));.  lockingSt
10480 79 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 65 74  yle = sqlite3Det
10490 65 63 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28  ectLockingStyle(
104a0 7a 46 69 6c 65 6e 61 6d 65 2c 20 68 29 3b 0a 20  zFilename, h);. 
104b0 20 69 66 20 28 20 6c 6f 63 6b 69 6e 67 53 74 79   if ( lockingSty
104c0 6c 65 20 3d 3d 20 70 6f 73 69 78 4c 6f 63 6b 69  le == posixLocki
104d0 6e 67 53 74 79 6c 65 20 29 20 7b 0a 20 20 20 20  ngStyle ) {.    
104e0 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  enterMutex();.  
104f0 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49    rc = findLockI
10500 6e 66 6f 28 68 2c 20 26 70 4e 65 77 2d 3e 70 4c  nfo(h, &pNew->pL
10510 6f 63 6b 2c 20 26 70 4e 65 77 2d 3e 70 4f 70 65  ock, &pNew->pOpe
10520 6e 29 3b 0a 20 20 20 20 6c 65 61 76 65 4d 75 74  n);.    leaveMut
10530 65 78 28 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ex();.    if( rc
10540 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28   ){.      close(
10550 68 29 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b  h);.      unlink
10560 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (zFilename);.   
10570 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10580 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
10590 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20  } else {.    /* 
105a0 20 70 4c 6f 63 6b 20 61 6e 64 20 70 4f 70 65 6e   pLock and pOpen
105b0 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66   are only used f
105c0 6f 72 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72  or posix advisor
105d0 79 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20  y locking */.   
105e0 20 70 4e 65 77 2d 3e 70 4c 6f 63 6b 20 3d 20 4e   pNew->pLock = N
105f0 55 4c 4c 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  ULL;.    pNew->p
10600 4f 70 65 6e 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  Open = NULL;.  }
10610 0a 20 20 70 4e 65 77 2d 3e 64 69 72 66 64 20 3d  .  pNew->dirfd =
10620 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d   -1;.  pNew->h =
10630 20 68 3b 0a 20 20 53 45 54 5f 54 48 52 45 41 44   h;.  SET_THREAD
10640 49 44 28 70 4e 65 77 29 3b 0a 20 20 70 4e 65 77  ID(pNew);.  pNew
10650 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
10660 63 28 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69  c( sizeof(unixFi
10670 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  le) );.  if( pNe
10680 77 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6c 6f 73  w==0 ){.    clos
10690 65 28 68 29 3b 0a 20 20 20 20 65 6e 74 65 72 4d  e(h);.    enterM
106a0 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 6c 65  utex();.    rele
106b0 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 4e 65 77  aseLockInfo(pNew
106c0 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 72 65  ->pLock);.    re
106d0 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 70 4e 65  leaseOpenCnt(pNe
106e0 77 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20 6c  w->pOpen);.    l
106f0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
10700 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
10710 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
10720 20 20 20 73 77 69 74 63 68 28 6c 6f 63 6b 69 6e     switch(lockin
10730 67 53 74 79 6c 65 29 20 7b 0a 20 20 20 20 20 20  gStyle) {.      
10740 63 61 73 65 20 61 66 70 4c 6f 63 6b 69 6e 67 53  case afpLockingS
10750 74 79 6c 65 3a 20 7b 0a 20 20 20 20 20 20 20 20  tyle: {.        
10760 2f 2a 20 61 66 70 20 6c 6f 63 6b 69 6e 67 20 75  /* afp locking u
10770 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
10780 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
10790 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a   be included in.
107a0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 61          ** the a
107b0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
107c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
107d0 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20  nFilename;.     
107e0 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64     pNew->pMethod
107f0 20 3d 20 26 73 71 6c 69 74 65 33 41 46 50 4c 6f   = &sqlite3AFPLo
10800 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f  ckingUnixIoMetho
10810 64 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  d;.        pNew-
10820 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  >lockingContext 
10830 3d 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  = .          sql
10840 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
10850 6f 66 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  of(afpLockingCon
10860 74 65 78 74 29 29 3b 0a 20 20 20 20 20 20 20 20  text));.        
10870 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73 74 72 6c  nFilename = strl
10880 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 3b  en(zFilename)+1;
10890 0a 20 20 20 20 20 20 20 20 28 28 61 66 70 4c 6f  .        ((afpLo
108a0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
108b0 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  New->lockingCont
108c0 65 78 74 29 2d 3e 66 69 6c 65 50 61 74 68 20 3d  ext)->filePath =
108d0 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
108e0 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65  te3_malloc(nFile
108f0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 6d  name);.        m
10900 65 6d 63 70 79 28 28 28 61 66 70 4c 6f 63 6b 69  emcpy(((afpLocki
10910 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 4e 65 77  ngContext *)pNew
10920 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
10930 29 2d 3e 66 69 6c 65 50 61 74 68 2c 20 0a 20 20  )->filePath, .  
10940 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 46 69               zFi
10950 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d  lename, nFilenam
10960 65 29 3b 0a 20 20 20 20 20 20 20 20 73 72 61 6e  e);.        sran
10970 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20 20 20 20  domdev();.      
10980 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
10990 0a 20 20 20 20 20 20 63 61 73 65 20 66 6c 6f 63  .      case floc
109a0 6b 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3a 0a 20  kLockingStyle:. 
109b0 20 20 20 20 20 20 20 2f 2a 20 66 6c 6f 63 6b 20         /* flock 
109c0 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 6e 27 74 20  locking doesn't 
109d0 6e 65 65 64 20 61 64 64 69 74 69 6f 6e 61 6c 20  need additional 
109e0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 69  lockingContext i
109f0 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
10a00 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74        pNew->pMet
10a10 68 6f 64 20 3d 20 26 73 71 6c 69 74 65 33 46 6c  hod = &sqlite3Fl
10a20 6f 63 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f  ockLockingUnixIo
10a30 4d 65 74 68 6f 64 3b 0a 20 20 20 20 20 20 20 20  Method;.        
10a40 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
10a50 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  e dotlockLocking
10a60 53 74 79 6c 65 3a 20 7b 0a 20 20 20 20 20 20 20  Style: {.       
10a70 20 2f 2a 20 64 6f 74 6c 6f 63 6b 20 6c 6f 63 6b   /* dotlock lock
10a80 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
10a90 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
10aa0 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65  ds to be include
10ab0 64 20 69 6e 0a 20 20 20 20 20 20 20 20 20 2a 2a  d in.         **
10ac0 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b   the dotlockLock
10ad0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ingContext */.  
10ae0 20 20 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e        int nFilen
10af0 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ame;.        pNe
10b00 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 73 71  w->pMethod = &sq
10b10 6c 69 74 65 33 44 6f 74 6c 6f 63 6b 4c 6f 63 6b  lite3DotlockLock
10b20 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b  ingUnixIoMethod;
10b30 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c  .        pNew->l
10b40 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
10b50 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 0a  sqlite3_malloc(.
10b60 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
10b70 28 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43  (dotlockLockingC
10b80 6f 6e 74 65 78 74 29 29 3b 0a 20 20 20 20 20 20  ontext));.      
10b90 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73 74    nFilename = st
10ba0 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20  rlen(zFilename) 
10bb0 2b 20 36 3b 0a 20 20 20 20 20 20 20 20 28 28 64  + 6;.        ((d
10bc0 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e  otlockLockingCon
10bd0 74 65 78 74 20 2a 29 70 4e 65 77 2d 3e 6c 6f 63  text *)pNew->loc
10be0 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 6c 6f  kingContext)->lo
10bf0 63 6b 50 61 74 68 20 3d 20 0a 20 20 20 20 20 20  ckPath = .      
10c00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 61        sqlite3_ma
10c10 6c 6c 6f 63 28 20 6e 46 69 6c 65 6e 61 6d 65 20  lloc( nFilename 
10c20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
10c30 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c  e3_snprintf(nFil
10c40 65 6e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20  ename, .        
10c50 20 20 20 20 20 20 20 20 28 28 64 6f 74 6c 6f 63          ((dotloc
10c60 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  kLockingContext 
10c70 2a 29 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43  *)pNew->lockingC
10c80 6f 6e 74 65 78 74 29 2d 3e 6c 6f 63 6b 50 61 74  ontext)->lockPat
10c90 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  h, .            
10ca0 20 20 20 20 22 25 73 2e 6c 6f 63 6b 22 2c 20 7a      "%s.lock", z
10cb0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
10cc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
10cd0 7d 0a 20 20 20 20 20 20 63 61 73 65 20 70 6f 73  }.      case pos
10ce0 69 78 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3a 0a  ixLockingStyle:.
10cf0 20 20 20 20 20 20 20 20 2f 2a 20 70 6f 73 69 78          /* posix
10d00 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 6e 27 74   locking doesn't
10d10 20 6e 65 65 64 20 61 64 64 69 74 69 6f 6e 61 6c   need additional
10d20 20 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20   lockingContext 
10d30 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
10d40 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65         pNew->pMe
10d50 74 68 6f 64 20 3d 20 26 73 71 6c 69 74 65 33 55  thod = &sqlite3U
10d60 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 20  nixIoMethod;.   
10d70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10d80 20 20 63 61 73 65 20 6e 6f 4c 6f 63 6b 69 6e 67    case noLocking
10d90 53 74 79 6c 65 3a 0a 20 20 20 20 20 20 63 61 73  Style:.      cas
10da0 65 20 75 6e 73 75 70 70 6f 72 74 65 64 4c 6f 63  e unsupportedLoc
10db0 6b 69 6e 67 53 74 79 6c 65 3a 0a 20 20 20 20 20  kingStyle:.     
10dc0 20 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20 20   default: .     
10dd0 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64     pNew->pMethod
10de0 20 3d 20 26 73 71 6c 69 74 65 33 4e 6f 6c 6f 63   = &sqlite3Noloc
10df0 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65  kLockingUnixIoMe
10e00 74 68 6f 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  thod;.    }.    
10e10 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b  OpenCounter(+1);
10e20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
10e30 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  TE_OK;.  }.}.#el
10e40 73 65 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  se /* SQLITE_ENA
10e50 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
10e60 45 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  E */.static int 
10e70 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 0a  fillInUnixFile(.
10e80 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20    int h,        
10e90 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
10ea0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
10eb0 20 6f 6e 20 66 69 6c 65 20 62 65 69 6e 67 20 6f   on file being o
10ec0 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64  pened */.  int d
10ed0 69 72 66 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f  irfd,.  sqlite3_
10ee0 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 2f  file *pId,     /
10ef0 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 75  * Write to the u
10f00 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
10f10 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  e here */.  cons
10f20 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
10f30 65 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  e  /* Name of th
10f40 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  e file being ope
10f50 6e 65 64 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78  ned */.){.  unix
10f60 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e  File *pNew = (un
10f70 69 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20  ixFile *)pId;.  
10f80 69 6e 74 20 72 63 3b 0a 0a 23 69 66 64 65 66 20  int rc;..#ifdef 
10f90 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20 66 63 6e  FD_CLOEXEC.  fcn
10fa0 74 6c 28 68 2c 20 46 5f 53 45 54 46 44 2c 20 66  tl(h, F_SETFD, f
10fb0 63 6e 74 6c 28 68 2c 20 46 5f 47 45 54 46 44 2c  cntl(h, F_GETFD,
10fc0 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43   0) | FD_CLOEXEC
10fd0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6e 74  );.#endif..  ent
10fe0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 72 63 20  erMutex();.  rc 
10ff0 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 68  = findLockInfo(h
11000 2c 20 26 70 4e 65 77 2d 3e 70 4c 6f 63 6b 2c 20  , &pNew->pLock, 
11010 26 70 4e 65 77 2d 3e 70 4f 70 65 6e 29 3b 0a 20  &pNew->pOpen);. 
11020 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20   leaveMutex();. 
11030 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69   if( rc ){.    i
11040 66 28 20 64 69 72 66 64 3e 3d 30 20 29 20 63 6c  f( dirfd>=0 ) cl
11050 6f 73 65 28 64 69 72 66 64 29 3b 0a 20 20 20 20  ose(dirfd);.    
11060 63 6c 6f 73 65 28 68 29 3b 0a 20 20 20 20 72 65  close(h);.    re
11070 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
11080 4d 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43  M;.  }..  OSTRAC
11090 45 33 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64  E3("OPEN    %-3d
110a0 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65   %s\n", h, zFile
110b0 6e 61 6d 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 64  name);.  pNew->d
110c0 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  irfd = -1;.  pNe
110d0 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e 65 77  w->h = h;.  pNew
110e0 2d 3e 64 69 72 66 64 20 3d 20 64 69 72 66 64 3b  ->dirfd = dirfd;
110f0 0a 20 20 53 45 54 5f 54 48 52 45 41 44 49 44 28  .  SET_THREADID(
11100 70 4e 65 77 29 3b 0a 0a 20 20 70 4e 65 77 2d 3e  pNew);..  pNew->
11110 70 4d 65 74 68 6f 64 20 3d 20 26 73 71 6c 69 74  pMethod = &sqlit
11120 65 33 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a  e3UnixIoMethod;.
11130 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31    OpenCounter(+1
11140 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
11150 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
11160 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
11170 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
11180 2f 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  /../*.** Open a 
11190 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
111a0 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  to the directory
111b0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c 65   containing file
111c0 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49   zFilename..** I
111d0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70  f successful, *p
111e0 46 64 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  Fd is set to the
111f0 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64 65 73   opened file des
11200 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20 53  criptor and.** S
11210 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
11220 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  rned. If an erro
11230 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68 65 72  r occurs, either
11240 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a   SQLITE_NOMEM.**
11250 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f   or SQLITE_CANTO
11260 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64 20  PEN is returned 
11270 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65 74 20  and *pFd is set 
11280 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65 64 0a  to an undefined.
11290 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  ** value..**.** 
112a0 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
112b0 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61  returned, the ca
112c0 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
112d0 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a  ble for closing.
112e0 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ** the file desc
112f0 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73 69 6e  riptor *pFd usin
11300 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74  g close()..*/.st
11310 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72  atic int openDir
11320 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61  ectory(const cha
11330 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e  r *zFilename, in
11340 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 69  t *pFd){.  int i
11350 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31  i;.  int fd = -1
11360 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e 61 6d  ;.  char zDirnam
11370 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  e[MAX_PATHNAME+1
11380 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
11390 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e  printf(MAX_PATHN
113a0 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22  AME, zDirname, "
113b0 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  %s", zFilename);
113c0 0a 20 20 66 6f 72 28 69 69 3d 73 74 72 6c 65 6e  .  for(ii=strlen
113d0 28 7a 44 69 72 6e 61 6d 65 29 3b 20 69 69 3e 3d  (zDirname); ii>=
113e0 30 20 26 26 20 7a 44 69 72 6e 61 6d 65 5b 69 69  0 && zDirname[ii
113f0 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20  ]!='/'; ii--);. 
11400 20 69 66 28 20 69 69 3e 30 20 29 7b 0a 20 20 20   if( ii>0 ){.   
11410 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 20 3d 20   zDirname[ii] = 
11420 27 5c 30 27 3b 0a 20 20 20 20 66 64 20 3d 20 6f  '\0';.    fd = o
11430 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f  pen(zDirname, O_
11440 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c  RDONLY|O_BINARY,
11450 20 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3e   0);.    if( fd>
11460 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 46 44 5f  =0 ){.#ifdef FD_
11470 43 4c 4f 45 58 45 43 0a 20 20 20 20 20 20 66 63  CLOEXEC.      fc
11480 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c  ntl(fd, F_SETFD,
11490 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54   fcntl(fd, F_GET
114a0 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45  FD, 0) | FD_CLOE
114b0 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  XEC);.#endif.   
114c0 20 20 20 4f 53 54 52 41 43 45 33 28 22 4f 50 45     OSTRACE3("OPE
114d0 4e 44 49 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c  NDIR %-3d %s\n",
114e0 20 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29 3b 0a   fd, zDirname);.
114f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 46 64      }.  }.  *pFd
11500 20 3d 20 66 64 3b 0a 20 20 72 65 74 75 72 6e 20   = fd;.  return 
11510 28 66 64 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b  (fd>=0?SQLITE_OK
11520 3a 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  :SQLITE_CANTOPEN
11530 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  );.}../*.** Open
11540 20 74 68 65 20 66 69 6c 65 20 7a 50 61 74 68 2e   the file zPath.
11550 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73  .** .** Previous
11560 6c 79 2c 20 74 68 65 20 53 51 4c 69 74 65 20 4f  ly, the SQLite O
11570 53 20 6c 61 79 65 72 20 75 73 65 64 20 74 68 72  S layer used thr
11580 65 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20  ee functions in 
11590 70 6c 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a  place of this.**
115a0 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20   one:.**.**     
115b0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
115c0 64 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20  dWrite();.**    
115d0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
115e0 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20  adOnly();.**    
115f0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78   sqlite3OsOpenEx
11600 63 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a  clusive();.**.**
11610 20 54 68 65 73 65 20 63 61 6c 6c 73 20 63 6f 72   These calls cor
11620 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66  respond to the f
11630 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61  ollowing combina
11640 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a  tions of flags:.
11650 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72  **.**     ReadWr
11660 69 74 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45  ite() ->     (RE
11670 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45  ADWRITE | CREATE
11680 29 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c  ).**     ReadOnl
11690 79 28 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41  y()  ->     (REA
116a0 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f  DONLY) .**     O
116b0 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d  penExclusive() -
116c0 3e 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43  > (READWRITE | C
116d0 52 45 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56  REATE | EXCLUSIV
116e0 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64  E).**.** The old
116f0 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29   OpenExclusive()
11700 20 61 63 63 65 70 74 65 64 20 61 20 62 6f 6f 6c   accepted a bool
11710 65 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20 22  ean argument - "
11720 64 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20  delFlag". If.** 
11730 74 72 75 65 2c 20 74 68 65 20 66 69 6c 65 20 77  true, the file w
11740 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  as configured to
11750 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   be automaticall
11760 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74  y deleted when t
11770 68 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c  he.** file handl
11780 65 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68  e closed. To ach
11790 69 65 76 65 20 74 68 65 20 73 61 6d 65 20 65 66  ieve the same ef
117a0 66 65 63 74 20 75 73 69 6e 67 20 74 68 69 73 20  fect using this 
117b0 6e 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63  new .** interfac
117c0 65 2c 20 61 64 64 20 74 68 65 20 44 45 4c 45 54  e, add the DELET
117d0 45 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f  EONCLOSE flag to
117e0 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64   those specified
117f0 20 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f   above for .** O
11800 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 2e 0a  penExclusive()..
11810 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
11820 69 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  ixOpen(.  sqlite
11830 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a 20 20  3_vfs *pVfs, .  
11840 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
11850 68 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  h, .  sqlite3_fi
11860 6c 65 20 2a 70 46 69 6c 65 2c 0a 20 20 69 6e 74  le *pFile,.  int
11870 20 66 6c 61 67 73 2c 0a 20 20 69 6e 74 20 2a 70   flags,.  int *p
11880 4f 75 74 46 6c 61 67 73 0a 29 7b 0a 20 20 69 6e  OutFlags.){.  in
11890 74 20 66 64 20 3d 20 30 3b 20 20 20 20 20 20 20  t fd = 0;       
118a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
118b0 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
118c0 72 65 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e  returned by open
118d0 28 29 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66  () */.  int dirf
118e0 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  d = -1;         
118f0 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74         /* Direct
11900 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  ory file descrip
11910 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 6c  tor */.  int ofl
11920 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ags = 0;        
11930 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
11940 20 74 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e   to pass to open
11950 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70  () */.  int eTyp
11960 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46  e = flags&0xFFFF
11970 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f  FF00;  /* Type o
11980 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  f file to open *
11990 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75  /..  int isExclu
119a0 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26  sive  = (flags &
119b0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
119c0 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69  LUSIVE);.  int i
119d0 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66  sDelete     = (f
119e0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
119f0 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
11a00 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74  );.  int isCreat
11a10 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26  e     = (flags &
11a20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
11a30 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65  ATE);.  int isRe
11a40 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67  adonly   = (flag
11a50 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
11a60 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74  READONLY);.  int
11a70 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d 20   isReadWrite  = 
11a80 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
11a90 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b  OPEN_READWRITE);
11aa0 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69  ..  /* If creati
11ab0 6e 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d  ng a master or m
11ac0 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c  ain-file journal
11ad0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
11ae0 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61  will open.  ** a
11af0 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
11b00 20 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72   on the director
11b10 79 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74  y too. The first
11b20 20 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29   time unixSync()
11b30 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  .  ** is called 
11b40 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69  the directory fi
11b50 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69  le descriptor wi
11b60 6c 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64 20  ll be fsync()ed 
11b70 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20  and close()d..  
11b80 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 44  */.  int isOpenD
11b90 69 72 65 63 74 6f 72 79 20 3d 20 28 69 73 43 72  irectory = (isCr
11ba0 65 61 74 65 20 26 26 20 0a 20 20 20 20 20 20 28  eate && .      (
11bb0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
11bc0 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
11bd0 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  L || eType==SQLI
11be0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
11bf0 52 4e 41 4c 29 0a 20 20 29 3b 0a 0a 20 20 2f 2a  RNAL).  );..  /*
11c00 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f   Check the follo
11c10 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
11c20 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a  are true: .  **.
11c30 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74    **   (a) Exact
11c40 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45  ly one of the RE
11c50 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44  ADWRITE and READ
11c60 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20  ONLY flags must 
11c70 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a  be set, and .  *
11c80 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54  *   (b) if CREAT
11c90 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52  E is set, then R
11ca0 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c  EADWRITE must al
11cb0 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20  so be set, and. 
11cc0 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43   **   (c) if EXC
11cd0 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74  LUSIVE is set, t
11ce0 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
11cf0 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
11d00 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54  *   (d) if DELET
11d10 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c  EONCLOSE is set,
11d20 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
11d30 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
11d40 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73   */.  assert((is
11d50 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69  Readonly==0 || i
11d60 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26  sReadWrite==0) &
11d70 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c  & (isReadWrite |
11d80 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a  | isReadonly));.
11d90 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74    assert(isCreat
11da0 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  e==0 || isReadWr
11db0 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ite);.  assert(i
11dc0 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c  sExclusive==0 ||
11dd0 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73   isCreate);.  as
11de0 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30  sert(isDelete==0
11df0 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a   || isCreate);..
11e00 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44  .  /* The main D
11e10 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c  B, main journal,
11e20 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72   and master jour
11e30 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 61 75  nal are never au
11e40 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a  tomatically.  **
11e50 20 64 65 6c 65 74 65 64 0a 20 20 2a 2f 0a 20 20   deleted.  */.  
11e60 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 53  assert( eType!=S
11e70 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
11e80 44 42 20 7c 7c 20 21 69 73 44 65 6c 65 74 65 20  DB || !isDelete 
11e90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  );.  assert( eTy
11ea0 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
11eb0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20  MAIN_JOURNAL || 
11ec0 21 69 73 44 65 6c 65 74 65 20 29 3b 0a 20 20 61  !isDelete );.  a
11ed0 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 53 51  ssert( eType!=SQ
11ee0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
11ef0 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 21 69 73 44  _JOURNAL || !isD
11f00 65 6c 65 74 65 20 29 3b 0a 0a 20 20 2f 2a 20 41  elete );..  /* A
11f10 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 75  ssert that the u
11f20 70 70 65 72 20 6c 61 79 65 72 20 68 61 73 20 73  pper layer has s
11f30 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66  et one of the "f
11f40 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e  ile-type" flags.
11f50 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54   */.  assert( eT
11f60 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
11f70 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c  _MAIN_DB      ||
11f80 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
11f90 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20  PEN_TEMP_DB .   
11fa0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
11fb0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
11fc0 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d  OURNAL || eType=
11fd0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  =SQLITE_OPEN_TEM
11fe0 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  P_JOURNAL .     
11ff0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
12000 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
12010 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53  AL   || eType==S
12020 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
12030 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  R_JOURNAL .     
12040 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
12050 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e  TE_OPEN_TRANSIEN
12060 54 5f 44 42 0a 20 20 29 3b 0a 0a 20 20 69 66 28  T_DB.  );..  if(
12070 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f   isReadonly )  o
12080 66 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c  flags |= O_RDONL
12090 59 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 57  Y;.  if( isReadW
120a0 72 69 74 65 20 29 20 6f 66 6c 61 67 73 20 7c 3d  rite ) oflags |=
120b0 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66 28 20 69   O_RDWR;.  if( i
120c0 73 43 72 65 61 74 65 20 29 20 20 20 20 6f 66 6c  sCreate )    ofl
120d0 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a  ags |= O_CREAT;.
120e0 20 20 69 66 28 20 69 73 45 78 63 6c 75 73 69 76    if( isExclusiv
120f0 65 20 29 20 6f 66 6c 61 67 73 20 7c 3d 20 28 4f  e ) oflags |= (O
12100 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57  _EXCL|O_NOFOLLOW
12110 29 3b 0a 20 20 6f 66 6c 61 67 73 20 7c 3d 20 28  );.  oflags |= (
12120 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49  O_LARGEFILE|O_BI
12130 4e 41 52 59 29 3b 0a 0a 20 20 6d 65 6d 73 65 74  NARY);..  memset
12140 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f  (pFile, 0, sizeo
12150 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20  f(unixFile));.  
12160 66 64 20 3d 20 6f 70 65 6e 28 7a 50 61 74 68 2c  fd = open(zPath,
12170 20 6f 66 6c 61 67 73 2c 20 69 73 44 65 6c 65 74   oflags, isDelet
12180 65 3f 30 36 30 30 3a 53 51 4c 49 54 45 5f 44 45  e?0600:SQLITE_DE
12190 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
121a0 53 53 49 4f 4e 53 29 3b 0a 20 20 69 66 28 20 66  SSIONS);.  if( f
121b0 64 3c 30 20 26 26 20 65 72 72 6e 6f 21 3d 45 49  d<0 && errno!=EI
121c0 53 44 49 52 20 26 26 20 69 73 52 65 61 64 57 72  SDIR && isReadWr
121d0 69 74 65 20 26 26 20 21 69 73 45 78 63 6c 75 73  ite && !isExclus
121e0 69 76 65 20 29 7b 0a 20 20 20 20 2f 2a 20 46 61  ive ){.    /* Fa
121f0 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65  iled to open the
12200 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2f 77   file for read/w
12210 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 72 79  rite access. Try
12220 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20   read-only. */. 
12230 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51     flags &= ~(SQ
12240 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
12250 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
12260 43 52 45 41 54 45 29 3b 0a 20 20 20 20 66 6c 61  CREATE);.    fla
12270 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
12280 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  N_READONLY;.    
12290 72 65 74 75 72 6e 20 75 6e 69 78 4f 70 65 6e 28  return unixOpen(
122a0 70 56 66 73 2c 20 7a 50 61 74 68 2c 20 70 46 69  pVfs, zPath, pFi
122b0 6c 65 2c 20 66 6c 61 67 73 2c 20 70 4f 75 74 46  le, flags, pOutF
122c0 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  lags);.  }.  if(
122d0 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 72 65 74   fd<0 ){.    ret
122e0 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
122f0 50 45 4e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  PEN;.  }.  if( i
12300 73 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 75  sDelete ){.    u
12310 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3b 0a 20 20  nlink(zPath);.  
12320 7d 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67  }.  if( pOutFlag
12330 73 20 29 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c  s ){.    *pOutFl
12340 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d  ags = flags;.  }
12350 0a 0a 20 20 61 73 73 65 72 74 28 66 64 21 3d 30  ..  assert(fd!=0
12360 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 44  );.  if( isOpenD
12370 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20  irectory ){.    
12380 69 6e 74 20 72 63 20 3d 20 6f 70 65 6e 44 69 72  int rc = openDir
12390 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 64  ectory(zPath, &d
123a0 69 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72  irfd);.    if( r
123b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
123c0 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b        close(fd);
123d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
123e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
123f0 74 75 72 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46  turn fillInUnixF
12400 69 6c 65 28 66 64 2c 20 64 69 72 66 64 2c 20 70  ile(fd, dirfd, p
12410 46 69 6c 65 2c 20 7a 50 61 74 68 29 3b 0a 7d 0a  File, zPath);.}.
12420 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
12430 65 20 66 69 6c 65 20 61 74 20 7a 50 61 74 68 2e  e file at zPath.
12440 20 49 66 20 74 68 65 20 64 69 72 53 79 6e 63 20   If the dirSync 
12450 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65  argument is true
12460 2c 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65  , fsync().** the
12470 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72   directory after
12480 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69   deleting the fi
12490 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
124a0 74 20 75 6e 69 78 44 65 6c 65 74 65 28 73 71 6c  t unixDelete(sql
124b0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
124c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
124d0 68 2c 20 69 6e 74 20 64 69 72 53 79 6e 63 29 7b  h, int dirSync){
124e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
124f0 54 45 5f 4f 4b 3b 0a 20 20 53 69 6d 75 6c 61 74  TE_OK;.  Simulat
12500 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
12510 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
12520 45 54 45 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28 7a  ETE);.  unlink(z
12530 50 61 74 68 29 3b 0a 20 20 69 66 28 20 64 69 72  Path);.  if( dir
12540 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 6e 74 20  Sync ){.    int 
12550 66 64 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65  fd;.    rc = ope
12560 6e 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68  nDirectory(zPath
12570 2c 20 26 66 64 29 3b 0a 20 20 20 20 69 66 28 20  , &fd);.    if( 
12580 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
12590 0a 20 20 20 20 20 20 69 66 28 20 66 73 79 6e 63  .      if( fsync
125a0 28 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (fd) ){.        
125b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
125c0 52 5f 44 49 52 5f 46 53 59 4e 43 3b 0a 20 20 20  R_DIR_FSYNC;.   
125d0 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 6f 73 65     }.      close
125e0 28 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (fd);.    }.  }.
125f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12600 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 65  /*.** Test the e
12610 78 69 73 74 61 6e 63 65 20 6f 66 20 6f 72 20 61  xistance of or a
12620 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e  ccess permission
12630 73 20 6f 66 20 66 69 6c 65 20 7a 50 61 74 68 2e  s of file zPath.
12640 20 54 68 65 0a 2a 2a 20 74 65 73 74 20 70 65 72   The.** test per
12650 66 6f 72 6d 65 64 20 64 65 70 65 6e 64 73 20 6f  formed depends o
12660 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 66  n the value of f
12670 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lags:.**.**     
12680 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
12690 49 53 54 53 3a 20 52 65 74 75 72 6e 20 31 20 69  ISTS: Return 1 i
126a0 66 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74  f the file exist
126b0 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  s.**     SQLITE_
126c0 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
126d0 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  : Return 1 if th
126e0 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 20 61  e file is read a
126f0 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2a 20  nd writable..** 
12700 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53      SQLITE_ACCES
12710 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74 75  S_READONLY: Retu
12720 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65  rn 1 if the file
12730 20 69 73 20 72 65 61 64 61 62 6c 65 2e 0a 2a 2a   is readable..**
12740 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 72 65  .** Otherwise re
12750 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
12760 63 20 69 6e 74 20 75 6e 69 78 41 63 63 65 73 73  c int unixAccess
12770 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
12780 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  fs, const char *
12790 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c 61 67 73  zPath, int flags
127a0 29 7b 0a 20 20 69 6e 74 20 61 6d 6f 64 65 20 3d  ){.  int amode =
127b0 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c   0;.  switch( fl
127c0 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ags ){.    case 
127d0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
127e0 49 53 54 53 3a 0a 20 20 20 20 20 20 61 6d 6f 64  ISTS:.      amod
127f0 65 20 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20 20 20  e = F_OK;.      
12800 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
12810 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
12820 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20 61  ADWRITE:.      a
12830 6d 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b  mode = W_OK|R_OK
12840 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
12850 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
12860 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20  CCESS_READ:.    
12870 20 20 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b 0a    amode = R_OK;.
12880 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
12890 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
128a0 20 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69   assert(!"Invali
128b0 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74  d flags argument
128c0 22 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ");.  }.  return
128d0 20 28 61 63 63 65 73 73 28 7a 50 61 74 68 2c 20   (access(zPath, 
128e0 61 6d 6f 64 65 29 3d 3d 30 29 3b 0a 7d 0a 0a 2f  amode)==0);.}../
128f0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65  *.** Create a te
12900 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  mporary file nam
12910 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66  e in zBuf.  zBuf
12920 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74   must be allocat
12930 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  ed.** by the cal
12940 6c 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64  ling process and
12950 20 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f   must be big eno
12960 75 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c  ugh to hold at l
12970 65 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78  east.** pVfs->mx
12980 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a  Pathname bytes..
12990 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
129a0 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 73 71  ixGetTempname(sq
129b0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
129c0 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
129d0 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63  *zBuf){.  static
129e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44   const char *azD
129f0 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30  irs[] = {.     0
12a00 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70  ,.     "/var/tmp
12a10 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f 74 6d  ",.     "/usr/tm
12a20 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c  p",.     "/tmp",
12a30 0a 20 20 20 20 20 22 2e 22 2c 0a 20 20 7d 3b 0a  .     ".",.  };.
12a40 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
12a50 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 43 68  nsigned char zCh
12a60 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63  ars[] =.    "abc
12a70 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
12a80 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42  tuvwxyz".    "AB
12a90 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
12aa0 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30  STUVWXYZ".    "0
12ab0 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 69 6e  123456789";.  in
12ac0 74 20 69 2c 20 6a 3b 0a 20 20 73 74 72 75 63 74  t i, j;.  struct
12ad0 20 73 74 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e   stat buf;.  con
12ae0 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20  st char *zDir = 
12af0 22 2e 22 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20  ".";..  /* It's 
12b00 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
12b10 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
12b20 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
12b30 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
12b40 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
12b50 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
12b60 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
12b70 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
12b80 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
12b90 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20  failing. .  */. 
12ba0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
12bb0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
12bc0 45 52 52 4f 52 20 29 3b 0a 0a 20 20 61 7a 44 69  ERROR );..  azDi
12bd0 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f  rs[0] = sqlite3_
12be0 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a  temp_directory;.
12bf0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
12c00 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65  eof(azDirs)/size
12c10 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 69  of(azDirs[0]); i
12c20 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 7a 44  ++){.    if( azD
12c30 69 72 73 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74  irs[i]==0 ) cont
12c40 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 74  inue;.    if( st
12c50 61 74 28 61 7a 44 69 72 73 5b 69 5d 2c 20 26 62  at(azDirs[i], &b
12c60 75 66 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  uf) ) continue;.
12c70 20 20 20 20 69 66 28 20 21 53 5f 49 53 44 49 52      if( !S_ISDIR
12c80 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20  (buf.st_mode) ) 
12c90 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
12ca0 28 20 61 63 63 65 73 73 28 61 7a 44 69 72 73 5b  ( access(azDirs[
12cb0 69 5d 2c 20 30 37 29 20 29 20 63 6f 6e 74 69 6e  i], 07) ) contin
12cc0 75 65 3b 0a 20 20 20 20 7a 44 69 72 20 3d 20 61  ue;.    zDir = a
12cd0 7a 44 69 72 73 5b 69 5d 3b 0a 20 20 20 20 62 72  zDirs[i];.    br
12ce0 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  eak;.  }.  if( s
12cf0 74 72 6c 65 6e 28 7a 44 69 72 29 20 2d 20 73 69  trlen(zDir) - si
12d00 7a 65 6f 66 28 53 51 4c 49 54 45 5f 54 45 4d 50  zeof(SQLITE_TEMP
12d10 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 20 2d 20  _FILE_PREFIX) - 
12d20 31 37 20 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65  17 <=0 ){.    re
12d30 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
12d40 52 3b 0a 20 20 7d 0a 20 20 64 6f 7b 0a 20 20 20  R;.  }.  do{.   
12d50 20 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e 6d   assert( pVfs->m
12d60 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50  xPathname==MAX_P
12d70 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20 20 20 73  ATHNAME );.    s
12d80 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
12d90 6e 42 75 66 2d 31 37 2c 20 7a 42 75 66 2c 20 22  nBuf-17, zBuf, "
12da0 25 73 2f 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f  %s/"SQLITE_TEMP_
12db0 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a 44 69  FILE_PREFIX, zDi
12dc0 72 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c  r);.    j = strl
12dd0 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71  en(zBuf);.    sq
12de0 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28  lite3Randomness(
12df0 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20  15, &zBuf[j]);. 
12e00 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35     for(i=0; i<15
12e10 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
12e20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68     zBuf[j] = (ch
12e30 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73  ar)zChars[ ((uns
12e40 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b  igned char)zBuf[
12e50 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61  j])%(sizeof(zCha
12e60 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a  rs)-1) ];.    }.
12e70 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b      zBuf[j] = 0;
12e80 0a 20 20 7d 77 68 69 6c 65 28 20 61 63 63 65 73  .  }while( acces
12e90 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a  s(zBuf,0)==0 );.
12ea0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12eb0 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75  OK;.}.../*.** Tu
12ec0 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  rn a relative pa
12ed0 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75  thname into a fu
12ee0 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65  ll pathname. The
12ef0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 0a 2a   relative path.*
12f00 2a 20 69 73 20 73 74 6f 72 65 64 20 61 73 20 61  * is stored as a
12f10 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
12f20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20 62 75  string in the bu
12f30 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
12f40 62 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a  by.** zPath. .**
12f50 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20  .** zOut points 
12f60 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61  to a buffer of a
12f70 74 20 6c 65 61 73 74 20 73 71 6c 69 74 65 33 5f  t least sqlite3_
12f80 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62  vfs.mxPathname b
12f90 79 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69  ytes .** (in thi
12fa0 73 20 63 61 73 65 2c 20 4d 41 58 5f 50 41 54 48  s case, MAX_PATH
12fb0 4e 41 4d 45 20 62 79 74 65 73 29 2e 20 54 68 65  NAME bytes). The
12fc0 20 66 75 6c 6c 2d 70 61 74 68 20 69 73 20 77 72   full-path is wr
12fd0 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73  itten to.** this
12fe0 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 72   buffer before r
12ff0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
13000 74 69 63 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c  tic int unixFull
13010 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69  Pathname(.  sqli
13020 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
13030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
13040 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65  nter to vfs obje
13050 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ct */.  const ch
13060 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
13070 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
13080 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74  y relative input
13090 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e   path */.  int n
130a0 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  Out,            
130b0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
130c0 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65   of output buffe
130d0 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  r in bytes */.  
130e0 63 68 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20  char *zOut      
130f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13100 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   Output buffer *
13110 2f 0a 29 7b 0a 0a 20 20 2f 2a 20 49 74 27 73 20  /.){..  /* It's 
13120 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
13130 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
13140 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
13150 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
13160 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
13170 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
13180 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
13190 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
131a0 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
131b0 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75  failing. This fu
131c0 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69  nction could fai
131d0 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c  l if, for exampl
131e0 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  e, the.  ** curr
131f0 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65  ent working dire
13200 63 74 6c 79 20 68 61 73 20 62 65 65 6e 20 75 6e  ctly has been un
13210 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53  linked..  */.  S
13220 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
13230 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
13240 52 4f 52 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ROR );..  assert
13250 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ( pVfs->mxPathna
13260 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45  me==MAX_PATHNAME
13270 20 29 3b 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74 2d   );.  zOut[nOut-
13280 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 69 66 28  1] = '\0';.  if(
13290 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20 29   zPath[0]=='/' )
132a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
132b0 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f 75  printf(nOut, zOu
132c0 74 2c 20 22 25 73 22 2c 20 7a 50 61 74 68 29 3b  t, "%s", zPath);
132d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
132e0 74 20 6e 43 77 64 3b 0a 20 20 20 20 69 66 28 20  t nCwd;.    if( 
132f0 67 65 74 63 77 64 28 7a 4f 75 74 2c 20 6e 4f 75  getcwd(zOut, nOu
13300 74 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  t-1)==0 ){.     
13310 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
13320 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 0a 20  ANTOPEN;.    }. 
13330 20 20 20 6e 43 77 64 20 3d 20 73 74 72 6c 65 6e     nCwd = strlen
13340 28 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69  (zOut);.    sqli
13350 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75  te3_snprintf(nOu
13360 74 2d 6e 43 77 64 2c 20 26 7a 4f 75 74 5b 6e 43  t-nCwd, &zOut[nC
13370 77 64 5d 2c 20 22 2f 25 73 22 2c 20 7a 50 61 74  wd], "/%s", zPat
13380 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  h);.  }.  return
13390 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66   SQLITE_OK;..#if
133a0 20 30 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 6d   0.  /*.  ** Rem
133b0 6f 76 65 20 22 2f 2e 2f 22 20 70 61 74 68 20 65  ove "/./" path e
133c0 6c 65 6d 65 6e 74 73 20 61 6e 64 20 63 6f 6e 76  lements and conv
133d0 65 72 74 20 22 2f 41 2f 2e 2f 22 20 70 61 74 68  ert "/A/./" path
133e0 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 74   elements.  ** t
133f0 6f 20 6a 75 73 74 20 22 2f 22 2e 0a 20 20 2a 2f  o just "/"..  */
13400 0a 20 20 69 66 28 20 7a 46 75 6c 6c 20 29 7b 0a  .  if( zFull ){.
13410 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
13420 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 46 75    for(i=j=0; zFu
13430 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ll[i]; i++){.   
13440 20 20 20 69 66 28 20 7a 46 75 6c 6c 5b 69 5d 3d     if( zFull[i]=
13450 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='/' ){.        
13460 69 66 28 20 7a 46 75 6c 6c 5b 69 2b 31 5d 3d 3d  if( zFull[i+1]==
13470 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  '/' ) continue;.
13480 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c          if( zFul
13490 6c 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 7a  l[i+1]=='.' && z
134a0 46 75 6c 6c 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29  Full[i+2]=='/' )
134b0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d  {.          i +=
134c0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   1;.          co
134d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
134e0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46  }.        if( zF
134f0 75 6c 6c 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26  ull[i+1]=='.' &&
13500 20 7a 46 75 6c 6c 5b 69 2b 32 5d 3d 3d 27 2e 27   zFull[i+2]=='.'
13510 20 26 26 20 7a 46 75 6c 6c 5b 69 2b 33 5d 3d 3d   && zFull[i+3]==
13520 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  '/' ){.         
13530 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a   while( j>0 && z
13540 46 75 6c 6c 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29  Full[j-1]!='/' )
13550 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20  { j--; }.       
13560 20 20 20 69 20 2b 3d 20 33 3b 0a 20 20 20 20 20     i += 3;.     
13570 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
13580 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13590 0a 20 20 20 20 20 20 7a 46 75 6c 6c 5b 6a 2b 2b  .      zFull[j++
135a0 5d 20 3d 20 7a 46 75 6c 6c 5b 69 5d 3b 0a 20 20  ] = zFull[i];.  
135b0 20 20 7d 0a 20 20 20 20 7a 46 75 6c 6c 5b 6a 5d    }.    zFull[j]
135c0 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
135d0 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
135e0 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
135f0 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e  TENSION./*.** In
13600 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65  terfaces for ope
13610 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69  ning a shared li
13620 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65  brary, finding e
13630 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77  ntry points.** w
13640 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64  ithin the shared
13650 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c   library, and cl
13660 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  osing the shared
13670 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e   library..*/.#in
13680 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a  clude <dlfcn.h>.
13690 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e 69  static void *uni
136a0 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f  xDlOpen(sqlite3_
136b0 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74  vfs *pVfs, const
136c0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
136d0 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f 70  ){.  return dlop
136e0 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54  en(zFilename, RT
136f0 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c  LD_NOW | RTLD_GL
13700 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  OBAL);.}../*.** 
13710 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69  SQLite calls thi
13720 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64  s function immed
13730 69 61 74 65 6c 79 20 61 66 74 65 72 20 61 20 63  iately after a c
13740 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d  all to unixDlSym
13750 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f  () or.** unixDlO
13760 70 65 6e 28 29 20 66 61 69 6c 73 20 28 72 65 74  pen() fails (ret
13770 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  urns a null poin
13780 74 65 72 29 2e 20 49 66 20 61 20 6d 6f 72 65 20  ter). If a more 
13790 64 65 74 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a  detailed error.*
137a0 2a 20 6d 65 73 73 61 67 65 20 69 73 20 61 76 61  * message is ava
137b0 69 6c 61 62 6c 65 2c 20 69 74 20 69 73 20 77 72  ilable, it is wr
137c0 69 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74  itten to zBufOut
137d0 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65  . If no error me
137e0 73 73 61 67 65 0a 2a 2a 20 69 73 20 61 76 61 69  ssage.** is avai
137f0 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69  lable, zBufOut i
13800 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65  s left unmodifie
13810 64 20 61 6e 64 20 53 51 4c 69 74 65 20 75 73 65  d and SQLite use
13820 73 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65  s a default.** e
13830 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f  rror message..*/
13840 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
13850 78 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33  xDlError(sqlite3
13860 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
13870 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
13880 4f 75 74 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45  Out){.  char *zE
13890 72 72 3b 0a 20 20 65 6e 74 65 72 4d 75 74 65 78  rr;.  enterMutex
138a0 28 29 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65  ();.  zErr = dle
138b0 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a 45  rror();.  if( zE
138c0 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rr ){.    sqlite
138d0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c  3_snprintf(nBuf,
138e0 20 7a 42 75 66 4f 75 74 2c 20 22 25 73 22 2c 20   zBufOut, "%s", 
138f0 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20 6c 65 61  zErr);.  }.  lea
13900 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61  veMutex();.}.sta
13910 74 69 63 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c  tic void *unixDl
13920 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20  Sym(sqlite3_vfs 
13930 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61  *pVfs, void *pHa
13940 6e 64 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  ndle, const char
13950 20 2a 7a 53 79 6d 62 6f 6c 29 7b 0a 20 20 72 65   *zSymbol){.  re
13960 74 75 72 6e 20 64 6c 73 79 6d 28 70 48 61 6e 64  turn dlsym(pHand
13970 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a 7d 0a  le, zSymbol);.}.
13980 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
13990 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  DlClose(sqlite3_
139a0 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20  vfs *pVfs, void 
139b0 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 64 6c 63  *pHandle){.  dlc
139c0 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a 7d  lose(pHandle);.}
139d0 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c  .#else /* if SQL
139e0 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
139f0 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e  TENSION is defin
13a00 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ed: */.  #define
13a10 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a 20   unixDlOpen  0. 
13a20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 45   #define unixDlE
13a30 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65  rror 0.  #define
13a40 20 75 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a 20   unixDlSym   0. 
13a50 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 43   #define unixDlC
13a60 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  lose 0.#endif../
13a70 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75 66 20  *.** Write nBuf 
13a80 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20  bytes of random 
13a90 64 61 74 61 20 74 6f 20 74 68 65 20 73 75 70 70  data to the supp
13aa0 6c 69 65 64 20 62 75 66 66 65 72 20 7a 42 75 66  lied buffer zBuf
13ab0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13ac0 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28 73  unixRandomness(s
13ad0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
13ae0 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
13af0 20 2a 7a 42 75 66 29 7b 0a 0a 20 20 61 73 73 65   *zBuf){..  asse
13b00 72 74 28 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66  rt(nBuf>=(sizeof
13b10 28 74 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28  (time_t)+sizeof(
13b20 69 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65  int)));..  /* We
13b30 20 68 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c   have to initial
13b40 69 7a 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76  ize zBuf to prev
13b50 65 6e 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f  ent valgrind fro
13b60 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a  m reporting.  **
13b70 20 65 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65   errors.  The re
13b80 70 6f 72 74 73 20 69 73 73 75 65 64 20 62 79 20  ports issued by 
13b90 76 61 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63  valgrind are inc
13ba0 6f 72 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c  orrect - we woul
13bb0 64 0a 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68  d.  ** prefer th
13bc0 61 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73  at the randomnes
13bd0 73 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 62  s be increased b
13be0 79 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20  y making use of 
13bf0 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69  the.  ** uniniti
13c00 61 6c 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20  alized space in 
13c10 7a 42 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72  zBuf - but valgr
13c20 69 6e 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20  ind errors tend 
13c30 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f  to worry.  ** so
13c40 6d 65 20 75 73 65 72 73 2e 20 20 52 61 74 68 65  me users.  Rathe
13c50 72 20 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74  r than argue, it
13c60 20 73 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75   seems easier ju
13c70 73 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  st to initialize
13c80 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20  .  ** the whole 
13c90 61 72 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63  array and silenc
13ca0 65 20 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e  e valgrind, even
13cb0 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c   if that means l
13cc0 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20  ess randomness. 
13cd0 20 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f   ** in the rando
13ce0 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  m seed..  **.  *
13cf0 2a 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20  * When testing, 
13d00 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75  initializing zBu
13d10 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61  f[] to zero is a
13d20 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20  ll we do.  That 
13d30 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20  means.  ** that 
13d40 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  we always use th
13d50 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75  e same random nu
13d60 6d 62 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20  mber sequence.  
13d70 54 68 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20  This makes the. 
13d80 20 2a 2a 20 74 65 73 74 73 20 72 65 70 65 61 74   ** tests repeat
13d90 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  able..  */.  mem
13da0 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75  set(zBuf, 0, nBu
13db0 66 29 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64  f);.#if !defined
13dc0 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20  (SQLITE_TEST).  
13dd0 7b 0a 20 20 20 20 69 6e 74 20 70 69 64 2c 20 66  {.    int pid, f
13de0 64 3b 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e  d;.    fd = open
13df0 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c  ("/dev/urandom",
13e00 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20 20 20   O_RDONLY);.    
13e10 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
13e20 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20    time_t t;.    
13e30 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20    time(&t);.    
13e40 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 26    memcpy(zBuf, &
13e50 74 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20  t, sizeof(t));. 
13e60 20 20 20 20 20 70 69 64 20 3d 20 67 65 74 70 69       pid = getpi
13e70 64 28 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  d();.      memcp
13e80 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74  y(&zBuf[sizeof(t
13e90 29 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66  )], &pid, sizeof
13ea0 28 70 69 64 29 29 3b 0a 20 20 20 20 7d 65 6c 73  (pid));.    }els
13eb0 65 7b 0a 20 20 20 20 20 20 72 65 61 64 28 66 64  e{.      read(fd
13ec0 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20  , zBuf, nBuf);. 
13ed0 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a       close(fd);.
13ee0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
13ef0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13f00 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53  _OK;.}.../*.** S
13f10 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c  leep for a littl
13f20 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e  e while.  Return
13f30 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
13f40 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68  ime slept..** Th
13f50 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
13f60 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72  e number of micr
13f70 6f 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e 74  oseconds we want
13f80 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68   to sleep..** Th
13f90 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
13fa0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
13fb0 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20  microseconds of 
13fc0 73 6c 65 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a  sleep actually.*
13fd0 2a 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d  * requested from
13fe0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
13ff0 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
14000 2c 20 61 20 6e 75 6d 62 65 72 20 77 68 69 63 68  , a number which
14010 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 67 72 65  .** might be gre
14020 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
14030 61 6c 20 74 6f 20 74 68 65 20 61 72 67 75 6d 65  al to the argume
14040 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73 73  nt, but not less
14050 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 61 72 67  .** than the arg
14060 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
14070 20 69 6e 74 20 75 6e 69 78 53 6c 65 65 70 28 73   int unixSleep(s
14080 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
14090 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e  , int microsecon
140a0 64 73 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  ds){.#if defined
140b0 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26  (HAVE_USLEEP) &&
140c0 20 48 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75   HAVE_USLEEP.  u
140d0 73 6c 65 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e  sleep(microsecon
140e0 64 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69  ds);.  return mi
140f0 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73  croseconds;.#els
14100 65 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64 73 20  e.  int seconds 
14110 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b  = (microseconds+
14120 39 39 39 39 39 39 29 2f 31 30 30 30 30 30 30 3b  999999)/1000000;
14130 0a 20 20 73 6c 65 65 70 28 73 65 63 6f 6e 64 73  .  sleep(seconds
14140 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 65 63 6f  );.  return seco
14150 6e 64 73 2a 31 30 30 30 30 30 30 3b 0a 23 65 6e  nds*1000000;.#en
14160 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  dif.}../*.** The
14170 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
14180 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61  ble, if set to a
14190 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c   non-zero value,
141a0 20 62 65 63 6f 6d 65 73 20 74 68 65 20 72 65 73   becomes the res
141b0 75 6c 74 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  ult.** returned 
141c0 66 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73 43 75  from sqlite3OsCu
141d0 72 72 65 6e 74 54 69 6d 65 28 29 2e 20 20 54 68  rrentTime().  Th
141e0 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  is is used for t
141f0 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65  esting..*/.#ifde
14200 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
14210 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  t sqlite3_curren
14220 74 5f 74 69 6d 65 20 3d 20 30 3b 0a 23 65 6e 64  t_time = 0;.#end
14230 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  if../*.** Find t
14240 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
14250 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f  (in Universal Co
14260 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e  ordinated Time).
14270 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63    Write the.** c
14280 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20  urrent time and 
14290 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e  date as a Julian
142a0 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f   Day number into
142b0 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72   *prNow and.** r
142c0 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e  eturn 0.  Return
142d0 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61   1 if the time a
142e0 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62  nd date cannot b
142f0 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
14300 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65  ic int unixCurre
14310 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76  ntTime(sqlite3_v
14320 66 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65  fs *pVfs, double
14330 20 2a 70 72 4e 6f 77 29 7b 0a 23 69 66 64 65 66   *prNow){.#ifdef
14340 20 4e 4f 5f 47 45 54 54 4f 44 0a 20 20 74 69 6d   NO_GETTOD.  tim
14350 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28 26 74  e_t t;.  time(&t
14360 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 74 2f  );.  *prNow = t/
14370 38 36 34 30 30 2e 30 20 2b 20 32 34 34 30 35 38  86400.0 + 244058
14380 37 2e 35 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72  7.5;.#else.  str
14390 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77  uct timeval sNow
143a0 3b 0a 20 20 67 65 74 74 69 6d 65 6f 66 64 61 79  ;.  gettimeofday
143b0 28 26 73 4e 6f 77 2c 20 30 29 3b 0a 20 20 2a 70  (&sNow, 0);.  *p
143c0 72 4e 6f 77 20 3d 20 32 34 34 30 35 38 37 2e 35  rNow = 2440587.5
143d0 20 2b 20 73 4e 6f 77 2e 74 76 5f 73 65 63 2f 38   + sNow.tv_sec/8
143e0 36 34 30 30 2e 30 20 2b 20 73 4e 6f 77 2e 74 76  6400.0 + sNow.tv
143f0 5f 75 73 65 63 2f 38 36 34 30 30 30 30 30 30 30  _usec/8640000000
14400 30 2e 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  0.0;.#endif.#ifd
14410 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
14420 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72   if( sqlite3_cur
14430 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20  rent_time ){.   
14440 20 2a 70 72 4e 6f 77 20 3d 20 73 71 6c 69 74 65   *prNow = sqlite
14450 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 2f 38  3_current_time/8
14460 36 34 30 30 2e 30 20 2b 20 32 34 34 30 35 38 37  6400.0 + 2440587
14470 2e 35 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  .5;.  }.#endif. 
14480 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
14490 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
144a0 6e 74 65 72 20 74 6f 20 74 68 65 20 73 71 6c 69  nter to the sqli
144b0 74 65 33 44 65 66 61 75 6c 74 56 66 73 20 73 74  te3DefaultVfs st
144c0 72 75 63 74 75 72 65 2e 20 20 20 57 65 20 75 73  ructure.   We us
144d0 65 0a 2a 2a 20 61 20 66 75 6e 63 74 69 6f 6e 20  e.** a function 
144e0 72 61 74 68 65 72 20 74 68 61 6e 20 67 69 76 65  rather than give
144f0 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 67   the structure g
14500 6c 6f 62 61 6c 20 73 63 6f 70 65 20 62 65 63 61  lobal scope beca
14510 75 73 65 0a 2a 2a 20 73 6f 6d 65 20 63 6f 6d 70  use.** some comp
14520 69 6c 65 72 73 20 28 4d 53 56 43 29 20 64 6f 20  ilers (MSVC) do 
14530 6e 6f 74 20 61 6c 6c 6f 77 20 66 6f 72 77 61 72  not allow forwar
14540 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 6f  d declarations o
14550 66 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64  f.** initialized
14560 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a   structures..*/.
14570 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 73 71 6c  sqlite3_vfs *sql
14580 69 74 65 33 4f 73 44 65 66 61 75 6c 74 56 66 73  ite3OsDefaultVfs
14590 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
145a0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 75 6e 69   sqlite3_vfs uni
145b0 78 56 66 73 20 3d 20 7b 0a 20 20 20 20 31 2c 20  xVfs = {.    1, 
145c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145d0 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
145e0 20 20 20 20 73 69 7a 65 6f 66 28 75 6e 69 78 46      sizeof(unixF
145f0 69 6c 65 29 2c 20 20 20 2f 2a 20 73 7a 4f 73 46  ile),   /* szOsF
14600 69 6c 65 20 2a 2f 0a 20 20 20 20 4d 41 58 5f 50  ile */.    MAX_P
14610 41 54 48 4e 41 4d 45 2c 20 20 20 20 20 20 20 2f  ATHNAME,       /
14620 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  * mxPathname */.
14630 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
14640 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74          /* pNext
14650 20 2a 2f 0a 20 20 20 20 22 75 6e 69 78 22 2c 20   */.    "unix", 
14660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
14670 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20  Name */.    0,  
14680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14690 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20  /* pAppData */. 
146a0 20 0a 20 20 20 20 75 6e 69 78 4f 70 65 6e 2c 20   .    unixOpen, 
146b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70            /* xOp
146c0 65 6e 20 2a 2f 0a 20 20 20 20 75 6e 69 78 44 65  en */.    unixDe
146d0 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  lete,         /*
146e0 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20   xDelete */.    
146f0 75 6e 69 78 41 63 63 65 73 73 2c 20 20 20 20 20  unixAccess,     
14700 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a      /* xAccess *
14710 2f 0a 20 20 20 20 75 6e 69 78 47 65 74 54 65 6d  /.    unixGetTem
14720 70 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 78 47 65  pname,    /* xGe
14730 74 54 65 6d 70 4e 61 6d 65 20 2a 2f 0a 20 20 20  tTempName */.   
14740 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d   unixFullPathnam
14750 65 2c 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74  e,   /* xFullPat
14760 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 75 6e 69  hname */.    uni
14770 78 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  xDlOpen,        
14780 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20   /* xDlOpen */. 
14790 20 20 20 75 6e 69 78 44 6c 45 72 72 6f 72 2c 20     unixDlError, 
147a0 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72         /* xDlErr
147b0 6f 72 20 2a 2f 0a 20 20 20 20 75 6e 69 78 44 6c  or */.    unixDl
147c0 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Sym,          /*
147d0 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 75   xDlSym */.    u
147e0 6e 69 78 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20  nixDlClose,     
147f0 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a     /* xDlClose *
14800 2f 0a 20 20 20 20 75 6e 69 78 52 61 6e 64 6f 6d  /.    unixRandom
14810 6e 65 73 73 2c 20 20 20 20 20 2f 2a 20 78 52 61  ness,     /* xRa
14820 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20  ndomness */.    
14830 75 6e 69 78 53 6c 65 65 70 2c 20 20 20 20 20 20  unixSleep,      
14840 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f      /* xSleep */
14850 0a 20 20 20 20 75 6e 69 78 43 75 72 72 65 6e 74  .    unixCurrent
14860 54 69 6d 65 20 20 20 20 20 2f 2a 20 78 43 75 72  Time     /* xCur
14870 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 7d 3b  rentTime */.  };
14880 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 26 75 6e  .  .  return &un
14890 69 78 56 66 73 3b 0a 7d 0a 20 0a 23 65 6e 64 69  ixVfs;.}. .#endi
148a0 66 20 2f 2a 20 4f 53 5f 55 4e 49 58 20 2a 2f 0a  f /* OS_UNIX */.