/ Hex Artifact Content
Login

Artifact e556e86a2f027102e11f67b1b3a649fce1a8670b:


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 27 73 20 44  GPP.  But it's D
0e70: 4f 53 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f  OS - what did yo
0e80: 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66  u expect?.*/.#if
0e90: 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 23 20  def __DJGPP__.# 
0ea0: 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 41 2c 42  define fcntl(A,B
0eb0: 2c 43 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,C) 0.#endif../*
0ec0: 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64 69 64  .** The threadid
0ed0: 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65 73 20   macro resolves 
0ee0: 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d 69 64  to the thread-id
0ef0: 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65 64 20   or to 0.  Used 
0f00: 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  for.** testing a
0f10: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
0f20: 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  y..*/.#if SQLITE
0f30: 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64 65 66  _THREADSAFE.#def
0f40: 69 6e 65 20 74 68 72 65 61 64 69 64 20 70 74 68  ine threadid pth
0f50: 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65 6c 73  read_self().#els
0f60: 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61 64  e.#define thread
0f70: 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  id 0.#endif../*.
0f80: 2a 2a 20 53 65 74 20 6f 72 20 63 68 65 63 6b 20  ** Set or check 
0f90: 74 68 65 20 75 6e 69 78 46 69 6c 65 2e 74 69 64  the unixFile.tid
0fa0: 20 66 69 65 6c 64 2e 20 20 54 68 69 73 20 66 69   field.  This fi
0fb0: 65 6c 64 20 69 73 20 73 65 74 20 77 68 65 6e 20  eld is set when 
0fc0: 61 6e 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 69  an unixFile.** i
0fd0: 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20  s first opened. 
0fe0: 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   All subsequent 
0ff0: 75 73 65 73 20 6f 66 20 74 68 65 20 75 6e 69 78  uses of the unix
1000: 46 69 6c 65 20 76 65 72 69 66 79 20 74 68 61 74  File verify that
1010: 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 74 68 72   the.** same thr
1020: 65 61 64 20 69 73 20 6f 70 65 72 61 74 69 6e 67  ead is operating
1030: 20 6f 6e 20 74 68 65 20 75 6e 69 78 46 69 6c 65   on the unixFile
1040: 2e 20 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e  .  Some operatin
1050: 67 20 73 79 73 74 65 6d 73 20 64 6f 0a 2a 2a 20  g systems do.** 
1060: 6e 6f 74 20 61 6c 6c 6f 77 20 6c 6f 63 6b 73 20  not allow locks 
1070: 74 6f 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e  to be overridden
1080: 20 62 79 20 6f 74 68 65 72 20 74 68 72 65 61 64   by other thread
1090: 73 20 61 6e 64 20 74 68 61 74 20 72 65 73 74 72  s and that restr
10a0: 69 63 74 69 6f 6e 0a 2a 2a 20 6d 65 61 6e 73 20  iction.** means 
10b0: 74 68 61 74 20 73 71 6c 69 74 65 33 2a 20 64 61  that sqlite3* da
10c0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20 63  tabase handles c
10d0: 61 6e 6e 6f 74 20 62 65 20 6d 6f 76 65 64 20 66  annot be moved f
10e0: 72 6f 6d 20 6f 6e 65 20 74 68 72 65 61 64 0a 2a  rom one thread.*
10f0: 2a 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20 54  * to another.  T
1100: 68 69 73 20 6c 6f 67 69 63 20 6d 61 6b 65 73 20  his logic makes 
1110: 73 75 72 65 20 61 20 75 73 65 72 20 64 6f 65 73  sure a user does
1120: 20 6e 6f 74 20 74 72 79 20 74 6f 20 64 6f 20 74   not try to do t
1130: 68 61 74 0a 2a 2a 20 62 79 20 6d 69 73 74 61 6b  hat.** by mistak
1140: 65 2e 0a 2a 2a 0a 2a 2a 20 56 65 72 73 69 6f 6e  e..**.** Version
1150: 20 33 2e 33 2e 31 20 28 32 30 30 36 2d 30 31 2d   3.3.1 (2006-01-
1160: 31 35 29 3a 20 20 75 6e 69 78 46 69 6c 65 20 63  15):  unixFile c
1170: 61 6e 20 62 65 20 6d 6f 76 65 64 20 66 72 6f 6d  an be moved from
1180: 20 6f 6e 65 20 74 68 72 65 61 64 20 74 6f 0a 2a   one thread to.*
1190: 2a 20 61 6e 6f 74 68 65 72 20 61 73 20 6c 6f 6e  * another as lon
11a0: 67 20 61 73 20 77 65 20 61 72 65 20 72 75 6e 6e  g as we are runn
11b0: 69 6e 67 20 6f 6e 20 61 20 73 79 73 74 65 6d 20  ing on a system 
11c0: 74 68 61 74 20 73 75 70 70 6f 72 74 73 20 74 68  that supports th
11d0: 72 65 61 64 73 0a 2a 2a 20 6f 76 65 72 72 69 64  reads.** overrid
11e0: 69 6e 67 20 65 61 63 68 20 6f 74 68 65 72 73 20  ing each others 
11f0: 6c 6f 63 6b 73 20 28 77 68 69 63 68 20 6e 6f 77  locks (which now
1200: 20 74 68 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e   the most common
1210: 20 62 65 68 61 76 69 6f 72 29 0a 2a 2a 20 6f 72   behavior).** or
1220: 20 69 66 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65   if no locks are
1230: 20 68 65 6c 64 2e 20 20 42 75 74 20 74 68 65 20   held.  But the 
1240: 75 6e 69 78 46 69 6c 65 2e 70 4c 6f 63 6b 20 66  unixFile.pLock f
1250: 69 65 6c 64 20 6e 65 65 64 73 20 74 6f 20 62 65  ield needs to be
1260: 0a 2a 2a 20 72 65 63 6f 6d 70 75 74 65 64 20 62  .** recomputed b
1270: 65 63 61 75 73 65 20 69 74 73 20 6b 65 79 20 69  ecause its key i
1280: 6e 63 6c 75 64 65 73 20 74 68 65 20 74 68 72 65  ncludes the thre
1290: 61 64 2d 69 64 2e 20 20 53 65 65 20 74 68 65 20  ad-id.  See the 
12a0: 0a 2a 2a 20 74 72 61 6e 73 66 65 72 4f 77 6e 65  .** transferOwne
12b0: 72 73 68 69 70 28 29 20 66 75 6e 63 74 69 6f 6e  rship() function
12c0: 20 62 65 6c 6f 77 20 66 6f 72 20 61 64 64 69 74   below for addit
12d0: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
12e0: 6e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  n.*/.#if SQLITE_
12f0: 54 48 52 45 41 44 53 41 46 45 0a 23 20 64 65 66  THREADSAFE.# def
1300: 69 6e 65 20 53 45 54 5f 54 48 52 45 41 44 49 44  ine SET_THREADID
1310: 28 58 29 20 20 20 28 58 29 2d 3e 74 69 64 20 3d  (X)   (X)->tid =
1320: 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a   pthread_self().
1330: 23 20 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 54  # define CHECK_T
1340: 48 52 45 41 44 49 44 28 58 29 20 28 74 68 72 65  HREADID(X) (thre
1350: 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f  adsOverrideEachO
1360: 74 68 65 72 73 4c 6f 63 6b 73 3d 3d 30 20 26 26  thersLocks==0 &&
1370: 20 5c 0a 20 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 21                 !
1390: 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28 28 58  pthread_equal((X
13a0: 29 2d 3e 74 69 64 2c 20 70 74 68 72 65 61 64 5f  )->tid, pthread_
13b0: 73 65 6c 66 28 29 29 29 0a 23 65 6c 73 65 0a 23  self())).#else.#
13c0: 20 64 65 66 69 6e 65 20 53 45 54 5f 54 48 52 45   define SET_THRE
13d0: 41 44 49 44 28 58 29 0a 23 20 64 65 66 69 6e 65  ADID(X).# define
13e0: 20 43 48 45 43 4b 5f 54 48 52 45 41 44 49 44 28   CHECK_THREADID(
13f0: 58 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  X) 0.#endif../*.
1400: 2a 2a 20 48 65 72 65 20 69 73 20 74 68 65 20 64  ** Here is the d
1410: 69 72 74 20 6f 6e 20 50 4f 53 49 58 20 61 64 76  irt on POSIX adv
1420: 69 73 6f 72 79 20 6c 6f 63 6b 73 3a 20 20 41 4e  isory locks:  AN
1430: 53 49 20 53 54 44 20 31 30 30 33 2e 31 20 28 31  SI STD 1003.1 (1
1440: 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20  996).** section 
1450: 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38  6.5.2.2 lines 48
1460: 33 20 74 68 72 6f 75 67 68 20 34 39 30 20 73 70  3 through 490 sp
1470: 65 63 69 66 79 20 74 68 61 74 20 77 68 65 6e 20  ecify that when 
1480: 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74  a process.** set
1490: 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c 6f  s or clears a lo
14a0: 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74 69  ck, that operati
14b0: 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79  on overrides any
14c0: 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74   prior locks set
14d0: 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65 20  .** by the same 
14e0: 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f 65  process.  It doe
14f0: 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79  s not explicitly
1500: 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68 69   say so, but thi
1510: 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61  s implies.** tha
1520: 74 20 69 74 20 6f 76 65 72 72 69 64 65 73 20 6c  t it overrides l
1530: 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68 65 20  ocks set by the 
1540: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73 69  same process usi
1550: 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a  ng a different.*
1560: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
1570: 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69  r.  Consider thi
1580: 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a  s test case:.**.
1590: 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 31  **       int fd1
15a0: 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31   = open("./file1
15b0: 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41  ", O_RDWR|O_CREA
15c0: 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20  T, 0644);.**    
15d0: 20 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70 65     int fd2 = ope
15e0: 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52  n("./file2", O_R
15f0: 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34  DWR|O_CREAT, 064
1600: 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73  4);.**.** Suppos
1610: 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f  e ./file1 and ./
1620: 66 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c 79  file2 are really
1630: 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 28   the same file (
1640: 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69  because.** one i
1650: 73 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d 62  s a hard or symb
1660: 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65  olic link to the
1670: 20 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66 20   other) then if 
1680: 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78  you set.** an ex
1690: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20  clusive lock on 
16a0: 66 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74 6f  fd1, then try to
16b0: 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76   get an exclusiv
16c0: 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32  e lock.** on fd2
16d0: 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20 77  , it works.  I w
16e0: 6f 75 6c 64 20 68 61 76 65 20 65 78 70 65 63 74  ould have expect
16f0: 65 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f  ed the second lo
1700: 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69  ck to.** fail si
1710: 6e 63 65 20 74 68 65 72 65 20 77 61 73 20 61 6c  nce there was al
1720: 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20  ready a lock on 
1730: 74 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f 20  the file due to 
1740: 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20  fd1..** But not 
1750: 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68 20  so.  Since both 
1760: 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20  locks came from 
1770: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
1780: 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20  , the.** second 
1790: 6f 76 65 72 72 69 64 65 73 20 74 68 65 20 66 69  overrides the fi
17a0: 72 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  rst, even though
17b0: 20 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64 69   they were on di
17c0: 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20  fferent.** file 
17d0: 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e  descriptors open
17e0: 65 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 20  ed on different 
17f0: 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a  file names..**.*
1800: 2a 20 42 75 6d 6d 65 72 2e 20 20 49 66 20 79 6f  * Bummer.  If yo
1810: 75 20 61 73 6b 20 6d 65 2c 20 74 68 69 73 20 69  u ask me, this i
1820: 73 20 62 72 6f 6b 65 6e 2e 20 20 42 61 64 6c 79  s broken.  Badly
1830: 20 62 72 6f 6b 65 6e 2e 20 20 49 74 20 6d 65 61   broken.  It mea
1840: 6e 73 0a 2a 2a 20 74 68 61 74 20 77 65 20 63 61  ns.** that we ca
1850: 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49 58 20 6c  nnot use POSIX l
1860: 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e  ocks to synchron
1870: 69 7a 65 20 66 69 6c 65 20 61 63 63 65 73 73 20  ize file access 
1880: 61 6d 6f 6e 67 0a 2a 2a 20 63 6f 6d 70 65 74 69  among.** competi
1890: 6e 67 20 74 68 72 65 61 64 73 20 6f 66 20 74 68  ng threads of th
18a0: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20  e same process. 
18b0: 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c   POSIX locks wil
18c0: 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74  l work fine.** t
18d0: 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63  o synchronize ac
18e0: 63 65 73 73 20 66 6f 72 20 74 68 72 65 61 64 73  cess for threads
18f0: 20 69 6e 20 73 65 70 61 72 61 74 65 20 70 72 6f   in separate pro
1900: 63 65 73 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a  cesses, but not.
1910: 2a 2a 20 74 68 72 65 61 64 73 20 77 69 74 68 69  ** threads withi
1920: 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  n the same proce
1930: 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72  ss..**.** To wor
1940: 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 70 72 6f  k around the pro
1950: 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20 68 61 73  blem, SQLite has
1960: 20 74 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65 20   to manage file 
1970: 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79  locks internally
1980: 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20  .** on its own. 
1990: 20 57 68 65 6e 65 76 65 72 20 61 20 6e 65 77 20   Whenever a new 
19a0: 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
19b0: 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66  ed, we have to f
19c0: 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70 65 63 69  ind the.** speci
19d0: 66 69 63 20 69 6e 6f 64 65 20 6f 66 20 74 68 65  fic inode of the
19e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
19f0: 74 68 65 20 69 6e 6f 64 65 20 69 73 20 64 65 74  the inode is det
1a00: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 0a 2a  ermined by the.*
1a10: 2a 20 73 74 5f 64 65 76 20 61 6e 64 20 73 74 5f  * st_dev and st_
1a20: 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68  ino fields of th
1a30: 65 20 73 74 61 74 20 73 74 72 75 63 74 75 72 65  e stat structure
1a40: 20 74 68 61 74 20 66 73 74 61 74 28 29 20 66 69   that fstat() fi
1a50: 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63  lls in).** and c
1a60: 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61  heck for locks a
1a70: 6c 72 65 61 64 79 20 65 78 69 73 74 69 6e 67 20  lready existing 
1a80: 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65 2e 20 20  on that inode.  
1a90: 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a  When locks are.*
1aa0: 2a 20 63 72 65 61 74 65 64 20 6f 72 20 72 65 6d  * created or rem
1ab0: 6f 76 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f  oved, we have to
1ac0: 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e   look at our own
1ad0: 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64   internal record
1ae0: 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73   of the.** locks
1af0: 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68   to see if anoth
1b00: 65 72 20 74 68 72 65 61 64 20 68 61 73 20 70 72  er thread has pr
1b10: 65 76 69 6f 75 73 6c 79 20 73 65 74 20 61 20 6c  eviously set a l
1b20: 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d 65  ock on that same
1b30: 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a  .** inode..**.**
1b40: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   The sqlite3_fil
1b50: 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  e structure for 
1b60: 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67  POSIX is no long
1b70: 65 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65 67  er just an integ
1b80: 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72  er file.** descr
1b90: 69 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f  iptor.  It is no
1ba0: 77 20 61 20 73 74 72 75 63 74 75 72 65 20 74 68  w a structure th
1bb0: 61 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e 74  at holds the int
1bc0: 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73  eger file.** des
1bd0: 63 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70 6f  criptor and a po
1be0: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75 63  inter to a struc
1bf0: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
1c00: 62 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  bes the internal
1c10: 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  .** locks on the
1c20: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69   corresponding i
1c30: 6e 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73 20  node.  There is 
1c40: 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  one locking stru
1c50: 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f  cture.** per ino
1c60: 64 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73 61  de, so if the sa
1c70: 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e  me inode is open
1c80: 65 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20 75  ed twice, both u
1c90: 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
1ca0: 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74  es.** point to t
1cb0: 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20  he same locking 
1cc0: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
1cd0: 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
1ce0: 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65 66  e keeps.** a ref
1cf0: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f  erence count (so
1d00: 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68   we will know wh
1d10: 65 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74 29  en to delete it)
1d20: 20 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20   and a "cnt".** 
1d30: 66 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c 73  field that tells
1d40: 20 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61 6c   us its internal
1d50: 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20 63   lock status.  c
1d60: 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a  nt==0 means the.
1d70: 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  ** file is unloc
1d80: 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65  ked.  cnt==-1 me
1d90: 61 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61 73  ans the file has
1da0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
1db0: 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61  ck..** cnt>0 mea
1dc0: 6e 73 20 74 68 65 72 65 20 61 72 65 20 63 6e 74  ns there are cnt
1dd0: 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e   shared locks on
1de0: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
1df0: 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
1e00: 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61  lock or unlock a
1e10: 20 66 69 6c 65 20 66 69 72 73 74 20 63 68 65 63   file first chec
1e20: 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a  ks the locking.*
1e30: 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  * structure.  Th
1e40: 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d  e fcntl() system
1e50: 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e   call is only in
1e60: 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20 0a  voked to set a .
1e70: 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66  ** POSIX lock if
1e80: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f   the internal lo
1e90: 63 6b 20 73 74 72 75 63 74 75 72 65 20 74 72 61  ck structure tra
1ea0: 6e 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65 6e  nsitions between
1eb0: 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64  .** a locked and
1ec0: 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61   an unlocked sta
1ed0: 74 65 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 34 2d 4a  te..**.** 2004-J
1ee0: 61 6e 2d 31 31 3a 0a 2a 2a 20 4d 6f 72 65 20 72  an-11:.** More r
1ef0: 65 63 65 6e 74 20 64 69 73 63 6f 76 65 72 69 65  ecent discoverie
1f00: 73 20 61 62 6f 75 74 20 50 4f 53 49 58 20 61 64  s about POSIX ad
1f10: 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 20 20 28  visory locks.  (
1f20: 54 68 65 20 6d 6f 72 65 0a 2a 2a 20 49 20 64 69  The more.** I di
1f30: 73 63 6f 76 65 72 2c 20 74 68 65 20 6d 6f 72 65  scover, the more
1f40: 20 49 20 72 65 61 6c 69 7a 65 20 74 68 65 20 61   I realize the a
1f50: 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20   POSIX advisory 
1f60: 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 61 6e 20  locks are.** an 
1f70: 61 62 6f 6d 69 6e 61 74 69 6f 6e 2e 29 0a 2a 2a  abomination.).**
1f80: 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73 65  .** If you close
1f90: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
1fa0: 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74  or that points t
1fb0: 6f 20 61 20 66 69 6c 65 20 74 68 61 74 20 68 61  o a file that ha
1fc0: 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20  s locks,.** all 
1fd0: 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20 66 69  locks on that fi
1fe0: 6c 65 20 74 68 61 74 20 61 72 65 20 6f 77 6e 65  le that are owne
1ff0: 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74  d by the current
2000: 20 70 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20   process are.** 
2010: 72 65 6c 65 61 73 65 64 2e 20 20 54 6f 20 77 6f  released.  To wo
2020: 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70  rk around this p
2030: 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69  roblem, each uni
2040: 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20  xFile structure 
2050: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 70 6f  contains.** a po
2060: 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 65 6e  inter to an open
2070: 43 6e 74 20 73 74 72 75 63 74 75 72 65 2e 20 20  Cnt structure.  
2080: 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6f 70 65  There is one ope
2090: 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 0a 2a  nCnt structure.*
20a0: 2a 20 70 65 72 20 6f 70 65 6e 20 69 6e 6f 64 65  * per open inode
20b0: 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68  , which means th
20c0: 61 74 20 6d 75 6c 74 69 70 6c 65 20 75 6e 69 78  at multiple unix
20d0: 46 69 6c 65 20 63 61 6e 20 70 6f 69 6e 74 20 74  File can point t
20e0: 6f 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 6f 70  o a single.** op
20f0: 65 6e 43 6e 74 2e 20 20 57 68 65 6e 20 61 6e 20  enCnt.  When an 
2100: 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
2110: 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78  to close an unix
2120: 46 69 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61  File, if there a
2130: 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78  re.** other unix
2140: 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65  File open on the
2150: 20 73 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74   same inode that
2160: 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63   are holding loc
2170: 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20  ks, the call.** 
2180: 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66  to close() the f
2190: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
21a0: 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c  s deferred until
21b0: 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b   all of the lock
21c0: 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20  s clear..** The 
21d0: 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72  openCnt structur
21e0: 65 20 6b 65 65 70 73 20 61 20 6c 69 73 74 20 6f  e keeps a list o
21f0: 66 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  f file descripto
2200: 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a  rs that need to.
2210: 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64  ** be closed and
2220: 20 74 68 61 74 20 6c 69 73 74 20 69 73 20 77 61   that list is wa
2230: 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65 61 72 65  lked (and cleare
2240: 64 29 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  d) when the last
2250: 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e   lock.** clears.
2260: 0a 2a 2a 0a 2a 2a 20 46 69 72 73 74 2c 20 75 6e  .**.** First, un
2270: 64 65 72 20 4c 69 6e 75 78 20 74 68 72 65 61 64  der Linux thread
2280: 73 2c 20 62 65 63 61 75 73 65 20 65 61 63 68 20  s, because each 
2290: 74 68 72 65 61 64 20 68 61 73 20 61 20 73 65 70  thread has a sep
22a0: 61 72 61 74 65 0a 2a 2a 20 70 72 6f 63 65 73 73  arate.** process
22b0: 20 49 44 2c 20 6c 6f 63 6b 20 6f 70 65 72 61 74   ID, lock operat
22c0: 69 6f 6e 73 20 69 6e 20 6f 6e 65 20 74 68 72 65  ions in one thre
22d0: 61 64 20 64 6f 20 6e 6f 74 20 6f 76 65 72 72 69  ad do not overri
22e0: 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 74 6f 20 74  de locks.** to t
22f0: 68 65 20 73 61 6d 65 20 66 69 6c 65 20 69 6e 20  he same file in 
2300: 6f 74 68 65 72 20 74 68 72 65 61 64 73 2e 20 20  other threads.  
2310: 4c 69 6e 75 78 20 74 68 72 65 61 64 73 20 62 65  Linux threads be
2320: 68 61 76 65 20 6c 69 6b 65 0a 2a 2a 20 73 65 70  have like.** sep
2330: 61 72 61 74 65 20 70 72 6f 63 65 73 73 65 73 20  arate processes 
2340: 69 6e 20 74 68 69 73 20 72 65 73 70 65 63 74 2e  in this respect.
2350: 20 20 42 75 74 2c 20 69 66 20 79 6f 75 20 63 6c    But, if you cl
2360: 6f 73 65 20 61 20 66 69 6c 65 0a 2a 2a 20 64 65  ose a file.** de
2370: 73 63 72 69 70 74 6f 72 20 69 6e 20 6c 69 6e 75  scriptor in linu
2380: 78 20 74 68 72 65 61 64 73 2c 20 61 6c 6c 20 6c  x threads, all l
2390: 6f 63 6b 73 20 61 72 65 20 63 6c 65 61 72 65 64  ocks are cleared
23a0: 2c 20 65 76 65 6e 20 6c 6f 63 6b 73 0a 2a 2a 20  , even locks.** 
23b0: 6f 6e 20 6f 74 68 65 72 20 74 68 72 65 61 64 73  on other threads
23c0: 20 61 6e 64 20 65 76 65 6e 20 74 68 6f 75 67 68   and even though
23d0: 20 74 68 65 20 6f 74 68 65 72 20 74 68 72 65 61   the other threa
23e0: 64 73 20 68 61 76 65 20 64 69 66 66 65 72 65 6e  ds have differen
23f0: 74 0a 2a 2a 20 70 72 6f 63 65 73 73 20 49 44 73  t.** process IDs
2400: 2e 20 20 4c 69 6e 75 78 20 74 68 72 65 61 64 73  .  Linux threads
2410: 20 69 73 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   is inconsistent
2420: 20 69 6e 20 74 68 69 73 20 72 65 73 70 65 63 74   in this respect
2430: 2e 0a 2a 2a 20 28 49 27 6d 20 62 65 67 69 6e 6e  ..** (I'm beginn
2440: 69 6e 67 20 74 6f 20 74 68 69 6e 6b 20 74 68 61  ing to think tha
2450: 74 20 6c 69 6e 75 78 20 74 68 72 65 61 64 73 20  t linux threads 
2460: 69 73 20 61 6e 20 61 62 6f 6d 69 6e 61 74 69 6f  is an abominatio
2470: 6e 20 74 6f 6f 2e 29 0a 2a 2a 20 54 68 65 20 63  n too.).** The c
2480: 6f 6e 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68  onsequence of th
2490: 69 73 20 61 6c 6c 20 69 73 20 74 68 61 74 20 74  is all is that t
24a0: 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 66 6f  he hash table fo
24b0: 72 20 74 68 65 20 6c 6f 63 6b 49 6e 66 6f 0a 2a  r the lockInfo.*
24c0: 2a 20 73 74 72 75 63 74 75 72 65 20 68 61 73 20  * structure has 
24d0: 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 70  to include the p
24e0: 72 6f 63 65 73 73 20 69 64 20 61 73 20 70 61 72  rocess id as par
24f0: 74 20 6f 66 20 69 74 73 20 6b 65 79 20 62 65 63  t of its key bec
2500: 61 75 73 65 0a 2a 2a 20 6c 6f 63 6b 73 20 69 6e  ause.** locks in
2510: 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65 61   different threa
2520: 64 73 20 61 72 65 20 74 72 65 61 74 65 64 20 61  ds are treated a
2530: 73 20 64 69 73 74 69 6e 63 74 2e 20 20 42 75 74  s distinct.  But
2540: 20 74 68 65 20 0a 2a 2a 20 6f 70 65 6e 43 6e 74   the .** openCnt
2550: 20 73 74 72 75 63 74 75 72 65 20 73 68 6f 75 6c   structure shoul
2560: 64 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68  d not include th
2570: 65 20 70 72 6f 63 65 73 73 20 69 64 20 69 6e 20  e process id in 
2580: 69 74 73 0a 2a 2a 20 6b 65 79 20 62 65 63 61 75  its.** key becau
2590: 73 65 20 63 6c 6f 73 65 28 29 20 63 6c 65 61 72  se close() clear
25a0: 73 20 6c 6f 63 6b 20 6f 6e 20 61 6c 6c 20 74 68  s lock on all th
25b0: 72 65 61 64 73 2c 20 6e 6f 74 20 6a 75 73 74 20  reads, not just 
25c0: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74  the current.** t
25d0: 68 72 65 61 64 2e 20 20 57 65 72 65 20 69 74 20  hread.  Were it 
25e0: 6e 6f 74 20 66 6f 72 20 74 68 69 73 20 67 6f 6f  not for this goo
25f0: 66 69 6e 65 73 73 20 69 6e 20 6c 69 6e 75 78 20  finess in linux 
2600: 74 68 72 65 61 64 73 2c 20 77 65 20 63 6f 75 6c  threads, we coul
2610: 64 0a 2a 2a 20 63 6f 6d 62 69 6e 65 20 74 68 65  d.** combine the
2620: 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 6f 70   lockInfo and op
2630: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 73  enCnt structures
2640: 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 73   into a single s
2650: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
2660: 32 30 30 34 2d 4a 75 6e 2d 32 38 3a 0a 2a 2a 20  2004-Jun-28:.** 
2670: 4f 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73  On some versions
2680: 20 6f 66 20 6c 69 6e 75 78 2c 20 74 68 72 65 61   of linux, threa
2690: 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20  ds can override 
26a0: 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b  each others lock
26b0: 73 2e 0a 2a 2a 20 4f 6e 20 6f 74 68 65 72 73 20  s..** On others 
26c0: 6e 6f 74 2e 20 20 53 6f 6d 65 74 69 6d 65 73 20  not.  Sometimes 
26d0: 79 6f 75 20 63 61 6e 20 63 68 61 6e 67 65 20 74  you can change t
26e0: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 6e 20 74  he behavior on t
26f0: 68 65 20 73 61 6d 65 0a 2a 2a 20 73 79 73 74 65  he same.** syste
2700: 6d 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  m by setting the
2710: 20 4c 44 5f 41 53 53 55 4d 45 5f 4b 45 52 4e 45   LD_ASSUME_KERNE
2720: 4c 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  L environment va
2730: 72 69 61 62 6c 65 2e 20 20 54 68 65 0a 2a 2a 20  riable.  The.** 
2740: 50 4f 53 49 58 20 73 74 61 6e 64 61 72 64 20 69  POSIX standard i
2750: 73 20 73 69 6c 65 6e 74 20 61 73 20 74 6f 20 77  s silent as to w
2760: 68 69 63 68 20 62 65 68 61 76 69 6f 72 20 69 73  hich behavior is
2770: 20 63 6f 72 72 65 63 74 2c 20 61 73 20 66 61 72   correct, as far
2780: 0a 2a 2a 20 61 73 20 49 20 63 61 6e 20 74 65 6c  .** as I can tel
2790: 6c 2c 20 73 6f 20 6f 74 68 65 72 20 76 65 72 73  l, so other vers
27a0: 69 6f 6e 73 20 6f 66 20 75 6e 69 78 20 6d 69 67  ions of unix mig
27b0: 68 74 20 73 68 6f 77 20 74 68 65 20 73 61 6d 65  ht show the same
27c0: 0a 2a 2a 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63  .** inconsistenc
27d0: 79 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  y.  There is no 
27e0: 6c 69 74 74 6c 65 20 64 6f 75 62 74 20 69 6e 20  little doubt in 
27f0: 6d 79 20 6d 69 6e 64 20 74 68 61 74 20 70 6f 73  my mind that pos
2800: 69 78 0a 2a 2a 20 61 64 76 69 73 6f 72 79 20 6c  ix.** advisory l
2810: 6f 63 6b 73 20 61 6e 64 20 6c 69 6e 75 78 20 74  ocks and linux t
2820: 68 72 65 61 64 73 20 61 72 65 20 70 72 6f 66 6f  hreads are profo
2830: 75 6e 64 6c 79 20 62 72 6f 6b 65 6e 2e 0a 2a 2a  undly broken..**
2840: 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  .** To work arou
2850: 6e 64 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  nd the inconsist
2860: 65 6e 63 69 65 73 2c 20 77 65 20 68 61 76 65 20  encies, we have 
2870: 74 6f 20 74 65 73 74 20 61 74 20 72 75 6e 74 69  to test at runti
2880: 6d 65 20 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f  me .** whether o
2890: 72 20 6e 6f 74 20 74 68 72 65 61 64 73 20 63 61  r not threads ca
28a0: 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20  n override each 
28b0: 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 20 20 54  others locks.  T
28c0: 68 69 73 20 74 65 73 74 0a 2a 2a 20 69 73 20 72  his test.** is r
28d0: 75 6e 20 6f 6e 63 65 2c 20 74 68 65 20 66 69 72  un once, the fir
28e0: 73 74 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b  st time any lock
28f0: 20 69 73 20 61 74 74 65 6d 70 74 65 64 2e 20 20   is attempted.  
2900: 41 20 73 74 61 74 69 63 20 0a 2a 2a 20 76 61 72  A static .** var
2910: 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20  iable is set to 
2920: 72 65 63 6f 72 64 20 74 68 65 20 72 65 73 75 6c  record the resul
2930: 74 73 20 6f 66 20 74 68 69 73 20 74 65 73 74 20  ts of this test 
2940: 66 6f 72 20 66 75 74 75 72 65 0a 2a 2a 20 75 73  for future.** us
2950: 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  e..*/../*.** An 
2960: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
2970: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
2980: 75 72 65 20 73 65 72 76 65 73 20 61 73 20 74 68  ure serves as th
2990: 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f  e key used.** to
29a0: 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69 63   locate a partic
29b0: 75 6c 61 72 20 6c 6f 63 6b 49 6e 66 6f 20 73 74  ular lockInfo st
29c0: 72 75 63 74 75 72 65 20 67 69 76 65 6e 20 69 74  ructure given it
29d0: 73 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49  s inode..**.** I
29e0: 66 20 74 68 72 65 61 64 73 20 63 61 6e 6e 6f 74  f threads cannot
29f0: 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f   override each o
2a00: 74 68 65 72 73 20 6c 6f 63 6b 73 2c 20 74 68 65  thers locks, the
2a10: 6e 20 77 65 20 73 65 74 20 74 68 65 0a 2a 2a 20  n we set the.** 
2a20: 6c 6f 63 6b 4b 65 79 2e 74 69 64 20 66 69 65 6c  lockKey.tid fiel
2a30: 64 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 20  d to the thread 
2a40: 49 44 2e 20 20 49 66 20 74 68 72 65 61 64 73 20  ID.  If threads 
2a50: 63 61 6e 20 6f 76 65 72 72 69 64 65 0a 2a 2a 20  can override.** 
2a60: 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b  each others lock
2a70: 73 20 74 68 65 6e 20 74 69 64 20 69 73 20 61 6c  s then tid is al
2a80: 77 61 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  ways set to zero
2a90: 2e 20 20 74 69 64 20 69 73 20 6f 6d 69 74 74 65  .  tid is omitte
2aa0: 64 0a 2a 2a 20 69 66 20 77 65 20 63 6f 6d 70 69  d.** if we compi
2ab0: 6c 65 20 77 69 74 68 6f 75 74 20 74 68 72 65 61  le without threa
2ac0: 64 69 6e 67 20 73 75 70 70 6f 72 74 2e 0a 2a 2f  ding support..*/
2ad0: 0a 73 74 72 75 63 74 20 6c 6f 63 6b 4b 65 79 20  .struct lockKey 
2ae0: 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20  {.  dev_t dev;  
2af0: 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 6e       /* Device n
2b00: 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 6f 5f 74  umber */.  ino_t
2b10: 20 69 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 49   ino;       /* I
2b20: 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23  node number */.#
2b30: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
2b40: 53 41 46 45 0a 20 20 70 74 68 72 65 61 64 5f 74  SAFE.  pthread_t
2b50: 20 74 69 64 3b 20 20 20 2f 2a 20 54 68 72 65 61   tid;   /* Threa
2b60: 64 20 49 44 20 6f 72 20 7a 65 72 6f 20 69 66 20  d ID or zero if 
2b70: 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72  threads can over
2b80: 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 20  ride each other 
2b90: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
2ba0: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
2bb0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2bc0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
2bd0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
2be0: 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 20 6f   open.** inode o
2bf0: 6e 20 65 61 63 68 20 74 68 72 65 61 64 20 77 69  n each thread wi
2c00: 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 70  th a different p
2c10: 72 6f 63 65 73 73 20 49 44 2e 20 20 28 54 68 72  rocess ID.  (Thr
2c20: 65 61 64 73 20 68 61 76 65 0a 2a 2a 20 64 69 66  eads have.** dif
2c30: 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 20 49  ferent process I
2c40: 44 73 20 6f 6e 20 6c 69 6e 75 78 2c 20 62 75 74  Ds on linux, but
2c50: 20 6e 6f 74 20 6f 6e 20 6d 6f 73 74 20 6f 74 68   not on most oth
2c60: 65 72 20 75 6e 69 78 65 73 2e 29 0a 2a 2a 0a 2a  er unixes.).**.*
2c70: 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65  * A single inode
2c80: 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70   can have multip
2c90: 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  le file descript
2ca0: 6f 72 73 2c 20 73 6f 20 65 61 63 68 20 75 6e 69  ors, so each uni
2cb0: 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75  xFile.** structu
2cc0: 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  re contains a po
2cd0: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74  inter to an inst
2ce0: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a  ance of this obj
2cf0: 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20  ect and this.** 
2d00: 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20 63  object keeps a c
2d10: 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62  ount of the numb
2d20: 65 72 20 6f 66 20 75 6e 69 78 46 69 6c 65 20 70  er of unixFile p
2d30: 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a  ointing to it..*
2d40: 2f 0a 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66  /.struct lockInf
2d50: 6f 20 7b 0a 20 20 73 74 72 75 63 74 20 6c 6f 63  o {.  struct loc
2d60: 6b 4b 65 79 20 6b 65 79 3b 20 20 2f 2a 20 54 68  kKey key;  /* Th
2d70: 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a  e lookup key */.
2d80: 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20    int cnt;      
2d90: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2da0: 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73   of SHARED locks
2db0: 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6c   held */.  int l
2dc0: 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20 20  ocktype;        
2dd0: 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52 45 44  /* One of SHARED
2de0: 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f  _LOCK, RESERVED_
2df0: 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 69  LOCK etc. */.  i
2e00: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
2e10: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2e20: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69   pointers to thi
2e30: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 7d  s structure */.}
2e40: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
2e50: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
2e60: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
2e70: 73 65 72 76 65 73 20 61 73 20 74 68 65 20 6b 65  serves as the ke
2e80: 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63  y used.** to loc
2e90: 61 74 65 20 61 20 70 61 72 74 69 63 75 6c 61 72  ate a particular
2ea0: 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75   openCnt structu
2eb0: 72 65 20 67 69 76 65 6e 20 69 74 73 20 69 6e 6f  re given its ino
2ec0: 64 65 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20  de.  This.** is 
2ed0: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
2ee0: 6c 6f 63 6b 4b 65 79 20 65 78 63 65 70 74 20 74  lockKey except t
2ef0: 68 61 74 20 74 68 65 20 74 68 72 65 61 64 20 49  hat the thread I
2f00: 44 20 69 73 20 6f 6d 69 74 74 65 64 2e 0a 2a 2f  D is omitted..*/
2f10: 0a 73 74 72 75 63 74 20 6f 70 65 6e 4b 65 79 20  .struct openKey 
2f20: 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20  {.  dev_t dev;  
2f30: 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65   /* Device numbe
2f40: 72 20 2a 2f 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f  r */.  ino_t ino
2f50: 3b 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d  ;   /* Inode num
2f60: 62 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ber */.};../*.**
2f70: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
2f80: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
2f90: 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
2fa0: 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70  ated for each op
2fb0: 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 54 68  en.** inode.  Th
2fc0: 69 73 20 73 74 72 75 63 74 75 72 65 20 6b 65 65  is structure kee
2fd0: 70 73 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20  ps track of the 
2fe0: 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  number of locks 
2ff0: 6f 6e 20 74 68 61 74 0a 2a 2a 20 69 6e 6f 64 65  on that.** inode
3000: 2e 20 20 49 66 20 61 20 63 6c 6f 73 65 20 69 73  .  If a close is
3010: 20 61 74 74 65 6d 70 74 65 64 20 61 67 61 69 6e   attempted again
3020: 73 74 20 61 6e 20 69 6e 6f 64 65 20 74 68 61 74  st an inode that
3030: 20 69 73 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6c   is holding.** l
3040: 6f 63 6b 73 2c 20 74 68 65 20 63 6c 6f 73 65 20  ocks, the close 
3050: 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
3060: 6c 20 61 6c 6c 20 6c 6f 63 6b 73 20 63 6c 65 61  l all locks clea
3070: 72 20 62 79 20 61 64 64 69 6e 67 20 74 68 65 0a  r by adding the.
3080: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
3090: 6f 72 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20  or to be closed 
30a0: 74 6f 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c  to the pending l
30b0: 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6f  ist..*/.struct o
30c0: 70 65 6e 43 6e 74 20 7b 0a 20 20 73 74 72 75 63  penCnt {.  struc
30d0: 74 20 6f 70 65 6e 4b 65 79 20 6b 65 79 3b 20 20  t openKey key;  
30e0: 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b   /* The lookup k
30f0: 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  ey */.  int nRef
3100: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3110: 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   Number of point
3120: 65 72 73 20 74 6f 20 74 68 69 73 20 73 74 72 75  ers to this stru
3130: 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  cture */.  int n
3140: 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Lock;           
3150: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75   /* Number of ou
3160: 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 20  tstanding locks 
3170: 2a 2f 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e  */.  int nPendin
3180: 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  g;         /* Nu
3190: 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67 20  mber of pending 
31a0: 63 6c 6f 73 65 28 29 20 6f 70 65 72 61 74 69 6f  close() operatio
31b0: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65  ns */.  int *aPe
31c0: 6e 64 69 6e 67 3b 20 20 20 20 20 20 20 20 2f 2a  nding;        /*
31d0: 20 4d 61 6c 6c 6f 63 65 64 20 73 70 61 63 65 20   Malloced space 
31e0: 68 6f 6c 64 69 6e 67 20 66 64 27 73 20 61 77 61  holding fd's awa
31f0: 69 74 69 6e 67 20 61 20 63 6c 6f 73 65 28 29 20  iting a close() 
3200: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68  */.};../* .** Th
3210: 65 73 65 20 68 61 73 68 20 74 61 62 6c 65 73 20  ese hash tables 
3220: 6d 61 70 20 69 6e 6f 64 65 73 20 61 6e 64 20 66  map inodes and f
3230: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
3240: 28 72 65 61 6c 6c 79 2c 20 6c 6f 63 6b 4b 65 79  (really, lockKey
3250: 20 61 6e 64 0a 2a 2a 20 6f 70 65 6e 4b 65 79 20   and.** openKey 
3260: 73 74 72 75 63 74 75 72 65 73 29 20 69 6e 74 6f  structures) into
3270: 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 6f 70   lockInfo and op
3280: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 73  enCnt structures
3290: 2e 20 20 41 63 63 65 73 73 20 74 6f 20 0a 2a 2a  .  Access to .**
32a0: 20 74 68 65 73 65 20 68 61 73 68 20 74 61 62 6c   these hash tabl
32b0: 65 73 20 6d 75 73 74 20 62 65 20 70 72 6f 74 65  es must be prote
32c0: 63 74 65 64 20 62 79 20 61 20 6d 75 74 65 78 2e  cted by a mutex.
32d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 48 61 73 68 20  .*/.static Hash 
32e0: 6c 6f 63 6b 48 61 73 68 20 3d 20 7b 53 51 4c 49  lockHash = {SQLI
32f0: 54 45 5f 48 41 53 48 5f 42 49 4e 41 52 59 2c 20  TE_HASH_BINARY, 
3300: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 7d 3b 0a  0, 0, 0, 0, 0};.
3310: 73 74 61 74 69 63 20 48 61 73 68 20 6f 70 65 6e  static Hash open
3320: 48 61 73 68 20 3d 20 7b 53 51 4c 49 54 45 5f 48  Hash = {SQLITE_H
3330: 41 53 48 5f 42 49 4e 41 52 59 2c 20 30 2c 20 30  ASH_BINARY, 0, 0
3340: 2c 20 30 2c 20 30 2c 20 30 7d 3b 0a 0a 23 69 66  , 0, 0, 0};..#if
3350: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
3360: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
3370: 2f 2a 0a 2a 2a 20 54 68 65 20 6c 6f 63 6b 69 6e  /*.** The lockin
3380: 67 20 73 74 79 6c 65 73 20 61 72 65 20 61 73 73  g styles are ass
3390: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
33a0: 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 20   different file 
33b0: 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 61 70 61 62  locking.** capab
33c0: 69 6c 69 74 69 65 73 20 73 75 70 70 6f 72 74 65  ilities supporte
33d0: 64 20 62 79 20 64 69 66 66 65 72 65 6e 74 20 66  d by different f
33e0: 69 6c 65 20 73 79 73 74 65 6d 73 2e 20 20 0a 2a  ile systems.  .*
33f0: 2a 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 69  *.** POSIX locki
3400: 6e 67 20 73 74 79 6c 65 20 66 75 6c 6c 79 20 73  ng style fully s
3410: 75 70 70 6f 72 74 73 20 73 68 61 72 65 64 20 61  upports shared a
3420: 6e 64 20 65 78 63 6c 75 73 69 76 65 20 62 79 74  nd exclusive byt
3430: 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 0a 2a  e-range locks .*
3440: 2a 20 41 44 50 20 6c 6f 63 6b 69 6e 67 20 6f 6e  * ADP locking on
3450: 6c 79 20 73 75 70 70 6f 72 74 73 20 65 78 63 6c  ly supports excl
3460: 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67 65  usive byte-range
3470: 20 6c 6f 63 6b 73 0a 2a 2a 20 46 4c 4f 43 4b 20   locks.** FLOCK 
3480: 6f 6e 6c 79 20 73 75 70 70 6f 72 74 73 20 61 20  only supports a 
3490: 73 69 6e 67 6c 65 20 66 69 6c 65 2d 67 6c 6f 62  single file-glob
34a0: 61 6c 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  al exclusive loc
34b0: 6b 0a 2a 2a 20 44 4f 54 4c 4f 43 4b 20 69 73 6e  k.** DOTLOCK isn
34c0: 27 74 20 61 20 74 72 75 65 20 6c 6f 63 6b 69 6e  't a true lockin
34d0: 67 20 73 74 79 6c 65 2c 20 69 74 20 72 65 66 65  g style, it refe
34e0: 72 73 20 74 6f 20 74 68 65 20 75 73 65 20 6f 66  rs to the use of
34f0: 20 61 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20   a special.**   
3500: 66 69 6c 65 20 6e 61 6d 65 64 20 74 68 65 20 73  file named the s
3510: 61 6d 65 20 61 73 20 74 68 65 20 64 61 74 61 62  ame as the datab
3520: 61 73 65 20 66 69 6c 65 20 77 69 74 68 20 61 20  ase file with a 
3530: 27 2e 6c 6f 63 6b 27 20 65 78 74 65 6e 73 69 6f  '.lock' extensio
3540: 6e 2c 20 74 68 69 73 0a 2a 2a 20 20 20 63 61 6e  n, this.**   can
3550: 20 62 65 20 75 73 65 64 20 6f 6e 20 66 69 6c 65   be used on file
3560: 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 64 6f   systems that do
3570: 20 6e 6f 74 20 6f 66 66 65 72 20 61 6e 79 20 72   not offer any r
3580: 65 6c 69 61 62 6c 65 20 66 69 6c 65 20 6c 6f 63  eliable file loc
3590: 6b 69 6e 67 0a 2a 2a 20 4e 4f 20 6c 6f 63 6b 69  king.** NO locki
35a0: 6e 67 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f  ng means that no
35b0: 20 6c 6f 63 6b 69 6e 67 20 77 69 6c 6c 20 62 65   locking will be
35c0: 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73   attempted, this
35d0: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f   is only used fo
35e0: 72 0a 2a 2a 20 20 20 72 65 61 64 2d 6f 6e 6c 79  r.**   read-only
35f0: 20 66 69 6c 65 20 73 79 73 74 65 6d 73 20 63 75   file systems cu
3600: 72 72 65 6e 74 6c 79 0a 2a 2a 20 55 4e 53 55 50  rrently.** UNSUP
3610: 50 4f 52 54 45 44 20 6d 65 61 6e 73 20 74 68 61  PORTED means tha
3620: 74 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 77 69 6c  t no locking wil
3630: 6c 20 62 65 20 61 74 74 65 6d 70 74 65 64 2c 20  l be attempted, 
3640: 74 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73 65  this is only use
3650: 64 20 66 6f 72 0a 2a 2a 20 20 20 66 69 6c 65 20  d for.**   file 
3660: 73 79 73 74 65 6d 73 20 74 68 61 74 20 61 72 65  systems that are
3670: 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 75 6e 73   known to be uns
3680: 75 70 70 6f 72 74 65 64 0a 2a 2f 0a 74 79 70 65  upported.*/.type
3690: 64 65 66 20 65 6e 75 6d 20 7b 0a 20 20 20 20 20  def enum {.     
36a0: 20 20 20 70 6f 73 69 78 4c 6f 63 6b 69 6e 67 53     posixLockingS
36b0: 74 79 6c 65 20 3d 20 30 2c 20 20 20 20 20 20 20  tyle = 0,       
36c0: 2f 2a 20 73 74 61 6e 64 61 72 64 20 70 6f 73 69  /* standard posi
36d0: 78 2d 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  x-advisory locks
36e0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 66 70 4c   */.        afpL
36f0: 6f 63 6b 69 6e 67 53 74 79 6c 65 2c 20 20 20 20  ockingStyle,    
3700: 20 20 20 20 20 20 20 20 20 2f 2a 20 75 73 65 20           /* use 
3710: 61 66 70 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  afp locks */.   
3720: 20 20 20 20 20 66 6c 6f 63 6b 4c 6f 63 6b 69 6e       flockLockin
3730: 67 53 74 79 6c 65 2c 20 20 20 20 20 20 20 20 20  gStyle,         
3740: 20 20 2f 2a 20 75 73 65 20 66 6c 6f 63 6b 28 29    /* use flock()
3750: 20 2a 2f 0a 20 20 20 20 20 20 20 20 64 6f 74 6c   */.        dotl
3760: 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 2c  ockLockingStyle,
3770: 20 20 20 20 20 20 20 20 20 2f 2a 20 75 73 65 20           /* use 
3780: 3c 66 69 6c 65 3e 2e 6c 6f 63 6b 20 66 69 6c 65  <file>.lock file
3790: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 6f 4c  s */.        noL
37a0: 6f 63 6b 69 6e 67 53 74 79 6c 65 2c 20 20 20 20  ockingStyle,    
37b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 75 73 65            /* use
37c0: 66 75 6c 20 66 6f 72 20 72 65 61 64 2d 6f 6e 6c  ful for read-onl
37d0: 79 20 66 69 6c 65 20 73 79 73 74 65 6d 20 2a 2f  y file system */
37e0: 0a 20 20 20 20 20 20 20 20 75 6e 73 75 70 70 6f  .        unsuppo
37f0: 72 74 65 64 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  rtedLockingStyle
3800: 20 20 20 20 20 20 2f 2a 20 69 6e 64 69 63 61 74        /* indicat
3810: 65 73 20 75 6e 73 75 70 70 6f 72 74 65 64 20 66  es unsupported f
3820: 69 6c 65 20 73 79 73 74 65 6d 20 2a 2f 0a 7d 20  ile system */.} 
3830: 73 71 6c 69 74 65 33 4c 6f 63 6b 69 6e 67 53 74  sqlite3LockingSt
3840: 79 6c 65 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  yle;.#endif /* S
3850: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
3860: 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f  KING_STYLE */../
3870: 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
3880: 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20  tions to obtain 
3890: 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74  and relinquish t
38a0: 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e  he global mutex.
38b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
38c0: 65 6e 74 65 72 4d 75 74 65 78 28 29 7b 0a 20 20  enterMutex(){.  
38d0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
38e0: 74 65 72 28 73 71 6c 69 74 65 33 5f 6d 75 74 65  ter(sqlite3_mute
38f0: 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
3900: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
3910: 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ER));.}.static v
3920: 6f 69 64 20 6c 65 61 76 65 4d 75 74 65 78 28 29  oid leaveMutex()
3930: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
3940: 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 5f  x_leave(sqlite3_
3950: 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
3960: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
3970: 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 0a 23 69 66  MASTER));.}..#if
3980: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
3990: 46 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 61  FE./*.** This va
39a0: 72 69 61 62 6c 65 20 72 65 63 6f 72 64 73 20 77  riable records w
39b0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
39c0: 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69  reads can overri
39d0: 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 0a 2a  de each others.*
39e0: 2a 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 20  * locks..**.**  
39f0: 20 20 30 3a 20 20 4e 6f 2e 20 20 54 68 72 65 61    0:  No.  Threa
3a00: 64 73 20 63 61 6e 6e 6f 74 20 6f 76 65 72 72 69  ds cannot overri
3a10: 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c  de each others l
3a20: 6f 63 6b 73 2e 0a 2a 2a 20 20 20 20 31 3a 20 20  ocks..**    1:  
3a30: 59 65 73 2e 20 20 54 68 72 65 61 64 73 20 63 61  Yes.  Threads ca
3a40: 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20  n override each 
3a50: 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2a  others locks..**
3a60: 20 20 20 2d 31 3a 20 20 57 65 20 64 6f 6e 27 74     -1:  We don't
3a70: 20 6b 6e 6f 77 20 79 65 74 2e 0a 2a 2a 0a 2a 2a   know yet..**.**
3a80: 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   On some systems
3a90: 2c 20 77 65 20 6b 6e 6f 77 20 61 74 20 63 6f 6d  , we know at com
3aa0: 70 69 6c 65 2d 74 69 6d 65 20 69 66 20 74 68 72  pile-time if thr
3ab0: 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64  eads can overrid
3ac0: 65 20 65 61 63 68 0a 2a 2a 20 6f 74 68 65 72 73  e each.** others
3ad0: 20 6c 6f 63 6b 73 2e 20 20 4f 6e 20 74 68 6f 73   locks.  On thos
3ae0: 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65 20 53  e systems, the S
3af0: 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45  QLITE_THREAD_OVE
3b00: 52 52 49 44 45 5f 4c 4f 43 4b 20 6d 61 63 72 6f  RRIDE_LOCK macro
3b10: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 73 65 74 20  .** will be set 
3b20: 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 20  appropriately.  
3b30: 4f 6e 20 6f 74 68 65 72 20 73 79 73 74 65 6d 73  On other systems
3b40: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 63 68 65  , we have to che
3b50: 63 6b 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65  ck at.** runtime
3b60: 2e 20 20 4f 6e 20 74 68 65 73 65 20 6c 61 74 74  .  On these latt
3b70: 65 72 20 73 79 73 74 65 6d 73 2c 20 53 51 4c 54  er systems, SQLT
3b80: 49 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49  IE_THREAD_OVERRI
3b90: 44 45 5f 4c 4f 43 4b 20 69 73 0a 2a 2a 20 75 6e  DE_LOCK is.** un
3ba0: 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  defined..**.** T
3bb0: 68 69 73 20 76 61 72 69 61 62 6c 65 20 6e 6f 72  his variable nor
3bc0: 6d 61 6c 6c 79 20 68 61 73 20 66 69 6c 65 20 73  mally has file s
3bd0: 63 6f 70 65 20 6f 6e 6c 79 2e 20 20 42 75 74 20  cope only.  But 
3be0: 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2c 20  during testing, 
3bf0: 77 65 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 61 20  we make.** it a 
3c00: 67 6c 6f 62 61 6c 20 73 6f 20 74 68 61 74 20 74  global so that t
3c10: 68 65 20 74 65 73 74 20 63 6f 64 65 20 63 61 6e  he test code can
3c20: 20 63 68 61 6e 67 65 20 69 74 73 20 76 61 6c 75   change its valu
3c30: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 76 65  e in order to ve
3c40: 72 69 66 79 0a 2a 2a 20 74 68 61 74 20 74 68 65  rify.** that the
3c50: 20 72 69 67 68 74 20 73 74 75 66 66 20 68 61 70   right stuff hap
3c60: 70 65 6e 73 20 69 6e 20 65 69 74 68 65 72 20 63  pens in either c
3c70: 61 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ase..*/.#ifndef 
3c80: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56  SQLITE_THREAD_OV
3c90: 45 52 52 49 44 45 5f 4c 4f 43 4b 0a 23 20 64 65  ERRIDE_LOCK.# de
3ca0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 48 52 45  fine SQLITE_THRE
3cb0: 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b  AD_OVERRIDE_LOCK
3cc0: 20 2d 31 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   -1.#endif.#ifde
3cd0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
3ce0: 74 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64  t threadsOverrid
3cf0: 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73  eEachOthersLocks
3d00: 20 3d 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44   = SQLITE_THREAD
3d10: 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a  _OVERRIDE_LOCK;.
3d20: 23 65 6c 73 65 0a 73 74 61 74 69 63 20 69 6e 74  #else.static int
3d30: 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65   threadsOverride
3d40: 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20  EachOthersLocks 
3d50: 3d 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f  = SQLITE_THREAD_
3d60: 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a 23  OVERRIDE_LOCK;.#
3d70: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
3d80: 73 20 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64  s structure hold
3d90: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61  s information pa
3da0: 73 73 65 64 20 69 6e 74 6f 20 69 6e 64 69 76 69  ssed into indivi
3db0: 64 75 61 6c 20 74 65 73 74 0a 2a 2a 20 74 68 72  dual test.** thr
3dc0: 65 61 64 73 20 62 79 20 74 68 65 20 74 65 73 74  eads by the test
3dd0: 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68  ThreadLockingBeh
3de0: 61 76 69 6f 72 28 29 20 72 6f 75 74 69 6e 65 2e  avior() routine.
3df0: 0a 2a 2f 0a 73 74 72 75 63 74 20 74 68 72 65 61  .*/.struct threa
3e00: 64 54 65 73 74 44 61 74 61 20 7b 0a 20 20 69 6e  dTestData {.  in
3e10: 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  t fd;           
3e20: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20       /* File to 
3e30: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 73  be locked */.  s
3e40: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
3e50: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63  ;     /* The loc
3e60: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 2a  king operation *
3e70: 2f 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 3b 20  /.  int result; 
3e80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
3e90: 73 75 6c 74 20 6f 66 20 74 68 65 20 6c 6f 63 6b  sult of the lock
3ea0: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ing operation */
3eb0: 0a 7d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .};..#ifdef SQLI
3ec0: 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a  TE_LOCK_TRACE./*
3ed0: 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20 69 6e  .** Print out in
3ee0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
3ef0: 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72  all locking oper
3f00: 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ations..**.** Th
3f10: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
3f20: 65 64 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68  ed for troublesh
3f30: 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20  ooting locks on 
3f40: 6d 75 6c 74 69 74 68 72 65 61 64 65 64 0a 2a 2a  multithreaded.**
3f50: 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61   platforms.  Ena
3f60: 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67  ble by compiling
3f70: 20 77 69 74 68 20 74 68 65 20 2d 44 53 51 4c 49   with the -DSQLI
3f80: 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a  TE_LOCK_TRACE.**
3f90: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70   command-line op
3fa0: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70  tion on the comp
3fb0: 69 6c 65 72 2e 20 20 54 68 69 73 20 63 6f 64 65  iler.  This code
3fc0: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20   is normally.** 
3fd0: 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73  turned off..*/.s
3fe0: 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72  tatic int lockTr
3ff0: 61 63 65 28 69 6e 74 20 66 64 2c 20 69 6e 74 20  ace(int fd, int 
4000: 6f 70 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  op, struct flock
4010: 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f   *p){.  char *zO
4020: 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20  pName, *zType;. 
4030: 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20 73 61   int s;.  int sa
4040: 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20  vedErrno;.  if( 
4050: 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20  op==F_GETLK ){. 
4060: 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45     zOpName = "GE
4070: 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66  TLK";.  }else if
4080: 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b  ( op==F_SETLK ){
4090: 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22  .    zOpName = "
40a0: 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b  SETLK";.  }else{
40b0: 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 66  .    s = fcntl(f
40c0: 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73  d, op, p);.    s
40d0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
40e0: 66 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e  f("fcntl unknown
40f0: 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 66 64   %d %d %d\n", fd
4100: 2c 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72 65  , op, s);.    re
4110: 74 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66  turn s;.  }.  if
4120: 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52  ( p->l_type==F_R
4130: 44 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70  DLCK ){.    zTyp
4140: 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d  e = "RDLCK";.  }
4150: 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79  else if( p->l_ty
4160: 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20  pe==F_WRLCK ){. 
4170: 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43     zType = "WRLC
4180: 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  K";.  }else if( 
4190: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c  p->l_type==F_UNL
41a0: 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20  CK ){.    zType 
41b0: 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c  = "UNLCK";.  }el
41c0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
41d0: 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  0 );.  }.  asser
41e0: 74 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d  t( p->l_whence==
41f0: 53 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20  SEEK_SET );.  s 
4200: 3d 20 66 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20  = fcntl(fd, op, 
4210: 70 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e 6f  p);.  savedErrno
4220: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69   = errno;.  sqli
4230: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
4240: 66 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20 25  fcntl %d %d %s %
4250: 73 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e 22  s %d %d %d %d\n"
4260: 2c 0a 20 20 20 20 20 74 68 72 65 61 64 69 64 2c  ,.     threadid,
4270: 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54   fd, zOpName, zT
4280: 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73  ype, (int)p->l_s
4290: 74 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f  tart, (int)p->l_
42a0: 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29 70  len,.     (int)p
42b0: 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69  ->l_pid, s);.  i
42c0: 66 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70  f( s==(-1) && op
42d0: 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d  ==F_SETLK && (p-
42e0: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  >l_type==F_RDLCK
42f0: 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46   || p->l_type==F
4300: 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73  _WRLCK) ){.    s
4310: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a  truct flock l2;.
4320: 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20      l2 = *p;.   
4330: 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54   fcntl(fd, F_GET
4340: 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69 66  LK, &l2);.    if
4350: 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52  ( l2.l_type==F_R
4360: 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54  DLCK ){.      zT
4370: 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20  ype = "RDLCK";. 
4380: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e     }else if( l2.
4390: 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  l_type==F_WRLCK 
43a0: 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  ){.      zType =
43b0: 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65   "WRLCK";.    }e
43c0: 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70  lse if( l2.l_typ
43d0: 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e==F_UNLCK ){.  
43e0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c      zType = "UNL
43f0: 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  CK";.    }else{.
4400: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20        assert( 0 
4410: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
4420: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
4430: 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72  "fcntl-failure-r
4440: 65 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64 20  eason: %s %d %d 
4450: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54  %d\n",.       zT
4460: 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73  ype, (int)l2.l_s
4470: 74 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  tart, (int)l2.l_
4480: 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70  len, (int)l2.l_p
4490: 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f  id);.  }.  errno
44a0: 20 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20   = savedErrno;. 
44b0: 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 64 65   return s;.}.#de
44c0: 66 69 6e 65 20 66 63 6e 74 6c 20 6c 6f 63 6b 54  fine fcntl lockT
44d0: 72 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  race.#endif /* S
44e0: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
44f0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74   */../*.** The t
4500: 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67  estThreadLocking
4510: 42 65 68 61 76 69 6f 72 28 29 20 72 6f 75 74 69  Behavior() routi
4520: 6e 65 20 6c 61 75 6e 63 68 65 73 20 74 77 6f 20  ne launches two 
4530: 73 65 70 61 72 61 74 65 0a 2a 2a 20 74 68 72 65  separate.** thre
4540: 61 64 73 20 6f 6e 20 74 68 69 73 20 72 6f 75 74  ads on this rout
4550: 69 6e 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ine.  This routi
4560: 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6c  ne attempts to l
4570: 6f 63 6b 20 61 20 66 69 6c 65 0a 2a 2a 20 64 65  ock a file.** de
4580: 73 63 72 69 70 74 6f 72 20 74 68 65 6e 20 72 65  scriptor then re
4590: 74 75 72 6e 73 2e 20 20 54 68 65 20 73 75 63 63  turns.  The succ
45a0: 65 73 73 20 6f 72 20 66 61 69 6c 75 72 65 20 6f  ess or failure o
45b0: 66 20 74 68 61 74 20 61 74 74 65 6d 70 74 0a 2a  f that attempt.*
45c0: 2a 20 61 6c 6c 6f 77 73 20 74 68 65 20 74 65 73  * allows the tes
45d0: 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65  tThreadLockingBe
45e0: 68 61 76 69 6f 72 28 29 20 70 72 6f 63 65 64 75  havior() procedu
45f0: 72 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a  re to determine.
4600: 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
4610: 74 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76  t threads can ov
4620: 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65  erride each othe
4630: 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61  rs locks..*/.sta
4640: 74 69 63 20 76 6f 69 64 20 2a 74 68 72 65 61 64  tic void *thread
4650: 4c 6f 63 6b 69 6e 67 54 65 73 74 28 76 6f 69 64  LockingTest(void
4660: 20 2a 70 41 72 67 29 7b 0a 20 20 73 74 72 75 63   *pArg){.  struc
4670: 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74 61  t threadTestData
4680: 20 2a 70 44 61 74 61 20 3d 20 28 73 74 72 75 63   *pData = (struc
4690: 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74 61  t threadTestData
46a0: 2a 29 70 41 72 67 3b 0a 20 20 70 44 61 74 61 2d  *)pArg;.  pData-
46b0: 3e 72 65 73 75 6c 74 20 3d 20 66 63 6e 74 6c 28  >result = fcntl(
46c0: 70 44 61 74 61 2d 3e 66 64 2c 20 46 5f 53 45 54  pData->fd, F_SET
46d0: 4c 4b 2c 20 26 70 44 61 74 61 2d 3e 6c 6f 63 6b  LK, &pData->lock
46e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 41 72 67  );.  return pArg
46f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
4700: 70 72 6f 63 65 64 75 72 65 20 61 74 74 65 6d 70  procedure attemp
4710: 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ts to determine 
4720: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
4730: 68 72 65 61 64 73 0a 2a 2a 20 63 61 6e 20 6f 76  hreads.** can ov
4740: 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65  erride each othe
4750: 72 73 20 6c 6f 63 6b 73 20 74 68 65 6e 20 73 65  rs locks then se
4760: 74 73 20 74 68 65 20 0a 2a 2a 20 74 68 72 65 61  ts the .** threa
4770: 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74  dsOverrideEachOt
4780: 68 65 72 73 4c 6f 63 6b 73 20 76 61 72 69 61 62  hersLocks variab
4790: 6c 65 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79  le appropriately
47a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
47b0: 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69   testThreadLocki
47c0: 6e 67 42 65 68 61 76 69 6f 72 28 69 6e 74 20 66  ngBehavior(int f
47d0: 64 5f 6f 72 69 67 29 7b 0a 20 20 69 6e 74 20 66  d_orig){.  int f
47e0: 64 3b 0a 20 20 73 74 72 75 63 74 20 74 68 72 65  d;.  struct thre
47f0: 61 64 54 65 73 74 44 61 74 61 20 64 5b 32 5d 3b  adTestData d[2];
4800: 0a 20 20 70 74 68 72 65 61 64 5f 74 20 74 5b 32  .  pthread_t t[2
4810: 5d 3b 0a 0a 20 20 66 64 20 3d 20 64 75 70 28 66  ];..  fd = dup(f
4820: 64 5f 6f 72 69 67 29 3b 0a 20 20 69 66 28 20 66  d_orig);.  if( f
4830: 64 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  d<0 ) return;.  
4840: 6d 65 6d 73 65 74 28 64 2c 20 30 2c 20 73 69 7a  memset(d, 0, siz
4850: 65 6f 66 28 64 29 29 3b 0a 20 20 64 5b 30 5d 2e  eof(d));.  d[0].
4860: 66 64 20 3d 20 66 64 3b 0a 20 20 64 5b 30 5d 2e  fd = fd;.  d[0].
4870: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
4880: 52 44 4c 43 4b 3b 0a 20 20 64 5b 30 5d 2e 6c 6f  RDLCK;.  d[0].lo
4890: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20  ck.l_len = 1;.  
48a0: 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 73 74 61 72  d[0].lock.l_star
48b0: 74 20 3d 20 30 3b 0a 20 20 64 5b 30 5d 2e 6c 6f  t = 0;.  d[0].lo
48c0: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
48d0: 45 4b 5f 53 45 54 3b 0a 20 20 64 5b 31 5d 20 3d  EK_SET;.  d[1] =
48e0: 20 64 5b 30 5d 3b 0a 20 20 64 5b 31 5d 2e 6c 6f   d[0];.  d[1].lo
48f0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52  ck.l_type = F_WR
4900: 4c 43 4b 3b 0a 20 20 70 74 68 72 65 61 64 5f 63  LCK;.  pthread_c
4910: 72 65 61 74 65 28 26 74 5b 30 5d 2c 20 30 2c 20  reate(&t[0], 0, 
4920: 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73  threadLockingTes
4930: 74 2c 20 26 64 5b 30 5d 29 3b 0a 20 20 70 74 68  t, &d[0]);.  pth
4940: 72 65 61 64 5f 63 72 65 61 74 65 28 26 74 5b 31  read_create(&t[1
4950: 5d 2c 20 30 2c 20 74 68 72 65 61 64 4c 6f 63 6b  ], 0, threadLock
4960: 69 6e 67 54 65 73 74 2c 20 26 64 5b 31 5d 29 3b  ingTest, &d[1]);
4970: 0a 20 20 70 74 68 72 65 61 64 5f 6a 6f 69 6e 28  .  pthread_join(
4980: 74 5b 30 5d 2c 20 30 29 3b 0a 20 20 70 74 68 72  t[0], 0);.  pthr
4990: 65 61 64 5f 6a 6f 69 6e 28 74 5b 31 5d 2c 20 30  ead_join(t[1], 0
49a0: 29 3b 0a 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a  );.  close(fd);.
49b0: 20 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64    threadsOverrid
49c0: 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73  eEachOthersLocks
49d0: 20 3d 20 20 64 5b 30 5d 2e 72 65 73 75 6c 74 3d   =  d[0].result=
49e0: 3d 30 20 26 26 20 64 5b 31 5d 2e 72 65 73 75 6c  =0 && d[1].resul
49f0: 74 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  t==0;.}.#endif /
4a00: 2a 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  * SQLITE_THREADS
4a10: 41 46 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  AFE */../*.** Re
4a20: 6c 65 61 73 65 20 61 20 6c 6f 63 6b 49 6e 66 6f  lease a lockInfo
4a30: 20 73 74 72 75 63 74 75 72 65 20 70 72 65 76 69   structure previ
4a40: 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  ously allocated 
4a50: 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28  by findLockInfo(
4a60: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
4a70: 64 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66  d releaseLockInf
4a80: 6f 28 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66  o(struct lockInf
4a90: 6f 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 66 20  o *pLock){.  if 
4aa0: 28 70 4c 6f 63 6b 20 3d 3d 20 4e 55 4c 4c 29 0a  (pLock == NULL).
4ab0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 70 4c      return;.  pL
4ac0: 6f 63 6b 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  ock->nRef--;.  i
4ad0: 66 28 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 3d 3d  f( pLock->nRef==
4ae0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
4af0: 48 61 73 68 49 6e 73 65 72 74 28 26 6c 6f 63 6b  HashInsert(&lock
4b00: 48 61 73 68 2c 20 26 70 4c 6f 63 6b 2d 3e 6b 65  Hash, &pLock->ke
4b10: 79 2c 20 73 69 7a 65 6f 66 28 70 4c 6f 63 6b 2d  y, sizeof(pLock-
4b20: 3e 6b 65 79 29 2c 20 30 29 3b 0a 20 20 20 20 73  >key), 0);.    s
4b30: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 63  qlite3_free(pLoc
4b40: 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  k);.  }.}../*.**
4b50: 20 52 65 6c 65 61 73 65 20 61 20 6f 70 65 6e 43   Release a openC
4b60: 6e 74 20 73 74 72 75 63 74 75 72 65 20 70 72 65  nt structure pre
4b70: 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65  viously allocate
4b80: 64 20 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e 66  d by findLockInf
4b90: 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  o()..*/.static v
4ba0: 6f 69 64 20 72 65 6c 65 61 73 65 4f 70 65 6e 43  oid releaseOpenC
4bb0: 6e 74 28 73 74 72 75 63 74 20 6f 70 65 6e 43 6e  nt(struct openCn
4bc0: 74 20 2a 70 4f 70 65 6e 29 7b 0a 20 20 69 66 20  t *pOpen){.  if 
4bd0: 28 70 4f 70 65 6e 20 3d 3d 20 4e 55 4c 4c 29 0a  (pOpen == NULL).
4be0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f      return;.  pO
4bf0: 70 65 6e 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  pen->nRef--;.  i
4c00: 66 28 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 3d 3d  f( pOpen->nRef==
4c10: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
4c20: 48 61 73 68 49 6e 73 65 72 74 28 26 6f 70 65 6e  HashInsert(&open
4c30: 48 61 73 68 2c 20 26 70 4f 70 65 6e 2d 3e 6b 65  Hash, &pOpen->ke
4c40: 79 2c 20 73 69 7a 65 6f 66 28 70 4f 70 65 6e 2d  y, sizeof(pOpen-
4c50: 3e 6b 65 79 29 2c 20 30 29 3b 0a 20 20 20 20 66  >key), 0);.    f
4c60: 72 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64  ree(pOpen->aPend
4c70: 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ing);.    sqlite
4c80: 33 5f 66 72 65 65 28 70 4f 70 65 6e 29 3b 0a 20  3_free(pOpen);. 
4c90: 20 7d 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c   }.}..#ifdef SQL
4ca0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
4cb0: 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54  NG_STYLE./*.** T
4cc0: 65 73 74 73 20 61 20 62 79 74 65 2d 72 61 6e 67  ests a byte-rang
4cd0: 65 20 6c 6f 63 6b 69 6e 67 20 71 75 65 72 79 20  e locking query 
4ce0: 74 6f 20 73 65 65 20 69 66 20 62 79 74 65 20 72  to see if byte r
4cf0: 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 0a  ange locks are .
4d00: 2a 2a 20 73 75 70 70 6f 72 74 65 64 2c 20 69 66  ** supported, if
4d10: 20 6e 6f 74 20 77 65 20 66 61 6c 6c 20 62 61 63   not we fall bac
4d20: 6b 20 74 6f 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b  k to dotlockLock
4d30: 69 6e 67 53 74 79 6c 65 2e 0a 2a 2f 0a 73 74 61  ingStyle..*/.sta
4d40: 74 69 63 20 73 71 6c 69 74 65 33 4c 6f 63 6b 69  tic sqlite3Locki
4d50: 6e 67 53 74 79 6c 65 20 73 71 6c 69 74 65 33 54  ngStyle sqlite3T
4d60: 65 73 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28  estLockingStyle(
4d70: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  .  const char *f
4d80: 69 6c 65 50 61 74 68 2c 20 0a 20 20 69 6e 74 20  ilePath, .  int 
4d90: 66 64 0a 29 7b 0a 20 20 2f 2a 20 74 65 73 74 20  fd.){.  /* test 
4da0: 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20  byte-range lock 
4db0: 75 73 69 6e 67 20 66 63 6e 74 6c 20 2a 2f 0a 20  using fcntl */. 
4dc0: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
4dd0: 63 6b 49 6e 66 6f 3b 0a 20 20 0a 20 20 6c 6f 63  ckInfo;.  .  loc
4de0: 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b  kInfo.l_len = 1;
4df0: 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74  .  lockInfo.l_st
4e00: 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49  art = 0;.  lockI
4e10: 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  nfo.l_whence = S
4e20: 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49  EEK_SET;.  lockI
4e30: 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52  nfo.l_type = F_R
4e40: 44 4c 43 4b 3b 0a 20 20 0a 20 20 69 66 28 20 66  DLCK;.  .  if( f
4e50: 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b  cntl(fd, F_GETLK
4e60: 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31  , &lockInfo)!=-1
4e70: 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20   ) {.    return 
4e80: 70 6f 73 69 78 4c 6f 63 6b 69 6e 67 53 74 79 6c  posixLockingStyl
4e90: 65 3b 0a 20 20 7d 20 0a 20 20 0a 20 20 2f 2a 20  e;.  } .  .  /* 
4ea0: 74 65 73 74 69 6e 67 20 66 6f 72 20 66 6c 6f 63  testing for floc
4eb0: 6b 20 63 61 6e 20 67 69 76 65 20 66 61 6c 73 65  k can give false
4ec0: 20 70 6f 73 69 74 69 76 65 73 2e 20 20 53 6f 20   positives.  So 
4ed0: 69 66 20 69 66 20 74 68 65 20 61 62 6f 76 65 20  if if the above 
4ee0: 74 65 73 74 0a 20 20 2a 2a 20 66 61 69 6c 73 2c  test.  ** fails,
4ef0: 20 74 68 65 6e 20 77 65 20 66 61 6c 6c 20 62 61   then we fall ba
4f00: 63 6b 20 74 6f 20 75 73 69 6e 67 20 64 6f 74 2d  ck to using dot-
4f10: 6c 6f 63 6b 20 73 74 79 6c 65 20 6c 6f 63 6b 69  lock style locki
4f20: 6e 67 2e 0a 20 20 2a 2f 20 20 0a 20 20 72 65 74  ng..  */  .  ret
4f30: 75 72 6e 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69  urn dotlockLocki
4f40: 6e 67 53 74 79 6c 65 3b 0a 7d 0a 0a 2f 2a 20 0a  ngStyle;.}../* .
4f50: 2a 2a 20 45 78 61 6d 69 6e 65 73 20 74 68 65 20  ** Examines the 
4f60: 66 5f 66 73 74 79 70 65 6e 61 6d 65 20 65 6e 74  f_fstypename ent
4f70: 72 79 20 69 6e 20 74 68 65 20 73 74 61 74 66 73  ry in the statfs
4f80: 20 73 74 72 75 63 74 75 72 65 20 61 73 20 72 65   structure as re
4f90: 74 75 72 6e 65 64 20 62 79 20 0a 2a 2a 20 73 74  turned by .** st
4fa0: 61 74 28 29 20 66 6f 72 20 74 68 65 20 66 69 6c  at() for the fil
4fb0: 65 20 73 79 73 74 65 6d 20 68 6f 73 74 69 6e 67  e system hosting
4fc0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
4fd0: 6c 65 2c 20 61 73 73 69 67 6e 73 20 74 68 65 20  le, assigns the 
4fe0: 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20  .** appropriate 
4ff0: 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 62 61  locking style ba
5000: 73 65 64 20 6f 6e 20 69 74 27 73 20 76 61 6c 75  sed on it's 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 27 73 20 6a 6f 75  ase and it's jou
f6d0: 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20  rnal file) that 
f6e0: 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
f6f0: 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73  will be the.** s
f700: 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f  ame for both..*/
f710: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
f720: 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74  SectorSize(sqlit
f730: 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
f740: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45  return SQLITE_DE
f750: 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a  FAULT_SECTOR_SIZ
f760: 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  E;.}../*.** Retu
f770: 72 6e 20 74 68 65 20 64 65 76 69 63 65 20 63 68  rn the device ch
f780: 61 72 61 63 74 65 72 69 73 74 69 63 73 20 66 6f  aracteristics fo
f790: 72 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73  r the file. This
f7a0: 20 69 73 20 61 6c 77 61 79 73 20 30 2e 0a 2a 2f   is always 0..*/
f7b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
f7c0: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
f7d0: 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69  stics(sqlite3_fi
f7e0: 6c 65 20 2a 69 64 29 7b 0a 20 20 72 65 74 75 72  le *id){.  retur
f7f0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
f800: 69 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65  is vector define
f810: 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64  s all the method
f820: 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61  s that can opera
f830: 74 65 20 6f 6e 20 61 6e 20 73 71 6c 69 74 65 33  te on an sqlite3
f840: 5f 66 69 6c 65 0a 2a 2a 20 66 6f 72 20 75 6e 69  _file.** for uni
f850: 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  x..*/.static con
f860: 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
f870: 74 68 6f 64 73 20 73 71 6c 69 74 65 33 55 6e 69  thods sqlite3Uni
f880: 78 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20  xIoMethod = {.  
f890: 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
f8a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
f8b0: 72 73 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78 43  rsion */.  unixC
f8c0: 6c 6f 73 65 2c 0a 20 20 75 6e 69 78 52 65 61 64  lose,.  unixRead
f8d0: 2c 0a 20 20 75 6e 69 78 57 72 69 74 65 2c 0a 20  ,.  unixWrite,. 
f8e0: 20 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 0a 20   unixTruncate,. 
f8f0: 20 75 6e 69 78 53 79 6e 63 2c 0a 20 20 75 6e 69   unixSync,.  uni
f900: 78 46 69 6c 65 53 69 7a 65 2c 0a 20 20 75 6e 69  xFileSize,.  uni
f910: 78 4c 6f 63 6b 2c 0a 20 20 75 6e 69 78 55 6e 6c  xLock,.  unixUnl
f920: 6f 63 6b 2c 0a 20 20 75 6e 69 78 43 68 65 63 6b  ock,.  unixCheck
f930: 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 20 20  ReservedLock,.  
f940: 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c  unixFileControl,
f950: 0a 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a  .  unixSectorSiz
f960: 65 2c 0a 20 20 75 6e 69 78 44 65 76 69 63 65 43  e,.  unixDeviceC
f970: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 0a 7d  haracteristics.}
f980: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
f990: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
f9a0: 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73  STYLE./*.** This
f9b0: 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20   vector defines 
f9c0: 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20  all the methods 
f9d0: 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65  that can operate
f9e0: 20 6f 6e 20 61 6e 20 73 71 6c 69 74 65 33 5f 66   on an sqlite3_f
f9f0: 69 6c 65 0a 2a 2a 20 66 6f 72 20 75 6e 69 78 20  ile.** for unix 
fa00: 77 69 74 68 20 41 46 50 20 73 74 79 6c 65 20 66  with AFP style f
fa10: 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a  ile locking..*/.
fa20: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
fa30: 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
fa40: 73 71 6c 69 74 65 33 41 46 50 4c 6f 63 6b 69 6e  sqlite3AFPLockin
fa50: 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64 20 3d 20  gUnixIoMethod = 
fa60: 7b 0a 20 20 31 2c 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 20 2f 2a                /*
fa80: 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 75   iVersion */.  u
fa90: 6e 69 78 43 6c 6f 73 65 2c 0a 20 20 75 6e 69 78  nixClose,.  unix
faa0: 52 65 61 64 2c 0a 20 20 75 6e 69 78 57 72 69 74  Read,.  unixWrit
fab0: 65 2c 0a 20 20 75 6e 69 78 54 72 75 6e 63 61 74  e,.  unixTruncat
fac0: 65 2c 0a 20 20 75 6e 69 78 53 79 6e 63 2c 0a 20  e,.  unixSync,. 
fad0: 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 0a 20   unixFileSize,. 
fae0: 20 61 66 70 55 6e 69 78 4c 6f 63 6b 2c 0a 20 20   afpUnixLock,.  
faf0: 61 66 70 55 6e 69 78 55 6e 6c 6f 63 6b 2c 0a 20  afpUnixUnlock,. 
fb00: 20 61 66 70 55 6e 69 78 43 68 65 63 6b 52 65 73   afpUnixCheckRes
fb10: 65 72 76 65 64 4c 6f 63 6b 2c 0a 20 20 75 6e 69  ervedLock,.  uni
fb20: 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 0a 20 20  xFileControl,.  
fb30: 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 0a  unixSectorSize,.
fb40: 20 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72    unixDeviceChar
fb50: 61 63 74 65 72 69 73 74 69 63 73 0a 7d 3b 0a 0a  acteristics.};..
fb60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74 6f  /*.** This vecto
fb70: 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68  r defines all th
fb80: 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63  e methods that c
fb90: 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e  an operate on an
fba0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a   sqlite3_file.**
fbb0: 20 66 6f 72 20 75 6e 69 78 20 77 69 74 68 20 66   for unix with f
fbc0: 6c 6f 63 6b 28 29 20 73 74 79 6c 65 20 66 69 6c  lock() style fil
fbd0: 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74  e locking..*/.st
fbe0: 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
fbf0: 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 73 71  e3_io_methods sq
fc00: 6c 69 74 65 33 46 6c 6f 63 6b 4c 6f 63 6b 69 6e  lite3FlockLockin
fc10: 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64 20 3d 20  gUnixIoMethod = 
fc20: 7b 0a 20 20 31 2c 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 20 2f 2a                /*
fc40: 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 66   iVersion */.  f
fc50: 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73 65 2c 0a 20  lockUnixClose,. 
fc60: 20 75 6e 69 78 52 65 61 64 2c 0a 20 20 75 6e 69   unixRead,.  uni
fc70: 78 57 72 69 74 65 2c 0a 20 20 75 6e 69 78 54 72  xWrite,.  unixTr
fc80: 75 6e 63 61 74 65 2c 0a 20 20 75 6e 69 78 53 79  uncate,.  unixSy
fc90: 6e 63 2c 0a 20 20 75 6e 69 78 46 69 6c 65 53 69  nc,.  unixFileSi
fca0: 7a 65 2c 0a 20 20 66 6c 6f 63 6b 55 6e 69 78 4c  ze,.  flockUnixL
fcb0: 6f 63 6b 2c 0a 20 20 66 6c 6f 63 6b 55 6e 69 78  ock,.  flockUnix
fcc0: 55 6e 6c 6f 63 6b 2c 0a 20 20 66 6c 6f 63 6b 55  Unlock,.  flockU
fcd0: 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
fce0: 4c 6f 63 6b 2c 0a 20 20 75 6e 69 78 46 69 6c 65  Lock,.  unixFile
fcf0: 43 6f 6e 74 72 6f 6c 2c 0a 20 20 75 6e 69 78 53  Control,.  unixS
fd00: 65 63 74 6f 72 53 69 7a 65 2c 0a 20 20 75 6e 69  ectorSize,.  uni
fd10: 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  xDeviceCharacter
fd20: 69 73 74 69 63 73 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  istics.};../*.**
fd30: 20 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66   This vector def
fd40: 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74  ines all the met
fd50: 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70  hods that can op
fd60: 65 72 61 74 65 20 6f 6e 20 61 6e 20 73 71 6c 69  erate on an sqli
fd70: 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 66 6f 72 20  te3_file.** for 
fd80: 75 6e 69 78 20 77 69 74 68 20 64 6f 74 6c 6f 63  unix with dotloc
fd90: 6b 20 73 74 79 6c 65 20 66 69 6c 65 20 6c 6f 63  k style file loc
fda0: 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
fdb0: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
fdc0: 5f 6d 65 74 68 6f 64 73 20 73 71 6c 69 74 65 33  _methods sqlite3
fdd0: 44 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 55 6e  DotlockLockingUn
fde0: 69 78 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20  ixIoMethod = {. 
fdf0: 20 31 2c 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 20 2f 2a 20 69 56             /* iV
fe10: 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 64 6f 74 6c  ersion */.  dotl
fe20: 6f 63 6b 55 6e 69 78 43 6c 6f 73 65 2c 0a 20 20  ockUnixClose,.  
fe30: 75 6e 69 78 52 65 61 64 2c 0a 20 20 75 6e 69 78  unixRead,.  unix
fe40: 57 72 69 74 65 2c 0a 20 20 75 6e 69 78 54 72 75  Write,.  unixTru
fe50: 6e 63 61 74 65 2c 0a 20 20 75 6e 69 78 53 79 6e  ncate,.  unixSyn
fe60: 63 2c 0a 20 20 75 6e 69 78 46 69 6c 65 53 69 7a  c,.  unixFileSiz
fe70: 65 2c 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 69 78  e,.  dotlockUnix
fe80: 4c 6f 63 6b 2c 0a 20 20 64 6f 74 6c 6f 63 6b 55  Lock,.  dotlockU
fe90: 6e 69 78 55 6e 6c 6f 63 6b 2c 0a 20 20 64 6f 74  nixUnlock,.  dot
fea0: 6c 6f 63 6b 55 6e 69 78 43 68 65 63 6b 52 65 73  lockUnixCheckRes
feb0: 65 72 76 65 64 4c 6f 63 6b 2c 0a 20 20 75 6e 69  ervedLock,.  uni
fec0: 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 0a 20 20  xFileControl,.  
fed0: 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 0a  unixSectorSize,.
fee0: 20 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72    unixDeviceChar
fef0: 61 63 74 65 72 69 73 74 69 63 73 0a 7d 3b 0a 0a  acteristics.};..
ff00: 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74 6f  /*.** This vecto
ff10: 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68  r defines all th
ff20: 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63  e methods that c
ff30: 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e  an operate on an
ff40: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a   sqlite3_file.**
ff50: 20 66 6f 72 20 75 6e 69 78 20 77 69 74 68 20 64   for unix with d
ff60: 6f 74 6c 6f 63 6b 20 73 74 79 6c 65 20 66 69 6c  otlock style fil
ff70: 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74  e locking..*/.st
ff80: 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
ff90: 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 73 71  e3_io_methods sq
ffa0: 6c 69 74 65 33 4e 6f 6c 6f 63 6b 4c 6f 63 6b 69  lite3NolockLocki
ffb0: 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64 20 3d  ngUnixIoMethod =
ffc0: 20 7b 0a 20 20 31 2c 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 20 2f                 /
ffe0: 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20  * iVersion */.  
fff0: 6e 6f 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73 65 2c  nolockUnixClose,
10000 0a 20 20 75 6e 69 78 52 65 61 64 2c 0a 20 20 75  .  unixRead,.  u
10010 6e 69 78 57 72 69 74 65 2c 0a 20 20 75 6e 69 78  nixWrite,.  unix
10020 54 72 75 6e 63 61 74 65 2c 0a 20 20 75 6e 69 78  Truncate,.  unix
10030 53 79 6e 63 2c 0a 20 20 75 6e 69 78 46 69 6c 65  Sync,.  unixFile
10040 53 69 7a 65 2c 0a 20 20 6e 6f 6c 6f 63 6b 55 6e  Size,.  nolockUn
10050 69 78 4c 6f 63 6b 2c 0a 20 20 6e 6f 6c 6f 63 6b  ixLock,.  nolock
10060 55 6e 69 78 55 6e 6c 6f 63 6b 2c 0a 20 20 6e 6f  UnixUnlock,.  no
10070 6c 6f 63 6b 55 6e 69 78 43 68 65 63 6b 52 65 73  lockUnixCheckRes
10080 65 72 76 65 64 4c 6f 63 6b 2c 0a 20 20 75 6e 69  ervedLock,.  uni
10090 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 0a 20 20  xFileControl,.  
100a0 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 0a  unixSectorSize,.
100b0 20 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72    unixDeviceChar
100c0 61 63 74 65 72 69 73 74 69 63 73 0a 7d 3b 0a 0a  acteristics.};..
100d0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
100e0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
100f0 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  STYLE */../*.** 
10100 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
10110 66 6f 72 20 61 20 6e 65 77 20 75 6e 69 78 46 69  for a new unixFi
10120 6c 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  le and initializ
10130 65 20 74 68 61 74 20 75 6e 69 78 46 69 6c 65 2e  e that unixFile.
10140 0a 2a 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e  .** Write a poin
10150 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 75  ter to the new u
10160 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20 2a 70 49  nixFile into *pI
10170 64 2e 0a 2a 2a 20 49 66 20 77 65 20 72 75 6e 20  d..** If we run 
10180 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2c 20 63  out of memory, c
10190 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 61 6e  lose the file an
101a0 64 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  d return an erro
101b0 72 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  r..*/.#ifdef SQL
101c0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
101d0 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20  NG_STYLE./* .** 
101e0 57 68 65 6e 20 6c 6f 63 6b 69 6e 67 20 65 78 74  When locking ext
101f0 65 6e 73 69 6f 6e 73 20 61 72 65 20 65 6e 61 62  ensions are enab
10200 6c 65 64 2c 20 74 68 65 20 66 69 6c 65 70 61 74  led, the filepat
10210 68 20 61 6e 64 20 6c 6f 63 6b 69 6e 67 20 73 74  h and locking st
10220 79 6c 65 20 0a 2a 2a 20 61 72 65 20 6e 65 65 64  yle .** are need
10230 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
10240 74 68 65 20 75 6e 69 78 46 69 6c 65 20 70 4d 65  the unixFile pMe
10250 74 68 6f 64 20 74 6f 20 75 73 65 20 66 6f 72 20  thod to use for 
10260 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  locking operatio
10270 6e 73 2e 0a 2a 2a 20 54 68 65 20 6c 6f 63 6b 69  ns..** The locki
10280 6e 67 2d 73 74 79 6c 65 20 73 70 65 63 69 66 69  ng-style specifi
10290 63 20 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  c lockingContext
102a0 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
102b0 69 73 20 63 72 65 61 74 65 64 20 0a 2a 2a 20 61  is created .** a
102c0 6e 64 20 61 73 73 69 67 6e 65 64 20 68 65 72 65  nd assigned here
102d0 20 61 6c 73 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   also..*/.static
102e0 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46   int fillInUnixF
102f0 69 6c 65 28 0a 20 20 69 6e 74 20 68 2c 20 20 20  ile(.  int h,   
10300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10310 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63  * Open file desc
10320 72 69 70 74 6f 72 20 6f 66 20 66 69 6c 65 20 62  riptor of file b
10330 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  eing opened */. 
10340 20 69 6e 74 20 64 69 72 66 64 2c 20 20 20 20 20   int dirfd,     
10350 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65           /* Dire
10360 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72  ctory file descr
10370 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74  iptor */.  sqlit
10380 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20  e3_file *pId,   
10390 20 20 20 2f 2a 20 57 72 69 74 65 20 63 6f 6d 70     /* Write comp
103a0 6c 65 74 65 64 20 69 6e 69 74 69 61 6c 69 7a 61  leted initializa
103b0 74 69 6f 6e 20 68 65 72 65 20 2a 2f 0a 20 20 63  tion here */.  c
103c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
103d0 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  name,  /* Name o
103e0 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67  f the file being
103f0 20 6f 70 65 6e 65 64 20 2a 2f 0a 29 7b 0a 20 20   opened */.){.  
10400 73 71 6c 69 74 65 33 4c 6f 63 6b 69 6e 67 53 74  sqlite3LockingSt
10410 79 6c 65 20 6c 6f 63 6b 69 6e 67 53 74 79 6c 65  yle lockingStyle
10420 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  ;.  unixFile *pN
10430 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  ew = (unixFile *
10440 29 70 49 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  )pId;.  int rc;.
10450 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20  .  memset(pNew, 
10460 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69  0, sizeof(unixFi
10470 6c 65 29 29 3b 0a 20 20 6c 6f 63 6b 69 6e 67 53  le));.  lockingS
10480 74 79 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 65  tyle = sqlite3De
10490 74 65 63 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  tectLockingStyle
104a0 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 68 29 3b 0a  (zFilename, h);.
104b0 20 20 69 66 20 28 20 6c 6f 63 6b 69 6e 67 53 74    if ( lockingSt
104c0 79 6c 65 20 3d 3d 20 70 6f 73 69 78 4c 6f 63 6b  yle == posixLock
104d0 69 6e 67 53 74 79 6c 65 20 29 20 7b 0a 20 20 20  ingStyle ) {.   
104e0 20 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20   enterMutex();. 
104f0 20 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b     rc = findLock
10500 49 6e 66 6f 28 68 2c 20 26 70 4e 65 77 2d 3e 70  Info(h, &pNew->p
10510 4c 6f 63 6b 2c 20 26 70 4e 65 77 2d 3e 70 4f 70  Lock, &pNew->pOp
10520 65 6e 29 3b 0a 20 20 20 20 6c 65 61 76 65 4d 75  en);.    leaveMu
10530 74 65 78 28 29 3b 0a 20 20 20 20 69 66 28 20 72  tex();.    if( r
10540 63 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73 65  c ){.      close
10550 28 68 29 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e  (h);.      unlin
10560 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  k(zFilename);.  
10570 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10580 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
10590 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a   } else {.    /*
105a0 20 20 70 4c 6f 63 6b 20 61 6e 64 20 70 4f 70 65    pLock and pOpe
105b0 6e 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20  n are only used 
105c0 66 6f 72 20 70 6f 73 69 78 20 61 64 76 69 73 6f  for posix adviso
105d0 72 79 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20  ry locking */.  
105e0 20 20 70 4e 65 77 2d 3e 70 4c 6f 63 6b 20 3d 20    pNew->pLock = 
105f0 4e 55 4c 4c 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  NULL;.    pNew->
10600 70 4f 70 65 6e 20 3d 20 4e 55 4c 4c 3b 0a 20 20  pOpen = NULL;.  
10610 7d 0a 20 20 70 4e 65 77 2d 3e 64 69 72 66 64 20  }.  pNew->dirfd 
10620 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 68 20  = -1;.  pNew->h 
10630 3d 20 68 3b 0a 20 20 53 45 54 5f 54 48 52 45 41  = h;.  SET_THREA
10640 44 49 44 28 70 4e 65 77 29 3b 0a 20 20 70 4e 65  DID(pNew);.  pNe
10650 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  w = sqlite3_mall
10660 6f 63 28 20 73 69 7a 65 6f 66 28 75 6e 69 78 46  oc( sizeof(unixF
10670 69 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  ile) );.  if( pN
10680 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6c 6f  ew==0 ){.    clo
10690 73 65 28 68 29 3b 0a 20 20 20 20 65 6e 74 65 72  se(h);.    enter
106a0 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 6c  Mutex();.    rel
106b0 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 4e 65  easeLockInfo(pNe
106c0 77 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 72  w->pLock);.    r
106d0 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 70 4e  eleaseOpenCnt(pN
106e0 65 77 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20  ew->pOpen);.    
106f0 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  leaveMutex();.  
10700 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10710 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
10720 20 20 20 20 73 77 69 74 63 68 28 6c 6f 63 6b 69      switch(locki
10730 6e 67 53 74 79 6c 65 29 20 7b 0a 20 20 20 20 20  ngStyle) {.     
10740 20 63 61 73 65 20 61 66 70 4c 6f 63 6b 69 6e 67   case afpLocking
10750 53 74 79 6c 65 3a 20 7b 0a 20 20 20 20 20 20 20  Style: {.       
10760 20 2f 2a 20 61 66 70 20 6c 6f 63 6b 69 6e 67 20   /* afp locking 
10770 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61  uses the file pa
10780 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74  th so it needs t
10790 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e  o be included in
107a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
107b0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
107c0 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  t */.        int
107d0 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20   nFilename;.    
107e0 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f      pNew->pMetho
107f0 64 20 3d 20 26 73 71 6c 69 74 65 33 41 46 50 4c  d = &sqlite3AFPL
10800 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68  ockingUnixIoMeth
10810 6f 64 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  od;.        pNew
10820 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
10830 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 73 71   = .          sq
10840 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
10850 65 6f 66 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  eof(afpLockingCo
10860 6e 74 65 78 74 29 29 3b 0a 20 20 20 20 20 20 20  ntext));.       
10870 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73 74 72   nFilename = str
10880 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31  len(zFilename)+1
10890 3b 0a 20 20 20 20 20 20 20 20 28 28 61 66 70 4c  ;.        ((afpL
108a0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
108b0 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
108c0 74 65 78 74 29 2d 3e 66 69 6c 65 50 61 74 68 20  text)->filePath 
108d0 3d 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  = .          sql
108e0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6c  ite3_malloc(nFil
108f0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ename);.        
10900 6d 65 6d 63 70 79 28 28 28 61 66 70 4c 6f 63 6b  memcpy(((afpLock
10910 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 4e 65  ingContext *)pNe
10920 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
10930 74 29 2d 3e 66 69 6c 65 50 61 74 68 2c 20 0a 20  t)->filePath, . 
10940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 46                zF
10950 69 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c 65 6e 61  ilename, nFilena
10960 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73 72 61  me);.        sra
10970 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20 20 20  ndomdev();.     
10980 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
10990 7d 0a 20 20 20 20 20 20 63 61 73 65 20 66 6c 6f  }.      case flo
109a0 63 6b 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3a 0a  ckLockingStyle:.
109b0 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 6f 63 6b          /* flock
109c0 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 6e 27 74   locking doesn't
109d0 20 6e 65 65 64 20 61 64 64 69 74 69 6f 6e 61 6c   need additional
109e0 20 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20   lockingContext 
109f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
10a00 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65         pNew->pMe
10a10 74 68 6f 64 20 3d 20 26 73 71 6c 69 74 65 33 46  thod = &sqlite3F
10a20 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78 49  lockLockingUnixI
10a30 6f 4d 65 74 68 6f 64 3b 0a 20 20 20 20 20 20 20  oMethod;.       
10a40 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
10a50 73 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  se dotlockLockin
10a60 67 53 74 79 6c 65 3a 20 7b 0a 20 20 20 20 20 20  gStyle: {.      
10a70 20 20 2f 2a 20 64 6f 74 6c 6f 63 6b 20 6c 6f 63    /* dotlock loc
10a80 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69  king uses the fi
10a90 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65  le path so it ne
10aa0 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64  eds to be includ
10ab0 65 64 20 69 6e 0a 20 20 20 20 20 20 20 20 20 2a  ed in.         *
10ac0 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63  * the dotlockLoc
10ad0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 2f 0a 20  kingContext */. 
10ae0 20 20 20 20 20 20 20 69 6e 74 20 6e 46 69 6c 65         int nFile
10af0 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70 4e  name;.        pN
10b00 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 73  ew->pMethod = &s
10b10 71 6c 69 74 65 33 44 6f 74 6c 6f 63 6b 4c 6f 63  qlite3DotlockLoc
10b20 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64  kingUnixIoMethod
10b30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
10b40 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
10b50 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
10b60 0a 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f  .          sizeo
10b70 66 28 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  f(dotlockLocking
10b80 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 20 20 20  Context));.     
10b90 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73     nFilename = s
10ba0 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29  trlen(zFilename)
10bb0 20 2b 20 36 3b 0a 20 20 20 20 20 20 20 20 28 28   + 6;.        ((
10bc0 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  dotlockLockingCo
10bd0 6e 74 65 78 74 20 2a 29 70 4e 65 77 2d 3e 6c 6f  ntext *)pNew->lo
10be0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 6c  ckingContext)->l
10bf0 6f 63 6b 50 61 74 68 20 3d 20 0a 20 20 20 20 20  ockPath = .     
10c00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
10c10 61 6c 6c 6f 63 28 20 6e 46 69 6c 65 6e 61 6d 65  alloc( nFilename
10c20 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
10c30 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46 69  te3_snprintf(nFi
10c40 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  lename, .       
10c50 20 20 20 20 20 20 20 20 20 28 28 64 6f 74 6c 6f           ((dotlo
10c60 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ckLockingContext
10c70 20 2a 29 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67   *)pNew->locking
10c80 43 6f 6e 74 65 78 74 29 2d 3e 6c 6f 63 6b 50 61  Context)->lockPa
10c90 74 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  th, .           
10ca0 20 20 20 20 20 22 25 73 2e 6c 6f 63 6b 22 2c 20       "%s.lock", 
10cb0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
10cc0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
10cd0 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 70 6f   }.      case po
10ce0 73 69 78 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3a  sixLockingStyle:
10cf0 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 6f 73 69  .        /* posi
10d00 78 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 6e 27  x locking doesn'
10d10 74 20 6e 65 65 64 20 61 64 64 69 74 69 6f 6e 61  t need additiona
10d20 6c 20 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  l lockingContext
10d30 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
10d40 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4d          pNew->pM
10d50 65 74 68 6f 64 20 3d 20 26 73 71 6c 69 74 65 33  ethod = &sqlite3
10d60 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a 20 20  UnixIoMethod;.  
10d70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10d80 20 20 20 63 61 73 65 20 6e 6f 4c 6f 63 6b 69 6e     case noLockin
10d90 67 53 74 79 6c 65 3a 0a 20 20 20 20 20 20 63 61  gStyle:.      ca
10da0 73 65 20 75 6e 73 75 70 70 6f 72 74 65 64 4c 6f  se unsupportedLo
10db0 63 6b 69 6e 67 53 74 79 6c 65 3a 0a 20 20 20 20  ckingStyle:.    
10dc0 20 20 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20    default: .    
10dd0 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f      pNew->pMetho
10de0 64 20 3d 20 26 73 71 6c 69 74 65 33 4e 6f 6c 6f  d = &sqlite3Nolo
10df0 63 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d  ckLockingUnixIoM
10e00 65 74 68 6f 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ethod;.    }.   
10e10 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29   OpenCounter(+1)
10e20 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
10e30 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 23 65  ITE_OK;.  }.}.#e
10e40 6c 73 65 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  lse /* SQLITE_EN
10e50 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
10e60 4c 45 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  LE */.static int
10e70 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
10e80 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20  .  int h,       
10e90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
10ea0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
10eb0 72 20 6f 6e 20 66 69 6c 65 20 62 65 69 6e 67 20  r on file being 
10ec0 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20  opened */.  int 
10ed0 64 69 72 66 64 2c 0a 20 20 73 71 6c 69 74 65 33  dirfd,.  sqlite3
10ee0 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20  _file *pId,     
10ef0 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20  /* Write to the 
10f00 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
10f10 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
10f20 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
10f30 6d 65 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  me  /* Name of t
10f40 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  he file being op
10f50 65 6e 65 64 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69  ened */.){.  uni
10f60 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75  xFile *pNew = (u
10f70 6e 69 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20  nixFile *)pId;. 
10f80 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 64 65 66   int rc;..#ifdef
10f90 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20 66 63   FD_CLOEXEC.  fc
10fa0 6e 74 6c 28 68 2c 20 46 5f 53 45 54 46 44 2c 20  ntl(h, F_SETFD, 
10fb0 66 63 6e 74 6c 28 68 2c 20 46 5f 47 45 54 46 44  fcntl(h, F_GETFD
10fc0 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45  , 0) | FD_CLOEXE
10fd0 43 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6e  C);.#endif..  en
10fe0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 72 63  terMutex();.  rc
10ff0 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28   = findLockInfo(
11000 68 2c 20 26 70 4e 65 77 2d 3e 70 4c 6f 63 6b 2c  h, &pNew->pLock,
11010 20 26 70 4e 65 77 2d 3e 70 4f 70 65 6e 29 3b 0a   &pNew->pOpen);.
11020 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a    leaveMutex();.
11030 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
11040 63 6c 6f 73 65 28 68 29 3b 0a 20 20 20 20 72 65  close(h);.    re
11050 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
11060 4d 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43  M;.  }..  OSTRAC
11070 45 33 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64  E3("OPEN    %-3d
11080 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65   %s\n", h, zFile
11090 6e 61 6d 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 64  name);.  pNew->d
110a0 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  irfd = -1;.  pNe
110b0 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e 65 77  w->h = h;.  pNew
110c0 2d 3e 64 69 72 66 64 20 3d 20 64 69 72 66 64 3b  ->dirfd = dirfd;
110d0 0a 20 20 53 45 54 5f 54 48 52 45 41 44 49 44 28  .  SET_THREADID(
110e0 70 4e 65 77 29 3b 0a 0a 20 20 70 4e 65 77 2d 3e  pNew);..  pNew->
110f0 70 4d 65 74 68 6f 64 20 3d 20 26 73 71 6c 69 74  pMethod = &sqlit
11100 65 33 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a  e3UnixIoMethod;.
11110 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31    OpenCounter(+1
11120 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
11130 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
11140 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
11150 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
11160 2f 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  /../*.** Open a 
11170 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
11180 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  to the directory
11190 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c 65   containing file
111a0 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49   zFilename..** I
111b0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70  f successful, *p
111c0 46 64 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  Fd is set to the
111d0 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64 65 73   opened file des
111e0 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20 53  criptor and.** S
111f0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
11200 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  rned. If an erro
11210 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68 65 72  r occurs, either
11220 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a   SQLITE_NOMEM.**
11230 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f   or SQLITE_CANTO
11240 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64 20  PEN is returned 
11250 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65 74 20  and *pFd is set 
11260 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65 64 0a  to an undefined.
11270 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  ** value..**.** 
11280 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
11290 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61  returned, the ca
112a0 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
112b0 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a  ble for closing.
112c0 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ** the file desc
112d0 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73 69 6e  riptor *pFd usin
112e0 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74  g close()..*/.st
112f0 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72  atic int openDir
11300 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61  ectory(const cha
11310 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e  r *zFilename, in
11320 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 69  t *pFd){.  int i
11330 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31  i;.  int fd = -1
11340 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e 61 6d  ;.  char zDirnam
11350 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  e[MAX_PATHNAME+1
11360 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
11370 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e  printf(MAX_PATHN
11380 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22  AME, zDirname, "
11390 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  %s", zFilename);
113a0 0a 20 20 66 6f 72 28 69 69 3d 73 74 72 6c 65 6e  .  for(ii=strlen
113b0 28 7a 44 69 72 6e 61 6d 65 29 3b 20 69 69 3e 3d  (zDirname); ii>=
113c0 30 20 26 26 20 7a 44 69 72 6e 61 6d 65 5b 69 69  0 && zDirname[ii
113d0 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20  ]!='/'; ii--);. 
113e0 20 69 66 28 20 69 69 3e 30 20 29 7b 0a 20 20 20   if( ii>0 ){.   
113f0 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 20 3d 20   zDirname[ii] = 
11400 27 5c 30 27 3b 0a 20 20 20 20 66 64 20 3d 20 6f  '\0';.    fd = o
11410 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f  pen(zDirname, O_
11420 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c  RDONLY|O_BINARY,
11430 20 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3e   0);.    if( fd>
11440 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 46 44 5f  =0 ){.#ifdef FD_
11450 43 4c 4f 45 58 45 43 0a 20 20 20 20 20 20 66 63  CLOEXEC.      fc
11460 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c  ntl(fd, F_SETFD,
11470 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54   fcntl(fd, F_GET
11480 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45  FD, 0) | FD_CLOE
11490 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  XEC);.#endif.   
114a0 20 20 20 4f 53 54 52 41 43 45 33 28 22 4f 50 45     OSTRACE3("OPE
114b0 4e 44 49 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c  NDIR %-3d %s\n",
114c0 20 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29 3b 0a   fd, zDirname);.
114d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 46 64      }.  }.  *pFd
114e0 20 3d 20 66 64 3b 0a 20 20 72 65 74 75 72 6e 20   = fd;.  return 
114f0 28 66 64 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b  (fd>=0?SQLITE_OK
11500 3a 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  :SQLITE_CANTOPEN
11510 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  );.}../*.** Open
11520 20 74 68 65 20 66 69 6c 65 20 7a 50 61 74 68 2e   the file zPath.
11530 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73  .** .** Previous
11540 6c 79 2c 20 74 68 65 20 53 51 4c 69 74 65 20 4f  ly, the SQLite O
11550 53 20 6c 61 79 65 72 20 75 73 65 64 20 74 68 72  S layer used thr
11560 65 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20  ee functions in 
11570 70 6c 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a  place of this.**
11580 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20   one:.**.**     
11590 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
115a0 64 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20  dWrite();.**    
115b0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
115c0 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20  adOnly();.**    
115d0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78   sqlite3OsOpenEx
115e0 63 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a  clusive();.**.**
115f0 20 54 68 65 73 65 20 63 61 6c 6c 73 20 63 6f 72   These calls cor
11600 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66  respond to the f
11610 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61  ollowing combina
11620 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a  tions of flags:.
11630 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72  **.**     ReadWr
11640 69 74 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45  ite() ->     (RE
11650 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45  ADWRITE | CREATE
11660 29 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c  ).**     ReadOnl
11670 79 28 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41  y()  ->     (REA
11680 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f  DONLY) .**     O
11690 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d  penExclusive() -
116a0 3e 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43  > (READWRITE | C
116b0 52 45 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56  REATE | EXCLUSIV
116c0 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64  E).**.** The old
116d0 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29   OpenExclusive()
116e0 20 61 63 63 65 70 74 65 64 20 61 20 62 6f 6f 6c   accepted a bool
116f0 65 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20 22  ean argument - "
11700 64 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20  delFlag". If.** 
11710 74 72 75 65 2c 20 74 68 65 20 66 69 6c 65 20 77  true, the file w
11720 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  as configured to
11730 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   be automaticall
11740 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74  y deleted when t
11750 68 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c  he.** file handl
11760 65 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68  e closed. To ach
11770 69 65 76 65 20 74 68 65 20 73 61 6d 65 20 65 66  ieve the same ef
11780 66 65 63 74 20 75 73 69 6e 67 20 74 68 69 73 20  fect using this 
11790 6e 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63  new .** interfac
117a0 65 2c 20 61 64 64 20 74 68 65 20 44 45 4c 45 54  e, add the DELET
117b0 45 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f  EONCLOSE flag to
117c0 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64   those specified
117d0 20 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f   above for .** O
117e0 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 2e 0a  penExclusive()..
117f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
11800 69 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  ixOpen(.  sqlite
11810 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a 20 20  3_vfs *pVfs, .  
11820 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
11830 68 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  h, .  sqlite3_fi
11840 6c 65 20 2a 70 46 69 6c 65 2c 0a 20 20 69 6e 74  le *pFile,.  int
11850 20 66 6c 61 67 73 2c 0a 20 20 69 6e 74 20 2a 70   flags,.  int *p
11860 4f 75 74 46 6c 61 67 73 0a 29 7b 0a 20 20 69 6e  OutFlags.){.  in
11870 74 20 66 64 20 3d 20 30 3b 20 20 20 20 20 20 20  t fd = 0;       
11880 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11890 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
118a0 72 65 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e  returned by open
118b0 28 29 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66  () */.  int dirf
118c0 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  d = -1;         
118d0 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74         /* Direct
118e0 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  ory file descrip
118f0 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 6c  tor */.  int ofl
11900 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ags = 0;        
11910 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
11920 20 74 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e   to pass to open
11930 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70  () */.  int eTyp
11940 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46  e = flags&0xFFFF
11950 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f  FF00;  /* Type o
11960 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  f file to open *
11970 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75  /..  int isExclu
11980 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26  sive  = (flags &
11990 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
119a0 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69  LUSIVE);.  int i
119b0 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66  sDelete     = (f
119c0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
119d0 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
119e0 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74  );.  int isCreat
119f0 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26  e     = (flags &
11a00 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
11a10 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65  ATE);.  int isRe
11a20 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67  adonly   = (flag
11a30 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
11a40 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74  READONLY);.  int
11a50 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d 20   isReadWrite  = 
11a60 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
11a70 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b  OPEN_READWRITE);
11a80 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69  ..  /* If creati
11a90 6e 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d  ng a master or m
11aa0 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c  ain-file journal
11ab0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
11ac0 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61  will open.  ** a
11ad0 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
11ae0 20 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72   on the director
11af0 79 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74  y too. The first
11b00 20 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29   time unixSync()
11b10 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  .  ** is called 
11b20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69  the directory fi
11b30 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69  le descriptor wi
11b40 6c 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64 20  ll be fsync()ed 
11b50 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20  and close()d..  
11b60 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 44  */.  int isOpenD
11b70 69 72 65 63 74 6f 72 79 20 3d 20 28 69 73 43 72  irectory = (isCr
11b80 65 61 74 65 20 26 26 20 0a 20 20 20 20 20 20 28  eate && .      (
11b90 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
11ba0 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
11bb0 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  L || eType==SQLI
11bc0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
11bd0 52 4e 41 4c 29 0a 20 20 29 3b 0a 0a 20 20 2f 2a  RNAL).  );..  /*
11be0 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f   Check the follo
11bf0 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
11c00 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a  are true: .  **.
11c10 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74    **   (a) Exact
11c20 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45  ly one of the RE
11c30 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44  ADWRITE and READ
11c40 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20  ONLY flags must 
11c50 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a  be set, and .  *
11c60 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54  *   (b) if CREAT
11c70 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52  E is set, then R
11c80 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c  EADWRITE must al
11c90 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20  so be set, and. 
11ca0 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43   **   (c) if EXC
11cb0 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74  LUSIVE is set, t
11cc0 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
11cd0 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
11ce0 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54  *   (d) if DELET
11cf0 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c  EONCLOSE is set,
11d00 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
11d10 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
11d20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73   */.  assert((is
11d30 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69  Readonly==0 || i
11d40 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26  sReadWrite==0) &
11d50 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c  & (isReadWrite |
11d60 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a  | isReadonly));.
11d70 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74    assert(isCreat
11d80 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  e==0 || isReadWr
11d90 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ite);.  assert(i
11da0 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c  sExclusive==0 ||
11db0 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73   isCreate);.  as
11dc0 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30  sert(isDelete==0
11dd0 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a   || isCreate);..
11de0 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44  .  /* The main D
11df0 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c  B, main journal,
11e00 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72   and master jour
11e10 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 61 75  nal are never au
11e20 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a  tomatically.  **
11e30 20 64 65 6c 65 74 65 64 0a 20 20 2a 2f 0a 20 20   deleted.  */.  
11e40 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 53  assert( eType!=S
11e50 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
11e60 44 42 20 7c 7c 20 21 69 73 44 65 6c 65 74 65 20  DB || !isDelete 
11e70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  );.  assert( eTy
11e80 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
11e90 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20  MAIN_JOURNAL || 
11ea0 21 69 73 44 65 6c 65 74 65 20 29 3b 0a 20 20 61  !isDelete );.  a
11eb0 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 53 51  ssert( eType!=SQ
11ec0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
11ed0 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 21 69 73 44  _JOURNAL || !isD
11ee0 65 6c 65 74 65 20 29 3b 0a 0a 20 20 2f 2a 20 41  elete );..  /* A
11ef0 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 75  ssert that the u
11f00 70 70 65 72 20 6c 61 79 65 72 20 68 61 73 20 73  pper layer has s
11f10 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66  et one of the "f
11f20 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e  ile-type" flags.
11f30 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54   */.  assert( eT
11f40 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
11f50 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c  _MAIN_DB      ||
11f60 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
11f70 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20  PEN_TEMP_DB .   
11f80 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
11f90 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
11fa0 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d  OURNAL || eType=
11fb0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  =SQLITE_OPEN_TEM
11fc0 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  P_JOURNAL .     
11fd0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
11fe0 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
11ff0 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53  AL   || eType==S
12000 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
12010 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  R_JOURNAL .     
12020 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
12030 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e  TE_OPEN_TRANSIEN
12040 54 5f 44 42 0a 20 20 29 3b 0a 0a 20 20 69 66 28  T_DB.  );..  if(
12050 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f   isReadonly )  o
12060 66 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c  flags |= O_RDONL
12070 59 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 57  Y;.  if( isReadW
12080 72 69 74 65 20 29 20 6f 66 6c 61 67 73 20 7c 3d  rite ) oflags |=
12090 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66 28 20 69   O_RDWR;.  if( i
120a0 73 43 72 65 61 74 65 20 29 20 20 20 20 6f 66 6c  sCreate )    ofl
120b0 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a  ags |= O_CREAT;.
120c0 20 20 69 66 28 20 69 73 45 78 63 6c 75 73 69 76    if( isExclusiv
120d0 65 20 29 20 6f 66 6c 61 67 73 20 7c 3d 20 28 4f  e ) oflags |= (O
120e0 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57  _EXCL|O_NOFOLLOW
120f0 29 3b 0a 20 20 6f 66 6c 61 67 73 20 7c 3d 20 28  );.  oflags |= (
12100 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49  O_LARGEFILE|O_BI
12110 4e 41 52 59 29 3b 0a 0a 20 20 6d 65 6d 73 65 74  NARY);..  memset
12120 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f  (pFile, 0, sizeo
12130 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20  f(unixFile));.  
12140 66 64 20 3d 20 6f 70 65 6e 28 7a 50 61 74 68 2c  fd = open(zPath,
12150 20 6f 66 6c 61 67 73 2c 20 69 73 44 65 6c 65 74   oflags, isDelet
12160 65 3f 30 36 30 30 3a 53 51 4c 49 54 45 5f 44 45  e?0600:SQLITE_DE
12170 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
12180 53 53 49 4f 4e 53 29 3b 0a 20 20 69 66 28 20 66  SSIONS);.  if( f
12190 64 3c 30 20 26 26 20 65 72 72 6e 6f 21 3d 45 49  d<0 && errno!=EI
121a0 53 44 49 52 20 26 26 20 69 73 52 65 61 64 57 72  SDIR && isReadWr
121b0 69 74 65 20 26 26 20 21 69 73 45 78 63 6c 75 73  ite && !isExclus
121c0 69 76 65 20 29 7b 0a 20 20 20 20 2f 2a 20 46 61  ive ){.    /* Fa
121d0 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65  iled to open the
121e0 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2f 77   file for read/w
121f0 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 72 79  rite access. Try
12200 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20   read-only. */. 
12210 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51     flags &= ~(SQ
12220 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
12230 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
12240 43 52 45 41 54 45 29 3b 0a 20 20 20 20 66 6c 61  CREATE);.    fla
12250 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
12260 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  N_READONLY;.    
12270 72 65 74 75 72 6e 20 75 6e 69 78 4f 70 65 6e 28  return unixOpen(
12280 70 56 66 73 2c 20 7a 50 61 74 68 2c 20 70 46 69  pVfs, zPath, pFi
12290 6c 65 2c 20 66 6c 61 67 73 2c 20 70 4f 75 74 46  le, flags, pOutF
122a0 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  lags);.  }.  if(
122b0 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 72 65 74   fd<0 ){.    ret
122c0 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
122d0 50 45 4e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  PEN;.  }.  if( i
122e0 73 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 75  sDelete ){.    u
122f0 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3b 0a 20 20  nlink(zPath);.  
12300 7d 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67  }.  if( pOutFlag
12310 73 20 29 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c  s ){.    *pOutFl
12320 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d  ags = flags;.  }
12330 0a 0a 20 20 61 73 73 65 72 74 28 66 64 21 3d 30  ..  assert(fd!=0
12340 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 44  );.  if( isOpenD
12350 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20  irectory ){.    
12360 69 6e 74 20 72 63 20 3d 20 6f 70 65 6e 44 69 72  int rc = openDir
12370 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 64  ectory(zPath, &d
12380 69 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72  irfd);.    if( r
12390 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
123a0 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b        close(fd);
123b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
123c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
123d0 74 75 72 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46  turn fillInUnixF
123e0 69 6c 65 28 66 64 2c 20 64 69 72 66 64 2c 20 70  ile(fd, dirfd, p
123f0 46 69 6c 65 2c 20 7a 50 61 74 68 29 3b 0a 7d 0a  File, zPath);.}.
12400 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
12410 65 20 66 69 6c 65 20 61 74 20 7a 50 61 74 68 2e  e file at zPath.
12420 20 49 66 20 74 68 65 20 64 69 72 53 79 6e 63 20   If the dirSync 
12430 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65  argument is true
12440 2c 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65  , fsync().** the
12450 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72   directory after
12460 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69   deleting the fi
12470 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
12480 74 20 75 6e 69 78 44 65 6c 65 74 65 28 73 71 6c  t unixDelete(sql
12490 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
124a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
124b0 68 2c 20 69 6e 74 20 64 69 72 53 79 6e 63 29 7b  h, int dirSync){
124c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
124d0 54 45 5f 4f 4b 3b 0a 20 20 53 69 6d 75 6c 61 74  TE_OK;.  Simulat
124e0 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
124f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
12500 45 54 45 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28 7a  ETE);.  unlink(z
12510 50 61 74 68 29 3b 0a 20 20 69 66 28 20 64 69 72  Path);.  if( dir
12520 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 6e 74 20  Sync ){.    int 
12530 66 64 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65  fd;.    rc = ope
12540 6e 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68  nDirectory(zPath
12550 2c 20 26 66 64 29 3b 0a 20 20 20 20 69 66 28 20  , &fd);.    if( 
12560 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
12570 0a 20 20 20 20 20 20 69 66 28 20 66 73 79 6e 63  .      if( fsync
12580 28 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (fd) ){.        
12590 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
125a0 52 5f 44 49 52 5f 46 53 59 4e 43 3b 0a 20 20 20  R_DIR_FSYNC;.   
125b0 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 6f 73 65     }.      close
125c0 28 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (fd);.    }.  }.
125d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
125e0 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 65  /*.** Test the e
125f0 78 69 73 74 61 6e 63 65 20 6f 66 20 6f 72 20 61  xistance of or a
12600 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e  ccess permission
12610 73 20 6f 66 20 66 69 6c 65 20 7a 50 61 74 68 2e  s of file zPath.
12620 20 54 68 65 0a 2a 2a 20 74 65 73 74 20 70 65 72   The.** test per
12630 66 6f 72 6d 65 64 20 64 65 70 65 6e 64 73 20 6f  formed depends o
12640 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 66  n the value of f
12650 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lags:.**.**     
12660 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
12670 49 53 54 53 3a 20 52 65 74 75 72 6e 20 31 20 69  ISTS: Return 1 i
12680 66 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74  f the file exist
12690 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  s.**     SQLITE_
126a0 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
126b0 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  : Return 1 if th
126c0 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 20 61  e file is read a
126d0 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2a 20  nd writable..** 
126e0 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53      SQLITE_ACCES
126f0 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74 75  S_READONLY: Retu
12700 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65  rn 1 if the file
12710 20 69 73 20 72 65 61 64 61 62 6c 65 2e 0a 2a 2a   is readable..**
12720 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 72 65  .** Otherwise re
12730 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
12740 63 20 69 6e 74 20 75 6e 69 78 41 63 63 65 73 73  c int unixAccess
12750 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
12760 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  fs, const char *
12770 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c 61 67 73  zPath, int flags
12780 29 7b 0a 20 20 69 6e 74 20 61 6d 6f 64 65 20 3d  ){.  int amode =
12790 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c   0;.  switch( fl
127a0 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ags ){.    case 
127b0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
127c0 49 53 54 53 3a 0a 20 20 20 20 20 20 61 6d 6f 64  ISTS:.      amod
127d0 65 20 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20 20 20  e = F_OK;.      
127e0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
127f0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
12800 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20 61  ADWRITE:.      a
12810 6d 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b  mode = W_OK|R_OK
12820 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
12830 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
12840 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20  CCESS_READ:.    
12850 20 20 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b 0a    amode = R_OK;.
12860 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
12870 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
12880 20 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69   assert(!"Invali
12890 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74  d flags argument
128a0 22 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ");.  }.  return
128b0 20 28 61 63 63 65 73 73 28 7a 50 61 74 68 2c 20   (access(zPath, 
128c0 61 6d 6f 64 65 29 3d 3d 30 29 3b 0a 7d 0a 0a 2f  amode)==0);.}../
128d0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65  *.** Create a te
128e0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  mporary file nam
128f0 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66  e in zBuf.  zBuf
12900 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74   must be allocat
12910 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  ed.** by the cal
12920 6c 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64  ling process and
12930 20 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f   must be big eno
12940 75 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c  ugh to hold at l
12950 65 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78  east.** pVfs->mx
12960 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a  Pathname bytes..
12970 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
12980 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 73 71  ixGetTempname(sq
12990 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
129a0 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
129b0 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63  *zBuf){.  static
129c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44   const char *azD
129d0 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30  irs[] = {.     0
129e0 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70  ,.     "/var/tmp
129f0 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f 74 6d  ",.     "/usr/tm
12a00 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c  p",.     "/tmp",
12a10 0a 20 20 20 20 20 22 2e 22 2c 0a 20 20 7d 3b 0a  .     ".",.  };.
12a20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
12a30 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 43 68  nsigned char zCh
12a40 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63  ars[] =.    "abc
12a50 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
12a60 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42  tuvwxyz".    "AB
12a70 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
12a80 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30  STUVWXYZ".    "0
12a90 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 69 6e  123456789";.  in
12aa0 74 20 69 2c 20 6a 3b 0a 20 20 73 74 72 75 63 74  t i, j;.  struct
12ab0 20 73 74 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e   stat buf;.  con
12ac0 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20  st char *zDir = 
12ad0 22 2e 22 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20  ".";..  /* It's 
12ae0 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
12af0 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
12b00 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
12b10 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
12b20 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
12b30 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
12b40 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
12b50 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
12b60 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
12b70 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20  failing. .  */. 
12b80 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
12b90 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
12ba0 45 52 52 4f 52 20 29 3b 0a 0a 20 20 61 7a 44 69  ERROR );..  azDi
12bb0 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f  rs[0] = sqlite3_
12bc0 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a  temp_directory;.
12bd0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
12be0 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65  eof(azDirs)/size
12bf0 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 69  of(azDirs[0]); i
12c00 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 7a 44  ++){.    if( azD
12c10 69 72 73 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74  irs[i]==0 ) cont
12c20 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 74  inue;.    if( st
12c30 61 74 28 61 7a 44 69 72 73 5b 69 5d 2c 20 26 62  at(azDirs[i], &b
12c40 75 66 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  uf) ) continue;.
12c50 20 20 20 20 69 66 28 20 21 53 5f 49 53 44 49 52      if( !S_ISDIR
12c60 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20  (buf.st_mode) ) 
12c70 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
12c80 28 20 61 63 63 65 73 73 28 61 7a 44 69 72 73 5b  ( access(azDirs[
12c90 69 5d 2c 20 30 37 29 20 29 20 63 6f 6e 74 69 6e  i], 07) ) contin
12ca0 75 65 3b 0a 20 20 20 20 7a 44 69 72 20 3d 20 61  ue;.    zDir = a
12cb0 7a 44 69 72 73 5b 69 5d 3b 0a 20 20 20 20 62 72  zDirs[i];.    br
12cc0 65 61 6b 3b 0a 20 20 7d 0a 20 20 64 6f 7b 0a 20  eak;.  }.  do{. 
12cd0 20 20 20 61 73 73 65 72 74 28 20 70 56 66 73 2d     assert( pVfs-
12ce0 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58  >mxPathname==MAX
12cf0 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20 20  _PATHNAME );.   
12d00 20 61 73 73 65 72 74 28 20 6e 42 75 66 3e 3d 4d   assert( nBuf>=M
12d10 41 58 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20  AX_PATHNAME );. 
12d20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
12d30 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ntf(MAX_PATHNAME
12d40 2d 31 37 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22  -17, zBuf, "%s/"
12d50 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
12d60 5f 50 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a  _PREFIX, zDir);.
12d70 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e 28 7a      j = strlen(z
12d80 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Buf);.    sqlite
12d90 33 52 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20  3Randomness(15, 
12da0 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66  &zBuf[j]);.    f
12db0 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b  or(i=0; i<15; i+
12dc0 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a  +, j++){.      z
12dd0 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a  Buf[j] = (char)z
12de0 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65  Chars[ ((unsigne
12df0 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25  d char)zBuf[j])%
12e00 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d  (sizeof(zChars)-
12e10 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  1) ];.    }.    
12e20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d  zBuf[j] = 0;.  }
12e30 77 68 69 6c 65 28 20 61 63 63 65 73 73 28 7a 42  while( access(zB
12e40 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65  uf,0)==0 );.  re
12e50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12e60 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61  }.../*.** Turn a
12e70 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
12e80 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70  me into a full p
12e90 61 74 68 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c  athname. The rel
12ea0 61 74 69 76 65 20 70 61 74 68 0a 2a 2a 20 69 73  ative path.** is
12eb0 20 73 74 6f 72 65 64 20 61 73 20 61 20 6e 75 6c   stored as a nul
12ec0 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
12ed0 6e 67 20 69 6e 20 74 68 65 20 62 75 66 66 65 72  ng in the buffer
12ee0 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a   pointed to by.*
12ef0 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20  * zPath. .**.** 
12f00 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  zOut points to a
12f10 20 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65   buffer of at le
12f20 61 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 2e  ast sqlite3_vfs.
12f30 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73  mxPathname bytes
12f40 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20 63 61   .** (in this ca
12f50 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45  se, MAX_PATHNAME
12f60 20 62 79 74 65 73 29 2e 20 54 68 65 20 66 75 6c   bytes). The ful
12f70 6c 2d 70 61 74 68 20 69 73 20 77 72 69 74 74 65  l-path is writte
12f80 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66  n to.** this buf
12f90 66 65 72 20 62 65 66 6f 72 65 20 72 65 74 75 72  fer before retur
12fa0 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
12fb0 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61 74 68  int unixFullPath
12fc0 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  name(.  sqlite3_
12fd0 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
12fe0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
12ff0 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a   to vfs object *
13000 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
13010 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
13020 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65    /* Possibly re
13030 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74  lative input pat
13040 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c  h */.  int nOut,
13050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13060 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
13070 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e  output buffer in
13080 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72   bytes */.  char
13090 20 2a 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20   *zOut          
130a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
130b0 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b  put buffer */.){
130c0 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20  ..  /* It's odd 
130d0 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69  to simulate an i
130e0 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75  o-error here, bu
130f0 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73  t really this is
13100 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67   just.  ** using
13110 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e   the io-error in
13120 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20  frastructure to 
13130 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65  test that SQLite
13140 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20   handles this.  
13150 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c  ** function fail
13160 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ing. This functi
13170 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66  on could fail if
13180 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  , for example, t
13190 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
131a0 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6c 79  working directly
131b0 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b   has been unlink
131c0 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ed..  */.  Simul
131d0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
131e0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
131f0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 56  );..  assert( pV
13200 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d  fs->mxPathname==
13210 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a  MAX_PATHNAME );.
13220 20 20 7a 4f 75 74 5b 4d 41 58 5f 50 41 54 48 4e    zOut[MAX_PATHN
13230 41 4d 45 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20  AME-1] = '\0';. 
13240 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27   if( zPath[0]=='
13250 2f 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  /' ){.    sqlite
13260 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50  3_snprintf(MAX_P
13270 41 54 48 4e 41 4d 45 2c 20 7a 4f 75 74 2c 20 22  ATHNAME, zOut, "
13280 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d  %s", zPath);.  }
13290 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43  else{.    int nC
132a0 77 64 3b 0a 20 20 20 20 69 66 28 20 67 65 74 63  wd;.    if( getc
132b0 77 64 28 7a 4f 75 74 2c 20 4d 41 58 5f 50 41 54  wd(zOut, MAX_PAT
132c0 48 4e 41 4d 45 2d 31 29 3d 3d 30 20 29 7b 0a 20  HNAME-1)==0 ){. 
132d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
132e0 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20  TE_CANTOPEN;.   
132f0 20 7d 0a 20 20 20 20 6e 43 77 64 20 3d 20 73 74   }.    nCwd = st
13300 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20 20 20 20  rlen(zOut);.    
13310 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
13320 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2d 6e 43  (MAX_PATHNAME-nC
13330 77 64 2c 20 26 7a 4f 75 74 5b 6e 43 77 64 5d 2c  wd, &zOut[nCwd],
13340 20 22 2f 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a   "/%s", zPath);.
13350 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
13360 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 20 30 0a 20  ITE_OK;..#if 0. 
13370 20 2f 2a 0a 20 20 2a 2a 20 52 65 6d 6f 76 65 20   /*.  ** Remove 
13380 22 2f 2e 2f 22 20 70 61 74 68 20 65 6c 65 6d 65  "/./" path eleme
13390 6e 74 73 20 61 6e 64 20 63 6f 6e 76 65 72 74 20  nts and convert 
133a0 22 2f 41 2f 2e 2f 22 20 70 61 74 68 20 65 6c 65  "/A/./" path ele
133b0 6d 65 6e 74 73 0a 20 20 2a 2a 20 74 6f 20 6a 75  ments.  ** to ju
133c0 73 74 20 22 2f 22 2e 0a 20 20 2a 2f 0a 20 20 69  st "/"..  */.  i
133d0 66 28 20 7a 46 75 6c 6c 20 29 7b 0a 20 20 20 20  f( zFull ){.    
133e0 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f  int i, j;.    fo
133f0 72 28 69 3d 6a 3d 30 3b 20 7a 46 75 6c 6c 5b 69  r(i=j=0; zFull[i
13400 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
13410 66 28 20 7a 46 75 6c 6c 5b 69 5d 3d 3d 27 2f 27  f( zFull[i]=='/'
13420 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
13430 7a 46 75 6c 6c 5b 69 2b 31 5d 3d 3d 27 2f 27 20  zFull[i+1]=='/' 
13440 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
13450 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 5b 69 2b      if( zFull[i+
13460 31 5d 3d 3d 27 2e 27 20 26 26 20 7a 46 75 6c 6c  1]=='.' && zFull
13470 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  [i+2]=='/' ){.  
13480 20 20 20 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a          i += 1;.
13490 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
134a0 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
134b0 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 5b        if( zFull[
134c0 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 7a 46 75  i+1]=='.' && zFu
134d0 6c 6c 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20  ll[i+2]=='.' && 
134e0 7a 46 75 6c 6c 5b 69 2b 33 5d 3d 3d 27 2f 27 20  zFull[i+3]=='/' 
134f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  ){.          whi
13500 6c 65 28 20 6a 3e 30 20 26 26 20 7a 46 75 6c 6c  le( j>0 && zFull
13510 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d  [j-1]!='/' ){ j-
13520 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69  -; }.          i
13530 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20   += 3;.         
13540 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
13550 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
13560 20 20 20 7a 46 75 6c 6c 5b 6a 2b 2b 5d 20 3d 20     zFull[j++] = 
13570 7a 46 75 6c 6c 5b 69 5d 3b 0a 20 20 20 20 7d 0a  zFull[i];.    }.
13580 20 20 20 20 7a 46 75 6c 6c 5b 6a 5d 20 3d 20 30      zFull[j] = 0
13590 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
135a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
135b0 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
135c0 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66  ION./*.** Interf
135d0 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67  aces for opening
135e0 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72   a shared librar
135f0 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79  y, finding entry
13600 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69   points.** withi
13610 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  n the shared lib
13620 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e  rary, and closin
13630 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  g the shared lib
13640 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  rary..*/.#includ
13650 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74  e <dlfcn.h>.stat
13660 69 63 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f  ic void *unixDlO
13670 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20  pen(sqlite3_vfs 
13680 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61  *pVfs, const cha
13690 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
136a0 20 72 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a   return dlopen(z
136b0 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e  Filename, RTLD_N
136c0 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c  OW | RTLD_GLOBAL
136d0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69  );.}../*.** SQLi
136e0 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75  te calls this fu
136f0 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65  nction immediate
13700 6c 79 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  ly after a call 
13710 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f  to unixDlSym() o
13720 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28  r.** unixDlOpen(
13730 29 20 66 61 69 6c 73 20 28 72 65 74 75 72 6e 73  ) fails (returns
13740 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29   a null pointer)
13750 2e 20 49 66 20 61 20 6d 6f 72 65 20 64 65 74 61  . If a more deta
13760 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65  iled error.** me
13770 73 73 61 67 65 20 69 73 20 61 76 61 69 6c 61 62  ssage is availab
13780 6c 65 2c 20 69 74 20 69 73 20 77 72 69 74 74 65  le, it is writte
13790 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66  n to zBufOut. If
137a0 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67   no error messag
137b0 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c  e.** is availabl
137c0 65 2c 20 7a 42 75 66 4f 75 74 20 69 73 20 6c 65  e, zBufOut is le
137d0 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e  ft unmodified an
137e0 64 20 53 51 4c 69 74 65 20 75 73 65 73 20 61 20  d SQLite uses a 
137f0 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72  default.** error
13800 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61   message..*/.sta
13810 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 45  tic void unixDlE
13820 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
13830 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
13840 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29  , char *zBufOut)
13850 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a  {.  char *zErr;.
13860 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a    enterMutex();.
13870 20 20 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f 72    zErr = dlerror
13880 28 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29  ();.  if( zErr )
13890 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
138a0 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75  printf(nBuf, zBu
138b0 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45 72 72  fOut, "%s", zErr
138c0 29 3b 0a 20 20 7d 0a 20 20 6c 65 61 76 65 4d 75  );.  }.  leaveMu
138d0 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63 20  tex();.}.static 
138e0 76 6f 69 64 20 2a 75 6e 69 78 44 6c 53 79 6d 28  void *unixDlSym(
138f0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
13900 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65  s, void *pHandle
13910 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  , const char *zS
13920 79 6d 62 6f 6c 29 7b 0a 20 20 72 65 74 75 72 6e  ymbol){.  return
13930 20 64 6c 73 79 6d 28 70 48 61 6e 64 6c 65 2c 20   dlsym(pHandle, 
13940 7a 53 79 6d 62 6f 6c 29 3b 0a 7d 0a 73 74 61 74  zSymbol);.}.stat
13950 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 43 6c  ic void unixDlCl
13960 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ose(sqlite3_vfs 
13970 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61  *pVfs, void *pHa
13980 6e 64 6c 65 29 7b 0a 20 20 64 6c 63 6c 6f 73 65  ndle){.  dlclose
13990 28 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c  (pHandle);.}.#el
139a0 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f  se /* if SQLITE_
139b0 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
139c0 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20  ION is defined: 
139d0 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69  */.  #define uni
139e0 78 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65  xDlOpen  0.  #de
139f0 66 69 6e 65 20 75 6e 69 78 44 6c 45 72 72 6f 72  fine unixDlError
13a00 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
13a10 78 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65  xDlSym   0.  #de
13a20 66 69 6e 65 20 75 6e 69 78 44 6c 43 6c 6f 73 65  fine unixDlClose
13a30 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
13a40 20 57 72 69 74 65 20 6e 42 75 66 20 62 79 74 65   Write nBuf byte
13a50 73 20 6f 66 20 72 61 6e 64 6f 6d 20 64 61 74 61  s of random data
13a60 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
13a70 20 62 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f   buffer zBuf..*/
13a80 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
13a90 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74  Randomness(sqlit
13aa0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
13ab0 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
13ac0 75 66 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 6e  uf){..  assert(n
13ad0 42 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d  Buf>=(sizeof(tim
13ae0 65 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29  e_t)+sizeof(int)
13af0 29 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76  ));..  /* We hav
13b00 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  e to initialize 
13b10 7a 42 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20  zBuf to prevent 
13b20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65  valgrind from re
13b30 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72  porting.  ** err
13b40 6f 72 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74  ors.  The report
13b50 73 20 69 73 73 75 65 64 20 62 79 20 76 61 6c 67  s issued by valg
13b60 72 69 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65  rind are incorre
13b70 63 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20  ct - we would.  
13b80 2a 2a 20 70 72 65 66 65 72 20 74 68 61 74 20 74  ** prefer that t
13b90 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65  he randomness be
13ba0 20 69 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61   increased by ma
13bb0 6b 69 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a  king use of the.
13bc0 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a    ** uninitializ
13bd0 65 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66  ed space in zBuf
13be0 20 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20   - but valgrind 
13bf0 65 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77  errors tend to w
13c00 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75  orry.  ** some u
13c10 73 65 72 73 2e 20 20 52 61 74 68 65 72 20 74 68  sers.  Rather th
13c20 61 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65 65  an argue, it see
13c30 6d 73 20 65 61 73 69 65 72 20 6a 75 73 74 20 74  ms easier just t
13c40 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a  o initialize.  *
13c50 2a 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61  * the whole arra
13c60 79 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61  y and silence va
13c70 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20  lgrind, even if 
13c80 74 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20  that means less 
13c90 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20  randomness.  ** 
13ca0 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65  in the random se
13cb0 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  ed..  **.  ** Wh
13cc0 65 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74  en testing, init
13cd0 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20  ializing zBuf[] 
13ce0 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77  to zero is all w
13cf0 65 20 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e  e do.  That mean
13d00 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61  s.  ** that we a
13d10 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 73 61  lways use the sa
13d20 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  me random number
13d30 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68 69 73   sequence.  This
13d40 20 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20   makes the.  ** 
13d50 74 65 73 74 73 20 72 65 70 65 61 74 61 62 6c 65  tests repeatable
13d60 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
13d70 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a  zBuf, 0, nBuf);.
13d80 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
13d90 49 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20  ITE_TEST).  {.  
13da0 20 20 69 6e 74 20 70 69 64 2c 20 66 64 3b 0a 20    int pid, fd;. 
13db0 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 22 2f 64     fd = open("/d
13dc0 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52  ev/urandom", O_R
13dd0 44 4f 4e 4c 59 29 3b 0a 20 20 20 20 69 66 28 20  DONLY);.    if( 
13de0 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 74 69  fd<0 ){.      ti
13df0 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20 20 74 69  me_t t;.      ti
13e00 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 20 6d 65  me(&t);.      me
13e10 6d 63 70 79 28 7a 42 75 66 2c 20 26 74 2c 20 73  mcpy(zBuf, &t, s
13e20 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20 20 20  izeof(t));.     
13e30 20 70 69 64 20 3d 20 67 65 74 70 69 64 28 29 3b   pid = getpid();
13e40 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  .      memcpy(&z
13e50 42 75 66 5b 73 69 7a 65 6f 66 28 74 29 5d 2c 20  Buf[sizeof(t)], 
13e60 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64  &pid, sizeof(pid
13e70 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
13e80 20 20 20 20 20 72 65 61 64 28 66 64 2c 20 7a 42       read(fd, zB
13e90 75 66 2c 20 6e 42 75 66 29 3b 0a 20 20 20 20 20  uf, nBuf);.     
13ea0 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20   close(fd);.    
13eb0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  }.  }.#endif.  r
13ec0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13ed0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70  .}.../*.** Sleep
13ee0 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68   for a little wh
13ef0 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ile.  Return the
13f00 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20   amount of time 
13f10 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61 72  slept..** The ar
13f20 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 75  gument is the nu
13f30 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63  mber of microsec
13f40 6f 6e 64 73 20 77 65 20 77 61 6e 74 20 74 6f 20  onds we want to 
13f50 73 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72 65  sleep..** The re
13f60 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
13f70 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72  e number of micr
13f80 6f 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65 65  oseconds of slee
13f90 70 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72 65  p actually.** re
13fa0 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65  quested from the
13fb0 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72   underlying oper
13fc0 61 74 69 6e 67 20 73 79 73 74 65 6d 2c 20 61 20  ating system, a 
13fd0 6e 75 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a 20  number which.** 
13fe0 6d 69 67 68 74 20 62 65 20 67 72 65 61 74 65 72  might be greater
13ff0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
14000 6f 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20  o the argument, 
14010 62 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20  but not less.** 
14020 74 68 61 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  than the argumen
14030 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
14040 20 75 6e 69 78 53 6c 65 65 70 28 73 71 6c 69 74   unixSleep(sqlit
14050 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
14060 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 7b  t microseconds){
14070 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56  .#if defined(HAV
14080 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41 56  E_USLEEP) && HAV
14090 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c 65 65  E_USLEEP.  uslee
140a0 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b  p(microseconds);
140b0 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73  .  return micros
140c0 65 63 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20  econds;.#else.  
140d0 69 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d  int seconds = (m
140e0 69 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39  icroseconds+9999
140f0 39 39 29 2f 31 30 30 30 30 30 30 3b 0a 20 20 73  99)/1000000;.  s
14100 6c 65 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20  leep(seconds);. 
14110 20 72 65 74 75 72 6e 20 73 65 63 6f 6e 64 73 2a   return seconds*
14120 31 30 30 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a  1000000;.#endif.
14130 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
14140 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c  lowing variable,
14150 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e   if set to a non
14160 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 62 65 63  -zero value, bec
14170 6f 6d 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a  omes the result.
14180 2a 2a 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d  ** returned from
14190 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e   sqlite3OsCurren
141a0 74 54 69 6d 65 28 29 2e 20 20 54 68 69 73 20 69  tTime().  This i
141b0 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
141c0 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ng..*/.#ifdef SQ
141d0 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
141e0 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
141f0 6d 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  me = 0;.#endif..
14200 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63  /*.** Find the c
14210 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20  urrent time (in 
14220 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69  Universal Coordi
14230 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72  nated Time).  Wr
14240 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65  ite the.** curre
14250 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  nt time and date
14260 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79   as a Julian Day
14270 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72   number into *pr
14280 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72  Now and.** retur
14290 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69  n 0.  Return 1 i
142a0 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64  f the time and d
142b0 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  ate cannot be fo
142c0 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  und..*/.static i
142d0 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69  nt unixCurrentTi
142e0 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  me(sqlite3_vfs *
142f0 70 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70 72  pVfs, double *pr
14300 4e 6f 77 29 7b 0a 23 69 66 64 65 66 20 4e 4f 5f  Now){.#ifdef NO_
14310 47 45 54 54 4f 44 0a 20 20 74 69 6d 65 5f 74 20  GETTOD.  time_t 
14320 74 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a 20  t;.  time(&t);. 
14330 20 2a 70 72 4e 6f 77 20 3d 20 74 2f 38 36 34 30   *prNow = t/8640
14340 30 2e 30 20 2b 20 32 34 34 30 35 38 37 2e 35 3b  0.0 + 2440587.5;
14350 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20  .#else.  struct 
14360 74 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20 20  timeval sNow;.  
14370 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73 4e  gettimeofday(&sN
14380 6f 77 2c 20 30 29 3b 0a 20 20 2a 70 72 4e 6f 77  ow, 0);.  *prNow
14390 20 3d 20 32 34 34 30 35 38 37 2e 35 20 2b 20 73   = 2440587.5 + s
143a0 4e 6f 77 2e 74 76 5f 73 65 63 2f 38 36 34 30 30  Now.tv_sec/86400
143b0 2e 30 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65  .0 + sNow.tv_use
143c0 63 2f 38 36 34 30 30 30 30 30 30 30 30 2e 30 3b  c/86400000000.0;
143d0 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
143e0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28  QLITE_TEST.  if(
143f0 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
14400 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 72  _time ){.    *pr
14410 4e 6f 77 20 3d 20 73 71 6c 69 74 65 33 5f 63 75  Now = sqlite3_cu
14420 72 72 65 6e 74 5f 74 69 6d 65 2f 38 36 34 30 30  rrent_time/86400
14430 2e 30 20 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a  .0 + 2440587.5;.
14440 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
14450 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
14460 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
14470 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 44   to the sqlite3D
14480 65 66 61 75 6c 74 56 66 73 20 73 74 72 75 63 74  efaultVfs struct
14490 75 72 65 2e 20 20 20 57 65 20 75 73 65 0a 2a 2a  ure.   We use.**
144a0 20 61 20 66 75 6e 63 74 69 6f 6e 20 72 61 74 68   a function rath
144b0 65 72 20 74 68 61 6e 20 67 69 76 65 20 74 68 65  er than give the
144c0 20 73 74 72 75 63 74 75 72 65 20 67 6c 6f 62 61   structure globa
144d0 6c 20 73 63 6f 70 65 20 62 65 63 61 75 73 65 0a  l scope because.
144e0 2a 2a 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72  ** some compiler
144f0 73 20 28 4d 53 56 43 29 20 64 6f 20 6e 6f 74 20  s (MSVC) do not 
14500 61 6c 6c 6f 77 20 66 6f 72 77 61 72 64 20 64 65  allow forward de
14510 63 6c 61 72 61 74 69 6f 6e 73 20 6f 66 0a 2a 2a  clarations of.**
14520 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 74 72   initialized str
14530 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 73 71 6c 69  uctures..*/.sqli
14540 74 65 33 5f 76 66 73 20 2a 73 71 6c 69 74 65 33  te3_vfs *sqlite3
14550 4f 73 44 65 66 61 75 6c 74 56 66 73 28 76 6f 69  OsDefaultVfs(voi
14560 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c  d){.  static sql
14570 69 74 65 33 5f 76 66 73 20 75 6e 69 78 56 66 73  ite3_vfs unixVfs
14580 20 3d 20 7b 0a 20 20 20 20 31 2c 20 20 20 20 20   = {.    1,     
14590 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
145a0 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  iVersion */.    
145b0 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
145c0 2c 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20  ,   /* szOsFile 
145d0 2a 2f 0a 20 20 20 20 4d 41 58 5f 50 41 54 48 4e  */.    MAX_PATHN
145e0 41 4d 45 2c 20 20 20 20 20 20 20 2f 2a 20 6d 78  AME,       /* mx
145f0 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  Pathname */.    
14600 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
14610 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a      /* pNext */.
14620 20 20 20 20 22 75 6e 69 78 22 2c 20 20 20 20 20      "unix",     
14630 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65          /* zName
14640 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20   */.    0,      
14650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
14660 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 0a 20 20  AppData */.  .  
14670 20 20 75 6e 69 78 4f 70 65 6e 2c 20 20 20 20 20    unixOpen,     
14680 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a        /* xOpen *
14690 2f 0a 20 20 20 20 75 6e 69 78 44 65 6c 65 74 65  /.    unixDelete
146a0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65  ,         /* xDe
146b0 6c 65 74 65 20 2a 2f 0a 20 20 20 20 75 6e 69 78  lete */.    unix
146c0 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20  Access,         
146d0 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20  /* xAccess */.  
146e0 20 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d    unixGetTempnam
146f0 65 2c 20 20 20 20 2f 2a 20 78 47 65 74 54 65 6d  e,    /* xGetTem
14700 70 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 75 6e 69  pName */.    uni
14710 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20  xFullPathname,  
14720 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d   /* xFullPathnam
14730 65 20 2a 2f 0a 20 20 20 20 75 6e 69 78 44 6c 4f  e */.    unixDlO
14740 70 65 6e 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  pen,         /* 
14750 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 75  xDlOpen */.    u
14760 6e 69 78 44 6c 45 72 72 6f 72 2c 20 20 20 20 20  nixDlError,     
14770 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a     /* xDlError *
14780 2f 0a 20 20 20 20 75 6e 69 78 44 6c 53 79 6d 2c  /.    unixDlSym,
14790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
147a0 53 79 6d 20 2a 2f 0a 20 20 20 20 75 6e 69 78 44  Sym */.    unixD
147b0 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 2f  lClose,        /
147c0 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20  * xDlClose */.  
147d0 20 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73    unixRandomness
147e0 2c 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d  ,     /* xRandom
147f0 6e 65 73 73 20 2a 2f 0a 20 20 20 20 75 6e 69 78  ness */.    unix
14800 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20  Sleep,          
14810 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20  /* xSleep */.   
14820 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65   unixCurrentTime
14830 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74       /* xCurrent
14840 54 69 6d 65 20 2a 2f 0a 20 20 7d 3b 0a 20 20 0a  Time */.  };.  .
14850 20 20 72 65 74 75 72 6e 20 26 75 6e 69 78 56 66    return &unixVf
14860 73 3b 0a 7d 0a 20 0a 23 65 6e 64 69 66 20 2f 2a  s;.}. .#endif /*
14870 20 4f 53 5f 55 4e 49 58 20 2a 2f 0a               OS_UNIX */.