/ Hex Artifact Content
Login

Artifact 5c8fd11fa182b66f7e4f28ac0594e4092535551a:


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: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 73  unsigned char is
0b80: 4f 70 65 6e 3b 20 20 20 20 20 2f 2a 20 54 72 75  Open;     /* Tru
0b90: 65 20 69 66 20 6e 65 65 64 73 20 74 6f 20 62 65  e if needs to be
0ba0: 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 69 6e 74   closed */.  int
0bb0: 20 64 69 72 66 64 3b 20 20 20 20 20 20 20 20 20   dirfd;         
0bc0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
0bd0: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68  escriptor for th
0be0: 65 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 23  e directory */.#
0bf0: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
0c00: 53 41 46 45 0a 20 20 70 74 68 72 65 61 64 5f 74  SAFE.  pthread_t
0c10: 20 74 69 64 3b 20 20 20 20 20 20 20 20 20 20 20   tid;           
0c20: 20 2f 2a 20 54 68 65 20 74 68 72 65 61 64 20 74   /* The thread t
0c30: 68 61 74 20 22 6f 77 6e 73 22 20 74 68 69 73 20  hat "owns" this 
0c40: 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 23 65 6e 64  unixFile */.#end
0c50: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  if.};../*.** Inc
0c60: 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20 69  lude code that i
0c70: 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20  s common to all 
0c80: 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a  os_*.c files.*/.
0c90: 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d  #include "os_com
0ca0: 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65  mon.h"../*.** De
0cb0: 66 69 6e 65 20 76 61 72 69 6f 75 73 20 6d 61 63  fine various mac
0cc0: 72 6f 73 20 74 68 61 74 20 61 72 65 20 6d 69 73  ros that are mis
0cd0: 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20 73  sing from some s
0ce0: 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64  ystems..*/.#ifnd
0cf0: 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23  ef O_LARGEFILE.#
0d00: 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46   define O_LARGEF
0d10: 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  ILE 0.#endif.#if
0d20: 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
0d30: 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20 4f  LE_LFS.# undef O
0d40: 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66  _LARGEFILE.# def
0d50: 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20  ine O_LARGEFILE 
0d60: 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  0.#endif.#ifndef
0d70: 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65   O_NOFOLLOW.# de
0d80: 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20  fine O_NOFOLLOW 
0d90: 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  0.#endif.#ifndef
0da0: 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65 66 69   O_BINARY.# defi
0db0: 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23 65  ne O_BINARY 0.#e
0dc0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
0dd0: 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20 65  DJGPP compiler e
0de0: 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73  nvironment looks
0df0: 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69   mostly like Uni
0e00: 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63  x, but it.** lac
0e10: 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20 73  ks the fcntl() s
0e20: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20  ystem call.  So 
0e30: 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 29  redefine fcntl()
0e40: 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67   to be something
0e50: 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73 20  .** that always 
0e60: 73 75 63 63 65 65 64 73 2e 20 20 54 68 69 73 20  succeeds.  This 
0e70: 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69  means that locki
0e80: 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  ng does not occu
0e90: 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50  r under.** DJGPP
0ea0: 2e 20 20 42 75 74 20 69 74 27 73 20 44 4f 53 20  .  But it's DOS 
0eb0: 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75 20 65  - what did you e
0ec0: 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65 66  xpect?.*/.#ifdef
0ed0: 20 5f 5f 44 4a 47 50 50 5f 5f 0a 23 20 64 65 66   __DJGPP__.# def
0ee0: 69 6e 65 20 66 63 6e 74 6c 28 41 2c 42 2c 43 29  ine fcntl(A,B,C)
0ef0: 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
0f00: 20 54 68 65 20 74 68 72 65 61 64 69 64 20 6d 61   The threadid ma
0f10: 63 72 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f 20  cro resolves to 
0f20: 74 68 65 20 74 68 72 65 61 64 2d 69 64 20 6f 72  the thread-id or
0f30: 20 74 6f 20 30 2e 20 20 55 73 65 64 20 66 6f 72   to 0.  Used for
0f40: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
0f50: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
0f60: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48  */.#if SQLITE_TH
0f70: 52 45 41 44 53 41 46 45 0a 23 64 65 66 69 6e 65  READSAFE.#define
0f80: 20 74 68 72 65 61 64 69 64 20 70 74 68 72 65 61   threadid pthrea
0f90: 64 5f 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23  d_self().#else.#
0fa0: 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20  define threadid 
0fb0: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
0fc0: 53 65 74 20 6f 72 20 63 68 65 63 6b 20 74 68 65  Set or check the
0fd0: 20 75 6e 69 78 46 69 6c 65 2e 74 69 64 20 66 69   unixFile.tid fi
0fe0: 65 6c 64 2e 20 20 54 68 69 73 20 66 69 65 6c 64  eld.  This field
0ff0: 20 69 73 20 73 65 74 20 77 68 65 6e 20 61 6e 20   is set when an 
1000: 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 69 73 20 66  unixFile.** is f
1010: 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 20 41 6c  irst opened.  Al
1020: 6c 20 73 75 62 73 65 71 75 65 6e 74 20 75 73 65  l subsequent use
1030: 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c  s of the unixFil
1040: 65 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  e verify that th
1050: 65 0a 2a 2a 20 73 61 6d 65 20 74 68 72 65 61 64  e.** same thread
1060: 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20 6f 6e   is operating on
1070: 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e 20 20   the unixFile.  
1080: 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73  Some operating s
1090: 79 73 74 65 6d 73 20 64 6f 0a 2a 2a 20 6e 6f 74  ystems do.** not
10a0: 20 61 6c 6c 6f 77 20 6c 6f 63 6b 73 20 74 6f 20   allow locks to 
10b0: 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79  be overridden by
10c0: 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61   other threads a
10d0: 6e 64 20 74 68 61 74 20 72 65 73 74 72 69 63 74  nd that restrict
10e0: 69 6f 6e 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61  ion.** means tha
10f0: 74 20 73 71 6c 69 74 65 33 2a 20 64 61 74 61 62  t sqlite3* datab
1100: 61 73 65 20 68 61 6e 64 6c 65 73 20 63 61 6e 6e  ase handles cann
1110: 6f 74 20 62 65 20 6d 6f 76 65 64 20 66 72 6f 6d  ot be moved from
1120: 20 6f 6e 65 20 74 68 72 65 61 64 0a 2a 2a 20 74   one thread.** t
1130: 6f 20 61 6e 6f 74 68 65 72 2e 20 20 54 68 69 73  o another.  This
1140: 20 6c 6f 67 69 63 20 6d 61 6b 65 73 20 73 75 72   logic makes sur
1150: 65 20 61 20 75 73 65 72 20 64 6f 65 73 20 6e 6f  e a user does no
1160: 74 20 74 72 79 20 74 6f 20 64 6f 20 74 68 61 74  t try to do that
1170: 0a 2a 2a 20 62 79 20 6d 69 73 74 61 6b 65 2e 0a  .** by mistake..
1180: 2a 2a 0a 2a 2a 20 56 65 72 73 69 6f 6e 20 33 2e  **.** Version 3.
1190: 33 2e 31 20 28 32 30 30 36 2d 30 31 2d 31 35 29  3.1 (2006-01-15)
11a0: 3a 20 20 75 6e 69 78 46 69 6c 65 20 63 61 6e 20  :  unixFile can 
11b0: 62 65 20 6d 6f 76 65 64 20 66 72 6f 6d 20 6f 6e  be moved from on
11c0: 65 20 74 68 72 65 61 64 20 74 6f 0a 2a 2a 20 61  e thread to.** a
11d0: 6e 6f 74 68 65 72 20 61 73 20 6c 6f 6e 67 20 61  nother as long a
11e0: 73 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67  s we are running
11f0: 20 6f 6e 20 61 20 73 79 73 74 65 6d 20 74 68 61   on a system tha
1200: 74 20 73 75 70 70 6f 72 74 73 20 74 68 72 65 61  t supports threa
1210: 64 73 0a 2a 2a 20 6f 76 65 72 72 69 64 69 6e 67  ds.** overriding
1220: 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63   each others loc
1230: 6b 73 20 28 77 68 69 63 68 20 6e 6f 77 20 74 68  ks (which now th
1240: 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 20 62 65  e most common be
1250: 68 61 76 69 6f 72 29 0a 2a 2a 20 6f 72 20 69 66  havior).** or if
1260: 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 68 65   no locks are he
1270: 6c 64 2e 20 20 42 75 74 20 74 68 65 20 75 6e 69  ld.  But the uni
1280: 78 46 69 6c 65 2e 70 4c 6f 63 6b 20 66 69 65 6c  xFile.pLock fiel
1290: 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 2a 2a  d needs to be.**
12a0: 20 72 65 63 6f 6d 70 75 74 65 64 20 62 65 63 61   recomputed beca
12b0: 75 73 65 20 69 74 73 20 6b 65 79 20 69 6e 63 6c  use its key incl
12c0: 75 64 65 73 20 74 68 65 20 74 68 72 65 61 64 2d  udes the thread-
12d0: 69 64 2e 20 20 53 65 65 20 74 68 65 20 0a 2a 2a  id.  See the .**
12e0: 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68   transferOwnersh
12f0: 69 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 62 65  ip() function be
1300: 6c 6f 77 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  low for addition
1310: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a  al information.*
1320: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  /.#if SQLITE_THR
1330: 45 41 44 53 41 46 45 0a 23 20 64 65 66 69 6e 65  EADSAFE.# define
1340: 20 53 45 54 5f 54 48 52 45 41 44 49 44 28 58 29   SET_THREADID(X)
1350: 20 20 20 28 58 29 2d 3e 74 69 64 20 3d 20 70 74     (X)->tid = pt
1360: 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 20 64  hread_self().# d
1370: 65 66 69 6e 65 20 43 48 45 43 4b 5f 54 48 52 45  efine CHECK_THRE
1380: 41 44 49 44 28 58 29 20 28 74 68 72 65 61 64 73  ADID(X) (threads
1390: 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65  OverrideEachOthe
13a0: 72 73 4c 6f 63 6b 73 3d 3d 30 20 26 26 20 5c 0a  rsLocks==0 && \.
13b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 21 70 74 68              !pth
13d0: 72 65 61 64 5f 65 71 75 61 6c 28 28 58 29 2d 3e  read_equal((X)->
13e0: 74 69 64 2c 20 70 74 68 72 65 61 64 5f 73 65 6c  tid, pthread_sel
13f0: 66 28 29 29 29 0a 23 65 6c 73 65 0a 23 20 64 65  f())).#else.# de
1400: 66 69 6e 65 20 53 45 54 5f 54 48 52 45 41 44 49  fine SET_THREADI
1410: 44 28 58 29 0a 23 20 64 65 66 69 6e 65 20 43 48  D(X).# define CH
1420: 45 43 4b 5f 54 48 52 45 41 44 49 44 28 58 29 20  ECK_THREADID(X) 
1430: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
1440: 48 65 72 65 20 69 73 20 74 68 65 20 64 69 72 74  Here is the dirt
1450: 20 6f 6e 20 50 4f 53 49 58 20 61 64 76 69 73 6f   on POSIX adviso
1460: 72 79 20 6c 6f 63 6b 73 3a 20 20 41 4e 53 49 20  ry locks:  ANSI 
1470: 53 54 44 20 31 30 30 33 2e 31 20 28 31 39 39 36  STD 1003.1 (1996
1480: 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35  ).** section 6.5
1490: 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38 33 20 74  .2.2 lines 483 t
14a0: 68 72 6f 75 67 68 20 34 39 30 20 73 70 65 63 69  hrough 490 speci
14b0: 66 79 20 74 68 61 74 20 77 68 65 6e 20 61 20 70  fy that when a p
14c0: 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f  rocess.** sets o
14d0: 72 20 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c  r clears a lock,
14e0: 20 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20   that operation 
14f0: 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20 70 72  overrides any pr
1500: 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a  ior locks set.**
1510: 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f   by the same pro
1520: 63 65 73 73 2e 20 20 49 74 20 64 6f 65 73 20 6e  cess.  It does n
1530: 6f 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73 61  ot explicitly sa
1540: 79 20 73 6f 2c 20 62 75 74 20 74 68 69 73 20 69  y so, but this i
1550: 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20 69  mplies.** that i
1560: 74 20 6f 76 65 72 72 69 64 65 73 20 6c 6f 63 6b  t overrides lock
1570: 73 20 73 65 74 20 62 79 20 74 68 65 20 73 61 6d  s set by the sam
1580: 65 20 70 72 6f 63 65 73 73 20 75 73 69 6e 67 20  e process using 
1590: 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  a different.** f
15a0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
15b0: 20 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20 74   Consider this t
15c0: 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20  est case:.**.** 
15d0: 20 20 20 20 20 20 69 6e 74 20 66 64 31 20 3d 20        int fd1 = 
15e0: 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20  open("./file1", 
15f0: 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20  O_RDWR|O_CREAT, 
1600: 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20  0644);.**       
1610: 69 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 22  int fd2 = open("
1620: 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52  ./file2", O_RDWR
1630: 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b  |O_CREAT, 0644);
1640: 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e  .**.** Suppose .
1650: 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c  /file1 and ./fil
1660: 65 32 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68  e2 are really th
1670: 65 20 73 61 6d 65 20 66 69 6c 65 20 28 62 65 63  e same file (bec
1680: 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61  ause.** one is a
1690: 20 68 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69   hard or symboli
16a0: 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74  c link to the ot
16b0: 68 65 72 29 20 74 68 65 6e 20 69 66 20 79 6f 75  her) then if you
16c0: 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75   set.** an exclu
16d0: 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31  sive lock on fd1
16e0: 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 67 65  , then try to ge
16f0: 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  t an exclusive l
1700: 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69  ock.** on fd2, i
1710: 74 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c  t works.  I woul
1720: 64 20 68 61 76 65 20 65 78 70 65 63 74 65 64 20  d have expected 
1730: 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20  the second lock 
1740: 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65  to.** fail since
1750: 20 74 68 65 72 65 20 77 61 73 20 61 6c 72 65 61   there was alrea
1760: 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  dy a lock on the
1770: 20 66 69 6c 65 20 64 75 65 20 74 6f 20 66 64 31   file due to fd1
1780: 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e  ..** But not so.
1790: 20 20 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63    Since both loc
17a0: 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20 74 68 65  ks came from the
17b0: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2c 20 74   same process, t
17c0: 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65  he.** second ove
17d0: 72 72 69 64 65 73 20 74 68 65 20 66 69 72 73 74  rrides the first
17e0: 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68  , even though th
17f0: 65 79 20 77 65 72 65 20 6f 6e 20 64 69 66 66 65  ey were on diffe
1800: 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73  rent.** file des
1810: 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20  criptors opened 
1820: 6f 6e 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c  on different fil
1830: 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 42  e names..**.** B
1840: 75 6d 6d 65 72 2e 20 20 49 66 20 79 6f 75 20 61  ummer.  If you a
1850: 73 6b 20 6d 65 2c 20 74 68 69 73 20 69 73 20 62  sk me, this is b
1860: 72 6f 6b 65 6e 2e 20 20 42 61 64 6c 79 20 62 72  roken.  Badly br
1870: 6f 6b 65 6e 2e 20 20 49 74 20 6d 65 61 6e 73 0a  oken.  It means.
1880: 2a 2a 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f  ** that we canno
1890: 74 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b  t use POSIX lock
18a0: 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65  s to synchronize
18b0: 20 66 69 6c 65 20 61 63 63 65 73 73 20 61 6d 6f   file access amo
18c0: 6e 67 0a 2a 2a 20 63 6f 6d 70 65 74 69 6e 67 20  ng.** competing 
18d0: 74 68 72 65 61 64 73 20 6f 66 20 74 68 65 20 73  threads of the s
18e0: 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50 4f  ame process.  PO
18f0: 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77  SIX locks will w
1900: 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73  ork fine.** to s
1910: 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65 73  ynchronize acces
1920: 73 20 66 6f 72 20 74 68 72 65 61 64 73 20 69 6e  s for threads in
1930: 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73   separate proces
1940: 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20  ses, but not.** 
1950: 74 68 72 65 61 64 73 20 77 69 74 68 69 6e 20 74  threads within t
1960: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e  he same process.
1970: 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61  .**.** To work a
1980: 72 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c 65  round the proble
1990: 6d 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f  m, SQLite has to
19a0: 20 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63   manage file loc
19b0: 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ks internally.**
19c0: 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57 68   on its own.  Wh
19d0: 65 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61 74  enever a new dat
19e0: 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2c  abase is opened,
19f0: 20 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64   we have to find
1a00: 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63   the.** specific
1a10: 20 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64 61   inode of the da
1a20: 74 61 62 61 73 65 20 66 69 6c 65 20 28 74 68 65  tabase file (the
1a30: 20 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72 6d   inode is determ
1a40: 69 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73  ined by the.** s
1a50: 74 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f  t_dev and st_ino
1a60: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73   fields of the s
1a70: 74 61 74 20 73 74 72 75 63 74 75 72 65 20 74 68  tat structure th
1a80: 61 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c 73  at fstat() fills
1a90: 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63   in).** and chec
1aa0: 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65  k for locks alre
1ab0: 61 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e 20  ady existing on 
1ac0: 74 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68 65  that inode.  Whe
1ad0: 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63  n locks are.** c
1ae0: 72 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76 65  reated or remove
1af0: 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f  d, we have to lo
1b00: 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e  ok at our own in
1b10: 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66  ternal record of
1b20: 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f   the.** locks to
1b30: 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20   see if another 
1b40: 74 68 72 65 61 64 20 68 61 73 20 70 72 65 76 69  thread has previ
1b50: 6f 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b  ously set a lock
1b60: 20 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a   on that same.**
1b70: 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   inode..**.** Th
1b80: 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73  e sqlite3_file s
1b90: 74 72 75 63 74 75 72 65 20 66 6f 72 20 50 4f 53  tructure for POS
1ba0: 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  IX is no longer 
1bb0: 6a 75 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20  just an integer 
1bc0: 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
1bd0: 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f 77 20 61  or.  It is now a
1be0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
1bf0: 68 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65  holds the intege
1c00: 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69  r file.** descri
1c10: 70 74 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e 74  ptor and a point
1c20: 65 72 20 74 6f 20 61 20 73 74 72 75 63 74 75 72  er to a structur
1c30: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
1c40: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a   the internal.**
1c50: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f   locks on the co
1c60: 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64  rresponding inod
1c70: 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65  e.  There is one
1c80: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
1c90: 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c  re.** per inode,
1ca0: 20 73 6f 20 69 66 20 74 68 65 20 73 61 6d 65 20   so if the same 
1cb0: 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65 64 20  inode is opened 
1cc0: 74 77 69 63 65 2c 20 62 6f 74 68 20 75 6e 69 78  twice, both unix
1cd0: 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 73 0a  File structures.
1ce0: 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  ** point to the 
1cf0: 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72  same locking str
1d00: 75 63 74 75 72 65 2e 20 20 54 68 65 20 6c 6f 63  ucture.  The loc
1d10: 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b  king structure k
1d20: 65 65 70 73 0a 2a 2a 20 61 20 72 65 66 65 72 65  eeps.** a refere
1d30: 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f 20 77 65  nce count (so we
1d40: 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20   will know when 
1d50: 74 6f 20 64 65 6c 65 74 65 20 69 74 29 20 61 6e  to delete it) an
1d60: 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65  d a "cnt".** fie
1d70: 6c 64 20 74 68 61 74 20 74 65 6c 6c 73 20 75 73  ld that tells us
1d80: 20 69 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f   its internal lo
1d90: 63 6b 20 73 74 61 74 75 73 2e 20 20 63 6e 74 3d  ck status.  cnt=
1da0: 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20  =0 means the.** 
1db0: 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64  file is unlocked
1dc0: 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73  .  cnt==-1 means
1dd0: 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 61 6e   the file has an
1de0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
1df0: 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20  .** cnt>0 means 
1e00: 74 68 65 72 65 20 61 72 65 20 63 6e 74 20 73 68  there are cnt sh
1e10: 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ared locks on th
1e20: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e  e file..**.** An
1e30: 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63  y attempt to loc
1e40: 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69  k or unlock a fi
1e50: 6c 65 20 66 69 72 73 74 20 63 68 65 63 6b 73 20  le first checks 
1e60: 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73  the locking.** s
1e70: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 66  tructure.  The f
1e80: 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61  cntl() system ca
1e90: 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b  ll is only invok
1ea0: 65 64 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20  ed to set a .** 
1eb0: 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20 74 68  POSIX lock if th
1ec0: 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20  e internal lock 
1ed0: 73 74 72 75 63 74 75 72 65 20 74 72 61 6e 73 69  structure transi
1ee0: 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a  tions between.**
1ef0: 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e   a locked and an
1f00: 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e   unlocked state.
1f10: 0a 2a 2a 0a 2a 2a 20 32 30 30 34 2d 4a 61 6e 2d  .**.** 2004-Jan-
1f20: 31 31 3a 0a 2a 2a 20 4d 6f 72 65 20 72 65 63 65  11:.** More rece
1f30: 6e 74 20 64 69 73 63 6f 76 65 72 69 65 73 20 61  nt discoveries a
1f40: 62 6f 75 74 20 50 4f 53 49 58 20 61 64 76 69 73  bout POSIX advis
1f50: 6f 72 79 20 6c 6f 63 6b 73 2e 20 20 28 54 68 65  ory locks.  (The
1f60: 20 6d 6f 72 65 0a 2a 2a 20 49 20 64 69 73 63 6f   more.** I disco
1f70: 76 65 72 2c 20 74 68 65 20 6d 6f 72 65 20 49 20  ver, the more I 
1f80: 72 65 61 6c 69 7a 65 20 74 68 65 20 61 20 50 4f  realize the a PO
1f90: 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  SIX advisory loc
1fa0: 6b 73 20 61 72 65 0a 2a 2a 20 61 6e 20 61 62 6f  ks are.** an abo
1fb0: 6d 69 6e 61 74 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a  mination.).**.**
1fc0: 20 49 66 20 79 6f 75 20 63 6c 6f 73 65 20 61 20   If you close a 
1fd0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1fe0: 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  that points to a
1ff0: 20 66 69 6c 65 20 74 68 61 74 20 68 61 73 20 6c   file that has l
2000: 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63  ocks,.** all loc
2010: 6b 73 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20  ks on that file 
2020: 74 68 61 74 20 61 72 65 20 6f 77 6e 65 64 20 62  that are owned b
2030: 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72  y the current pr
2040: 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c  ocess are.** rel
2050: 65 61 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20  eased.  To work 
2060: 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62  around this prob
2070: 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69 78 46 69  lem, each unixFi
2080: 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  le structure con
2090: 74 61 69 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e 74  tains.** a point
20a0: 65 72 20 74 6f 20 61 6e 20 6f 70 65 6e 43 6e 74  er to an openCnt
20b0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
20c0: 72 65 20 69 73 20 6f 6e 65 20 6f 70 65 6e 43 6e  re is one openCn
20d0: 74 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70  t structure.** p
20e0: 65 72 20 6f 70 65 6e 20 69 6e 6f 64 65 2c 20 77  er open inode, w
20f0: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20  hich means that 
2100: 6d 75 6c 74 69 70 6c 65 20 75 6e 69 78 46 69 6c  multiple unixFil
2110: 65 20 63 61 6e 20 70 6f 69 6e 74 20 74 6f 20 61  e can point to a
2120: 20 73 69 6e 67 6c 65 0a 2a 2a 20 6f 70 65 6e 43   single.** openC
2130: 6e 74 2e 20 20 57 68 65 6e 20 61 6e 20 61 74 74  nt.  When an att
2140: 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
2150: 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46 69 6c  close an unixFil
2160: 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 0a  e, if there are.
2170: 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78 46 69 6c  ** other unixFil
2180: 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  e open on the sa
2190: 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61 72  me inode that ar
21a0: 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c  e holding locks,
21b0: 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20   the call.** to 
21c0: 63 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c 65  close() the file
21d0: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 64   descriptor is d
21e0: 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61 6c  eferred until al
21f0: 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20 63  l of the locks c
2200: 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20 6f 70 65  lear..** The ope
2210: 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20 6b  nCnt structure k
2220: 65 65 70 73 20 61 20 6c 69 73 74 20 6f 66 20 66  eeps a list of f
2230: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
2240: 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20  that need to.** 
2250: 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 74 68  be closed and th
2260: 61 74 20 6c 69 73 74 20 69 73 20 77 61 6c 6b 65  at list is walke
2270: 64 20 28 61 6e 64 20 63 6c 65 61 72 65 64 29 20  d (and cleared) 
2280: 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f  when the last lo
2290: 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a  ck.** clears..**
22a0: 0a 2a 2a 20 46 69 72 73 74 2c 20 75 6e 64 65 72  .** First, under
22b0: 20 4c 69 6e 75 78 20 74 68 72 65 61 64 73 2c 20   Linux threads, 
22c0: 62 65 63 61 75 73 65 20 65 61 63 68 20 74 68 72  because each thr
22d0: 65 61 64 20 68 61 73 20 61 20 73 65 70 61 72 61  ead has a separa
22e0: 74 65 0a 2a 2a 20 70 72 6f 63 65 73 73 20 49 44  te.** process ID
22f0: 2c 20 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e  , lock operation
2300: 73 20 69 6e 20 6f 6e 65 20 74 68 72 65 61 64 20  s in one thread 
2310: 64 6f 20 6e 6f 74 20 6f 76 65 72 72 69 64 65 20  do not override 
2320: 6c 6f 63 6b 73 0a 2a 2a 20 74 6f 20 74 68 65 20  locks.** to the 
2330: 73 61 6d 65 20 66 69 6c 65 20 69 6e 20 6f 74 68  same file in oth
2340: 65 72 20 74 68 72 65 61 64 73 2e 20 20 4c 69 6e  er threads.  Lin
2350: 75 78 20 74 68 72 65 61 64 73 20 62 65 68 61 76  ux threads behav
2360: 65 20 6c 69 6b 65 0a 2a 2a 20 73 65 70 61 72 61  e like.** separa
2370: 74 65 20 70 72 6f 63 65 73 73 65 73 20 69 6e 20  te processes in 
2380: 74 68 69 73 20 72 65 73 70 65 63 74 2e 20 20 42  this respect.  B
2390: 75 74 2c 20 69 66 20 79 6f 75 20 63 6c 6f 73 65  ut, if you close
23a0: 20 61 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72   a file.** descr
23b0: 69 70 74 6f 72 20 69 6e 20 6c 69 6e 75 78 20 74  iptor in linux t
23c0: 68 72 65 61 64 73 2c 20 61 6c 6c 20 6c 6f 63 6b  hreads, all lock
23d0: 73 20 61 72 65 20 63 6c 65 61 72 65 64 2c 20 65  s are cleared, e
23e0: 76 65 6e 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 6e 20  ven locks.** on 
23f0: 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61 6e  other threads an
2400: 64 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68  d even though th
2410: 65 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20  e other threads 
2420: 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a  have different.*
2430: 2a 20 70 72 6f 63 65 73 73 20 49 44 73 2e 20 20  * process IDs.  
2440: 4c 69 6e 75 78 20 74 68 72 65 61 64 73 20 69 73  Linux threads is
2450: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 69 6e   inconsistent in
2460: 20 74 68 69 73 20 72 65 73 70 65 63 74 2e 0a 2a   this respect..*
2470: 2a 20 28 49 27 6d 20 62 65 67 69 6e 6e 69 6e 67  * (I'm beginning
2480: 20 74 6f 20 74 68 69 6e 6b 20 74 68 61 74 20 6c   to think that l
2490: 69 6e 75 78 20 74 68 72 65 61 64 73 20 69 73 20  inux threads is 
24a0: 61 6e 20 61 62 6f 6d 69 6e 61 74 69 6f 6e 20 74  an abomination t
24b0: 6f 6f 2e 29 0a 2a 2a 20 54 68 65 20 63 6f 6e 73  oo.).** The cons
24c0: 65 71 75 65 6e 63 65 20 6f 66 20 74 68 69 73 20  equence of this 
24d0: 61 6c 6c 20 69 73 20 74 68 61 74 20 74 68 65 20  all is that the 
24e0: 68 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 74  hash table for t
24f0: 68 65 20 6c 6f 63 6b 49 6e 66 6f 0a 2a 2a 20 73  he lockInfo.** s
2500: 74 72 75 63 74 75 72 65 20 68 61 73 20 74 6f 20  tructure has to 
2510: 69 6e 63 6c 75 64 65 20 74 68 65 20 70 72 6f 63  include the proc
2520: 65 73 73 20 69 64 20 61 73 20 70 61 72 74 20 6f  ess id as part o
2530: 66 20 69 74 73 20 6b 65 79 20 62 65 63 61 75 73  f its key becaus
2540: 65 0a 2a 2a 20 6c 6f 63 6b 73 20 69 6e 20 64 69  e.** locks in di
2550: 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 73 20  fferent threads 
2560: 61 72 65 20 74 72 65 61 74 65 64 20 61 73 20 64  are treated as d
2570: 69 73 74 69 6e 63 74 2e 20 20 42 75 74 20 74 68  istinct.  But th
2580: 65 20 0a 2a 2a 20 6f 70 65 6e 43 6e 74 20 73 74  e .** openCnt st
2590: 72 75 63 74 75 72 65 20 73 68 6f 75 6c 64 20 6e  ructure should n
25a0: 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 70  ot include the p
25b0: 72 6f 63 65 73 73 20 69 64 20 69 6e 20 69 74 73  rocess id in its
25c0: 0a 2a 2a 20 6b 65 79 20 62 65 63 61 75 73 65 20  .** key because 
25d0: 63 6c 6f 73 65 28 29 20 63 6c 65 61 72 73 20 6c  close() clears l
25e0: 6f 63 6b 20 6f 6e 20 61 6c 6c 20 74 68 72 65 61  ock on all threa
25f0: 64 73 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 65  ds, not just the
2600: 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 68 72 65   current.** thre
2610: 61 64 2e 20 20 57 65 72 65 20 69 74 20 6e 6f 74  ad.  Were it not
2620: 20 66 6f 72 20 74 68 69 73 20 67 6f 6f 66 69 6e   for this goofin
2630: 65 73 73 20 69 6e 20 6c 69 6e 75 78 20 74 68 72  ess in linux thr
2640: 65 61 64 73 2c 20 77 65 20 63 6f 75 6c 64 0a 2a  eads, we could.*
2650: 2a 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 6f  * combine the lo
2660: 63 6b 49 6e 66 6f 20 61 6e 64 20 6f 70 65 6e 43  ckInfo and openC
2670: 6e 74 20 73 74 72 75 63 74 75 72 65 73 20 69 6e  nt structures in
2680: 74 6f 20 61 20 73 69 6e 67 6c 65 20 73 74 72 75  to a single stru
2690: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 32 30 30  cture..**.** 200
26a0: 34 2d 4a 75 6e 2d 32 38 3a 0a 2a 2a 20 4f 6e 20  4-Jun-28:.** On 
26b0: 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66  some versions of
26c0: 20 6c 69 6e 75 78 2c 20 74 68 72 65 61 64 73 20   linux, threads 
26d0: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63  can override eac
26e0: 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 0a  h others locks..
26f0: 2a 2a 20 4f 6e 20 6f 74 68 65 72 73 20 6e 6f 74  ** On others not
2700: 2e 20 20 53 6f 6d 65 74 69 6d 65 73 20 79 6f 75  .  Sometimes you
2710: 20 63 61 6e 20 63 68 61 6e 67 65 20 74 68 65 20   can change the 
2720: 62 65 68 61 76 69 6f 72 20 6f 6e 20 74 68 65 20  behavior on the 
2730: 73 61 6d 65 0a 2a 2a 20 73 79 73 74 65 6d 20 62  same.** system b
2740: 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 4c 44  y setting the LD
2750: 5f 41 53 53 55 4d 45 5f 4b 45 52 4e 45 4c 20 65  _ASSUME_KERNEL e
2760: 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
2770: 62 6c 65 2e 20 20 54 68 65 0a 2a 2a 20 50 4f 53  ble.  The.** POS
2780: 49 58 20 73 74 61 6e 64 61 72 64 20 69 73 20 73  IX standard is s
2790: 69 6c 65 6e 74 20 61 73 20 74 6f 20 77 68 69 63  ilent as to whic
27a0: 68 20 62 65 68 61 76 69 6f 72 20 69 73 20 63 6f  h behavior is co
27b0: 72 72 65 63 74 2c 20 61 73 20 66 61 72 0a 2a 2a  rrect, as far.**
27c0: 20 61 73 20 49 20 63 61 6e 20 74 65 6c 6c 2c 20   as I can tell, 
27d0: 73 6f 20 6f 74 68 65 72 20 76 65 72 73 69 6f 6e  so other version
27e0: 73 20 6f 66 20 75 6e 69 78 20 6d 69 67 68 74 20  s of unix might 
27f0: 73 68 6f 77 20 74 68 65 20 73 61 6d 65 0a 2a 2a  show the same.**
2800: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 2e 20   inconsistency. 
2810: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 74   There is no lit
2820: 74 6c 65 20 64 6f 75 62 74 20 69 6e 20 6d 79 20  tle doubt in my 
2830: 6d 69 6e 64 20 74 68 61 74 20 70 6f 73 69 78 0a  mind that posix.
2840: 2a 2a 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ** advisory lock
2850: 73 20 61 6e 64 20 6c 69 6e 75 78 20 74 68 72 65  s and linux thre
2860: 61 64 73 20 61 72 65 20 70 72 6f 66 6f 75 6e 64  ads are profound
2870: 6c 79 20 62 72 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a  ly broken..**.**
2880: 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
2890: 74 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63  the inconsistenc
28a0: 69 65 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20  ies, we have to 
28b0: 74 65 73 74 20 61 74 20 72 75 6e 74 69 6d 65 20  test at runtime 
28c0: 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e  .** whether or n
28d0: 6f 74 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f  ot threads can o
28e0: 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68  verride each oth
28f0: 65 72 73 20 6c 6f 63 6b 73 2e 20 20 54 68 69 73  ers locks.  This
2900: 20 74 65 73 74 0a 2a 2a 20 69 73 20 72 75 6e 20   test.** is run 
2910: 6f 6e 63 65 2c 20 74 68 65 20 66 69 72 73 74 20  once, the first 
2920: 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69 73  time any lock is
2930: 20 61 74 74 65 6d 70 74 65 64 2e 20 20 41 20 73   attempted.  A s
2940: 74 61 74 69 63 20 0a 2a 2a 20 76 61 72 69 61 62  tatic .** variab
2950: 6c 65 20 69 73 20 73 65 74 20 74 6f 20 72 65 63  le is set to rec
2960: 6f 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 20  ord the results 
2970: 6f 66 20 74 68 69 73 20 74 65 73 74 20 66 6f 72  of this test for
2980: 20 66 75 74 75 72 65 0a 2a 2a 20 75 73 65 2e 0a   future.** use..
2990: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  */../*.** An ins
29a0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
29b0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
29c0: 20 73 65 72 76 65 73 20 61 73 20 74 68 65 20 6b   serves as the k
29d0: 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f  ey used.** to lo
29e0: 63 61 74 65 20 61 20 70 61 72 74 69 63 75 6c 61  cate a particula
29f0: 72 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63  r lockInfo struc
2a00: 74 75 72 65 20 67 69 76 65 6e 20 69 74 73 20 69  ture given its i
2a10: 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  node..**.** If t
2a20: 68 72 65 61 64 73 20 63 61 6e 6e 6f 74 20 6f 76  hreads cannot ov
2a30: 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65  erride each othe
2a40: 72 73 20 6c 6f 63 6b 73 2c 20 74 68 65 6e 20 77  rs locks, then w
2a50: 65 20 73 65 74 20 74 68 65 0a 2a 2a 20 6c 6f 63  e set the.** loc
2a60: 6b 4b 65 79 2e 74 69 64 20 66 69 65 6c 64 20 74  kKey.tid field t
2a70: 6f 20 74 68 65 20 74 68 72 65 61 64 20 49 44 2e  o the thread ID.
2a80: 20 20 49 66 20 74 68 72 65 61 64 73 20 63 61 6e    If threads can
2a90: 20 6f 76 65 72 72 69 64 65 0a 2a 2a 20 65 61 63   override.** eac
2aa0: 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20 74  h others locks t
2ab0: 68 65 6e 20 74 69 64 20 69 73 20 61 6c 77 61 79  hen tid is alway
2ac0: 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
2ad0: 74 69 64 20 69 73 20 6f 6d 69 74 74 65 64 0a 2a  tid is omitted.*
2ae0: 2a 20 69 66 20 77 65 20 63 6f 6d 70 69 6c 65 20  * if we compile 
2af0: 77 69 74 68 6f 75 74 20 74 68 72 65 61 64 69 6e  without threadin
2b00: 67 20 73 75 70 70 6f 72 74 2e 0a 2a 2f 0a 73 74  g support..*/.st
2b10: 72 75 63 74 20 6c 6f 63 6b 4b 65 79 20 7b 0a 20  ruct lockKey {. 
2b20: 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20 20 20   dev_t dev;     
2b30: 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62    /* Device numb
2b40: 65 72 20 2a 2f 0a 20 20 69 6e 6f 5f 74 20 69 6e  er */.  ino_t in
2b50: 6f 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64  o;       /* Inod
2b60: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20  e number */.#if 
2b70: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
2b80: 45 0a 20 20 70 74 68 72 65 61 64 5f 74 20 74 69  E.  pthread_t ti
2b90: 64 3b 20 20 20 2f 2a 20 54 68 72 65 61 64 20 49  d;   /* Thread I
2ba0: 44 20 6f 72 20 7a 65 72 6f 20 69 66 20 74 68 72  D or zero if thr
2bb0: 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64  eads can overrid
2bc0: 65 20 65 61 63 68 20 6f 74 68 65 72 20 2a 2f 0a  e each other */.
2bd0: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
2be0: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
2bf0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
2c00: 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
2c10: 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70  ated for each op
2c20: 65 6e 0a 2a 2a 20 69 6e 6f 64 65 20 6f 6e 20 65  en.** inode on e
2c30: 61 63 68 20 74 68 72 65 61 64 20 77 69 74 68 20  ach thread with 
2c40: 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63  a different proc
2c50: 65 73 73 20 49 44 2e 20 20 28 54 68 72 65 61 64  ess ID.  (Thread
2c60: 73 20 68 61 76 65 0a 2a 2a 20 64 69 66 66 65 72  s have.** differ
2c70: 65 6e 74 20 70 72 6f 63 65 73 73 20 49 44 73 20  ent process IDs 
2c80: 6f 6e 20 6c 69 6e 75 78 2c 20 62 75 74 20 6e 6f  on linux, but no
2c90: 74 20 6f 6e 20 6d 6f 73 74 20 6f 74 68 65 72 20  t on most other 
2ca0: 75 6e 69 78 65 73 2e 29 0a 2a 2a 0a 2a 2a 20 41  unixes.).**.** A
2cb0: 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61   single inode ca
2cc0: 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20  n have multiple 
2cd0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
2ce0: 2c 20 73 6f 20 65 61 63 68 20 75 6e 69 78 46 69  , so each unixFi
2cf0: 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  le.** structure 
2d00: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
2d10: 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63  er to an instanc
2d20: 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  e of this object
2d30: 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a   and this.** obj
2d40: 65 63 74 20 6b 65 65 70 73 20 61 20 63 6f 75 6e  ect keeps a coun
2d50: 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  t of the number 
2d60: 6f 66 20 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e  of unixFile poin
2d70: 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73  ting to it..*/.s
2d80: 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 7b  truct lockInfo {
2d90: 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 4b 65  .  struct lockKe
2da0: 79 20 6b 65 79 3b 20 20 2f 2a 20 54 68 65 20 6c  y key;  /* The l
2db0: 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69  ookup key */.  i
2dc0: 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20  nt cnt;         
2dd0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2de0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 68 65   SHARED locks he
2df0: 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b  ld */.  int lock
2e00: 74 79 70 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  type;        /* 
2e10: 4f 6e 65 20 6f 66 20 53 48 41 52 45 44 5f 4c 4f  One of SHARED_LO
2e20: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
2e30: 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20  K etc. */.  int 
2e40: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
2e50: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f   /* Number of po
2e60: 69 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20 73  inters to this s
2e70: 74 72 75 63 74 75 72 65 20 2a 2f 0a 7d 3b 0a 0a  tructure */.};..
2e80: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
2e90: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
2ea0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 73 65 72  ng structure ser
2eb0: 76 65 73 20 61 73 20 74 68 65 20 6b 65 79 20 75  ves as the key u
2ec0: 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65  sed.** to locate
2ed0: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6f 70   a particular op
2ee0: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20  enCnt structure 
2ef0: 67 69 76 65 6e 20 69 74 73 20 69 6e 6f 64 65 2e  given its inode.
2f00: 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 74 68 65    This.** is the
2f10: 20 73 61 6d 65 20 61 73 20 74 68 65 20 6c 6f 63   same as the loc
2f20: 6b 4b 65 79 20 65 78 63 65 70 74 20 74 68 61 74  kKey except that
2f30: 20 74 68 65 20 74 68 72 65 61 64 20 49 44 20 69   the thread ID i
2f40: 73 20 6f 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73 74  s omitted..*/.st
2f50: 72 75 63 74 20 6f 70 65 6e 4b 65 79 20 7b 0a 20  ruct openKey {. 
2f60: 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20 2f 2a   dev_t dev;   /*
2f70: 20 44 65 76 69 63 65 20 6e 75 6d 62 65 72 20 2a   Device number *
2f80: 2f 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20  /.  ino_t ino;  
2f90: 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72   /* Inode number
2fa0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e   */.};../*.** An
2fb0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
2fc0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
2fd0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
2fe0: 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a  d for each open.
2ff0: 2a 2a 20 69 6e 6f 64 65 2e 20 20 54 68 69 73 20  ** inode.  This 
3000: 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20  structure keeps 
3010: 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6e 75 6d  track of the num
3020: 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 6f 6e 20  ber of locks on 
3030: 74 68 61 74 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20  that.** inode.  
3040: 49 66 20 61 20 63 6c 6f 73 65 20 69 73 20 61 74  If a close is at
3050: 74 65 6d 70 74 65 64 20 61 67 61 69 6e 73 74 20  tempted against 
3060: 61 6e 20 69 6e 6f 64 65 20 74 68 61 74 20 69 73  an inode that is
3070: 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6c 6f 63 6b   holding.** lock
3080: 73 2c 20 74 68 65 20 63 6c 6f 73 65 20 69 73 20  s, the close is 
3090: 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61  deferred until a
30a0: 6c 6c 20 6c 6f 63 6b 73 20 63 6c 65 61 72 20 62  ll locks clear b
30b0: 79 20 61 64 64 69 6e 67 20 74 68 65 0a 2a 2a 20  y adding the.** 
30c0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
30d0: 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 74 6f 20  to be closed to 
30e0: 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 69 73 74  the pending list
30f0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6f 70 65 6e  ..*/.struct open
3100: 43 6e 74 20 7b 0a 20 20 73 74 72 75 63 74 20 6f  Cnt {.  struct o
3110: 70 65 6e 4b 65 79 20 6b 65 79 3b 20 20 20 2f 2a  penKey key;   /*
3120: 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20   The lookup key 
3130: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
3140: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3150: 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73  mber of pointers
3160: 20 74 6f 20 74 68 69 73 20 73 74 72 75 63 74 75   to this structu
3170: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63  re */.  int nLoc
3180: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k;            /*
3190: 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74   Number of outst
31a0: 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 2a 2f 0a  anding locks */.
31b0: 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e 67 3b 20    int nPending; 
31c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
31d0: 72 20 6f 66 20 70 65 6e 64 69 6e 67 20 63 6c 6f  r of pending clo
31e0: 73 65 28 29 20 6f 70 65 72 61 74 69 6f 6e 73 20  se() operations 
31f0: 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 6e 64 69  */.  int *aPendi
3200: 6e 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  ng;        /* Ma
3210: 6c 6c 6f 63 65 64 20 73 70 61 63 65 20 68 6f 6c  lloced space hol
3220: 64 69 6e 67 20 66 64 27 73 20 61 77 61 69 74 69  ding fd's awaiti
3230: 6e 67 20 61 20 63 6c 6f 73 65 28 29 20 2a 2f 0a  ng a close() */.
3240: 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 73 65  };../* .** These
3250: 20 68 61 73 68 20 74 61 62 6c 65 73 20 6d 61 70   hash tables map
3260: 20 69 6e 6f 64 65 73 20 61 6e 64 20 66 69 6c 65   inodes and file
3270: 20 64 65 73 63 72 69 70 74 6f 72 73 20 28 72 65   descriptors (re
3280: 61 6c 6c 79 2c 20 6c 6f 63 6b 4b 65 79 20 61 6e  ally, lockKey an
3290: 64 0a 2a 2a 20 6f 70 65 6e 4b 65 79 20 73 74 72  d.** openKey str
32a0: 75 63 74 75 72 65 73 29 20 69 6e 74 6f 20 6c 6f  uctures) into lo
32b0: 63 6b 49 6e 66 6f 20 61 6e 64 20 6f 70 65 6e 43  ckInfo and openC
32c0: 6e 74 20 73 74 72 75 63 74 75 72 65 73 2e 20 20  nt structures.  
32d0: 41 63 63 65 73 73 20 74 6f 20 0a 2a 2a 20 74 68  Access to .** th
32e0: 65 73 65 20 68 61 73 68 20 74 61 62 6c 65 73 20  ese hash tables 
32f0: 6d 75 73 74 20 62 65 20 70 72 6f 74 65 63 74 65  must be protecte
3300: 64 20 62 79 20 61 20 6d 75 74 65 78 2e 0a 2a 2f  d by a mutex..*/
3310: 0a 73 74 61 74 69 63 20 48 61 73 68 20 6c 6f 63  .static Hash loc
3320: 6b 48 61 73 68 20 3d 20 7b 53 51 4c 49 54 45 5f  kHash = {SQLITE_
3330: 48 41 53 48 5f 42 49 4e 41 52 59 2c 20 30 2c 20  HASH_BINARY, 0, 
3340: 30 2c 20 30 2c 20 30 2c 20 30 7d 3b 0a 73 74 61  0, 0, 0, 0};.sta
3350: 74 69 63 20 48 61 73 68 20 6f 70 65 6e 48 61 73  tic Hash openHas
3360: 68 20 3d 20 7b 53 51 4c 49 54 45 5f 48 41 53 48  h = {SQLITE_HASH
3370: 5f 42 49 4e 41 52 59 2c 20 30 2c 20 30 2c 20 30  _BINARY, 0, 0, 0
3380: 2c 20 30 2c 20 30 7d 3b 0a 0a 23 69 66 64 65 66  , 0, 0};..#ifdef
3390: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
33a0: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a  OCKING_STYLE./*.
33b0: 2a 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73  ** The locking s
33c0: 74 79 6c 65 73 20 61 72 65 20 61 73 73 6f 63 69  tyles are associ
33d0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64 69  ated with the di
33e0: 66 66 65 72 65 6e 74 20 66 69 6c 65 20 6c 6f 63  fferent file loc
33f0: 6b 69 6e 67 0a 2a 2a 20 63 61 70 61 62 69 6c 69  king.** capabili
3400: 74 69 65 73 20 73 75 70 70 6f 72 74 65 64 20 62  ties supported b
3410: 79 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  y different file
3420: 20 73 79 73 74 65 6d 73 2e 20 20 0a 2a 2a 0a 2a   systems.  .**.*
3430: 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 69 6e 67 20  * POSIX locking 
3440: 73 74 79 6c 65 20 66 75 6c 6c 79 20 73 75 70 70  style fully supp
3450: 6f 72 74 73 20 73 68 61 72 65 64 20 61 6e 64 20  orts shared and 
3460: 65 78 63 6c 75 73 69 76 65 20 62 79 74 65 2d 72  exclusive byte-r
3470: 61 6e 67 65 20 6c 6f 63 6b 73 20 0a 2a 2a 20 41  ange locks .** A
3480: 44 50 20 6c 6f 63 6b 69 6e 67 20 6f 6e 6c 79 20  DP locking only 
3490: 73 75 70 70 6f 72 74 73 20 65 78 63 6c 75 73 69  supports exclusi
34a0: 76 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f  ve byte-range lo
34b0: 63 6b 73 0a 2a 2a 20 46 4c 4f 43 4b 20 6f 6e 6c  cks.** FLOCK onl
34c0: 79 20 73 75 70 70 6f 72 74 73 20 61 20 73 69 6e  y supports a sin
34d0: 67 6c 65 20 66 69 6c 65 2d 67 6c 6f 62 61 6c 20  gle file-global 
34e0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a  exclusive lock.*
34f0: 2a 20 44 4f 54 4c 4f 43 4b 20 69 73 6e 27 74 20  * DOTLOCK isn't 
3500: 61 20 74 72 75 65 20 6c 6f 63 6b 69 6e 67 20 73  a true locking s
3510: 74 79 6c 65 2c 20 69 74 20 72 65 66 65 72 73 20  tyle, it refers 
3520: 74 6f 20 74 68 65 20 75 73 65 20 6f 66 20 61 20  to the use of a 
3530: 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20 66 69 6c  special.**   fil
3540: 65 20 6e 61 6d 65 64 20 74 68 65 20 73 61 6d 65  e named the same
3550: 20 61 73 20 74 68 65 20 64 61 74 61 62 61 73 65   as the database
3560: 20 66 69 6c 65 20 77 69 74 68 20 61 20 27 2e 6c   file with a '.l
3570: 6f 63 6b 27 20 65 78 74 65 6e 73 69 6f 6e 2c 20  ock' extension, 
3580: 74 68 69 73 0a 2a 2a 20 20 20 63 61 6e 20 62 65  this.**   can be
3590: 20 75 73 65 64 20 6f 6e 20 66 69 6c 65 20 73 79   used on file sy
35a0: 73 74 65 6d 73 20 74 68 61 74 20 64 6f 20 6e 6f  stems that do no
35b0: 74 20 6f 66 66 65 72 20 61 6e 79 20 72 65 6c 69  t offer any reli
35c0: 61 62 6c 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  able file lockin
35d0: 67 0a 2a 2a 20 4e 4f 20 6c 6f 63 6b 69 6e 67 20  g.** NO locking 
35e0: 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 6c 6f  means that no lo
35f0: 63 6b 69 6e 67 20 77 69 6c 6c 20 62 65 20 61 74  cking will be at
3600: 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 69 73  tempted, this is
3610: 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 0a 2a   only used for.*
3620: 2a 20 20 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69  *   read-only fi
3630: 6c 65 20 73 79 73 74 65 6d 73 20 63 75 72 72 65  le systems curre
3640: 6e 74 6c 79 0a 2a 2a 20 55 4e 53 55 50 50 4f 52  ntly.** UNSUPPOR
3650: 54 45 44 20 6d 65 61 6e 73 20 74 68 61 74 20 6e  TED means that n
3660: 6f 20 6c 6f 63 6b 69 6e 67 20 77 69 6c 6c 20 62  o locking will b
3670: 65 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69  e attempted, thi
3680: 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66  s is only used f
3690: 6f 72 0a 2a 2a 20 20 20 66 69 6c 65 20 73 79 73  or.**   file sys
36a0: 74 65 6d 73 20 74 68 61 74 20 61 72 65 20 6b 6e  tems that are kn
36b0: 6f 77 6e 20 74 6f 20 62 65 20 75 6e 73 75 70 70  own to be unsupp
36c0: 6f 72 74 65 64 0a 2a 2f 0a 74 79 70 65 64 65 66  orted.*/.typedef
36d0: 20 65 6e 75 6d 20 7b 0a 20 20 20 20 20 20 20 20   enum {.        
36e0: 70 6f 73 69 78 4c 6f 63 6b 69 6e 67 53 74 79 6c  posixLockingStyl
36f0: 65 20 3d 20 30 2c 20 20 20 20 20 20 20 2f 2a 20  e = 0,       /* 
3700: 73 74 61 6e 64 61 72 64 20 70 6f 73 69 78 2d 61  standard posix-a
3710: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 2a 2f  dvisory locks */
3720: 0a 20 20 20 20 20 20 20 20 61 66 70 4c 6f 63 6b  .        afpLock
3730: 69 6e 67 53 74 79 6c 65 2c 20 20 20 20 20 20 20  ingStyle,       
3740: 20 20 20 20 20 20 2f 2a 20 75 73 65 20 61 66 70        /* use afp
3750: 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 20 20   locks */.      
3760: 20 20 66 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74    flockLockingSt
3770: 79 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  yle,           /
3780: 2a 20 75 73 65 20 66 6c 6f 63 6b 28 29 20 2a 2f  * use flock() */
3790: 0a 20 20 20 20 20 20 20 20 64 6f 74 6c 6f 63 6b  .        dotlock
37a0: 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 2c 20 20 20  LockingStyle,   
37b0: 20 20 20 20 20 20 2f 2a 20 75 73 65 20 3c 66 69        /* use <fi
37c0: 6c 65 3e 2e 6c 6f 63 6b 20 66 69 6c 65 73 20 2a  le>.lock files *
37d0: 2f 0a 20 20 20 20 20 20 20 20 6e 6f 4c 6f 63 6b  /.        noLock
37e0: 69 6e 67 53 74 79 6c 65 2c 20 20 20 20 20 20 20  ingStyle,       
37f0: 20 20 20 20 20 20 20 2f 2a 20 75 73 65 66 75 6c         /* useful
3800: 20 66 6f 72 20 72 65 61 64 2d 6f 6e 6c 79 20 66   for read-only f
3810: 69 6c 65 20 73 79 73 74 65 6d 20 2a 2f 0a 20 20  ile system */.  
3820: 20 20 20 20 20 20 75 6e 73 75 70 70 6f 72 74 65        unsupporte
3830: 64 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 20 20  dLockingStyle   
3840: 20 20 20 2f 2a 20 69 6e 64 69 63 61 74 65 73 20     /* indicates 
3850: 75 6e 73 75 70 70 6f 72 74 65 64 20 66 69 6c 65  unsupported file
3860: 20 73 79 73 74 65 6d 20 2a 2f 0a 7d 20 73 71 6c   system */.} sql
3870: 69 74 65 33 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  ite3LockingStyle
3880: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
3890: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
38a0: 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  G_STYLE */../*.*
38b0: 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f  * Helper functio
38c0: 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64  ns to obtain and
38d0: 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20   relinquish the 
38e0: 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 0a 2a 2f  global mutex..*/
38f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 6e 74  .static void ent
3900: 65 72 4d 75 74 65 78 28 29 7b 0a 20 20 73 71 6c  erMutex(){.  sql
3910: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
3920: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61  (sqlite3_mutex_a
3930: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
3940: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
3950: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
3960: 20 6c 65 61 76 65 4d 75 74 65 78 28 29 7b 0a 20   leaveMutex(){. 
3970: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
3980: 65 61 76 65 28 73 71 6c 69 74 65 33 5f 6d 75 74  eave(sqlite3_mut
3990: 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
39a0: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
39b0: 54 45 52 29 29 3b 0a 7d 0a 0a 23 69 66 20 53 51  TER));.}..#if SQ
39c0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
39d0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72 69 61  /*.** This varia
39e0: 62 6c 65 20 72 65 63 6f 72 64 73 20 77 68 65 74  ble records whet
39f0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61  her or not threa
3a00: 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20  ds can override 
3a10: 65 61 63 68 20 6f 74 68 65 72 73 0a 2a 2a 20 6c  each others.** l
3a20: 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 30  ocks..**.**    0
3a30: 3a 20 20 4e 6f 2e 20 20 54 68 72 65 61 64 73 20  :  No.  Threads 
3a40: 63 61 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20  cannot override 
3a50: 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b  each others lock
3a60: 73 2e 0a 2a 2a 20 20 20 20 31 3a 20 20 59 65 73  s..**    1:  Yes
3a70: 2e 20 20 54 68 72 65 61 64 73 20 63 61 6e 20 6f  .  Threads can o
3a80: 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68  verride each oth
3a90: 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2a 20 20 20  ers locks..**   
3aa0: 2d 31 3a 20 20 57 65 20 64 6f 6e 27 74 20 6b 6e  -1:  We don't kn
3ab0: 6f 77 20 79 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  ow yet..**.** On
3ac0: 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 77   some systems, w
3ad0: 65 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c  e know at compil
3ae0: 65 2d 74 69 6d 65 20 69 66 20 74 68 72 65 61 64  e-time if thread
3af0: 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65  s can override e
3b00: 61 63 68 0a 2a 2a 20 6f 74 68 65 72 73 20 6c 6f  ach.** others lo
3b10: 63 6b 73 2e 20 20 4f 6e 20 74 68 6f 73 65 20 73  cks.  On those s
3b20: 79 73 74 65 6d 73 2c 20 74 68 65 20 53 51 4c 49  ystems, the SQLI
3b30: 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49  TE_THREAD_OVERRI
3b40: 44 45 5f 4c 4f 43 4b 20 6d 61 63 72 6f 0a 2a 2a  DE_LOCK macro.**
3b50: 20 77 69 6c 6c 20 62 65 20 73 65 74 20 61 70 70   will be set app
3b60: 72 6f 70 72 69 61 74 65 6c 79 2e 20 20 4f 6e 20  ropriately.  On 
3b70: 6f 74 68 65 72 20 73 79 73 74 65 6d 73 2c 20 77  other systems, w
3b80: 65 20 68 61 76 65 20 74 6f 20 63 68 65 63 6b 20  e have to check 
3b90: 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2e 20 20  at.** runtime.  
3ba0: 4f 6e 20 74 68 65 73 65 20 6c 61 74 74 65 72 20  On these latter 
3bb0: 73 79 73 74 65 6d 73 2c 20 53 51 4c 54 49 45 5f  systems, SQLTIE_
3bc0: 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f  THREAD_OVERRIDE_
3bd0: 4c 4f 43 4b 20 69 73 0a 2a 2a 20 75 6e 64 65 66  LOCK is.** undef
3be0: 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ined..**.** This
3bf0: 20 76 61 72 69 61 62 6c 65 20 6e 6f 72 6d 61 6c   variable normal
3c00: 6c 79 20 68 61 73 20 66 69 6c 65 20 73 63 6f 70  ly has file scop
3c10: 65 20 6f 6e 6c 79 2e 20 20 42 75 74 20 64 75 72  e only.  But dur
3c20: 69 6e 67 20 74 65 73 74 69 6e 67 2c 20 77 65 20  ing testing, we 
3c30: 6d 61 6b 65 0a 2a 2a 20 69 74 20 61 20 67 6c 6f  make.** it a glo
3c40: 62 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20  bal so that the 
3c50: 74 65 73 74 20 63 6f 64 65 20 63 61 6e 20 63 68  test code can ch
3c60: 61 6e 67 65 20 69 74 73 20 76 61 6c 75 65 20 69  ange its value i
3c70: 6e 20 6f 72 64 65 72 20 74 6f 20 76 65 72 69 66  n order to verif
3c80: 79 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 72 69  y.** that the ri
3c90: 67 68 74 20 73 74 75 66 66 20 68 61 70 70 65 6e  ght stuff happen
3ca0: 73 20 69 6e 20 65 69 74 68 65 72 20 63 61 73 65  s in either case
3cb0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
3cc0: 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52  ITE_THREAD_OVERR
3cd0: 49 44 45 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e  IDE_LOCK.# defin
3ce0: 65 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f  e SQLITE_THREAD_
3cf0: 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 20 2d 31  OVERRIDE_LOCK -1
3d00: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
3d10: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 74  QLITE_TEST.int t
3d20: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
3d30: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20  chOthersLocks = 
3d40: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56  SQLITE_THREAD_OV
3d50: 45 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a 23 65 6c  ERRIDE_LOCK;.#el
3d60: 73 65 0a 73 74 61 74 69 63 20 69 6e 74 20 74 68  se.static int th
3d70: 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63  readsOverrideEac
3d80: 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20 53  hOthersLocks = S
3d90: 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45  QLITE_THREAD_OVE
3da0: 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a 23 65 6e 64  RRIDE_LOCK;.#end
3db0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 73  if../*.** This s
3dc0: 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 69  tructure holds i
3dd0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73 65  nformation passe
3de0: 64 20 69 6e 74 6f 20 69 6e 64 69 76 69 64 75 61  d into individua
3df0: 6c 20 74 65 73 74 0a 2a 2a 20 74 68 72 65 61 64  l test.** thread
3e00: 73 20 62 79 20 74 68 65 20 74 65 73 74 54 68 72  s by the testThr
3e10: 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69  eadLockingBehavi
3e20: 6f 72 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  or() routine..*/
3e30: 0a 73 74 72 75 63 74 20 74 68 72 65 61 64 54 65  .struct threadTe
3e40: 73 74 44 61 74 61 20 7b 0a 20 20 69 6e 74 20 66  stData {.  int f
3e50: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
3e60: 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 62 65 20    /* File to be 
3e70: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 73 74 72 75  locked */.  stru
3e80: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 20 20  ct flock lock;  
3e90: 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e     /* The lockin
3ea0: 67 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  g operation */. 
3eb0: 20 69 6e 74 20 72 65 73 75 6c 74 3b 20 20 20 20   int result;    
3ec0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
3ed0: 74 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  t of the locking
3ee0: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b   operation */.};
3ef0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
3f00: 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a  LOCK_TRACE./*.**
3f10: 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72   Print out infor
3f20: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c  mation about all
3f30: 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69   locking operati
3f40: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
3f50: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3f60: 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74  for troubleshoot
3f70: 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c  ing locks on mul
3f80: 74 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c  tithreaded.** pl
3f90: 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65  atforms.  Enable
3fa0: 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69   by compiling wi
3fb0: 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f  th the -DSQLITE_
3fc0: 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f  LOCK_TRACE.** co
3fd0: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f  mmand-line optio
3fe0: 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65  n on the compile
3ff0: 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73  r.  This code is
4000: 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72   normally.** tur
4010: 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74  ned off..*/.stat
4020: 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65  ic int lockTrace
4030: 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c  (int fd, int op,
4040: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70   struct flock *p
4050: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61  ){.  char *zOpNa
4060: 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e  me, *zType;.  in
4070: 74 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64  t s;.  int saved
4080: 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d  Errno;.  if( op=
4090: 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20  =F_GETLK ){.    
40a0: 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b  zOpName = "GETLK
40b0: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  ";.  }else if( o
40c0: 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20  p==F_SETLK ){.  
40d0: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54    zOpName = "SET
40e0: 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  LK";.  }else{.  
40f0: 20 20 73 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20    s = fcntl(fd, 
4100: 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69  op, p);.    sqli
4110: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
4120: 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64  fcntl unknown %d
4130: 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f   %d %d\n", fd, o
4140: 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74 75 72  p, s);.    retur
4150: 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n s;.  }.  if( p
4160: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  ->l_type==F_RDLC
4170: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
4180: 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "RDLCK";.  }els
4190: 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d  e if( p->l_type=
41a0: 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_WRLCK ){.    
41b0: 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b  zType = "WRLCK";
41c0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
41d0: 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  l_type==F_UNLCK 
41e0: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
41f0: 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b  UNLCK";.  }else{
4200: 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29  .    assert( 0 )
4210: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
4220: 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45  p->l_whence==SEE
4230: 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d 20 66  K_SET );.  s = f
4240: 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b  cntl(fd, op, p);
4250: 0a 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20  .  savedErrno = 
4260: 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33  errno;.  sqlite3
4270: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
4280: 74 6c 20 25 64 20 25 64 20 25 73 20 25 73 20 25  tl %d %d %s %s %
4290: 64 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20  d %d %d %d\n",. 
42a0: 20 20 20 20 74 68 72 65 61 64 69 64 2c 20 66 64      threadid, fd
42b0: 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65  , zOpName, zType
42c0: 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72  , (int)p->l_star
42d0: 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e  t, (int)p->l_len
42e0: 2c 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c  ,.     (int)p->l
42f0: 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20  _pid, s);.  if( 
4300: 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46  s==(-1) && op==F
4310: 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f  _SETLK && (p->l_
4320: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c  type==F_RDLCK ||
4330: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52   p->l_type==F_WR
4340: 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75  LCK) ){.    stru
4350: 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20  ct flock l2;.   
4360: 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20 66 63   l2 = *p;.    fc
4370: 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c  ntl(fd, F_GETLK,
4380: 20 26 6c 32 29 3b 0a 20 20 20 20 69 66 28 20 6c   &l2);.    if( l
4390: 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  2.l_type==F_RDLC
43a0: 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65  K ){.      zType
43b0: 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 20 20   = "RDLCK";.    
43c0: 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74  }else if( l2.l_t
43d0: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a  ype==F_WRLCK ){.
43e0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57        zType = "W
43f0: 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  RLCK";.    }else
4400: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
4410: 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
4420: 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22   zType = "UNLCK"
4430: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4440: 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a     assert( 0 );.
4450: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
4460: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63  3DebugPrintf("fc
4470: 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65 61 73  ntl-failure-reas
4480: 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25 64 5c  on: %s %d %d %d\
4490: 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54 79 70 65  n",.       zType
44a0: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74 61 72  , (int)l2.l_star
44b0: 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e  t, (int)l2.l_len
44c0: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69 64 29  , (int)l2.l_pid)
44d0: 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20 3d 20  ;.  }.  errno = 
44e0: 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 72 65  savedErrno;.  re
44f0: 74 75 72 6e 20 73 3b 0a 7d 0a 23 64 65 66 69 6e  turn s;.}.#defin
4500: 65 20 66 63 6e 74 6c 20 6c 6f 63 6b 54 72 61 63  e fcntl lockTrac
4510: 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
4520: 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a 2f  TE_LOCK_TRACE */
4530: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 65 73 74  ../*.** The test
4540: 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68  ThreadLockingBeh
4550: 61 76 69 6f 72 28 29 20 72 6f 75 74 69 6e 65 20  avior() routine 
4560: 6c 61 75 6e 63 68 65 73 20 74 77 6f 20 73 65 70  launches two sep
4570: 61 72 61 74 65 0a 2a 2a 20 74 68 72 65 61 64 73  arate.** threads
4580: 20 6f 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65   on this routine
4590: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
45a0: 61 74 74 65 6d 70 74 73 20 74 6f 20 6c 6f 63 6b  attempts to lock
45b0: 20 61 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72   a file.** descr
45c0: 69 70 74 6f 72 20 74 68 65 6e 20 72 65 74 75 72  iptor then retur
45d0: 6e 73 2e 20 20 54 68 65 20 73 75 63 63 65 73 73  ns.  The success
45e0: 20 6f 72 20 66 61 69 6c 75 72 65 20 6f 66 20 74   or failure of t
45f0: 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20 61  hat attempt.** a
4600: 6c 6c 6f 77 73 20 74 68 65 20 74 65 73 74 54 68  llows the testTh
4610: 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76  readLockingBehav
4620: 69 6f 72 28 29 20 70 72 6f 63 65 64 75 72 65 20  ior() procedure 
4630: 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20  to determine.** 
4640: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
4650: 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72  hreads can overr
4660: 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20  ide each others 
4670: 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  locks..*/.static
4680: 20 76 6f 69 64 20 2a 74 68 72 65 61 64 4c 6f 63   void *threadLoc
4690: 6b 69 6e 67 54 65 73 74 28 76 6f 69 64 20 2a 70  kingTest(void *p
46a0: 41 72 67 29 7b 0a 20 20 73 74 72 75 63 74 20 74  Arg){.  struct t
46b0: 68 72 65 61 64 54 65 73 74 44 61 74 61 20 2a 70  hreadTestData *p
46c0: 44 61 74 61 20 3d 20 28 73 74 72 75 63 74 20 74  Data = (struct t
46d0: 68 72 65 61 64 54 65 73 74 44 61 74 61 2a 29 70  hreadTestData*)p
46e0: 41 72 67 3b 0a 20 20 70 44 61 74 61 2d 3e 72 65  Arg;.  pData->re
46f0: 73 75 6c 74 20 3d 20 66 63 6e 74 6c 28 70 44 61  sult = fcntl(pDa
4700: 74 61 2d 3e 66 64 2c 20 46 5f 53 45 54 4c 4b 2c  ta->fd, F_SETLK,
4710: 20 26 70 44 61 74 61 2d 3e 6c 6f 63 6b 29 3b 0a   &pData->lock);.
4720: 20 20 72 65 74 75 72 6e 20 70 41 72 67 3b 0a 7d    return pArg;.}
4730: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f  ../*.** This pro
4740: 63 65 64 75 72 65 20 61 74 74 65 6d 70 74 73 20  cedure attempts 
4750: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
4760: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65  ther or not thre
4770: 61 64 73 0a 2a 2a 20 63 61 6e 20 6f 76 65 72 72  ads.** can overr
4780: 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20  ide each others 
4790: 6c 6f 63 6b 73 20 74 68 65 6e 20 73 65 74 73 20  locks then sets 
47a0: 74 68 65 20 0a 2a 2a 20 74 68 72 65 61 64 73 4f  the .** threadsO
47b0: 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72  verrideEachOther
47c0: 73 4c 6f 63 6b 73 20 76 61 72 69 61 62 6c 65 20  sLocks variable 
47d0: 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 0a 2a  appropriately..*
47e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  /.static void te
47f0: 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42  stThreadLockingB
4800: 65 68 61 76 69 6f 72 28 69 6e 74 20 66 64 5f 6f  ehavior(int fd_o
4810: 72 69 67 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a  rig){.  int fd;.
4820: 20 20 73 74 72 75 63 74 20 74 68 72 65 61 64 54    struct threadT
4830: 65 73 74 44 61 74 61 20 64 5b 32 5d 3b 0a 20 20  estData d[2];.  
4840: 70 74 68 72 65 61 64 5f 74 20 74 5b 32 5d 3b 0a  pthread_t t[2];.
4850: 0a 20 20 66 64 20 3d 20 64 75 70 28 66 64 5f 6f  .  fd = dup(fd_o
4860: 72 69 67 29 3b 0a 20 20 69 66 28 20 66 64 3c 30  rig);.  if( fd<0
4870: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d   ) return;.  mem
4880: 73 65 74 28 64 2c 20 30 2c 20 73 69 7a 65 6f 66  set(d, 0, sizeof
4890: 28 64 29 29 3b 0a 20 20 64 5b 30 5d 2e 66 64 20  (d));.  d[0].fd 
48a0: 3d 20 66 64 3b 0a 20 20 64 5b 30 5d 2e 6c 6f 63  = fd;.  d[0].loc
48b0: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  k.l_type = F_RDL
48c0: 43 4b 3b 0a 20 20 64 5b 30 5d 2e 6c 6f 63 6b 2e  CK;.  d[0].lock.
48d0: 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 64 5b 30  l_len = 1;.  d[0
48e0: 5d 2e 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d  ].lock.l_start =
48f0: 20 30 3b 0a 20 20 64 5b 30 5d 2e 6c 6f 63 6b 2e   0;.  d[0].lock.
4900: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
4910: 53 45 54 3b 0a 20 20 64 5b 31 5d 20 3d 20 64 5b  SET;.  d[1] = d[
4920: 30 5d 3b 0a 20 20 64 5b 31 5d 2e 6c 6f 63 6b 2e  0];.  d[1].lock.
4930: 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b  l_type = F_WRLCK
4940: 3b 0a 20 20 70 74 68 72 65 61 64 5f 63 72 65 61  ;.  pthread_crea
4950: 74 65 28 26 74 5b 30 5d 2c 20 30 2c 20 74 68 72  te(&t[0], 0, thr
4960: 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73 74 2c 20  eadLockingTest, 
4970: 26 64 5b 30 5d 29 3b 0a 20 20 70 74 68 72 65 61  &d[0]);.  pthrea
4980: 64 5f 63 72 65 61 74 65 28 26 74 5b 31 5d 2c 20  d_create(&t[1], 
4990: 30 2c 20 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67  0, threadLocking
49a0: 54 65 73 74 2c 20 26 64 5b 31 5d 29 3b 0a 20 20  Test, &d[1]);.  
49b0: 70 74 68 72 65 61 64 5f 6a 6f 69 6e 28 74 5b 30  pthread_join(t[0
49c0: 5d 2c 20 30 29 3b 0a 20 20 70 74 68 72 65 61 64  ], 0);.  pthread
49d0: 5f 6a 6f 69 6e 28 74 5b 31 5d 2c 20 30 29 3b 0a  _join(t[1], 0);.
49e0: 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 74    close(fd);.  t
49f0: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
4a00: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20  chOthersLocks = 
4a10: 20 64 5b 30 5d 2e 72 65 73 75 6c 74 3d 3d 30 20   d[0].result==0 
4a20: 26 26 20 64 5b 31 5d 2e 72 65 73 75 6c 74 3d 3d  && d[1].result==
4a30: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  0;.}.#endif /* S
4a40: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
4a50: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61   */../*.** Relea
4a60: 73 65 20 61 20 6c 6f 63 6b 49 6e 66 6f 20 73 74  se a lockInfo st
4a70: 72 75 63 74 75 72 65 20 70 72 65 76 69 6f 75 73  ructure previous
4a80: 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ly allocated by 
4a90: 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e 0a  findLockInfo()..
4aa0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
4ab0: 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 73  eleaseLockInfo(s
4ac0: 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a  truct lockInfo *
4ad0: 70 4c 6f 63 6b 29 7b 0a 20 20 69 66 20 28 70 4c  pLock){.  if (pL
4ae0: 6f 63 6b 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20  ock == NULL).   
4af0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 4c 6f 63 6b   return;.  pLock
4b00: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
4b10: 70 4c 6f 63 6b 2d 3e 6e 52 65 66 3d 3d 30 20 29  pLock->nRef==0 )
4b20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73  {.    sqlite3Has
4b30: 68 49 6e 73 65 72 74 28 26 6c 6f 63 6b 48 61 73  hInsert(&lockHas
4b40: 68 2c 20 26 70 4c 6f 63 6b 2d 3e 6b 65 79 2c 20  h, &pLock->key, 
4b50: 73 69 7a 65 6f 66 28 70 4c 6f 63 6b 2d 3e 6b 65  sizeof(pLock->ke
4b60: 79 29 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  y), 0);.    sqli
4b70: 74 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b  te3_free(pLock);
4b80: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
4b90: 6c 65 61 73 65 20 61 20 6f 70 65 6e 43 6e 74 20  lease a openCnt 
4ba0: 73 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f  structure previo
4bb0: 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62  usly allocated b
4bc0: 79 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29  y findLockInfo()
4bd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4be0: 20 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28   releaseOpenCnt(
4bf0: 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a  struct openCnt *
4c00: 70 4f 70 65 6e 29 7b 0a 20 20 69 66 20 28 70 4f  pOpen){.  if (pO
4c10: 70 65 6e 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20  pen == NULL).   
4c20: 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 65 6e   return;.  pOpen
4c30: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
4c40: 70 4f 70 65 6e 2d 3e 6e 52 65 66 3d 3d 30 20 29  pOpen->nRef==0 )
4c50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73  {.    sqlite3Has
4c60: 68 49 6e 73 65 72 74 28 26 6f 70 65 6e 48 61 73  hInsert(&openHas
4c70: 68 2c 20 26 70 4f 70 65 6e 2d 3e 6b 65 79 2c 20  h, &pOpen->key, 
4c80: 73 69 7a 65 6f 66 28 70 4f 70 65 6e 2d 3e 6b 65  sizeof(pOpen->ke
4c90: 79 29 2c 20 30 29 3b 0a 20 20 20 20 66 72 65 65  y), 0);.    free
4ca0: 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67  (pOpen->aPending
4cb0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
4cc0: 72 65 65 28 70 4f 70 65 6e 29 3b 0a 20 20 7d 0a  ree(pOpen);.  }.
4cd0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
4ce0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
4cf0: 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 65 73 74  STYLE./*.** Test
4d00: 73 20 61 20 62 79 74 65 2d 72 61 6e 67 65 20 6c  s a byte-range l
4d10: 6f 63 6b 69 6e 67 20 71 75 65 72 79 20 74 6f 20  ocking query to 
4d20: 73 65 65 20 69 66 20 62 79 74 65 20 72 61 6e 67  see if byte rang
4d30: 65 20 6c 6f 63 6b 73 20 61 72 65 20 0a 2a 2a 20  e locks are .** 
4d40: 73 75 70 70 6f 72 74 65 64 2c 20 69 66 20 6e 6f  supported, if no
4d50: 74 20 77 65 20 66 61 6c 6c 20 62 61 63 6b 20 74  t we fall back t
4d60: 6f 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  o dotlockLocking
4d70: 53 74 79 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  Style..*/.static
4d80: 20 73 71 6c 69 74 65 33 4c 6f 63 6b 69 6e 67 53   sqlite3LockingS
4d90: 74 79 6c 65 20 73 71 6c 69 74 65 33 54 65 73 74  tyle sqlite3Test
4da0: 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 0a 20 20  LockingStyle(.  
4db0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
4dc0: 50 61 74 68 2c 20 0a 20 20 69 6e 74 20 66 64 0a  Path, .  int fd.
4dd0: 29 7b 0a 20 20 2f 2a 20 74 65 73 74 20 62 79 74  ){.  /* test byt
4de0: 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69  e-range lock usi
4df0: 6e 67 20 66 63 6e 74 6c 20 2a 2f 0a 20 20 73 74  ng fcntl */.  st
4e00: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49  ruct flock lockI
4e10: 6e 66 6f 3b 0a 20 20 0a 20 20 6c 6f 63 6b 49 6e  nfo;.  .  lockIn
4e20: 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20  fo.l_len = 1;.  
4e30: 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74  lockInfo.l_start
4e40: 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f   = 0;.  lockInfo
4e50: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
4e60: 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f  _SET;.  lockInfo
4e70: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
4e80: 4b 3b 0a 20 20 0a 20 20 69 66 28 20 66 63 6e 74  K;.  .  if( fcnt
4e90: 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  l(fd, F_GETLK, &
4ea0: 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20  lockInfo)!=-1 ) 
4eb0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 6f 73  {.    return pos
4ec0: 69 78 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a  ixLockingStyle;.
4ed0: 20 20 7d 20 0a 20 20 0a 20 20 2f 2a 20 74 65 73    } .  .  /* tes
4ee0: 74 69 6e 67 20 66 6f 72 20 66 6c 6f 63 6b 20 63  ting for flock c
4ef0: 61 6e 20 67 69 76 65 20 66 61 6c 73 65 20 70 6f  an give false po
4f00: 73 69 74 69 76 65 73 2e 20 20 53 6f 20 69 66 20  sitives.  So if 
4f10: 69 66 20 74 68 65 20 61 62 6f 76 65 20 74 65 73  if the above tes
4f20: 74 0a 20 20 2a 2a 20 66 61 69 6c 73 2c 20 74 68  t.  ** fails, th
4f30: 65 6e 20 77 65 20 66 61 6c 6c 20 62 61 63 6b 20  en we fall back 
4f40: 74 6f 20 75 73 69 6e 67 20 64 6f 74 2d 6c 6f 63  to using dot-loc
4f50: 6b 20 73 74 79 6c 65 20 6c 6f 63 6b 69 6e 67 2e  k style locking.
4f60: 0a 20 20 2a 2f 20 20 0a 20 20 72 65 74 75 72 6e  .  */  .  return
4f70: 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53   dotlockLockingS
4f80: 74 79 6c 65 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  tyle;.}../* .** 
4f90: 45 78 61 6d 69 6e 65 73 20 74 68 65 20 66 5f 66  Examines the f_f
4fa0: 73 74 79 70 65 6e 61 6d 65 20 65 6e 74 72 79 20  stypename entry 
4fb0: 69 6e 20 74 68 65 20 73 74 61 74 66 73 20 73 74  in the statfs st
4fc0: 72 75 63 74 75 72 65 20 61 73 20 72 65 74 75 72  ructure as retur
4fd0: 6e 65 64 20 62 79 20 0a 2a 2a 20 73 74 61 74 28  ned by .** stat(
4fe0: 29 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 73  ) for the file s
4ff0: 79 73 74 65 6d 20 68 6f 73 74 69 6e 67 20 74 68  ystem hosting th
5000: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
5010: 20 61 73 73 69 67 6e 73 20 74 68 65 20 0a 2a 2a   assigns the .**
5020: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63   appropriate loc
5030: 6b 69 6e 67 20 73 74 79 6c 65 20 62 61 73 65 64  king style based
5040: 20 6f 6e 20 69 74 27 73 20 76 61 6c 75 65 2e 20   on it's value. 
5050: 20 54 68 65 73 65 20 76 61 6c 75 65 73 20 61 6e   These values an
5060: 64 20 0a 2a 2a 20 61 73 73 69 67 6e 6d 65 6e 74  d .** assignment
5070: 73 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20 44  s are based on D
5080: 61 72 77 69 6e 2f 4f 53 58 20 62 65 68 61 76 69  arwin/OSX behavi
5090: 6f 72 20 61 6e 64 20 68 61 76 65 20 6e 6f 74 20  or and have not 
50a0: 62 65 65 6e 20 74 65 73 74 65 64 20 6f 6e 20 0a  been tested on .
50b0: 2a 2a 20 6f 74 68 65 72 20 73 79 73 74 65 6d 73  ** other systems
50c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  ..*/.static sqli
50d0: 74 65 33 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  te3LockingStyle 
50e0: 73 71 6c 69 74 65 33 44 65 74 65 63 74 4c 6f 63  sqlite3DetectLoc
50f0: 6b 69 6e 67 53 74 79 6c 65 28 0a 20 20 63 6f 6e  kingStyle(.  con
5100: 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74  st char *filePat
5110: 68 2c 20 0a 20 20 69 6e 74 20 66 64 0a 29 7b 0a  h, .  int fd.){.
5120: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 46  .#ifdef SQLITE_F
5130: 49 58 45 44 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  IXED_LOCKING_STY
5140: 4c 45 0a 20 20 72 65 74 75 72 6e 20 28 73 71 6c  LE.  return (sql
5150: 69 74 65 33 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  ite3LockingStyle
5160: 29 53 51 4c 49 54 45 5f 46 49 58 45 44 5f 4c 4f  )SQLITE_FIXED_LO
5170: 43 4b 49 4e 47 5f 53 54 59 4c 45 3b 0a 23 65 6c  CKING_STYLE;.#el
5180: 73 65 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  se.  struct stat
5190: 66 73 20 66 73 49 6e 66 6f 3b 0a 0a 20 20 69 66  fs fsInfo;..  if
51a0: 20 28 73 74 61 74 66 73 28 66 69 6c 65 50 61 74   (statfs(filePat
51b0: 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d  h, &fsInfo) == -
51c0: 31 29 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  1).    return sq
51d0: 6c 69 74 65 33 54 65 73 74 4c 6f 63 6b 69 6e 67  lite3TestLocking
51e0: 53 74 79 6c 65 28 66 69 6c 65 50 61 74 68 2c 20  Style(filePath, 
51f0: 66 64 29 3b 0a 20 20 0a 20 20 69 66 20 28 66 73  fd);.  .  if (fs
5200: 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d  Info.f_flags & M
5210: 4e 54 5f 52 44 4f 4e 4c 59 29 0a 20 20 20 20 72  NT_RDONLY).    r
5220: 65 74 75 72 6e 20 6e 6f 4c 6f 63 6b 69 6e 67 53  eturn noLockingS
5230: 74 79 6c 65 3b 0a 20 20 0a 20 20 69 66 28 20 28  tyle;.  .  if( (
5240: 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66  !strcmp(fsInfo.f
5250: 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 68 66  _fstypename, "hf
5260: 73 22 29 29 20 7c 7c 0a 20 20 20 20 28 21 73 74  s")) ||.    (!st
5270: 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73  rcmp(fsInfo.f_fs
5280: 74 79 70 65 6e 61 6d 65 2c 20 22 75 66 73 22 29  typename, "ufs")
5290: 29 20 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) ).            
52a0: 20 20 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78      return posix
52b0: 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20  LockingStyle;.  
52c0: 0a 20 20 69 66 28 21 73 74 72 63 6d 70 28 66 73  .  if(!strcmp(fs
52d0: 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d  Info.f_fstypenam
52e0: 65 2c 20 22 61 66 70 66 73 22 29 29 0a 20 20 20  e, "afpfs")).   
52f0: 20 72 65 74 75 72 6e 20 61 66 70 4c 6f 63 6b 69   return afpLocki
5300: 6e 67 53 74 79 6c 65 3b 0a 20 20 0a 20 20 69 66  ngStyle;.  .  if
5310: 28 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e  (!strcmp(fsInfo.
5320: 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e  f_fstypename, "n
5330: 66 73 22 29 29 20 0a 20 20 20 20 72 65 74 75 72  fs")) .    retur
5340: 6e 20 73 71 6c 69 74 65 33 54 65 73 74 4c 6f 63  n sqlite3TestLoc
5350: 6b 69 6e 67 53 74 79 6c 65 28 66 69 6c 65 50 61  kingStyle(filePa
5360: 74 68 2c 20 66 64 29 3b 0a 20 20 0a 20 20 69 66  th, fd);.  .  if
5370: 28 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e  (!strcmp(fsInfo.
5380: 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 73  f_fstypename, "s
5390: 6d 62 66 73 22 29 29 0a 20 20 20 20 72 65 74 75  mbfs")).    retu
53a0: 72 6e 20 66 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53  rn flockLockingS
53b0: 74 79 6c 65 3b 0a 20 20 0a 20 20 69 66 28 21 73  tyle;.  .  if(!s
53c0: 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66  trcmp(fsInfo.f_f
53d0: 73 74 79 70 65 6e 61 6d 65 2c 20 22 6d 73 64 6f  stypename, "msdo
53e0: 73 22 29 29 0a 20 20 20 20 72 65 74 75 72 6e 20  s")).    return 
53f0: 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74  dotlockLockingSt
5400: 79 6c 65 3b 0a 20 20 0a 20 20 69 66 28 21 73 74  yle;.  .  if(!st
5410: 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73  rcmp(fsInfo.f_fs
5420: 74 79 70 65 6e 61 6d 65 2c 20 22 77 65 62 64 61  typename, "webda
5430: 76 22 29 29 0a 20 20 20 20 72 65 74 75 72 6e 20  v")).    return 
5440: 75 6e 73 75 70 70 6f 72 74 65 64 4c 6f 63 6b 69  unsupportedLocki
5450: 6e 67 53 74 79 6c 65 3b 0a 20 20 0a 20 20 72 65  ngStyle;.  .  re
5460: 74 75 72 6e 20 73 71 6c 69 74 65 33 54 65 73 74  turn sqlite3Test
5470: 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 66 69 6c  LockingStyle(fil
5480: 65 50 61 74 68 2c 20 66 64 29 3b 20 20 0a 23 65  ePath, fd);  .#e
5490: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 46  ndif /* SQLITE_F
54a0: 49 58 45 44 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  IXED_LOCKING_STY
54b0: 4c 45 20 2a 2f 0a 7d 0a 0a 23 65 6e 64 69 66 20  LE */.}..#endif 
54c0: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
54d0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
54e0: 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  /../*.** Given a
54f0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
5500: 2c 20 6c 6f 63 61 74 65 20 6c 6f 63 6b 49 6e 66  , locate lockInf
5510: 6f 20 61 6e 64 20 6f 70 65 6e 43 6e 74 20 73 74  o and openCnt st
5520: 72 75 63 74 75 72 65 73 20 74 68 61 74 0a 2a 2a  ructures that.**
5530: 20 64 65 73 63 72 69 62 65 73 20 74 68 61 74 20   describes that 
5540: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
5550: 20 20 43 72 65 61 74 65 20 6e 65 77 20 6f 6e 65    Create new one
5560: 73 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20  s if necessary. 
5570: 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76   The.** return v
5580: 61 6c 75 65 73 20 6d 69 67 68 74 20 62 65 20 75  alues might be u
5590: 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 69 66 20  ninitialized if 
55a0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
55b0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
55c0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
55d0: 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
55e0: 74 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 0a  t findLockInfo(.
55f0: 20 20 69 6e 74 20 66 64 2c 20 20 20 20 20 20 20    int fd,       
5600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5610: 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72  * The file descr
5620: 69 70 74 6f 72 20 75 73 65 64 20 69 6e 20 74 68  iptor used in th
5630: 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75 63  e key */.  struc
5640: 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 2a 70 70 4c  t lockInfo **ppL
5650: 6f 63 6b 2c 20 20 20 20 2f 2a 20 52 65 74 75 72  ock,    /* Retur
5660: 6e 20 74 68 65 20 6c 6f 63 6b 49 6e 66 6f 20 73  n the lockInfo s
5670: 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
5680: 0a 20 20 73 74 72 75 63 74 20 6f 70 65 6e 43 6e  .  struct openCn
5690: 74 20 2a 2a 70 70 4f 70 65 6e 20 20 20 20 20 20  t **ppOpen      
56a0: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70  /* Return the op
56b0: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20  enCnt structure 
56c0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
56d0: 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 6c 6f   rc;.  struct lo
56e0: 63 6b 4b 65 79 20 6b 65 79 31 3b 0a 20 20 73 74  ckKey key1;.  st
56f0: 72 75 63 74 20 6f 70 65 6e 4b 65 79 20 6b 65 79  ruct openKey key
5700: 32 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  2;.  struct stat
5710: 20 73 74 61 74 62 75 66 3b 0a 20 20 73 74 72 75   statbuf;.  stru
5720: 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f  ct lockInfo *pLo
5730: 63 6b 3b 0a 20 20 73 74 72 75 63 74 20 6f 70 65  ck;.  struct ope
5740: 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 0a 20 20 72  nCnt *pOpen;.  r
5750: 63 20 3d 20 66 73 74 61 74 28 66 64 2c 20 26 73  c = fstat(fd, &s
5760: 74 61 74 62 75 66 29 3b 0a 20 20 69 66 28 20 72  tatbuf);.  if( r
5770: 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  c!=0 ) return 1;
5780: 0a 0a 20 20 6d 65 6d 73 65 74 28 26 6b 65 79 31  ..  memset(&key1
5790: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 31  , 0, sizeof(key1
57a0: 29 29 3b 0a 20 20 6b 65 79 31 2e 64 65 76 20 3d  ));.  key1.dev =
57b0: 20 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b   statbuf.st_dev;
57c0: 0a 20 20 6b 65 79 31 2e 69 6e 6f 20 3d 20 73 74  .  key1.ino = st
57d0: 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 69  atbuf.st_ino;.#i
57e0: 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  f SQLITE_THREADS
57f0: 41 46 45 0a 20 20 69 66 28 20 74 68 72 65 61 64  AFE.  if( thread
5800: 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68  sOverrideEachOth
5810: 65 72 73 4c 6f 63 6b 73 3c 30 20 29 7b 0a 20 20  ersLocks<0 ){.  
5820: 20 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b    testThreadLock
5830: 69 6e 67 42 65 68 61 76 69 6f 72 28 66 64 29 3b  ingBehavior(fd);
5840: 0a 20 20 7d 0a 20 20 6b 65 79 31 2e 74 69 64 20  .  }.  key1.tid 
5850: 3d 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64  = threadsOverrid
5860: 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73  eEachOthersLocks
5870: 20 3f 20 30 20 3a 20 70 74 68 72 65 61 64 5f 73   ? 0 : pthread_s
5880: 65 6c 66 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20  elf();.#endif.  
5890: 6d 65 6d 73 65 74 28 26 6b 65 79 32 2c 20 30 2c  memset(&key2, 0,
58a0: 20 73 69 7a 65 6f 66 28 6b 65 79 32 29 29 3b 0a   sizeof(key2));.
58b0: 20 20 6b 65 79 32 2e 64 65 76 20 3d 20 73 74 61    key2.dev = sta
58c0: 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 20 20 6b  tbuf.st_dev;.  k
58d0: 65 79 32 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75  ey2.ino = statbu
58e0: 66 2e 73 74 5f 69 6e 6f 3b 0a 20 20 70 4c 6f 63  f.st_ino;.  pLoc
58f0: 6b 20 3d 20 28 73 74 72 75 63 74 20 6c 6f 63 6b  k = (struct lock
5900: 49 6e 66 6f 2a 29 73 71 6c 69 74 65 33 48 61 73  Info*)sqlite3Has
5910: 68 46 69 6e 64 28 26 6c 6f 63 6b 48 61 73 68 2c  hFind(&lockHash,
5920: 20 26 6b 65 79 31 2c 20 73 69 7a 65 6f 66 28 6b   &key1, sizeof(k
5930: 65 79 31 29 29 3b 0a 20 20 69 66 28 20 70 4c 6f  ey1));.  if( pLo
5940: 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72  ck==0 ){.    str
5950: 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4f  uct lockInfo *pO
5960: 6c 64 3b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20  ld;.    pLock = 
5970: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
5980: 73 69 7a 65 6f 66 28 2a 70 4c 6f 63 6b 29 20 29  sizeof(*pLock) )
5990: 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 3d  ;.    if( pLock=
59a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
59b0: 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   1;.      goto e
59c0: 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f  xit_findlockinfo
59d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63  ;.    }.    pLoc
59e0: 6b 2d 3e 6b 65 79 20 3d 20 6b 65 79 31 3b 0a 20  k->key = key1;. 
59f0: 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 20 3d     pLock->nRef =
5a00: 20 31 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63   1;.    pLock->c
5a10: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 4c 6f 63  nt = 0;.    pLoc
5a20: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 30 3b  k->locktype = 0;
5a30: 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69  .    pOld = sqli
5a40: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 6c  te3HashInsert(&l
5a50: 6f 63 6b 48 61 73 68 2c 20 26 70 4c 6f 63 6b 2d  ockHash, &pLock-
5a60: 3e 6b 65 79 2c 20 73 69 7a 65 6f 66 28 6b 65 79  >key, sizeof(key
5a70: 31 29 2c 20 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  1), pLock);.    
5a80: 69 66 28 20 70 4f 6c 64 21 3d 30 20 29 7b 0a 20  if( pOld!=0 ){. 
5a90: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c       assert( pOl
5aa0: 64 3d 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  d==pLock );.    
5ab0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
5ac0: 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72 63 20  Lock);.      rc 
5ad0: 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 1;.      goto 
5ae0: 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66  exit_findlockinf
5af0: 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  o;.    }.  }else
5b00: 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65  {.    pLock->nRe
5b10: 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 4c 6f  f++;.  }.  *ppLo
5b20: 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 69 66  ck = pLock;.  if
5b30: 28 20 70 70 4f 70 65 6e 21 3d 30 20 29 7b 0a 20  ( ppOpen!=0 ){. 
5b40: 20 20 20 70 4f 70 65 6e 20 3d 20 28 73 74 72 75     pOpen = (stru
5b50: 63 74 20 6f 70 65 6e 43 6e 74 2a 29 73 71 6c 69  ct openCnt*)sqli
5b60: 74 65 33 48 61 73 68 46 69 6e 64 28 26 6f 70 65  te3HashFind(&ope
5b70: 6e 48 61 73 68 2c 20 26 6b 65 79 32 2c 20 73 69  nHash, &key2, si
5b80: 7a 65 6f 66 28 6b 65 79 32 29 29 3b 0a 20 20 20  zeof(key2));.   
5b90: 20 69 66 28 20 70 4f 70 65 6e 3d 3d 30 20 29 7b   if( pOpen==0 ){
5ba0: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 6f 70  .      struct op
5bb0: 65 6e 43 6e 74 20 2a 70 4f 6c 64 3b 0a 20 20 20  enCnt *pOld;.   
5bc0: 20 20 20 70 4f 70 65 6e 20 3d 20 73 71 6c 69 74     pOpen = sqlit
5bd0: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
5be0: 66 28 2a 70 4f 70 65 6e 29 20 29 3b 0a 20 20 20  f(*pOpen) );.   
5bf0: 20 20 20 69 66 28 20 70 4f 70 65 6e 3d 3d 30 20     if( pOpen==0 
5c00: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
5c10: 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 4c 6f 63 6b  seLockInfo(pLock
5c20: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
5c30: 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  1;.        goto 
5c40: 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66  exit_findlockinf
5c50: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  o;.      }.     
5c60: 20 70 4f 70 65 6e 2d 3e 6b 65 79 20 3d 20 6b 65   pOpen->key = ke
5c70: 79 32 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d  y2;.      pOpen-
5c80: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20  >nRef = 1;.     
5c90: 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 3d 20   pOpen->nLock = 
5ca0: 30 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  0;.      pOpen->
5cb0: 6e 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20  nPending = 0;.  
5cc0: 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64      pOpen->aPend
5cd0: 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ing = 0;.      p
5ce0: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73  Old = sqlite3Has
5cf0: 68 49 6e 73 65 72 74 28 26 6f 70 65 6e 48 61 73  hInsert(&openHas
5d00: 68 2c 20 26 70 4f 70 65 6e 2d 3e 6b 65 79 2c 20  h, &pOpen->key, 
5d10: 73 69 7a 65 6f 66 28 6b 65 79 32 29 2c 20 70 4f  sizeof(key2), pO
5d20: 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pen);.      if( 
5d30: 70 4f 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 20  pOld!=0 ){.     
5d40: 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d     assert( pOld=
5d50: 3d 70 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20  =pOpen );.      
5d60: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
5d70: 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 72  Open);.        r
5d80: 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70  eleaseLockInfo(p
5d90: 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 72  Lock);.        r
5da0: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67  c = 1;.        g
5db0: 6f 74 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63  oto exit_findloc
5dc0: 6b 69 6e 66 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  kinfo;.      }. 
5dd0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5de0: 70 4f 70 65 6e 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  pOpen->nRef++;. 
5df0: 20 20 20 7d 0a 20 20 20 20 2a 70 70 4f 70 65 6e     }.    *ppOpen
5e00: 20 3d 20 70 4f 70 65 6e 3b 0a 20 20 7d 0a 0a 65   = pOpen;.  }..e
5e10: 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f  xit_findlockinfo
5e20: 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
5e30: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5e40: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 48 65 6c 70  DEBUG./*.** Help
5e50: 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  er function for 
5e60: 70 72 69 6e 74 69 6e 67 20 6f 75 74 20 74 72 61  printing out tra
5e70: 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ce information f
5e80: 72 6f 6d 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a  rom debugging.**
5e90: 20 62 69 6e 61 72 69 65 73 2e 20 54 68 69 73 20   binaries. This 
5ea0: 72 65 74 75 72 6e 73 20 74 68 65 20 73 74 72 69  returns the stri
5eb0: 6e 67 20 72 65 70 72 65 73 65 74 61 74 69 6f 6e  ng represetation
5ec0: 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
5ed0: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b  .** integer lock
5ee0: 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -type..*/.static
5ef0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63   const char *loc
5f00: 6b 74 79 70 65 4e 61 6d 65 28 69 6e 74 20 6c 6f  ktypeName(int lo
5f10: 63 6b 74 79 70 65 29 7b 0a 20 20 73 77 69 74 63  cktype){.  switc
5f20: 68 28 20 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  h( locktype ){. 
5f30: 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72   case NO_LOCK: r
5f40: 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20  eturn "NONE";.  
5f50: 63 61 73 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b  case SHARED_LOCK
5f60: 3a 20 72 65 74 75 72 6e 20 22 53 48 41 52 45 44  : return "SHARED
5f70: 22 3b 0a 20 20 63 61 73 65 20 52 45 53 45 52 56  ";.  case RESERV
5f80: 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  ED_LOCK: return 
5f90: 22 52 45 53 45 52 56 45 44 22 3b 0a 20 20 63 61  "RESERVED";.  ca
5fa0: 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a  se PENDING_LOCK:
5fb0: 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49 4e 47   return "PENDING
5fc0: 22 3b 0a 20 20 63 61 73 65 20 45 58 43 4c 55 53  ";.  case EXCLUS
5fd0: 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  IVE_LOCK: return
5fe0: 20 22 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20   "EXCLUSIVE";.  
5ff0: 7d 0a 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f  }.  return "ERRO
6000: 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  R";.}.#endif../*
6010: 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 63 75  .** If we are cu
6020: 72 72 65 6e 74 6c 79 20 69 6e 20 61 20 64 69 66  rrently in a dif
6030: 66 65 72 65 6e 74 20 74 68 72 65 61 64 20 74 68  ferent thread th
6040: 61 6e 20 74 68 65 20 74 68 72 65 61 64 20 74 68  an the thread th
6050: 61 74 20 74 68 65 0a 2a 2a 20 75 6e 69 78 46 69  at the.** unixFi
6060: 6c 65 20 61 72 67 75 6d 65 6e 74 20 62 65 6c 6f  le argument belo
6070: 6e 67 73 20 74 6f 2c 20 74 68 65 6e 20 74 72 61  ngs to, then tra
6080: 6e 73 66 65 72 20 6f 77 6e 65 72 73 68 69 70 20  nsfer ownership 
6090: 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 0a  of the unixFile.
60a0: 2a 2a 20 6f 76 65 72 20 74 6f 20 74 68 65 20 63  ** over to the c
60b0: 75 72 72 65 6e 74 20 74 68 72 65 61 64 2e 0a 2a  urrent thread..*
60c0: 2a 0a 2a 2a 20 41 20 75 6e 69 78 46 69 6c 65 20  *.** A unixFile 
60d0: 69 73 20 6f 6e 6c 79 20 6f 77 6e 65 64 20 62 79  is only owned by
60e0: 20 61 20 74 68 72 65 61 64 20 6f 6e 20 73 79 73   a thread on sys
60f0: 74 65 6d 73 20 77 68 65 72 65 20 6f 6e 65 20 74  tems where one t
6100: 68 72 65 61 64 20 69 73 0a 2a 2a 20 75 6e 61 62  hread is.** unab
6110: 6c 65 20 74 6f 20 6f 76 65 72 72 69 64 65 20 6c  le to override l
6120: 6f 63 6b 73 20 63 72 65 61 74 65 64 20 62 79 20  ocks created by 
6130: 61 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65  a different thre
6140: 61 64 2e 20 20 52 65 64 48 61 74 39 20 69 73 0a  ad.  RedHat9 is.
6150: 2a 2a 20 61 6e 20 65 78 61 6d 70 6c 65 20 6f 66  ** an example of
6160: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 0a   such a system..
6170: 2a 2a 0a 2a 2a 20 4f 77 6e 65 72 73 68 69 70 20  **.** Ownership 
6180: 74 72 61 6e 73 66 65 72 20 69 73 20 6f 6e 6c 79  transfer is only
6190: 20 61 6c 6c 6f 77 65 64 20 69 66 20 74 68 65 20   allowed if the 
61a0: 75 6e 69 78 46 69 6c 65 20 69 73 20 63 75 72 72  unixFile is curr
61b0: 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 0a  ently unlocked..
61c0: 2a 2a 20 49 66 20 74 68 65 20 75 6e 69 78 46 69  ** If the unixFi
61d0: 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20 61 6e 64  le is locked and
61e0: 20 61 6e 20 6f 77 6e 65 72 73 68 69 70 20 69 73   an ownership is
61f0: 20 77 72 6f 6e 67 2c 20 74 68 65 6e 20 72 65 74   wrong, then ret
6200: 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 49  urn.** SQLITE_MI
6210: 53 55 53 45 2e 20 20 53 51 4c 49 54 45 5f 4f 4b  SUSE.  SQLITE_OK
6220: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
6230: 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73  everything works
6240: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
6250: 54 48 52 45 41 44 53 41 46 45 0a 73 74 61 74 69  THREADSAFE.stati
6260: 63 20 69 6e 74 20 74 72 61 6e 73 66 65 72 4f 77  c int transferOw
6270: 6e 65 72 73 68 69 70 28 75 6e 69 78 46 69 6c 65  nership(unixFile
6280: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
6290: 72 63 3b 0a 20 20 70 74 68 72 65 61 64 5f 74 20  rc;.  pthread_t 
62a0: 68 53 65 6c 66 3b 0a 20 20 69 66 28 20 74 68 72  hSelf;.  if( thr
62b0: 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68  eadsOverrideEach
62c0: 4f 74 68 65 72 73 4c 6f 63 6b 73 20 29 7b 0a 20  OthersLocks ){. 
62d0: 20 20 20 2f 2a 20 4f 77 6e 65 72 73 68 69 70 20     /* Ownership 
62e0: 74 72 61 6e 73 66 65 72 73 20 6e 6f 74 20 6e 65  transfers not ne
62f0: 65 64 65 64 20 6f 6e 20 74 68 69 73 20 73 79 73  eded on this sys
6300: 74 65 6d 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  tem */.    retur
6310: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
6320: 0a 20 20 68 53 65 6c 66 20 3d 20 70 74 68 72 65  .  hSelf = pthre
6330: 61 64 5f 73 65 6c 66 28 29 3b 0a 20 20 69 66 28  ad_self();.  if(
6340: 20 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28 70   pthread_equal(p
6350: 46 69 6c 65 2d 3e 74 69 64 2c 20 68 53 65 6c 66  File->tid, hSelf
6360: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61  ) ){.    /* We a
6370: 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 20  re still in the 
6380: 73 61 6d 65 20 74 68 72 65 61 64 20 2a 2f 0a 20  same thread */. 
6390: 20 20 20 4f 53 54 52 41 43 45 31 28 22 4e 6f 2d     OSTRACE1("No-
63a0: 74 72 61 6e 73 66 65 72 2c 20 73 61 6d 65 20 74  transfer, same t
63b0: 68 72 65 61 64 5c 6e 22 29 3b 0a 20 20 20 20 72  hread\n");.    r
63c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
63d0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65  .  }.  if( pFile
63e0: 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c  ->locktype!=NO_L
63f0: 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65  OCK ){.    /* We
6400: 20 63 61 6e 6e 6f 74 20 63 68 61 6e 67 65 20 6f   cannot change o
6410: 77 6e 65 72 73 68 69 70 20 77 68 69 6c 65 20 77  wnership while w
6420: 65 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 61 20  e are holding a 
6430: 6c 6f 63 6b 21 20 2a 2f 0a 20 20 20 20 72 65 74  lock! */.    ret
6440: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
6450: 45 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  E;.  }.  OSTRACE
6460: 34 28 22 54 72 61 6e 73 66 65 72 20 6f 77 6e 65  4("Transfer owne
6470: 72 73 68 69 70 20 6f 66 20 25 64 20 66 72 6f 6d  rship of %d from
6480: 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c 0a 20 20   %d to %d\n",.  
6490: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
64a0: 3e 68 2c 20 70 46 69 6c 65 2d 3e 74 69 64 2c 20  >h, pFile->tid, 
64b0: 68 53 65 6c 66 29 3b 0a 20 20 70 46 69 6c 65 2d  hSelf);.  pFile-
64c0: 3e 74 69 64 20 3d 20 68 53 65 6c 66 3b 0a 20 20  >tid = hSelf;.  
64d0: 69 66 20 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  if (pFile->pLock
64e0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20   != NULL) {.    
64f0: 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28  releaseLockInfo(
6500: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29 3b 0a 20  pFile->pLock);. 
6510: 20 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b     rc = findLock
6520: 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 68 2c 20 26  Info(pFile->h, &
6530: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2c 20 30 29  pFile->pLock, 0)
6540: 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 35 28 22  ;.    OSTRACE5("
6550: 4c 4f 43 4b 20 20 20 20 25 64 20 69 73 20 6e 6f  LOCK    %d is no
6560: 77 20 25 73 28 25 73 2c 25 64 29 5c 6e 22 2c 20  w %s(%s,%d)\n", 
6570: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
6580: 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d       locktypeNam
6590: 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  e(pFile->locktyp
65a0: 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c  e),.           l
65b0: 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69 6c  ocktypeName(pFil
65c0: 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79  e->pLock->lockty
65d0: 70 65 29 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f 63  pe), pFile->pLoc
65e0: 6b 2d 3e 63 6e 74 29 3b 0a 20 20 20 20 72 65 74  k->cnt);.    ret
65f0: 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65  urn rc;.  } else
6600: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51   {.    return SQ
6610: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 23  LITE_OK;.  }.}.#
6620: 65 6c 73 65 0a 20 20 2f 2a 20 4f 6e 20 73 69 6e  else.  /* On sin
6630: 67 6c 65 2d 74 68 72 65 61 64 65 64 20 62 75 69  gle-threaded bui
6640: 6c 64 73 2c 20 6f 77 6e 65 72 73 68 69 70 20 74  lds, ownership t
6650: 72 61 6e 73 66 65 72 20 69 73 20 61 20 6e 6f 2d  ransfer is a no-
6660: 6f 70 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 74  op */.# define t
6670: 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70  ransferOwnership
6680: 28 58 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65  (X) SQLITE_OK.#e
6690: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b  ndif../*.** Seek
66a0: 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 70   to the offset p
66b0: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
66c0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 74 68  ond argument, th
66d0: 65 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20  en read cnt .** 
66e0: 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e  bytes into pBuf.
66f0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
6700: 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
6710: 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2f 0a 73 74  ally read..*/.st
6720: 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64  atic int seekAnd
6730: 52 65 61 64 28 75 6e 69 78 46 69 6c 65 20 2a 69  Read(unixFile *i
6740: 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
6750: 20 6f 66 66 73 65 74 2c 20 76 6f 69 64 20 2a 70   offset, void *p
6760: 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20  Buf, int cnt){. 
6770: 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69 36 34 20   int got;.  i64 
6780: 6e 65 77 4f 66 66 73 65 74 3b 0a 20 20 54 49 4d  newOffset;.  TIM
6790: 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65  ER_START;.#if de
67a0: 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
67b0: 0a 20 20 67 6f 74 20 3d 20 70 72 65 61 64 28 69  .  got = pread(i
67c0: 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
67d0: 20 6f 66 66 73 65 74 29 3b 0a 20 20 53 69 6d 75   offset);.  Simu
67e0: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74  lateIOError( got
67f0: 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69 66 20 64   = -1 );.#elif d
6800: 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
6810: 36 34 29 0a 20 20 67 6f 74 20 3d 20 70 72 65 61  64).  got = prea
6820: 64 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  d64(id->h, pBuf,
6830: 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20   cnt, offset);. 
6840: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
6850: 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65  ( got = -1 );.#e
6860: 6c 73 65 0a 20 20 6e 65 77 4f 66 66 73 65 74 20  lse.  newOffset 
6870: 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f  = lseek(id->h, o
6880: 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29  ffset, SEEK_SET)
6890: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
68a0: 72 6f 72 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d  ror( newOffset--
68b0: 20 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f 66 66   );.  if( newOff
68c0: 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20  set!=offset ){. 
68d0: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
68e0: 7d 0a 20 20 67 6f 74 20 3d 20 72 65 61 64 28 69  }.  got = read(i
68f0: 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29  d->h, pBuf, cnt)
6900: 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52  ;.#endif.  TIMER
6910: 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 35  _END;.  OSTRACE5
6920: 28 22 52 45 41 44 20 20 20 20 25 2d 33 64 20 25  ("READ    %-3d %
6930: 35 64 20 25 37 6c 6c 64 20 25 64 5c 6e 22 2c 20  5d %7lld %d\n", 
6940: 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73  id->h, got, offs
6950: 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45  et, TIMER_ELAPSE
6960: 44 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74  D);.  return got
6970: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
6980: 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65  data from a file
6990: 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20   into a buffer. 
69a0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
69b0: 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65  K if all.** byte
69c0: 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63  s were read succ
69d0: 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c  essfully and SQL
69e0: 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79  ITE_IOERR if any
69f0: 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
6a00: 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
6a10: 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20 73  nt unixRead(.  s
6a20: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
6a30: 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20   .  void *pBuf, 
6a40: 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71  .  int amt,.  sq
6a50: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
6a60: 65 74 0a 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b  et.){.  int got;
6a70: 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b  .  assert( id );
6a80: 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64  .  got = seekAnd
6a90: 52 65 61 64 28 28 75 6e 69 78 46 69 6c 65 2a 29  Read((unixFile*)
6aa0: 69 64 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66  id, offset, pBuf
6ab0: 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f  , amt);.  if( go
6ac0: 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72 65  t==amt ){.    re
6ad0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6ae0: 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3c    }else if( got<
6af0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
6b00: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
6b10: 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
6b20: 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29  memset(&((char*)
6b30: 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61  pBuf)[got], 0, a
6b40: 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74  mt-got);.    ret
6b50: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
6b60: 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d  _SHORT_READ;.  }
6b70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74  .}../*.** Seek t
6b80: 6f 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 20  o the offset in 
6b90: 69 64 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e 20  id->offset then 
6ba0: 72 65 61 64 20 63 6e 74 20 62 79 74 65 73 20 69  read cnt bytes i
6bb0: 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74  nto pBuf..** Ret
6bc0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
6bd0: 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79  f bytes actually
6be0: 20 72 65 61 64 2e 20 20 55 70 64 61 74 65 20 74   read.  Update t
6bf0: 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2f 0a 73 74  he offset..*/.st
6c00: 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64  atic int seekAnd
6c10: 57 72 69 74 65 28 75 6e 69 78 46 69 6c 65 20 2a  Write(unixFile *
6c20: 69 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20  id, i64 offset, 
6c30: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66  const void *pBuf
6c40: 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e  , int cnt){.  in
6c50: 74 20 67 6f 74 3b 0a 20 20 69 36 34 20 6e 65 77  t got;.  i64 new
6c60: 4f 66 66 73 65 74 3b 0a 20 20 54 49 4d 45 52 5f  Offset;.  TIMER_
6c70: 53 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e  START;.#if defin
6c80: 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20  ed(USE_PREAD).  
6c90: 67 6f 74 20 3d 20 70 77 72 69 74 65 28 69 64 2d  got = pwrite(id-
6ca0: 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f  >h, pBuf, cnt, o
6cb0: 66 66 73 65 74 29 3b 0a 23 65 6c 69 66 20 64 65  ffset);.#elif de
6cc0: 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36  fined(USE_PREAD6
6cd0: 34 29 0a 20 20 67 6f 74 20 3d 20 70 77 72 69 74  4).  got = pwrit
6ce0: 65 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  e64(id->h, pBuf,
6cf0: 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 23   cnt, offset);.#
6d00: 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66 73 65 74  else.  newOffset
6d10: 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20   = lseek(id->h, 
6d20: 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54  offset, SEEK_SET
6d30: 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f 66 66 73  );.  if( newOffs
6d40: 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20  et!=offset ){.  
6d50: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d    return -1;.  }
6d60: 0a 20 20 67 6f 74 20 3d 20 77 72 69 74 65 28 69  .  got = write(i
6d70: 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29  d->h, pBuf, cnt)
6d80: 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52  ;.#endif.  TIMER
6d90: 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 35  _END;.  OSTRACE5
6da0: 28 22 57 52 49 54 45 20 20 20 25 2d 33 64 20 25  ("WRITE   %-3d %
6db0: 35 64 20 25 37 6c 6c 64 20 25 64 5c 6e 22 2c 20  5d %7lld %d\n", 
6dc0: 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73  id->h, got, offs
6dd0: 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45  et, TIMER_ELAPSE
6de0: 44 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74  D);.  return got
6df0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
6e00: 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  e data from a bu
6e10: 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65  ffer into a file
6e20: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
6e30: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a  _OK on success.*
6e40: 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
6e50: 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61  error code on fa
6e60: 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
6e70: 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28 0a   int unixWrite(.
6e80: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
6e90: 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69  id, .  const voi
6ea0: 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20  d *pBuf, .  int 
6eb0: 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69  amt,.  sqlite3_i
6ec0: 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b 0a  nt64 offset .){.
6ed0: 20 20 69 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b    int wrote = 0;
6ee0: 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b  .  assert( id );
6ef0: 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30  .  assert( amt>0
6f00: 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 61 6d 74   );.  while( amt
6f10: 3e 30 20 26 26 20 28 77 72 6f 74 65 20 3d 20 73  >0 && (wrote = s
6f20: 65 65 6b 41 6e 64 57 72 69 74 65 28 28 75 6e 69  eekAndWrite((uni
6f30: 78 46 69 6c 65 2a 29 69 64 2c 20 6f 66 66 73 65  xFile*)id, offse
6f40: 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 29 3e 30  t, pBuf, amt))>0
6f50: 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77   ){.    amt -= w
6f60: 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66 73 65 74  rote;.    offset
6f70: 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70   += wrote;.    p
6f80: 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70  Buf = &((char*)p
6f90: 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d  Buf)[wrote];.  }
6fa0: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
6fb0: 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c  or(( wrote=(-1),
6fc0: 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d   amt=1 ));.  Sim
6fd0: 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
6fe0: 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d  or(( wrote=0, am
6ff0: 74 3d 31 20 29 29 3b 0a 20 20 69 66 28 20 61 6d  t=1 ));.  if( am
7000: 74 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77  t>0 ){.    if( w
7010: 72 6f 74 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  rote<0 ){.      
7020: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
7030: 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d  ERR_WRITE;.    }
7040: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
7050: 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
7060: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
7070: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
7080: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
7090: 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20  EST./*.** Count 
70a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75  the number of fu
70b0: 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d  llsyncs and norm
70c0: 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20  al syncs.  This 
70d0: 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a  is used to test.
70e0: 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e  ** that syncs an
70f0: 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20  d fullsyncs are 
7100: 6f 63 63 75 72 69 6e 67 20 61 74 20 74 68 65 20  occuring at the 
7110: 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a  right times..*/.
7120: 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  int sqlite3_sync
7130: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20  _count = 0;.int 
7140: 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
7150: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
7160: 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 65 20 74 68  if../*.** Use th
7170: 65 20 66 64 61 74 61 73 79 6e 63 28 29 20 41 50  e fdatasync() AP
7180: 49 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 48 41  I only if the HA
7190: 56 45 5f 46 44 41 54 41 53 59 4e 43 20 6d 61 63  VE_FDATASYNC mac
71a0: 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a  ro is defined..*
71b0: 2a 20 4f 74 68 65 72 77 69 73 65 20 75 73 65 20  * Otherwise use 
71c0: 66 73 79 6e 63 28 29 20 69 6e 20 69 74 73 20 70  fsync() in its p
71d0: 6c 61 63 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  lace..*/.#ifndef
71e0: 20 48 41 56 45 5f 46 44 41 54 41 53 59 4e 43 0a   HAVE_FDATASYNC.
71f0: 23 20 64 65 66 69 6e 65 20 66 64 61 74 61 73 79  # define fdatasy
7200: 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a  nc fsync.#endif.
7210: 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41  ./*.** Define HA
7220: 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20  VE_FULLFSYNC to 
7230: 30 20 6f 72 20 31 20 64 65 70 65 6e 64 69 6e 67  0 or 1 depending
7240: 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
7250: 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c  ot.** the F_FULL
7260: 46 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64  FSYNC macro is d
7270: 65 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46  efined.  F_FULLF
7280: 53 59 4e 43 20 69 73 20 63 75 72 72 65 6e 74 6c  SYNC is currentl
7290: 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61  y.** only availa
72a0: 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e  ble on Mac OS X.
72b0: 20 20 42 75 74 20 74 68 61 74 20 63 6f 75 6c 64    But that could
72c0: 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64   change..*/.#ifd
72d0: 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23  ef F_FULLFSYNC.#
72e0: 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   define HAVE_FUL
72f0: 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23  LFSYNC 1.#else.#
7300: 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   define HAVE_FUL
7310: 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a  LFSYNC 0.#endif.
7320: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e  ../*.** The fsyn
7330: 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  c() system call 
7340: 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73  does not work as
7350: 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e 20 6d   advertised on m
7360: 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74  any.** unix syst
7370: 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ems.  The follow
7380: 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69 73  ing procedure is
7390: 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d   an attempt to m
73a0: 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62  ake.** it work b
73b0: 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  etter..**.** The
73c0: 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
73d0: 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73 20 61  macro disables a
73e0: 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20 54 68  ll fsync()s.  Th
73f0: 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20  is is useful.** 
7400: 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68 65 6e  for testing when
7410: 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75 6e 20   we want to run 
7420: 74 68 72 6f 75 67 68 20 74 68 65 20 74 65 73 74  through the test
7430: 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a   suite quickly..
7440: 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72 6f 6e  ** You are stron
7450: 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e 6f 74  gly advised *not
7460: 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74 68  * to deploy with
7470: 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
7480: 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65  ** enabled, howe
7490: 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68 20  ver, since with 
74a0: 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65  SQLITE_NO_SYNC e
74b0: 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72  nabled, an OS cr
74c0: 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20  ash.** or power 
74d0: 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b  failure will lik
74e0: 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20  ely corrupt the 
74f0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
7500: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 75 6c  /.static int ful
7510: 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66 64 2c 20  l_fsync(int fd, 
7520: 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e  int fullSync, in
7530: 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69  t dataOnly){.  i
7540: 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 52 65 63  nt rc;..  /* Rec
7550: 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ord the number o
7560: 66 20 74 69 6d 65 73 20 74 68 61 74 20 77 65 20  f times that we 
7570: 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e  do a normal fsyn
7580: 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55  c() and .  ** FU
7590: 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73 20 69 73  LLSYNC.  This is
75a0: 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 65 73   used during tes
75b0: 74 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20 74  ting to verify t
75c0: 68 61 74 20 74 68 69 73 20 70 72 6f 63 65 64 75  hat this procedu
75d0: 72 65 0a 20 20 2a 2a 20 67 65 74 73 20 63 61 6c  re.  ** gets cal
75e0: 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 6f 72  led with the cor
75f0: 72 65 63 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a  rect arguments..
7600: 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
7610: 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 66 75  TE_TEST.  if( fu
7620: 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69 74 65 33  llSync ) sqlite3
7630: 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b  _fullsync_count+
7640: 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e  +;.  sqlite3_syn
7650: 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69  c_count++;.#endi
7660: 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f  f..  /* If we co
7670: 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 20  mpiled with the 
7680: 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66  SQLITE_NO_SYNC f
7690: 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e  lag, then syncin
76a0: 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f  g is a.  ** no-o
76b0: 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  p.  */.#ifdef SQ
76c0: 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72  LITE_NO_SYNC.  r
76d0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  c = SQLITE_OK;.#
76e0: 65 6c 73 65 0a 0a 23 69 66 20 48 41 56 45 5f 46  else..#if HAVE_F
76f0: 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28 20 66  ULLFSYNC.  if( f
7700: 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  ullSync ){.    r
7710: 63 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f  c = fcntl(fd, F_
7720: 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 20  FULLFSYNC, 0);. 
7730: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
7740: 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20   1;.  }.  /* If 
7750: 74 68 65 20 46 55 4c 4c 46 53 59 4e 43 20 66 61  the FULLFSYNC fa
7760: 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61 63 6b 20  iled, fall back 
7770: 74 6f 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  to attempting an
7780: 20 66 73 79 6e 63 28 29 2e 0a 20 20 20 2a 20 49   fsync()..   * I
7790: 74 20 73 68 6f 75 6c 64 6e 27 74 20 62 65 20 70  t shouldn't be p
77a0: 6f 73 73 69 62 6c 65 20 66 6f 72 20 66 75 6c 6c  ossible for full
77b0: 66 73 79 6e 63 20 74 6f 20 66 61 69 6c 20 6f 6e  fsync to fail on
77c0: 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20 20 2a   the local .   *
77d0: 20 66 69 6c 65 20 73 79 73 74 65 6d 20 28 6f 6e   file system (on
77e0: 20 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c 75 72   OSX), so failur
77f0: 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  e indicates that
7800: 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20 20 2a 20   FULLFSYNC.   * 
7810: 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20  isn't supported 
7820: 66 6f 72 20 74 68 69 73 20 66 69 6c 65 20 73 79  for this file sy
7830: 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65 6d 70  stem. So, attemp
7840: 74 20 61 6e 20 66 73 79 6e 63 20 0a 20 20 20 2a  t an fsync .   *
7850: 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29 20 69   and (for now) i
7860: 67 6e 6f 72 65 20 74 68 65 20 6f 76 65 72 68 65  gnore the overhe
7870: 61 64 20 6f 66 20 61 20 73 75 70 65 72 66 6c 75  ad of a superflu
7880: 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c 2e 20  ous fcntl call. 
7890: 20 0a 20 20 20 2a 20 49 74 27 64 20 62 65 20 62   .   * It'd be b
78a0: 65 74 74 65 72 20 74 6f 20 64 65 74 65 63 74 20  etter to detect 
78b0: 66 75 6c 6c 66 73 79 6e 63 20 73 75 70 70 6f 72  fullfsync suppor
78c0: 74 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f 69 64  t once and avoid
78d0: 20 0a 20 20 20 2a 20 74 68 65 20 66 63 6e 74 6c   .   * the fcntl
78e0: 20 63 61 6c 6c 20 65 76 65 72 79 20 74 69 6d 65   call every time
78f0: 20 73 79 6e 63 20 69 73 20 63 61 6c 6c 65 64 2e   sync is called.
7900: 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 20  .   */.  if( rc 
7910: 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29  ) rc = fsync(fd)
7920: 3b 0a 0a 23 65 6c 73 65 20 0a 20 20 69 66 28 20  ;..#else .  if( 
7930: 64 61 74 61 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  dataOnly ){.    
7940: 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66  rc = fdatasync(f
7950: 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
7960: 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b   rc = fsync(fd);
7970: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 48  .  }.#endif /* H
7980: 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f  AVE_FULLFSYNC */
7990: 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
79a0: 65 64 28 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ed(SQLITE_NO_SYN
79b0: 43 29 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20  C) */..  return 
79c0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  rc;.}../*.** Mak
79d0: 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65  e sure all write
79e0: 73 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61  s to a particula
79f0: 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69  r file are commi
7a00: 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  tted to disk..**
7a10: 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e 6c 79 3d  .** If dataOnly=
7a20: 3d 30 20 74 68 65 6e 20 62 6f 74 68 20 74 68 65  =0 then both the
7a30: 20 66 69 6c 65 20 69 74 73 65 6c 66 20 61 6e 64   file itself and
7a40: 20 69 74 73 20 6d 65 74 61 64 61 74 61 20 28 66   its metadata (f
7a50: 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20 61 63 63  ile.** size, acc
7a60: 65 73 73 20 74 69 6d 65 2c 20 65 74 63 29 20 61  ess time, etc) a
7a70: 72 65 20 73 79 6e 63 65 64 2e 20 20 49 66 20 64  re synced.  If d
7a80: 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68 65 6e 20  ataOnly!=0 then 
7a90: 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 69 6c 65  only the.** file
7aa0: 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 2e   data is synced.
7ab0: 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e 69  .**.** Under Uni
7ac0: 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75 72  x, also make sur
7ad0: 65 20 74 68 61 74 20 74 68 65 20 64 69 72 65 63  e that the direc
7ae0: 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74  tory entry for t
7af0: 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62  he file.** has b
7b00: 65 65 6e 20 63 72 65 61 74 65 64 20 62 79 20 66  een created by f
7b10: 73 79 6e 63 2d 69 6e 67 20 74 68 65 20 64 69 72  sync-ing the dir
7b20: 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74  ectory that cont
7b30: 61 69 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a  ains the file..*
7b40: 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 64  * If we do not d
7b50: 6f 20 74 68 69 73 20 61 6e 64 20 77 65 20 65 6e  o this and we en
7b60: 63 6f 75 6e 74 65 72 20 61 20 70 6f 77 65 72 20  counter a power 
7b70: 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64 69 72  failure, the dir
7b80: 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79 20  ectory.** entry 
7b90: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
7ba0: 6d 69 67 68 74 20 6e 6f 74 20 65 78 69 73 74 20  might not exist 
7bb0: 61 66 74 65 72 20 77 65 20 72 65 62 6f 6f 74 2e  after we reboot.
7bc0: 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53 51    The next.** SQ
7bd0: 4c 69 74 65 20 74 6f 20 61 63 63 65 73 73 20 74  Lite to access t
7be0: 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f 74  he file will not
7bf0: 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6a   know that the j
7c00: 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 28 62  ournal exists (b
7c10: 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 64 69  ecause.** the di
7c20: 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f  rectory entry fo
7c30: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  r the journal wa
7c40: 73 20 6e 65 76 65 72 20 63 72 65 61 74 65 64 29  s never created)
7c50: 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63   and the transac
7c60: 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  tion.** will not
7c70: 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f 73   roll back - pos
7c80: 73 69 62 6c 79 20 6c 65 61 64 69 6e 67 20 74 6f  sibly leading to
7c90: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
7ca0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
7cb0: 69 6e 74 20 75 6e 69 78 53 79 6e 63 28 73 71 6c  int unixSync(sql
7cc0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
7cd0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74  nt flags){.  int
7ce0: 20 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20   rc;.  unixFile 
7cf0: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
7d00: 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e 74 20 69  le*)id;..  int i
7d10: 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28 66 6c 61  sDataOnly = (fla
7d20: 67 73 26 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44  gs&SQLITE_SYNC_D
7d30: 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20  ATAONLY);.  int 
7d40: 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20 28 66 6c  isFullsync = (fl
7d50: 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
7d60: 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20  E_SYNC_FULL;..  
7d70: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e  /* Check that on
7d80: 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43  e of SQLITE_SYNC
7d90: 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20  _NORMAL or FULL 
7da0: 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20  was passed */.  
7db0: 61 73 73 65 72 74 28 28 66 6c 61 67 73 26 30 78  assert((flags&0x
7dc0: 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
7dd0: 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c  _NORMAL.      ||
7de0: 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53   (flags&0x0F)==S
7df0: 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a  QLITE_SYNC_FULL.
7e00: 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20    );..  assert( 
7e10: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
7e20: 43 45 32 28 22 53 59 4e 43 20 20 20 20 25 2d 33  CE2("SYNC    %-3
7e30: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b  d\n", pFile->h);
7e40: 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f 66 73 79  .  rc = full_fsy
7e50: 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20 69 73 46  nc(pFile->h, isF
7e60: 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61 74 61 4f  ullsync, isDataO
7e70: 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  nly);.  Simulate
7e80: 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b  IOError( rc=1 );
7e90: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
7ea0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
7eb0: 4f 45 52 52 5f 46 53 59 4e 43 3b 0a 20 20 7d 0a  OERR_FSYNC;.  }.
7ec0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72    if( pFile->dir
7ed0: 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54  fd>=0 ){.    OST
7ee0: 52 41 43 45 34 28 22 44 49 52 53 59 4e 43 20 25  RACE4("DIRSYNC %
7ef0: 2d 33 64 20 28 68 61 76 65 5f 66 75 6c 6c 66 73  -3d (have_fullfs
7f00: 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d  ync=%d fullsync=
7f10: 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 64  %d)\n", pFile->d
7f20: 69 72 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20  irfd,.          
7f30: 20 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43    HAVE_FULLFSYNC
7f40: 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29 3b 0a 23  , isFullsync);.#
7f50: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49  ifndef SQLITE_DI
7f60: 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20  SABLE_DIRSYNC.  
7f70: 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74 6f    /* The directo
7f80: 72 79 20 73 79 6e 63 20 69 73 20 6f 6e 6c 79 20  ry sync is only 
7f90: 61 74 74 65 6d 70 74 65 64 20 69 66 20 66 75 6c  attempted if ful
7fa0: 6c 5f 66 73 79 6e 63 20 69 73 0a 20 20 20 20 2a  l_fsync is.    *
7fb0: 2a 20 74 75 72 6e 65 64 20 6f 66 66 20 6f 72 20  * turned off or 
7fc0: 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66  unavailable.  If
7fd0: 20 61 20 66 75 6c 6c 5f 66 73 79 6e 63 20 6f 63   a full_fsync oc
7fe0: 63 75 72 72 65 64 20 61 62 6f 76 65 2c 0a 20 20  curred above,.  
7ff0: 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 64 69    ** then the di
8000: 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20  rectory sync is 
8010: 73 75 70 65 72 66 6c 75 6f 75 73 2e 0a 20 20 20  superfluous..   
8020: 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 48 41   */.    if( (!HA
8030: 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 7c 20  VE_FULLFSYNC || 
8040: 21 69 73 46 75 6c 6c 73 79 6e 63 29 20 26 26 20  !isFullsync) && 
8050: 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65  full_fsync(pFile
8060: 2d 3e 64 69 72 66 64 2c 30 2c 30 29 20 29 7b 0a  ->dirfd,0,0) ){.
8070: 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20         /*.      
8080: 20 2a 2a 20 57 65 20 68 61 76 65 20 72 65 63 65   ** We have rece
8090: 69 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 72 65  ived multiple re
80a0: 70 6f 72 74 73 20 6f 66 20 66 73 79 6e 63 28 29  ports of fsync()
80b0: 20 72 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20   returning.     
80c0: 20 20 2a 2a 20 65 72 72 6f 72 73 20 77 68 65 6e    ** errors when
80d0: 20 61 70 70 6c 69 65 64 20 74 6f 20 64 69 72 65   applied to dire
80e0: 63 74 6f 72 69 65 73 20 6f 6e 20 63 65 72 74 61  ctories on certa
80f0: 69 6e 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e  in file systems.
8100: 0a 20 20 20 20 20 20 20 2a 2a 20 41 20 66 61 69  .       ** A fai
8110: 6c 65 64 20 64 69 72 65 63 74 6f 72 79 20 73 79  led directory sy
8120: 6e 63 20 69 73 20 6e 6f 74 20 61 20 62 69 67 20  nc is not a big 
8130: 64 65 61 6c 2e 20 20 53 6f 20 69 74 20 73 65 65  deal.  So it see
8140: 6d 73 0a 20 20 20 20 20 20 20 2a 2a 20 62 65 74  ms.       ** bet
8150: 74 65 72 20 74 6f 20 69 67 6e 6f 72 65 20 74 68  ter to ignore th
8160: 65 20 65 72 72 6f 72 2e 20 20 54 69 63 6b 65 74  e error.  Ticket
8170: 20 23 31 36 35 37 0a 20 20 20 20 20 20 20 2a 2f   #1657.       */
8180: 0a 20 20 20 20 20 20 20 2f 2a 20 72 65 74 75 72  .       /* retur
8190: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 20  n SQLITE_IOERR; 
81a0: 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  */.    }.#endif.
81b0: 20 20 20 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d      close(pFile-
81c0: 3e 64 69 72 66 64 29 3b 20 20 2f 2a 20 4f 6e 6c  >dirfd);  /* Onl
81d0: 79 20 6e 65 65 64 20 74 6f 20 73 79 6e 63 20 6f  y need to sync o
81e0: 6e 63 65 2c 20 73 6f 20 63 6c 6f 73 65 20 74 68  nce, so close th
81f0: 65 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20  e directory */. 
8200: 20 20 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 20     pFile->dirfd 
8210: 3d 20 2d 31 3b 20 20 20 20 2f 2a 20 77 68 65 6e  = -1;    /* when
8220: 20 77 65 20 61 72 65 20 64 6f 6e 65 2e 20 2a 2f   we are done. */
8230: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
8240: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
8250: 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70  * Truncate an op
8260: 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65  en file to a spe
8270: 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73  cified size.*/.s
8280: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72  tatic int unixTr
8290: 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66  uncate(sqlite3_f
82a0: 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79  ile *id, i64 nBy
82b0: 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  te){.  int rc;. 
82c0: 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20   assert( id );. 
82d0: 20 72 63 20 3d 20 66 74 72 75 6e 63 61 74 65 28   rc = ftruncate(
82e0: 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
82f0: 3e 68 2c 20 28 6f 66 66 5f 74 29 6e 42 79 74 65  >h, (off_t)nByte
8300: 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
8310: 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20  rror( rc=1 );.  
8320: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
8330: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
8340: 52 5f 54 52 55 4e 43 41 54 45 3b 0a 20 20 7d 65  R_TRUNCATE;.  }e
8350: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
8360: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
8370: 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
8380: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  e the current si
8390: 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20  ze of a file in 
83a0: 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  bytes.*/.static 
83b0: 69 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a 65  int unixFileSize
83c0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
83d0: 64 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a  d, i64 *pSize){.
83e0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75    int rc;.  stru
83f0: 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61  ct stat buf;.  a
8400: 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72  ssert( id );.  r
8410: 63 20 3d 20 66 73 74 61 74 28 28 28 75 6e 69 78  c = fstat(((unix
8420: 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62  File*)id)->h, &b
8430: 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  uf);.  SimulateI
8440: 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a  OError( rc=1 );.
8450: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
8460: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8470: 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
8480: 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66  }.  *pSize = buf
8490: 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 72 65 74 75  .st_size;.  retu
84a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
84b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
84c0: 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
84d0: 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
84e0: 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
84f0: 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
8500: 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
8510: 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
8520: 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
8530: 6b 20 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72  k is held, retur
8540: 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20  n.** non-zero.  
8550: 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  If the file is u
8560: 6e 6c 6f 63 6b 65 64 20 6f 72 20 68 6f 6c 64 73  nlocked or holds
8570: 20 6f 6e 6c 79 20 53 48 41 52 45 44 20 6c 6f 63   only SHARED loc
8580: 6b 73 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75  ks, then.** retu
8590: 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  rn zero..*/.stat
85a0: 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b  ic int unixCheck
85b0: 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
85c0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
85d0: 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 75    int r = 0;.  u
85e0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
85f0: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
8600: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
8610: 20 29 3b 0a 20 20 65 6e 74 65 72 4d 75 74 65 78   );.  enterMutex
8620: 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70  (); /* Because p
8630: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73  File->pLock is s
8640: 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
8650: 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68  eads */..  /* Ch
8660: 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20  eck if a thread 
8670: 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
8680: 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63  holds such a loc
8690: 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  k */.  if( pFile
86a0: 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70  ->pLock->locktyp
86b0: 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  e>SHARED_LOCK ){
86c0: 0a 20 20 20 20 72 20 3d 20 31 3b 0a 20 20 7d 0a  .    r = 1;.  }.
86d0: 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
86e0: 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
86f0: 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
8700: 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  it..  */.  if( !
8710: 72 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  r ){.    struct 
8720: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20  flock lock;.    
8730: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
8740: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f  SEEK_SET;.    lo
8750: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53  ck.l_start = RES
8760: 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20  ERVED_BYTE;.    
8770: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a  lock.l_len = 1;.
8780: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
8790: 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 66  = F_WRLCK;.    f
87a0: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
87b0: 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a  _GETLK, &lock);.
87c0: 20 20 20 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74      if( lock.l_t
87d0: 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype!=F_UNLCK ){.
87e0: 20 20 20 20 20 20 72 20 3d 20 31 3b 0a 20 20 20        r = 1;.   
87f0: 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 6c 65 61 76   }.  }.  .  leav
8800: 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
8810: 41 43 45 33 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE3("TEST WR-LO
8820: 43 4b 20 25 64 20 25 64 5c 6e 22 2c 20 70 46 69  CK %d %d\n", pFi
8830: 6c 65 2d 3e 68 2c 20 72 29 3b 0a 0a 20 20 72 65  le->h, r);..  re
8840: 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn r;.}../*.**
8850: 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
8860: 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
8870: 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
8880: 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f  ter locktype - o
8890: 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
88a0: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
88b0: 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
88c0: 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
88d0: 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
88e0: 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
88f0: 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
8900: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
8910: 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
8920: 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
8930: 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
8940: 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
8950: 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
8960: 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
8970: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
8980: 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
8990: 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
89a0: 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
89b0: 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
89c0: 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
89d0: 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
89e0: 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
89f0: 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
8a00: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
8a10: 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
8a20: 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
8a30: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
8a40: 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
8a50: 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
8a60: 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
8a70: 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
8a80: 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
8a90: 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
8aa0: 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
8ab0: 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
8ac0: 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
8ad0: 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
8ae0: 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
8af0: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
8b00: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8b10: 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
8b20: 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
8b30: 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
8b40: 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
8b50: 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
8b60: 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
8b70: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63  atic int unixLoc
8b80: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
8b90: 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
8ba0: 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ){.  /* The foll
8bb0: 6f 77 69 6e 67 20 64 65 73 63 72 69 62 65 73 20  owing describes 
8bc0: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
8bd0: 6f 6e 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75  on of the variou
8be0: 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a  s locks and.  **
8bf0: 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e   lock transition
8c00: 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68  s in terms of th
8c10: 65 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  e POSIX advisory
8c20: 20 73 68 61 72 65 64 20 61 6e 64 20 65 78 63 6c   shared and excl
8c30: 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20  usive.  ** lock 
8c40: 70 72 69 6d 69 74 69 76 65 73 20 28 63 61 6c 6c  primitives (call
8c50: 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e  ed read-locks an
8c60: 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65  d write-locks be
8c70: 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20  low, to avoid.  
8c80: 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74  ** confusion wit
8c90: 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61  h SQLite lock na
8ca0: 6d 65 73 29 2e 20 54 68 65 20 61 6c 67 6f 72 69  mes). The algori
8cb0: 74 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69 63  thms are complic
8cc0: 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74  ated.  ** slight
8cd0: 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  ly in order to b
8ce0: 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  e compatible wit
8cf0: 68 20 77 69 6e 64 6f 77 73 20 73 79 73 74 65 6d  h windows system
8d00: 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79  s simultaneously
8d10: 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67 20  .  ** accessing 
8d20: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
8d30: 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65 20  e file, in case 
8d40: 74 68 61 74 20 69 73 20 65 76 65 72 20 72 65 71  that is ever req
8d50: 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  uired..  **.  **
8d60: 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64   Symbols defined
8d70: 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69   in os.h indenti
8d80: 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  fy the 'pending 
8d90: 62 79 74 65 27 20 61 6e 64 20 74 68 65 20 27 72  byte' and the 'r
8da0: 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79 74  eserved.  ** byt
8db0: 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65 20  e', each single 
8dc0: 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e  bytes at well kn
8dd0: 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e 64  own offsets, and
8de0: 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74   the 'shared byt
8df0: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61  e.  ** range', a
8e00: 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62 79   range of 510 by
8e10: 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e  tes at a well kn
8e20: 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a  own offset..  **
8e30: 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20  .  ** To obtain 
8e40: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61  a SHARED lock, a
8e50: 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62   read-lock is ob
8e60: 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27 70  tained on the 'p
8e70: 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65  ending.  ** byte
8e80: 27 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73  '.  If this is s
8e90: 75 63 63 65 73 73 66 75 6c 2c 20 61 20 72 61 6e  uccessful, a ran
8ea0: 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 74 68  dom byte from th
8eb0: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
8ec0: 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 72 65   ** range' is re
8ed0: 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68  ad-locked and th
8ee0: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70  e lock on the 'p
8ef0: 65 6e 64 69 6e 67 20 62 79 74 65 27 20 72 65 6c  ending byte' rel
8f00: 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  eased..  **.  **
8f10: 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f   A process may o
8f20: 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52 45 53  nly obtain a RES
8f30: 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74 65 72  ERVED lock after
8f40: 20 69 74 20 68 61 73 20 61 20 53 48 41 52 45 44   it has a SHARED
8f50: 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45   lock..  ** A RE
8f60: 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 69  SERVED lock is i
8f70: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 67 72  mplemented by gr
8f80: 61 62 62 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  abbing a write-l
8f90: 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ock on the.  ** 
8fa0: 27 72 65 73 65 72 76 65 64 20 62 79 74 65 27 2e  'reserved byte'.
8fb0: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72   .  **.  ** A pr
8fc0: 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f  ocess may only o
8fd0: 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e 47 20  btain a PENDING 
8fe0: 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61  lock after it ha
8ff0: 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20 20 2a  s obtained a.  *
9000: 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41  * SHARED lock. A
9010: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
9020: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
9030: 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74  obtaining a writ
9040: 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74  e-lock.  ** on t
9050: 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65  he 'pending byte
9060: 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  '. This ensures 
9070: 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48 41 52  that no new SHAR
9080: 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a  ED locks can be.
9090: 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62    ** obtained, b
90a0: 75 74 20 65 78 69 73 74 69 6e 67 20 53 48 41 52  ut existing SHAR
90b0: 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c  ED locks are all
90c0: 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73 74 2e  owed to persist.
90d0: 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20   A process.  ** 
90e0: 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
90f0: 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56   obtain a RESERV
9100: 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77  ED lock on the w
9110: 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e 47 20  ay to a PENDING 
9120: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20  lock..  ** This 
9130: 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64  property is used
9140: 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69 74 68   by the algorith
9150: 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61  m for rolling ba
9160: 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ck a journal fil
9170: 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 20 63  e.  ** after a c
9180: 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rash..  **.  ** 
9190: 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  An EXCLUSIVE loc
91a0: 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66 74 65  k, obtained afte
91b0: 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  r a PENDING lock
91c0: 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a   is held, is.  *
91d0: 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  * implemented by
91e0: 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69   obtaining a wri
91f0: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65  te-lock on the e
9200: 6e 74 69 72 65 20 27 73 68 61 72 65 64 20 62 79  ntire 'shared by
9210: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20  te.  ** range'. 
9220: 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72 20  Since all other 
9230: 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20 61 20  locks require a 
9240: 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65  read-lock on one
9250: 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a 20 20   of the bytes.  
9260: 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 72  ** within this r
9270: 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73 75 72  ange, this ensur
9280: 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  es that no other
9290: 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 20   locks are held 
92a0: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  on the.  ** data
92b0: 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  base. .  **.  **
92c0: 20 54 68 65 20 72 65 61 73 6f 6e 20 61 20 73 69   The reason a si
92d0: 6e 67 6c 65 20 62 79 74 65 20 63 61 6e 6e 6f 74  ngle byte cannot
92e0: 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64   be used instead
92f0: 20 6f 66 20 74 68 65 20 27 73 68 61 72 65 64 20   of the 'shared 
9300: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
9310: 20 69 73 20 74 68 61 74 20 73 6f 6d 65 20 76 65   is that some ve
9320: 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64 6f 77  rsions of window
9330: 73 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  s do not support
9340: 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a   read-locks. By.
9350: 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61 20 72    ** locking a r
9360: 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20  andom byte from 
9370: 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75 72 72  a range, concurr
9380: 65 6e 74 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  ent SHARED locks
9390: 20 6d 61 79 20 65 78 69 73 74 0a 20 20 2a 2a 20   may exist.  ** 
93a0: 65 76 65 6e 20 69 66 20 74 68 65 20 6c 6f 63 6b  even if the lock
93b0: 69 6e 67 20 70 72 69 6d 69 74 69 76 65 20 75 73  ing primitive us
93c0: 65 64 20 69 73 20 61 6c 77 61 79 73 20 61 20 77  ed is always a w
93d0: 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a  rite-lock..  */.
93e0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
93f0: 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
9400: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
9410: 69 6c 65 2a 29 69 64 3b 0a 20 20 73 74 72 75 63  ile*)id;.  struc
9420: 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63  t lockInfo *pLoc
9430: 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  k = pFile->pLock
9440: 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  ;.  struct flock
9450: 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 73 3b 0a   lock;.  int s;.
9460: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
9470: 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 37 28 22   );.  OSTRACE7("
9480: 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61  LOCK    %d %s wa
9490: 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d  s %s(%s,%d) pid=
94a0: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
94b0: 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e  .      locktypeN
94c0: 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 6c  ame(locktype), l
94d0: 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69 6c  ocktypeName(pFil
94e0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 0a 20 20  e->locktype),.  
94f0: 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65      locktypeName
9500: 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65  (pLock->locktype
9510: 29 2c 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 2c 20  ), pLock->cnt , 
9520: 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 2f 2a  getpid());..  /*
9530: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
9540: 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
9550: 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
9560: 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
9570: 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c  the.  ** unixFil
9580: 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
9590: 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64  on't use the end
95a0: 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
95b0: 2c 20 61 73 0a 20 20 2a 2a 20 65 6e 74 65 72 4d  , as.  ** enterM
95c0: 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65  utex() hasn't be
95d0: 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20  en called yet.. 
95e0: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
95f0: 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74  >locktype>=lockt
9600: 79 70 65 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ype ){.    OSTRA
9610: 43 45 33 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE3("LOCK    %d 
9620: 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68  %s ok (already h
9630: 65 6c 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  eld)\n", pFile->
9640: 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  h,.            l
9650: 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b  ocktypeName(lock
9660: 74 79 70 65 29 29 3b 0a 20 20 20 20 72 65 74 75  type));.    retu
9670: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
9680: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
9690: 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65  e the locking se
96a0: 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63  quence is correc
96b0: 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  t.  */.  assert(
96c0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
96d0: 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63  !=NO_LOCK || loc
96e0: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
96f0: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
9700: 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e  locktype!=PENDIN
9710: 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  G_LOCK );.  asse
9720: 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45  rt( locktype!=RE
9730: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SERVED_LOCK || p
9740: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
9750: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a  SHARED_LOCK );..
9760: 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20    /* This mutex 
9770: 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73  is needed becaus
9780: 65 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69  e pFile->pLock i
9790: 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20  s shared across 
97a0: 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 65  threads.  */.  e
97b0: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20  nterMutex();..  
97c0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
97d0: 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20   current thread 
97e0: 6f 77 6e 73 20 74 68 65 20 70 46 69 6c 65 2e 0a  owns the pFile..
97f0: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61 6e    */.  rc = tran
9800: 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 70 46  sferOwnership(pF
9810: 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ile);.  if( rc!=
9820: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9830: 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20   leaveMutex();. 
9840: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
9850: 7d 0a 20 20 70 4c 6f 63 6b 20 3d 20 70 46 69 6c  }.  pLock = pFil
9860: 65 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20  e->pLock;..  /* 
9870: 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  If some thread u
9880: 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61  sing this PID ha
9890: 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64  s a lock via a d
98a0: 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c  ifferent unixFil
98b0: 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74  e*.  ** handle t
98c0: 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68  hat precludes th
98d0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
98e0: 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20  , return BUSY.. 
98f0: 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65   */.  if( (pFile
9900: 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 70 4c 6f 63  ->locktype!=pLoc
9910: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 26 26 20 0a  k->locktype && .
9920: 20 20 20 20 20 20 20 20 20 20 28 70 4c 6f 63 6b            (pLock
9930: 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50 45 4e 44  ->locktype>=PEND
9940: 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b  ING_LOCK || lock
9950: 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  type>SHARED_LOCK
9960: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  )).  ){.    rc =
9970: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
9980: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
9990: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20  .  }..  /* If a 
99a0: 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72  SHARED lock is r
99b0: 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f  equested, and so
99c0: 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
99d0: 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79  this PID already
99e0: 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52  .  ** has a SHAR
99f0: 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c  ED or RESERVED l
9a00: 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d  ock, then increm
9a10: 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f  ent reference co
9a20: 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65  unts and.  ** re
9a30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
9a40: 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
9a50: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
9a60: 20 26 26 20 0a 20 20 20 20 20 20 28 70 4c 6f 63   && .      (pLoc
9a70: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  k->locktype==SHA
9a80: 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63  RED_LOCK || pLoc
9a90: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53  k->locktype==RES
9aa0: 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20  ERVED_LOCK) ){. 
9ab0: 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74     assert( lockt
9ac0: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
9ad0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9ae0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
9af0: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
9b00: 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 30 20 29  ( pLock->cnt>0 )
9b10: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  ;.    pFile->loc
9b20: 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c  ktype = SHARED_L
9b30: 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  OCK;.    pLock->
9b40: 63 6e 74 2b 2b 3b 0a 20 20 20 20 70 46 69 6c 65  cnt++;.    pFile
9b50: 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b  ->pOpen->nLock++
9b60: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c  ;.    goto end_l
9b70: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 6c 6f 63 6b  ock;.  }..  lock
9b80: 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 0a 20 20  .l_len = 1L;..  
9b90: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
9ba0: 53 45 45 4b 5f 53 45 54 3b 0a 0a 20 20 2f 2a 20  SEEK_SET;..  /* 
9bb0: 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  A PENDING lock i
9bc0: 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20  s needed before 
9bd0: 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52  acquiring a SHAR
9be0: 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f  ED lock and befo
9bf0: 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e  re.  ** acquirin
9c00: 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  g an EXCLUSIVE l
9c10: 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48  ock.  For the SH
9c20: 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50  ARED lock, the P
9c30: 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a  ENDING will.  **
9c40: 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20   be released..  
9c50: 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
9c60: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a  e==SHARED_LOCK .
9c70: 20 20 20 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79        || (lockty
9c80: 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
9c90: 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK && pFile->loc
9ca0: 6b 74 79 70 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f  ktype<PENDING_LO
9cb0: 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63  CK).  ){.    loc
9cc0: 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 6c 6f 63 6b  k.l_type = (lock
9cd0: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
9ce0: 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43  K?F_RDLCK:F_WRLC
9cf0: 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  K);.    lock.l_s
9d00: 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
9d10: 59 54 45 3b 0a 20 20 20 20 73 20 3d 20 66 63 6e  YTE;.    s = fcn
9d20: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
9d30: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20  ETLK, &lock);.  
9d40: 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b    if( s==(-1) ){
9d50: 0a 20 20 20 20 20 20 72 63 20 3d 20 28 65 72 72  .      rc = (err
9d60: 6e 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f 20 53 51  no==EINVAL) ? SQ
9d70: 4c 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c  LITE_NOLFS : SQL
9d80: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
9d90: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
9da0: 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20     }.  }...  /* 
9db0: 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20  If control gets 
9dc0: 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
9dd0: 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20  hen actually go 
9de0: 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20  ahead and make. 
9df0: 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79   ** operating sy
9e00: 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74  stem calls for t
9e10: 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63  he specified loc
9e20: 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  k..  */.  if( lo
9e30: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
9e40: 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OCK ){.    asser
9e50: 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30  t( pLock->cnt==0
9e60: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9e70: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pLock->locktype=
9e80: 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f  =0 );..    /* No
9e90: 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c  w get the read-l
9ea0: 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e  ock */.    lock.
9eb0: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
9ec0: 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b  _FIRST;.    lock
9ed0: 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
9ee0: 53 49 5a 45 3b 0a 20 20 20 20 73 20 3d 20 66 63  SIZE;.    s = fc
9ef0: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
9f00: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 0a  SETLK, &lock);..
9f10: 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
9f20: 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e  temporary PENDIN
9f30: 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f  G lock */.    lo
9f40: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e  ck.l_start = PEN
9f50: 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c  DING_BYTE;.    l
9f60: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a  ock.l_len = 1L;.
9f70: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
9f80: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69  = F_UNLCK;.    i
9f90: 66 28 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e  f( fcntl(pFile->
9fa0: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
9fb0: 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  k)!=0 ){.      r
9fc0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
9fd0: 5f 55 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54 68 69  _UNLOCK;  /* Thi
9fe0: 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68  s should never h
9ff0: 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 67  appen */.      g
a000: 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  oto end_lock;.  
a010: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 3d 3d 28    }.    if( s==(
a020: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  -1) ){.      rc 
a030: 3d 20 28 65 72 72 6e 6f 3d 3d 45 49 4e 56 41 4c  = (errno==EINVAL
a040: 29 20 3f 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53  ) ? SQLITE_NOLFS
a050: 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   : SQLITE_BUSY;.
a060: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a070: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
a080: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
a090: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 4f 70        pFile->pOp
a0a0: 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  en->nLock++;.   
a0b0: 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20     pLock->cnt = 
a0c0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
a0d0: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45   if( locktype==E
a0e0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
a0f0: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 31 20 29 7b   pLock->cnt>1 ){
a100: 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74  .    /* We are t
a110: 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63  rying for an exc
a120: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20  lusive lock but 
a130: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69  another thread i
a140: 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 61  n this.    ** sa
a150: 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  me process is st
a160: 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68  ill holding a sh
a170: 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  ared lock. */.  
a180: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
a190: 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  SY;.  }else{.   
a1a0: 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20   /* The request 
a1b0: 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56  was for a RESERV
a1c0: 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
a1d0: 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20  lock.  It is.   
a1e0: 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74   ** assumed that
a1f0: 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52   there is a SHAR
a200: 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
a210: 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20  ck on the file. 
a220: 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20     ** already.. 
a230: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
a240: 28 20 30 21 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ( 0!=pFile->lock
a250: 74 79 70 65 20 29 3b 0a 20 20 20 20 6c 6f 63 6b  type );.    lock
a260: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43  .l_type = F_WRLC
a270: 4b 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6c  K;.    switch( l
a280: 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 20  ocktype ){.     
a290: 20 63 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c   case RESERVED_L
a2a0: 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 6c 6f 63  OCK:.        loc
a2b0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45  k.l_start = RESE
a2c0: 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 20  RVED_BYTE;.     
a2d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a2e0: 63 61 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c  case EXCLUSIVE_L
a2f0: 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 6c 6f 63  OCK:.        loc
a300: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
a310: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
a320: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
a330: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
a340: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a350: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
a360: 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20    assert(0);.   
a370: 20 7d 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c   }.    s = fcntl
a380: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54  (pFile->h, F_SET
a390: 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20  LK, &lock);.    
a3a0: 69 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a 20  if( s==(-1) ){. 
a3b0: 20 20 20 20 20 72 63 20 3d 20 28 65 72 72 6e 6f       rc = (errno
a3c0: 3d 3d 45 49 4e 56 41 4c 29 20 3f 20 53 51 4c 49  ==EINVAL) ? SQLI
a3d0: 54 45 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c 49 54  TE_NOLFS : SQLIT
a3e0: 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20  E_BUSY;.    }.  
a3f0: 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53  }.  .  if( rc==S
a400: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
a410: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
a420: 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  = locktype;.    
a430: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20  pLock->locktype 
a440: 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 65  = locktype;.  }e
a450: 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  lse if( locktype
a460: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
a470: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
a480: 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e  ocktype = PENDIN
a490: 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f 63  G_LOCK;.    pLoc
a4a0: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45  k->locktype = PE
a4b0: 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a  NDING_LOCK;.  }.
a4c0: 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 6c 65 61  .end_lock:.  lea
a4d0: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
a4e0: 52 41 43 45 34 28 22 4c 4f 43 4b 20 20 20 20 25  RACE4("LOCK    %
a4f0: 64 20 25 73 20 25 73 5c 6e 22 2c 20 70 46 69 6c  d %s %s\n", pFil
a500: 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 4e 61  e->h, locktypeNa
a510: 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 0a 20  me(locktype), . 
a520: 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
a530: 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
a540: 6c 65 64 22 29 3b 0a 20 20 72 65 74 75 72 6e 20  led");.  return 
a550: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
a560: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
a570: 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
a580: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
a590: 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b   locktype.  lock
a5a0: 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20  type.** must be 
a5b0: 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
a5c0: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
a5d0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
a5e0: 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
a5f0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
a600: 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
a610: 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
a620: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
a630: 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
a640: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
a650: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
a660: 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  nixUnlock(sqlite
a670: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
a680: 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 73 74 72  locktype){.  str
a690: 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c  uct lockInfo *pL
a6a0: 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20 66 6c  ock;.  struct fl
a6b0: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20  ock lock;.  int 
a6c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
a6d0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
a6e0: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
a6f0: 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  d;..  assert( pF
a700: 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
a710: 37 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  7("UNLOCK  %d %d
a720: 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70   was %d(%d,%d) p
a730: 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  id=%d\n", pFile-
a740: 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20  >h, locktype,.  
a750: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
a760: 79 70 65 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f 63  ype, pFile->pLoc
a770: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69  k->locktype, pFi
a780: 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 2c 20  le->pLock->cnt, 
a790: 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 61 73  getpid());..  as
a7a0: 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d  sert( locktype<=
a7b0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
a7c0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
a7d0: 74 79 70 65 3c 3d 6c 6f 63 6b 74 79 70 65 20 29  type<=locktype )
a7e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
a7f0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
a800: 28 20 43 48 45 43 4b 5f 54 48 52 45 41 44 49 44  ( CHECK_THREADID
a810: 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 72  (pFile) ){.    r
a820: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
a830: 55 53 45 3b 0a 20 20 7d 0a 20 20 65 6e 74 65 72  USE;.  }.  enter
a840: 4d 75 74 65 78 28 29 3b 0a 20 20 70 4c 6f 63 6b  Mutex();.  pLock
a850: 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b   = pFile->pLock;
a860: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b  .  assert( pLock
a870: 2d 3e 63 6e 74 21 3d 30 20 29 3b 0a 20 20 69 66  ->cnt!=0 );.  if
a880: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
a890: 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  e>SHARED_LOCK ){
a8a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
a8b0: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 70 46  ck->locktype==pF
a8c0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b  ile->locktype );
a8d0: 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  .    if( locktyp
a8e0: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
a8f0: 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74  {.      lock.l_t
a900: 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
a910: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
a920: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
a930: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
a940: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
a950: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  ;.      lock.l_l
a960: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
a970: 3b 0a 20 20 20 20 20 20 69 66 28 20 66 63 6e 74  ;.      if( fcnt
a980: 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45  l(pFile->h, F_SE
a990: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31  TLK, &lock)==(-1
a9a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
a9b0: 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65  This should neve
a9c0: 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20  r happen */.    
a9d0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
a9e0: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20  IOERR_RDLOCK;.  
a9f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
aa00: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
aa10: 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e  UNLCK;.    lock.
aa20: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
aa30: 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  SET;.    lock.l_
aa40: 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f  start = PENDING_
aa50: 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  BYTE;.    lock.l
aa60: 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65  _len = 2L;  asse
aa70: 72 74 28 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  rt( PENDING_BYTE
aa80: 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f 42 59 54  +1==RESERVED_BYT
aa90: 45 20 29 3b 0a 20 20 20 20 69 66 28 20 66 63 6e  E );.    if( fcn
aaa0: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
aab0: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d  ETLK, &lock)!=(-
aac0: 31 29 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63  1) ){.      pLoc
aad0: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48  k->locktype = SH
aae0: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  ARED_LOCK;.    }
aaf0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
ab00: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
ab10: 4c 4f 43 4b 3b 20 20 2f 2a 20 54 68 69 73 20 73  LOCK;  /* This s
ab20: 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70  hould never happ
ab30: 65 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  en */.    }.  }.
ab40: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
ab50: 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 73  NO_LOCK ){.    s
ab60: 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70  truct openCnt *p
ab70: 4f 70 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 44 65  Open;..    /* De
ab80: 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72  crement the shar
ab90: 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e  ed lock counter.
aba0: 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f    Release the lo
abb0: 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20  ck using an.    
abc0: 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20  ** OS call only 
abd0: 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73  when all threads
abe0: 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72   in this same pr
abf0: 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61  ocess have relea
ac00: 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  sed.    ** the l
ac10: 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ock..    */.    
ac20: 70 4c 6f 63 6b 2d 3e 63 6e 74 2d 2d 3b 0a 20 20  pLock->cnt--;.  
ac30: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74    if( pLock->cnt
ac40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63  ==0 ){.      loc
ac50: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
ac60: 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  CK;.      lock.l
ac70: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
ac80: 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ET;.      lock.l
ac90: 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f  _start = lock.l_
aca0: 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20  len = 0L;.      
acb0: 69 66 28 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d  if( fcntl(pFile-
acc0: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  >h, F_SETLK, &lo
acd0: 63 6b 29 21 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ck)!=(-1) ){.   
ace0: 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b       pLock->lock
acf0: 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  type = NO_LOCK;.
ad00: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ad10: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
ad20: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 20  _IOERR_UNLOCK;  
ad30: 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  /* This should n
ad40: 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20  ever happen */. 
ad50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
ad60: 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
ad70: 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b  he count of lock
ad80: 73 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 73  s against this s
ad90: 61 6d 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20  ame file.  When 
ada0: 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74  the.    ** count
adb0: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 63   reaches zero, c
adc0: 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65 72 20 66  lose any other f
add0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
ade0: 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20 20  whose close.    
adf0: 2a 2a 20 77 61 73 20 64 65 66 65 72 72 65 64 20  ** was deferred 
ae00: 62 65 63 61 75 73 65 20 6f 66 20 6f 75 74 73 74  because of outst
ae10: 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20  anding locks..  
ae20: 20 20 2a 2f 0a 20 20 20 20 70 4f 70 65 6e 20 3d    */.    pOpen =
ae30: 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20   pFile->pOpen;. 
ae40: 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2d     pOpen->nLock-
ae50: 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  -;.    assert( p
ae60: 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29  Open->nLock>=0 )
ae70: 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d  ;.    if( pOpen-
ae80: 3e 6e 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 4f 70  >nLock==0 && pOp
ae90: 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3e 30 20 29  en->nPending>0 )
aea0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
aeb0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
aec0: 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3b  pOpen->nPending;
aed0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   i++){.        c
aee0: 6c 6f 73 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e  lose(pOpen->aPen
aef0: 64 69 6e 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20  ding[i]);.      
af00: 7d 0a 20 20 20 20 20 20 66 72 65 65 28 70 4f 70  }.      free(pOp
af10: 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 29 3b 0a 20  en->aPending);. 
af20: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e       pOpen->nPen
af30: 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  ding = 0;.      
af40: 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20  pOpen->aPending 
af50: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
af60: 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20   leaveMutex();. 
af70: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
af80: 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72   = locktype;.  r
af90: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
afa0: 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
afb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
afc0: 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  nixClose(sqlite3
afd0: 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e  _file *id){.  un
afe0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
aff0: 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a  (unixFile *)id;.
b000: 20 20 69 66 28 20 21 70 46 69 6c 65 20 29 20 72    if( !pFile ) r
b010: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b020: 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 69 64  .  unixUnlock(id
b030: 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66  , NO_LOCK);.  if
b040: 28 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d  ( pFile->dirfd>=
b050: 30 20 29 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d  0 ) close(pFile-
b060: 3e 64 69 72 66 64 29 3b 0a 20 20 70 46 69 6c 65  >dirfd);.  pFile
b070: 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20  ->dirfd = -1;.  
b080: 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20  enterMutex();.. 
b090: 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4f 70 65   if( pFile->pOpe
b0a0: 6e 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  n->nLock ){.    
b0b0: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
b0c0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
b0d0: 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c  s, do not actual
b0e0: 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  ly close the fil
b0f0: 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79 65  e just.    ** ye
b100: 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77  t because that w
b110: 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65  ould clear those
b120: 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64   locks.  Instead
b130: 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20  , add the file. 
b140: 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72     ** descriptor
b150: 20 74 6f 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64   to pOpen->aPend
b160: 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20 62 65  ing.  It will be
b170: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
b180: 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20 20 20 2a  losed when.    *
b190: 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20  * the last lock 
b1a0: 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20  is cleared..    
b1b0: 2a 2f 0a 20 20 20 20 69 6e 74 20 2a 61 4e 65 77  */.    int *aNew
b1c0: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 6f 70 65  ;.    struct ope
b1d0: 6e 43 6e 74 20 2a 70 4f 70 65 6e 20 3d 20 70 46  nCnt *pOpen = pF
b1e0: 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20 20 20  ile->pOpen;.    
b1f0: 61 4e 65 77 20 3d 20 72 65 61 6c 6c 6f 63 28 20  aNew = realloc( 
b200: 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2c  pOpen->aPending,
b210: 20 28 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e   (pOpen->nPendin
b220: 67 2b 31 29 2a 73 69 7a 65 6f 66 28 69 6e 74 29  g+1)*sizeof(int)
b230: 20 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77   );.    if( aNew
b240: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
b250: 49 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  If a malloc fail
b260: 73 2c 20 6a 75 73 74 20 6c 65 61 6b 20 74 68 65  s, just leak the
b270: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
b280: 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
b290: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e       pOpen->aPen
b2a0: 64 69 6e 67 20 3d 20 61 4e 65 77 3b 0a 20 20 20  ding = aNew;.   
b2b0: 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69     pOpen->aPendi
b2c0: 6e 67 5b 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69  ng[pOpen->nPendi
b2d0: 6e 67 5d 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a  ng] = pFile->h;.
b2e0: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65        pOpen->nPe
b2f0: 6e 64 69 6e 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nding++;.    }. 
b300: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
b310: 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
b320: 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 73 6f  tanding locks so
b330: 20 77 65 20 63 61 6e 20 63 6c 6f 73 65 20 74 68   we can close th
b340: 65 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65  e file immediate
b350: 6c 79 20 2a 2f 0a 20 20 20 20 63 6c 6f 73 65 28  ly */.    close(
b360: 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 7d 0a 20  pFile->h);.  }. 
b370: 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f   releaseLockInfo
b380: 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29 3b 0a  (pFile->pLock);.
b390: 20 20 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74    releaseOpenCnt
b3a0: 28 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 29 3b 0a  (pFile->pOpen);.
b3b0: 0a 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b  .  leaveMutex();
b3c0: 0a 20 20 70 46 69 6c 65 2d 3e 69 73 4f 70 65 6e  .  pFile->isOpen
b3d0: 20 3d 20 30 3b 0a 20 20 4f 53 54 52 41 43 45 32   = 0;.  OSTRACE2
b3e0: 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e  ("CLOSE   %-3d\n
b3f0: 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20  ", pFile->h);.  
b400: 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b  OpenCounter(-1);
b410: 0a 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c  .  memset(pFile,
b420: 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46   0, sizeof(unixF
b430: 69 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ile));.  return 
b440: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23  SQLITE_OK;.}...#
b450: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
b460: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
b470: 45 0a 23 70 72 61 67 6d 61 20 6d 61 72 6b 20 41  E.#pragma mark A
b480: 46 50 20 53 75 70 70 6f 72 74 0a 0a 2f 2a 0a 20  FP Support../*. 
b490: 2a 2a 20 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e  ** The afpLockin
b4a0: 67 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75  gContext structu
b4b0: 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20  re contains all 
b4c0: 61 66 70 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  afp lock specifi
b4d0: 63 20 73 74 61 74 65 0a 20 2a 2f 0a 74 79 70 65  c state. */.type
b4e0: 64 65 66 20 73 74 72 75 63 74 20 61 66 70 4c 6f  def struct afpLo
b4f0: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 61 66 70  ckingContext afp
b500: 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  LockingContext;.
b510: 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e  struct afpLockin
b520: 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75 6e 73  gContext {.  uns
b530: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
b540: 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 3b 0a  sharedLockByte;.
b550: 20 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68    char *filePath
b560: 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79 74  ;.};..struct Byt
b570: 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a  eRangeLockPB2.{.
b580: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
b590: 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20 20 20  long offset;    
b5a0: 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f      /* offset to
b5b0: 20 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 6c   first byte to l
b5c0: 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ock */.  unsigne
b5d0: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67  d long long leng
b5e0: 74 68 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 62  th;        /* nb
b5f0: 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f  r of bytes to lo
b600: 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ck */.  unsigned
b610: 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61   long long retRa
b620: 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72  ngeStart; /* nbr
b630: 20 6f 66 20 31 73 74 20 62 79 74 65 20 6c 6f 63   of 1st byte loc
b640: 6b 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75  ked if successfu
b650: 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
b660: 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b  char unLockFlag;
b670: 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 3d 20           /* 1 = 
b680: 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b  unlock, 0 = lock
b690: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
b6a0: 68 61 72 20 73 74 61 72 74 45 6e 64 46 6c 61 67  har startEndFlag
b6b0: 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c  ;       /* 1=rel
b6c0: 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c   to end of fork,
b6d0: 20 30 3d 72 65 6c 20 74 6f 20 73 74 61 72 74 20   0=rel to start 
b6e0: 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20  */.  int fd;    
b6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b700: 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 64         /* file d
b710: 65 73 63 20 74 6f 20 61 73 73 6f 63 20 74 68 69  esc to assoc thi
b720: 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d  s lock with */.}
b730: 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66 70 66 73  ;..#define afpfs
b740: 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53  ByteRangeLock2FS
b750: 43 54 4c 20 20 20 20 20 20 20 20 5f 49 4f 57 52  CTL        _IOWR
b760: 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74  ('z', 23, struct
b770: 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
b780: 32 29 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 74 75 72  2)../* .** Retur
b790: 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  n 0 on success, 
b7a0: 31 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20 54  1 on failure.  T
b7b0: 6f 20 6d 61 74 63 68 20 74 68 65 20 62 65 68 61  o match the beha
b7c0: 76 69 6f 72 20 6f 66 20 74 68 65 20 0a 2a 2a 20  vior of the .** 
b7d0: 6e 6f 72 6d 61 6c 20 70 6f 73 69 78 20 66 69 6c  normal posix fil
b7e0: 65 20 6c 6f 63 6b 69 6e 67 20 28 75 73 65 64 20  e locking (used 
b7f0: 69 6e 20 75 6e 69 78 4c 6f 63 6b 20 66 6f 72 20  in unixLock for 
b800: 65 78 61 6d 70 6c 65 29 2c 20 77 65 20 73 68 6f  example), we sho
b810: 75 6c 64 20 0a 2a 2a 20 70 72 6f 76 69 64 65 20  uld .** provide 
b820: 27 72 69 63 68 65 72 27 20 72 65 74 75 72 6e 20  'richer' return 
b830: 63 6f 64 65 73 20 2d 20 73 70 65 63 69 66 69 63  codes - specific
b840: 61 6c 6c 79 20 74 6f 20 64 69 66 66 65 72 65 6e  ally to differen
b850: 74 69 61 74 65 20 62 65 74 77 65 65 6e 0a 2a 2a  tiate between.**
b860: 20 27 66 69 6c 65 20 62 75 73 79 27 20 61 6e 64   'file busy' and
b870: 20 27 66 69 6c 65 20 73 79 73 74 65 6d 20 65 72   'file system er
b880: 72 6f 72 27 20 72 65 73 75 6c 74 73 2e 0a 2a 2f  ror' results..*/
b890: 0a 73 74 61 74 69 63 20 69 6e 74 20 5f 41 46 50  .static int _AFP
b8a0: 46 53 53 65 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e  FSSetLock(.  con
b8b0: 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 0a  st char *path, .
b8c0: 20 20 69 6e 74 20 66 64 2c 20 0a 20 20 75 6e 73    int fd, .  uns
b8d0: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
b8e0: 6f 66 66 73 65 74 2c 20 0a 20 20 75 6e 73 69 67  offset, .  unsig
b8f0: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65  ned long long le
b900: 6e 67 74 68 2c 20 0a 20 20 69 6e 74 20 73 65 74  ngth, .  int set
b910: 4c 6f 63 6b 46 6c 61 67 0a 29 7b 0a 20 20 73 74  LockFlag.){.  st
b920: 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
b930: 63 6b 50 42 32 20 20 20 20 20 20 20 70 62 3b 0a  ckPB2       pb;.
b940: 20 20 69 6e 74 20 20 20 20 20 20 20 20 20 20 20    int           
b950: 20 20 20 20 20 20 20 20 20 20 65 72 72 3b 0a 20            err;. 
b960: 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61   .  pb.unLockFla
b970: 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20  g = setLockFlag 
b980: 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74  ? 0 : 1;.  pb.st
b990: 61 72 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a  artEndFlag = 0;.
b9a0: 20 20 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66    pb.offset = of
b9b0: 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74  fset;.  pb.lengt
b9c0: 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70  h = length; .  p
b9d0: 62 2e 66 64 20 3d 20 66 64 3b 0a 20 20 4f 53 54  b.fd = fd;.  OST
b9e0: 52 41 43 45 35 28 22 41 46 50 4c 4f 43 4b 20 73  RACE5("AFPLOCK s
b9f0: 65 74 74 69 6e 67 20 6c 6f 63 6b 20 25 73 20 66  etting lock %s f
ba00: 6f 72 20 25 64 20 69 6e 20 72 61 6e 67 65 20 25  or %d in range %
ba10: 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20  llx:%llx\n", .  
ba20: 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22    (setLockFlag?"
ba30: 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 66 64 2c 20  ON":"OFF"), fd, 
ba40: 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29 3b  offset, length);
ba50: 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c 28 70  .  err = fsctl(p
ba60: 61 74 68 2c 20 61 66 70 66 73 42 79 74 65 52 61  ath, afpfsByteRa
ba70: 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26  ngeLock2FSCTL, &
ba80: 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28 20 65  pb, 0);.  if ( e
ba90: 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 4f  rr==-1 ) {.    O
baa0: 53 54 52 41 43 45 34 28 22 41 46 50 4c 4f 43 4b  STRACE4("AFPLOCK
bab0: 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74 6c   failed to fsctl
bac0: 28 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e 22  () '%s' %d %s\n"
bad0: 2c 20 70 61 74 68 2c 20 65 72 72 6e 6f 2c 20 0a  , path, errno, .
bae0: 20 20 20 20 20 20 73 74 72 65 72 72 6f 72 28 65        strerror(e
baf0: 72 72 6e 6f 29 29 3b 0a 20 20 20 20 72 65 74 75  rrno));.    retu
bb00: 72 6e 20 31 3b 20 2f 2a 20 65 72 72 6f 72 20 2a  rn 1; /* error *
bb10: 2f 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  /.  } else {.   
bb20: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d   return 0;.  }.}
bb30: 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 69 73 20 72 6f  ../*. ** This ro
bb40: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
bb50: 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
bb60: 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
bb70: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 20   the specified. 
bb80: 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
bb90: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
bba0: 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
bbb0: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 72 65  lock is held, re
bbc0: 74 75 72 6e 0a 20 2a 2a 20 6e 6f 6e 2d 7a 65 72  turn. ** non-zer
bbd0: 6f 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20  o.  If the file 
bbe0: 69 73 20 75 6e 6c 6f 63 6b 65 64 20 6f 72 20 68  is unlocked or h
bbf0: 6f 6c 64 73 20 6f 6e 6c 79 20 53 48 41 52 45 44  olds only SHARED
bc00: 20 6c 6f 63 6b 73 2c 20 74 68 65 6e 0a 20 2a 2a   locks, then. **
bc10: 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e 0a 20 2a   return zero.. *
bc20: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
bc30: 55 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  UnixCheckReserve
bc40: 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
bc50: 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72  le *id){.  int r
bc60: 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
bc70: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
bc80: 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73  ile*)id;.  .  as
bc90: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 20 0a  sert( pFile ); .
bca0: 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
bcb0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28  ext *context = (
bcc0: 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
bcd0: 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  t *) pFile->lock
bce0: 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20  ingContext;.  . 
bcf0: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
bd00: 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
bd10: 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
bd20: 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
bd30: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
bd40: 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
bd50: 20 20 20 20 72 20 3d 20 31 3b 0a 20 20 7d 0a 20      r = 1;.  }. 
bd60: 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65   .  /* Otherwise
bd70: 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
bd80: 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
bd90: 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 20   it..   */.  if 
bda0: 28 20 21 72 20 29 20 7b 0a 20 20 20 20 2f 2a 20  ( !r ) {.    /* 
bdb0: 6c 6f 63 6b 20 74 68 65 20 62 79 74 65 20 2a 2f  lock the byte */
bdc0: 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20  .    int failed 
bdd0: 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28  = _AFPFSSetLock(
bde0: 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74  context->filePat
bdf0: 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53  h, pFile->h, RES
be00: 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29  ERVED_BYTE, 1,1)
be10: 3b 20 20 0a 20 20 20 20 69 66 20 28 66 61 69 6c  ;  .    if (fail
be20: 65 64 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69  ed) {.      /* i
be30: 66 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 67  f we failed to g
be40: 65 74 20 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e  et the lock then
be50: 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75   someone else mu
be60: 73 74 20 68 61 76 65 20 69 74 20 2a 2f 0a 20 20  st have it */.  
be70: 20 20 20 20 72 20 3d 20 31 3b 0a 20 20 20 20 7d      r = 1;.    }
be80: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a   else {.      /*
be90: 20 69 66 20 77 65 20 73 75 63 63 65 65 64 65 64   if we succeeded
bea0: 20 69 6e 20 74 61 6b 69 6e 67 20 74 68 65 20 72   in taking the r
beb0: 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e  eserved lock, un
bec0: 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65 73 74 6f  lock it to resto
bed0: 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  re.      ** the 
bee0: 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 2a  original state *
bef0: 2f 0a 20 20 20 20 20 20 5f 41 46 50 46 53 53 65  /.      _AFPFSSe
bf00: 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66  tLock(context->f
bf10: 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e  ilePath, pFile->
bf20: 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  h, RESERVED_BYTE
bf30: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 0);.    }. 
bf40: 20 7d 0a 20 20 4f 53 54 52 41 43 45 33 28 22 54   }.  OSTRACE3("T
bf50: 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
bf60: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
bf70: 72 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20  r);.  .  return 
bf80: 72 3b 0a 7d 0a 0a 2f 2a 20 41 46 50 2d 73 74 79  r;.}../* AFP-sty
bf90: 6c 65 20 6c 6f 63 6b 69 6e 67 20 66 6f 6c 6c 6f  le locking follo
bfa0: 77 69 6e 67 20 74 68 65 20 62 65 68 61 76 69 6f  wing the behavio
bfb0: 72 20 6f 66 20 75 6e 69 78 4c 6f 63 6b 2c 20 73  r of unixLock, s
bfc0: 65 65 20 74 68 65 20 75 6e 69 78 4c 6f 63 6b 20  ee the unixLock 
bfd0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d  .** function com
bfe0: 6d 65 6e 74 73 20 66 6f 72 20 64 65 74 61 69 6c  ments for detail
bff0: 73 20 6f 66 20 6c 6f 63 6b 20 6d 61 6e 61 67 65  s of lock manage
c000: 6d 65 6e 74 2e 20 2a 2f 0a 73 74 61 74 69 63 20  ment. */.static 
c010: 69 6e 74 20 61 66 70 55 6e 69 78 4c 6f 63 6b 28  int afpUnixLock(
c020: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
c030: 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 0a  , int locktype).
c040: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
c050: 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
c060: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
c070: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70  xFile*)id;.  afp
c080: 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
c090: 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f  context = (afpLo
c0a0: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20  ckingContext *) 
c0b0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
c0c0: 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 67 6f 74  ntext;.  int got
c0d0: 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b  PendingLock = 0;
c0e0: 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
c0f0: 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
c100: 35 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  5("LOCK    %d %s
c110: 20 77 61 73 20 25 73 20 70 69 64 3d 25 64 5c 6e   was %s pid=%d\n
c120: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
c130: 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61        locktypeNa
c140: 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 6c 6f  me(locktype), lo
c150: 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69 6c 65  cktypeName(pFile
c160: 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 67 65 74  ->locktype), get
c170: 70 69 64 28 29 29 3b 20 20 0a 20 20 2f 2a 20 49  pid());  .  /* I
c180: 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
c190: 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69  dy a lock of thi
c1a0: 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72  s type or more r
c1b0: 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68  estrictive on th
c1c0: 65 0a 20 20 20 20 2a 2a 20 75 6e 69 78 46 69 6c  e.    ** unixFil
c1d0: 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
c1e0: 6f 6e 27 74 20 75 73 65 20 74 68 65 20 61 66 70  on't use the afp
c1f0: 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20  _end_lock: exit 
c200: 70 61 74 68 2c 20 61 73 0a 20 20 20 20 2a 2a 20  path, as.    ** 
c210: 65 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73  enterMutex() has
c220: 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  n't been called 
c230: 79 65 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 69 66  yet..    */.  if
c240: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
c250: 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e>=locktype ){. 
c260: 20 20 20 4f 53 54 52 41 43 45 33 28 22 4c 4f 43     OSTRACE3("LOC
c270: 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61  K    %d %s ok (a
c280: 6c 72 65 61 64 79 20 68 65 6c 64 29 5c 6e 22 2c  lready held)\n",
c290: 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
c2a0: 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61        locktypeNa
c2b0: 6d 65 28 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20  me(locktype));. 
c2c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c2d0: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
c2e0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
c2f0: 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
c300: 20 63 6f 72 72 65 63 74 0a 20 20 20 20 2a 2f 0a   correct.    */.
c310: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
c320: 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f  >locktype!=NO_LO
c330: 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK || locktype==
c340: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
c350: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
c360: 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  e!=PENDING_LOCK 
c370: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
c380: 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f  ktype!=RESERVED_
c390: 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c  LOCK || pFile->l
c3a0: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
c3b0: 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
c3c0: 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65  This mutex is ne
c3d0: 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69  eded because pFi
c3e0: 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61  le->pLock is sha
c3f0: 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
c400: 64 73 0a 20 20 20 20 2a 2f 0a 20 20 65 6e 74 65  ds.    */.  ente
c410: 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20  rMutex();..  /* 
c420: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 75  Make sure the cu
c430: 72 72 65 6e 74 20 74 68 72 65 61 64 20 6f 77 6e  rrent thread own
c440: 73 20 74 68 65 20 70 46 69 6c 65 2e 0a 20 20 20  s the pFile..   
c450: 20 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61 6e 73   */.  rc = trans
c460: 66 65 72 4f 77 6e 65 72 73 68 69 70 28 70 46 69  ferOwnership(pFi
c470: 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  le);.  if( rc!=S
c480: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c490: 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  leaveMutex();.  
c4a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
c4b0: 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e  .    .  /* A PEN
c4c0: 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65  DING lock is nee
c4d0: 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69  ded before acqui
c4e0: 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f  ring a SHARED lo
c4f0: 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20  ck and before.  
c500: 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61    ** acquiring a
c510: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
c520: 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45  .  For the SHARE
c530: 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44  D lock, the PEND
c540: 49 4e 47 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ING will.    ** 
c550: 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 20  be released..   
c560: 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
c570: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
c580: 0a 20 20 20 20 20 20 7c 7c 20 28 6c 6f 63 6b 74  .      || (lockt
c590: 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
c5a0: 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f  OCK && pFile->lo
c5b0: 63 6b 74 79 70 65 3c 50 45 4e 44 49 4e 47 5f 4c  cktype<PENDING_L
c5c0: 4f 43 4b 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  OCK).      ){.  
c5d0: 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 5f    int failed = _
c5e0: 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e  AFPFSSetLock(con
c5f0: 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20  text->filePath, 
c600: 70 46 69 6c 65 2d 3e 68 2c 20 0a 20 20 20 20 20  pFile->h, .     
c610: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31   PENDING_BYTE, 1
c620: 2c 20 31 29 3b 0a 20 20 20 20 69 66 20 28 66 61  , 1);.    if (fa
c630: 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 72 63  iled) {.      rc
c640: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
c650: 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65        goto afp_e
c660: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  nd_lock;.    }. 
c670: 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f   }.  .  /* If co
c680: 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68  ntrol gets to th
c690: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61  is point, then a
c6a0: 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64  ctually go ahead
c6b0: 20 61 6e 64 20 6d 61 6b 65 0a 20 20 20 20 2a 2a   and make.    **
c6c0: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
c6d0: 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  m calls for the 
c6e0: 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a  specified lock..
c6f0: 20 20 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63      */.  if( loc
c700: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
c710: 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6b  CK ){.    int lk
c720: 2c 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 69 6e  , failed;.    in
c730: 74 20 74 72 69 65 73 20 3d 20 30 3b 0a 20 20 20  t tries = 0;.   
c740: 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74   .    /* Now get
c750: 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a   the read-lock *
c760: 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74 68  /.    /* note th
c770: 61 74 20 74 68 65 20 71 75 61 6c 69 74 79 20 6f  at the quality o
c780: 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73  f the randomness
c790: 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
c7a0: 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20 20  that much */.   
c7b0: 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b 20   lk = random(); 
c7c0: 0a 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 73 68  .    context->sh
c7d0: 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28  aredLockByte = (
c7e0: 6c 6b 20 26 20 30 78 37 66 66 66 66 66 66 66 29  lk & 0x7fffffff)
c7f0: 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20  %(SHARED_SIZE - 
c800: 31 29 3b 0a 20 20 20 20 66 61 69 6c 65 64 20 3d  1);.    failed =
c810: 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63   _AFPFSSetLock(c
c820: 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68  ontext->filePath
c830: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 0a 20 20 20  , pFile->h, .   
c840: 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b     SHARED_FIRST+
c850: 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64 4c  context->sharedL
c860: 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a  ockByte, 1, 1);.
c870: 20 20 20 20 0a 20 20 20 20 2f 2a 20 44 72 6f 70      .    /* Drop
c880: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50   the temporary P
c890: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20  ENDING lock */. 
c8a0: 20 20 20 69 66 20 28 5f 41 46 50 46 53 53 65 74     if (_AFPFSSet
c8b0: 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69  Lock(context->fi
c8c0: 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68  lePath, pFile->h
c8d0: 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
c8e0: 31 2c 20 30 29 29 20 7b 0a 20 20 20 20 20 20 72  1, 0)) {.      r
c8f0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
c900: 5f 55 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54 68 69  _UNLOCK;  /* Thi
c910: 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68  s should never h
c920: 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 67  appen */.      g
c930: 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
c940: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20  ;.    }.    .   
c950: 20 69 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20   if( failed ){. 
c960: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
c970: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73  _BUSY;.    } els
c980: 65 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  e {.      pFile-
c990: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52  >locktype = SHAR
c9a0: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  ED_LOCK;.    }. 
c9b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
c9c0: 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66  he request was f
c9d0: 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  or a RESERVED or
c9e0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
c9f0: 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61    It is.    ** a
ca00: 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72  ssumed that ther
ca10: 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72  e is a SHARED or
ca20: 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
ca30: 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
ca40: 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
ca50: 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20  .    int failed 
ca60: 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
ca70: 20 30 21 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   0!=pFile->lockt
ca80: 79 70 65 20 29 3b 0a 20 20 20 20 69 66 20 28 6c  ype );.    if (l
ca90: 6f 63 6b 74 79 70 65 20 3e 3d 20 52 45 53 45 52  ocktype >= RESER
caa0: 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c  VED_LOCK && pFil
cab0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3c 20 52 45  e->locktype < RE
cac0: 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20  SERVED_LOCK) {. 
cad0: 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72         /* Acquir
cae0: 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  e a RESERVED loc
caf0: 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69  k */.        fai
cb00: 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c  led = _AFPFSSetL
cb10: 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c  ock(context->fil
cb20: 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c  ePath, pFile->h,
cb30: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
cb40: 31 2c 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  1,1);.    }.    
cb50: 69 66 20 28 21 66 61 69 6c 65 64 20 26 26 20 6c  if (!failed && l
cb60: 6f 63 6b 74 79 70 65 20 3d 3d 20 45 58 43 4c 55  ocktype == EXCLU
cb70: 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  SIVE_LOCK) {.   
cb80: 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e     /* Acquire an
cb90: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
cba0: 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  */.        .    
cbb0: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
cbc0: 73 68 61 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f  shared lock befo
cbd0: 72 65 20 74 72 79 69 6e 67 20 74 68 65 20 72 61  re trying the ra
cbe0: 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64  nge.  we'll need
cbf0: 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72 65   to .      ** re
cc00: 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68  establish the sh
cc10: 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 77 65 20  ared lock if we 
cc20: 63 61 6e 27 74 20 67 65 74 20 74 68 65 20 20 61  can't get the  a
cc30: 66 70 55 6e 69 78 55 6e 6c 6f 63 6b 0a 20 20 20  fpUnixUnlock.   
cc40: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 20 28     */.      if (
cc50: 21 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63  !_AFPFSSetLock(c
cc60: 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68  ontext->filePath
cc70: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52  , pFile->h, SHAR
cc80: 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20 20 20  ED_FIRST +.     
cc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cca0: 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61      context->sha
ccb0: 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20  redLockByte, 1, 
ccc0: 30 29 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  0)) {.        /*
ccd0: 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74 6f   now attemmpt to
cce0: 20 67 65 74 20 74 68 65 20 65 78 63 6c 75 73 69   get the exclusi
ccf0: 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f  ve lock range */
cd00: 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20  .        failed 
cd10: 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28  = _AFPFSSetLock(
cd20: 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74  context->filePat
cd30: 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  h, pFile->h, SHA
cd40: 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20  RED_FIRST, .    
cd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd60: 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
cd70: 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20  D_SIZE, 1);.    
cd80: 20 20 20 20 69 66 20 28 66 61 69 6c 65 64 20 26      if (failed &
cd90: 26 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28  & _AFPFSSetLock(
cda0: 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74  context->filePat
cdb0: 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  h, pFile->h, SHA
cdc0: 52 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20 20  RED_FIRST +.    
cdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdf0: 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64 4c  context->sharedL
ce00: 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 29 20  ockByte, 1, 1)) 
ce10: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
ce20: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
ce30: 4c 4f 43 4b 3b 20 2f 2a 20 74 68 69 73 20 73 68  LOCK; /* this sh
ce40: 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65  ould never happe
ce50: 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  n */.        }. 
ce60: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
ce70: 20 20 20 20 20 20 2f 2a 20 2a 2f 0a 20 20 20 20        /* */.    
ce80: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
ce90: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 2f 2a  IOERR_UNLOCK; /*
cea0: 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76   this should nev
ceb0: 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20  er happen */.   
cec0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
ced0: 66 28 20 66 61 69 6c 65 64 20 26 26 20 72 63 20  f( failed && rc 
cee0: 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20  == SQLITE_OK){. 
cef0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
cf00: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BUSY;.    }.  }
cf10: 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  .  .  if( rc==SQ
cf20: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
cf30: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
cf40: 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c   locktype;.  }el
cf50: 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  se if( locktype=
cf60: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
cf70: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  ){.    pFile->lo
cf80: 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47  cktype = PENDING
cf90: 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66  _LOCK;.  }.  .af
cfa0: 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 20 20  p_end_lock:.    
cfb0: 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  leaveMutex();.  
cfc0: 4f 53 54 52 41 43 45 34 28 22 4c 4f 43 4b 20 20  OSTRACE4("LOCK  
cfd0: 20 20 25 64 20 25 73 20 25 73 5c 6e 22 2c 20 70    %d %s %s\n", p
cfe0: 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
cff0: 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c  eName(locktype),
d000: 20 0a 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53   .         rc==S
d010: 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
d020: 3a 20 22 66 61 69 6c 65 64 22 29 3b 0a 20 20 72  : "failed");.  r
d030: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
d040: 20 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f   ** Lower the lo
d050: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
d060: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
d070: 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65  File to locktype
d080: 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 20 2a 2a 20  .  locktype. ** 
d090: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
d0a0: 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
d0b0: 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49  _LOCK.. **. ** I
d0c0: 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
d0d0: 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
d0e0: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
d0f0: 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
d100: 77 0a 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73  w. ** the reques
d110: 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
d120: 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
d130: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a  is a no-op.. */.
d140: 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e  static int afpUn
d150: 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ixUnlock(sqlite3
d160: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  _file *id, int l
d170: 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 73 74 72  ocktype) {.  str
d180: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
d190: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
d1a0: 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
d1b0: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
d1c0: 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f  ile*)id;.  afpLo
d1d0: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
d1e0: 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b  ntext = (afpLock
d1f0: 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
d200: 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
d210: 65 78 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ext;..  assert( 
d220: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
d230: 43 45 35 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE5("UNLOCK  %d 
d240: 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
d250: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c  \n", pFile->h, l
d260: 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 20  ocktype,.       
d270: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
d280: 65 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20  e, getpid());.  
d290: 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
d2a0: 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype<=SHARED_LOCK
d2b0: 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
d2c0: 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c 6f 63 6b 74  >locktype<=lockt
d2d0: 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ype ){.    retur
d2e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
d2f0: 0a 20 20 69 66 28 20 43 48 45 43 4b 5f 54 48 52  .  if( CHECK_THR
d300: 45 41 44 49 44 28 70 46 69 6c 65 29 20 29 7b 0a  EADID(pFile) ){.
d310: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d320: 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20  E_MISUSE;.  }.  
d330: 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  enterMutex();.  
d340: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
d350: 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ype>SHARED_LOCK 
d360: 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74  ){.    if( lockt
d370: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
d380: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 61   ){.      int fa
d390: 69 6c 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 20  iled = 0;..     
d3a0: 20 2f 2a 20 75 6e 6c 6f 63 6b 20 74 68 65 20 65   /* unlock the e
d3b0: 78 63 6c 75 73 69 76 65 20 72 61 6e 67 65 20 2d  xclusive range -
d3c0: 20 74 68 65 6e 20 72 65 2d 65 73 74 61 62 6c 69   then re-establi
d3d0: 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  sh the shared lo
d3e0: 63 6b 20 2a 2f 0a 20 20 20 20 20 20 69 66 20 28  ck */.      if (
d3f0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
d400: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
d410: 20 7b 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65   {.        faile
d420: 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63  d = _AFPFSSetLoc
d430: 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50  k(context->fileP
d440: 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 53  ath, pFile->h, S
d450: 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20  HARED_FIRST, .  
d460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
d480: 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
d490: 20 20 20 20 20 20 20 20 69 66 20 28 21 66 61 69          if (!fai
d4a0: 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 20 20 20  led) {.         
d4b0: 20 2f 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79   /* successfully
d4c0: 20 72 65 6d 6f 76 65 64 20 74 68 65 20 65 78 63   removed the exc
d4d0: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20  lusive lock */. 
d4e0: 20 20 20 20 20 20 20 20 20 69 66 20 28 5f 41 46           if (_AF
d4f0: 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  PFSSetLock(conte
d500: 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46  xt->filePath, pF
d510: 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46  ile->h, SHARED_F
d520: 49 52 53 54 2b 0a 20 20 20 20 20 20 20 20 20 20  IRST+.          
d530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d540: 20 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65    context->share
d550: 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31 29  dLockByte, 1, 1)
d560: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
d570: 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 72 65 2d  /* failed to re-
d580: 65 73 74 61 62 6c 69 73 68 20 6f 75 72 20 73 68  establish our sh
d590: 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  ared lock */.   
d5a0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
d5b0: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
d5c0: 4b 3b 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c  K; /* This shoul
d5d0: 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a  d never happen *
d5e0: 2f 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  /.          }.  
d5f0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
d600: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
d610: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61   should never ha
d620: 70 70 65 6e 20 2d 20 66 61 69 6c 65 64 20 74 6f  ppen - failed to
d630: 20 75 6e 6c 6f 63 6b 20 74 68 65 20 65 78 63 6c   unlock the excl
d640: 75 73 69 76 65 20 72 61 6e 67 65 20 2a 2f 0a 20  usive range */. 
d650: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
d660: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
d670: 4b 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20  K;.        } .  
d680: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
d690: 69 66 20 28 72 63 20 3d 3d 20 53 51 4c 49 54 45  if (rc == SQLITE
d6a0: 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f  _OK && pFile->lo
d6b0: 63 6b 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f  cktype>=PENDING_
d6c0: 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 69 66  LOCK) {.      if
d6d0: 20 28 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28   (_AFPFSSetLock(
d6e0: 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74  context->filePat
d6f0: 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e  h, pFile->h, PEN
d700: 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29  DING_BYTE, 1, 0)
d710: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 61  ){.        /* fa
d720: 69 6c 65 64 20 74 6f 20 72 65 6c 65 61 73 65 20  iled to release 
d730: 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b  the pending lock
d740: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
d750: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
d760: 4c 4f 43 4b 3b 20 2f 2a 20 54 68 69 73 20 73 68  LOCK; /* This sh
d770: 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65  ould never happe
d780: 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  n */.      }.   
d790: 20 7d 20 0a 20 20 20 20 69 66 20 28 72 63 20 3d   } .    if (rc =
d7a0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  = SQLITE_OK && p
d7b0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d  File->locktype>=
d7c0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b  RESERVED_LOCK) {
d7d0: 0a 20 20 20 20 20 20 69 66 20 28 5f 41 46 50 46  .      if (_AFPF
d7e0: 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  SSetLock(context
d7f0: 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c  ->filePath, pFil
d800: 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42  e->h, RESERVED_B
d810: 59 54 45 2c 20 31 2c 20 30 29 29 20 7b 0a 20 20  YTE, 1, 0)) {.  
d820: 20 20 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20        /* failed 
d830: 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20 72  to release the r
d840: 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a  eserved lock */.
d850: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
d860: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
d870: 3b 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c  ;  /* This shoul
d880: 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a  d never happen *
d890: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  /.      }.    } 
d8a0: 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74  .  }.  if( lockt
d8b0: 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a  ype==NO_LOCK ){.
d8c0: 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d      int failed =
d8d0: 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63   _AFPFSSetLock(c
d8e0: 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68  ontext->filePath
d8f0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 0a 20 20 20  , pFile->h, .   
d900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d910: 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52              SHAR
d920: 45 44 5f 46 49 52 53 54 20 2b 20 63 6f 6e 74 65  ED_FIRST + conte
d930: 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  xt->sharedLockBy
d940: 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69  te, 1, 0);.    i
d950: 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20  f (failed) {.   
d960: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
d970: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 20 2f 2a  OERR_UNLOCK;  /*
d980: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76   This should nev
d990: 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20  er happen */.   
d9a0: 20 7d 0a 20 20 7d 0a 20 20 69 66 20 28 72 63 20   }.  }.  if (rc 
d9b0: 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20  == SQLITE_OK).  
d9c0: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
d9d0: 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
d9e0: 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  leaveMutex();.  
d9f0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
da00: 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  . ** Close a fil
da10: 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20  e & cleanup AFP 
da20: 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67  specific locking
da30: 20 63 6f 6e 74 65 78 74 20 0a 20 2a 2f 0a 73 74   context . */.st
da40: 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e 69 78  atic int afpUnix
da50: 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
da60: 6c 65 20 2a 69 64 29 20 7b 0a 20 20 75 6e 69 78  le *id) {.  unix
da70: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
da80: 6e 69 78 46 69 6c 65 2a 29 70 49 64 3b 0a 0a 20  nixFile*)pId;.. 
da90: 20 69 66 28 20 21 70 46 69 6c 65 20 29 20 72 65   if( !pFile ) re
daa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
dab0: 20 20 61 66 70 55 6e 69 78 55 6e 6c 6f 63 6b 28    afpUnixUnlock(
dac0: 2a 70 49 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  *pId, NO_LOCK);.
dad0: 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 41 46    /* free the AF
dae0: 50 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74  P locking struct
daf0: 75 72 65 20 2a 2f 0a 20 20 69 66 20 28 70 46 69  ure */.  if (pFi
db00: 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
db10: 78 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20  xt != NULL) {.  
db20: 20 20 69 66 20 28 28 28 61 66 70 4c 6f 63 6b 69    if (((afpLocki
db30: 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
db40: 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
db50: 74 29 2d 3e 66 69 6c 65 50 61 74 68 20 21 3d 20  t)->filePath != 
db60: 4e 55 4c 4c 29 0a 20 20 20 20 20 20 73 71 6c 69  NULL).      sqli
db70: 74 65 33 5f 66 72 65 65 28 28 28 61 66 70 4c 6f  te3_free(((afpLo
db80: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46  ckingContext*)pF
db90: 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
dba0: 65 78 74 29 2d 3e 66 69 6c 65 50 61 74 68 29 3b  ext)->filePath);
dbb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
dbc0: 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  e(pFile->locking
dbd0: 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 0a 20  Context);.  }.. 
dbe0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72 66   if( pFile->dirf
dbf0: 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28 70 46 69  d>=0 ) close(pFi
dc00: 6c 65 2d 3e 64 69 72 66 64 29 3b 0a 20 20 70 46  le->dirfd);.  pF
dc10: 69 6c 65 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b  ile->dirfd = -1;
dc20: 0a 20 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e  .  close(pFile->
dc30: 68 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 69 73 4f  h);.  pFile->isO
dc40: 70 65 6e 20 3d 20 30 3b 0a 20 20 4f 53 54 52 41  pen = 0;.  OSTRA
dc50: 43 45 32 28 22 43 4c 4f 53 45 20 20 20 25 2d 33  CE2("CLOSE   %-3
dc60: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b  d\n", pFile->h);
dc70: 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d  .  OpenCounter(-
dc80: 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  1);.  return SQL
dc90: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 70 72 61  ITE_OK;.}...#pra
dca0: 67 6d 61 20 6d 61 72 6b 20 66 6c 6f 63 6b 28 29  gma mark flock()
dcb0: 20 73 74 79 6c 65 20 6c 6f 63 6b 69 6e 67 0a 0a   style locking..
dcc0: 2f 2a 0a 20 2a 2a 20 54 68 65 20 66 6c 6f 63 6b  /*. ** The flock
dcd0: 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 69  LockingContext i
dce0: 73 20 6e 6f 74 20 75 73 65 64 0a 20 2a 2f 0a 74  s not used. */.t
dcf0: 79 70 65 64 65 66 20 76 6f 69 64 20 66 6c 6f 63  ypedef void floc
dd00: 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  kLockingContext;
dd10: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  ..static int flo
dd20: 63 6b 55 6e 69 78 43 68 65 63 6b 52 65 73 65 72  ckUnixCheckReser
dd30: 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
dd40: 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 75 6e  file *id) {.  un
dd50: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
dd60: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
dd70: 20 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c   .  if (pFile->l
dd80: 6f 63 6b 74 79 70 65 20 3d 3d 20 52 45 53 45 52  ocktype == RESER
dd90: 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  VED_LOCK) {.    
dda0: 72 65 74 75 72 6e 20 31 3b 20 2f 2a 20 61 6c 72  return 1; /* alr
ddb0: 65 61 64 79 20 68 61 76 65 20 61 20 72 65 73 65  eady have a rese
ddc0: 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d  rved lock */.  }
ddd0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 61   else {.    /* a
dde0: 74 74 65 6d 70 74 20 74 6f 20 67 65 74 20 74 68  ttempt to get th
ddf0: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e  e lock */.    in
de00: 74 20 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69  t rc = flock(pFi
de10: 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c  le->h, LOCK_EX |
de20: 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20 20 69   LOCK_NB);.    i
de30: 66 20 28 21 72 63 29 20 7b 0a 20 20 20 20 20 20  f (!rc) {.      
de40: 2f 2a 20 67 6f 74 20 74 68 65 20 6c 6f 63 6b 2c  /* got the lock,
de50: 20 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20 20   unlock it */.  
de60: 20 20 20 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d      flock(pFile-
de70: 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20  >h, LOCK_UN);.  
de80: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f      return 0;  /
de90: 2a 20 6e 6f 20 6f 6e 65 20 68 61 73 20 69 74 20  * no one has it 
dea0: 72 65 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20  reserved */.    
deb0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20  }.    return 1; 
dec0: 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  /* someone else 
ded0: 6d 69 67 68 74 20 68 61 76 65 20 69 74 20 72 65  might have it re
dee0: 73 65 72 76 65 64 20 2a 2f 0a 20 20 7d 0a 7d 0a  served */.  }.}.
def0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
df00: 6b 55 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65  kUnixLock(sqlite
df10: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
df20: 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e  locktype) {.  un
df30: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
df40: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
df50: 20 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72   .  /* if we alr
df60: 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b  eady have a lock
df70: 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76  , it is exclusiv
df80: 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61  e.  .  ** Just a
df90: 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20  djust level and 
dfa0: 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65  punt on outta he
dfb0: 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69  re. */.  if (pFi
dfc0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3e 20 4e  le->locktype > N
dfd0: 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  O_LOCK) {.    pF
dfe0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
dff0: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 72 65  locktype;.    re
e000: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
e010: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62    }.  .  /* grab
e020: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
e030: 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ck */.  int rc =
e040: 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c   flock(pFile->h,
e050: 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f   LOCK_EX | LOCK_
e060: 4e 42 29 3b 0a 20 20 69 66 20 28 72 63 29 20 7b  NB);.  if (rc) {
e070: 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74 20 67  .    /* didn't g
e080: 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75 73 79  et, must be busy
e090: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
e0a0: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 20  QLITE_BUSY;.  } 
e0b0: 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f  else {.    /* go
e0c0: 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79  t it, set the ty
e0d0: 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b  pe and return ok
e0e0: 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   */.    pFile->l
e0f0: 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79  ocktype = lockty
e100: 70 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  pe;.    return S
e110: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
e120: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
e130: 6b 55 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69  kUnixUnlock(sqli
e140: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
e150: 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20  t locktype) {.  
e160: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
e170: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
e180: 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 6c 6f  .  .  assert( lo
e190: 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c  cktype<=SHARED_L
e1a0: 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e  OCK );.  .  /* n
e1b0: 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65  o-op if possible
e1c0: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
e1d0: 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74  >locktype==lockt
e1e0: 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ype ){.    retur
e1f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
e200: 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20  .  .  /* shared 
e210: 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20  can just be set 
e220: 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79  because we alway
e230: 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73  s have an exclus
e240: 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 6c 6f 63  ive */.  if (loc
e250: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
e260: 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
e270: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b  >locktype = lock
e280: 74 79 70 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  type;.    return
e290: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
e2a0: 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c    .  /* no, real
e2b0: 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20  ly, unlock. */. 
e2c0: 20 69 6e 74 20 72 63 20 3d 20 66 6c 6f 63 6b 28   int rc = flock(
e2d0: 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55  pFile->h, LOCK_U
e2e0: 4e 29 3b 0a 20 20 69 66 20 28 72 63 29 0a 20 20  N);.  if (rc).  
e2f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e300: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  IOERR_UNLOCK;.  
e310: 65 6c 73 65 20 7b 0a 20 20 20 20 70 46 69 6c 65  else {.    pFile
e320: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f  ->locktype = NO_
e330: 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e  LOCK;.    return
e340: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
e350: 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20  }../*. ** Close 
e360: 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74  a file.. */.stat
e370: 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 69 78  ic int flockUnix
e380: 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
e390: 6c 65 20 2a 70 49 64 29 20 7b 0a 20 20 75 6e 69  le *pId) {.  uni
e3a0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
e3b0: 75 6e 69 78 46 69 6c 65 2a 29 2a 70 49 64 3b 0a  unixFile*)*pId;.
e3c0: 20 20 0a 20 20 69 66 28 20 21 70 46 69 6c 65 20    .  if( !pFile 
e3d0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
e3e0: 4f 4b 3b 0a 20 20 66 6c 6f 63 6b 55 6e 69 78 55  OK;.  flockUnixU
e3f0: 6e 6c 6f 63 6b 28 2a 70 49 64 2c 20 4e 4f 5f 4c  nlock(*pId, NO_L
e400: 4f 43 4b 29 3b 0a 20 20 0a 20 20 69 66 28 20 70  OCK);.  .  if( p
e410: 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29  File->dirfd>=0 )
e420: 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69   close(pFile->di
e430: 72 66 64 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 64  rfd);.  pFile->d
e440: 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 65 6e 74  irfd = -1;.  ent
e450: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 0a 20 20  erMutex();.  .  
e460: 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 68 29 3b  close(pFile->h);
e470: 20 20 0a 20 20 6c 65 61 76 65 4d 75 74 65 78 28    .  leaveMutex(
e480: 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 69 73 4f 70  );.  pFile->isOp
e490: 65 6e 20 3d 20 30 3b 0a 20 20 4f 53 54 52 41 43  en = 0;.  OSTRAC
e4a0: 45 32 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64  E2("CLOSE   %-3d
e4b0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a  \n", pFile->h);.
e4c0: 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31    OpenCounter(-1
e4d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
e4e0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 70 72 61 67 6d  TE_OK;.}..#pragm
e4f0: 61 20 6d 61 72 6b 20 4f 6c 64 2d 53 63 68 6f 6f  a mark Old-Schoo
e500: 6c 20 2e 6c 6f 63 6b 20 66 69 6c 65 20 62 61 73  l .lock file bas
e510: 65 64 20 6c 6f 63 6b 69 6e 67 0a 0a 2f 2a 0a 20  ed locking../*. 
e520: 2a 2a 20 54 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f  ** The dotlockLo
e530: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74 72  ckingContext str
e540: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20  ucture contains 
e550: 61 6c 6c 20 64 6f 74 6c 6f 63 6b 20 28 2e 6c 6f  all dotlock (.lo
e560: 63 6b 29 20 6c 6f 63 6b 0a 20 2a 2a 20 73 70 65  ck) lock. ** spe
e570: 63 69 66 69 63 20 73 74 61 74 65 0a 20 2a 2f 0a  cific state. */.
e580: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 64  typedef struct d
e590: 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e  otlockLockingCon
e5a0: 74 65 78 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b  text dotlockLock
e5b0: 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75  ingContext;.stru
e5c0: 63 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  ct dotlockLockin
e5d0: 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 63 68 61  gContext {.  cha
e5e0: 72 20 2a 6c 6f 63 6b 50 61 74 68 3b 0a 7d 3b 0a  r *lockPath;.};.
e5f0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  ..static int dot
e600: 6c 6f 63 6b 55 6e 69 78 43 68 65 63 6b 52 65 73  lockUnixCheckRes
e610: 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
e620: 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
e630: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
e640: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
e650: 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  .  dotlockLockin
e660: 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  gContext *contex
e670: 74 20 3d 20 0a 20 20 20 20 28 64 6f 74 6c 6f 63  t = .    (dotloc
e680: 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  kLockingContext 
e690: 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  *) pFile->lockin
e6a0: 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 69  gContext;.  .  i
e6b0: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f (pFile->lockty
e6c0: 70 65 20 3d 3d 20 52 45 53 45 52 56 45 44 5f 4c  pe == RESERVED_L
e6d0: 4f 43 4b 29 20 7b 0a 20 20 20 20 72 65 74 75 72  OCK) {.    retur
e6e0: 6e 20 31 3b 20 2f 2a 20 61 6c 72 65 61 64 79 20  n 1; /* already 
e6f0: 68 61 76 65 20 61 20 72 65 73 65 72 76 65 64 20  have a reserved 
e700: 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 20 65 6c 73 65  lock */.  } else
e710: 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74   {.    struct st
e720: 61 74 20 73 74 61 74 42 75 66 3b 0a 20 20 20 20  at statBuf;.    
e730: 69 66 20 28 6c 73 74 61 74 28 63 6f 6e 74 65 78  if (lstat(contex
e740: 74 2d 3e 6c 6f 63 6b 50 61 74 68 2c 26 73 74 61  t->lockPath,&sta
e750: 74 42 75 66 29 20 3d 3d 20 30 29 0a 20 20 20 20  tBuf) == 0).    
e760: 20 20 2f 2a 20 66 69 6c 65 20 65 78 69 73 74 73    /* file exists
e770: 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68  , someone else h
e780: 61 73 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20  as the lock */. 
e790: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
e7a0: 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 2f 2a     else.      /*
e7b0: 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
e7c0: 78 69 73 74 2c 20 77 65 20 63 6f 75 6c 64 20 68  xist, we could h
e7d0: 61 76 65 20 69 74 20 69 66 20 77 65 20 77 61 6e  ave it if we wan
e7e0: 74 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  t it */.      re
e7f0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73  turn 0;.  }.}..s
e800: 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63  tatic int dotloc
e810: 6b 55 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65  kUnixLock(sqlite
e820: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
e830: 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e  locktype) {.  un
e840: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
e850: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
e860: 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43   dotlockLockingC
e870: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20  ontext *context 
e880: 3d 20 0a 20 20 20 20 28 64 6f 74 6c 6f 63 6b 4c  = .    (dotlockL
e890: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
e8a0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
e8b0: 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 2f 2a 20  ontext;.  .  /* 
e8c0: 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61  if we already ha
e8d0: 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73  ve a lock, it is
e8e0: 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20   exclusive.  .  
e8f0: 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c  ** Just adjust l
e900: 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e  evel and punt on
e910: 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a   outta here. */.
e920: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
e930: 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 29  ktype > NO_LOCK)
e940: 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f   {.    pFile->lo
e950: 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70  cktype = locktyp
e960: 65 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 41  e;.    .    /* A
e970: 6c 77 61 79 73 20 75 70 64 61 74 65 20 74 68 65  lways update the
e980: 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68   timestamp on th
e990: 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 20 20  e old file */.  
e9a0: 20 20 75 74 69 6d 65 73 28 63 6f 6e 74 65 78 74    utimes(context
e9b0: 2d 3e 6c 6f 63 6b 50 61 74 68 2c 4e 55 4c 4c 29  ->lockPath,NULL)
e9c0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
e9d0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
e9e0: 20 2f 2a 20 63 68 65 63 6b 20 74 6f 20 73 65 65   /* check to see
e9f0: 20 69 66 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c   if lock file al
ea00: 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a  ready exists */.
ea10: 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
ea20: 61 74 42 75 66 3b 0a 20 20 69 66 20 28 6c 73 74  atBuf;.  if (lst
ea30: 61 74 28 63 6f 6e 74 65 78 74 2d 3e 6c 6f 63 6b  at(context->lock
ea40: 50 61 74 68 2c 26 73 74 61 74 42 75 66 29 20 3d  Path,&statBuf) =
ea50: 3d 20 30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  = 0){.    return
ea60: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 20 2f 2a   SQLITE_BUSY; /*
ea70: 20 69 74 20 64 6f 65 73 2c 20 62 75 73 79 20 2a   it does, busy *
ea80: 2f 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72  /.  }.  .  /* gr
ea90: 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ab an exclusive 
eaa0: 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 66 64  lock */.  int fd
eab0: 20 3d 20 6f 70 65 6e 28 63 6f 6e 74 65 78 74 2d   = open(context-
eac0: 3e 6c 6f 63 6b 50 61 74 68 2c 4f 5f 52 44 4f 4e  >lockPath,O_RDON
ead0: 4c 59 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43  LY|O_CREAT|O_EXC
eae0: 4c 2c 30 36 30 30 29 3b 0a 20 20 69 66 20 28 66  L,0600);.  if (f
eaf0: 64 20 3c 20 30 29 20 7b 0a 20 20 20 20 2f 2a 20  d < 0) {.    /* 
eb00: 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63  failed to open/c
eb10: 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 2c 20  reate the file, 
eb20: 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 61 79  someone else may
eb30: 20 68 61 76 65 20 73 74 6f 6c 65 6e 20 74 68 65   have stolen the
eb40: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 72 65 74   lock */.    ret
eb50: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
eb60: 20 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 28 66 64   .  }.  close(fd
eb70: 29 3b 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20 69  );.  .  /* got i
eb80: 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
eb90: 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
eba0: 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  .  pFile->lockty
ebb0: 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
ebc0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
ebd0: 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  K;.}..static int
ebe0: 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f   dotlockUnixUnlo
ebf0: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
ec00: 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
ec10: 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  e) {.  unixFile 
ec20: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
ec30: 6c 65 2a 29 69 64 3b 0a 20 20 64 6f 74 6c 6f 63  le*)id;.  dotloc
ec40: 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  kLockingContext 
ec50: 2a 63 6f 6e 74 65 78 74 20 3d 20 0a 20 20 20 20  *context = .    
ec60: 28 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43  (dotlockLockingC
ec70: 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d  ontext *) pFile-
ec80: 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
ec90: 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 6c 6f  .  .  assert( lo
eca0: 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c  cktype<=SHARED_L
ecb0: 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e  OCK );.  .  /* n
ecc0: 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65  o-op if possible
ecd0: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
ece0: 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74  >locktype==lockt
ecf0: 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ype ){.    retur
ed00: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
ed10: 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20  .  .  /* shared 
ed20: 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20  can just be set 
ed30: 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79  because we alway
ed40: 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73  s have an exclus
ed50: 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 6c 6f 63  ive */.  if (loc
ed60: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
ed70: 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
ed80: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b  >locktype = lock
ed90: 74 79 70 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  type;.    return
eda0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
edb0: 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c    .  /* no, real
edc0: 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20  ly, unlock. */. 
edd0: 20 75 6e 6c 69 6e 6b 28 63 6f 6e 74 65 78 74 2d   unlink(context-
ede0: 3e 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 70 46  >lockPath);.  pF
edf0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
ee00: 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72  NO_LOCK;.  retur
ee10: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
ee20: 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66  /*. ** Close a f
ee30: 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ile.. */.static 
ee40: 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 43  int dotlockUnixC
ee50: 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
ee60: 65 20 2a 69 64 29 20 7b 0a 20 20 75 6e 69 78 46  e *id) {.  unixF
ee70: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
ee80: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20  ixFile*)id;.  . 
ee90: 20 69 66 28 20 21 70 46 69 6c 65 20 29 20 72 65   if( !pFile ) re
eea0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
eeb0: 20 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 55 6e 6c    dotlockUnixUnl
eec0: 6f 63 6b 28 2a 70 49 64 2c 20 4e 4f 5f 4c 4f 43  ock(*pId, NO_LOC
eed0: 4b 29 3b 0a 20 20 2f 2a 20 66 72 65 65 20 74 68  K);.  /* free th
eee0: 65 20 64 6f 74 6c 6f 63 6b 20 6c 6f 63 6b 69 6e  e dotlock lockin
eef0: 67 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  g structure */. 
ef00: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if (pFile->lock
ef10: 69 6e 67 43 6f 6e 74 65 78 74 20 21 3d 20 4e 55  ingContext != NU
ef20: 4c 4c 29 20 7b 0a 20 20 20 20 69 66 20 28 28 28  LL) {.    if (((
ef30: 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  dotlockLockingCo
ef40: 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
ef50: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e  ockingContext)->
ef60: 6c 6f 63 6b 50 61 74 68 20 21 3d 20 4e 55 4c 4c  lockPath != NULL
ef70: 29 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ).      sqlite3_
ef80: 66 72 65 65 28 20 28 20 28 64 6f 74 6c 6f 63 6b  free( ( (dotlock
ef90: 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
efa0: 29 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ).        pFile-
efb0: 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
efc0: 2d 3e 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 20  ->lockPath);.   
efd0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
efe0: 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
eff0: 65 78 74 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69  ext);.  }.  .  i
f000: 66 28 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e  f( pFile->dirfd>
f010: 3d 30 20 29 20 63 6c 6f 73 65 28 70 46 69 6c 65  =0 ) close(pFile
f020: 2d 3e 64 69 72 66 64 29 3b 0a 20 20 70 46 69 6c  ->dirfd);.  pFil
f030: 65 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20  e->dirfd = -1;. 
f040: 20 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20   enterMutex();. 
f050: 20 0a 20 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d   .  close(pFile-
f060: 3e 68 29 3b 0a 20 20 0a 20 20 6c 65 61 76 65 4d  >h);.  .  leaveM
f070: 75 74 65 78 28 29 3b 0a 20 20 70 46 69 6c 65 2d  utex();.  pFile-
f080: 3e 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 4f  >isOpen = 0;.  O
f090: 53 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20 20  STRACE2("CLOSE  
f0a0: 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d   %-3d\n", pFile-
f0b0: 3e 68 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74  >h);.  OpenCount
f0c0: 65 72 28 2d 31 29 3b 0a 20 20 72 65 74 75 72 6e  er(-1);.  return
f0d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
f0e0: 23 70 72 61 67 6d 61 20 6d 61 72 6b 20 4e 6f 20  #pragma mark No 
f0f0: 6c 6f 63 6b 69 6e 67 0a 0a 2f 2a 0a 20 2a 2a 20  locking../*. ** 
f100: 54 68 65 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 69 6e  The nolockLockin
f110: 67 43 6f 6e 74 65 78 74 20 69 73 20 76 6f 69 64  gContext is void
f120: 0a 20 2a 2f 0a 74 79 70 65 64 65 66 20 76 6f 69  . */.typedef voi
f130: 64 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43  d nolockLockingC
f140: 6f 6e 74 65 78 74 3b 0a 0a 73 74 61 74 69 63 20  ontext;..static 
f150: 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 69 78 43 68  int nolockUnixCh
f160: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
f170: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
f180: 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  ) {.  return 0;.
f190: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  }..static int no
f1a0: 6c 6f 63 6b 55 6e 69 78 4c 6f 63 6b 28 73 71 6c  lockUnixLock(sql
f1b0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
f1c0: 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20  nt locktype) {. 
f1d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
f1e0: 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  K;.}..static int
f1f0: 20 6e 6f 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63   nolockUnixUnloc
f200: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
f210: 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
f220: 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ) {.  return SQL
f230: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  ITE_OK;.}../*. *
f240: 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a  * Close a file..
f250: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e   */.static int n
f260: 6f 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73 65 28 73  olockUnixClose(s
f270: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
f280: 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
f290: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
f2a0: 2a 29 69 64 3b 0a 20 20 0a 20 20 69 66 28 20 21  *)id;.  .  if( !
f2b0: 70 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53  pFile ) return S
f2c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
f2d0: 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20  pFile->dirfd>=0 
f2e0: 29 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64  ) close(pFile->d
f2f0: 69 72 66 64 29 3b 0a 20 20 70 46 69 6c 65 2d 3e  irfd);.  pFile->
f300: 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 65 6e  dirfd = -1;.  en
f310: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 0a 20  terMutex();.  . 
f320: 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 68 29   close(pFile->h)
f330: 3b 0a 20 20 0a 20 20 6c 65 61 76 65 4d 75 74 65  ;.  .  leaveMute
f340: 78 28 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 69 73  x();.  pFile->is
f350: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 4f 53 54 52  Open = 0;.  OSTR
f360: 41 43 45 32 28 22 43 4c 4f 53 45 20 20 20 25 2d  ACE2("CLOSE   %-
f370: 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  3d\n", pFile->h)
f380: 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28  ;.  OpenCounter(
f390: 2d 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  -1);.  return SQ
f3a0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64  LITE_OK;.}..#end
f3b0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
f3c0: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
f3d0: 45 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 20  E */.../*.** No 
f3e0: 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 6f 70 63  xFileControl opc
f3f0: 6f 64 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65  odes are impleme
f400: 6e 74 65 64 20 62 79 20 74 68 69 73 20 56 46 53  nted by this VFS
f410: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f420: 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  unixFileControl(
f430: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
f440: 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a  , int op, void *
f450: 70 41 72 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  pArg){.  return 
f460: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a  SQLITE_ERROR;.}.
f470: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  ./*.** Return an
f480: 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 69 6e   integer that in
f490: 64 69 63 65 73 20 74 68 65 20 74 79 70 65 20 6f  dices the type o
f4a0: 66 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c 79  f lock currently
f4b0: 20 68 65 6c 64 0a 2a 2a 20 62 79 20 74 68 69 73   held.** by this
f4c0: 20 68 61 6e 64 6c 65 2e 20 20 28 55 73 65 64 20   handle.  (Used 
f4d0: 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
f4e0: 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 29 0a  analysis only.).
f4f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
f500: 69 78 4c 6f 63 6b 53 74 61 74 65 28 73 71 6c 69  ixLockState(sqli
f510: 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
f520: 20 72 65 74 75 72 6e 20 28 28 75 6e 69 78 46 69   return ((unixFi
f530: 6c 65 2a 29 69 64 29 2d 3e 6c 6f 63 6b 74 79 70  le*)id)->locktyp
f540: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
f550: 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  rn the sector si
f560: 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74  ze in bytes of t
f570: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c  he underlying bl
f580: 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a  ock device for.*
f590: 2a 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  * the specified 
f5a0: 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c  file. This is al
f5b0: 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20  most always 512 
f5c0: 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62  bytes, but may b
f5d0: 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20  e.** larger for 
f5e0: 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a  some devices..**
f5f0: 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20  .** SQLite code 
f600: 61 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e  assumes this fun
f610: 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69  ction cannot fai
f620: 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d  l. It also assum
f630: 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77  es that.** if tw
f640: 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61  o files are crea
f650: 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ted in the same 
f660: 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65  file-system dire
f670: 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61  ctory (i.e..** a
f680: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74   database and it
f690: 27 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  's journal file)
f6a0: 20 74 68 61 74 20 74 68 65 20 73 65 63 74 6f 72   that the sector
f6b0: 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68   size will be th
f6c0: 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f  e.** same for bo
f6d0: 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  th..*/.static in
f6e0: 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65  t unixSectorSize
f6f0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
f700: 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  d){.  return SQL
f710: 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54  ITE_DEFAULT_SECT
f720: 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a  OR_SIZE;.}../*.*
f730: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 76  * Return the dev
f740: 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
f750: 69 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c 65  ics for the file
f760: 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73  . This is always
f770: 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
f780: 74 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72  t unixDeviceChar
f790: 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69  acteristics(sqli
f7a0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
f7b0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
f7c0: 0a 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20  .** This vector 
f7d0: 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20  defines all the 
f7e0: 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e  methods that can
f7f0: 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 20 73   operate on an s
f800: 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 66  qlite3_file.** f
f810: 6f 72 20 75 6e 69 78 2e 0a 2a 2f 0a 73 74 61 74  or unix..*/.stat
f820: 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
f830: 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 73 71 6c 69  _io_methods sqli
f840: 74 65 33 55 6e 69 78 49 6f 4d 65 74 68 6f 64 20  te3UnixIoMethod 
f850: 3d 20 7b 0a 20 20 31 2c 20 20 20 20 20 20 20 20  = {.  1,        
f860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f870: 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20  /* iVersion */. 
f880: 20 75 6e 69 78 43 6c 6f 73 65 2c 0a 20 20 75 6e   unixClose,.  un
f890: 69 78 52 65 61 64 2c 0a 20 20 75 6e 69 78 57 72  ixRead,.  unixWr
f8a0: 69 74 65 2c 0a 20 20 75 6e 69 78 54 72 75 6e 63  ite,.  unixTrunc
f8b0: 61 74 65 2c 0a 20 20 75 6e 69 78 53 79 6e 63 2c  ate,.  unixSync,
f8c0: 0a 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c  .  unixFileSize,
f8d0: 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 0a 20 20 75  .  unixLock,.  u
f8e0: 6e 69 78 55 6e 6c 6f 63 6b 2c 0a 20 20 75 6e 69  nixUnlock,.  uni
f8f0: 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
f900: 63 6b 2c 0a 20 20 75 6e 69 78 4c 6f 63 6b 53 74  ck,.  unixLockSt
f910: 61 74 65 2c 0a 20 20 75 6e 69 78 46 69 6c 65 43  ate,.  unixFileC
f920: 6f 6e 74 72 6f 6c 2c 0a 20 20 75 6e 69 78 53 65  ontrol,.  unixSe
f930: 63 74 6f 72 53 69 7a 65 2c 0a 20 20 75 6e 69 78  ctorSize,.  unix
f940: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
f950: 73 74 69 63 73 0a 7d 3b 0a 0a 23 69 66 64 65 66  stics.};..#ifdef
f960: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
f970: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a  OCKING_STYLE./*.
f980: 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20 64  ** This vector d
f990: 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d  efines all the m
f9a0: 65 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20  ethods that can 
f9b0: 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 20 73 71  operate on an sq
f9c0: 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 66 6f  lite3_file.** fo
f9d0: 72 20 75 6e 69 78 20 77 69 74 68 20 41 46 50 20  r unix with AFP 
f9e0: 73 74 79 6c 65 20 66 69 6c 65 20 6c 6f 63 6b 69  style file locki
f9f0: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ng..*/.static co
fa00: 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
fa10: 65 74 68 6f 64 73 20 73 71 6c 69 74 65 33 41 46  ethods sqlite3AF
fa20: 50 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65  PLockingUnixIoMe
fa30: 74 68 6f 64 20 3d 20 7b 0a 20 20 31 2c 20 20 20  thod = {.  1,   
fa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa50: 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
fa60: 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c   */.  unixClose,
fa70: 0a 20 20 75 6e 69 78 52 65 61 64 2c 0a 20 20 75  .  unixRead,.  u
fa80: 6e 69 78 57 72 69 74 65 2c 0a 20 20 75 6e 69 78  nixWrite,.  unix
fa90: 54 72 75 6e 63 61 74 65 2c 0a 20 20 75 6e 69 78  Truncate,.  unix
faa0: 53 79 6e 63 2c 0a 20 20 75 6e 69 78 46 69 6c 65  Sync,.  unixFile
fab0: 53 69 7a 65 2c 0a 20 20 61 66 70 55 6e 69 78 4c  Size,.  afpUnixL
fac0: 6f 63 6b 2c 0a 20 20 61 66 70 55 6e 69 78 55 6e  ock,.  afpUnixUn
fad0: 6c 6f 63 6b 2c 0a 20 20 61 66 70 55 6e 69 78 43  lock,.  afpUnixC
fae0: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
faf0: 2c 0a 20 20 75 6e 69 78 4c 6f 63 6b 53 74 61 74  ,.  unixLockStat
fb00: 65 2c 0a 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e  e,.  unixFileCon
fb10: 74 72 6f 6c 2c 0a 20 20 75 6e 69 78 53 65 63 74  trol,.  unixSect
fb20: 6f 72 53 69 7a 65 2c 0a 20 20 75 6e 69 78 44 65  orSize,.  unixDe
fb30: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
fb40: 69 63 73 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  ics.};../*.** Th
fb50: 69 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65  is vector define
fb60: 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64  s all the method
fb70: 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61  s that can opera
fb80: 74 65 20 6f 6e 20 61 6e 20 73 71 6c 69 74 65 33  te on an sqlite3
fb90: 5f 66 69 6c 65 0a 2a 2a 20 66 6f 72 20 75 6e 69  _file.** for uni
fba0: 78 20 77 69 74 68 20 66 6c 6f 63 6b 28 29 20 73  x with flock() s
fbb0: 74 79 6c 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  tyle file lockin
fbc0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  g..*/.static con
fbd0: 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
fbe0: 74 68 6f 64 73 20 73 71 6c 69 74 65 33 46 6c 6f  thods sqlite3Flo
fbf0: 63 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d  ckLockingUnixIoM
fc00: 65 74 68 6f 64 20 3d 20 7b 0a 20 20 31 2c 20 20  ethod = {.  1,  
fc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc20: 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
fc30: 6e 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 69 78  n */.  flockUnix
fc40: 43 6c 6f 73 65 2c 0a 20 20 75 6e 69 78 52 65 61  Close,.  unixRea
fc50: 64 2c 0a 20 20 75 6e 69 78 57 72 69 74 65 2c 0a  d,.  unixWrite,.
fc60: 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 0a    unixTruncate,.
fc70: 20 20 75 6e 69 78 53 79 6e 63 2c 0a 20 20 75 6e    unixSync,.  un
fc80: 69 78 46 69 6c 65 53 69 7a 65 2c 0a 20 20 66 6c  ixFileSize,.  fl
fc90: 6f 63 6b 55 6e 69 78 4c 6f 63 6b 2c 0a 20 20 66  ockUnixLock,.  f
fca0: 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b 2c 0a  lockUnixUnlock,.
fcb0: 20 20 66 6c 6f 63 6b 55 6e 69 78 43 68 65 63 6b    flockUnixCheck
fcc0: 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 20 20  ReservedLock,.  
fcd0: 75 6e 69 78 4c 6f 63 6b 53 74 61 74 65 2c 0a 20  unixLockState,. 
fce0: 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c   unixFileControl
fcf0: 2c 0a 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69  ,.  unixSectorSi
fd00: 7a 65 2c 0a 20 20 75 6e 69 78 44 65 76 69 63 65  ze,.  unixDevice
fd10: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 0a  Characteristics.
fd20: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  };../*.** This v
fd30: 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c  ector defines al
fd40: 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68  l the methods th
fd50: 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f  at can operate o
fd60: 6e 20 61 6e 20 73 71 6c 69 74 65 33 5f 66 69 6c  n an sqlite3_fil
fd70: 65 0a 2a 2a 20 66 6f 72 20 75 6e 69 78 20 77 69  e.** for unix wi
fd80: 74 68 20 64 6f 74 6c 6f 63 6b 20 73 74 79 6c 65  th dotlock style
fd90: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a   file locking..*
fda0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
fdb0: 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
fdc0: 73 20 73 71 6c 69 74 65 33 44 6f 74 6c 6f 63 6b  s sqlite3Dotlock
fdd0: 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74  LockingUnixIoMet
fde0: 68 6f 64 20 3d 20 7b 0a 20 20 31 2c 20 20 20 20  hod = {.  1,    
fdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe00: 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
fe10: 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 69 78  */.  dotlockUnix
fe20: 43 6c 6f 73 65 2c 0a 20 20 75 6e 69 78 52 65 61  Close,.  unixRea
fe30: 64 2c 0a 20 20 75 6e 69 78 57 72 69 74 65 2c 0a  d,.  unixWrite,.
fe40: 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 0a    unixTruncate,.
fe50: 20 20 75 6e 69 78 53 79 6e 63 2c 0a 20 20 75 6e    unixSync,.  un
fe60: 69 78 46 69 6c 65 53 69 7a 65 2c 0a 20 20 64 6f  ixFileSize,.  do
fe70: 74 6c 6f 63 6b 55 6e 69 78 4c 6f 63 6b 2c 0a 20  tlockUnixLock,. 
fe80: 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f   dotlockUnixUnlo
fe90: 63 6b 2c 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 69  ck,.  dotlockUni
fea0: 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
feb0: 63 6b 2c 0a 20 20 75 6e 69 78 4c 6f 63 6b 53 74  ck,.  unixLockSt
fec0: 61 74 65 2c 0a 20 20 75 6e 69 78 46 69 6c 65 43  ate,.  unixFileC
fed0: 6f 6e 74 72 6f 6c 2c 0a 20 20 75 6e 69 78 53 65  ontrol,.  unixSe
fee0: 63 74 6f 72 53 69 7a 65 2c 0a 20 20 75 6e 69 78  ctorSize,.  unix
fef0: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
ff00: 73 74 69 63 73 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  stics.};../*.** 
ff10: 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69  This vector defi
ff20: 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68  nes all the meth
ff30: 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65  ods that can ope
ff40: 72 61 74 65 20 6f 6e 20 61 6e 20 73 71 6c 69 74  rate on an sqlit
ff50: 65 33 5f 66 69 6c 65 0a 2a 2a 20 66 6f 72 20 75  e3_file.** for u
ff60: 6e 69 78 20 77 69 74 68 20 64 6f 74 6c 6f 63 6b  nix with dotlock
ff70: 20 73 74 79 6c 65 20 66 69 6c 65 20 6c 6f 63 6b   style file lock
ff80: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ing..*/.static c
ff90: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
ffa0: 6d 65 74 68 6f 64 73 20 73 71 6c 69 74 65 33 4e  methods sqlite3N
ffb0: 6f 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78  olockLockingUnix
ffc0: 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20 31  IoMethod = {.  1
ffd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
ffe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
fff0: 73 69 6f 6e 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  sion */.  nolock
10000 55 6e 69 78 43 6c 6f 73 65 2c 0a 20 20 75 6e 69  UnixClose,.  uni
10010 78 52 65 61 64 2c 0a 20 20 75 6e 69 78 57 72 69  xRead,.  unixWri
10020 74 65 2c 0a 20 20 75 6e 69 78 54 72 75 6e 63 61  te,.  unixTrunca
10030 74 65 2c 0a 20 20 75 6e 69 78 53 79 6e 63 2c 0a  te,.  unixSync,.
10040 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 0a    unixFileSize,.
10050 20 20 6e 6f 6c 6f 63 6b 55 6e 69 78 4c 6f 63 6b    nolockUnixLock
10060 2c 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 69 78 55 6e  ,.  nolockUnixUn
10070 6c 6f 63 6b 2c 0a 20 20 6e 6f 6c 6f 63 6b 55 6e  lock,.  nolockUn
10080 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
10090 6f 63 6b 2c 0a 20 20 75 6e 69 78 4c 6f 63 6b 53  ock,.  unixLockS
100a0 74 61 74 65 2c 0a 20 20 75 6e 69 78 46 69 6c 65  tate,.  unixFile
100b0 43 6f 6e 74 72 6f 6c 2c 0a 20 20 75 6e 69 78 53  Control,.  unixS
100c0 65 63 74 6f 72 53 69 7a 65 2c 0a 20 20 75 6e 69  ectorSize,.  uni
100d0 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  xDeviceCharacter
100e0 69 73 74 69 63 73 0a 7d 3b 0a 0a 23 65 6e 64 69  istics.};..#endi
100f0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
10100 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
10110 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63   */../*.** Alloc
10120 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61  ate memory for a
10130 20 6e 65 77 20 75 6e 69 78 46 69 6c 65 20 61 6e   new unixFile an
10140 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 61  d initialize tha
10150 74 20 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20 57  t unixFile..** W
10160 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
10170 6f 20 74 68 65 20 6e 65 77 20 75 6e 69 78 46 69  o the new unixFi
10180 6c 65 20 69 6e 74 6f 20 2a 70 49 64 2e 0a 2a 2a  le into *pId..**
10190 20 49 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f   If we run out o
101a0 66 20 6d 65 6d 6f 72 79 2c 20 63 6c 6f 73 65 20  f memory, close 
101b0 74 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65 74  the file and ret
101c0 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f  urn an error..*/
101d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
101e0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
101f0 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 57 68 65 6e 20  YLE./* .** When 
10200 6c 6f 63 6b 69 6e 67 20 65 78 74 65 6e 73 69 6f  locking extensio
10210 6e 73 20 61 72 65 20 65 6e 61 62 6c 65 64 2c 20  ns are enabled, 
10220 74 68 65 20 66 69 6c 65 70 61 74 68 20 61 6e 64  the filepath and
10230 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 0a   locking style .
10240 2a 2a 20 61 72 65 20 6e 65 65 64 65 64 20 74 6f  ** are needed to
10250 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 75   determine the u
10260 6e 69 78 46 69 6c 65 20 70 4d 65 74 68 6f 64 20  nixFile pMethod 
10270 74 6f 20 75 73 65 20 66 6f 72 20 6c 6f 63 6b 69  to use for locki
10280 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  ng operations..*
10290 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67 2d 73 74  * The locking-st
102a0 79 6c 65 20 73 70 65 63 69 66 69 63 20 6c 6f 63  yle specific loc
102b0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 64 61 74 61  kingContext data
102c0 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72   structure is cr
102d0 65 61 74 65 64 20 0a 2a 2a 20 61 6e 64 20 61 73  eated .** and as
102e0 73 69 67 6e 65 64 20 68 65 72 65 20 61 6c 73 6f  signed here also
102f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10300 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 0a  fillInUnixFile(.
10310 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20    int h,        
10320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
10330 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
10340 72 20 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20  r of file being 
10350 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20  opened */.  int 
10360 64 69 72 66 64 2c 20 20 20 20 20 20 20 20 20 20  dirfd,          
10370 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79      /* Directory
10380 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
10390 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
103a0 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a  le *pId,      /*
103b0 20 57 72 69 74 65 20 63 6f 6d 70 6c 65 74 65 64   Write completed
103c0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
103d0 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
103e0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
103f0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
10400 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e   file being open
10410 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ed */.){.  sqlit
10420 65 33 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 6c  e3LockingStyle l
10430 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75  ockingStyle;.  u
10440 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20  nixFile *pNew = 
10450 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 49 64 3b  (unixFile *)pId;
10460 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 6d 65  .  int rc;..  me
10470 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
10480 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b  zeof(unixFile));
10490 0a 20 20 6c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  .  lockingStyle 
104a0 3d 20 73 71 6c 69 74 65 33 44 65 74 65 63 74 4c  = sqlite3DetectL
104b0 6f 63 6b 69 6e 67 53 74 79 6c 65 28 7a 46 69 6c  ockingStyle(zFil
104c0 65 6e 61 6d 65 2c 20 68 29 3b 0a 20 20 69 66 20  ename, h);.  if 
104d0 28 20 6c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d  ( lockingStyle =
104e0 3d 20 70 6f 73 69 78 4c 6f 63 6b 69 6e 67 53 74  = posixLockingSt
104f0 79 6c 65 20 29 20 7b 0a 20 20 20 20 65 6e 74 65  yle ) {.    ente
10500 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63  rMutex();.    rc
10510 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28   = findLockInfo(
10520 68 2c 20 26 70 4e 65 77 2d 3e 70 4c 6f 63 6b 2c  h, &pNew->pLock,
10530 20 26 70 4e 65 77 2d 3e 70 4f 70 65 6e 29 3b 0a   &pNew->pOpen);.
10540 20 20 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29      leaveMutex()
10550 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
10560 20 20 20 20 20 20 63 6c 6f 73 65 28 68 29 3b 0a        close(h);.
10570 20 20 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69        unlink(zFi
10580 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72  lename);.      r
10590 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
105a0 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c  EM;.    }.  } el
105b0 73 65 20 7b 0a 20 20 20 20 2f 2a 20 20 70 4c 6f  se {.    /*  pLo
105c0 63 6b 20 61 6e 64 20 70 4f 70 65 6e 20 61 72 65  ck and pOpen are
105d0 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 70   only used for p
105e0 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
105f0 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 70 4e 65  cking */.    pNe
10600 77 2d 3e 70 4c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b  w->pLock = NULL;
10610 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4f 70 65 6e  .    pNew->pOpen
10620 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 70   = NULL;.  }.  p
10630 4e 65 77 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b  New->dirfd = -1;
10640 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a  .  pNew->h = h;.
10650 20 20 53 45 54 5f 54 48 52 45 41 44 49 44 28 70    SET_THREADID(p
10660 4e 65 77 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  New);.  pNew = s
10670 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
10680 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 20  izeof(unixFile) 
10690 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
106a0 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 28 68 29   ){.    close(h)
106b0 3b 0a 20 20 20 20 65 6e 74 65 72 4d 75 74 65 78  ;.    enterMutex
106c0 28 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 4c  ();.    releaseL
106d0 6f 63 6b 49 6e 66 6f 28 70 4e 65 77 2d 3e 70 4c  ockInfo(pNew->pL
106e0 6f 63 6b 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ock);.    releas
106f0 65 4f 70 65 6e 43 6e 74 28 70 4e 65 77 2d 3e 70  eOpenCnt(pNew->p
10700 4f 70 65 6e 29 3b 0a 20 20 20 20 6c 65 61 76 65  Open);.    leave
10710 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 74  Mutex();.    ret
10720 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
10730 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
10740 77 69 74 63 68 28 6c 6f 63 6b 69 6e 67 53 74 79  witch(lockingSty
10750 6c 65 29 20 7b 0a 20 20 20 20 20 20 63 61 73 65  le) {.      case
10760 20 61 66 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65   afpLockingStyle
10770 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 61  : {.        /* a
10780 66 70 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20  fp locking uses 
10790 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f  the file path so
107a0 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
107b0 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20  included in.    
107c0 20 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f      ** the afpLo
107d0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 2f 0a  ckingContext */.
107e0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 46 69 6c          int nFil
107f0 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70  ename;.        p
10800 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26  New->pMethod = &
10810 73 71 6c 69 74 65 33 41 46 50 4c 6f 63 6b 69 6e  sqlite3AFPLockin
10820 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a 20  gUnixIoMethod;. 
10830 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63         pNew->loc
10840 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 0a 20  kingContext = . 
10850 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10860 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 61  _malloc(sizeof(a
10870 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
10880 29 29 3b 0a 20 20 20 20 20 20 20 20 6e 46 69 6c  ));.        nFil
10890 65 6e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a  ename = strlen(z
108a0 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20  Filename)+1;.   
108b0 20 20 20 20 20 28 28 61 66 70 4c 6f 63 6b 69 6e       ((afpLockin
108c0 67 43 6f 6e 74 65 78 74 20 2a 29 70 4e 65 77 2d  gContext *)pNew-
108d0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
108e0 2d 3e 66 69 6c 65 50 61 74 68 20 3d 20 0a 20 20  ->filePath = .  
108f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
10900 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d 65  malloc(nFilename
10910 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
10920 79 28 28 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  y(((afpLockingCo
10930 6e 74 65 78 74 20 2a 29 70 4e 65 77 2d 3e 6c 6f  ntext *)pNew->lo
10940 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 66  ckingContext)->f
10950 69 6c 65 50 61 74 68 2c 20 0a 20 20 20 20 20 20  ilePath, .      
10960 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61           zFilena
10970 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a  me, nFilename);.
10980 20 20 20 20 20 20 20 20 73 72 61 6e 64 6f 6d 64          srandomd
10990 65 76 28 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ev();.        br
109a0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
109b0 20 20 20 63 61 73 65 20 66 6c 6f 63 6b 4c 6f 63     case flockLoc
109c0 6b 69 6e 67 53 74 79 6c 65 3a 0a 20 20 20 20 20  kingStyle:.     
109d0 20 20 20 2f 2a 20 66 6c 6f 63 6b 20 6c 6f 63 6b     /* flock lock
109e0 69 6e 67 20 64 6f 65 73 6e 27 74 20 6e 65 65 64  ing doesn't need
109f0 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
10a00 69 6e 67 43 6f 6e 74 65 78 74 20 69 6e 66 6f 72  ingContext infor
10a10 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  mation */.      
10a20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20    pNew->pMethod 
10a30 3d 20 26 73 71 6c 69 74 65 33 46 6c 6f 63 6b 4c  = &sqlite3FlockL
10a40 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68  ockingUnixIoMeth
10a50 6f 64 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  od;.        brea
10a60 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 64 6f  k;.      case do
10a70 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79 6c  tlockLockingStyl
10a80 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e: {.        /* 
10a90 64 6f 74 6c 6f 63 6b 20 6c 6f 63 6b 69 6e 67 20  dotlock locking 
10aa0 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61  uses the file pa
10ab0 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74  th so it needs t
10ac0 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e  o be included in
10ad0 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  .         ** the
10ae0 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43   dotlockLockingC
10af0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20 20 20 20  ontext */.      
10b00 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b    int nFilename;
10b10 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
10b20 4d 65 74 68 6f 64 20 3d 20 26 73 71 6c 69 74 65  Method = &sqlite
10b30 33 44 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 55  3DotlockLockingU
10b40 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 20  nixIoMethod;.   
10b50 20 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69       pNew->locki
10b60 6e 67 43 6f 6e 74 65 78 74 20 3d 20 73 71 6c 69  ngContext = sqli
10b70 74 65 33 5f 6d 61 6c 6c 6f 63 28 0a 20 20 20 20  te3_malloc(.    
10b80 20 20 20 20 20 20 73 69 7a 65 6f 66 28 64 6f 74        sizeof(dot
10b90 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  lockLockingConte
10ba0 78 74 29 29 3b 0a 20 20 20 20 20 20 20 20 6e 46  xt));.        nF
10bb0 69 6c 65 6e 61 6d 65 20 3d 20 73 74 72 6c 65 6e  ilename = strlen
10bc0 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b  (zFilename) + 6;
10bd0 0a 20 20 20 20 20 20 20 20 28 28 64 6f 74 6c 6f  .        ((dotlo
10be0 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ckLockingContext
10bf0 20 2a 29 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67   *)pNew->locking
10c00 43 6f 6e 74 65 78 74 29 2d 3e 6c 6f 63 6b 50 61  Context)->lockPa
10c10 74 68 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  th = .          
10c20 20 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63    sqlite3_malloc
10c30 28 20 6e 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20  ( nFilename );. 
10c40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
10c50 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d  nprintf(nFilenam
10c60 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
10c70 20 20 20 20 28 28 64 6f 74 6c 6f 63 6b 4c 6f 63      ((dotlockLoc
10c80 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 4e  kingContext *)pN
10c90 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
10ca0 78 74 29 2d 3e 6c 6f 63 6b 50 61 74 68 2c 20 0a  xt)->lockPath, .
10cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cc0 22 25 73 2e 6c 6f 63 6b 22 2c 20 7a 46 69 6c 65  "%s.lock", zFile
10cd0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 62  name);.        b
10ce0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
10cf0 20 20 20 20 63 61 73 65 20 70 6f 73 69 78 4c 6f      case posixLo
10d00 63 6b 69 6e 67 53 74 79 6c 65 3a 0a 20 20 20 20  ckingStyle:.    
10d10 20 20 20 20 2f 2a 20 70 6f 73 69 78 20 6c 6f 63      /* posix loc
10d20 6b 69 6e 67 20 64 6f 65 73 6e 27 74 20 6e 65 65  king doesn't nee
10d30 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  d additional loc
10d40 6b 69 6e 67 43 6f 6e 74 65 78 74 20 69 6e 66 6f  kingContext info
10d50 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  rmation */.     
10d60 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64     pNew->pMethod
10d70 20 3d 20 26 73 71 6c 69 74 65 33 55 6e 69 78 49   = &sqlite3UnixI
10d80 6f 4d 65 74 68 6f 64 3b 0a 20 20 20 20 20 20 20  oMethod;.       
10d90 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
10da0 73 65 20 6e 6f 4c 6f 63 6b 69 6e 67 53 74 79 6c  se noLockingStyl
10db0 65 3a 0a 20 20 20 20 20 20 63 61 73 65 20 75 6e  e:.      case un
10dc0 73 75 70 70 6f 72 74 65 64 4c 6f 63 6b 69 6e 67  supportedLocking
10dd0 53 74 79 6c 65 3a 0a 20 20 20 20 20 20 64 65 66  Style:.      def
10de0 61 75 6c 74 3a 20 0a 20 20 20 20 20 20 20 20 70  ault: .        p
10df0 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26  New->pMethod = &
10e00 73 71 6c 69 74 65 33 4e 6f 6c 6f 63 6b 4c 6f 63  sqlite3NolockLoc
10e10 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64  kingUnixIoMethod
10e20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 4f 70 65 6e  ;.    }.    Open
10e30 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 20  Counter(+1);.   
10e40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10e50 4b 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 20 2f  K;.  }.}.#else /
10e60 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
10e70 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
10e80 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c  .static int fill
10e90 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20 69 6e  InUnixFile(.  in
10ea0 74 20 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  t h,            
10eb0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c       /* Open fil
10ec0 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  e descriptor on 
10ed0 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
10ee0 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64  d */.  int dirfd
10ef0 2c 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ,.  sqlite3_file
10f00 20 2a 70 49 64 2c 20 20 20 20 20 2f 2a 20 57 72   *pId,     /* Wr
10f10 69 74 65 20 74 6f 20 74 68 65 20 75 6e 69 78 46  ite to the unixF
10f20 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 68 65  ile structure he
10f30 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  re */.  const ch
10f40 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 20 20 2f  ar *zFilename  /
10f50 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
10f60 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
10f70 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  */.){.  unixFile
10f80 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69   *pNew = (unixFi
10f90 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20  le *)pId;.  int 
10fa0 72 63 3b 0a 0a 23 69 66 64 65 66 20 46 44 5f 43  rc;..#ifdef FD_C
10fb0 4c 4f 45 58 45 43 0a 20 20 66 63 6e 74 6c 28 68  LOEXEC.  fcntl(h
10fc0 2c 20 46 5f 53 45 54 46 44 2c 20 66 63 6e 74 6c  , F_SETFD, fcntl
10fd0 28 68 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20  (h, F_GETFD, 0) 
10fe0 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23  | FD_CLOEXEC);.#
10ff0 65 6e 64 69 66 0a 0a 20 20 65 6e 74 65 72 4d 75  endif..  enterMu
11000 74 65 78 28 29 3b 0a 20 20 72 63 20 3d 20 66 69  tex();.  rc = fi
11010 6e 64 4c 6f 63 6b 49 6e 66 6f 28 68 2c 20 26 70  ndLockInfo(h, &p
11020 4e 65 77 2d 3e 70 4c 6f 63 6b 2c 20 26 70 4e 65  New->pLock, &pNe
11030 77 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 6c 65 61  w->pOpen);.  lea
11040 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28  veMutex();.  if(
11050 20 72 63 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65   rc ){.    close
11060 28 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (h);.    return 
11070 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
11080 7d 0a 0a 20 20 4f 53 54 52 41 43 45 33 28 22 4f  }..  OSTRACE3("O
11090 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e  PEN    %-3d %s\n
110a0 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ", h, zFilename)
110b0 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 72 66 64 20  ;.  pNew->dirfd 
110c0 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 68 20  = -1;.  pNew->h 
110d0 3d 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 72  = h;.  pNew->dir
110e0 66 64 20 3d 20 64 69 72 66 64 3b 0a 20 20 53 45  fd = dirfd;.  SE
110f0 54 5f 54 48 52 45 41 44 49 44 28 70 4e 65 77 29  T_THREADID(pNew)
11100 3b 0a 0a 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68  ;..  pNew->pMeth
11110 6f 64 20 3d 20 26 73 71 6c 69 74 65 33 55 6e 69  od = &sqlite3Uni
11120 78 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 4f 70 65  xIoMethod;.  Ope
11130 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20  nCounter(+1);.  
11140 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11150 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
11160 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
11170 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a  ING_STYLE */../*
11180 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20  .** Open a file 
11190 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68  descriptor to th
111a0 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74  e directory cont
111b0 61 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c  aining file zFil
111c0 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63  ename..** If suc
111d0 63 65 73 73 66 75 6c 2c 20 2a 70 46 64 20 69 73  cessful, *pFd is
111e0 20 73 65 74 20 74 6f 20 74 68 65 20 6f 70 65 6e   set to the open
111f0 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
11200 6f 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  or and.** SQLITE
11210 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
11220 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
11230 75 72 73 2c 20 65 69 74 68 65 72 20 53 51 4c 49  urs, either SQLI
11240 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53  TE_NOMEM.** or S
11250 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69  QLITE_CANTOPEN i
11260 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
11270 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 61 6e  pFd is set to an
11280 20 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61   undefined.** va
11290 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  lue..**.** If SQ
112a0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
112b0 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ned, the caller 
112c0 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
112d0 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68  or closing.** th
112e0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
112f0 72 20 2a 70 46 64 20 75 73 69 6e 67 20 63 6c 6f  r *pFd using clo
11300 73 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  se()..*/.static 
11310 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72  int openDirector
11320 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  y(const char *zF
11330 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46  ilename, int *pF
11340 64 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20  d){.  int ii;.  
11350 69 6e 74 20 66 64 3b 0a 20 20 63 68 61 72 20 7a  int fd;.  char z
11360 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48  Dirname[MAX_PATH
11370 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69  NAME+1];..  sqli
11380 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58  te3_snprintf(MAX
11390 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72 6e  _PATHNAME, zDirn
113a0 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65  ame, "%s", zFile
113b0 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d  name);.  for(ii=
113c0 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29  strlen(zDirname)
113d0 3b 20 69 69 3e 3d 30 20 26 26 20 7a 44 69 72 6e  ; ii>=0 && zDirn
113e0 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69  ame[ii]!='/'; ii
113f0 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20  --);.  if( ii>0 
11400 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b  ){.    zDirname[
11410 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ii] = '\0';.    
11420 66 64 20 3d 20 6f 70 65 6e 28 7a 44 69 72 6e 61  fd = open(zDirna
11430 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42  me, O_RDONLY|O_B
11440 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20 20 69  INARY, 0);.    i
11450 66 28 20 66 64 3e 30 20 29 7b 0a 23 69 66 64 65  f( fd>0 ){.#ifde
11460 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20 20  f FD_CLOEXEC.   
11470 20 20 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 53     fcntl(fd, F_S
11480 45 54 46 44 2c 20 66 63 6e 74 6c 28 66 64 2c 20  ETFD, fcntl(fd, 
11490 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44  F_GETFD, 0) | FD
114a0 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69  _CLOEXEC);.#endi
114b0 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 33  f.      OSTRACE3
114c0 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25  ("OPENDIR %-3d %
114d0 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61  s\n", fd, zDirna
114e0 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  me);.    }.  }. 
114f0 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20 72 65   *pFd = fd;.  re
11500 74 75 72 6e 20 28 66 64 3e 30 3f 53 51 4c 49 54  turn (fd>0?SQLIT
11510 45 5f 4f 4b 3a 53 51 4c 49 54 45 5f 43 41 4e 54  E_OK:SQLITE_CANT
11520 4f 50 45 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  OPEN);.}../*.** 
11530 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 7a 50  Open the file zP
11540 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76  ath..** .** Prev
11550 69 6f 75 73 6c 79 2c 20 74 68 65 20 53 51 4c 69  iously, the SQLi
11560 74 65 20 4f 53 20 6c 61 79 65 72 20 75 73 65 64  te OS layer used
11570 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73   three functions
11580 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 69   in place of thi
11590 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20  s.** one:.**.** 
115a0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65      sqlite3OsOpe
115b0 6e 52 65 61 64 57 72 69 74 65 28 29 3b 0a 2a 2a  nReadWrite();.**
115c0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70       sqlite3OsOp
115d0 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a  enReadOnly();.**
115e0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70       sqlite3OsOp
115f0 65 6e 45 78 63 6c 75 73 69 76 65 28 29 3b 0a 2a  enExclusive();.*
11600 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 73  *.** These calls
11610 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74   correspond to t
11620 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
11630 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c 61  binations of fla
11640 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65  gs:.**.**     Re
11650 61 64 57 72 69 74 65 28 29 20 2d 3e 20 20 20 20  adWrite() ->    
11660 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52   (READWRITE | CR
11670 45 41 54 45 29 0a 2a 2a 20 20 20 20 20 52 65 61  EATE).**     Rea
11680 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20 20  dOnly()  ->     
11690 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20  (READONLY) .**  
116a0 20 20 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65     OpenExclusive
116b0 28 29 20 2d 3e 20 28 52 45 41 44 57 52 49 54 45  () -> (READWRITE
116c0 20 7c 20 43 52 45 41 54 45 20 7c 20 45 58 43 4c   | CREATE | EXCL
116d0 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65  USIVE).**.** The
116e0 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73 69   old OpenExclusi
116f0 76 65 28 29 20 61 63 63 65 70 74 65 64 20 61 20  ve() accepted a 
11700 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74  boolean argument
11710 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20 49 66   - "delFlag". If
11720 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 20 66 69  .** true, the fi
11730 6c 65 20 77 61 73 20 63 6f 6e 66 69 67 75 72 65  le was configure
11740 64 20 74 6f 20 62 65 20 61 75 74 6f 6d 61 74 69  d to be automati
11750 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68  cally deleted wh
11760 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 68  en the.** file h
11770 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54 6f  andle closed. To
11780 20 61 63 68 69 65 76 65 20 74 68 65 20 73 61 6d   achieve the sam
11790 65 20 65 66 66 65 63 74 20 75 73 69 6e 67 20 74  e effect using t
117a0 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74 65  his new .** inte
117b0 72 66 61 63 65 2c 20 61 64 64 20 74 68 65 20 44  rface, add the D
117c0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c 61  ELETEONCLOSE fla
117d0 67 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69  g to those speci
117e0 66 69 65 64 20 61 62 6f 76 65 20 66 6f 72 20 0a  fied above for .
117f0 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  ** OpenExclusive
11800 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
11810 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73 71  t unixOpen(.  sq
11820 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
11830 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
11840 7a 50 61 74 68 2c 20 0a 20 20 73 71 6c 69 74 65  zPath, .  sqlite
11850 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 0a 20  3_file *pFile,. 
11860 20 69 6e 74 20 66 6c 61 67 73 2c 0a 20 20 69 6e   int flags,.  in
11870 74 20 2a 70 4f 75 74 46 6c 61 67 73 0a 29 7b 0a  t *pOutFlags.){.
11880 20 20 69 6e 74 20 66 64 20 3d 20 30 3b 20 20 20    int fd = 0;   
11890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118a0 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
118b0 74 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  tor returned by 
118c0 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  open() */.  int 
118d0 64 69 72 66 64 20 3d 20 2d 31 3b 20 20 20 20 20  dirfd = -1;     
118e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
118f0 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73  rectory file des
11900 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  criptor */.  int
11910 20 6f 66 6c 61 67 73 20 3d 20 30 3b 20 20 20 20   oflags = 0;    
11920 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
11930 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20  lags to pass to 
11940 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  open() */.  int 
11950 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78  eType = flags&0x
11960 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79  FFFFFF00;  /* Ty
11970 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70  pe of file to op
11980 65 6e 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 45  en */..  int isE
11990 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61  xclusive  = (fla
119a0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
119b0 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69  _EXCLUSIVE);.  i
119c0 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20 20 20  nt isDelete     
119d0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
119e0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
119f0 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43  LOSE);.  int isC
11a00 72 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61  reate     = (fla
11a10 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
11a20 5f 43 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20  _CREATE);.  int 
11a30 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28  isReadonly   = (
11a40 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
11a50 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20  PEN_READONLY);. 
11a60 20 69 6e 74 20 69 73 52 65 61 64 57 72 69 74 65   int isReadWrite
11a70 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
11a80 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
11a90 54 45 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 63 72  TE);..  /* If cr
11aa0 65 61 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20  eating a master 
11ab0 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f 75  or main-file jou
11ac0 72 6e 61 6c 2c 20 74 68 69 73 20 66 75 6e 63 74  rnal, this funct
11ad0 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a 20 20  ion will open.  
11ae0 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73 63 72 69  ** a file-descri
11af0 70 74 6f 72 20 6f 6e 20 74 68 65 20 64 69 72 65  ptor on the dire
11b00 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68 65 20 66  ctory too. The f
11b10 69 72 73 74 20 74 69 6d 65 20 75 6e 69 78 53 79  irst time unixSy
11b20 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20 63 61 6c  nc().  ** is cal
11b30 6c 65 64 20 74 68 65 20 64 69 72 65 63 74 6f 72  led the director
11b40 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
11b50 72 20 77 69 6c 6c 20 62 65 20 66 73 79 6e 63 28  r will be fsync(
11b60 29 65 64 20 61 6e 64 20 63 6c 6f 73 65 28 29 64  )ed and close()d
11b70 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f  ..  */.  int isO
11b80 70 65 6e 44 69 72 65 63 74 6f 72 79 20 3d 20 28  penDirectory = (
11b90 69 73 43 72 65 61 74 65 20 26 26 20 0a 20 20 20  isCreate && .   
11ba0 20 20 20 28 65 54 79 70 65 3d 3d 53 51 4c 49 54     (eType==SQLIT
11bb0 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
11bc0 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d  URNAL || eType==
11bd0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
11be0 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 29 3b 0a 0a  _JOURNAL).  );..
11bf0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66    /* Check the f
11c00 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65  ollowing stateme
11c10 6e 74 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20  nts are true: . 
11c20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45   **.  **   (a) E
11c30 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68  xactly one of th
11c40 65 20 52 45 41 44 57 52 49 54 45 20 61 6e 64 20  e READWRITE and 
11c50 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d  READONLY flags m
11c60 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20  ust be set, and 
11c70 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43  .  **   (b) if C
11c80 52 45 41 54 45 20 69 73 20 73 65 74 2c 20 74 68  REATE is set, th
11c90 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75 73  en READWRITE mus
11ca0 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61  t also be set, a
11cb0 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66  nd.  **   (c) if
11cc0 20 45 58 43 4c 55 53 49 56 45 20 69 73 20 73 65   EXCLUSIVE is se
11cd0 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d  t, then CREATE m
11ce0 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e  ust also be set.
11cf0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28  .  */.  assert((
11d00 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c  isReadonly==0 ||
11d10 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29   isReadWrite==0)
11d20 20 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65   && (isReadWrite
11d30 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29   || isReadonly))
11d40 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65  ;.  assert(isCre
11d50 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64  ate==0 || isRead
11d60 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74  Write);.  assert
11d70 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20  (isExclusive==0 
11d80 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20  || isCreate);.. 
11d90 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
11da0 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
11db0 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74  has set one of t
11dc0 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66  he "file-type" f
11dd0 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72  lags. */.  asser
11de0 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  t( eType==SQLITE
11df0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20  _OPEN_MAIN_DB   
11e00 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
11e10 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
11e20 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
11e30 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
11e40 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65  AIN_JOURNAL || e
11e50 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
11e60 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a  N_TEMP_JOURNAL .
11e70 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
11e80 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42  =SQLITE_OPEN_SUB
11e90 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79  JOURNAL   || eTy
11ea0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
11eb0 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a  MASTER_JOURNAL .
11ec0 20 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 52 65    );..  if( isRe
11ed0 61 64 6f 6e 6c 79 20 29 20 20 6f 66 6c 61 67 73  adonly )  oflags
11ee0 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20   |= O_RDONLY;.  
11ef0 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
11f00 29 20 6f 66 6c 61 67 73 20 7c 3d 20 4f 5f 52 44  ) oflags |= O_RD
11f10 57 52 3b 0a 20 20 69 66 28 20 69 73 43 72 65 61  WR;.  if( isCrea
11f20 74 65 20 29 20 20 20 20 6f 66 6c 61 67 73 20 7c  te )    oflags |
11f30 3d 20 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66 28  = O_CREAT;.  if(
11f40 20 69 73 45 78 63 6c 75 73 69 76 65 20 29 20 6f   isExclusive ) o
11f50 66 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c  flags |= (O_EXCL
11f60 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20  |O_NOFOLLOW);.  
11f70 6f 66 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41 52  oflags |= (O_LAR
11f80 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29  GEFILE|O_BINARY)
11f90 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70 46 69 6c  ;..  memset(pFil
11fa0 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69  e, 0, sizeof(uni
11fb0 78 46 69 6c 65 29 29 3b 0a 20 20 66 64 20 3d 20  xFile));.  fd = 
11fc0 6f 70 65 6e 28 7a 50 61 74 68 2c 20 6f 66 6c 61  open(zPath, ofla
11fd0 67 73 2c 20 69 73 44 65 6c 65 74 65 3f 30 36 30  gs, isDelete?060
11fe0 30 3a 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  0:SQLITE_DEFAULT
11ff0 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
12000 53 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 26  S);.  if( fd<0 &
12010 26 20 65 72 72 6e 6f 21 3d 45 49 53 44 49 52 20  & errno!=EISDIR 
12020 26 26 20 69 73 52 65 61 64 57 72 69 74 65 20 26  && isReadWrite &
12030 26 20 21 69 73 45 78 63 6c 75 73 69 76 65 20 29  & !isExclusive )
12040 7b 0a 20 20 20 20 2f 2a 20 46 61 69 6c 65 64 20  {.    /* Failed 
12050 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65  to open the file
12060 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
12070 61 63 63 65 73 73 2e 20 54 72 79 20 72 65 61 64  access. Try read
12080 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 66 6c  -only. */.    fl
12090 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f  ags &= ~(SQLITE_
120a0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
120b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
120c0 45 29 3b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d  E);.    flags |=
120d0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
120e0 44 4f 4e 4c 59 3b 0a 20 20 20 20 72 65 74 75 72  DONLY;.    retur
120f0 6e 20 75 6e 69 78 4f 70 65 6e 28 70 56 66 73 2c  n unixOpen(pVfs,
12100 20 7a 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 66   zPath, pFile, f
12110 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67 73 29  lags, pOutFlags)
12120 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30  ;.  }.  if( fd<0
12130 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
12140 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
12150 20 20 7d 0a 20 20 69 66 28 20 69 73 44 65 6c 65    }.  if( isDele
12160 74 65 20 29 7b 0a 20 20 20 20 75 6e 6c 69 6e 6b  te ){.    unlink
12170 28 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 69  (zPath);.  }.  i
12180 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a  f( pOutFlags ){.
12190 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d      *pOutFlags =
121a0 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 61   flags;.  }..  a
121b0 73 73 65 72 74 28 66 64 21 3d 30 29 3b 0a 20 20  ssert(fd!=0);.  
121c0 69 66 28 20 69 73 4f 70 65 6e 44 69 72 65 63 74  if( isOpenDirect
121d0 6f 72 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ory ){.    int r
121e0 63 20 3d 20 6f 70 65 6e 44 69 72 65 63 74 6f 72  c = openDirector
121f0 79 28 7a 50 61 74 68 2c 20 26 64 69 72 66 64 29  y(zPath, &dirfd)
12200 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
12210 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12220 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20   close(fd);.    
12230 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
12240 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
12250 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 66  fillInUnixFile(f
12260 64 2c 20 64 69 72 66 64 2c 20 70 46 69 6c 65 2c  d, dirfd, pFile,
12270 20 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   zPath);.}../*.*
12280 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c  * Delete the fil
12290 65 20 61 74 20 7a 50 61 74 68 2e 20 49 66 20 74  e at zPath. If t
122a0 68 65 20 64 69 72 53 79 6e 63 20 61 72 67 75 6d  he dirSync argum
122b0 65 6e 74 20 69 73 20 74 72 75 65 2c 20 66 73 79  ent is true, fsy
122c0 6e 63 28 29 0a 2a 2a 20 74 68 65 20 64 69 72 65  nc().** the dire
122d0 63 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65  ctory after dele
122e0 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a 2a  ting the file..*
122f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
12300 78 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 5f  xDelete(sqlite3_
12310 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74  vfs *pVfs, const
12320 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e   char *zPath, in
12330 74 20 64 69 72 53 79 6e 63 29 7b 0a 20 20 69 6e  t dirSync){.  in
12340 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12350 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
12360 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
12370 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b  E_IOERR_DELETE);
12380 0a 20 20 75 6e 6c 69 6e 6b 28 7a 50 61 74 68 29  .  unlink(zPath)
12390 3b 0a 20 20 69 66 28 20 64 69 72 53 79 6e 63 20  ;.  if( dirSync 
123a0 29 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a 20  ){.    int fd;. 
123b0 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 69 72 65     rc = openDire
123c0 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66 64  ctory(zPath, &fd
123d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
123e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
123f0 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 20    if( fsync(fd) 
12400 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
12410 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52  SQLITE_IOERR_DIR
12420 5f 46 53 59 4e 43 3b 0a 20 20 20 20 20 20 7d 0a  _FSYNC;.      }.
12430 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b        close(fd);
12440 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
12450 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
12460 20 54 65 73 74 20 74 68 65 20 65 78 69 73 74 61   Test the exista
12470 6e 63 65 20 6f 66 20 6f 72 20 61 63 63 65 73 73  nce of or access
12480 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20   permissions of 
12490 66 69 6c 65 20 7a 50 61 74 68 2e 20 54 68 65 0a  file zPath. The.
124a0 2a 2a 20 74 65 73 74 20 70 65 72 66 6f 72 6d 65  ** test performe
124b0 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  d depends on the
124c0 20 76 61 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a   value of flags:
124d0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  .**.**     SQLIT
124e0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a  E_ACCESS_EXISTS:
124f0 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
12500 20 66 69 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20   file exists.** 
12510 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53      SQLITE_ACCES
12520 53 5f 52 45 41 44 57 52 49 54 45 3a 20 52 65 74  S_READWRITE: Ret
12530 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c  urn 1 if the fil
12540 65 20 69 73 20 72 65 61 64 20 61 6e 64 20 77 72  e is read and wr
12550 69 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53  itable..**     S
12560 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
12570 44 4f 4e 4c 59 3a 20 52 65 74 75 72 6e 20 31 20  DONLY: Return 1 
12580 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 72  if the file is r
12590 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f  eadable..**.** O
125a0 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20  therwise return 
125b0 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
125c0 20 75 6e 69 78 41 63 63 65 73 73 28 73 71 6c 69   unixAccess(sqli
125d0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63  te3_vfs *pVfs, c
125e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
125f0 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
12600 69 6e 74 20 61 6d 6f 64 65 3b 0a 20 20 73 77 69  int amode;.  swi
12610 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20  tch( flags ){.  
12620 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
12630 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20  CESS_EXISTS:.   
12640 20 20 20 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b     amode = F_OK;
12650 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12660 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
12670 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a  CESS_READWRITE:.
12680 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 57 5f        amode = W_
12690 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62  OK|R_OK;.      b
126a0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
126b0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
126c0 44 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d  D:.      amode =
126d0 20 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65   R_OK;.      bre
126e0 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74  ak;..    default
126f0 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 21  :.      assert(!
12700 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61  "Invalid flags a
12710 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20  rgument");.  }. 
12720 20 72 65 74 75 72 6e 20 28 61 63 63 65 73 73 28   return (access(
12730 7a 50 61 74 68 2c 20 61 6d 6f 64 65 29 3d 3d 30  zPath, amode)==0
12740 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  );.}../*.** Crea
12750 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  te a temporary f
12760 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66  ile name in zBuf
12770 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20  .  zBuf must be 
12780 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20  allocated.** by 
12790 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  the calling proc
127a0 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20  ess and must be 
127b0 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  big enough to ho
127c0 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70  ld at least.** p
127d0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
127e0 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bytes..*/.static
127f0 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70   int unixGetTemp
12800 4e 61 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73  Name(sqlite3_vfs
12810 20 2a 70 56 66 73 2c 20 63 68 61 72 20 2a 7a 42   *pVfs, char *zB
12820 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  uf){.  static co
12830 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73  nst char *azDirs
12840 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20  [] = {.     0,. 
12850 20 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a      "/var/tmp",.
12860 20 20 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c       "/usr/tmp",
12870 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20  .     "/tmp",.  
12880 20 20 20 22 2e 22 2c 0a 20 20 7d 3b 0a 20 20 73     ".",.  };.  s
12890 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
128a0 67 6e 65 64 20 63 68 61 72 20 7a 43 68 61 72 73  gned char zChars
128b0 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66  [] =.    "abcdef
128c0 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76  ghijklmnopqrstuv
128d0 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45  wxyz".    "ABCDE
128e0 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55  FGHIJKLMNOPQRSTU
128f0 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33  VWXYZ".    "0123
12900 34 35 36 37 38 39 22 3b 0a 20 20 69 6e 74 20 69  456789";.  int i
12910 2c 20 6a 3b 0a 20 20 73 74 72 75 63 74 20 73 74  , j;.  struct st
12920 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20  at buf;.  const 
12930 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 22 2e 22  char *zDir = "."
12940 3b 0a 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20  ;.  azDirs[0] = 
12950 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
12960 65 63 74 6f 72 79 3b 0a 20 20 66 6f 72 28 69 3d  ectory;.  for(i=
12970 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69  0; i<sizeof(azDi
12980 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72  rs)/sizeof(azDir
12990 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  s[0]); i++){.   
129a0 20 69 66 28 20 61 7a 44 69 72 73 5b 69 5d 3d 3d   if( azDirs[i]==
129b0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
129c0 20 20 69 66 28 20 73 74 61 74 28 61 7a 44 69 72    if( stat(azDir
129d0 73 5b 69 5d 2c 20 26 62 75 66 29 20 29 20 63 6f  s[i], &buf) ) co
129e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
129f0 21 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f  !S_ISDIR(buf.st_
12a00 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e 75 65  mode) ) continue
12a10 3b 0a 20 20 20 20 69 66 28 20 61 63 63 65 73 73  ;.    if( access
12a20 28 61 7a 44 69 72 73 5b 69 5d 2c 20 30 37 29 20  (azDirs[i], 07) 
12a30 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
12a40 7a 44 69 72 20 3d 20 61 7a 44 69 72 73 5b 69 5d  zDir = azDirs[i]
12a50 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
12a60 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73 73 65 72  .  do{.    asser
12a70 74 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  t( pVfs->mxPathn
12a80 61 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d  ame==MAX_PATHNAM
12a90 45 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  E );.    sqlite3
12aa0 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41  _snprintf(MAX_PA
12ab0 54 48 4e 41 4d 45 2d 31 37 2c 20 7a 42 75 66 2c  THNAME-17, zBuf,
12ac0 20 22 25 73 2f 22 53 51 4c 49 54 45 5f 54 45 4d   "%s/"SQLITE_TEM
12ad0 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a  P_FILE_PREFIX, z
12ae0 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74  Dir);.    j = st
12af0 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20  rlen(zBuf);.    
12b00 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73  sqlite3Randomnes
12b10 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b  s(15, &zBuf[j]);
12b20 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
12b30 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20  15; i++, j++){. 
12b40 20 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28       zBuf[j] = (
12b50 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75  char)zChars[ ((u
12b60 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75  nsigned char)zBu
12b70 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43  f[j])%(sizeof(zC
12b80 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20  hars)-1) ];.    
12b90 7d 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20  }.    zBuf[j] = 
12ba0 30 3b 0a 20 20 7d 77 68 69 6c 65 28 20 61 63 63  0;.  }while( acc
12bb0 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29  ess(zBuf,0)==0 )
12bc0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
12bd0 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
12be0 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20  Turn a relative 
12bf0 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20  pathname into a 
12c00 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54  full pathname. T
12c10 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68  he relative path
12c20 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 61 73  .** is stored as
12c30 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
12c40 64 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20  d string in the 
12c50 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74  buffer pointed t
12c60 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a  o by.** zPath. .
12c70 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74  **.** zOut point
12c80 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66  s to a buffer of
12c90 20 61 74 20 6c 65 61 73 74 20 73 71 6c 69 74 65   at least sqlite
12ca0 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65  3_vfs.mxPathname
12cb0 20 62 79 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74   bytes .** (in t
12cc0 68 69 73 20 63 61 73 65 2c 20 4d 41 58 5f 50 41  his case, MAX_PA
12cd0 54 48 4e 41 4d 45 20 62 79 74 65 73 29 2e 20 54  THNAME bytes). T
12ce0 68 65 20 66 75 6c 6c 2d 70 61 74 68 20 69 73 20  he full-path is 
12cf0 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68  written to.** th
12d00 69 73 20 62 75 66 66 65 72 20 62 65 66 6f 72 65  is buffer before
12d10 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
12d20 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 75  tatic int unixFu
12d30 6c 6c 50 61 74 68 6e 61 6d 65 28 73 71 6c 69 74  llPathname(sqlit
12d40 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f  e3_vfs *pVfs, co
12d50 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
12d60 20 63 68 61 72 20 2a 7a 4f 75 74 29 7b 0a 20 20   char *zOut){.  
12d70 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e 6d 78  assert( pVfs->mx
12d80 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41  Pathname==MAX_PA
12d90 54 48 4e 41 4d 45 20 29 3b 0a 20 20 7a 4f 75 74  THNAME );.  zOut
12da0 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2d 31 5d  [MAX_PATHNAME-1]
12db0 20 3d 20 27 5c 30 27 3b 0a 20 20 69 66 28 20 7a   = '\0';.  if( z
12dc0 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a  Path[0]=='/' ){.
12dd0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
12de0 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d  intf(MAX_PATHNAM
12df0 45 2c 20 7a 4f 75 74 2c 20 22 25 73 22 2c 20 7a  E, zOut, "%s", z
12e00 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Path);.  }else{.
12e10 20 20 20 20 69 6e 74 20 6e 43 77 64 3b 0a 20 20      int nCwd;.  
12e20 20 20 69 66 28 20 67 65 74 63 77 64 28 7a 4f 75    if( getcwd(zOu
12e30 74 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2d  t, MAX_PATHNAME-
12e40 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  1)==0 ){.      r
12e50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
12e60 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43  OR;.    }.    nC
12e70 77 64 20 3d 20 73 74 72 6c 65 6e 28 7a 4f 75 74  wd = strlen(zOut
12e80 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
12e90 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48  nprintf(MAX_PATH
12ea0 4e 41 4d 45 2d 6e 43 77 64 2c 20 26 7a 4f 75 74  NAME-nCwd, &zOut
12eb0 5b 6e 43 77 64 5d 2c 20 22 2f 25 73 22 2c 20 7a  [nCwd], "/%s", z
12ec0 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Path);.  }.  ret
12ed0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
12ee0 23 69 66 20 30 0a 20 20 2f 2a 0a 20 20 2a 2a 20  #if 0.  /*.  ** 
12ef0 52 65 6d 6f 76 65 20 22 2f 2e 2f 22 20 70 61 74  Remove "/./" pat
12f00 68 20 65 6c 65 6d 65 6e 74 73 20 61 6e 64 20 63  h elements and c
12f10 6f 6e 76 65 72 74 20 22 2f 41 2f 2e 2f 22 20 70  onvert "/A/./" p
12f20 61 74 68 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a  ath elements.  *
12f30 2a 20 74 6f 20 6a 75 73 74 20 22 2f 22 2e 0a 20  * to just "/".. 
12f40 20 2a 2f 0a 20 20 69 66 28 20 7a 46 75 6c 6c 20   */.  if( zFull 
12f50 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  ){.    int i, j;
12f60 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  .    for(i=j=0; 
12f70 7a 46 75 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  zFull[i]; i++){.
12f80 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 5b        if( zFull[
12f90 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  i]=='/' ){.     
12fa0 20 20 20 69 66 28 20 7a 46 75 6c 6c 5b 69 2b 31     if( zFull[i+1
12fb0 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75  ]=='/' ) continu
12fc0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  e;.        if( z
12fd0 46 75 6c 6c 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26  Full[i+1]=='.' &
12fe0 26 20 7a 46 75 6c 6c 5b 69 2b 32 5d 3d 3d 27 2f  & zFull[i+2]=='/
12ff0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ' ){.          i
13000 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20   += 1;.         
13010 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
13020 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
13030 20 7a 46 75 6c 6c 5b 69 2b 31 5d 3d 3d 27 2e 27   zFull[i+1]=='.'
13040 20 26 26 20 7a 46 75 6c 6c 5b 69 2b 32 5d 3d 3d   && zFull[i+2]==
13050 27 2e 27 20 26 26 20 7a 46 75 6c 6c 5b 69 2b 33  '.' && zFull[i+3
13060 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
13070 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26      while( j>0 &
13080 26 20 7a 46 75 6c 6c 5b 6a 2d 31 5d 21 3d 27 2f  & zFull[j-1]!='/
13090 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20  ' ){ j--; }.    
130a0 20 20 20 20 20 20 69 20 2b 3d 20 33 3b 0a 20 20        i += 3;.  
130b0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
130c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
130d0 20 20 7d 0a 20 20 20 20 20 20 7a 46 75 6c 6c 5b    }.      zFull[
130e0 6a 2b 2b 5d 20 3d 20 7a 46 75 6c 6c 5b 69 5d 3b  j++] = zFull[i];
130f0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46 75 6c 6c  .    }.    zFull
13100 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  [j] = 0;.  }.#en
13110 64 69 66 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20  dif.}...#ifndef 
13120 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
13130 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a  _EXTENSION./*.**
13140 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20   Interfaces for 
13150 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64  opening a shared
13160 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e   library, findin
13170 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a  g entry points.*
13180 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61  * within the sha
13190 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64  red library, and
131a0 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61   closing the sha
131b0 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a  red library..*/.
131c0 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e  #include <dlfcn.
131d0 68 3e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  h>.static void *
131e0 75 6e 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74  unixDlOpen(sqlit
131f0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f  e3_vfs *pVfs, co
13200 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
13210 61 6d 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 64  ame){.  return d
13220 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c  lopen(zFilename,
13230 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44   RTLD_NOW | RTLD
13240 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 73 74 61 74  _GLOBAL);.}.stat
13250 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 45 72  ic void unixDlEr
13260 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
13270 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c  *pVfs, int nBuf,
13280 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b   char *zBufOut){
13290 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20  .  char *zErr;. 
132a0 20 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20   enterMutex();. 
132b0 20 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f 72 28   zErr = dlerror(
132c0 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b  );.  if( zErr ){
132d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
132e0 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66  rintf(nBuf, zBuf
132f0 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45 72 72 29  Out, "%s", zErr)
13300 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 6e 42 75  ;.  }else if(nBu
13310 66 3e 30 29 20 7b 0a 20 20 20 20 7a 42 75 66 4f  f>0) {.    zBufO
13320 75 74 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  ut[0] = '\0';.  
13330 7d 0a 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29  }.  leaveMutex()
13340 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
13350 2a 75 6e 69 78 44 6c 53 79 6d 28 73 71 6c 69 74  *unixDlSym(sqlit
13360 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f  e3_vfs *pVfs, vo
13370 69 64 20 2a 70 48 61 6e 64 6c 65 2c 20 63 6f 6e  id *pHandle, con
13380 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 62 6f 6c  st char *zSymbol
13390 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 6c 73 79  ){.  return dlsy
133a0 6d 28 70 48 61 6e 64 6c 65 2c 20 7a 53 79 6d 62  m(pHandle, zSymb
133b0 6f 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ol);.}.static vo
133c0 69 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73  id unixDlClose(s
133d0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
133e0 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29  , void *pHandle)
133f0 7b 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e  {.  dlclose(pHan
13400 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a  dle);.}.#else /*
13410 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
13420 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69  LOAD_EXTENSION i
13430 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20  s defined: */.  
13440 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70  #define unixDlOp
13450 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  en  0.  #define 
13460 75 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a 20 20  unixDlError 0.  
13470 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 53 79  #define unixDlSy
13480 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  m   0.  #define 
13490 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65  unixDlClose 0.#e
134a0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
134b0 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20  e nBuf bytes of 
134c0 72 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f 20 74  random data to t
134d0 68 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66  he supplied buff
134e0 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74  er zBuf..*/.stat
134f0 69 63 20 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f  ic int unixRando
13500 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66  mness(sqlite3_vf
13510 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75  s *pVfs, int nBu
13520 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
13530 0a 20 20 61 73 73 65 72 74 28 6e 42 75 66 3e 3d  .  assert(nBuf>=
13540 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29 2b  (sizeof(time_t)+
13550 73 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a 0a  sizeof(int)));..
13560 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20    /* We have to 
13570 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20  initialize zBuf 
13580 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72  to prevent valgr
13590 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69  ind from reporti
135a0 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20  ng.  ** errors. 
135b0 20 54 68 65 20 72 65 70 6f 72 74 73 20 69 73 73   The reports iss
135c0 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20  ued by valgrind 
135d0 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20  are incorrect - 
135e0 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72  we would.  ** pr
135f0 65 66 65 72 20 74 68 61 74 20 74 68 65 20 72 61  efer that the ra
13600 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72  ndomness be incr
13610 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20  eased by making 
13620 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  use of the.  ** 
13630 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70  uninitialized sp
13640 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75  ace in zBuf - bu
13650 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72  t valgrind error
13660 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a  s tend to worry.
13670 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e    ** some users.
13680 20 20 52 61 74 68 65 72 20 74 68 61 6e 20 61 72    Rather than ar
13690 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61  gue, it seems ea
136a0 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69  sier just to ini
136b0 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65  tialize.  ** the
136c0 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64   whole array and
136d0 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e   silence valgrin
136e0 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  d, even if that 
136f0 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f  means less rando
13700 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68  mness.  ** in th
13710 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20  e random seed.. 
13720 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65   **.  ** When te
13730 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a  sting, initializ
13740 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65  ing zBuf[] to ze
13750 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e  ro is all we do.
13760 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a    That means.  *
13770 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61 79 73  * that we always
13780 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 61   use the same ra
13790 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75  ndom number sequ
137a0 65 6e 63 65 2e 20 20 54 68 69 73 20 6d 61 6b 65  ence.  This make
137b0 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73  s the.  ** tests
137c0 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a   repeatable..  *
137d0 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c  /.  memset(zBuf,
137e0 20 30 2c 20 6e 42 75 66 29 3b 0a 23 69 66 20 21   0, nBuf);.#if !
137f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
13800 45 53 54 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74  EST).  {.    int
13810 20 70 69 64 2c 20 66 64 3b 0a 20 20 20 20 66 64   pid, fd;.    fd
13820 20 3d 20 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72   = open("/dev/ur
13830 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59  andom", O_RDONLY
13840 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20  );.    if( fd<0 
13850 29 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74 20  ){.      time_t 
13860 74 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26 74  t;.      time(&t
13870 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
13880 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66  zBuf, &t, sizeof
13890 28 74 29 29 3b 0a 20 20 20 20 20 20 70 69 64 20  (t));.      pid 
138a0 3d 20 67 65 74 70 69 64 28 29 3b 0a 20 20 20 20  = getpid();.    
138b0 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 73    memcpy(&zBuf[s
138c0 69 7a 65 6f 66 28 74 29 5d 2c 20 26 70 69 64 2c  izeof(t)], &pid,
138d0 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20   sizeof(pid));. 
138e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
138f0 72 65 61 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e  read(fd, zBuf, n
13900 42 75 66 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73  Buf);.      clos
13910 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e(fd);.    }.  }
13920 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
13930 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
13940 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20  /*.** Sleep for 
13950 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20  a little while. 
13960 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75   Return the amou
13970 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74  nt of time slept
13980 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  ..** The argumen
13990 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  t is the number 
139a0 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20  of microseconds 
139b0 77 65 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70  we want to sleep
139c0 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
139d0 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
139e0 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f  ber of microseco
139f0 6e 64 73 20 6f 66 20 73 6c 65 65 70 20 61 63 74  nds of sleep act
13a00 75 61 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74  ually.** request
13a10 65 64 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65  ed from the unde
13a20 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
13a30 20 73 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65   system, a numbe
13a40 72 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74  r which.** might
13a50 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
13a60 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
13a70 20 61 72 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e   argument, but n
13a80 6f 74 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20  ot less.** than 
13a90 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  the argument..*/
13aa0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
13ab0 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66  Sleep(sqlite3_vf
13ac0 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6d 69 63  s *pVfs, int mic
13ad0 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20  roseconds){.#if 
13ae0 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c  defined(HAVE_USL
13af0 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c  EEP) && HAVE_USL
13b00 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d 69 63  EEP.  usleep(mic
13b10 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20 72 65  roseconds);.  re
13b20 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64  turn microsecond
13b30 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 73  s;.#else.  int s
13b40 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73  econds = (micros
13b50 65 63 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f 31  econds+999999)/1
13b60 30 30 30 30 30 30 3b 0a 20 20 73 6c 65 65 70 28  000000;.  sleep(
13b70 73 65 63 6f 6e 64 73 29 3b 0a 20 20 72 65 74 75  seconds);.  retu
13b80 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30 30  rn seconds*10000
13b90 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  00;.#endif.}../*
13ba0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
13bb0 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73  g variable, if s
13bc0 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  et to a non-zero
13bd0 20 76 61 6c 75 65 2c 20 62 65 63 6f 6d 65 73 20   value, becomes 
13be0 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 72 65  the result.** re
13bf0 74 75 72 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  turned from sqli
13c00 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65  te3OsCurrentTime
13c10 28 29 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  ().  This is use
13c20 64 20 66 6f 72 20 74 65 73 74 69 6e 67 2e 0a 2a  d for testing..*
13c30 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
13c40 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
13c50 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20  _current_time = 
13c60 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
13c70 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
13c80 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
13c90 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
13ca0 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74   Time).  Write t
13cb0 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69  he.** current ti
13cc0 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
13cd0 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
13ce0 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61  er into *prNow a
13cf0 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20  nd.** return 0. 
13d00 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
13d10 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63   time and date c
13d20 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
13d30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
13d40 69 78 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71  ixCurrentTime(sq
13d50 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
13d60 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b   double *prNow){
13d70 0a 23 69 66 64 65 66 20 4e 4f 5f 47 45 54 54 4f  .#ifdef NO_GETTO
13d80 44 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20  D.  time_t t;.  
13d90 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70 72 4e  time(&t);.  *prN
13da0 6f 77 20 3d 20 74 2f 38 36 34 30 30 2e 30 20 2b  ow = t/86400.0 +
13db0 20 32 34 34 30 35 38 37 2e 35 3b 0a 23 65 6c 73   2440587.5;.#els
13dc0 65 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 76  e.  struct timev
13dd0 61 6c 20 73 4e 6f 77 3b 0a 20 20 67 65 74 74 69  al sNow;.  getti
13de0 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30  meofday(&sNow, 0
13df0 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 32 34  );.  *prNow = 24
13e00 34 30 35 38 37 2e 35 20 2b 20 73 4e 6f 77 2e 74  40587.5 + sNow.t
13e10 76 5f 73 65 63 2f 38 36 34 30 30 2e 30 20 2b 20  v_sec/86400.0 + 
13e20 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 38 36 34  sNow.tv_usec/864
13e30 30 30 30 30 30 30 30 30 2e 30 3b 0a 23 65 6e 64  00000000.0;.#end
13e40 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
13e50 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69  _TEST.  if( sqli
13e60 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
13e70 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d   ){.    *prNow =
13e80 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
13e90 5f 74 69 6d 65 2f 38 36 34 30 30 2e 30 20 2b 20  _time/86400.0 + 
13ea0 32 34 34 30 35 38 37 2e 35 3b 0a 20 20 7d 0a 23  2440587.5;.  }.#
13eb0 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 30  endif.  return 0
13ec0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
13ed0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
13ee0 68 65 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c  he sqlite3Defaul
13ef0 74 56 66 73 20 73 74 72 75 63 74 75 72 65 2e 20  tVfs structure. 
13f00 20 20 57 65 20 75 73 65 0a 2a 2a 20 61 20 66 75    We use.** a fu
13f10 6e 63 74 69 6f 6e 20 72 61 74 68 65 72 20 74 68  nction rather th
13f20 61 6e 20 67 69 76 65 20 74 68 65 20 73 74 72 75  an give the stru
13f30 63 74 75 72 65 20 67 6c 6f 62 61 6c 20 73 63 6f  cture global sco
13f40 70 65 20 62 65 63 61 75 73 65 0a 2a 2a 20 73 6f  pe because.** so
13f50 6d 65 20 63 6f 6d 70 69 6c 65 72 73 20 28 4d 53  me compilers (MS
13f60 56 43 29 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77  VC) do not allow
13f70 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   forward declara
13f80 74 69 6f 6e 73 20 6f 66 0a 2a 2a 20 69 6e 69 74  tions of.** init
13f90 69 61 6c 69 7a 65 64 20 73 74 72 75 63 74 75 72  ialized structur
13fa0 65 73 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76  es..*/.sqlite3_v
13fb0 66 73 20 2a 73 71 6c 69 74 65 33 4f 73 44 65 66  fs *sqlite3OsDef
13fc0 61 75 6c 74 56 66 73 28 76 6f 69 64 29 7b 0a 20  aultVfs(void){. 
13fd0 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f   static sqlite3_
13fe0 76 66 73 20 75 6e 69 78 56 66 73 20 3d 20 7b 0a  vfs unixVfs = {.
13ff0 20 20 20 20 31 2c 20 20 20 20 20 20 20 20 20 20      1,          
14000 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
14010 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f  ion */.    sizeo
14020 66 28 75 6e 69 78 46 69 6c 65 29 2c 20 20 20 2f  f(unixFile),   /
14030 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20  * szOsFile */.  
14040 20 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20    MAX_PATHNAME, 
14050 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e        /* mxPathn
14060 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ame */.    0,   
14070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14080 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22  * pNext */.    "
14090 75 6e 69 78 22 2c 20 20 20 20 20 20 20 20 20 20  unix",          
140a0 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20     /* zName */. 
140b0 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
140c0 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61         /* pAppDa
140d0 74 61 20 2a 2f 0a 20 20 0a 20 20 20 20 75 6e 69  ta */.  .    uni
140e0 78 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  xOpen,          
140f0 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20   /* xOpen */.   
14100 20 75 6e 69 78 44 65 6c 65 74 65 2c 20 20 20 20   unixDelete,    
14110 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20       /* xDelete 
14120 2a 2f 0a 20 20 20 20 75 6e 69 78 41 63 63 65 73  */.    unixAcces
14130 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41  s,         /* xA
14140 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 75 6e 69  ccess */.    uni
14150 78 47 65 74 54 65 6d 70 4e 61 6d 65 2c 20 20 20  xGetTempName,   
14160 20 2f 2a 20 78 47 65 74 54 65 6d 70 4e 61 6d 65   /* xGetTempName
14170 20 2a 2f 0a 20 20 20 20 75 6e 69 78 46 75 6c 6c   */.    unixFull
14180 50 61 74 68 6e 61 6d 65 2c 20 20 20 2f 2a 20 78  Pathname,   /* x
14190 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  FullPathname */.
141a0 20 20 20 20 75 6e 69 78 44 6c 4f 70 65 6e 2c 20      unixDlOpen, 
141b0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70          /* xDlOp
141c0 65 6e 20 2a 2f 0a 20 20 20 20 75 6e 69 78 44 6c  en */.    unixDl
141d0 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 2f 2a  Error,        /*
141e0 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20   xDlError */.   
141f0 20 75 6e 69 78 44 6c 53 79 6d 2c 20 20 20 20 20   unixDlSym,     
14200 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a       /* xDlSym *
14210 2f 0a 20 20 20 20 75 6e 69 78 44 6c 43 6c 6f 73  /.    unixDlClos
14220 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c  e,        /* xDl
14230 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 75 6e 69  Close */.    uni
14240 78 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20  xRandomness,    
14250 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20   /* xRandomness 
14260 2a 2f 0a 20 20 20 20 75 6e 69 78 53 6c 65 65 70  */.    unixSleep
14270 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53  ,          /* xS
14280 6c 65 65 70 20 2a 2f 0a 20 20 20 20 75 6e 69 78  leep */.    unix
14290 43 75 72 72 65 6e 74 54 69 6d 65 20 20 20 20 20  CurrentTime     
142a0 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20  /* xCurrentTime 
142b0 2a 2f 0a 20 20 7d 3b 0a 20 20 0a 20 20 72 65 74  */.  };.  .  ret
142c0 75 72 6e 20 26 75 6e 69 78 56 66 73 3b 0a 7d 0a  urn &unixVfs;.}.
142d0 20 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 55   .#endif /* OS_U
142e0 4e 49 58 20 2a 2f 0a                             NIX */.