/ Hex Artifact Content
Login

Artifact 8d4f5e952adcbd04276aa07bf8fc9865f3ba3bd3:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 55 6e 69 78 20 73 79 73  ific to Unix sys
01b0: 74 65 6d 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  tems..*/.#includ
01c0: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
01d0: 23 69 66 20 4f 53 5f 55 4e 49 58 20 20 20 20 20  #if OS_UNIX     
01e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
01f0: 20 66 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e   file is used on
0200: 20 75 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f   unix only */../
0210: 2a 20 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  * #define SQLITE
0220: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
0230: 53 54 59 4c 45 20 30 20 2a 2f 0a 0a 2f 2a 0a 2a  STYLE 0 */../*.*
0240: 2a 20 54 68 65 73 65 20 23 64 65 66 69 6e 65 73  * These #defines
0250: 20 73 68 6f 75 6c 64 20 65 6e 61 62 6c 65 20 3e   should enable >
0260: 32 47 42 20 66 69 6c 65 20 73 75 70 70 6f 72 74  2GB file support
0270: 20 6f 6e 20 50 6f 73 69 78 20 69 66 20 74 68 65   on Posix if the
0280: 0a 2a 2a 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f  .** underlying o
0290: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
02a0: 73 75 70 70 6f 72 74 73 20 69 74 2e 20 20 49 66  supports it.  If
02b0: 20 74 68 65 20 4f 53 20 6c 61 63 6b 73 0a 2a 2a   the OS lacks.**
02c0: 20 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70   large file supp
02d0: 6f 72 74 2c 20 74 68 65 73 65 20 73 68 6f 75 6c  ort, these shoul
02e0: 64 20 62 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2a 0a  d be no-ops..**.
02f0: 2a 2a 20 4c 61 72 67 65 20 66 69 6c 65 20 73 75  ** Large file su
0300: 70 70 6f 72 74 20 63 61 6e 20 62 65 20 64 69 73  pport can be dis
0310: 61 62 6c 65 64 20 75 73 69 6e 67 20 74 68 65 20  abled using the 
0320: 2d 44 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  -DSQLITE_DISABLE
0330: 5f 4c 46 53 20 73 77 69 74 63 68 0a 2a 2a 20 6f  _LFS switch.** o
0340: 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 63  n the compiler c
0350: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20 20 54 68  ommand line.  Th
0360: 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
0370: 69 66 20 79 6f 75 20 61 72 65 20 63 6f 6d 70 69  if you are compi
0380: 6c 69 6e 67 0a 2a 2a 20 6f 6e 20 61 20 72 65 63  ling.** on a rec
0390: 65 6e 74 20 6d 61 63 68 69 6e 65 20 28 65 78 3a  ent machine (ex:
03a0: 20 52 65 64 48 61 74 20 37 2e 32 29 20 62 75 74   RedHat 7.2) but
03b0: 20 79 6f 75 20 77 61 6e 74 20 79 6f 75 72 20 63   you want your c
03c0: 6f 64 65 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 6f  ode to work.** o
03d0: 6e 20 61 6e 20 6f 6c 64 65 72 20 6d 61 63 68 69  n an older machi
03e0: 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20 36  ne (ex: RedHat 6
03f0: 2e 30 29 2e 20 20 49 66 20 79 6f 75 20 63 6f 6d  .0).  If you com
0400: 70 69 6c 65 20 6f 6e 20 52 65 64 48 61 74 20 37  pile on RedHat 7
0410: 2e 32 0a 2a 2a 20 77 69 74 68 6f 75 74 20 74 68  .2.** without th
0420: 69 73 20 6f 70 74 69 6f 6e 2c 20 4c 46 53 20 69  is option, LFS i
0430: 73 20 65 6e 61 62 6c 65 2e 20 20 42 75 74 20 4c  s enable.  But L
0440: 46 53 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  FS does not exis
0450: 74 20 69 6e 20 74 68 65 20 6b 65 72 6e 65 6c 0a  t in the kernel.
0460: 2a 2a 20 69 6e 20 52 65 64 48 61 74 20 36 2e 30  ** in RedHat 6.0
0470: 2c 20 73 6f 20 74 68 65 20 63 6f 64 65 20 77 6f  , so the code wo
0480: 6e 27 74 20 77 6f 72 6b 2e 20 20 48 65 6e 63 65  n't work.  Hence
0490: 2c 20 66 6f 72 20 6d 61 78 69 6d 75 6d 20 62 69  , for maximum bi
04a0: 6e 61 72 79 0a 2a 2a 20 70 6f 72 74 61 62 69 6c  nary.** portabil
04b0: 69 74 79 20 79 6f 75 20 73 68 6f 75 6c 64 20 6f  ity you should o
04c0: 6d 69 74 20 4c 46 53 2e 0a 2a 2f 0a 23 69 66 6e  mit LFS..*/.#ifn
04d0: 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
04e0: 4c 45 5f 4c 46 53 0a 23 20 64 65 66 69 6e 65 20  LE_LFS.# define 
04f0: 5f 4c 41 52 47 45 5f 46 49 4c 45 20 20 20 20 20  _LARGE_FILE     
0500: 20 20 31 0a 23 20 69 66 6e 64 65 66 20 5f 46 49    1.# ifndef _FI
0510: 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 0a 23  LE_OFFSET_BITS.#
0520: 20 20 20 64 65 66 69 6e 65 20 5f 46 49 4c 45 5f     define _FILE_
0530: 4f 46 46 53 45 54 5f 42 49 54 53 20 36 34 0a 23  OFFSET_BITS 64.#
0540: 20 65 6e 64 69 66 0a 23 20 64 65 66 69 6e 65 20   endif.# define 
0550: 5f 4c 41 52 47 45 46 49 4c 45 5f 53 4f 55 52 43  _LARGEFILE_SOURC
0560: 45 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  E 1.#endif../*.*
0570: 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 63 6c 75  * standard inclu
0580: 64 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a 23 69 6e  de files..*/.#in
0590: 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73  clude <sys/types
05a0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
05b0: 73 2f 73 74 61 74 2e 68 3e 0a 23 69 6e 63 6c 75  s/stat.h>.#inclu
05c0: 64 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 69 6e  de <fcntl.h>.#in
05d0: 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e  clude <unistd.h>
05e0: 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e  .#include <time.
05f0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
0600: 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  /time.h>.#includ
0610: 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69 66 64  e <errno.h>.#ifd
0620: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
0630: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23  _LOCKING_STYLE.#
0640: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63  include <sys/ioc
0650: 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  tl.h>.#include <
0660: 73 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 69 6e  sys/param.h>.#in
0670: 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6f 75 6e 74  clude <sys/mount
0680: 2e 68 3e 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .h>.#endif /* SQ
0690: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
06a0: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a  ING_STYLE */../*
06b0: 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 74 6f  .** If we are to
06c0: 20 62 65 20 74 68 72 65 61 64 2d 73 61 66 65 2c   be thread-safe,
06d0: 20 69 6e 63 6c 75 64 65 20 74 68 65 20 70 74 68   include the pth
06e0: 72 65 61 64 73 20 68 65 61 64 65 72 20 61 6e 64  reads header and
06f0: 20 64 65 66 69 6e 65 0a 2a 2a 20 74 68 65 20 53   define.** the S
0700: 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41  QLITE_UNIX_THREA
0710: 44 53 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66  DS macro..*/.#if
0720: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
0730: 46 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 70 74  FE.# include <pt
0740: 68 72 65 61 64 2e 68 3e 0a 23 20 64 65 66 69 6e  hread.h>.# defin
0750: 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48  e SQLITE_UNIX_TH
0760: 52 45 41 44 53 20 31 0a 23 65 6e 64 69 66 0a 0a  READS 1.#endif..
0770: 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 70 65  /*.** Default pe
0780: 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63  rmissions when c
0790: 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 66 69  reating a new fi
07a0: 6c 65 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  le.*/.#ifndef SQ
07b0: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
07c0: 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20  E_PERMISSIONS.# 
07d0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 45  define SQLITE_DE
07e0: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
07f0: 53 53 49 4f 4e 53 20 30 36 34 34 0a 23 65 6e 64  SSIONS 0644.#end
0800: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75  if../*.** Maximu
0810: 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 74 68  m supported path
0820: 2d 6c 65 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65 66  -length..*/.#def
0830: 69 6e 65 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ine MAX_PATHNAME
0840: 20 35 31 32 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   512.../*.** The
0850: 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
0860: 75 72 65 20 69 73 20 73 75 62 63 6c 61 73 73 20  ure is subclass 
0870: 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  of sqlite3_file 
0880: 73 70 65 63 69 66 69 63 20 66 6f 72 20 74 68 65  specific for the
0890: 20 75 6e 69 78 0a 2a 2a 20 70 72 6f 74 61 62 69   unix.** protabi
08a0: 6c 69 74 79 20 6c 61 79 65 72 2e 0a 2a 2f 0a 74  lity layer..*/.t
08b0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e  ypedef struct un
08c0: 69 78 46 69 6c 65 20 75 6e 69 78 46 69 6c 65 3b  ixFile unixFile;
08d0: 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65  .struct unixFile
08e0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f   {.  sqlite3_io_
08f0: 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70  methods const *p
0900: 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c 77 61  Method;  /* Alwa
0910: 79 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  ys the first ent
0920: 72 79 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ry */.#ifdef SQL
0930: 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e  ITE_TEST.  /* In
0940: 20 74 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72   test mode, incr
0950: 65 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66  ease the size of
0960: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
0970: 61 20 62 69 74 20 73 6f 20 74 68 61 74 20 0a 20  a bit so that . 
0980: 20 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72   ** it is larger
0990: 20 74 68 61 6e 20 74 68 65 20 73 74 72 75 63 74   than the struct
09a0: 20 43 72 61 73 68 46 69 6c 65 20 64 65 66 69 6e   CrashFile defin
09b0: 65 64 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20  ed in test6.c.. 
09c0: 20 2a 2f 0a 20 20 63 68 61 72 20 61 50 61 64 64   */.  char aPadd
09d0: 69 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a  ing[32];.#endif.
09e0: 20 20 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74    struct openCnt
09f0: 20 2a 70 4f 70 65 6e 3b 20 20 20 20 2f 2a 20 49   *pOpen;    /* I
0a00: 6e 66 6f 20 61 62 6f 75 74 20 61 6c 6c 20 6f 70  nfo about all op
0a10: 65 6e 20 66 64 27 73 20 6f 6e 20 74 68 69 73 20  en fd's on this 
0a20: 69 6e 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63  inode */.  struc
0a30: 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63  t lockInfo *pLoc
0a40: 6b 3b 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f  k;   /* Info abo
0a50: 75 74 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 69 73  ut locks on this
0a60: 20 69 6e 6f 64 65 20 2a 2f 0a 23 69 66 64 65 66   inode */.#ifdef
0a70: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
0a80: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 76  OCKING_STYLE.  v
0a90: 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oid *lockingCont
0aa0: 65 78 74 3b 20 20 20 20 20 2f 2a 20 4c 6f 63 6b  ext;     /* Lock
0ab0: 69 6e 67 20 73 74 79 6c 65 20 73 70 65 63 69 66  ing style specif
0ac0: 69 63 20 73 74 61 74 65 20 2a 2f 0a 23 65 6e 64  ic state */.#end
0ad0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
0ae0: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
0af0: 45 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20  E */.  int h;   
0b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b10: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
0b20: 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 75 6e 73  criptor */.  uns
0b30: 69 67 6e 65 64 20 63 68 61 72 20 6c 6f 63 6b 74  igned char lockt
0b40: 79 70 65 3b 20 20 20 2f 2a 20 54 68 65 20 74 79  ype;   /* The ty
0b50: 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64 20  pe of lock held 
0b60: 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20 20  on this fd */.  
0b70: 69 6e 74 20 64 69 72 66 64 3b 20 20 20 20 20 20  int dirfd;      
0b80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
0b90: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
0ba0: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 2a   the directory *
0bb0: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  /.#if SQLITE_THR
0bc0: 45 41 44 53 41 46 45 0a 20 20 70 74 68 72 65 61  EADSAFE.  pthrea
0bd0: 64 5f 74 20 74 69 64 3b 20 20 20 20 20 20 20 20  d_t tid;        
0be0: 20 20 20 20 2f 2a 20 54 68 65 20 74 68 72 65 61      /* The threa
0bf0: 64 20 74 68 61 74 20 22 6f 77 6e 73 22 20 74 68  d that "owns" th
0c00: 69 73 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 23  is unixFile */.#
0c10: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
0c20: 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61  Include code tha
0c30: 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61  t is common to a
0c40: 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a  ll os_*.c files.
0c50: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f  */.#include "os_
0c60: 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a  common.h"../*.**
0c70: 20 44 65 66 69 6e 65 20 76 61 72 69 6f 75 73 20   Define various 
0c80: 6d 61 63 72 6f 73 20 74 68 61 74 20 61 72 65 20  macros that are 
0c90: 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d  missing from som
0ca0: 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69  e systems..*/.#i
0cb0: 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c  fndef O_LARGEFIL
0cc0: 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52  E.# define O_LAR
0cd0: 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a  GEFILE 0.#endif.
0ce0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
0cf0: 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65  SABLE_LFS.# unde
0d00: 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20  f O_LARGEFILE.# 
0d10: 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49  define O_LARGEFI
0d20: 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e  LE 0.#endif.#ifn
0d30: 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23  def O_NOFOLLOW.#
0d40: 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c   define O_NOFOLL
0d50: 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e  OW 0.#endif.#ifn
0d60: 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64  def O_BINARY.# d
0d70: 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30  efine O_BINARY 0
0d80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0d90: 68 65 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65  he DJGPP compile
0da0: 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f  r environment lo
0db0: 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20  oks mostly like 
0dc0: 55 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20  Unix, but it.** 
0dd0: 6c 61 63 6b 73 20 74 68 65 20 66 63 6e 74 6c 28  lacks the fcntl(
0de0: 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20  ) system call.  
0df0: 53 6f 20 72 65 64 65 66 69 6e 65 20 66 63 6e 74  So redefine fcnt
0e00: 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d 65 74 68  l() to be someth
0e10: 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61  ing.** that alwa
0e20: 79 73 20 73 75 63 63 65 65 64 73 2e 20 20 54 68  ys succeeds.  Th
0e30: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f  is means that lo
0e40: 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f  cking does not o
0e50: 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a  ccur under.** DJ
0e60: 47 50 50 2e 20 20 42 75 74 20 69 74 27 73 20 44  GPP.  But it's D
0e70: 4f 53 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f  OS - what did yo
0e80: 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66  u expect?.*/.#if
0e90: 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 23 20  def __DJGPP__.# 
0ea0: 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 41 2c 42  define fcntl(A,B
0eb0: 2c 43 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,C) 0.#endif../*
0ec0: 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64 69 64  .** The threadid
0ed0: 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65 73 20   macro resolves 
0ee0: 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d 69 64  to the thread-id
0ef0: 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65 64 20   or to 0.  Used 
0f00: 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  for.** testing a
0f10: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
0f20: 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  y..*/.#if SQLITE
0f30: 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64 65 66  _THREADSAFE.#def
0f40: 69 6e 65 20 74 68 72 65 61 64 69 64 20 70 74 68  ine threadid pth
0f50: 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65 6c 73  read_self().#els
0f60: 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61 64  e.#define thread
0f70: 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  id 0.#endif../*.
0f80: 2a 2a 20 53 65 74 20 6f 72 20 63 68 65 63 6b 20  ** Set or check 
0f90: 74 68 65 20 75 6e 69 78 46 69 6c 65 2e 74 69 64  the unixFile.tid
0fa0: 20 66 69 65 6c 64 2e 20 20 54 68 69 73 20 66 69   field.  This fi
0fb0: 65 6c 64 20 69 73 20 73 65 74 20 77 68 65 6e 20  eld is set when 
0fc0: 61 6e 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 69  an unixFile.** i
0fd0: 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20  s first opened. 
0fe0: 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   All subsequent 
0ff0: 75 73 65 73 20 6f 66 20 74 68 65 20 75 6e 69 78  uses of the unix
1000: 46 69 6c 65 20 76 65 72 69 66 79 20 74 68 61 74  File verify that
1010: 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 74 68 72   the.** same thr
1020: 65 61 64 20 69 73 20 6f 70 65 72 61 74 69 6e 67  ead is operating
1030: 20 6f 6e 20 74 68 65 20 75 6e 69 78 46 69 6c 65   on the unixFile
1040: 2e 20 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e  .  Some operatin
1050: 67 20 73 79 73 74 65 6d 73 20 64 6f 0a 2a 2a 20  g systems do.** 
1060: 6e 6f 74 20 61 6c 6c 6f 77 20 6c 6f 63 6b 73 20  not allow locks 
1070: 74 6f 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e  to be overridden
1080: 20 62 79 20 6f 74 68 65 72 20 74 68 72 65 61 64   by other thread
1090: 73 20 61 6e 64 20 74 68 61 74 20 72 65 73 74 72  s and that restr
10a0: 69 63 74 69 6f 6e 0a 2a 2a 20 6d 65 61 6e 73 20  iction.** means 
10b0: 74 68 61 74 20 73 71 6c 69 74 65 33 2a 20 64 61  that sqlite3* da
10c0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20 63  tabase handles c
10d0: 61 6e 6e 6f 74 20 62 65 20 6d 6f 76 65 64 20 66  annot be moved f
10e0: 72 6f 6d 20 6f 6e 65 20 74 68 72 65 61 64 0a 2a  rom one thread.*
10f0: 2a 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20 54  * to another.  T
1100: 68 69 73 20 6c 6f 67 69 63 20 6d 61 6b 65 73 20  his logic makes 
1110: 73 75 72 65 20 61 20 75 73 65 72 20 64 6f 65 73  sure a user does
1120: 20 6e 6f 74 20 74 72 79 20 74 6f 20 64 6f 20 74   not try to do t
1130: 68 61 74 0a 2a 2a 20 62 79 20 6d 69 73 74 61 6b  hat.** by mistak
1140: 65 2e 0a 2a 2a 0a 2a 2a 20 56 65 72 73 69 6f 6e  e..**.** Version
1150: 20 33 2e 33 2e 31 20 28 32 30 30 36 2d 30 31 2d   3.3.1 (2006-01-
1160: 31 35 29 3a 20 20 75 6e 69 78 46 69 6c 65 20 63  15):  unixFile c
1170: 61 6e 20 62 65 20 6d 6f 76 65 64 20 66 72 6f 6d  an be moved from
1180: 20 6f 6e 65 20 74 68 72 65 61 64 20 74 6f 0a 2a   one thread to.*
1190: 2a 20 61 6e 6f 74 68 65 72 20 61 73 20 6c 6f 6e  * another as lon
11a0: 67 20 61 73 20 77 65 20 61 72 65 20 72 75 6e 6e  g as we are runn
11b0: 69 6e 67 20 6f 6e 20 61 20 73 79 73 74 65 6d 20  ing on a system 
11c0: 74 68 61 74 20 73 75 70 70 6f 72 74 73 20 74 68  that supports th
11d0: 72 65 61 64 73 0a 2a 2a 20 6f 76 65 72 72 69 64  reads.** overrid
11e0: 69 6e 67 20 65 61 63 68 20 6f 74 68 65 72 73 20  ing each others 
11f0: 6c 6f 63 6b 73 20 28 77 68 69 63 68 20 6e 6f 77  locks (which now
1200: 20 74 68 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e   the most common
1210: 20 62 65 68 61 76 69 6f 72 29 0a 2a 2a 20 6f 72   behavior).** or
1220: 20 69 66 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65   if no locks are
1230: 20 68 65 6c 64 2e 20 20 42 75 74 20 74 68 65 20   held.  But the 
1240: 75 6e 69 78 46 69 6c 65 2e 70 4c 6f 63 6b 20 66  unixFile.pLock f
1250: 69 65 6c 64 20 6e 65 65 64 73 20 74 6f 20 62 65  ield needs to be
1260: 0a 2a 2a 20 72 65 63 6f 6d 70 75 74 65 64 20 62  .** recomputed b
1270: 65 63 61 75 73 65 20 69 74 73 20 6b 65 79 20 69  ecause its key i
1280: 6e 63 6c 75 64 65 73 20 74 68 65 20 74 68 72 65  ncludes the thre
1290: 61 64 2d 69 64 2e 20 20 53 65 65 20 74 68 65 20  ad-id.  See the 
12a0: 0a 2a 2a 20 74 72 61 6e 73 66 65 72 4f 77 6e 65  .** transferOwne
12b0: 72 73 68 69 70 28 29 20 66 75 6e 63 74 69 6f 6e  rship() function
12c0: 20 62 65 6c 6f 77 20 66 6f 72 20 61 64 64 69 74   below for addit
12d0: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
12e0: 6e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  n.*/.#if SQLITE_
12f0: 54 48 52 45 41 44 53 41 46 45 0a 23 20 64 65 66  THREADSAFE.# def
1300: 69 6e 65 20 53 45 54 5f 54 48 52 45 41 44 49 44  ine SET_THREADID
1310: 28 58 29 20 20 20 28 58 29 2d 3e 74 69 64 20 3d  (X)   (X)->tid =
1320: 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a   pthread_self().
1330: 23 20 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 54  # define CHECK_T
1340: 48 52 45 41 44 49 44 28 58 29 20 28 74 68 72 65  HREADID(X) (thre
1350: 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f  adsOverrideEachO
1360: 74 68 65 72 73 4c 6f 63 6b 73 3d 3d 30 20 26 26  thersLocks==0 &&
1370: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
1380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
1390: 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28 28 58  pthread_equal((X
13a0: 29 2d 3e 74 69 64 2c 20 70 74 68 72 65 61 64 5f  )->tid, pthread_
13b0: 73 65 6c 66 28 29 29 29 0a 23 65 6c 73 65 0a 23  self())).#else.#
13c0: 20 64 65 66 69 6e 65 20 53 45 54 5f 54 48 52 45   define SET_THRE
13d0: 41 44 49 44 28 58 29 0a 23 20 64 65 66 69 6e 65  ADID(X).# define
13e0: 20 43 48 45 43 4b 5f 54 48 52 45 41 44 49 44 28   CHECK_THREADID(
13f0: 58 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  X) 0.#endif../*.
1400: 2a 2a 20 48 65 72 65 20 69 73 20 74 68 65 20 64  ** Here is the d
1410: 69 72 74 20 6f 6e 20 50 4f 53 49 58 20 61 64 76  irt on POSIX adv
1420: 69 73 6f 72 79 20 6c 6f 63 6b 73 3a 20 20 41 4e  isory locks:  AN
1430: 53 49 20 53 54 44 20 31 30 30 33 2e 31 20 28 31  SI STD 1003.1 (1
1440: 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20  996).** section 
1450: 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38  6.5.2.2 lines 48
1460: 33 20 74 68 72 6f 75 67 68 20 34 39 30 20 73 70  3 through 490 sp
1470: 65 63 69 66 79 20 74 68 61 74 20 77 68 65 6e 20  ecify that when 
1480: 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74  a process.** set
1490: 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c 6f  s or clears a lo
14a0: 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74 69  ck, that operati
14b0: 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79  on overrides any
14c0: 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74   prior locks set
14d0: 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65 20  .** by the same 
14e0: 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f 65  process.  It doe
14f0: 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79  s not explicitly
1500: 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68 69   say so, but thi
1510: 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61  s implies.** tha
1520: 74 20 69 74 20 6f 76 65 72 72 69 64 65 73 20 6c  t it overrides l
1530: 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68 65 20  ocks set by the 
1540: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73 69  same process usi
1550: 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a  ng a different.*
1560: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
1570: 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69  r.  Consider thi
1580: 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a  s test case:.**.
1590: 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 31  **       int fd1
15a0: 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31   = open("./file1
15b0: 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41  ", O_RDWR|O_CREA
15c0: 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20  T, 0644);.**    
15d0: 20 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70 65     int fd2 = ope
15e0: 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52  n("./file2", O_R
15f0: 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34  DWR|O_CREAT, 064
1600: 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73  4);.**.** Suppos
1610: 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f  e ./file1 and ./
1620: 66 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c 79  file2 are really
1630: 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 28   the same file (
1640: 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69  because.** one i
1650: 73 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d 62  s a hard or symb
1660: 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65  olic link to the
1670: 20 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66 20   other) then if 
1680: 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78  you set.** an ex
1690: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20  clusive lock on 
16a0: 66 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74 6f  fd1, then try to
16b0: 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76   get an exclusiv
16c0: 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32  e lock.** on fd2
16d0: 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20 77  , it works.  I w
16e0: 6f 75 6c 64 20 68 61 76 65 20 65 78 70 65 63 74  ould have expect
16f0: 65 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f  ed the second lo
1700: 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69  ck to.** fail si
1710: 6e 63 65 20 74 68 65 72 65 20 77 61 73 20 61 6c  nce there was al
1720: 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20  ready a lock on 
1730: 74 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f 20  the file due to 
1740: 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20  fd1..** But not 
1750: 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68 20  so.  Since both 
1760: 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20  locks came from 
1770: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
1780: 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20  , the.** second 
1790: 6f 76 65 72 72 69 64 65 73 20 74 68 65 20 66 69  overrides the fi
17a0: 72 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  rst, even though
17b0: 20 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64 69   they were on di
17c0: 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20  fferent.** file 
17d0: 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e  descriptors open
17e0: 65 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 20  ed on different 
17f0: 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a  file names..**.*
1800: 2a 20 42 75 6d 6d 65 72 2e 20 20 49 66 20 79 6f  * Bummer.  If yo
1810: 75 20 61 73 6b 20 6d 65 2c 20 74 68 69 73 20 69  u ask me, this i
1820: 73 20 62 72 6f 6b 65 6e 2e 20 20 42 61 64 6c 79  s broken.  Badly
1830: 20 62 72 6f 6b 65 6e 2e 20 20 49 74 20 6d 65 61   broken.  It mea
1840: 6e 73 0a 2a 2a 20 74 68 61 74 20 77 65 20 63 61  ns.** that we ca
1850: 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49 58 20 6c  nnot use POSIX l
1860: 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e  ocks to synchron
1870: 69 7a 65 20 66 69 6c 65 20 61 63 63 65 73 73 20  ize file access 
1880: 61 6d 6f 6e 67 0a 2a 2a 20 63 6f 6d 70 65 74 69  among.** competi
1890: 6e 67 20 74 68 72 65 61 64 73 20 6f 66 20 74 68  ng threads of th
18a0: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20  e same process. 
18b0: 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c   POSIX locks wil
18c0: 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74  l work fine.** t
18d0: 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63  o synchronize ac
18e0: 63 65 73 73 20 66 6f 72 20 74 68 72 65 61 64 73  cess for threads
18f0: 20 69 6e 20 73 65 70 61 72 61 74 65 20 70 72 6f   in separate pro
1900: 63 65 73 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a  cesses, but not.
1910: 2a 2a 20 74 68 72 65 61 64 73 20 77 69 74 68 69  ** threads withi
1920: 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  n the same proce
1930: 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72  ss..**.** To wor
1940: 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 70 72 6f  k around the pro
1950: 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20 68 61 73  blem, SQLite has
1960: 20 74 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65 20   to manage file 
1970: 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79  locks internally
1980: 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20  .** on its own. 
1990: 20 57 68 65 6e 65 76 65 72 20 61 20 6e 65 77 20   Whenever a new 
19a0: 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
19b0: 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66  ed, we have to f
19c0: 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70 65 63 69  ind the.** speci
19d0: 66 69 63 20 69 6e 6f 64 65 20 6f 66 20 74 68 65  fic inode of the
19e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
19f0: 74 68 65 20 69 6e 6f 64 65 20 69 73 20 64 65 74  the inode is det
1a00: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 0a 2a  ermined by the.*
1a10: 2a 20 73 74 5f 64 65 76 20 61 6e 64 20 73 74 5f  * st_dev and st_
1a20: 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68  ino fields of th
1a30: 65 20 73 74 61 74 20 73 74 72 75 63 74 75 72 65  e stat structure
1a40: 20 74 68 61 74 20 66 73 74 61 74 28 29 20 66 69   that fstat() fi
1a50: 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63  lls in).** and c
1a60: 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61  heck for locks a
1a70: 6c 72 65 61 64 79 20 65 78 69 73 74 69 6e 67 20  lready existing 
1a80: 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65 2e 20 20  on that inode.  
1a90: 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a  When locks are.*
1aa0: 2a 20 63 72 65 61 74 65 64 20 6f 72 20 72 65 6d  * created or rem
1ab0: 6f 76 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f  oved, we have to
1ac0: 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e   look at our own
1ad0: 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64   internal record
1ae0: 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73   of the.** locks
1af0: 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68   to see if anoth
1b00: 65 72 20 74 68 72 65 61 64 20 68 61 73 20 70 72  er thread has pr
1b10: 65 76 69 6f 75 73 6c 79 20 73 65 74 20 61 20 6c  eviously set a l
1b20: 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d 65  ock on that same
1b30: 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a  .** inode..**.**
1b40: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   The sqlite3_fil
1b50: 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  e structure for 
1b60: 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67  POSIX is no long
1b70: 65 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65 67  er just an integ
1b80: 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72  er file.** descr
1b90: 69 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f  iptor.  It is no
1ba0: 77 20 61 20 73 74 72 75 63 74 75 72 65 20 74 68  w a structure th
1bb0: 61 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e 74  at holds the int
1bc0: 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73  eger file.** des
1bd0: 63 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70 6f  criptor and a po
1be0: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75 63  inter to a struc
1bf0: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
1c00: 62 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  bes the internal
1c10: 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  .** locks on the
1c20: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69   corresponding i
1c30: 6e 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73 20  node.  There is 
1c40: 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  one locking stru
1c50: 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f  cture.** per ino
1c60: 64 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73 61  de, so if the sa
1c70: 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e  me inode is open
1c80: 65 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20 75  ed twice, both u
1c90: 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
1ca0: 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74  es.** point to t
1cb0: 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20  he same locking 
1cc0: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
1cd0: 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
1ce0: 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65 66  e keeps.** a ref
1cf0: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f  erence count (so
1d00: 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68   we will know wh
1d10: 65 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74 29  en to delete it)
1d20: 20 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20   and a "cnt".** 
1d30: 66 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c 73  field that tells
1d40: 20 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61 6c   us its internal
1d50: 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20 63   lock status.  c
1d60: 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a  nt==0 means the.
1d70: 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  ** file is unloc
1d80: 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65  ked.  cnt==-1 me
1d90: 61 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61 73  ans the file has
1da0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
1db0: 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61  ck..** cnt>0 mea
1dc0: 6e 73 20 74 68 65 72 65 20 61 72 65 20 63 6e 74  ns there are cnt
1dd0: 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e   shared locks on
1de0: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
1df0: 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
1e00: 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61  lock or unlock a
1e10: 20 66 69 6c 65 20 66 69 72 73 74 20 63 68 65 63   file first chec
1e20: 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a  ks the locking.*
1e30: 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  * structure.  Th
1e40: 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d  e fcntl() system
1e50: 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e   call is only in
1e60: 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20 0a  voked to set a .
1e70: 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66  ** POSIX lock if
1e80: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f   the internal lo
1e90: 63 6b 20 73 74 72 75 63 74 75 72 65 20 74 72 61  ck structure tra
1ea0: 6e 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65 6e  nsitions between
1eb0: 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64  .** a locked and
1ec0: 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61   an unlocked sta
1ed0: 74 65 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 34 2d 4a  te..**.** 2004-J
1ee0: 61 6e 2d 31 31 3a 0a 2a 2a 20 4d 6f 72 65 20 72  an-11:.** More r
1ef0: 65 63 65 6e 74 20 64 69 73 63 6f 76 65 72 69 65  ecent discoverie
1f00: 73 20 61 62 6f 75 74 20 50 4f 53 49 58 20 61 64  s about POSIX ad
1f10: 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 20 20 28  visory locks.  (
1f20: 54 68 65 20 6d 6f 72 65 0a 2a 2a 20 49 20 64 69  The more.** I di
1f30: 73 63 6f 76 65 72 2c 20 74 68 65 20 6d 6f 72 65  scover, the more
1f40: 20 49 20 72 65 61 6c 69 7a 65 20 74 68 65 20 61   I realize the a
1f50: 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20   POSIX advisory 
1f60: 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 61 6e 20  locks are.** an 
1f70: 61 62 6f 6d 69 6e 61 74 69 6f 6e 2e 29 0a 2a 2a  abomination.).**
1f80: 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73 65  .** If you close
1f90: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
1fa0: 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74  or that points t
1fb0: 6f 20 61 20 66 69 6c 65 20 74 68 61 74 20 68 61  o a file that ha
1fc0: 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20  s locks,.** all 
1fd0: 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20 66 69  locks on that fi
1fe0: 6c 65 20 74 68 61 74 20 61 72 65 20 6f 77 6e 65  le that are owne
1ff0: 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74  d by the current
2000: 20 70 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20   process are.** 
2010: 72 65 6c 65 61 73 65 64 2e 20 20 54 6f 20 77 6f  released.  To wo
2020: 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70  rk around this p
2030: 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69  roblem, each uni
2040: 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20  xFile structure 
2050: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 70 6f  contains.** a po
2060: 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 65 6e  inter to an open
2070: 43 6e 74 20 73 74 72 75 63 74 75 72 65 2e 20 20  Cnt structure.  
2080: 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6f 70 65  There is one ope
2090: 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 0a 2a  nCnt structure.*
20a0: 2a 20 70 65 72 20 6f 70 65 6e 20 69 6e 6f 64 65  * per open inode
20b0: 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68  , which means th
20c0: 61 74 20 6d 75 6c 74 69 70 6c 65 20 75 6e 69 78  at multiple unix
20d0: 46 69 6c 65 20 63 61 6e 20 70 6f 69 6e 74 20 74  File can point t
20e0: 6f 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 6f 70  o a single.** op
20f0: 65 6e 43 6e 74 2e 20 20 57 68 65 6e 20 61 6e 20  enCnt.  When an 
2100: 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
2110: 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78  to close an unix
2120: 46 69 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61  File, if there a
2130: 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78  re.** other unix
2140: 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65  File open on the
2150: 20 73 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74   same inode that
2160: 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63   are holding loc
2170: 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20  ks, the call.** 
2180: 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66  to close() the f
2190: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
21a0: 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c  s deferred until
21b0: 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b   all of the lock
21c0: 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20  s clear..** The 
21d0: 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72  openCnt structur
21e0: 65 20 6b 65 65 70 73 20 61 20 6c 69 73 74 20 6f  e keeps a list o
21f0: 66 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  f file descripto
2200: 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a  rs that need to.
2210: 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64  ** be closed and
2220: 20 74 68 61 74 20 6c 69 73 74 20 69 73 20 77 61   that list is wa
2230: 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65 61 72 65  lked (and cleare
2240: 64 29 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  d) when the last
2250: 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e   lock.** clears.
2260: 0a 2a 2a 0a 2a 2a 20 46 69 72 73 74 2c 20 75 6e  .**.** First, un
2270: 64 65 72 20 4c 69 6e 75 78 20 74 68 72 65 61 64  der Linux thread
2280: 73 2c 20 62 65 63 61 75 73 65 20 65 61 63 68 20  s, because each 
2290: 74 68 72 65 61 64 20 68 61 73 20 61 20 73 65 70  thread has a sep
22a0: 61 72 61 74 65 0a 2a 2a 20 70 72 6f 63 65 73 73  arate.** process
22b0: 20 49 44 2c 20 6c 6f 63 6b 20 6f 70 65 72 61 74   ID, lock operat
22c0: 69 6f 6e 73 20 69 6e 20 6f 6e 65 20 74 68 72 65  ions in one thre
22d0: 61 64 20 64 6f 20 6e 6f 74 20 6f 76 65 72 72 69  ad do not overri
22e0: 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 74 6f 20 74  de locks.** to t
22f0: 68 65 20 73 61 6d 65 20 66 69 6c 65 20 69 6e 20  he same file in 
2300: 6f 74 68 65 72 20 74 68 72 65 61 64 73 2e 20 20  other threads.  
2310: 4c 69 6e 75 78 20 74 68 72 65 61 64 73 20 62 65  Linux threads be
2320: 68 61 76 65 20 6c 69 6b 65 0a 2a 2a 20 73 65 70  have like.** sep
2330: 61 72 61 74 65 20 70 72 6f 63 65 73 73 65 73 20  arate processes 
2340: 69 6e 20 74 68 69 73 20 72 65 73 70 65 63 74 2e  in this respect.
2350: 20 20 42 75 74 2c 20 69 66 20 79 6f 75 20 63 6c    But, if you cl
2360: 6f 73 65 20 61 20 66 69 6c 65 0a 2a 2a 20 64 65  ose a file.** de
2370: 73 63 72 69 70 74 6f 72 20 69 6e 20 6c 69 6e 75  scriptor in linu
2380: 78 20 74 68 72 65 61 64 73 2c 20 61 6c 6c 20 6c  x threads, all l
2390: 6f 63 6b 73 20 61 72 65 20 63 6c 65 61 72 65 64  ocks are cleared
23a0: 2c 20 65 76 65 6e 20 6c 6f 63 6b 73 0a 2a 2a 20  , even locks.** 
23b0: 6f 6e 20 6f 74 68 65 72 20 74 68 72 65 61 64 73  on other threads
23c0: 20 61 6e 64 20 65 76 65 6e 20 74 68 6f 75 67 68   and even though
23d0: 20 74 68 65 20 6f 74 68 65 72 20 74 68 72 65 61   the other threa
23e0: 64 73 20 68 61 76 65 20 64 69 66 66 65 72 65 6e  ds have differen
23f0: 74 0a 2a 2a 20 70 72 6f 63 65 73 73 20 49 44 73  t.** process IDs
2400: 2e 20 20 4c 69 6e 75 78 20 74 68 72 65 61 64 73  .  Linux threads
2410: 20 69 73 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   is inconsistent
2420: 20 69 6e 20 74 68 69 73 20 72 65 73 70 65 63 74   in this respect
2430: 2e 0a 2a 2a 20 28 49 27 6d 20 62 65 67 69 6e 6e  ..** (I'm beginn
2440: 69 6e 67 20 74 6f 20 74 68 69 6e 6b 20 74 68 61  ing to think tha
2450: 74 20 6c 69 6e 75 78 20 74 68 72 65 61 64 73 20  t linux threads 
2460: 69 73 20 61 6e 20 61 62 6f 6d 69 6e 61 74 69 6f  is an abominatio
2470: 6e 20 74 6f 6f 2e 29 0a 2a 2a 20 54 68 65 20 63  n too.).** The c
2480: 6f 6e 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68  onsequence of th
2490: 69 73 20 61 6c 6c 20 69 73 20 74 68 61 74 20 74  is all is that t
24a0: 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 66 6f  he hash table fo
24b0: 72 20 74 68 65 20 6c 6f 63 6b 49 6e 66 6f 0a 2a  r the lockInfo.*
24c0: 2a 20 73 74 72 75 63 74 75 72 65 20 68 61 73 20  * structure has 
24d0: 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 70  to include the p
24e0: 72 6f 63 65 73 73 20 69 64 20 61 73 20 70 61 72  rocess id as par
24f0: 74 20 6f 66 20 69 74 73 20 6b 65 79 20 62 65 63  t of its key bec
2500: 61 75 73 65 0a 2a 2a 20 6c 6f 63 6b 73 20 69 6e  ause.** locks in
2510: 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65 61   different threa
2520: 64 73 20 61 72 65 20 74 72 65 61 74 65 64 20 61  ds are treated a
2530: 73 20 64 69 73 74 69 6e 63 74 2e 20 20 42 75 74  s distinct.  But
2540: 20 74 68 65 20 0a 2a 2a 20 6f 70 65 6e 43 6e 74   the .** openCnt
2550: 20 73 74 72 75 63 74 75 72 65 20 73 68 6f 75 6c   structure shoul
2560: 64 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68  d not include th
2570: 65 20 70 72 6f 63 65 73 73 20 69 64 20 69 6e 20  e process id in 
2580: 69 74 73 0a 2a 2a 20 6b 65 79 20 62 65 63 61 75  its.** key becau
2590: 73 65 20 63 6c 6f 73 65 28 29 20 63 6c 65 61 72  se close() clear
25a0: 73 20 6c 6f 63 6b 20 6f 6e 20 61 6c 6c 20 74 68  s lock on all th
25b0: 72 65 61 64 73 2c 20 6e 6f 74 20 6a 75 73 74 20  reads, not just 
25c0: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74  the current.** t
25d0: 68 72 65 61 64 2e 20 20 57 65 72 65 20 69 74 20  hread.  Were it 
25e0: 6e 6f 74 20 66 6f 72 20 74 68 69 73 20 67 6f 6f  not for this goo
25f0: 66 69 6e 65 73 73 20 69 6e 20 6c 69 6e 75 78 20  finess in linux 
2600: 74 68 72 65 61 64 73 2c 20 77 65 20 63 6f 75 6c  threads, we coul
2610: 64 0a 2a 2a 20 63 6f 6d 62 69 6e 65 20 74 68 65  d.** combine the
2620: 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 6f 70   lockInfo and op
2630: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 73  enCnt structures
2640: 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 73   into a single s
2650: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
2660: 32 30 30 34 2d 4a 75 6e 2d 32 38 3a 0a 2a 2a 20  2004-Jun-28:.** 
2670: 4f 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73  On some versions
2680: 20 6f 66 20 6c 69 6e 75 78 2c 20 74 68 72 65 61   of linux, threa
2690: 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20  ds can override 
26a0: 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b  each others lock
26b0: 73 2e 0a 2a 2a 20 4f 6e 20 6f 74 68 65 72 73 20  s..** On others 
26c0: 6e 6f 74 2e 20 20 53 6f 6d 65 74 69 6d 65 73 20  not.  Sometimes 
26d0: 79 6f 75 20 63 61 6e 20 63 68 61 6e 67 65 20 74  you can change t
26e0: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 6e 20 74  he behavior on t
26f0: 68 65 20 73 61 6d 65 0a 2a 2a 20 73 79 73 74 65  he same.** syste
2700: 6d 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  m by setting the
2710: 20 4c 44 5f 41 53 53 55 4d 45 5f 4b 45 52 4e 45   LD_ASSUME_KERNE
2720: 4c 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  L environment va
2730: 72 69 61 62 6c 65 2e 20 20 54 68 65 0a 2a 2a 20  riable.  The.** 
2740: 50 4f 53 49 58 20 73 74 61 6e 64 61 72 64 20 69  POSIX standard i
2750: 73 20 73 69 6c 65 6e 74 20 61 73 20 74 6f 20 77  s silent as to w
2760: 68 69 63 68 20 62 65 68 61 76 69 6f 72 20 69 73  hich behavior is
2770: 20 63 6f 72 72 65 63 74 2c 20 61 73 20 66 61 72   correct, as far
2780: 0a 2a 2a 20 61 73 20 49 20 63 61 6e 20 74 65 6c  .** as I can tel
2790: 6c 2c 20 73 6f 20 6f 74 68 65 72 20 76 65 72 73  l, so other vers
27a0: 69 6f 6e 73 20 6f 66 20 75 6e 69 78 20 6d 69 67  ions of unix mig
27b0: 68 74 20 73 68 6f 77 20 74 68 65 20 73 61 6d 65  ht show the same
27c0: 0a 2a 2a 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63  .** inconsistenc
27d0: 79 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  y.  There is no 
27e0: 6c 69 74 74 6c 65 20 64 6f 75 62 74 20 69 6e 20  little doubt in 
27f0: 6d 79 20 6d 69 6e 64 20 74 68 61 74 20 70 6f 73  my mind that pos
2800: 69 78 0a 2a 2a 20 61 64 76 69 73 6f 72 79 20 6c  ix.** advisory l
2810: 6f 63 6b 73 20 61 6e 64 20 6c 69 6e 75 78 20 74  ocks and linux t
2820: 68 72 65 61 64 73 20 61 72 65 20 70 72 6f 66 6f  hreads are profo
2830: 75 6e 64 6c 79 20 62 72 6f 6b 65 6e 2e 0a 2a 2a  undly broken..**
2840: 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  .** To work arou
2850: 6e 64 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  nd the inconsist
2860: 65 6e 63 69 65 73 2c 20 77 65 20 68 61 76 65 20  encies, we have 
2870: 74 6f 20 74 65 73 74 20 61 74 20 72 75 6e 74 69  to test at runti
2880: 6d 65 20 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f  me .** whether o
2890: 72 20 6e 6f 74 20 74 68 72 65 61 64 73 20 63 61  r not threads ca
28a0: 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20  n override each 
28b0: 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 20 20 54  others locks.  T
28c0: 68 69 73 20 74 65 73 74 0a 2a 2a 20 69 73 20 72  his test.** is r
28d0: 75 6e 20 6f 6e 63 65 2c 20 74 68 65 20 66 69 72  un once, the fir
28e0: 73 74 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b  st time any lock
28f0: 20 69 73 20 61 74 74 65 6d 70 74 65 64 2e 20 20   is attempted.  
2900: 41 20 73 74 61 74 69 63 20 0a 2a 2a 20 76 61 72  A static .** var
2910: 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20  iable is set to 
2920: 72 65 63 6f 72 64 20 74 68 65 20 72 65 73 75 6c  record the resul
2930: 74 73 20 6f 66 20 74 68 69 73 20 74 65 73 74 20  ts of this test 
2940: 66 6f 72 20 66 75 74 75 72 65 0a 2a 2a 20 75 73  for future.** us
2950: 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  e..*/../*.** An 
2960: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
2970: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
2980: 75 72 65 20 73 65 72 76 65 73 20 61 73 20 74 68  ure serves as th
2990: 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f  e key used.** to
29a0: 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69 63   locate a partic
29b0: 75 6c 61 72 20 6c 6f 63 6b 49 6e 66 6f 20 73 74  ular lockInfo st
29c0: 72 75 63 74 75 72 65 20 67 69 76 65 6e 20 69 74  ructure given it
29d0: 73 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49  s inode..**.** I
29e0: 66 20 74 68 72 65 61 64 73 20 63 61 6e 6e 6f 74  f threads cannot
29f0: 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f   override each o
2a00: 74 68 65 72 73 20 6c 6f 63 6b 73 2c 20 74 68 65  thers locks, the
2a10: 6e 20 77 65 20 73 65 74 20 74 68 65 0a 2a 2a 20  n we set the.** 
2a20: 6c 6f 63 6b 4b 65 79 2e 74 69 64 20 66 69 65 6c  lockKey.tid fiel
2a30: 64 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 20  d to the thread 
2a40: 49 44 2e 20 20 49 66 20 74 68 72 65 61 64 73 20  ID.  If threads 
2a50: 63 61 6e 20 6f 76 65 72 72 69 64 65 0a 2a 2a 20  can override.** 
2a60: 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b  each others lock
2a70: 73 20 74 68 65 6e 20 74 69 64 20 69 73 20 61 6c  s then tid is al
2a80: 77 61 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  ways set to zero
2a90: 2e 20 20 74 69 64 20 69 73 20 6f 6d 69 74 74 65  .  tid is omitte
2aa0: 64 0a 2a 2a 20 69 66 20 77 65 20 63 6f 6d 70 69  d.** if we compi
2ab0: 6c 65 20 77 69 74 68 6f 75 74 20 74 68 72 65 61  le without threa
2ac0: 64 69 6e 67 20 73 75 70 70 6f 72 74 2e 0a 2a 2f  ding support..*/
2ad0: 0a 73 74 72 75 63 74 20 6c 6f 63 6b 4b 65 79 20  .struct lockKey 
2ae0: 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20  {.  dev_t dev;  
2af0: 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 6e       /* Device n
2b00: 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 6f 5f 74  umber */.  ino_t
2b10: 20 69 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 49   ino;       /* I
2b20: 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23  node number */.#
2b30: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
2b40: 53 41 46 45 0a 20 20 70 74 68 72 65 61 64 5f 74  SAFE.  pthread_t
2b50: 20 74 69 64 3b 20 20 20 2f 2a 20 54 68 72 65 61   tid;   /* Threa
2b60: 64 20 49 44 20 6f 72 20 7a 65 72 6f 20 69 66 20  d ID or zero if 
2b70: 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72  threads can over
2b80: 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 20  ride each other 
2b90: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
2ba0: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
2bb0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2bc0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
2bd0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
2be0: 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 20 6f   open.** inode o
2bf0: 6e 20 65 61 63 68 20 74 68 72 65 61 64 20 77 69  n each thread wi
2c00: 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 70  th a different p
2c10: 72 6f 63 65 73 73 20 49 44 2e 20 20 28 54 68 72  rocess ID.  (Thr
2c20: 65 61 64 73 20 68 61 76 65 0a 2a 2a 20 64 69 66  eads have.** dif
2c30: 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 20 49  ferent process I
2c40: 44 73 20 6f 6e 20 6c 69 6e 75 78 2c 20 62 75 74  Ds on linux, but
2c50: 20 6e 6f 74 20 6f 6e 20 6d 6f 73 74 20 6f 74 68   not on most oth
2c60: 65 72 20 75 6e 69 78 65 73 2e 29 0a 2a 2a 0a 2a  er unixes.).**.*
2c70: 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65  * A single inode
2c80: 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70   can have multip
2c90: 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  le file descript
2ca0: 6f 72 73 2c 20 73 6f 20 65 61 63 68 20 75 6e 69  ors, so each uni
2cb0: 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75  xFile.** structu
2cc0: 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  re contains a po
2cd0: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74  inter to an inst
2ce0: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a  ance of this obj
2cf0: 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20  ect and this.** 
2d00: 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20 63  object keeps a c
2d10: 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62  ount of the numb
2d20: 65 72 20 6f 66 20 75 6e 69 78 46 69 6c 65 20 70  er of unixFile p
2d30: 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a  ointing to it..*
2d40: 2f 0a 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66  /.struct lockInf
2d50: 6f 20 7b 0a 20 20 73 74 72 75 63 74 20 6c 6f 63  o {.  struct loc
2d60: 6b 4b 65 79 20 6b 65 79 3b 20 20 2f 2a 20 54 68  kKey key;  /* Th
2d70: 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a  e lookup key */.
2d80: 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20    int cnt;      
2d90: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2da0: 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73   of SHARED locks
2db0: 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6c   held */.  int l
2dc0: 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20 20  ocktype;        
2dd0: 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52 45 44  /* One of SHARED
2de0: 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f  _LOCK, RESERVED_
2df0: 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 69  LOCK etc. */.  i
2e00: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
2e10: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2e20: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69   pointers to thi
2e30: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 7d  s structure */.}
2e40: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
2e50: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
2e60: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
2e70: 73 65 72 76 65 73 20 61 73 20 74 68 65 20 6b 65  serves as the ke
2e80: 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63  y used.** to loc
2e90: 61 74 65 20 61 20 70 61 72 74 69 63 75 6c 61 72  ate a particular
2ea0: 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75   openCnt structu
2eb0: 72 65 20 67 69 76 65 6e 20 69 74 73 20 69 6e 6f  re given its ino
2ec0: 64 65 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20  de.  This.** is 
2ed0: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
2ee0: 6c 6f 63 6b 4b 65 79 20 65 78 63 65 70 74 20 74  lockKey except t
2ef0: 68 61 74 20 74 68 65 20 74 68 72 65 61 64 20 49  hat the thread I
2f00: 44 20 69 73 20 6f 6d 69 74 74 65 64 2e 0a 2a 2f  D is omitted..*/
2f10: 0a 73 74 72 75 63 74 20 6f 70 65 6e 4b 65 79 20  .struct openKey 
2f20: 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20  {.  dev_t dev;  
2f30: 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65   /* Device numbe
2f40: 72 20 2a 2f 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f  r */.  ino_t ino
2f50: 3b 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d  ;   /* Inode num
2f60: 62 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ber */.};../*.**
2f70: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
2f80: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
2f90: 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
2fa0: 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70  ated for each op
2fb0: 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 54 68  en.** inode.  Th
2fc0: 69 73 20 73 74 72 75 63 74 75 72 65 20 6b 65 65  is structure kee
2fd0: 70 73 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20  ps track of the 
2fe0: 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  number of locks 
2ff0: 6f 6e 20 74 68 61 74 0a 2a 2a 20 69 6e 6f 64 65  on that.** inode
3000: 2e 20 20 49 66 20 61 20 63 6c 6f 73 65 20 69 73  .  If a close is
3010: 20 61 74 74 65 6d 70 74 65 64 20 61 67 61 69 6e   attempted again
3020: 73 74 20 61 6e 20 69 6e 6f 64 65 20 74 68 61 74  st an inode that
3030: 20 69 73 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6c   is holding.** l
3040: 6f 63 6b 73 2c 20 74 68 65 20 63 6c 6f 73 65 20  ocks, the close 
3050: 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
3060: 6c 20 61 6c 6c 20 6c 6f 63 6b 73 20 63 6c 65 61  l all locks clea
3070: 72 20 62 79 20 61 64 64 69 6e 67 20 74 68 65 0a  r by adding the.
3080: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
3090: 6f 72 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20  or to be closed 
30a0: 74 6f 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c  to the pending l
30b0: 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6f  ist..*/.struct o
30c0: 70 65 6e 43 6e 74 20 7b 0a 20 20 73 74 72 75 63  penCnt {.  struc
30d0: 74 20 6f 70 65 6e 4b 65 79 20 6b 65 79 3b 20 20  t openKey key;  
30e0: 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b   /* The lookup k
30f0: 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  ey */.  int nRef
3100: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3110: 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   Number of point
3120: 65 72 73 20 74 6f 20 74 68 69 73 20 73 74 72 75  ers to this stru
3130: 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  cture */.  int n
3140: 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Lock;           
3150: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75   /* Number of ou
3160: 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 20  tstanding locks 
3170: 2a 2f 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e  */.  int nPendin
3180: 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  g;         /* Nu
3190: 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67 20  mber of pending 
31a0: 63 6c 6f 73 65 28 29 20 6f 70 65 72 61 74 69 6f  close() operatio
31b0: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65  ns */.  int *aPe
31c0: 6e 64 69 6e 67 3b 20 20 20 20 20 20 20 20 2f 2a  nding;        /*
31d0: 20 4d 61 6c 6c 6f 63 65 64 20 73 70 61 63 65 20   Malloced space 
31e0: 68 6f 6c 64 69 6e 67 20 66 64 27 73 20 61 77 61  holding fd's awa
31f0: 69 74 69 6e 67 20 61 20 63 6c 6f 73 65 28 29 20  iting a close() 
3200: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68  */.};../* .** Th
3210: 65 73 65 20 68 61 73 68 20 74 61 62 6c 65 73 20  ese hash tables 
3220: 6d 61 70 20 69 6e 6f 64 65 73 20 61 6e 64 20 66  map inodes and f
3230: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
3240: 28 72 65 61 6c 6c 79 2c 20 6c 6f 63 6b 4b 65 79  (really, lockKey
3250: 20 61 6e 64 0a 2a 2a 20 6f 70 65 6e 4b 65 79 20   and.** openKey 
3260: 73 74 72 75 63 74 75 72 65 73 29 20 69 6e 74 6f  structures) into
3270: 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 6f 70   lockInfo and op
3280: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 73  enCnt structures
3290: 2e 20 20 41 63 63 65 73 73 20 74 6f 20 0a 2a 2a  .  Access to .**
32a0: 20 74 68 65 73 65 20 68 61 73 68 20 74 61 62 6c   these hash tabl
32b0: 65 73 20 6d 75 73 74 20 62 65 20 70 72 6f 74 65  es must be prote
32c0: 63 74 65 64 20 62 79 20 61 20 6d 75 74 65 78 2e  cted by a mutex.
32d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 48 61 73 68 20  .*/.static Hash 
32e0: 6c 6f 63 6b 48 61 73 68 20 3d 20 7b 53 51 4c 49  lockHash = {SQLI
32f0: 54 45 5f 48 41 53 48 5f 42 49 4e 41 52 59 2c 20  TE_HASH_BINARY, 
3300: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 7d 3b 0a  0, 0, 0, 0, 0};.
3310: 73 74 61 74 69 63 20 48 61 73 68 20 6f 70 65 6e  static Hash open
3320: 48 61 73 68 20 3d 20 7b 53 51 4c 49 54 45 5f 48  Hash = {SQLITE_H
3330: 41 53 48 5f 42 49 4e 41 52 59 2c 20 30 2c 20 30  ASH_BINARY, 0, 0
3340: 2c 20 30 2c 20 30 2c 20 30 7d 3b 0a 0a 23 69 66  , 0, 0, 0};..#if
3350: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
3360: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
3370: 2f 2a 0a 2a 2a 20 54 68 65 20 6c 6f 63 6b 69 6e  /*.** The lockin
3380: 67 20 73 74 79 6c 65 73 20 61 72 65 20 61 73 73  g styles are ass
3390: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
33a0: 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 20   different file 
33b0: 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 61 70 61 62  locking.** capab
33c0: 69 6c 69 74 69 65 73 20 73 75 70 70 6f 72 74 65  ilities supporte
33d0: 64 20 62 79 20 64 69 66 66 65 72 65 6e 74 20 66  d by different f
33e0: 69 6c 65 20 73 79 73 74 65 6d 73 2e 20 20 0a 2a  ile systems.  .*
33f0: 2a 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 69  *.** POSIX locki
3400: 6e 67 20 73 74 79 6c 65 20 66 75 6c 6c 79 20 73  ng style fully s
3410: 75 70 70 6f 72 74 73 20 73 68 61 72 65 64 20 61  upports shared a
3420: 6e 64 20 65 78 63 6c 75 73 69 76 65 20 62 79 74  nd exclusive byt
3430: 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 0a 2a  e-range locks .*
3440: 2a 20 41 44 50 20 6c 6f 63 6b 69 6e 67 20 6f 6e  * ADP locking on
3450: 6c 79 20 73 75 70 70 6f 72 74 73 20 65 78 63 6c  ly supports excl
3460: 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67 65  usive byte-range
3470: 20 6c 6f 63 6b 73 0a 2a 2a 20 46 4c 4f 43 4b 20   locks.** FLOCK 
3480: 6f 6e 6c 79 20 73 75 70 70 6f 72 74 73 20 61 20  only supports a 
3490: 73 69 6e 67 6c 65 20 66 69 6c 65 2d 67 6c 6f 62  single file-glob
34a0: 61 6c 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  al exclusive loc
34b0: 6b 0a 2a 2a 20 44 4f 54 4c 4f 43 4b 20 69 73 6e  k.** DOTLOCK isn
34c0: 27 74 20 61 20 74 72 75 65 20 6c 6f 63 6b 69 6e  't a true lockin
34d0: 67 20 73 74 79 6c 65 2c 20 69 74 20 72 65 66 65  g style, it refe
34e0: 72 73 20 74 6f 20 74 68 65 20 75 73 65 20 6f 66  rs to the use of
34f0: 20 61 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20   a special.**   
3500: 66 69 6c 65 20 6e 61 6d 65 64 20 74 68 65 20 73  file named the s
3510: 61 6d 65 20 61 73 20 74 68 65 20 64 61 74 61 62  ame as the datab
3520: 61 73 65 20 66 69 6c 65 20 77 69 74 68 20 61 20  ase file with a 
3530: 27 2e 6c 6f 63 6b 27 20 65 78 74 65 6e 73 69 6f  '.lock' extensio
3540: 6e 2c 20 74 68 69 73 0a 2a 2a 20 20 20 63 61 6e  n, this.**   can
3550: 20 62 65 20 75 73 65 64 20 6f 6e 20 66 69 6c 65   be used on file
3560: 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 64 6f   systems that do
3570: 20 6e 6f 74 20 6f 66 66 65 72 20 61 6e 79 20 72   not offer any r
3580: 65 6c 69 61 62 6c 65 20 66 69 6c 65 20 6c 6f 63  eliable file loc
3590: 6b 69 6e 67 0a 2a 2a 20 4e 4f 20 6c 6f 63 6b 69  king.** NO locki
35a0: 6e 67 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f  ng means that no
35b0: 20 6c 6f 63 6b 69 6e 67 20 77 69 6c 6c 20 62 65   locking will be
35c0: 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73   attempted, this
35d0: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f   is only used fo
35e0: 72 0a 2a 2a 20 20 20 72 65 61 64 2d 6f 6e 6c 79  r.**   read-only
35f0: 20 66 69 6c 65 20 73 79 73 74 65 6d 73 20 63 75   file systems cu
3600: 72 72 65 6e 74 6c 79 0a 2a 2a 20 55 4e 53 55 50  rrently.** UNSUP
3610: 50 4f 52 54 45 44 20 6d 65 61 6e 73 20 74 68 61  PORTED means tha
3620: 74 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 77 69 6c  t no locking wil
3630: 6c 20 62 65 20 61 74 74 65 6d 70 74 65 64 2c 20  l be attempted, 
3640: 74 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73 65  this is only use
3650: 64 20 66 6f 72 0a 2a 2a 20 20 20 66 69 6c 65 20  d for.**   file 
3660: 73 79 73 74 65 6d 73 20 74 68 61 74 20 61 72 65  systems that are
3670: 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 75 6e 73   known to be uns
3680: 75 70 70 6f 72 74 65 64 0a 2a 2f 0a 74 79 70 65  upported.*/.type
3690: 64 65 66 20 65 6e 75 6d 20 7b 0a 20 20 20 20 20  def enum {.     
36a0: 20 20 20 70 6f 73 69 78 4c 6f 63 6b 69 6e 67 53     posixLockingS
36b0: 74 79 6c 65 20 3d 20 30 2c 20 20 20 20 20 20 20  tyle = 0,       
36c0: 2f 2a 20 73 74 61 6e 64 61 72 64 20 70 6f 73 69  /* standard posi
36d0: 78 2d 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  x-advisory locks
36e0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 66 70 4c   */.        afpL
36f0: 6f 63 6b 69 6e 67 53 74 79 6c 65 2c 20 20 20 20  ockingStyle,    
3700: 20 20 20 20 20 20 20 20 20 2f 2a 20 75 73 65 20           /* use 
3710: 61 66 70 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  afp locks */.   
3720: 20 20 20 20 20 66 6c 6f 63 6b 4c 6f 63 6b 69 6e       flockLockin
3730: 67 53 74 79 6c 65 2c 20 20 20 20 20 20 20 20 20  gStyle,         
3740: 20 20 2f 2a 20 75 73 65 20 66 6c 6f 63 6b 28 29    /* use flock()
3750: 20 2a 2f 0a 20 20 20 20 20 20 20 20 64 6f 74 6c   */.        dotl
3760: 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 2c  ockLockingStyle,
3770: 20 20 20 20 20 20 20 20 20 2f 2a 20 75 73 65 20           /* use 
3780: 3c 66 69 6c 65 3e 2e 6c 6f 63 6b 20 66 69 6c 65  <file>.lock file
3790: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 6f 4c  s */.        noL
37a0: 6f 63 6b 69 6e 67 53 74 79 6c 65 2c 20 20 20 20  ockingStyle,    
37b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 75 73 65            /* use
37c0: 66 75 6c 20 66 6f 72 20 72 65 61 64 2d 6f 6e 6c  ful for read-onl
37d0: 79 20 66 69 6c 65 20 73 79 73 74 65 6d 20 2a 2f  y file system */
37e0: 0a 20 20 20 20 20 20 20 20 75 6e 73 75 70 70 6f  .        unsuppo
37f0: 72 74 65 64 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  rtedLockingStyle
3800: 20 20 20 20 20 20 2f 2a 20 69 6e 64 69 63 61 74        /* indicat
3810: 65 73 20 75 6e 73 75 70 70 6f 72 74 65 64 20 66  es unsupported f
3820: 69 6c 65 20 73 79 73 74 65 6d 20 2a 2f 0a 7d 20  ile system */.} 
3830: 73 71 6c 69 74 65 33 4c 6f 63 6b 69 6e 67 53 74  sqlite3LockingSt
3840: 79 6c 65 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  yle;.#endif /* S
3850: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
3860: 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f  KING_STYLE */../
3870: 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
3880: 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20  tions to obtain 
3890: 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74  and relinquish t
38a0: 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e  he global mutex.
38b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
38c0: 65 6e 74 65 72 4d 75 74 65 78 28 29 7b 0a 20 20  enterMutex(){.  
38d0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
38e0: 74 65 72 28 73 71 6c 69 74 65 33 5f 6d 75 74 65  ter(sqlite3_mute
38f0: 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
3900: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
3910: 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ER));.}.static v
3920: 6f 69 64 20 6c 65 61 76 65 4d 75 74 65 78 28 29  oid leaveMutex()
3930: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
3940: 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 5f  x_leave(sqlite3_
3950: 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
3960: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
3970: 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 0a 23 69 66  MASTER));.}..#if
3980: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
3990: 46 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 61  FE./*.** This va
39a0: 72 69 61 62 6c 65 20 72 65 63 6f 72 64 73 20 77  riable records w
39b0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
39c0: 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69  reads can overri
39d0: 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 0a 2a  de each others.*
39e0: 2a 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 20  * locks..**.**  
39f0: 20 20 30 3a 20 20 4e 6f 2e 20 20 54 68 72 65 61    0:  No.  Threa
3a00: 64 73 20 63 61 6e 6e 6f 74 20 6f 76 65 72 72 69  ds cannot overri
3a10: 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c  de each others l
3a20: 6f 63 6b 73 2e 0a 2a 2a 20 20 20 20 31 3a 20 20  ocks..**    1:  
3a30: 59 65 73 2e 20 20 54 68 72 65 61 64 73 20 63 61  Yes.  Threads ca
3a40: 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20  n override each 
3a50: 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2a  others locks..**
3a60: 20 20 20 2d 31 3a 20 20 57 65 20 64 6f 6e 27 74     -1:  We don't
3a70: 20 6b 6e 6f 77 20 79 65 74 2e 0a 2a 2a 0a 2a 2a   know yet..**.**
3a80: 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   On some systems
3a90: 2c 20 77 65 20 6b 6e 6f 77 20 61 74 20 63 6f 6d  , we know at com
3aa0: 70 69 6c 65 2d 74 69 6d 65 20 69 66 20 74 68 72  pile-time if thr
3ab0: 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64  eads can overrid
3ac0: 65 20 65 61 63 68 0a 2a 2a 20 6f 74 68 65 72 73  e each.** others
3ad0: 20 6c 6f 63 6b 73 2e 20 20 4f 6e 20 74 68 6f 73   locks.  On thos
3ae0: 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65 20 53  e systems, the S
3af0: 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45  QLITE_THREAD_OVE
3b00: 52 52 49 44 45 5f 4c 4f 43 4b 20 6d 61 63 72 6f  RRIDE_LOCK macro
3b10: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 73 65 74 20  .** will be set 
3b20: 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 20  appropriately.  
3b30: 4f 6e 20 6f 74 68 65 72 20 73 79 73 74 65 6d 73  On other systems
3b40: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 63 68 65  , we have to che
3b50: 63 6b 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65  ck at.** runtime
3b60: 2e 20 20 4f 6e 20 74 68 65 73 65 20 6c 61 74 74  .  On these latt
3b70: 65 72 20 73 79 73 74 65 6d 73 2c 20 53 51 4c 54  er systems, SQLT
3b80: 49 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49  IE_THREAD_OVERRI
3b90: 44 45 5f 4c 4f 43 4b 20 69 73 0a 2a 2a 20 75 6e  DE_LOCK is.** un
3ba0: 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  defined..**.** T
3bb0: 68 69 73 20 76 61 72 69 61 62 6c 65 20 6e 6f 72  his variable nor
3bc0: 6d 61 6c 6c 79 20 68 61 73 20 66 69 6c 65 20 73  mally has file s
3bd0: 63 6f 70 65 20 6f 6e 6c 79 2e 20 20 42 75 74 20  cope only.  But 
3be0: 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2c 20  during testing, 
3bf0: 77 65 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 61 20  we make.** it a 
3c00: 67 6c 6f 62 61 6c 20 73 6f 20 74 68 61 74 20 74  global so that t
3c10: 68 65 20 74 65 73 74 20 63 6f 64 65 20 63 61 6e  he test code can
3c20: 20 63 68 61 6e 67 65 20 69 74 73 20 76 61 6c 75   change its valu
3c30: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 76 65  e in order to ve
3c40: 72 69 66 79 0a 2a 2a 20 74 68 61 74 20 74 68 65  rify.** that the
3c50: 20 72 69 67 68 74 20 73 74 75 66 66 20 68 61 70   right stuff hap
3c60: 70 65 6e 73 20 69 6e 20 65 69 74 68 65 72 20 63  pens in either c
3c70: 61 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ase..*/.#ifndef 
3c80: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56  SQLITE_THREAD_OV
3c90: 45 52 52 49 44 45 5f 4c 4f 43 4b 0a 23 20 64 65  ERRIDE_LOCK.# de
3ca0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 48 52 45  fine SQLITE_THRE
3cb0: 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b  AD_OVERRIDE_LOCK
3cc0: 20 2d 31 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   -1.#endif.#ifde
3cd0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
3ce0: 74 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64  t threadsOverrid
3cf0: 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73  eEachOthersLocks
3d00: 20 3d 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44   = SQLITE_THREAD
3d10: 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a  _OVERRIDE_LOCK;.
3d20: 23 65 6c 73 65 0a 73 74 61 74 69 63 20 69 6e 74  #else.static int
3d30: 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65   threadsOverride
3d40: 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20  EachOthersLocks 
3d50: 3d 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f  = SQLITE_THREAD_
3d60: 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a 23  OVERRIDE_LOCK;.#
3d70: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
3d80: 73 20 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64  s structure hold
3d90: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61  s information pa
3da0: 73 73 65 64 20 69 6e 74 6f 20 69 6e 64 69 76 69  ssed into indivi
3db0: 64 75 61 6c 20 74 65 73 74 0a 2a 2a 20 74 68 72  dual test.** thr
3dc0: 65 61 64 73 20 62 79 20 74 68 65 20 74 65 73 74  eads by the test
3dd0: 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68  ThreadLockingBeh
3de0: 61 76 69 6f 72 28 29 20 72 6f 75 74 69 6e 65 2e  avior() routine.
3df0: 0a 2a 2f 0a 73 74 72 75 63 74 20 74 68 72 65 61  .*/.struct threa
3e00: 64 54 65 73 74 44 61 74 61 20 7b 0a 20 20 69 6e  dTestData {.  in
3e10: 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  t fd;           
3e20: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20       /* File to 
3e30: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 73  be locked */.  s
3e40: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
3e50: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63  ;     /* The loc
3e60: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 2a  king operation *
3e70: 2f 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 3b 20  /.  int result; 
3e80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
3e90: 73 75 6c 74 20 6f 66 20 74 68 65 20 6c 6f 63 6b  sult of the lock
3ea0: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ing operation */
3eb0: 0a 7d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .};..#ifdef SQLI
3ec0: 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a  TE_LOCK_TRACE./*
3ed0: 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20 69 6e  .** Print out in
3ee0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
3ef0: 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72  all locking oper
3f00: 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ations..**.** Th
3f10: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
3f20: 65 64 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68  ed for troublesh
3f30: 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20  ooting locks on 
3f40: 6d 75 6c 74 69 74 68 72 65 61 64 65 64 0a 2a 2a  multithreaded.**
3f50: 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61   platforms.  Ena
3f60: 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67  ble by compiling
3f70: 20 77 69 74 68 20 74 68 65 20 2d 44 53 51 4c 49   with the -DSQLI
3f80: 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a  TE_LOCK_TRACE.**
3f90: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70   command-line op
3fa0: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70  tion on the comp
3fb0: 69 6c 65 72 2e 20 20 54 68 69 73 20 63 6f 64 65  iler.  This code
3fc0: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20   is normally.** 
3fd0: 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73  turned off..*/.s
3fe0: 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72  tatic int lockTr
3ff0: 61 63 65 28 69 6e 74 20 66 64 2c 20 69 6e 74 20  ace(int fd, int 
4000: 6f 70 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  op, struct flock
4010: 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f   *p){.  char *zO
4020: 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20  pName, *zType;. 
4030: 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20 73 61   int s;.  int sa
4040: 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20  vedErrno;.  if( 
4050: 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20  op==F_GETLK ){. 
4060: 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45     zOpName = "GE
4070: 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66  TLK";.  }else if
4080: 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b  ( op==F_SETLK ){
4090: 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22  .    zOpName = "
40a0: 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b  SETLK";.  }else{
40b0: 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 66  .    s = fcntl(f
40c0: 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73  d, op, p);.    s
40d0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
40e0: 66 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e  f("fcntl unknown
40f0: 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 66 64   %d %d %d\n", fd
4100: 2c 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72 65  , op, s);.    re
4110: 74 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66  turn s;.  }.  if
4120: 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52  ( p->l_type==F_R
4130: 44 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70  DLCK ){.    zTyp
4140: 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d  e = "RDLCK";.  }
4150: 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79  else if( p->l_ty
4160: 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20  pe==F_WRLCK ){. 
4170: 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43     zType = "WRLC
4180: 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  K";.  }else if( 
4190: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c  p->l_type==F_UNL
41a0: 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20  CK ){.    zType 
41b0: 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c  = "UNLCK";.  }el
41c0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
41d0: 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  0 );.  }.  asser
41e0: 74 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d  t( p->l_whence==
41f0: 53 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20  SEEK_SET );.  s 
4200: 3d 20 66 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20  = fcntl(fd, op, 
4210: 70 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e 6f  p);.  savedErrno
4220: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69   = errno;.  sqli
4230: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
4240: 66 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20 25  fcntl %d %d %s %
4250: 73 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e 22  s %d %d %d %d\n"
4260: 2c 0a 20 20 20 20 20 74 68 72 65 61 64 69 64 2c  ,.     threadid,
4270: 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54   fd, zOpName, zT
4280: 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73  ype, (int)p->l_s
4290: 74 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f  tart, (int)p->l_
42a0: 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29 70  len,.     (int)p
42b0: 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69  ->l_pid, s);.  i
42c0: 66 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70  f( s==(-1) && op
42d0: 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d  ==F_SETLK && (p-
42e0: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  >l_type==F_RDLCK
42f0: 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46   || p->l_type==F
4300: 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73  _WRLCK) ){.    s
4310: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a  truct flock l2;.
4320: 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20      l2 = *p;.   
4330: 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54   fcntl(fd, F_GET
4340: 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69 66  LK, &l2);.    if
4350: 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52  ( l2.l_type==F_R
4360: 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54  DLCK ){.      zT
4370: 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20  ype = "RDLCK";. 
4380: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e     }else if( l2.
4390: 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  l_type==F_WRLCK 
43a0: 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  ){.      zType =
43b0: 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65   "WRLCK";.    }e
43c0: 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70  lse if( l2.l_typ
43d0: 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e==F_UNLCK ){.  
43e0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c      zType = "UNL
43f0: 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  CK";.    }else{.
4400: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20        assert( 0 
4410: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
4420: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
4430: 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72  "fcntl-failure-r
4440: 65 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64 20  eason: %s %d %d 
4450: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54  %d\n",.       zT
4460: 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73  ype, (int)l2.l_s
4470: 74 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  tart, (int)l2.l_
4480: 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70  len, (int)l2.l_p
4490: 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f  id);.  }.  errno
44a0: 20 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20   = savedErrno;. 
44b0: 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 64 65   return s;.}.#de
44c0: 66 69 6e 65 20 66 63 6e 74 6c 20 6c 6f 63 6b 54  fine fcntl lockT
44d0: 72 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  race.#endif /* S
44e0: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
44f0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74   */../*.** The t
4500: 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67  estThreadLocking
4510: 42 65 68 61 76 69 6f 72 28 29 20 72 6f 75 74 69  Behavior() routi
4520: 6e 65 20 6c 61 75 6e 63 68 65 73 20 74 77 6f 20  ne launches two 
4530: 73 65 70 61 72 61 74 65 0a 2a 2a 20 74 68 72 65  separate.** thre
4540: 61 64 73 20 6f 6e 20 74 68 69 73 20 72 6f 75 74  ads on this rout
4550: 69 6e 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ine.  This routi
4560: 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6c  ne attempts to l
4570: 6f 63 6b 20 61 20 66 69 6c 65 0a 2a 2a 20 64 65  ock a file.** de
4580: 73 63 72 69 70 74 6f 72 20 74 68 65 6e 20 72 65  scriptor then re
4590: 74 75 72 6e 73 2e 20 20 54 68 65 20 73 75 63 63  turns.  The succ
45a0: 65 73 73 20 6f 72 20 66 61 69 6c 75 72 65 20 6f  ess or failure o
45b0: 66 20 74 68 61 74 20 61 74 74 65 6d 70 74 0a 2a  f that attempt.*
45c0: 2a 20 61 6c 6c 6f 77 73 20 74 68 65 20 74 65 73  * allows the tes
45d0: 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65  tThreadLockingBe
45e0: 68 61 76 69 6f 72 28 29 20 70 72 6f 63 65 64 75  havior() procedu
45f0: 72 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a  re to determine.
4600: 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
4610: 74 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76  t threads can ov
4620: 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65  erride each othe
4630: 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61  rs locks..*/.sta
4640: 74 69 63 20 76 6f 69 64 20 2a 74 68 72 65 61 64  tic void *thread
4650: 4c 6f 63 6b 69 6e 67 54 65 73 74 28 76 6f 69 64  LockingTest(void
4660: 20 2a 70 41 72 67 29 7b 0a 20 20 73 74 72 75 63   *pArg){.  struc
4670: 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74 61  t threadTestData
4680: 20 2a 70 44 61 74 61 20 3d 20 28 73 74 72 75 63   *pData = (struc
4690: 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74 61  t threadTestData
46a0: 2a 29 70 41 72 67 3b 0a 20 20 70 44 61 74 61 2d  *)pArg;.  pData-
46b0: 3e 72 65 73 75 6c 74 20 3d 20 66 63 6e 74 6c 28  >result = fcntl(
46c0: 70 44 61 74 61 2d 3e 66 64 2c 20 46 5f 53 45 54  pData->fd, F_SET
46d0: 4c 4b 2c 20 26 70 44 61 74 61 2d 3e 6c 6f 63 6b  LK, &pData->lock
46e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 41 72 67  );.  return pArg
46f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
4700: 70 72 6f 63 65 64 75 72 65 20 61 74 74 65 6d 70  procedure attemp
4710: 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ts to determine 
4720: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
4730: 68 72 65 61 64 73 0a 2a 2a 20 63 61 6e 20 6f 76  hreads.** can ov
4740: 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65  erride each othe
4750: 72 73 20 6c 6f 63 6b 73 20 74 68 65 6e 20 73 65  rs locks then se
4760: 74 73 20 74 68 65 20 0a 2a 2a 20 74 68 72 65 61  ts the .** threa
4770: 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74  dsOverrideEachOt
4780: 68 65 72 73 4c 6f 63 6b 73 20 76 61 72 69 61 62  hersLocks variab
4790: 6c 65 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79  le appropriately
47a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
47b0: 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69   testThreadLocki
47c0: 6e 67 42 65 68 61 76 69 6f 72 28 69 6e 74 20 66  ngBehavior(int f
47d0: 64 5f 6f 72 69 67 29 7b 0a 20 20 69 6e 74 20 66  d_orig){.  int f
47e0: 64 3b 0a 20 20 73 74 72 75 63 74 20 74 68 72 65  d;.  struct thre
47f0: 61 64 54 65 73 74 44 61 74 61 20 64 5b 32 5d 3b  adTestData d[2];
4800: 0a 20 20 70 74 68 72 65 61 64 5f 74 20 74 5b 32  .  pthread_t t[2
4810: 5d 3b 0a 0a 20 20 66 64 20 3d 20 64 75 70 28 66  ];..  fd = dup(f
4820: 64 5f 6f 72 69 67 29 3b 0a 20 20 69 66 28 20 66  d_orig);.  if( f
4830: 64 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  d<0 ) return;.  
4840: 6d 65 6d 73 65 74 28 64 2c 20 30 2c 20 73 69 7a  memset(d, 0, siz
4850: 65 6f 66 28 64 29 29 3b 0a 20 20 64 5b 30 5d 2e  eof(d));.  d[0].
4860: 66 64 20 3d 20 66 64 3b 0a 20 20 64 5b 30 5d 2e  fd = fd;.  d[0].
4870: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
4880: 52 44 4c 43 4b 3b 0a 20 20 64 5b 30 5d 2e 6c 6f  RDLCK;.  d[0].lo
4890: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20  ck.l_len = 1;.  
48a0: 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 73 74 61 72  d[0].lock.l_star
48b0: 74 20 3d 20 30 3b 0a 20 20 64 5b 30 5d 2e 6c 6f  t = 0;.  d[0].lo
48c0: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
48d0: 45 4b 5f 53 45 54 3b 0a 20 20 64 5b 31 5d 20 3d  EK_SET;.  d[1] =
48e0: 20 64 5b 30 5d 3b 0a 20 20 64 5b 31 5d 2e 6c 6f   d[0];.  d[1].lo
48f0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52  ck.l_type = F_WR
4900: 4c 43 4b 3b 0a 20 20 70 74 68 72 65 61 64 5f 63  LCK;.  pthread_c
4910: 72 65 61 74 65 28 26 74 5b 30 5d 2c 20 30 2c 20  reate(&t[0], 0, 
4920: 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73  threadLockingTes
4930: 74 2c 20 26 64 5b 30 5d 29 3b 0a 20 20 70 74 68  t, &d[0]);.  pth
4940: 72 65 61 64 5f 63 72 65 61 74 65 28 26 74 5b 31  read_create(&t[1
4950: 5d 2c 20 30 2c 20 74 68 72 65 61 64 4c 6f 63 6b  ], 0, threadLock
4960: 69 6e 67 54 65 73 74 2c 20 26 64 5b 31 5d 29 3b  ingTest, &d[1]);
4970: 0a 20 20 70 74 68 72 65 61 64 5f 6a 6f 69 6e 28  .  pthread_join(
4980: 74 5b 30 5d 2c 20 30 29 3b 0a 20 20 70 74 68 72  t[0], 0);.  pthr
4990: 65 61 64 5f 6a 6f 69 6e 28 74 5b 31 5d 2c 20 30  ead_join(t[1], 0
49a0: 29 3b 0a 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a  );.  close(fd);.
49b0: 20 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64    threadsOverrid
49c0: 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73  eEachOthersLocks
49d0: 20 3d 20 20 64 5b 30 5d 2e 72 65 73 75 6c 74 3d   =  d[0].result=
49e0: 3d 30 20 26 26 20 64 5b 31 5d 2e 72 65 73 75 6c  =0 && d[1].resul
49f0: 74 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  t==0;.}.#endif /
4a00: 2a 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  * SQLITE_THREADS
4a10: 41 46 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  AFE */../*.** Re
4a20: 6c 65 61 73 65 20 61 20 6c 6f 63 6b 49 6e 66 6f  lease a lockInfo
4a30: 20 73 74 72 75 63 74 75 72 65 20 70 72 65 76 69   structure previ
4a40: 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  ously allocated 
4a50: 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28  by findLockInfo(
4a60: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
4a70: 64 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66  d releaseLockInf
4a80: 6f 28 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66  o(struct lockInf
4a90: 6f 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 66 20  o *pLock){.  if 
4aa0: 28 70 4c 6f 63 6b 20 3d 3d 20 4e 55 4c 4c 29 0a  (pLock == NULL).
4ab0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 70 4c      return;.  pL
4ac0: 6f 63 6b 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  ock->nRef--;.  i
4ad0: 66 28 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 3d 3d  f( pLock->nRef==
4ae0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
4af0: 48 61 73 68 49 6e 73 65 72 74 28 26 6c 6f 63 6b  HashInsert(&lock
4b00: 48 61 73 68 2c 20 26 70 4c 6f 63 6b 2d 3e 6b 65  Hash, &pLock->ke
4b10: 79 2c 20 73 69 7a 65 6f 66 28 70 4c 6f 63 6b 2d  y, sizeof(pLock-
4b20: 3e 6b 65 79 29 2c 20 30 29 3b 0a 20 20 20 20 73  >key), 0);.    s
4b30: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 63  qlite3_free(pLoc
4b40: 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  k);.  }.}../*.**
4b50: 20 52 65 6c 65 61 73 65 20 61 20 6f 70 65 6e 43   Release a openC
4b60: 6e 74 20 73 74 72 75 63 74 75 72 65 20 70 72 65  nt structure pre
4b70: 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65  viously allocate
4b80: 64 20 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e 66  d by findLockInf
4b90: 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  o()..*/.static v
4ba0: 6f 69 64 20 72 65 6c 65 61 73 65 4f 70 65 6e 43  oid releaseOpenC
4bb0: 6e 74 28 73 74 72 75 63 74 20 6f 70 65 6e 43 6e  nt(struct openCn
4bc0: 74 20 2a 70 4f 70 65 6e 29 7b 0a 20 20 69 66 20  t *pOpen){.  if 
4bd0: 28 70 4f 70 65 6e 20 3d 3d 20 4e 55 4c 4c 29 0a  (pOpen == NULL).
4be0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f      return;.  pO
4bf0: 70 65 6e 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  pen->nRef--;.  i
4c00: 66 28 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 3d 3d  f( pOpen->nRef==
4c10: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
4c20: 48 61 73 68 49 6e 73 65 72 74 28 26 6f 70 65 6e  HashInsert(&open
4c30: 48 61 73 68 2c 20 26 70 4f 70 65 6e 2d 3e 6b 65  Hash, &pOpen->ke
4c40: 79 2c 20 73 69 7a 65 6f 66 28 70 4f 70 65 6e 2d  y, sizeof(pOpen-
4c50: 3e 6b 65 79 29 2c 20 30 29 3b 0a 20 20 20 20 66  >key), 0);.    f
4c60: 72 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64  ree(pOpen->aPend
4c70: 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ing);.    sqlite
4c80: 33 5f 66 72 65 65 28 70 4f 70 65 6e 29 3b 0a 20  3_free(pOpen);. 
4c90: 20 7d 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c   }.}..#ifdef SQL
4ca0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
4cb0: 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54  NG_STYLE./*.** T
4cc0: 65 73 74 73 20 61 20 62 79 74 65 2d 72 61 6e 67  ests a byte-rang
4cd0: 65 20 6c 6f 63 6b 69 6e 67 20 71 75 65 72 79 20  e locking query 
4ce0: 74 6f 20 73 65 65 20 69 66 20 62 79 74 65 20 72  to see if byte r
4cf0: 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 0a  ange locks are .
4d00: 2a 2a 20 73 75 70 70 6f 72 74 65 64 2c 20 69 66  ** supported, if
4d10: 20 6e 6f 74 20 77 65 20 66 61 6c 6c 20 62 61 63   not we fall bac
4d20: 6b 20 74 6f 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b  k to dotlockLock
4d30: 69 6e 67 53 74 79 6c 65 2e 0a 2a 2f 0a 73 74 61  ingStyle..*/.sta
4d40: 74 69 63 20 73 71 6c 69 74 65 33 4c 6f 63 6b 69  tic sqlite3Locki
4d50: 6e 67 53 74 79 6c 65 20 73 71 6c 69 74 65 33 54  ngStyle sqlite3T
4d60: 65 73 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28  estLockingStyle(
4d70: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  .  const char *f
4d80: 69 6c 65 50 61 74 68 2c 20 0a 20 20 69 6e 74 20  ilePath, .  int 
4d90: 66 64 0a 29 7b 0a 20 20 2f 2a 20 74 65 73 74 20  fd.){.  /* test 
4da0: 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20  byte-range lock 
4db0: 75 73 69 6e 67 20 66 63 6e 74 6c 20 2a 2f 0a 20  using fcntl */. 
4dc0: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
4dd0: 63 6b 49 6e 66 6f 3b 0a 20 20 0a 20 20 6c 6f 63  ckInfo;.  .  loc
4de0: 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b  kInfo.l_len = 1;
4df0: 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74  .  lockInfo.l_st
4e00: 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49  art = 0;.  lockI
4e10: 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  nfo.l_whence = S
4e20: 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49  EEK_SET;.  lockI
4e30: 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52  nfo.l_type = F_R
4e40: 44 4c 43 4b 3b 0a 20 20 0a 20 20 69 66 28 20 66  DLCK;.  .  if( f
4e50: 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b  cntl(fd, F_GETLK
4e60: 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31  , &lockInfo)!=-1
4e70: 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20   ) {.    return 
4e80: 70 6f 73 69 78 4c 6f 63 6b 69 6e 67 53 74 79 6c  posixLockingStyl
4e90: 65 3b 0a 20 20 7d 20 0a 20 20 0a 20 20 2f 2a 20  e;.  } .  .  /* 
4ea0: 74 65 73 74 69 6e 67 20 66 6f 72 20 66 6c 6f 63  testing for floc
4eb0: 6b 20 63 61 6e 20 67 69 76 65 20 66 61 6c 73 65  k can give false
4ec0: 20 70 6f 73 69 74 69 76 65 73 2e 20 20 53 6f 20   positives.  So 
4ed0: 69 66 20 69 66 20 74 68 65 20 61 62 6f 76 65 20  if if the above 
4ee0: 74 65 73 74 0a 20 20 2a 2a 20 66 61 69 6c 73 2c  test.  ** fails,
4ef0: 20 74 68 65 6e 20 77 65 20 66 61 6c 6c 20 62 61   then we fall ba
4f00: 63 6b 20 74 6f 20 75 73 69 6e 67 20 64 6f 74 2d  ck to using dot-
4f10: 6c 6f 63 6b 20 73 74 79 6c 65 20 6c 6f 63 6b 69  lock style locki
4f20: 6e 67 2e 0a 20 20 2a 2f 20 20 0a 20 20 72 65 74  ng..  */  .  ret
4f30: 75 72 6e 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69  urn dotlockLocki
4f40: 6e 67 53 74 79 6c 65 3b 0a 7d 0a 0a 2f 2a 20 0a  ngStyle;.}../* .
4f50: 2a 2a 20 45 78 61 6d 69 6e 65 73 20 74 68 65 20  ** Examines the 
4f60: 66 5f 66 73 74 79 70 65 6e 61 6d 65 20 65 6e 74  f_fstypename ent
4f70: 72 79 20 69 6e 20 74 68 65 20 73 74 61 74 66 73  ry in the statfs
4f80: 20 73 74 72 75 63 74 75 72 65 20 61 73 20 72 65   structure as re
4f90: 74 75 72 6e 65 64 20 62 79 20 0a 2a 2a 20 73 74  turned by .** st
4fa0: 61 74 28 29 20 66 6f 72 20 74 68 65 20 66 69 6c  at() for the fil
4fb0: 65 20 73 79 73 74 65 6d 20 68 6f 73 74 69 6e 67  e system hosting
4fc0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
4fd0: 6c 65 2c 20 61 73 73 69 67 6e 73 20 74 68 65 20  le, assigns the 
4fe0: 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20  .** appropriate 
4ff0: 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 62 61  locking style ba
5000: 73 65 64 20 6f 6e 20 69 74 27 73 20 76 61 6c 75  sed on it's valu
5010: 65 2e 20 20 54 68 65 73 65 20 76 61 6c 75 65 73  e.  These values
5020: 20 61 6e 64 20 0a 2a 2a 20 61 73 73 69 67 6e 6d   and .** assignm
5030: 65 6e 74 73 20 61 72 65 20 62 61 73 65 64 20 6f  ents are based o
5040: 6e 20 44 61 72 77 69 6e 2f 4f 53 58 20 62 65 68  n Darwin/OSX beh
5050: 61 76 69 6f 72 20 61 6e 64 20 68 61 76 65 20 6e  avior and have n
5060: 6f 74 20 62 65 65 6e 20 74 65 73 74 65 64 20 6f  ot been tested o
5070: 6e 20 0a 2a 2a 20 6f 74 68 65 72 20 73 79 73 74  n .** other syst
5080: 65 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ems..*/.static s
5090: 71 6c 69 74 65 33 4c 6f 63 6b 69 6e 67 53 74 79  qlite3LockingSty
50a0: 6c 65 20 73 71 6c 69 74 65 33 44 65 74 65 63 74  le sqlite3Detect
50b0: 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 0a 20 20  LockingStyle(.  
50c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
50d0: 50 61 74 68 2c 20 0a 20 20 69 6e 74 20 66 64 0a  Path, .  int fd.
50e0: 29 7b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ){..#ifdef SQLIT
50f0: 45 5f 46 49 58 45 44 5f 4c 4f 43 4b 49 4e 47 5f  E_FIXED_LOCKING_
5100: 53 54 59 4c 45 0a 20 20 72 65 74 75 72 6e 20 28  STYLE.  return (
5110: 73 71 6c 69 74 65 33 4c 6f 63 6b 69 6e 67 53 74  sqlite3LockingSt
5120: 79 6c 65 29 53 51 4c 49 54 45 5f 46 49 58 45 44  yle)SQLITE_FIXED
5130: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 3b 0a  _LOCKING_STYLE;.
5140: 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 73  #else.  struct s
5150: 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 0a 20  tatfs fsInfo;.. 
5160: 20 69 66 20 28 73 74 61 74 66 73 28 66 69 6c 65   if (statfs(file
5170: 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d  Path, &fsInfo) =
5180: 3d 20 2d 31 29 0a 20 20 20 20 72 65 74 75 72 6e  = -1).    return
5190: 20 73 71 6c 69 74 65 33 54 65 73 74 4c 6f 63 6b   sqlite3TestLock
51a0: 69 6e 67 53 74 79 6c 65 28 66 69 6c 65 50 61 74  ingStyle(filePat
51b0: 68 2c 20 66 64 29 3b 0a 20 20 0a 20 20 69 66 20  h, fd);.  .  if 
51c0: 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20  (fsInfo.f_flags 
51d0: 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 29 0a 20 20  & MNT_RDONLY).  
51e0: 20 20 72 65 74 75 72 6e 20 6e 6f 4c 6f 63 6b 69    return noLocki
51f0: 6e 67 53 74 79 6c 65 3b 0a 20 20 0a 20 20 69 66  ngStyle;.  .  if
5200: 28 20 28 21 73 74 72 63 6d 70 28 66 73 49 6e 66  ( (!strcmp(fsInf
5210: 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
5220: 22 68 66 73 22 29 29 20 7c 7c 0a 20 20 20 20 28  "hfs")) ||.    (
5230: 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66  !strcmp(fsInfo.f
5240: 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 75 66  _fstypename, "uf
5250: 73 22 29 29 20 29 0a 20 20 20 20 20 20 20 20 20  s")) ).         
5260: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 6f         return po
5270: 73 69 78 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b  sixLockingStyle;
5280: 0a 20 20 0a 20 20 69 66 28 21 73 74 72 63 6d 70  .  .  if(!strcmp
5290: 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65  (fsInfo.f_fstype
52a0: 6e 61 6d 65 2c 20 22 61 66 70 66 73 22 29 29 0a  name, "afpfs")).
52b0: 20 20 20 20 72 65 74 75 72 6e 20 61 66 70 4c 6f      return afpLo
52c0: 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 0a 20  ckingStyle;.  . 
52d0: 20 69 66 28 21 73 74 72 63 6d 70 28 66 73 49 6e   if(!strcmp(fsIn
52e0: 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
52f0: 20 22 6e 66 73 22 29 29 20 0a 20 20 20 20 72 65   "nfs")) .    re
5300: 74 75 72 6e 20 73 71 6c 69 74 65 33 54 65 73 74  turn sqlite3Test
5310: 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 66 69 6c  LockingStyle(fil
5320: 65 50 61 74 68 2c 20 66 64 29 3b 0a 20 20 0a 20  ePath, fd);.  . 
5330: 20 69 66 28 21 73 74 72 63 6d 70 28 66 73 49 6e   if(!strcmp(fsIn
5340: 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
5350: 20 22 73 6d 62 66 73 22 29 29 0a 20 20 20 20 72   "smbfs")).    r
5360: 65 74 75 72 6e 20 66 6c 6f 63 6b 4c 6f 63 6b 69  eturn flockLocki
5370: 6e 67 53 74 79 6c 65 3b 0a 20 20 0a 20 20 69 66  ngStyle;.  .  if
5380: 28 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e  (!strcmp(fsInfo.
5390: 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 6d  f_fstypename, "m
53a0: 73 64 6f 73 22 29 29 0a 20 20 20 20 72 65 74 75  sdos")).    retu
53b0: 72 6e 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  rn dotlockLockin
53c0: 67 53 74 79 6c 65 3b 0a 20 20 0a 20 20 69 66 28  gStyle;.  .  if(
53d0: 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66  !strcmp(fsInfo.f
53e0: 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 77 65  _fstypename, "we
53f0: 62 64 61 76 22 29 29 0a 20 20 20 20 72 65 74 75  bdav")).    retu
5400: 72 6e 20 75 6e 73 75 70 70 6f 72 74 65 64 4c 6f  rn unsupportedLo
5410: 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 0a 20  ckingStyle;.  . 
5420: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54   return sqlite3T
5430: 65 73 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28  estLockingStyle(
5440: 66 69 6c 65 50 61 74 68 2c 20 66 64 29 3b 20 20  filePath, fd);  
5450: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
5460: 45 5f 46 49 58 45 44 5f 4c 4f 43 4b 49 4e 47 5f  E_FIXED_LOCKING_
5470: 53 54 59 4c 45 20 2a 2f 0a 7d 0a 0a 23 65 6e 64  STYLE */.}..#end
5480: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
5490: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
54a0: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  E */../*.** Give
54b0: 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  n a file descrip
54c0: 74 6f 72 2c 20 6c 6f 63 61 74 65 20 6c 6f 63 6b  tor, locate lock
54d0: 49 6e 66 6f 20 61 6e 64 20 6f 70 65 6e 43 6e 74  Info and openCnt
54e0: 20 73 74 72 75 63 74 75 72 65 73 20 74 68 61 74   structures that
54f0: 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74 68  .** describes th
5500: 61 74 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  at file descript
5510: 6f 72 2e 20 20 43 72 65 61 74 65 20 6e 65 77 20  or.  Create new 
5520: 6f 6e 65 73 20 69 66 20 6e 65 63 65 73 73 61 72  ones if necessar
5530: 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74 75 72  y.  The.** retur
5540: 6e 20 76 61 6c 75 65 73 20 6d 69 67 68 74 20 62  n values might b
5550: 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  e uninitialized 
5560: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
5570: 72 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  rs..**.** Return
5580: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
5590: 72 72 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrors..*/.static
55a0: 20 69 6e 74 20 66 69 6e 64 4c 6f 63 6b 49 6e 66   int findLockInf
55b0: 6f 28 0a 20 20 69 6e 74 20 66 64 2c 20 20 20 20  o(.  int fd,    
55c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55d0: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
55e0: 73 63 72 69 70 74 6f 72 20 75 73 65 64 20 69 6e  scriptor used in
55f0: 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74   the key */.  st
5600: 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 2a  ruct lockInfo **
5610: 70 70 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 52 65  ppLock,    /* Re
5620: 74 75 72 6e 20 74 68 65 20 6c 6f 63 6b 49 6e 66  turn the lockInf
5630: 6f 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  o structure here
5640: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6f 70 65   */.  struct ope
5650: 6e 43 6e 74 20 2a 2a 70 70 4f 70 65 6e 20 20 20  nCnt **ppOpen   
5660: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
5670: 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75   openCnt structu
5680: 72 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  re here */.){.  
5690: 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74  int rc;.  struct
56a0: 20 6c 6f 63 6b 4b 65 79 20 6b 65 79 31 3b 0a 20   lockKey key1;. 
56b0: 20 73 74 72 75 63 74 20 6f 70 65 6e 4b 65 79 20   struct openKey 
56c0: 6b 65 79 32 3b 0a 20 20 73 74 72 75 63 74 20 73  key2;.  struct s
56d0: 74 61 74 20 73 74 61 74 62 75 66 3b 0a 20 20 73  tat statbuf;.  s
56e0: 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a  truct lockInfo *
56f0: 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20  pLock;.  struct 
5700: 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 0a  openCnt *pOpen;.
5710: 20 20 72 63 20 3d 20 66 73 74 61 74 28 66 64 2c    rc = fstat(fd,
5720: 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66   &statbuf);.  if
5730: 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
5740: 20 31 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 6b   1;..  memset(&k
5750: 65 79 31 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b  ey1, 0, sizeof(k
5760: 65 79 31 29 29 3b 0a 20 20 6b 65 79 31 2e 64 65  ey1));.  key1.de
5770: 76 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64  v = statbuf.st_d
5780: 65 76 3b 0a 20 20 6b 65 79 31 2e 69 6e 6f 20 3d  ev;.  key1.ino =
5790: 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b   statbuf.st_ino;
57a0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
57b0: 41 44 53 41 46 45 0a 20 20 69 66 28 20 74 68 72  ADSAFE.  if( thr
57c0: 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68  eadsOverrideEach
57d0: 4f 74 68 65 72 73 4c 6f 63 6b 73 3c 30 20 29 7b  OthersLocks<0 ){
57e0: 0a 20 20 20 20 74 65 73 74 54 68 72 65 61 64 4c  .    testThreadL
57f0: 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 66  ockingBehavior(f
5800: 64 29 3b 0a 20 20 7d 0a 20 20 6b 65 79 31 2e 74  d);.  }.  key1.t
5810: 69 64 20 3d 20 74 68 72 65 61 64 73 4f 76 65 72  id = threadsOver
5820: 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f  rideEachOthersLo
5830: 63 6b 73 20 3f 20 30 20 3a 20 70 74 68 72 65 61  cks ? 0 : pthrea
5840: 64 5f 73 65 6c 66 28 29 3b 0a 23 65 6e 64 69 66  d_self();.#endif
5850: 0a 20 20 6d 65 6d 73 65 74 28 26 6b 65 79 32 2c  .  memset(&key2,
5860: 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 32 29   0, sizeof(key2)
5870: 29 3b 0a 20 20 6b 65 79 32 2e 64 65 76 20 3d 20  );.  key2.dev = 
5880: 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a  statbuf.st_dev;.
5890: 20 20 6b 65 79 32 2e 69 6e 6f 20 3d 20 73 74 61    key2.ino = sta
58a0: 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 20 20 70  tbuf.st_ino;.  p
58b0: 4c 6f 63 6b 20 3d 20 28 73 74 72 75 63 74 20 6c  Lock = (struct l
58c0: 6f 63 6b 49 6e 66 6f 2a 29 73 71 6c 69 74 65 33  ockInfo*)sqlite3
58d0: 48 61 73 68 46 69 6e 64 28 26 6c 6f 63 6b 48 61  HashFind(&lockHa
58e0: 73 68 2c 20 26 6b 65 79 31 2c 20 73 69 7a 65 6f  sh, &key1, sizeo
58f0: 66 28 6b 65 79 31 29 29 3b 0a 20 20 69 66 28 20  f(key1));.  if( 
5900: 70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  pLock==0 ){.    
5910: 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20  struct lockInfo 
5920: 2a 70 4f 6c 64 3b 0a 20 20 20 20 70 4c 6f 63 6b  *pOld;.    pLock
5930: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
5940: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4c 6f 63 6b  c( sizeof(*pLock
5950: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  ) );.    if( pLo
5960: 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ck==0 ){.      r
5970: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74  c = 1;.      got
5980: 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69  o exit_findlocki
5990: 6e 66 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nfo;.    }.    p
59a0: 4c 6f 63 6b 2d 3e 6b 65 79 20 3d 20 6b 65 79 31  Lock->key = key1
59b0: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65  ;.    pLock->nRe
59c0: 66 20 3d 20 31 3b 0a 20 20 20 20 70 4c 6f 63 6b  f = 1;.    pLock
59d0: 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70  ->cnt = 0;.    p
59e0: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  Lock->locktype =
59f0: 20 30 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73   0;.    pOld = s
5a00: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
5a10: 28 26 6c 6f 63 6b 48 61 73 68 2c 20 26 70 4c 6f  (&lockHash, &pLo
5a20: 63 6b 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f 66 28  ck->key, sizeof(
5a30: 6b 65 79 31 29 2c 20 70 4c 6f 63 6b 29 3b 0a 20  key1), pLock);. 
5a40: 20 20 20 69 66 28 20 70 4f 6c 64 21 3d 30 20 29     if( pOld!=0 )
5a50: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
5a60: 70 4f 6c 64 3d 3d 70 4c 6f 63 6b 20 29 3b 0a 20  pOld==pLock );. 
5a70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
5a80: 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  e(pLock);.      
5a90: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  rc = 1;.      go
5aa0: 74 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b  to exit_findlock
5ab0: 69 6e 66 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  info;.    }.  }e
5ac0: 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  lse{.    pLock->
5ad0: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70  nRef++;.  }.  *p
5ae0: 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20  pLock = pLock;. 
5af0: 20 69 66 28 20 70 70 4f 70 65 6e 21 3d 30 20 29   if( ppOpen!=0 )
5b00: 7b 0a 20 20 20 20 70 4f 70 65 6e 20 3d 20 28 73  {.    pOpen = (s
5b10: 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 2a 29 73  truct openCnt*)s
5b20: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
5b30: 6f 70 65 6e 48 61 73 68 2c 20 26 6b 65 79 32 2c  openHash, &key2,
5b40: 20 73 69 7a 65 6f 66 28 6b 65 79 32 29 29 3b 0a   sizeof(key2));.
5b50: 20 20 20 20 69 66 28 20 70 4f 70 65 6e 3d 3d 30      if( pOpen==0
5b60: 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
5b70: 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 6c 64 3b 0a   openCnt *pOld;.
5b80: 20 20 20 20 20 20 70 4f 70 65 6e 20 3d 20 73 71        pOpen = sq
5b90: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
5ba0: 7a 65 6f 66 28 2a 70 4f 70 65 6e 29 20 29 3b 0a  zeof(*pOpen) );.
5bb0: 20 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e 3d        if( pOpen=
5bc0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
5bd0: 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 4c  leaseLockInfo(pL
5be0: 6f 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ock);.        rc
5bf0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 1;.        go
5c00: 74 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b  to exit_findlock
5c10: 69 6e 66 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  info;.      }.  
5c20: 20 20 20 20 70 4f 70 65 6e 2d 3e 6b 65 79 20 3d      pOpen->key =
5c30: 20 6b 65 79 32 3b 0a 20 20 20 20 20 20 70 4f 70   key2;.      pOp
5c40: 65 6e 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  en->nRef = 1;.  
5c50: 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b      pOpen->nLock
5c60: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 70 65   = 0;.      pOpe
5c70: 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30 3b  n->nPending = 0;
5c80: 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50  .      pOpen->aP
5c90: 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20  ending = 0;.    
5ca0: 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33    pOld = sqlite3
5cb0: 48 61 73 68 49 6e 73 65 72 74 28 26 6f 70 65 6e  HashInsert(&open
5cc0: 48 61 73 68 2c 20 26 70 4f 70 65 6e 2d 3e 6b 65  Hash, &pOpen->ke
5cd0: 79 2c 20 73 69 7a 65 6f 66 28 6b 65 79 32 29 2c  y, sizeof(key2),
5ce0: 20 70 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69   pOpen);.      i
5cf0: 66 28 20 70 4f 6c 64 21 3d 30 20 29 7b 0a 20 20  f( pOld!=0 ){.  
5d00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
5d10: 6c 64 3d 3d 70 4f 70 65 6e 20 29 3b 0a 20 20 20  ld==pOpen );.   
5d20: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
5d30: 65 28 70 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  e(pOpen);.      
5d40: 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66    releaseLockInf
5d50: 6f 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  o(pLock);.      
5d60: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
5d70: 20 20 67 6f 74 6f 20 65 78 69 74 5f 66 69 6e 64    goto exit_find
5d80: 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20 20 20 20  lockinfo;.      
5d90: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
5da0: 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 2b 2b     pOpen->nRef++
5db0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 70 4f  ;.    }.    *ppO
5dc0: 70 65 6e 20 3d 20 70 4f 70 65 6e 3b 0a 20 20 7d  pen = pOpen;.  }
5dd0: 0a 0a 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69  ..exit_findlocki
5de0: 6e 66 6f 3a 0a 20 20 72 65 74 75 72 6e 20 72 63  nfo:.  return rc
5df0: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
5e00: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 48  TE_DEBUG./*.** H
5e10: 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66  elper function f
5e20: 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75 74 20  or printing out 
5e30: 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f  trace informatio
5e40: 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69 6e 67  n from debugging
5e50: 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20 54 68  .** binaries. Th
5e60: 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  is returns the s
5e70: 74 72 69 6e 67 20 72 65 70 72 65 73 65 74 61 74  tring represetat
5e80: 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70 70 6c  ion of the suppl
5e90: 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6c  ied.** integer l
5ea0: 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74 61  ock-type..*/.sta
5eb0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
5ec0: 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 69 6e 74  locktypeName(int
5ed0: 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 73 77   locktype){.  sw
5ee0: 69 74 63 68 28 20 6c 6f 63 6b 74 79 70 65 20 29  itch( locktype )
5ef0: 7b 0a 20 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b  {.  case NO_LOCK
5f00: 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b  : return "NONE";
5f10: 0a 20 20 63 61 73 65 20 53 48 41 52 45 44 5f 4c  .  case SHARED_L
5f20: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53 48 41  OCK: return "SHA
5f30: 52 45 44 22 3b 0a 20 20 63 61 73 65 20 52 45 53  RED";.  case RES
5f40: 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75  ERVED_LOCK: retu
5f50: 72 6e 20 22 52 45 53 45 52 56 45 44 22 3b 0a 20  rn "RESERVED";. 
5f60: 20 63 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f   case PENDING_LO
5f70: 43 4b 3a 20 72 65 74 75 72 6e 20 22 50 45 4e 44  CK: return "PEND
5f80: 49 4e 47 22 3b 0a 20 20 63 61 73 65 20 45 58 43  ING";.  case EXC
5f90: 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74  LUSIVE_LOCK: ret
5fa0: 75 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22 3b  urn "EXCLUSIVE";
5fb0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 45  .  }.  return "E
5fc0: 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a  RROR";.}.#endif.
5fd0: 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65  ./*.** If we are
5fe0: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 61 20   currently in a 
5ff0: 64 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64  different thread
6000: 20 74 68 61 6e 20 74 68 65 20 74 68 72 65 61 64   than the thread
6010: 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 75 6e 69   that the.** uni
6020: 78 46 69 6c 65 20 61 72 67 75 6d 65 6e 74 20 62  xFile argument b
6030: 65 6c 6f 6e 67 73 20 74 6f 2c 20 74 68 65 6e 20  elongs to, then 
6040: 74 72 61 6e 73 66 65 72 20 6f 77 6e 65 72 73 68  transfer ownersh
6050: 69 70 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69  ip of the unixFi
6060: 6c 65 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 74 68  le.** over to th
6070: 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
6080: 2e 0a 2a 2a 0a 2a 2a 20 41 20 75 6e 69 78 46 69  ..**.** A unixFi
6090: 6c 65 20 69 73 20 6f 6e 6c 79 20 6f 77 6e 65 64  le is only owned
60a0: 20 62 79 20 61 20 74 68 72 65 61 64 20 6f 6e 20   by a thread on 
60b0: 73 79 73 74 65 6d 73 20 77 68 65 72 65 20 6f 6e  systems where on
60c0: 65 20 74 68 72 65 61 64 20 69 73 0a 2a 2a 20 75  e thread is.** u
60d0: 6e 61 62 6c 65 20 74 6f 20 6f 76 65 72 72 69 64  nable to overrid
60e0: 65 20 6c 6f 63 6b 73 20 63 72 65 61 74 65 64 20  e locks created 
60f0: 62 79 20 61 20 64 69 66 66 65 72 65 6e 74 20 74  by a different t
6100: 68 72 65 61 64 2e 20 20 52 65 64 48 61 74 39 20  hread.  RedHat9 
6110: 69 73 0a 2a 2a 20 61 6e 20 65 78 61 6d 70 6c 65  is.** an example
6120: 20 6f 66 20 73 75 63 68 20 61 20 73 79 73 74 65   of such a syste
6130: 6d 2e 0a 2a 2a 0a 2a 2a 20 4f 77 6e 65 72 73 68  m..**.** Ownersh
6140: 69 70 20 74 72 61 6e 73 66 65 72 20 69 73 20 6f  ip transfer is o
6150: 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 69 66 20 74  nly allowed if t
6160: 68 65 20 75 6e 69 78 46 69 6c 65 20 69 73 20 63  he unixFile is c
6170: 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65  urrently unlocke
6180: 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20 75 6e 69  d..** If the uni
6190: 78 46 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20  xFile is locked 
61a0: 61 6e 64 20 61 6e 20 6f 77 6e 65 72 73 68 69 70  and an ownership
61b0: 20 69 73 20 77 72 6f 6e 67 2c 20 74 68 65 6e 20   is wrong, then 
61c0: 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  return.** SQLITE
61d0: 5f 4d 49 53 55 53 45 2e 20 20 53 51 4c 49 54 45  _MISUSE.  SQLITE
61e0: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
61f0: 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
6200: 72 6b 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  rks..*/.#if SQLI
6210: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 73 74  TE_THREADSAFE.st
6220: 61 74 69 63 20 69 6e 74 20 74 72 61 6e 73 66 65  atic int transfe
6230: 72 4f 77 6e 65 72 73 68 69 70 28 75 6e 69 78 46  rOwnership(unixF
6240: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
6250: 6e 74 20 72 63 3b 0a 20 20 70 74 68 72 65 61 64  nt rc;.  pthread
6260: 5f 74 20 68 53 65 6c 66 3b 0a 20 20 69 66 28 20  _t hSelf;.  if( 
6270: 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45  threadsOverrideE
6280: 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 29  achOthersLocks )
6290: 7b 0a 20 20 20 20 2f 2a 20 4f 77 6e 65 72 73 68  {.    /* Ownersh
62a0: 69 70 20 74 72 61 6e 73 66 65 72 73 20 6e 6f 74  ip transfers not
62b0: 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 69 73 20   needed on this 
62c0: 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 72 65  system */.    re
62d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
62e0: 20 20 7d 0a 20 20 68 53 65 6c 66 20 3d 20 70 74    }.  hSelf = pt
62f0: 68 72 65 61 64 5f 73 65 6c 66 28 29 3b 0a 20 20  hread_self();.  
6300: 69 66 28 20 70 74 68 72 65 61 64 5f 65 71 75 61  if( pthread_equa
6310: 6c 28 70 46 69 6c 65 2d 3e 74 69 64 2c 20 68 53  l(pFile->tid, hS
6320: 65 6c 66 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57  elf) ){.    /* W
6330: 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74  e are still in t
6340: 68 65 20 73 61 6d 65 20 74 68 72 65 61 64 20 2a  he same thread *
6350: 2f 0a 20 20 20 20 4f 53 54 52 41 43 45 31 28 22  /.    OSTRACE1("
6360: 4e 6f 2d 74 72 61 6e 73 66 65 72 2c 20 73 61 6d  No-transfer, sam
6370: 65 20 74 68 72 65 61 64 5c 6e 22 29 3b 0a 20 20  e thread\n");.  
6380: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6390: 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46  OK;.  }.  if( pF
63a0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e  ile->locktype!=N
63b0: 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a  O_LOCK ){.    /*
63c0: 20 57 65 20 63 61 6e 6e 6f 74 20 63 68 61 6e 67   We cannot chang
63d0: 65 20 6f 77 6e 65 72 73 68 69 70 20 77 68 69 6c  e ownership whil
63e0: 65 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e 67  e we are holding
63f0: 20 61 20 6c 6f 63 6b 21 20 2a 2f 0a 20 20 20 20   a lock! */.    
6400: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
6410: 53 55 53 45 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  SUSE;.  }.  OSTR
6420: 41 43 45 34 28 22 54 72 61 6e 73 66 65 72 20 6f  ACE4("Transfer o
6430: 77 6e 65 72 73 68 69 70 20 6f 66 20 25 64 20 66  wnership of %d f
6440: 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c  rom %d to %d\n",
6450: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69  .            pFi
6460: 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 74 69  le->h, pFile->ti
6470: 64 2c 20 68 53 65 6c 66 29 3b 0a 20 20 70 46 69  d, hSelf);.  pFi
6480: 6c 65 2d 3e 74 69 64 20 3d 20 68 53 65 6c 66 3b  le->tid = hSelf;
6490: 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 70 4c  .  if (pFile->pL
64a0: 6f 63 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 20  ock != NULL) {. 
64b0: 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e     releaseLockIn
64c0: 66 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29  fo(pFile->pLock)
64d0: 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 4c  ;.    rc = findL
64e0: 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 68  ockInfo(pFile->h
64f0: 2c 20 26 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2c  , &pFile->pLock,
6500: 20 30 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45   0);.    OSTRACE
6510: 35 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 69 73  5("LOCK    %d is
6520: 20 6e 6f 77 20 25 73 28 25 73 2c 25 64 29 5c 6e   now %s(%s,%d)\n
6530: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
6540: 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65          locktype
6550: 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b  Name(pFile->lock
6560: 74 79 70 65 29 2c 0a 20 20 20 20 20 20 20 20 20  type),.         
6570: 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70    locktypeName(p
6580: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63  File->pLock->loc
6590: 6b 74 79 70 65 29 2c 20 70 46 69 6c 65 2d 3e 70  ktype), pFile->p
65a0: 4c 6f 63 6b 2d 3e 63 6e 74 29 3b 0a 20 20 20 20  Lock->cnt);.    
65b0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65  return rc;.  } e
65c0: 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  lse {.    return
65d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
65e0: 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4f 6e 20  }.#else.  /* On 
65f0: 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 20  single-threaded 
6600: 62 75 69 6c 64 73 2c 20 6f 77 6e 65 72 73 68 69  builds, ownershi
6610: 70 20 74 72 61 6e 73 66 65 72 20 69 73 20 61 20  p transfer is a 
6620: 6e 6f 2d 6f 70 20 2a 2f 0a 23 20 64 65 66 69 6e  no-op */.# defin
6630: 65 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73  e transferOwners
6640: 68 69 70 28 58 29 20 53 51 4c 49 54 45 5f 4f 4b  hip(X) SQLITE_OK
6650: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53  .#endif../*.** S
6660: 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65  eek to the offse
6670: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
6680: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
6690: 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 0a   then read cnt .
66a0: 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42  ** bytes into pB
66b0: 75 66 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e  uf. Return the n
66c0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
66d0: 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2f  ctually read..*/
66e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b  .static int seek
66f0: 41 6e 64 52 65 61 64 28 75 6e 69 78 46 69 6c 65  AndRead(unixFile
6700: 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e   *id, sqlite3_in
6710: 74 36 34 20 6f 66 66 73 65 74 2c 20 76 6f 69 64  t64 offset, void
6720: 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29   *pBuf, int cnt)
6730: 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69  {.  int got;.  i
6740: 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 20 20  64 newOffset;.  
6750: 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69 66  TIMER_START;.#if
6760: 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
6770: 41 44 29 0a 20 20 67 6f 74 20 3d 20 70 72 65 61  AD).  got = prea
6780: 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  d(id->h, pBuf, c
6790: 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 53  nt, offset);.  S
67a0: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
67b0: 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69  got = -1 );.#eli
67c0: 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
67d0: 45 41 44 36 34 29 0a 20 20 67 6f 74 20 3d 20 70  EAD64).  got = p
67e0: 72 65 61 64 36 34 28 69 64 2d 3e 68 2c 20 70 42  read64(id->h, pB
67f0: 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29  uf, cnt, offset)
6800: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
6810: 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b  ror( got = -1 );
6820: 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66 73  .#else.  newOffs
6830: 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68  et = lseek(id->h
6840: 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53  , offset, SEEK_S
6850: 45 54 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  ET);.  SimulateI
6860: 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65  OError( newOffse
6870: 74 2d 2d 20 29 3b 0a 20 20 69 66 28 20 6e 65 77  t-- );.  if( new
6880: 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29  Offset!=offset )
6890: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  {.    return -1;
68a0: 0a 20 20 7d 0a 20 20 67 6f 74 20 3d 20 72 65 61  .  }.  got = rea
68b0: 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  d(id->h, pBuf, c
68c0: 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49  nt);.#endif.  TI
68d0: 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41  MER_END;.  OSTRA
68e0: 43 45 35 28 22 52 45 41 44 20 20 20 20 25 2d 33  CE5("READ    %-3
68f0: 64 20 25 35 64 20 25 37 6c 6c 64 20 25 64 5c 6e  d %5d %7lld %d\n
6900: 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f  ", id->h, got, o
6910: 66 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41  ffset, TIMER_ELA
6920: 50 53 45 44 29 3b 0a 20 20 72 65 74 75 72 6e 20  PSED);.  return 
6930: 67 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  got;.}../*.** Re
6940: 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66  ad data from a f
6950: 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65  ile into a buffe
6960: 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
6970: 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62  E_OK if all.** b
6980: 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20 73  ytes were read s
6990: 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20  uccessfully and 
69a0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20  SQLITE_IOERR if 
69b0: 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
69c0: 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
69d0: 63 20 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a  c int unixRead(.
69e0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
69f0: 69 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75  id, .  void *pBu
6a00: 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20  f, .  int amt,. 
6a10: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
6a20: 66 66 73 65 74 0a 29 7b 0a 20 20 69 6e 74 20 67  ffset.){.  int g
6a30: 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  ot;.  assert( id
6a40: 20 29 3b 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b   );.  got = seek
6a50: 41 6e 64 52 65 61 64 28 28 75 6e 69 78 46 69 6c  AndRead((unixFil
6a60: 65 2a 29 69 64 2c 20 6f 66 66 73 65 74 2c 20 70  e*)id, offset, p
6a70: 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28  Buf, amt);.  if(
6a80: 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20   got==amt ){.   
6a90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6aa0: 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67  K;.  }else if( g
6ab0: 6f 74 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75  ot<0 ){.    retu
6ac0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
6ad0: 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  READ;.  }else{. 
6ae0: 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61     memset(&((cha
6af0: 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30  r*)pBuf)[got], 0
6b00: 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20  , amt-got);.    
6b10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
6b20: 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a  ERR_SHORT_READ;.
6b30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65    }.}../*.** See
6b40: 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  k to the offset 
6b50: 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20 74 68  in id->offset th
6b60: 65 6e 20 72 65 61 64 20 63 6e 74 20 62 79 74 65  en read cnt byte
6b70: 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20  s into pBuf..** 
6b80: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
6b90: 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
6ba0: 6c 6c 79 20 72 65 61 64 2e 20 20 55 70 64 61 74  lly read.  Updat
6bb0: 65 20 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2f  e the offset..*/
6bc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b  .static int seek
6bd0: 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69 6c  AndWrite(unixFil
6be0: 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73 65  e *id, i64 offse
6bf0: 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  t, const void *p
6c00: 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20  Buf, int cnt){. 
6c10: 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69 36 34 20   int got;.  i64 
6c20: 6e 65 77 4f 66 66 73 65 74 3b 0a 20 20 54 49 4d  newOffset;.  TIM
6c30: 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65  ER_START;.#if de
6c40: 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
6c50: 0a 20 20 67 6f 74 20 3d 20 70 77 72 69 74 65 28  .  got = pwrite(
6c60: 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
6c70: 2c 20 6f 66 66 73 65 74 29 3b 0a 23 65 6c 69 66  , offset);.#elif
6c80: 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
6c90: 41 44 36 34 29 0a 20 20 67 6f 74 20 3d 20 70 77  AD64).  got = pw
6ca0: 72 69 74 65 36 34 28 69 64 2d 3e 68 2c 20 70 42  rite64(id->h, pB
6cb0: 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29  uf, cnt, offset)
6cc0: 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66  ;.#else.  newOff
6cd0: 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e  set = lseek(id->
6ce0: 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f  h, offset, SEEK_
6cf0: 53 45 54 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f  SET);.  if( newO
6d00: 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b  ffset!=offset ){
6d10: 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
6d20: 20 20 7d 0a 20 20 67 6f 74 20 3d 20 77 72 69 74    }.  got = writ
6d30: 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  e(id->h, pBuf, c
6d40: 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49  nt);.#endif.  TI
6d50: 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41  MER_END;.  OSTRA
6d60: 43 45 35 28 22 57 52 49 54 45 20 20 20 25 2d 33  CE5("WRITE   %-3
6d70: 64 20 25 35 64 20 25 37 6c 6c 64 20 25 64 5c 6e  d %5d %7lld %d\n
6d80: 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f  ", id->h, got, o
6d90: 66 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41  ffset, TIMER_ELA
6da0: 50 53 45 44 29 3b 0a 20 20 72 65 74 75 72 6e 20  PSED);.  return 
6db0: 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57  got;.}.../*.** W
6dc0: 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61  rite data from a
6dd0: 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66   buffer into a f
6de0: 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ile.  Return SQL
6df0: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
6e00: 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68  s.** or some oth
6e10: 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e  er error code on
6e20: 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61   failure..*/.sta
6e30: 74 69 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74  tic int unixWrit
6e40: 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  e(.  sqlite3_fil
6e50: 65 20 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20  e *id, .  const 
6e60: 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69  void *pBuf, .  i
6e70: 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65  nt amt,.  sqlite
6e80: 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 0a  3_int64 offset .
6e90: 29 7b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20 3d  ){.  int wrote =
6ea0: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   0;.  assert( id
6eb0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d   );.  assert( am
6ec0: 74 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  t>0 );.  while( 
6ed0: 61 6d 74 3e 30 20 26 26 20 28 77 72 6f 74 65 20  amt>0 && (wrote 
6ee0: 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 28  = seekAndWrite((
6ef0: 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 6f 66  unixFile*)id, of
6f00: 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29  fset, pBuf, amt)
6f10: 29 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d  )>0 ){.    amt -
6f20: 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66  = wrote;.    off
6f30: 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20  set += wrote;.  
6f40: 20 20 70 42 75 66 20 3d 20 26 28 28 63 68 61 72    pBuf = &((char
6f50: 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a  *)pBuf)[wrote];.
6f60: 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f    }.  SimulateIO
6f70: 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d  Error(( wrote=(-
6f80: 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20  1), amt=1 ));.  
6f90: 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c  SimulateDiskfull
6fa0: 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c  Error(( wrote=0,
6fb0: 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 69 66 28   amt=1 ));.  if(
6fc0: 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 69 66   amt>0 ){.    if
6fd0: 28 20 77 72 6f 74 65 3c 30 20 29 7b 0a 20 20 20  ( wrote<0 ){.   
6fe0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6ff0: 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20  _IOERR_WRITE;.  
7000: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
7010: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
7020: 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  L;.    }.  }.  r
7030: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
7040: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
7050: 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75  E_TEST./*.** Cou
7060: 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
7070: 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e   fullsyncs and n
7080: 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68  ormal syncs.  Th
7090: 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  is is used to te
70a0: 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73  st.** that syncs
70b0: 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61   and fullsyncs a
70c0: 72 65 20 6f 63 63 75 72 69 6e 67 20 61 74 20 74  re occuring at t
70d0: 68 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a  he right times..
70e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
70f0: 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69  ync_count = 0;.i
7100: 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73  nt sqlite3_fulls
7110: 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  ync_count = 0;.#
7120: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 65  endif../*.** Use
7130: 20 74 68 65 20 66 64 61 74 61 73 79 6e 63 28 29   the fdatasync()
7140: 20 41 50 49 20 6f 6e 6c 79 20 69 66 20 74 68 65   API only if the
7150: 20 48 41 56 45 5f 46 44 41 54 41 53 59 4e 43 20   HAVE_FDATASYNC 
7160: 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64  macro is defined
7170: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 75  ..** Otherwise u
7180: 73 65 20 66 73 79 6e 63 28 29 20 69 6e 20 69 74  se fsync() in it
7190: 73 20 70 6c 61 63 65 2e 0a 2a 2f 0a 23 69 66 6e  s place..*/.#ifn
71a0: 64 65 66 20 48 41 56 45 5f 46 44 41 54 41 53 59  def HAVE_FDATASY
71b0: 4e 43 0a 23 20 64 65 66 69 6e 65 20 66 64 61 74  NC.# define fdat
71c0: 61 73 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64  async fsync.#end
71d0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65  if../*.** Define
71e0: 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20   HAVE_FULLFSYNC 
71f0: 74 6f 20 30 20 6f 72 20 31 20 64 65 70 65 6e 64  to 0 or 1 depend
7200: 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
7210: 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46  r not.** the F_F
7220: 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20 69  ULLFSYNC macro i
7230: 73 20 64 65 66 69 6e 65 64 2e 20 20 46 5f 46 55  s defined.  F_FU
7240: 4c 4c 46 53 59 4e 43 20 69 73 20 63 75 72 72 65  LLFSYNC is curre
7250: 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61  ntly.** only ava
7260: 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53  ilable on Mac OS
7270: 20 58 2e 20 20 42 75 74 20 74 68 61 74 20 63 6f   X.  But that co
7280: 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23  uld change..*/.#
7290: 69 66 64 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e  ifdef F_FULLFSYN
72a0: 43 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f  C.# define HAVE_
72b0: 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73  FULLFSYNC 1.#els
72c0: 65 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f  e.# define HAVE_
72d0: 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64  FULLFSYNC 0.#end
72e0: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  if.../*.** The f
72f0: 73 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61  sync() system ca
7300: 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  ll does not work
7310: 20 61 73 20 61 64 76 65 72 74 69 73 65 64 20 6f   as advertised o
7320: 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73  n many.** unix s
7330: 79 73 74 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c  ystems.  The fol
7340: 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65  lowing procedure
7350: 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74   is an attempt t
7360: 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72  o make.** it wor
7370: 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  k better..**.** 
7380: 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  The SQLITE_NO_SY
7390: 4e 43 20 6d 61 63 72 6f 20 64 69 73 61 62 6c 65  NC macro disable
73a0: 73 20 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20  s all fsync()s. 
73b0: 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 0a   This is useful.
73c0: 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 77  ** for testing w
73d0: 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 72  hen we want to r
73e0: 75 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 74  un through the t
73f0: 65 73 74 20 73 75 69 74 65 20 71 75 69 63 6b 6c  est suite quickl
7400: 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73 74  y..** You are st
7410: 72 6f 6e 67 6c 79 20 61 64 76 69 73 65 64 20 2a  rongly advised *
7420: 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77  not* to deploy w
7430: 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  ith SQLITE_NO_SY
7440: 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68  NC.** enabled, h
7450: 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 77 69  owever, since wi
7460: 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  th SQLITE_NO_SYN
7470: 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53  C enabled, an OS
7480: 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77   crash.** or pow
7490: 65 72 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20  er failure will 
74a0: 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70 74 20 74  likely corrupt t
74b0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
74c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
74d0: 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66  full_fsync(int f
74e0: 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c  d, int fullSync,
74f0: 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a   int dataOnly){.
7500: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
7510: 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65  Record the numbe
7520: 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20  r of times that 
7530: 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66  we do a normal f
7540: 73 79 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a  sync() and .  **
7550: 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73   FULLSYNC.  This
7560: 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20   is used during 
7570: 74 65 73 74 69 6e 67 20 74 6f 20 76 65 72 69 66  testing to verif
7580: 79 20 74 68 61 74 20 74 68 69 73 20 70 72 6f 63  y that this proc
7590: 65 64 75 72 65 0a 20 20 2a 2a 20 67 65 74 73 20  edure.  ** gets 
75a0: 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  called with the 
75b0: 63 6f 72 72 65 63 74 20 61 72 67 75 6d 65 6e 74  correct argument
75c0: 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  s..  */.#ifdef S
75d0: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28  QLITE_TEST.  if(
75e0: 20 66 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69   fullSync ) sqli
75f0: 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
7600: 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f  nt++;.  sqlite3_
7610: 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  sync_count++;.#e
7620: 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65  ndif..  /* If we
7630: 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74   compiled with t
7640: 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  he SQLITE_NO_SYN
7650: 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e  C flag, then syn
7660: 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e  cing is a.  ** n
7670: 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66  o-op.  */.#ifdef
7680: 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
7690: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
76a0: 3b 0a 23 65 6c 73 65 0a 0a 23 69 66 20 48 41 56  ;.#else..#if HAV
76b0: 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66  E_FULLFSYNC.  if
76c0: 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ( fullSync ){.  
76d0: 20 20 72 63 20 3d 20 66 63 6e 74 6c 28 66 64 2c    rc = fcntl(fd,
76e0: 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29   F_FULLFSYNC, 0)
76f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
7700: 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20  c = 1;.  }.  /* 
7710: 49 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43  If the FULLFSYNC
7720: 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61   failed, fall ba
7730: 63 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67  ck to attempting
7740: 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20 20   an fsync()..   
7750: 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20 62  * It shouldn't b
7760: 65 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66  e possible for f
7770: 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69 6c  ullfsync to fail
7780: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20   on the local . 
7790: 20 20 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20    * file system 
77a0: 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61 69  (on OSX), so fai
77b0: 6c 75 72 65 20 69 6e 64 69 63 61 74 65 73 20 74  lure indicates t
77c0: 68 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20  hat FULLFSYNC.  
77d0: 20 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74   * isn't support
77e0: 65 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65  ed for this file
77f0: 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74   system. So, att
7800: 65 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a 20  empt an fsync . 
7810: 20 20 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77    * and (for now
7820: 29 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65  ) ignore the ove
7830: 72 68 65 61 64 20 6f 66 20 61 20 73 75 70 65 72  rhead of a super
7840: 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c  fluous fcntl cal
7850: 6c 2e 20 20 0a 20 20 20 2a 20 49 74 27 64 20 62  l.  .   * It'd b
7860: 65 20 62 65 74 74 65 72 20 74 6f 20 64 65 74 65  e better to dete
7870: 63 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70  ct fullfsync sup
7880: 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76  port once and av
7890: 6f 69 64 20 0a 20 20 20 2a 20 74 68 65 20 66 63  oid .   * the fc
78a0: 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74  ntl call every t
78b0: 69 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c  ime sync is call
78c0: 65 64 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20  ed..   */.  if( 
78d0: 72 63 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28  rc ) rc = fsync(
78e0: 66 64 29 3b 0a 0a 23 65 6c 73 65 20 0a 20 20 69  fd);..#else .  i
78f0: 66 28 20 64 61 74 61 4f 6e 6c 79 20 29 7b 0a 20  f( dataOnly ){. 
7900: 20 20 20 72 63 20 3d 20 66 64 61 74 61 73 79 6e     rc = fdatasyn
7910: 63 28 66 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c(fd);.  }else{.
7920: 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66      rc = fsync(f
7930: 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  d);.  }.#endif /
7940: 2a 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  * HAVE_FULLFSYNC
7950: 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65   */.#endif /* de
7960: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f 5f  fined(SQLITE_NO_
7970: 53 59 4e 43 29 20 2a 2f 0a 0a 20 20 72 65 74 75  SYNC) */..  retu
7980: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
7990: 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72  Make sure all wr
79a0: 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63  ites to a partic
79b0: 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f  ular file are co
79c0: 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e  mmitted to disk.
79d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e  .**.** If dataOn
79e0: 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20  ly==0 then both 
79f0: 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20  the file itself 
7a00: 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74 61  and its metadata
7a10: 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20   (file.** size, 
7a20: 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63  access time, etc
7a30: 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49  ) are synced.  I
7a40: 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68  f dataOnly!=0 th
7a50: 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66  en only the.** f
7a60: 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e 63  ile data is sync
7a70: 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20  ed..**.** Under 
7a80: 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20  Unix, also make 
7a90: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64 69  sure that the di
7aa0: 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f  rectory entry fo
7ab0: 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61  r the file.** ha
7ac0: 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 62  s been created b
7ad0: 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20  y fsync-ing the 
7ae0: 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63  directory that c
7af0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65  ontains the file
7b00: 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f  ..** If we do no
7b10: 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65  t do this and we
7b20: 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77   encounter a pow
7b30: 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
7b40: 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74  directory.** ent
7b50: 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  ry for the journ
7b60: 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69  al might not exi
7b70: 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62 6f  st after we rebo
7b80: 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a  ot.  The next.**
7b90: 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73   SQLite to acces
7ba0: 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20  s the file will 
7bb0: 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68  not know that th
7bc0: 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  e journal exists
7bd0: 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65   (because.** the
7be0: 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79   directory entry
7bf0: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
7c00: 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61 74   was never creat
7c10: 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e  ed) and the tran
7c20: 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20  saction.** will 
7c30: 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20  not roll back - 
7c40: 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67  possibly leading
7c50: 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
7c60: 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
7c70: 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28  ic int unixSync(
7c80: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
7c90: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
7ca0: 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69  int rc;.  unixFi
7cb0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
7cc0: 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e  xFile*)id;..  in
7cd0: 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28  t isDataOnly = (
7ce0: 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e  flags&SQLITE_SYN
7cf0: 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69  C_DATAONLY);.  i
7d00: 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20  nt isFullsync = 
7d10: 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
7d20: 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
7d30: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
7d40: 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53   one of SQLITE_S
7d50: 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55  YNC_NORMAL or FU
7d60: 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f  LL was passed */
7d70: 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73  .  assert((flags
7d80: 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
7d90: 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20  YNC_NORMAL.     
7da0: 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29   || (flags&0x0F)
7db0: 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
7dc0: 4c 4c 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72  LL.  );..  asser
7dd0: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
7de0: 54 52 41 43 45 32 28 22 53 59 4e 43 20 20 20 20  TRACE2("SYNC    
7df0: 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  %-3d\n", pFile->
7e00: 68 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f  h);.  rc = full_
7e10: 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20  fsync(pFile->h, 
7e20: 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61  isFullsync, isDa
7e30: 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c  taOnly);.  Simul
7e40: 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31  ateIOError( rc=1
7e50: 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   );.  if( rc ){.
7e60: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7e70: 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 3b 0a 20  E_IOERR_FSYNC;. 
7e80: 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e   }.  if( pFile->
7e90: 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20  dirfd>=0 ){.    
7ea0: 4f 53 54 52 41 43 45 34 28 22 44 49 52 53 59 4e  OSTRACE4("DIRSYN
7eb0: 43 20 25 2d 33 64 20 28 68 61 76 65 5f 66 75 6c  C %-3d (have_ful
7ec0: 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79  lfsync=%d fullsy
7ed0: 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65  nc=%d)\n", pFile
7ee0: 2d 3e 64 69 72 66 64 2c 0a 20 20 20 20 20 20 20  ->dirfd,.       
7ef0: 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c 46 53       HAVE_FULLFS
7f00: 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29  YNC, isFullsync)
7f10: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
7f20: 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43  _DISABLE_DIRSYNC
7f30: 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65  .    /* The dire
7f40: 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20 6f 6e  ctory sync is on
7f50: 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20  ly attempted if 
7f60: 66 75 6c 6c 5f 66 73 79 6e 63 20 69 73 0a 20 20  full_fsync is.  
7f70: 20 20 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66 20    ** turned off 
7f80: 6f 72 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20  or unavailable. 
7f90: 20 49 66 20 61 20 66 75 6c 6c 5f 66 73 79 6e 63   If a full_fsync
7fa0: 20 6f 63 63 75 72 72 65 64 20 61 62 6f 76 65 2c   occurred above,
7fb0: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  .    ** then the
7fc0: 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20   directory sync 
7fd0: 69 73 20 73 75 70 65 72 66 6c 75 6f 75 73 2e 0a  is superfluous..
7fe0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
7ff0: 21 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20  !HAVE_FULLFSYNC 
8000: 7c 7c 20 21 69 73 46 75 6c 6c 73 79 6e 63 29 20  || !isFullsync) 
8010: 26 26 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46  && full_fsync(pF
8020: 69 6c 65 2d 3e 64 69 72 66 64 2c 30 2c 30 29 20  ile->dirfd,0,0) 
8030: 29 7b 0a 20 20 20 20 20 20 20 2f 2a 0a 20 20 20  ){.       /*.   
8040: 20 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20 72      ** We have r
8050: 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70 6c 65  eceived multiple
8060: 20 72 65 70 6f 72 74 73 20 6f 66 20 66 73 79 6e   reports of fsyn
8070: 63 28 29 20 72 65 74 75 72 6e 69 6e 67 0a 20 20  c() returning.  
8080: 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 73 20 77       ** errors w
8090: 68 65 6e 20 61 70 70 6c 69 65 64 20 74 6f 20 64  hen applied to d
80a0: 69 72 65 63 74 6f 72 69 65 73 20 6f 6e 20 63 65  irectories on ce
80b0: 72 74 61 69 6e 20 66 69 6c 65 20 73 79 73 74 65  rtain file syste
80c0: 6d 73 2e 0a 20 20 20 20 20 20 20 2a 2a 20 41 20  ms..       ** A 
80d0: 66 61 69 6c 65 64 20 64 69 72 65 63 74 6f 72 79  failed directory
80e0: 20 73 79 6e 63 20 69 73 20 6e 6f 74 20 61 20 62   sync is not a b
80f0: 69 67 20 64 65 61 6c 2e 20 20 53 6f 20 69 74 20  ig deal.  So it 
8100: 73 65 65 6d 73 0a 20 20 20 20 20 20 20 2a 2a 20  seems.       ** 
8110: 62 65 74 74 65 72 20 74 6f 20 69 67 6e 6f 72 65  better to ignore
8120: 20 74 68 65 20 65 72 72 6f 72 2e 20 20 54 69 63   the error.  Tic
8130: 6b 65 74 20 23 31 36 35 37 0a 20 20 20 20 20 20  ket #1657.      
8140: 20 2a 2f 0a 20 20 20 20 20 20 20 2f 2a 20 72 65   */.       /* re
8150: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
8160: 52 3b 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e 64  R; */.    }.#end
8170: 69 66 0a 20 20 20 20 63 6c 6f 73 65 28 70 46 69  if.    close(pFi
8180: 6c 65 2d 3e 64 69 72 66 64 29 3b 20 20 2f 2a 20  le->dirfd);  /* 
8190: 4f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 79 6e  Only need to syn
81a0: 63 20 6f 6e 63 65 2c 20 73 6f 20 63 6c 6f 73 65  c once, so close
81b0: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 2a   the directory *
81c0: 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 69 72  /.    pFile->dir
81d0: 66 64 20 3d 20 2d 31 3b 20 20 20 20 2f 2a 20 77  fd = -1;    /* w
81e0: 68 65 6e 20 77 65 20 61 72 65 20 64 6f 6e 65 2e  hen we are done.
81f0: 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
8200: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
8210: 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e  *.** Truncate an
8220: 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20   open file to a 
8230: 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a  specified size.*
8240: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
8250: 78 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65  xTruncate(sqlite
8260: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  3_file *id, i64 
8270: 6e 42 79 74 65 29 7b 0a 20 20 69 6e 74 20 72 63  nByte){.  int rc
8280: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29  ;.  assert( id )
8290: 3b 0a 20 20 72 63 20 3d 20 66 74 72 75 6e 63 61  ;.  rc = ftrunca
82a0: 74 65 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  te(((unixFile*)i
82b0: 64 29 2d 3e 68 2c 20 28 6f 66 66 5f 74 29 6e 42  d)->h, (off_t)nB
82c0: 79 74 65 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  yte);.  Simulate
82d0: 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b  IOError( rc=1 );
82e0: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
82f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
8300: 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 3b 0a 20  OERR_TRUNCATE;. 
8310: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
8320: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
8330: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  }.}../*.** Deter
8340: 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74  mine the current
8350: 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20   size of a file 
8360: 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74  in bytes.*/.stat
8370: 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 53  ic int unixFileS
8380: 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
8390: 20 2a 69 64 2c 20 69 36 34 20 2a 70 53 69 7a 65   *id, i64 *pSize
83a0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
83b0: 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
83c0: 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
83d0: 20 20 72 63 20 3d 20 66 73 74 61 74 28 28 28 75    rc = fstat(((u
83e0: 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c  nixFile*)id)->h,
83f0: 20 26 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61   &buf);.  Simula
8400: 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20  teIOError( rc=1 
8410: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
8420: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
8430: 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
8440: 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20  .  }.  *pSize = 
8450: 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 72  buf.st_size;.  r
8460: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8470: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
8480: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
8490: 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
84a0: 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
84b0: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
84c0: 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
84d0: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
84e0: 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
84f0: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 72 65  lock is held, re
8500: 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  turn.** non-zero
8510: 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  .  If the file i
8520: 73 20 75 6e 6c 6f 63 6b 65 64 20 6f 72 20 68 6f  s unlocked or ho
8530: 6c 64 73 20 6f 6e 6c 79 20 53 48 41 52 45 44 20  lds only SHARED 
8540: 6c 6f 63 6b 73 2c 20 74 68 65 6e 0a 2a 2a 20 72  locks, then.** r
8550: 65 74 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  eturn zero..*/.s
8560: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68  tatic int unixCh
8570: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
8580: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
8590: 29 7b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a  ){.  int r = 0;.
85a0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
85b0: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
85c0: 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  d;..  assert( pF
85d0: 69 6c 65 20 29 3b 0a 20 20 65 6e 74 65 72 4d 75  ile );.  enterMu
85e0: 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73  tex(); /* Becaus
85f0: 65 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69  e pFile->pLock i
8600: 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20  s shared across 
8610: 74 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a  threads */..  /*
8620: 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
8630: 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
8640: 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
8650: 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
8660: 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  ile->pLock->lock
8670: 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  type>SHARED_LOCK
8680: 20 29 7b 0a 20 20 20 20 72 20 3d 20 31 3b 0a 20   ){.    r = 1;. 
8690: 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69   }..  /* Otherwi
86a0: 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
86b0: 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
86c0: 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  ds it..  */.  if
86d0: 28 20 21 72 20 29 7b 0a 20 20 20 20 73 74 72 75  ( !r ){.    stru
86e0: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
86f0: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
8700: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
8710: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
8720: 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20  RESERVED_BYTE;. 
8730: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
8740: 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  1;.    lock.l_ty
8750: 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20  pe = F_WRLCK;.  
8760: 20 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68    fcntl(pFile->h
8770: 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_GETLK, &lock
8780: 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 2e  );.    if( lock.
8790: 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20  l_type!=F_UNLCK 
87a0: 29 7b 0a 20 20 20 20 20 20 72 20 3d 20 31 3b 0a  ){.      r = 1;.
87b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 6c      }.  }.  .  l
87c0: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
87d0: 53 54 52 41 43 45 33 28 22 54 45 53 54 20 57 52  STRACE3("TEST WR
87e0: 2d 4c 4f 43 4b 20 25 64 20 25 64 5c 6e 22 2c 20  -LOCK %d %d\n", 
87f0: 70 46 69 6c 65 2d 3e 68 2c 20 72 29 3b 0a 0a 20  pFile->h, r);.. 
8800: 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a   return r;.}../*
8810: 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
8820: 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
8830: 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
8840: 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20  ameter locktype 
8850: 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
8860: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
8870: 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
8880: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
8890: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
88a0: 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
88b0: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
88c0: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
88d0: 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
88e0: 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
88f0: 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
8900: 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
8910: 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
8920: 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
8930: 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
8940: 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
8950: 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
8960: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
8970: 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
8980: 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
8990: 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
89a0: 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
89b0: 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
89c0: 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
89d0: 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
89e0: 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
89f0: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
8a00: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
8a10: 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
8a20: 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
8a30: 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
8a40: 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
8a50: 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
8a60: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
8a70: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
8a80: 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
8a90: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
8aa0: 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
8ab0: 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
8ac0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
8ad0: 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
8ae0: 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
8af0: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
8b00: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
8b10: 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
8b20: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
8b30: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
8b40: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
8b50: 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
8b60: 79 70 65 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66  ype){.  /* The f
8b70: 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72 69 62  ollowing describ
8b80: 65 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  es the implement
8b90: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 61 72  ation of the var
8ba0: 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20  ious locks and. 
8bb0: 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74   ** lock transit
8bc0: 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f 66  ions in terms of
8bd0: 20 74 68 65 20 50 4f 53 49 58 20 61 64 76 69 73   the POSIX advis
8be0: 6f 72 79 20 73 68 61 72 65 64 20 61 6e 64 20 65  ory shared and e
8bf0: 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f  xclusive.  ** lo
8c00: 63 6b 20 70 72 69 6d 69 74 69 76 65 73 20 28 63  ck primitives (c
8c10: 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73  alled read-locks
8c20: 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73   and write-locks
8c30: 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64   below, to avoid
8c40: 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20  .  ** confusion 
8c50: 77 69 74 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b  with SQLite lock
8c60: 20 6e 61 6d 65 73 29 2e 20 54 68 65 20 61 6c 67   names). The alg
8c70: 6f 72 69 74 68 6d 73 20 61 72 65 20 63 6f 6d 70  orithms are comp
8c80: 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69  licated.  ** sli
8c90: 67 68 74 6c 79 20 69 6e 20 6f 72 64 65 72 20 74  ghtly in order t
8ca0: 6f 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  o be compatible 
8cb0: 77 69 74 68 20 77 69 6e 64 6f 77 73 20 73 79 73  with windows sys
8cc0: 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75  tems simultaneou
8cd0: 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73 73 69  sly.  ** accessi
8ce0: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
8cf0: 62 61 73 65 20 66 69 6c 65 2c 20 69 6e 20 63 61  base file, in ca
8d00: 73 65 20 74 68 61 74 20 69 73 20 65 76 65 72 20  se that is ever 
8d10: 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20  required..  **. 
8d20: 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66 69   ** Symbols defi
8d30: 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65  ned in os.h inde
8d40: 6e 74 69 66 79 20 74 68 65 20 27 70 65 6e 64 69  ntify the 'pendi
8d50: 6e 67 20 62 79 74 65 27 20 61 6e 64 20 74 68 65  ng byte' and the
8d60: 20 27 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20   'reserved.  ** 
8d70: 62 79 74 65 27 2c 20 65 61 63 68 20 73 69 6e 67  byte', each sing
8d80: 6c 65 20 62 79 74 65 73 20 61 74 20 77 65 6c 6c  le bytes at well
8d90: 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20   known offsets, 
8da0: 61 6e 64 20 74 68 65 20 27 73 68 61 72 65 64 20  and the 'shared 
8db0: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
8dc0: 2c 20 61 20 72 61 6e 67 65 20 6f 66 20 35 31 30  , a range of 510
8dd0: 20 62 79 74 65 73 20 61 74 20 61 20 77 65 6c 6c   bytes at a well
8de0: 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20   known offset.. 
8df0: 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61   **.  ** To obta
8e00: 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  in a SHARED lock
8e10: 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73  , a read-lock is
8e20: 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
8e30: 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62   'pending.  ** b
8e40: 79 74 65 27 2e 20 20 49 66 20 74 68 69 73 20 69  yte'.  If this i
8e50: 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20  s successful, a 
8e60: 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d  random byte from
8e70: 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74   the 'shared byt
8e80: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73  e.  ** range' is
8e90: 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64   read-locked and
8ea0: 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
8eb0: 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20   'pending byte' 
8ec0: 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20  released..  **. 
8ed0: 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61   ** A process ma
8ee0: 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20  y only obtain a 
8ef0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 66  RESERVED lock af
8f00: 74 65 72 20 69 74 20 68 61 73 20 61 20 53 48 41  ter it has a SHA
8f10: 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41  RED lock..  ** A
8f20: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
8f30: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  s implemented by
8f40: 20 67 72 61 62 62 69 6e 67 20 61 20 77 72 69 74   grabbing a writ
8f50: 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  e-lock on the.  
8f60: 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62 79 74  ** 'reserved byt
8f70: 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  e'. .  **.  ** A
8f80: 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c   process may onl
8f90: 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44 49  y obtain a PENDI
8fa0: 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74  NG lock after it
8fb0: 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61 0a   has obtained a.
8fc0: 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b    ** SHARED lock
8fd0: 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  . A PENDING lock
8fe0: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
8ff0: 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77  by obtaining a w
9000: 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f  rite-lock.  ** o
9010: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  n the 'pending b
9020: 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75 72  yte'. This ensur
9030: 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20 53  es that no new S
9040: 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20  HARED locks can 
9050: 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64  be.  ** obtained
9060: 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67 20 53  , but existing S
9070: 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65 20  HARED locks are 
9080: 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73 69  allowed to persi
9090: 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20 20  st. A process.  
90a0: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ** does not have
90b0: 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45 53   to obtain a RES
90c0: 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
90d0: 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44 49  e way to a PENDI
90e0: 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68  NG lock..  ** Th
90f0: 69 73 20 70 72 6f 70 65 72 74 79 20 69 73 20 75  is property is u
9100: 73 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f 72  sed by the algor
9110: 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67  ithm for rolling
9120: 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20   back a journal 
9130: 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72 20  file.  ** after 
9140: 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20  a crash..  **.  
9150: 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20  ** An EXCLUSIVE 
9160: 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61  lock, obtained a
9170: 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20 6c  fter a PENDING l
9180: 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73 0a  ock is held, is.
9190: 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64    ** implemented
91a0: 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20   by obtaining a 
91b0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
91c0: 65 20 65 6e 74 69 72 65 20 27 73 68 61 72 65 64  e entire 'shared
91d0: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
91e0: 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68  '. Since all oth
91f0: 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65  er locks require
9200: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20   a read-lock on 
9210: 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65 73  one of the bytes
9220: 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 69  .  ** within thi
9230: 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65 6e  s range, this en
9240: 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f 74  sures that no ot
9250: 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68 65  her locks are he
9260: 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64  ld on the.  ** d
9270: 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20  atabase. .  **. 
9280: 20 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e 20 61   ** The reason a
9290: 20 73 69 6e 67 6c 65 20 62 79 74 65 20 63 61 6e   single byte can
92a0: 6e 6f 74 20 62 65 20 75 73 65 64 20 69 6e 73 74  not be used inst
92b0: 65 61 64 20 6f 66 20 74 68 65 20 27 73 68 61 72  ead of the 'shar
92c0: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
92d0: 67 65 27 20 69 73 20 74 68 61 74 20 73 6f 6d 65  ge' is that some
92e0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e   versions of win
92f0: 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75 70 70  dows do not supp
9300: 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20  ort read-locks. 
9310: 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20  By.  ** locking 
9320: 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72  a random byte fr
9330: 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63  om a range, conc
9340: 75 72 72 65 6e 74 20 53 48 41 52 45 44 20 6c 6f  urrent SHARED lo
9350: 63 6b 73 20 6d 61 79 20 65 78 69 73 74 0a 20 20  cks may exist.  
9360: 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 65 20 6c  ** even if the l
9370: 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65  ocking primitive
9380: 20 75 73 65 64 20 69 73 20 61 6c 77 61 79 73 20   used is always 
9390: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20  a write-lock..  
93a0: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
93b0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
93c0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
93d0: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 74  ixFile*)id;.  st
93e0: 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70  ruct lockInfo *p
93f0: 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c  Lock = pFile->pL
9400: 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20 66 6c  ock;.  struct fl
9410: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20  ock lock;.  int 
9420: 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  s;..  assert( pF
9430: 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
9440: 37 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  7("LOCK    %d %s
9450: 20 77 61 73 20 25 73 28 25 73 2c 25 64 29 20 70   was %s(%s,%d) p
9460: 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  id=%d\n", pFile-
9470: 3e 68 2c 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79  >h,.      lockty
9480: 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29  peName(locktype)
9490: 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70  , locktypeName(p
94a0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c  File->locktype),
94b0: 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e  .      locktypeN
94c0: 61 6d 65 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  ame(pLock->lockt
94d0: 79 70 65 29 2c 20 70 4c 6f 63 6b 2d 3e 63 6e 74  ype), pLock->cnt
94e0: 20 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20   , getpid());.. 
94f0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
9500: 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f  already a lock o
9510: 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d  f this type or m
9520: 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20  ore restrictive 
9530: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78  on the.  ** unix
9540: 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67  File, do nothing
9550: 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20  . Don't use the 
9560: 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70  end_lock: exit p
9570: 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 65 6e 74  ath, as.  ** ent
9580: 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74  erMutex() hasn't
9590: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74   been called yet
95a0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
95b0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f  le->locktype>=lo
95c0: 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 4f 53  cktype ){.    OS
95d0: 54 52 41 43 45 33 28 22 4c 4f 43 4b 20 20 20 20  TRACE3("LOCK    
95e0: 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64  %d %s ok (alread
95f0: 79 20 68 65 6c 64 29 5c 6e 22 2c 20 70 46 69 6c  y held)\n", pFil
9600: 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
9610: 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c    locktypeName(l
9620: 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 20 20 72  ocktype));.    r
9630: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
9640: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
9650: 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  sure the locking
9660: 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72   sequence is cor
9670: 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65  rect.  */.  asse
9680: 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
9690: 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ype!=NO_LOCK || 
96a0: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
96b0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
96c0: 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e  t( locktype!=PEN
96d0: 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  DING_LOCK );.  a
96e0: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
96f0: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
9700: 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  | pFile->locktyp
9710: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
9720: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74  ;..  /* This mut
9730: 65 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63  ex is needed bec
9740: 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 4c 6f 63  ause pFile->pLoc
9750: 6b 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  k is shared acro
9760: 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a  ss threads.  */.
9770: 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a    enterMutex();.
9780: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
9790: 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
97a0: 61 64 20 6f 77 6e 73 20 74 68 65 20 70 46 69 6c  ad owns the pFil
97b0: 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74  e..  */.  rc = t
97c0: 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70  ransferOwnership
97d0: 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72  (pFile);.  if( r
97e0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
97f0: 20 20 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29      leaveMutex()
9800: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
9810: 0a 20 20 7d 0a 20 20 70 4c 6f 63 6b 20 3d 20 70  .  }.  pLock = p
9820: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20  File->pLock;..  
9830: 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61  /* If some threa
9840: 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
9850: 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20   has a lock via 
9860: 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78  a different unix
9870: 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c  File*.  ** handl
9880: 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73  e that precludes
9890: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
98a0: 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59  ock, return BUSY
98b0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46  ..  */.  if( (pF
98c0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 70  ile->locktype!=p
98d0: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 26  Lock->locktype &
98e0: 26 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 4c  & .          (pL
98f0: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50  ock->locktype>=P
9900: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 6c  ENDING_LOCK || l
9910: 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c  ocktype>SHARED_L
9920: 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  OCK)).  ){.    r
9930: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
9940: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f  .    goto end_lo
9950: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ck;.  }..  /* If
9960: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
9970: 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64  s requested, and
9980: 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
9990: 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65  ng this PID alre
99a0: 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53  ady.  ** has a S
99b0: 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45  HARED or RESERVE
99c0: 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63  D lock, then inc
99d0: 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65  rement reference
99e0: 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a   counts and.  **
99f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9a00: 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  K..  */.  if( lo
9a10: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
9a20: 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28 70  OCK && .      (p
9a30: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  Lock->locktype==
9a40: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SHARED_LOCK || p
9a50: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  Lock->locktype==
9a60: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29  RESERVED_LOCK) )
9a70: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f  {.    assert( lo
9a80: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
9a90: 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  OCK );.    asser
9aa0: 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
9ab0: 70 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  pe==0 );.    ass
9ac0: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e  ert( pLock->cnt>
9ad0: 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 );.    pFile->
9ae0: 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45  locktype = SHARE
9af0: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f 63  D_LOCK;.    pLoc
9b00: 6b 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 70 46  k->cnt++;.    pF
9b10: 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63  ile->pOpen->nLoc
9b20: 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  k++;.    goto en
9b30: 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 6c  d_lock;.  }..  l
9b40: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a  ock.l_len = 1L;.
9b50: 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65  .  lock.l_whence
9b60: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 0a 20 20   = SEEK_SET;..  
9b70: 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63  /* A PENDING loc
9b80: 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f  k is needed befo
9b90: 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53  re acquiring a S
9ba0: 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62  HARED lock and b
9bb0: 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69  efore.  ** acqui
9bc0: 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ring an EXCLUSIV
9bd0: 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65  E lock.  For the
9be0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
9bf0: 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20  e PENDING will. 
9c00: 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e   ** be released.
9c10: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
9c20: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
9c30: 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 6c 6f 63  K .      || (loc
9c40: 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
9c50: 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e  _LOCK && pFile->
9c60: 6c 6f 63 6b 74 79 70 65 3c 50 45 4e 44 49 4e 47  locktype<PENDING
9c70: 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20  _LOCK).  ){.    
9c80: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 6c  lock.l_type = (l
9c90: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
9ca0: 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57  LOCK?F_RDLCK:F_W
9cb0: 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e  RLCK);.    lock.
9cc0: 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e  l_start = PENDIN
9cd0: 47 5f 42 59 54 45 3b 0a 20 20 20 20 73 20 3d 20  G_BYTE;.    s = 
9ce0: 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  fcntl(pFile->h, 
9cf0: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b  F_SETLK, &lock);
9d00: 0a 20 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29  .    if( s==(-1)
9d10: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 28   ){.      rc = (
9d20: 65 72 72 6e 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f  errno==EINVAL) ?
9d30: 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 3a 20   SQLITE_NOLFS : 
9d40: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
9d50: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
9d60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
9d70: 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65  /* If control ge
9d80: 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ts to this point
9d90: 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20  , then actually 
9da0: 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b  go ahead and mak
9db0: 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67  e.  ** operating
9dc0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f   system calls fo
9dd0: 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
9de0: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lock..  */.  if(
9df0: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
9e00: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  D_LOCK ){.    as
9e10: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74  sert( pLock->cnt
9e20: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
9e30: 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79  t( pLock->lockty
9e40: 70 65 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a  pe==0 );..    /*
9e50: 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61   Now get the rea
9e60: 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f  d-lock */.    lo
9e70: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
9e80: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c  RED_FIRST;.    l
9e90: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
9ea0: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 73 20 3d  ED_SIZE;.    s =
9eb0: 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c   fcntl(pFile->h,
9ec0: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
9ed0: 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74  ;..    /* Drop t
9ee0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e  he temporary PEN
9ef0: 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  DING lock */.   
9f00: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
9f10: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
9f20: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
9f30: 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  L;.    lock.l_ty
9f40: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
9f50: 20 20 69 66 28 20 66 63 6e 74 6c 28 70 46 69 6c    if( fcntl(pFil
9f60: 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
9f70: 6c 6f 63 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  lock)!=0 ){.    
9f80: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
9f90: 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 20 2f 2a 20  ERR_UNLOCK;  /* 
9fa0: 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65  This should neve
9fb0: 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20  r happen */.    
9fc0: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
9fd0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
9fe0: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
9ff0: 72 63 20 3d 20 28 65 72 72 6e 6f 3d 3d 45 49 4e  rc = (errno==EIN
a000: 56 41 4c 29 20 3f 20 53 51 4c 49 54 45 5f 4e 4f  VAL) ? SQLITE_NO
a010: 4c 46 53 20 3a 20 53 51 4c 49 54 45 5f 42 55 53  LFS : SQLITE_BUS
a020: 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  Y;.    }else{.  
a030: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
a040: 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ype = SHARED_LOC
a050: 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  K;.      pFile->
a060: 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  pOpen->nLock++;.
a070: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74        pLock->cnt
a080: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
a090: 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  lse if( locktype
a0a0: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
a0b0: 20 26 26 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 31   && pLock->cnt>1
a0c0: 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72   ){.    /* We ar
a0d0: 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20  e trying for an 
a0e0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62  exclusive lock b
a0f0: 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  ut another threa
a100: 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a  d in this.    **
a110: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
a120: 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
a130: 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
a140: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
a150: 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BUSY;.  }else{.
a160: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
a170: 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53  st was for a RES
a180: 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
a190: 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a  VE lock.  It is.
a1a0: 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74      ** assumed t
a1b0: 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53  hat there is a S
a1c0: 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72  HARED or greater
a1d0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
a1e0: 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79  e.    ** already
a1f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
a200: 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 6c  ert( 0!=pFile->l
a210: 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20 6c  ocktype );.    l
a220: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
a230: 52 4c 43 4b 3b 0a 20 20 20 20 73 77 69 74 63 68  RLCK;.    switch
a240: 28 20 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  ( locktype ){.  
a250: 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56 45      case RESERVE
a260: 44 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20  D_LOCK:.        
a270: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52  lock.l_start = R
a280: 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20  ESERVED_BYTE;.  
a290: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a2a0: 20 20 20 63 61 73 65 20 45 58 43 4c 55 53 49 56     case EXCLUSIV
a2b0: 45 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20  E_LOCK:.        
a2c0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
a2d0: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
a2e0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
a2f0: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
a300: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a310: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
a320: 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a       assert(0);.
a330: 20 20 20 20 7d 0a 20 20 20 20 73 20 3d 20 66 63      }.    s = fc
a340: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
a350: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20  SETLK, &lock);. 
a360: 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 29     if( s==(-1) )
a370: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 65 72  {.      rc = (er
a380: 72 6e 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f 20 53  rno==EINVAL) ? S
a390: 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53 51  QLITE_NOLFS : SQ
a3a0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
a3b0: 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63  .  }.  .  if( rc
a3c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
a3d0: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
a3e0: 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
a3f0: 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79     pLock->lockty
a400: 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
a410: 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74   }else if( lockt
a420: 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
a430: 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
a440: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e  ->locktype = PEN
a450: 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  DING_LOCK;.    p
a460: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  Lock->locktype =
a470: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
a480: 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20   }..end_lock:.  
a490: 6c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  leaveMutex();.  
a4a0: 4f 53 54 52 41 43 45 34 28 22 4c 4f 43 4b 20 20  OSTRACE4("LOCK  
a4b0: 20 20 25 64 20 25 73 20 25 73 5c 6e 22 2c 20 70    %d %s %s\n", p
a4c0: 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
a4d0: 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c  eName(locktype),
a4e0: 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49   .      rc==SQLI
a4f0: 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
a500: 66 61 69 6c 65 64 22 29 3b 0a 20 20 72 65 74 75  failed");.  retu
a510: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
a520: 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
a530: 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
a540: 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
a550: 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c   to locktype.  l
a560: 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20  ocktype.** must 
a570: 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
a580: 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
a590: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
a5a0: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
a5b0: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
a5c0: 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
a5d0: 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
a5e0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
a5f0: 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
a600: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
a610: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
a620: 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c  t unixUnlock(sql
a630: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
a640: 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
a650: 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20  struct lockInfo 
a660: 2a 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74  *pLock;.  struct
a670: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69   flock lock;.  i
a680: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
a690: 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
a6a0: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
a6b0: 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28  *)id;..  assert(
a6c0: 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
a6d0: 41 43 45 37 28 22 55 4e 4c 4f 43 4b 20 20 25 64  ACE7("UNLOCK  %d
a6e0: 20 25 64 20 77 61 73 20 25 64 28 25 64 2c 25 64   %d was %d(%d,%d
a6f0: 29 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69  ) pid=%d\n", pFi
a700: 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c  le->h, locktype,
a710: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
a720: 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 70  cktype, pFile->p
a730: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  Lock->locktype, 
a740: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e  pFile->pLock->cn
a750: 74 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20  t, getpid());.. 
a760: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
a770: 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e<=SHARED_LOCK )
a780: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  ;.  if( pFile->l
a790: 6f 63 6b 74 79 70 65 3c 3d 6c 6f 63 6b 74 79 70  ocktype<=locktyp
a7a0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
a7b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
a7c0: 20 69 66 28 20 43 48 45 43 4b 5f 54 48 52 45 41   if( CHECK_THREA
a7d0: 44 49 44 28 70 46 69 6c 65 29 20 29 7b 0a 20 20  DID(pFile) ){.  
a7e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a7f0: 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 65 6e  MISUSE;.  }.  en
a800: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 4c  terMutex();.  pL
a810: 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f  ock = pFile->pLo
a820: 63 6b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  ck;.  assert( pL
a830: 6f 63 6b 2d 3e 63 6e 74 21 3d 30 20 29 3b 0a 20  ock->cnt!=0 );. 
a840: 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
a850: 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  type>SHARED_LOCK
a860: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
a870: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pLock->locktype=
a880: 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  =pFile->locktype
a890: 20 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b   );.    if( lock
a8a0: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
a8b0: 4b 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  K ){.      lock.
a8c0: 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
a8d0: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  ;.      lock.l_w
a8e0: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
a8f0: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ;.      lock.l_s
a900: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
a910: 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  RST;.      lock.
a920: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
a930: 49 5a 45 3b 0a 20 20 20 20 20 20 69 66 28 20 66  IZE;.      if( f
a940: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
a950: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d  _SETLK, &lock)==
a960: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
a970: 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  /* This should n
a980: 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20  ever happen */. 
a990: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
a9a0: 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b  TE_IOERR_RDLOCK;
a9b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a9c0: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
a9d0: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f   F_UNLCK;.    lo
a9e0: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
a9f0: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b  EK_SET;.    lock
aa00: 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49  .l_start = PENDI
aa10: 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63  NG_BYTE;.    loc
aa20: 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61  k.l_len = 2L;  a
aa30: 73 73 65 72 74 28 20 50 45 4e 44 49 4e 47 5f 42  ssert( PENDING_B
aa40: 59 54 45 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f  YTE+1==RESERVED_
aa50: 42 59 54 45 20 29 3b 0a 20 20 20 20 69 66 28 20  BYTE );.    if( 
aa60: 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  fcntl(pFile->h, 
aa70: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21  F_SETLK, &lock)!
aa80: 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 70  =(-1) ){.      p
aa90: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  Lock->locktype =
aaa0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
aab0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
aac0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
aad0: 5f 55 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54 68 69  _UNLOCK;  /* Thi
aae0: 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68  s should never h
aaf0: 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20  appen */.    }. 
ab00: 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70   }.  if( locktyp
ab10: 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20  e==NO_LOCK ){.  
ab20: 20 20 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74    struct openCnt
ab30: 20 2a 70 4f 70 65 6e 3b 0a 0a 20 20 20 20 2f 2a   *pOpen;..    /*
ab40: 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73   Decrement the s
ab50: 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74  hared lock count
ab60: 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65  er.  Release the
ab70: 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20   lock using an. 
ab80: 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e     ** OS call on
ab90: 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65  ly when all thre
aba0: 61 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65  ads in this same
abb0: 20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65   process have re
abc0: 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68  leased.    ** th
abd0: 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  e lock..    */. 
abe0: 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2d 2d 3b     pLock->cnt--;
abf0: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
ac00: 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  cnt==0 ){.      
ac10: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
ac20: 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63  UNLCK;.      loc
ac30: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
ac40: 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63  K_SET;.      loc
ac50: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b  k.l_start = lock
ac60: 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20  .l_len = 0L;.   
ac70: 20 20 20 69 66 28 20 66 63 6e 74 6c 28 70 46 69     if( fcntl(pFi
ac80: 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  le->h, F_SETLK, 
ac90: 26 6c 6f 63 6b 29 21 3d 28 2d 31 29 20 29 7b 0a  &lock)!=(-1) ){.
aca0: 20 20 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c          pLock->l
acb0: 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43  ocktype = NO_LOC
acc0: 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  K;.      }else{.
acd0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
ace0: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
acf0: 3b 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c  ;  /* This shoul
ad00: 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a  d never happen *
ad10: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
ad20: 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
ad30: 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c  t the count of l
ad40: 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68 69  ocks against thi
ad50: 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57 68  s same file.  Wh
ad60: 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f  en the.    ** co
ad70: 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f  unt reaches zero
ad80: 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65  , close any othe
ad90: 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  r file descripto
ada0: 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20  rs whose close. 
adb0: 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72 72     ** was deferr
adc0: 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f 75  ed because of ou
add0: 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e  tstanding locks.
ade0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4f 70 65  .    */.    pOpe
adf0: 6e 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e  n = pFile->pOpen
ae00: 3b 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f  ;.    pOpen->nLo
ae10: 63 6b 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74  ck--;.    assert
ae20: 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d  ( pOpen->nLock>=
ae30: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 70  0 );.    if( pOp
ae40: 65 6e 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 26 26 20  en->nLock==0 && 
ae50: 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3e  pOpen->nPending>
ae60: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
ae70: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
ae80: 20 69 3c 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69   i<pOpen->nPendi
ae90: 6e 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ng; i++){.      
aea0: 20 20 63 6c 6f 73 65 28 70 4f 70 65 6e 2d 3e 61    close(pOpen->a
aeb0: 50 65 6e 64 69 6e 67 5b 69 5d 29 3b 0a 20 20 20  Pending[i]);.   
aec0: 20 20 20 7d 0a 20 20 20 20 20 20 66 72 65 65 28     }.      free(
aed0: 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 29  pOpen->aPending)
aee0: 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e  ;.      pOpen->n
aef0: 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20  Pending = 0;.   
af00: 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69     pOpen->aPendi
af10: 6e 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ng = 0;.    }.  
af20: 7d 0a 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29  }.  leaveMutex()
af30: 3b 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  ;.  pFile->lockt
af40: 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
af50: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
af60: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
af70: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
af80: 74 20 75 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69  t unixClose(sqli
af90: 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
afa0: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
afb0: 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69   = (unixFile *)i
afc0: 64 3b 0a 20 20 69 66 28 20 21 70 46 69 6c 65 20  d;.  if( !pFile 
afd0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
afe0: 4f 4b 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b  OK;.  unixUnlock
aff0: 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
b000: 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72 66   if( pFile->dirf
b010: 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28 70 46 69  d>=0 ) close(pFi
b020: 6c 65 2d 3e 64 69 72 66 64 29 3b 0a 20 20 70 46  le->dirfd);.  pF
b030: 69 6c 65 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b  ile->dirfd = -1;
b040: 0a 20 20 65 6e 74 65 72 4d 75 74 65 78 28 29 3b  .  enterMutex();
b050: 0a 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  ..  if( pFile->p
b060: 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20  Open->nLock ){. 
b070: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
b080: 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  re outstanding l
b090: 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74  ocks, do not act
b0a0: 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20  ually close the 
b0b0: 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a  file just.    **
b0c0: 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68 61   yet because tha
b0d0: 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68  t would clear th
b0e0: 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74  ose locks.  Inst
b0f0: 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c  ead, add the fil
b100: 65 0a 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70  e.    ** descrip
b110: 74 6f 72 20 74 6f 20 70 4f 70 65 6e 2d 3e 61 50  tor to pOpen->aP
b120: 65 6e 64 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c  ending.  It will
b130: 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   be automaticall
b140: 79 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20  y closed when.  
b150: 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f    ** the last lo
b160: 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20  ck is cleared.. 
b170: 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 2a 61     */.    int *a
b180: 4e 65 77 3b 0a 20 20 20 20 73 74 72 75 63 74 20  New;.    struct 
b190: 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 20 3d  openCnt *pOpen =
b1a0: 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20   pFile->pOpen;. 
b1b0: 20 20 20 61 4e 65 77 20 3d 20 72 65 61 6c 6c 6f     aNew = reallo
b1c0: 63 28 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69  c( pOpen->aPendi
b1d0: 6e 67 2c 20 28 70 4f 70 65 6e 2d 3e 6e 50 65 6e  ng, (pOpen->nPen
b1e0: 64 69 6e 67 2b 31 29 2a 73 69 7a 65 6f 66 28 69  ding+1)*sizeof(i
b1f0: 6e 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61  nt) );.    if( a
b200: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
b210: 2f 2a 20 49 66 20 61 20 6d 61 6c 6c 6f 63 20 66  /* If a malloc f
b220: 61 69 6c 73 2c 20 6a 75 73 74 20 6c 65 61 6b 20  ails, just leak 
b230: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
b240: 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  tor */.    }else
b250: 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61  {.      pOpen->a
b260: 50 65 6e 64 69 6e 67 20 3d 20 61 4e 65 77 3b 0a  Pending = aNew;.
b270: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65        pOpen->aPe
b280: 6e 64 69 6e 67 5b 70 4f 70 65 6e 2d 3e 6e 50 65  nding[pOpen->nPe
b290: 6e 64 69 6e 67 5d 20 3d 20 70 46 69 6c 65 2d 3e  nding] = pFile->
b2a0: 68 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  h;.      pOpen->
b2b0: 6e 50 65 6e 64 69 6e 67 2b 2b 3b 0a 20 20 20 20  nPending++;.    
b2c0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
b2d0: 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  * There are no o
b2e0: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
b2f0: 20 73 6f 20 77 65 20 63 61 6e 20 63 6c 6f 73 65   so we can close
b300: 20 74 68 65 20 66 69 6c 65 20 69 6d 6d 65 64 69   the file immedi
b310: 61 74 65 6c 79 20 2a 2f 0a 20 20 20 20 63 6c 6f  ately */.    clo
b320: 73 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20  se(pFile->h);.  
b330: 7d 0a 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49  }.  releaseLockI
b340: 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  nfo(pFile->pLock
b350: 29 3b 0a 20 20 72 65 6c 65 61 73 65 4f 70 65 6e  );.  releaseOpen
b360: 43 6e 74 28 70 46 69 6c 65 2d 3e 70 4f 70 65 6e  Cnt(pFile->pOpen
b370: 29 3b 0a 0a 20 20 6c 65 61 76 65 4d 75 74 65 78  );..  leaveMutex
b380: 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22  ();.  OSTRACE2("
b390: 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c  CLOSE   %-3d\n",
b3a0: 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 4f 70   pFile->h);.  Op
b3b0: 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20  enCounter(-1);. 
b3c0: 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30   memset(pFile, 0
b3d0: 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  , sizeof(unixFil
b3e0: 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  e));.  return SQ
b3f0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66  LITE_OK;.}...#if
b400: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
b410: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
b420: 23 70 72 61 67 6d 61 20 6d 61 72 6b 20 41 46 50  #pragma mark AFP
b430: 20 53 75 70 70 6f 72 74 0a 0a 2f 2a 0a 20 2a 2a   Support../*. **
b440: 20 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43   The afpLockingC
b450: 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65  ontext structure
b460: 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66   contains all af
b470: 70 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20  p lock specific 
b480: 73 74 61 74 65 0a 20 2a 2f 0a 74 79 70 65 64 65  state. */.typede
b490: 66 20 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b  f struct afpLock
b4a0: 69 6e 67 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f  ingContext afpLo
b4b0: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74  ckingContext;.st
b4c0: 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43  ruct afpLockingC
b4d0: 6f 6e 74 65 78 74 20 7b 0a 20 20 75 6e 73 69 67  ontext {.  unsig
b4e0: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68  ned long long sh
b4f0: 61 72 65 64 4c 6f 63 6b 42 79 74 65 3b 0a 20 20  aredLockByte;.  
b500: 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 3b 0a  char *filePath;.
b510: 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52  };..struct ByteR
b520: 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20  angeLockPB2.{.  
b530: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
b540: 6e 67 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  ng offset;      
b550: 20 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66    /* offset to f
b560: 69 72 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63  irst byte to loc
b570: 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  k */.  unsigned 
b580: 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68  long long length
b590: 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20  ;        /* nbr 
b5a0: 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b  of bytes to lock
b5b0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
b5c0: 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67  ong long retRang
b5d0: 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f  eStart; /* nbr o
b5e0: 66 20 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65  f 1st byte locke
b5f0: 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20  d if successful 
b600: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
b610: 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20  ar unLockFlag;  
b620: 20 20 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e         /* 1 = un
b630: 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a  lock, 0 = lock *
b640: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
b650: 72 20 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20  r startEndFlag; 
b660: 20 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74        /* 1=rel t
b670: 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30  o end of fork, 0
b680: 3d 72 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f  =rel to start */
b690: 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20  .  int fd;      
b6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6b0: 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73       /* file des
b6c0: 63 20 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20  c to assoc this 
b6d0: 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a  lock with */.};.
b6e0: 0a 23 64 65 66 69 6e 65 20 61 66 70 66 73 42 79  .#define afpfsBy
b6f0: 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54  teRangeLock2FSCT
b700: 4c 20 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27  L        _IOWR('
b710: 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42  z', 23, struct B
b720: 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29  yteRangeLockPB2)
b730: 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20  ../* .** Return 
b740: 30 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 31 20  0 on success, 1 
b750: 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20 54 6f 20  on failure.  To 
b760: 6d 61 74 63 68 20 74 68 65 20 62 65 68 61 76 69  match the behavi
b770: 6f 72 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6e 6f  or of the .** no
b780: 72 6d 61 6c 20 70 6f 73 69 78 20 66 69 6c 65 20  rmal posix file 
b790: 6c 6f 63 6b 69 6e 67 20 28 75 73 65 64 20 69 6e  locking (used in
b7a0: 20 75 6e 69 78 4c 6f 63 6b 20 66 6f 72 20 65 78   unixLock for ex
b7b0: 61 6d 70 6c 65 29 2c 20 77 65 20 73 68 6f 75 6c  ample), we shoul
b7c0: 64 20 0a 2a 2a 20 70 72 6f 76 69 64 65 20 27 72  d .** provide 'r
b7d0: 69 63 68 65 72 27 20 72 65 74 75 72 6e 20 63 6f  icher' return co
b7e0: 64 65 73 20 2d 20 73 70 65 63 69 66 69 63 61 6c  des - specifical
b7f0: 6c 79 20 74 6f 20 64 69 66 66 65 72 65 6e 74 69  ly to differenti
b800: 61 74 65 20 62 65 74 77 65 65 6e 0a 2a 2a 20 27  ate between.** '
b810: 66 69 6c 65 20 62 75 73 79 27 20 61 6e 64 20 27  file busy' and '
b820: 66 69 6c 65 20 73 79 73 74 65 6d 20 65 72 72 6f  file system erro
b830: 72 27 20 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73  r' results..*/.s
b840: 74 61 74 69 63 20 69 6e 74 20 5f 41 46 50 46 53  tatic int _AFPFS
b850: 53 65 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74  SetLock(.  const
b860: 20 63 68 61 72 20 2a 70 61 74 68 2c 20 0a 20 20   char *path, .  
b870: 69 6e 74 20 66 64 2c 20 0a 20 20 75 6e 73 69 67  int fd, .  unsig
b880: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66  ned long long of
b890: 66 73 65 74 2c 20 0a 20 20 75 6e 73 69 67 6e 65  fset, .  unsigne
b8a0: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67  d long long leng
b8b0: 74 68 2c 20 0a 20 20 69 6e 74 20 73 65 74 4c 6f  th, .  int setLo
b8c0: 63 6b 46 6c 61 67 0a 29 7b 0a 20 20 73 74 72 75  ckFlag.){.  stru
b8d0: 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
b8e0: 50 42 32 20 20 20 20 20 20 20 70 62 3b 0a 20 20  PB2       pb;.  
b8f0: 69 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20  int             
b900: 20 20 20 20 20 20 20 20 65 72 72 3b 0a 20 20 0a          err;.  .
b910: 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20    pb.unLockFlag 
b920: 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20  = setLockFlag ? 
b930: 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72  0 : 1;.  pb.star
b940: 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20  tEndFlag = 0;.  
b950: 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73  pb.offset = offs
b960: 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20  et;.  pb.length 
b970: 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e  = length; .  pb.
b980: 66 64 20 3d 20 66 64 3b 0a 20 20 4f 53 54 52 41  fd = fd;.  OSTRA
b990: 43 45 35 28 22 41 46 50 4c 4f 43 4b 20 73 65 74  CE5("AFPLOCK set
b9a0: 74 69 6e 67 20 6c 6f 63 6b 20 25 73 20 66 6f 72  ting lock %s for
b9b0: 20 25 64 20 69 6e 20 72 61 6e 67 65 20 25 6c 6c   %d in range %ll
b9c0: 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20 20  x:%llx\n", .    
b9d0: 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e  (setLockFlag?"ON
b9e0: 22 3a 22 4f 46 46 22 29 2c 20 66 64 2c 20 6f 66  ":"OFF"), fd, of
b9f0: 66 73 65 74 2c 20 6c 65 6e 67 74 68 29 3b 0a 20  fset, length);. 
ba00: 20 65 72 72 20 3d 20 66 73 63 74 6c 28 70 61 74   err = fsctl(pat
ba10: 68 2c 20 61 66 70 66 73 42 79 74 65 52 61 6e 67  h, afpfsByteRang
ba20: 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70 62  eLock2FSCTL, &pb
ba30: 2c 20 30 29 3b 0a 20 20 69 66 20 28 20 65 72 72  , 0);.  if ( err
ba40: 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 4f 53 54  ==-1 ) {.    OST
ba50: 52 41 43 45 34 28 22 41 46 50 4c 4f 43 4b 20 66  RACE4("AFPLOCK f
ba60: 61 69 6c 65 64 20 74 6f 20 66 73 63 74 6c 28 29  ailed to fsctl()
ba70: 20 27 25 73 27 20 25 64 20 25 73 5c 6e 22 2c 20   '%s' %d %s\n", 
ba80: 70 61 74 68 2c 20 65 72 72 6e 6f 2c 20 0a 20 20  path, errno, .  
ba90: 20 20 20 20 73 74 72 65 72 72 6f 72 28 65 72 72      strerror(err
baa0: 6e 6f 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  no));.    return
bab0: 20 31 3b 20 2f 2a 20 65 72 72 6f 72 20 2a 2f 0a   1; /* error */.
bac0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72    } else {.    r
bad0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 0;.  }.}..
bae0: 2f 2a 0a 20 2a 2a 20 54 68 69 73 20 72 6f 75 74  /*. ** This rout
baf0: 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
bb00: 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
bb10: 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
bb20: 68 65 20 73 70 65 63 69 66 69 65 64 0a 20 2a 2a  he specified. **
bb30: 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
bb40: 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
bb50: 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
bb60: 63 6b 20 69 73 20 68 65 6c 64 2c 20 72 65 74 75  ck is held, retu
bb70: 72 6e 0a 20 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e  rn. ** non-zero.
bb80: 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73    If the file is
bb90: 20 75 6e 6c 6f 63 6b 65 64 20 6f 72 20 68 6f 6c   unlocked or hol
bba0: 64 73 20 6f 6e 6c 79 20 53 48 41 52 45 44 20 6c  ds only SHARED l
bbb0: 6f 63 6b 73 2c 20 74 68 65 6e 0a 20 2a 2a 20 72  ocks, then. ** r
bbc0: 65 74 75 72 6e 20 7a 65 72 6f 2e 0a 20 2a 2f 0a  eturn zero.. */.
bbd0: 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e  static int afpUn
bbe0: 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
bbf0: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
bc00: 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 20 3d   *id){.  int r =
bc10: 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
bc20: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
bc30: 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65  e*)id;.  .  asse
bc40: 72 74 28 20 70 46 69 6c 65 20 29 3b 20 0a 20 20  rt( pFile ); .  
bc50: 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
bc60: 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66  t *context = (af
bc70: 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
bc80: 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  *) pFile->lockin
bc90: 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 2f  gContext;.  .  /
bca0: 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
bcb0: 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
bcc0: 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
bcd0: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
bce0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53  File->locktype>S
bcf0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
bd00: 20 20 72 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a    r = 1;.  }.  .
bd10: 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
bd20: 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
bd30: 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
bd40: 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 20 28 20  t..   */.  if ( 
bd50: 21 72 20 29 20 7b 0a 20 20 20 20 2f 2a 20 6c 6f  !r ) {.    /* lo
bd60: 63 6b 20 74 68 65 20 62 79 74 65 20 2a 2f 0a 20  ck the byte */. 
bd70: 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20     int failed = 
bd80: 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f  _AFPFSSetLock(co
bd90: 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c  ntext->filePath,
bda0: 20 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52   pFile->h, RESER
bdb0: 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20  VED_BYTE, 1,1); 
bdc0: 20 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65 64   .    if (failed
bdd0: 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20  ) {.      /* if 
bde0: 77 65 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74  we failed to get
bdf0: 20 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73   the lock then s
be00: 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74  omeone else must
be10: 20 68 61 76 65 20 69 74 20 2a 2f 0a 20 20 20 20   have it */.    
be20: 20 20 72 20 3d 20 31 3b 0a 20 20 20 20 7d 20 65    r = 1;.    } e
be30: 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69  lse {.      /* i
be40: 66 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69  f we succeeded i
be50: 6e 20 74 61 6b 69 6e 67 20 74 68 65 20 72 65 73  n taking the res
be60: 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f  erved lock, unlo
be70: 63 6b 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65  ck it to restore
be80: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72  .      ** the or
be90: 69 67 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a  iginal state */.
bea0: 20 20 20 20 20 20 5f 41 46 50 46 53 53 65 74 4c        _AFPFSSetL
beb0: 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c  ock(context->fil
bec0: 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c  ePath, pFile->h,
bed0: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
bee0: 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  1, 0);.    }.  }
bef0: 0a 20 20 4f 53 54 52 41 43 45 33 28 22 54 45 53  .  OSTRACE3("TES
bf00: 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 5c  T WR-LOCK %d %d\
bf10: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 29  n", pFile->h, r)
bf20: 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 3b  ;.  .  return r;
bf30: 0a 7d 0a 0a 2f 2a 20 41 46 50 2d 73 74 79 6c 65  .}../* AFP-style
bf40: 20 6c 6f 63 6b 69 6e 67 20 66 6f 6c 6c 6f 77 69   locking followi
bf50: 6e 67 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  ng the behavior 
bf60: 6f 66 20 75 6e 69 78 4c 6f 63 6b 2c 20 73 65 65  of unixLock, see
bf70: 20 74 68 65 20 75 6e 69 78 4c 6f 63 6b 20 0a 2a   the unixLock .*
bf80: 2a 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 6d 65  * function comme
bf90: 6e 74 73 20 66 6f 72 20 64 65 74 61 69 6c 73 20  nts for details 
bfa0: 6f 66 20 6c 6f 63 6b 20 6d 61 6e 61 67 65 6d 65  of lock manageme
bfb0: 6e 74 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt. */.static in
bfc0: 74 20 61 66 70 55 6e 69 78 4c 6f 63 6b 28 73 71  t afpUnixLock(sq
bfd0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
bfe0: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 0a 7b 0a  int locktype).{.
bff0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c000: 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
c010: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
c020: 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f  ile*)id;.  afpLo
c030: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
c040: 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b  ntext = (afpLock
c050: 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
c060: 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
c070: 65 78 74 3b 0a 20 20 69 6e 74 20 67 6f 74 50 65  ext;.  int gotPe
c080: 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ndingLock = 0;. 
c090: 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
c0a0: 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 35 28  e );.  OSTRACE5(
c0b0: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77  "LOCK    %d %s w
c0c0: 61 73 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  as %s pid=%d\n",
c0d0: 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
c0e0: 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65      locktypeName
c0f0: 28 6c 6f 63 6b 74 79 70 65 29 2c 20 6c 6f 63 6b  (locktype), lock
c100: 74 79 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e  typeName(pFile->
c110: 6c 6f 63 6b 74 79 70 65 29 2c 20 67 65 74 70 69  locktype), getpi
c120: 64 28 29 29 3b 20 20 0a 20 20 2f 2a 20 49 66 20  d());  .  /* If 
c130: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
c140: 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20   a lock of this 
c150: 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73  type or more res
c160: 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a  trictive on the.
c170: 20 20 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c      ** unixFile,
c180: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e   do nothing. Don
c190: 27 74 20 75 73 65 20 74 68 65 20 61 66 70 5f 65  't use the afp_e
c1a0: 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61  nd_lock: exit pa
c1b0: 74 68 2c 20 61 73 0a 20 20 20 20 2a 2a 20 65 6e  th, as.    ** en
c1c0: 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27  terMutex() hasn'
c1d0: 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65  t been called ye
c1e0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 69 66 28 20  t..    */.  if( 
c1f0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
c200: 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20  =locktype ){.   
c210: 20 4f 53 54 52 41 43 45 33 28 22 4c 4f 43 4b 20   OSTRACE3("LOCK 
c220: 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72     %d %s ok (alr
c230: 65 61 64 79 20 68 65 6c 64 29 5c 6e 22 2c 20 70  eady held)\n", p
c240: 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
c250: 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65      locktypeName
c260: 28 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 20  (locktype));.   
c270: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c280: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  K;.  }..  /* Mak
c290: 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69  e sure the locki
c2a0: 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63  ng sequence is c
c2b0: 6f 72 72 65 63 74 0a 20 20 20 20 2a 2f 0a 20 20  orrect.    */.  
c2c0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
c2d0: 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b  ocktype!=NO_LOCK
c2e0: 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   || locktype==SH
c2f0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
c300: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
c310: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
c320: 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
c330: 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype!=RESERVED_LO
c340: 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK || pFile->loc
c350: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
c360: 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68  CK );.  .  /* Th
c370: 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64  is mutex is need
c380: 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65  ed because pFile
c390: 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61 72 65  ->pLock is share
c3a0: 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
c3b0: 0a 20 20 20 20 2a 2f 0a 20 20 65 6e 74 65 72 4d  .    */.  enterM
c3c0: 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 4d 61  utex();..  /* Ma
c3d0: 6b 65 20 73 75 72 65 20 74 68 65 20 63 75 72 72  ke sure the curr
c3e0: 65 6e 74 20 74 68 72 65 61 64 20 6f 77 6e 73 20  ent thread owns 
c3f0: 74 68 65 20 70 46 69 6c 65 2e 0a 20 20 20 20 2a  the pFile..    *
c400: 2f 0a 20 20 72 63 20 3d 20 74 72 61 6e 73 66 65  /.  rc = transfe
c410: 72 4f 77 6e 65 72 73 68 69 70 28 70 46 69 6c 65  rOwnership(pFile
c420: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
c430: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6c 65  ITE_OK ){.    le
c440: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
c450: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
c460: 20 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49     .  /* A PENDI
c470: 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65  NG lock is neede
c480: 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69  d before acquiri
c490: 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ng a SHARED lock
c4a0: 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 20 20   and before.    
c4b0: 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20  ** acquiring an 
c4c0: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
c4d0: 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20   For the SHARED 
c4e0: 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e  lock, the PENDIN
c4f0: 47 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  G will.    ** be
c500: 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 20 20 2a   released..    *
c510: 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
c520: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20  ==SHARED_LOCK . 
c530: 20 20 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 70       || (locktyp
c540: 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
c550: 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  K && pFile->lock
c560: 74 79 70 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43  type<PENDING_LOC
c570: 4b 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  K).      ){.    
c580: 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 5f 41 46  int failed = _AF
c590: 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  PFSSetLock(conte
c5a0: 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46  xt->filePath, pF
c5b0: 69 6c 65 2d 3e 68 2c 20 0a 20 20 20 20 20 20 50  ile->h, .      P
c5c0: 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20  ENDING_BYTE, 1, 
c5d0: 31 29 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c  1);.    if (fail
c5e0: 65 64 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  ed) {.      rc =
c5f0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
c600: 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
c610: 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  _lock;.    }.  }
c620: 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74  .  .  /* If cont
c630: 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73  rol gets to this
c640: 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74   point, then act
c650: 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61  ually go ahead a
c660: 6e 64 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 6f  nd make.    ** o
c670: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
c680: 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70  calls for the sp
c690: 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20  ecified lock..  
c6a0: 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
c6b0: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
c6c0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 2c 20   ){.    int lk, 
c6d0: 66 61 69 6c 65 64 3b 0a 20 20 20 20 69 6e 74 20  failed;.    int 
c6e0: 74 72 69 65 73 20 3d 20 30 3b 0a 20 20 20 20 0a  tries = 0;.    .
c6f0: 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74      /* Now get t
c700: 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a  he read-lock */.
c710: 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74 68 61 74      /* note that
c720: 20 74 68 65 20 71 75 61 6c 69 74 79 20 6f 66 20   the quality of 
c730: 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 64  the randomness d
c740: 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 74 68  oesn't matter th
c750: 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20 20 20 6c  at much */.    l
c760: 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b 20 0a 20  k = random(); . 
c770: 20 20 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72     context->shar
c780: 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28 6c 6b  edLockByte = (lk
c790: 20 26 20 30 78 37 66 66 66 66 66 66 66 29 25 28   & 0x7fffffff)%(
c7a0: 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29  SHARED_SIZE - 1)
c7b0: 3b 0a 20 20 20 20 66 61 69 6c 65 64 20 3d 20 5f  ;.    failed = _
c7c0: 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e  AFPFSSetLock(con
c7d0: 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20  text->filePath, 
c7e0: 70 46 69 6c 65 2d 3e 68 2c 20 0a 20 20 20 20 20  pFile->h, .     
c7f0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 63 6f   SHARED_FIRST+co
c800: 6e 74 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63  ntext->sharedLoc
c810: 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20  kByte, 1, 1);.  
c820: 20 20 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74    .    /* Drop t
c830: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e  he temporary PEN
c840: 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  DING lock */.   
c850: 20 69 66 20 28 5f 41 46 50 46 53 53 65 74 4c 6f   if (_AFPFSSetLo
c860: 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65  ck(context->file
c870: 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  Path, pFile->h, 
c880: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c  PENDING_BYTE, 1,
c890: 20 30 29 29 20 7b 0a 20 20 20 20 20 20 72 63 20   0)) {.      rc 
c8a0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
c8b0: 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54 68 69 73 20  NLOCK;  /* This 
c8c0: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
c8d0: 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74  pen */.      got
c8e0: 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
c8f0: 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 69      }.    .    i
c900: 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20  f( failed ){.   
c910: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
c920: 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  USY;.    } else 
c930: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
c940: 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44  ocktype = SHARED
c950: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  _LOCK;.    }.  }
c960: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
c970: 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72   request was for
c980: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
c990: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
c9a0: 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73  It is.    ** ass
c9b0: 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20  umed that there 
c9c0: 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67  is a SHARED or g
c9d0: 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
c9e0: 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61  he file.    ** a
c9f0: 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
ca00: 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20     int failed = 
ca10: 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  0;.    assert( 0
ca20: 21 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  !=pFile->locktyp
ca30: 65 20 29 3b 0a 20 20 20 20 69 66 20 28 6c 6f 63  e );.    if (loc
ca40: 6b 74 79 70 65 20 3e 3d 20 52 45 53 45 52 56 45  ktype >= RESERVE
ca50: 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d  D_LOCK && pFile-
ca60: 3e 6c 6f 63 6b 74 79 70 65 20 3c 20 52 45 53 45  >locktype < RESE
ca70: 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  RVED_LOCK) {.   
ca80: 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20       /* Acquire 
ca90: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
caa0: 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65  */.        faile
cab0: 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63  d = _AFPFSSetLoc
cac0: 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50  k(context->fileP
cad0: 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 52  ath, pFile->h, R
cae0: 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
caf0: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
cb00: 20 28 21 66 61 69 6c 65 64 20 26 26 20 6c 6f 63   (!failed && loc
cb10: 6b 74 79 70 65 20 3d 3d 20 45 58 43 4c 55 53 49  ktype == EXCLUSI
cb20: 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20  VE_LOCK) {.     
cb30: 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45   /* Acquire an E
cb40: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f  XCLUSIVE lock */
cb50: 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  .        .      
cb60: 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 68  /* Remove the sh
cb70: 61 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72 65  ared lock before
cb80: 20 74 72 79 69 6e 67 20 74 68 65 20 72 61 6e 67   trying the rang
cb90: 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 20 74  e.  we'll need t
cba0: 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65 73  o .      ** rees
cbb0: 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72  tablish the shar
cbc0: 65 64 20 6c 6f 63 6b 20 69 66 20 77 65 20 63 61  ed lock if we ca
cbd0: 6e 27 74 20 67 65 74 20 74 68 65 20 20 61 66 70  n't get the  afp
cbe0: 55 6e 69 78 55 6e 6c 6f 63 6b 0a 20 20 20 20 20  UnixUnlock.     
cbf0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 20 28 21 5f   */.      if (!_
cc00: 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e  AFPFSSetLock(con
cc10: 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20  text->filePath, 
cc20: 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
cc30: 5f 46 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20  _FIRST +.       
cc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc50: 20 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65    context->share
cc60: 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29  dLockByte, 1, 0)
cc70: 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e  ) {.        /* n
cc80: 6f 77 20 61 74 74 65 6d 6d 70 74 20 74 6f 20 67  ow attemmpt to g
cc90: 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  et the exclusive
cca0: 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20   lock range */. 
ccb0: 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20         failed = 
ccc0: 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f  _AFPFSSetLock(co
ccd0: 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c  ntext->filePath,
cce0: 20 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45   pFile->h, SHARE
ccf0: 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20 20 20  D_FIRST, .      
cd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd10: 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
cd20: 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20 20  SIZE, 1);.      
cd30: 20 20 69 66 20 28 66 61 69 6c 65 64 20 26 26 20    if (failed && 
cd40: 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f  _AFPFSSetLock(co
cd50: 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c  ntext->filePath,
cd60: 20 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45   pFile->h, SHARE
cd70: 44 5f 46 49 52 53 54 20 2b 0a 20 20 20 20 20 20  D_FIRST +.      
cd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
cda0: 6e 74 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63  ntext->sharedLoc
cdb0: 6b 42 79 74 65 2c 20 31 2c 20 31 29 29 20 7b 0a  kByte, 1, 1)) {.
cdc0: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
cdd0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
cde0: 43 4b 3b 20 2f 2a 20 74 68 69 73 20 73 68 6f 75  CK; /* this shou
cdf0: 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20  ld never happen 
ce00: 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
ce10: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
ce20: 20 20 20 20 2f 2a 20 2a 2f 0a 20 20 20 20 20 20      /* */.      
ce30: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
ce40: 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 2f 2a 20 74  ERR_UNLOCK; /* t
ce50: 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  his should never
ce60: 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20   happen */.     
ce70: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
ce80: 20 66 61 69 6c 65 64 20 26 26 20 72 63 20 3d 3d   failed && rc ==
ce90: 20 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20   SQLITE_OK){.   
cea0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
ceb0: 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  USY;.    }.  }. 
cec0: 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49   .  if( rc==SQLI
ced0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69  TE_OK ){.    pFi
cee0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c  le->locktype = l
cef0: 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c 73 65  ocktype;.  }else
cf00: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45   if( locktype==E
cf10: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
cf20: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
cf30: 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  type = PENDING_L
cf40: 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f  OCK;.  }.  .afp_
cf50: 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 20 20 6c 65  end_lock:.    le
cf60: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53  aveMutex();.  OS
cf70: 54 52 41 43 45 34 28 22 4c 4f 43 4b 20 20 20 20  TRACE4("LOCK    
cf80: 25 64 20 25 73 20 25 73 5c 6e 22 2c 20 70 46 69  %d %s %s\n", pFi
cf90: 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 4e  le->h, locktypeN
cfa0: 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 0a  ame(locktype), .
cfb0: 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c           rc==SQL
cfc0: 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20  ITE_OK ? "ok" : 
cfd0: 22 66 61 69 6c 65 64 22 29 3b 0a 20 20 72 65 74  "failed");.  ret
cfe0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  urn rc;.}../*. *
cff0: 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
d000: 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
d010: 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
d020: 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20  le to locktype. 
d030: 20 6c 6f 63 6b 74 79 70 65 0a 20 2a 2a 20 6d 75   locktype. ** mu
d040: 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
d050: 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
d060: 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20  OCK.. **. ** If 
d070: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
d080: 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
d090: 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
d0a0: 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
d0b0: 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65   ** the requeste
d0c0: 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
d0d0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
d0e0: 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74   a no-op.. */.st
d0f0: 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e 69 78  atic int afpUnix
d100: 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
d110: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
d120: 6b 74 79 70 65 29 20 7b 0a 20 20 73 74 72 75 63  ktype) {.  struc
d130: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
d140: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
d150: 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
d160: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
d170: 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b  e*)id;.  afpLock
d180: 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  ingContext *cont
d190: 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e  ext = (afpLockin
d1a0: 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c  gContext *) pFil
d1b0: 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
d1c0: 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  t;..  assert( pF
d1d0: 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
d1e0: 35 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  5("UNLOCK  %d %d
d1f0: 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 5c 6e   was %d pid=%d\n
d200: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63  ", pFile->h, loc
d210: 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20 20  ktype,.         
d220: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c  pFile->locktype,
d230: 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20 0a 20   getpid());.  . 
d240: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
d250: 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e<=SHARED_LOCK )
d260: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  ;.  if( pFile->l
d270: 6f 63 6b 74 79 70 65 3c 3d 6c 6f 63 6b 74 79 70  ocktype<=locktyp
d280: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
d290: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
d2a0: 20 69 66 28 20 43 48 45 43 4b 5f 54 48 52 45 41   if( CHECK_THREA
d2b0: 44 49 44 28 70 46 69 6c 65 29 20 29 7b 0a 20 20  DID(pFile) ){.  
d2c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d2d0: 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 65 6e  MISUSE;.  }.  en
d2e0: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 69 66  terMutex();.  if
d2f0: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
d300: 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  e>SHARED_LOCK ){
d310: 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  .    if( locktyp
d320: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
d330: 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 61 69 6c  {.      int fail
d340: 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f  ed = 0;..      /
d350: 2a 20 75 6e 6c 6f 63 6b 20 74 68 65 20 65 78 63  * unlock the exc
d360: 6c 75 73 69 76 65 20 72 61 6e 67 65 20 2d 20 74  lusive range - t
d370: 68 65 6e 20 72 65 2d 65 73 74 61 62 6c 69 73 68  hen re-establish
d380: 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
d390: 20 2a 2f 0a 20 20 20 20 20 20 69 66 20 28 70 46   */.      if (pF
d3a0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 45  ile->locktype==E
d3b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b  XCLUSIVE_LOCK) {
d3c0: 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20  .        failed 
d3d0: 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28  = _AFPFSSetLock(
d3e0: 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74  context->filePat
d3f0: 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  h, pFile->h, SHA
d400: 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20  RED_FIRST, .    
d410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d420: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41               SHA
d430: 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20  RED_SIZE, 0);.  
d440: 20 20 20 20 20 20 69 66 20 28 21 66 61 69 6c 65        if (!faile
d450: 64 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  d) {.          /
d460: 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72  * successfully r
d470: 65 6d 6f 76 65 64 20 74 68 65 20 65 78 63 6c 75  emoved the exclu
d480: 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  sive lock */.   
d490: 20 20 20 20 20 20 20 69 66 20 28 5f 41 46 50 46         if (_AFPF
d4a0: 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  SSetLock(context
d4b0: 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c  ->filePath, pFil
d4c0: 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  e->h, SHARED_FIR
d4d0: 53 54 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ST+.            
d4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4f0: 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64 4c  context->sharedL
d500: 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 29 20  ockByte, 1, 1)) 
d510: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
d520: 20 66 61 69 6c 65 64 20 74 6f 20 72 65 2d 65 73   failed to re-es
d530: 74 61 62 6c 69 73 68 20 6f 75 72 20 73 68 61 72  tablish our shar
d540: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  ed lock */.     
d550: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
d560: 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b  TE_IOERR_RDLOCK;
d570: 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20   /* This should 
d580: 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a  never happen */.
d590: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
d5a0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
d5b0: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73         /* This s
d5c0: 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70  hould never happ
d5d0: 65 6e 20 2d 20 66 61 69 6c 65 64 20 74 6f 20 75  en - failed to u
d5e0: 6e 6c 6f 63 6b 20 74 68 65 20 65 78 63 6c 75 73  nlock the exclus
d5f0: 69 76 65 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20  ive range */.   
d600: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
d610: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
d620: 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20  .        } .    
d630: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
d640: 20 28 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f 4f   (rc == SQLITE_O
d650: 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  K && pFile->lock
d660: 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  type>=PENDING_LO
d670: 43 4b 29 20 7b 0a 20 20 20 20 20 20 69 66 20 28  CK) {.      if (
d680: 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f  _AFPFSSetLock(co
d690: 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c  ntext->filePath,
d6a0: 20 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49   pFile->h, PENDI
d6b0: 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 29 7b  NG_BYTE, 1, 0)){
d6c0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 61 69 6c  .        /* fail
d6d0: 65 64 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68  ed to release th
d6e0: 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a  e pending lock *
d6f0: 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  /.        rc = S
d700: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
d710: 43 4b 3b 20 2f 2a 20 54 68 69 73 20 73 68 6f 75  CK; /* This shou
d720: 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20  ld never happen 
d730: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
d740: 20 0a 20 20 20 20 69 66 20 28 72 63 20 3d 3d 20   .    if (rc == 
d750: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69  SQLITE_OK && pFi
d760: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45  le->locktype>=RE
d770: 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20  SERVED_LOCK) {. 
d780: 20 20 20 20 20 69 66 20 28 5f 41 46 50 46 53 53       if (_AFPFSS
d790: 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
d7a0: 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d  filePath, pFile-
d7b0: 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  >h, RESERVED_BYT
d7c0: 45 2c 20 31 2c 20 30 29 29 20 7b 0a 20 20 20 20  E, 1, 0)) {.    
d7d0: 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f      /* failed to
d7e0: 20 72 65 6c 65 61 73 65 20 74 68 65 20 72 65 73   release the res
d7f0: 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20  erved lock */.  
d800: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
d810: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20  E_IOERR_UNLOCK; 
d820: 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20   /* This should 
d830: 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a  never happen */.
d840: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 0a 20        }.    } . 
d850: 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70   }.  if( locktyp
d860: 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20  e==NO_LOCK ){.  
d870: 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 5f    int failed = _
d880: 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e  AFPFSSetLock(con
d890: 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20  text->filePath, 
d8a0: 70 46 69 6c 65 2d 3e 68 2c 20 0a 20 20 20 20 20  pFile->h, .     
d8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8c0: 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
d8d0: 5f 46 49 52 53 54 20 2b 20 63 6f 6e 74 65 78 74  _FIRST + context
d8e0: 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  ->sharedLockByte
d8f0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 20  , 1, 0);.    if 
d900: 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20  (failed) {.     
d910: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
d920: 52 52 5f 55 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54  RR_UNLOCK;  /* T
d930: 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  his should never
d940: 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 7d   happen */.    }
d950: 0a 20 20 7d 0a 20 20 69 66 20 28 72 63 20 3d 3d  .  }.  if (rc ==
d960: 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 20   SQLITE_OK).    
d970: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
d980: 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 6c 65  = locktype;.  le
d990: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  aveMutex();.  re
d9a0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 20  turn rc;.}../*. 
d9b0: 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20  ** Close a file 
d9c0: 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70  & cleanup AFP sp
d9d0: 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63  ecific locking c
d9e0: 6f 6e 74 65 78 74 20 0a 20 2a 2f 0a 73 74 61 74  ontext . */.stat
d9f0: 69 63 20 69 6e 74 20 61 66 70 55 6e 69 78 43 6c  ic int afpUnixCl
da00: 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
da10: 20 2a 69 64 29 20 7b 0a 20 20 75 6e 69 78 46 69   *id) {.  unixFi
da20: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
da30: 78 46 69 6c 65 2a 29 70 49 64 3b 0a 0a 20 20 69  xFile*)pId;..  i
da40: 66 28 20 21 70 46 69 6c 65 20 29 20 72 65 74 75  f( !pFile ) retu
da50: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
da60: 61 66 70 55 6e 69 78 55 6e 6c 6f 63 6b 28 2a 70  afpUnixUnlock(*p
da70: 49 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  Id, NO_LOCK);.  
da80: 2f 2a 20 66 72 65 65 20 74 68 65 20 41 46 50 20  /* free the AFP 
da90: 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
daa0: 65 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65  e */.  if (pFile
dab0: 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
dac0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20   != NULL) {.    
dad0: 69 66 20 28 28 28 61 66 70 4c 6f 63 6b 69 6e 67  if (((afpLocking
dae0: 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
daf0: 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
db00: 2d 3e 66 69 6c 65 50 61 74 68 20 21 3d 20 4e 55  ->filePath != NU
db10: 4c 4c 29 0a 20 20 20 20 20 20 73 71 6c 69 74 65  LL).      sqlite
db20: 33 5f 66 72 65 65 28 28 28 61 66 70 4c 6f 63 6b  3_free(((afpLock
db30: 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c  ingContext*)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 29 3b 0a 20  t)->filePath);. 
db60: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
db70: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
db80: 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 0a 20 20 69  ntext);.  }..  i
db90: 66 28 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e  f( pFile->dirfd>
dba0: 3d 30 20 29 20 63 6c 6f 73 65 28 70 46 69 6c 65  =0 ) close(pFile
dbb0: 2d 3e 64 69 72 66 64 29 3b 0a 20 20 70 46 69 6c  ->dirfd);.  pFil
dbc0: 65 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20  e->dirfd = -1;. 
dbd0: 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 68 29   close(pFile->h)
dbe0: 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22 43 4c  ;.  OSTRACE2("CL
dbf0: 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70  OSE   %-3d\n", p
dc00: 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e  File->h);.  Open
dc10: 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 72  Counter(-1);.  r
dc20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
dc30: 0a 7d 0a 0a 0a 23 70 72 61 67 6d 61 20 6d 61 72  .}...#pragma mar
dc40: 6b 20 66 6c 6f 63 6b 28 29 20 73 74 79 6c 65 20  k flock() style 
dc50: 6c 6f 63 6b 69 6e 67 0a 0a 2f 2a 0a 20 2a 2a 20  locking../*. ** 
dc60: 54 68 65 20 66 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  The flockLocking
dc70: 43 6f 6e 74 65 78 74 20 69 73 20 6e 6f 74 20 75  Context is not u
dc80: 73 65 64 0a 20 2a 2f 0a 74 79 70 65 64 65 66 20  sed. */.typedef 
dc90: 76 6f 69 64 20 66 6c 6f 63 6b 4c 6f 63 6b 69 6e  void flockLockin
dca0: 67 43 6f 6e 74 65 78 74 3b 0a 0a 73 74 61 74 69  gContext;..stati
dcb0: 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 69 78 43  c int flockUnixC
dcc0: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
dcd0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
dce0: 64 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  d) {.  unixFile 
dcf0: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
dd00: 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 69 66 20  le*)id;.  .  if 
dd10: 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  (pFile->locktype
dd20: 20 3d 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43   == RESERVED_LOC
dd30: 4b 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K) {.    return 
dd40: 31 3b 20 2f 2a 20 61 6c 72 65 61 64 79 20 68 61  1; /* already ha
dd50: 76 65 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  ve a reserved lo
dd60: 63 6b 20 2a 2f 0a 20 20 7d 20 65 6c 73 65 20 7b  ck */.  } else {
dd70: 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d 70 74 20  .    /* attempt 
dd80: 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20  to get the lock 
dd90: 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  */.    int rc = 
dda0: 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
ddb0: 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e  LOCK_EX | LOCK_N
ddc0: 42 29 3b 0a 20 20 20 20 69 66 20 28 21 72 63 29  B);.    if (!rc)
ddd0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74 20   {.      /* got 
dde0: 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b  the lock, unlock
ddf0: 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 66 6c 6f   it */.      flo
de00: 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
de10: 4b 5f 55 4e 29 3b 0a 20 20 20 20 20 20 72 65 74  K_UN);.      ret
de20: 75 72 6e 20 30 3b 20 20 2f 2a 20 6e 6f 20 6f 6e  urn 0;  /* no on
de30: 65 20 68 61 73 20 69 74 20 72 65 73 65 72 76 65  e has it reserve
de40: 64 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 72  d */.    }.    r
de50: 65 74 75 72 6e 20 31 3b 20 2f 2a 20 73 6f 6d 65  eturn 1; /* some
de60: 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68 74 20 68  one else might h
de70: 61 76 65 20 69 74 20 72 65 73 65 72 76 65 64 20  ave it reserved 
de80: 2a 2f 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  */.  }.}..static
de90: 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 69 78 4c 6f   int flockUnixLo
dea0: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
deb0: 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
dec0: 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  e) {.  unixFile 
ded0: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
dee0: 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 2f 2a 20  le*)id;.  .  /* 
def0: 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61  if we already ha
df00: 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73  ve a lock, it is
df10: 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20   exclusive.  .  
df20: 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c  ** Just adjust l
df30: 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e  evel and punt on
df40: 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a   outta here. */.
df50: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
df60: 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 29  ktype > NO_LOCK)
df70: 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f   {.    pFile->lo
df80: 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70  cktype = locktyp
df90: 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e;.    return SQ
dfa0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
dfb0: 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63    /* grab an exc
dfc0: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20  lusive lock */. 
dfd0: 20 69 6e 74 20 72 63 20 3d 20 66 6c 6f 63 6b 28   int rc = flock(
dfe0: 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45  pFile->h, LOCK_E
dff0: 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20  X | LOCK_NB);.  
e000: 69 66 20 28 72 63 29 20 7b 0a 20 20 20 20 2f 2a  if (rc) {.    /*
e010: 20 64 69 64 6e 27 74 20 67 65 74 2c 20 6d 75 73   didn't get, mus
e020: 74 20 62 65 20 62 75 73 79 20 2a 2f 0a 20 20 20  t be busy */.   
e030: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
e040: 55 53 59 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  USY;.  } else {.
e050: 20 20 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73      /* got it, s
e060: 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  et the type and 
e070: 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20  return ok */.   
e080: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
e090: 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20   = locktype;.   
e0a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e0b0: 4b 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  K;.  }.}..static
e0c0: 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 69 78 55 6e   int flockUnixUn
e0d0: 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
e0e0: 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
e0f0: 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ype) {.  unixFil
e100: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
e110: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61  File*)id;.  .  a
e120: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c  ssert( locktype<
e130: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
e140: 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66    .  /* no-op if
e150: 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69   possible */.  i
e160: 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
e170: 70 65 3d 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe==locktype ){.
e180: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e190: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
e1a0: 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73  * shared can jus
e1b0: 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73 65  t be set because
e1c0: 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65 20   we always have 
e1d0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a  an exclusive */.
e1e0: 20 20 69 66 20 28 6c 6f 63 6b 74 79 70 65 3d 3d    if (locktype==
e1f0: 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20  SHARED_LOCK) {. 
e200: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
e210: 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
e220: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e230: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
e240: 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c   no, really, unl
e250: 6f 63 6b 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ock. */.  int rc
e260: 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e   = flock(pFile->
e270: 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 69  h, LOCK_UN);.  i
e280: 66 20 28 72 63 29 0a 20 20 20 20 72 65 74 75 72  f (rc).    retur
e290: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  n SQLITE_IOERR_U
e2a0: 4e 4c 4f 43 4b 3b 0a 20 20 65 6c 73 65 20 7b 0a  NLOCK;.  else {.
e2b0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
e2c0: 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ype = NO_LOCK;. 
e2d0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e2e0: 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20  _OK;.  }.}../*. 
e2f0: 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
e300: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
e310: 66 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73 65 28 73  flockUnixClose(s
e320: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49 64  qlite3_file *pId
e330: 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
e340: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
e350: 65 2a 29 2a 70 49 64 3b 0a 20 20 0a 20 20 69 66  e*)*pId;.  .  if
e360: 28 20 21 70 46 69 6c 65 20 29 20 72 65 74 75 72  ( !pFile ) retur
e370: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66  n SQLITE_OK;.  f
e380: 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b 28 2a  lockUnixUnlock(*
e390: 70 49 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  pId, NO_LOCK);. 
e3a0: 20 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64   .  if( pFile->d
e3b0: 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28  irfd>=0 ) close(
e3c0: 70 46 69 6c 65 2d 3e 64 69 72 66 64 29 3b 0a 20  pFile->dirfd);. 
e3d0: 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 20 3d 20   pFile->dirfd = 
e3e0: 2d 31 3b 0a 20 20 65 6e 74 65 72 4d 75 74 65 78  -1;.  enterMutex
e3f0: 28 29 3b 0a 20 20 0a 20 20 63 6c 6f 73 65 28 70  ();.  .  close(p
e400: 46 69 6c 65 2d 3e 68 29 3b 20 20 0a 20 20 6c 65  File->h);  .  le
e410: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53  aveMutex();.  OS
e420: 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20 20 20  TRACE2("CLOSE   
e430: 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  %-3d\n", pFile->
e440: 68 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65  h);.  OpenCounte
e450: 72 28 2d 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  r(-1);.  return 
e460: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 70  SQLITE_OK;.}..#p
e470: 72 61 67 6d 61 20 6d 61 72 6b 20 4f 6c 64 2d 53  ragma mark Old-S
e480: 63 68 6f 6f 6c 20 2e 6c 6f 63 6b 20 66 69 6c 65  chool .lock file
e490: 20 62 61 73 65 64 20 6c 6f 63 6b 69 6e 67 0a 0a   based locking..
e4a0: 2f 2a 0a 20 2a 2a 20 54 68 65 20 64 6f 74 6c 6f  /*. ** The dotlo
e4b0: 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ckLockingContext
e4c0: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
e4d0: 69 6e 73 20 61 6c 6c 20 64 6f 74 6c 6f 63 6b 20  ins all dotlock 
e4e0: 28 2e 6c 6f 63 6b 29 20 6c 6f 63 6b 0a 20 2a 2a  (.lock) lock. **
e4f0: 20 73 70 65 63 69 66 69 63 20 73 74 61 74 65 0a   specific state.
e500: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
e510: 63 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  ct dotlockLockin
e520: 67 43 6f 6e 74 65 78 74 20 64 6f 74 6c 6f 63 6b  gContext dotlock
e530: 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  LockingContext;.
e540: 73 74 72 75 63 74 20 64 6f 74 6c 6f 63 6b 4c 6f  struct dotlockLo
e550: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20  ckingContext {. 
e560: 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 3b   char *lockPath;
e570: 0a 7d 3b 0a 0a 0a 73 74 61 74 69 63 20 69 6e 74  .};...static int
e580: 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 43 68 65 63   dotlockUnixChec
e590: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
e5a0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
e5b0: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
e5c0: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
e5d0: 29 69 64 3b 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f  )id;.  dotlockLo
e5e0: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
e5f0: 6e 74 65 78 74 20 3d 20 0a 20 20 20 20 28 64 6f  ntext = .    (do
e600: 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
e610: 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
e620: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
e630: 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f  .  if (pFile->lo
e640: 63 6b 74 79 70 65 20 3d 3d 20 52 45 53 45 52 56  cktype == RESERV
e650: 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 72  ED_LOCK) {.    r
e660: 65 74 75 72 6e 20 31 3b 20 2f 2a 20 61 6c 72 65  eturn 1; /* alre
e670: 61 64 79 20 68 61 76 65 20 61 20 72 65 73 65 72  ady have a reser
e680: 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 20  ved lock */.  } 
e690: 65 6c 73 65 20 7b 0a 20 20 20 20 73 74 72 75 63  else {.    struc
e6a0: 74 20 73 74 61 74 20 73 74 61 74 42 75 66 3b 0a  t stat statBuf;.
e6b0: 20 20 20 20 69 66 20 28 6c 73 74 61 74 28 63 6f      if (lstat(co
e6c0: 6e 74 65 78 74 2d 3e 6c 6f 63 6b 50 61 74 68 2c  ntext->lockPath,
e6d0: 26 73 74 61 74 42 75 66 29 20 3d 3d 20 30 29 0a  &statBuf) == 0).
e6e0: 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 65 78        /* file ex
e6f0: 69 73 74 73 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c  ists, someone el
e700: 73 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20  se has the lock 
e710: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
e720: 31 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20  1;.    else.    
e730: 20 20 2f 2a 20 66 69 6c 65 20 64 6f 65 73 20 6e    /* file does n
e740: 6f 74 20 65 78 69 73 74 2c 20 77 65 20 63 6f 75  ot exist, we cou
e750: 6c 64 20 68 61 76 65 20 69 74 20 69 66 20 77 65  ld have it if we
e760: 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20   want it */.    
e770: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
e780: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  }..static int do
e790: 74 6c 6f 63 6b 55 6e 69 78 4c 6f 63 6b 28 73 71  tlockUnixLock(sq
e7a0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
e7b0: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a  int locktype) {.
e7c0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
e7d0: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
e7e0: 64 3b 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b  d;.  dotlockLock
e7f0: 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  ingContext *cont
e800: 65 78 74 20 3d 20 0a 20 20 20 20 28 64 6f 74 6c  ext = .    (dotl
e810: 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
e820: 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  t *) pFile->lock
e830: 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20  ingContext;.  . 
e840: 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64   /* if we alread
e850: 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69  y have a lock, i
e860: 74 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  t is exclusive. 
e870: 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75   .  ** Just adju
e880: 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e  st level and pun
e890: 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e  t on outta here.
e8a0: 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d   */.  if (pFile-
e8b0: 3e 6c 6f 63 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c  >locktype > NO_L
e8c0: 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
e8d0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
e8e0: 6b 74 79 70 65 3b 0a 20 20 20 20 0a 20 20 20 20  ktype;.    .    
e8f0: 2f 2a 20 41 6c 77 61 79 73 20 75 70 64 61 74 65  /* Always update
e900: 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70 20 6f   the timestamp o
e910: 6e 20 74 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a  n the old file *
e920: 2f 0a 20 20 20 20 75 74 69 6d 65 73 28 63 6f 6e  /.    utimes(con
e930: 74 65 78 74 2d 3e 6c 6f 63 6b 50 61 74 68 2c 4e  text->lockPath,N
e940: 55 4c 4c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ULL);.    return
e950: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
e960: 20 20 0a 20 20 2f 2a 20 63 68 65 63 6b 20 74 6f    .  /* check to
e970: 20 73 65 65 20 69 66 20 6c 6f 63 6b 20 66 69 6c   see if lock fil
e980: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
e990: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61   */.  struct sta
e9a0: 74 20 73 74 61 74 42 75 66 3b 0a 20 20 69 66 20  t statBuf;.  if 
e9b0: 28 6c 73 74 61 74 28 63 6f 6e 74 65 78 74 2d 3e  (lstat(context->
e9c0: 6c 6f 63 6b 50 61 74 68 2c 26 73 74 61 74 42 75  lockPath,&statBu
e9d0: 66 29 20 3d 3d 20 30 29 7b 0a 20 20 20 20 72 65  f) == 0){.    re
e9e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
e9f0: 3b 20 2f 2a 20 69 74 20 64 6f 65 73 2c 20 62 75  ; /* it does, bu
ea00: 73 79 20 2a 2f 0a 20 20 7d 0a 20 20 0a 20 20 2f  sy */.  }.  .  /
ea10: 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73  * grab an exclus
ea20: 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e  ive lock */.  in
ea30: 74 20 66 64 20 3d 20 6f 70 65 6e 28 63 6f 6e 74  t fd = open(cont
ea40: 65 78 74 2d 3e 6c 6f 63 6b 50 61 74 68 2c 4f 5f  ext->lockPath,O_
ea50: 52 44 4f 4e 4c 59 7c 4f 5f 43 52 45 41 54 7c 4f  RDONLY|O_CREAT|O
ea60: 5f 45 58 43 4c 2c 30 36 30 30 29 3b 0a 20 20 69  _EXCL,0600);.  i
ea70: 66 20 28 66 64 20 3c 20 30 29 20 7b 0a 20 20 20  f (fd < 0) {.   
ea80: 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f 70   /* failed to op
ea90: 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66 69  en/create the fi
eaa0: 6c 65 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65  le, someone else
eab0: 20 6d 61 79 20 68 61 76 65 20 73 74 6f 6c 65 6e   may have stolen
eac0: 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20   the lock */.   
ead0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
eae0: 55 53 59 3b 20 0a 20 20 7d 0a 20 20 63 6c 6f 73  USY; .  }.  clos
eaf0: 65 28 66 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 67  e(fd);.  .  /* g
eb00: 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74  ot it, set the t
eb10: 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f  ype and return o
eb20: 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f  k */.  pFile->lo
eb30: 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70  cktype = locktyp
eb40: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
eb50: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63  TE_OK;.}..static
eb60: 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 69 78   int dotlockUnix
eb70: 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
eb80: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
eb90: 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46  ktype) {.  unixF
eba0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
ebb0: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 64 6f  ixFile*)id;.  do
ebc0: 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
ebd0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 0a  ext *context = .
ebe0: 20 20 20 20 28 64 6f 74 6c 6f 63 6b 4c 6f 63 6b      (dotlockLock
ebf0: 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
ec00: 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
ec10: 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ext;.  .  assert
ec20: 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52  ( locktype<=SHAR
ec30: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
ec40: 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73  /* no-op if poss
ec50: 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46  ible */.  if( pF
ec60: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c  ile->locktype==l
ec70: 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
ec80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
ec90: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61  .  }.  .  /* sha
eca0: 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20  red can just be 
ecb0: 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61  set because we a
ecc0: 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78  lways have an ex
ecd0: 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20  clusive */.  if 
ece0: 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  (locktype==SHARE
ecf0: 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  D_LOCK) {.    pF
ed00: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
ed10: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 72 65  locktype;.    re
ed20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ed30: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20    }.  .  /* no, 
ed40: 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20  really, unlock. 
ed50: 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 28 63 6f 6e 74  */.  unlink(cont
ed60: 65 78 74 2d 3e 6c 6f 63 6b 50 61 74 68 29 3b 0a  ext->lockPath);.
ed70: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
ed80: 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72  e = NO_LOCK;.  r
ed90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
eda0: 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65  .}../*. ** Close
edb0: 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61   a file.. */.sta
edc0: 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55  tic int dotlockU
edd0: 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  nixClose(sqlite3
ede0: 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 75  _file *id) {.  u
edf0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
ee00: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
ee10: 20 20 0a 20 20 69 66 28 20 21 70 46 69 6c 65 20    .  if( !pFile 
ee20: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
ee30: 4f 4b 3b 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 69  OK;.  dotlockUni
ee40: 78 55 6e 6c 6f 63 6b 28 2a 70 49 64 2c 20 4e 4f  xUnlock(*pId, NO
ee50: 5f 4c 4f 43 4b 29 3b 0a 20 20 2f 2a 20 66 72 65  _LOCK);.  /* fre
ee60: 65 20 74 68 65 20 64 6f 74 6c 6f 63 6b 20 6c 6f  e the dotlock lo
ee70: 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  cking structure 
ee80: 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  */.  if (pFile->
ee90: 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 21  lockingContext !
eea0: 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 69 66  = NULL) {.    if
eeb0: 20 28 28 28 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69   (((dotlockLocki
eec0: 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
eed0: 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
eee0: 74 29 2d 3e 6c 6f 63 6b 50 61 74 68 20 21 3d 20  t)->lockPath != 
eef0: 4e 55 4c 4c 29 0a 20 20 20 20 20 20 73 71 6c 69  NULL).      sqli
ef00: 74 65 33 5f 66 72 65 65 28 20 28 20 28 64 6f 74  te3_free( ( (dot
ef10: 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  lockLockingConte
ef20: 78 74 20 2a 29 0a 20 20 20 20 20 20 20 20 70 46  xt *).        pF
ef30: 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
ef40: 65 78 74 29 2d 3e 6c 6f 63 6b 50 61 74 68 29 3b  ext)->lockPath);
ef50: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
ef60: 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  e(pFile->locking
ef70: 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20 20  Context);.  }.  
ef80: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69  .  if( pFile->di
ef90: 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28 70  rfd>=0 ) close(p
efa0: 46 69 6c 65 2d 3e 64 69 72 66 64 29 3b 0a 20 20  File->dirfd);.  
efb0: 70 46 69 6c 65 2d 3e 64 69 72 66 64 20 3d 20 2d  pFile->dirfd = -
efc0: 31 3b 0a 20 20 65 6e 74 65 72 4d 75 74 65 78 28  1;.  enterMutex(
efd0: 29 3b 0a 20 20 0a 20 20 63 6c 6f 73 65 28 70 46  );.  .  close(pF
efe0: 69 6c 65 2d 3e 68 29 3b 0a 20 20 0a 20 20 6c 65  ile->h);.  .  le
eff0: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53  aveMutex();.  OS
f000: 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20 20 20  TRACE2("CLOSE   
f010: 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  %-3d\n", pFile->
f020: 68 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65  h);.  OpenCounte
f030: 72 28 2d 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  r(-1);.  return 
f040: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23  SQLITE_OK;.}...#
f050: 70 72 61 67 6d 61 20 6d 61 72 6b 20 4e 6f 20 6c  pragma mark No l
f060: 6f 63 6b 69 6e 67 0a 0a 2f 2a 0a 20 2a 2a 20 54  ocking../*. ** T
f070: 68 65 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  he nolockLocking
f080: 43 6f 6e 74 65 78 74 20 69 73 20 76 6f 69 64 0a  Context is void.
f090: 20 2a 2f 0a 74 79 70 65 64 65 66 20 76 6f 69 64   */.typedef void
f0a0: 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f   nolockLockingCo
f0b0: 6e 74 65 78 74 3b 0a 0a 73 74 61 74 69 63 20 69  ntext;..static i
f0c0: 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 69 78 43 68 65  nt nolockUnixChe
f0d0: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
f0e0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
f0f0: 20 7b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   {.  return 0;.}
f100: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c  ..static int nol
f110: 6f 63 6b 55 6e 69 78 4c 6f 63 6b 28 73 71 6c 69  ockUnixLock(sqli
f120: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
f130: 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20  t locktype) {.  
f140: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f150: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
f160: 6e 6f 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b  nolockUnixUnlock
f170: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
f180: 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
f190: 20 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   {.  return SQLI
f1a0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a  TE_OK;.}../*. **
f1b0: 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20   Close a file.. 
f1c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  */.static int no
f1d0: 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73 65 28 73 71  lockUnixClose(sq
f1e0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
f1f0: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
f200: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
f210: 29 69 64 3b 0a 20 20 0a 20 20 69 66 28 20 21 70  )id;.  .  if( !p
f220: 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51  File ) return SQ
f230: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
f240: 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29  File->dirfd>=0 )
f250: 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69   close(pFile->di
f260: 72 66 64 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 64  rfd);.  pFile->d
f270: 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 65 6e 74  irfd = -1;.  ent
f280: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 0a 20 20  erMutex();.  .  
f290: 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 68 29 3b  close(pFile->h);
f2a0: 0a 20 20 0a 20 20 6c 65 61 76 65 4d 75 74 65 78  .  .  leaveMutex
f2b0: 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22  ();.  OSTRACE2("
f2c0: 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c  CLOSE   %-3d\n",
f2d0: 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 4f 70   pFile->h);.  Op
f2e0: 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20  enCounter(-1);. 
f2f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
f300: 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  K;.}..#endif /* 
f310: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
f320: 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a  CKING_STYLE */..
f330: 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69  ./*.** Informati
f340: 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f  on and control o
f350: 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68  f an open file h
f360: 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
f370: 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e   int unixFileCon
f380: 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
f390: 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76  e *id, int op, v
f3a0: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 77  oid *pArg){.  sw
f3b0: 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
f3c0: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
f3d0: 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20  L_LOCKSTATE: {. 
f3e0: 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
f3f0: 20 3d 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69   = ((unixFile*)i
f400: 64 29 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  d)->locktype;.  
f410: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f420: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
f430: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f440: 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ERROR;.}../*.** 
f450: 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f  Return the secto
f460: 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  r size in bytes 
f470: 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  of the underlyin
f480: 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66  g block device f
f490: 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66  or.** the specif
f4a0: 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69  ied file. This i
f4b0: 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20  s almost always 
f4c0: 35 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d  512 bytes, but m
f4d0: 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20  ay be.** larger 
f4e0: 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73  for some devices
f4f0: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63  ..**.** SQLite c
f500: 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73  ode assumes this
f510: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74   function cannot
f520: 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61   fail. It also a
f530: 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69  ssumes that.** i
f540: 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20  f two files are 
f550: 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73  created in the s
f560: 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ame file-system 
f570: 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a  directory (i.e..
f580: 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e  ** a database an
f590: 64 20 69 74 27 73 20 6a 6f 75 72 6e 61 6c 20 66  d it's journal f
f5a0: 69 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65  ile) that the se
f5b0: 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
f5c0: 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f  e the.** same fo
f5d0: 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69  r both..*/.stati
f5e0: 63 20 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72  c int unixSector
f5f0: 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
f600: 65 20 2a 69 64 29 7b 0a 20 20 72 65 74 75 72 6e  e *id){.  return
f610: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
f620: 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a  SECTOR_SIZE;.}..
f630: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
f640: 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
f650: 72 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20  ristics for the 
f660: 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c  file. This is al
f670: 77 61 79 73 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  ways 0..*/.stati
f680: 63 20 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65  c int unixDevice
f690: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
f6a0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
f6b0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  ){.  return 0;.}
f6c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63  ../*.** This vec
f6d0: 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20  tor defines all 
f6e0: 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74  the methods that
f6f0: 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20   can operate on 
f700: 61 6e 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a  an sqlite3_file.
f710: 2a 2a 20 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f 0a  ** for unix..*/.
f720: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
f730: 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
f740: 73 71 6c 69 74 65 33 55 6e 69 78 49 6f 4d 65 74  sqlite3UnixIoMet
f750: 68 6f 64 20 3d 20 7b 0a 20 20 31 2c 20 20 20 20  hod = {.  1,    
f760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f770: 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
f780: 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 0a  */.  unixClose,.
f790: 20 20 75 6e 69 78 52 65 61 64 2c 0a 20 20 75 6e    unixRead,.  un
f7a0: 69 78 57 72 69 74 65 2c 0a 20 20 75 6e 69 78 54  ixWrite,.  unixT
f7b0: 72 75 6e 63 61 74 65 2c 0a 20 20 75 6e 69 78 53  runcate,.  unixS
f7c0: 79 6e 63 2c 0a 20 20 75 6e 69 78 46 69 6c 65 53  ync,.  unixFileS
f7d0: 69 7a 65 2c 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c  ize,.  unixLock,
f7e0: 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 0a 20  .  unixUnlock,. 
f7f0: 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76   unixCheckReserv
f800: 65 64 4c 6f 63 6b 2c 0a 20 20 75 6e 69 78 46 69  edLock,.  unixFi
f810: 6c 65 43 6f 6e 74 72 6f 6c 2c 0a 20 20 75 6e 69  leControl,.  uni
f820: 78 53 65 63 74 6f 72 53 69 7a 65 2c 0a 20 20 75  xSectorSize,.  u
f830: 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74  nixDeviceCharact
f840: 65 72 69 73 74 69 63 73 0a 7d 3b 0a 0a 23 69 66  eristics.};..#if
f850: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
f860: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
f870: 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74 6f  /*.** This vecto
f880: 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68  r defines all th
f890: 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63  e methods that c
f8a0: 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e  an operate on an
f8b0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a   sqlite3_file.**
f8c0: 20 66 6f 72 20 75 6e 69 78 20 77 69 74 68 20 41   for unix with A
f8d0: 46 50 20 73 74 79 6c 65 20 66 69 6c 65 20 6c 6f  FP style file lo
f8e0: 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
f8f0: 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
f900: 6f 5f 6d 65 74 68 6f 64 73 20 73 71 6c 69 74 65  o_methods sqlite
f910: 33 41 46 50 4c 6f 63 6b 69 6e 67 55 6e 69 78 49  3AFPLockingUnixI
f920: 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20 31 2c  oMethod = {.  1,
f930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f940: 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
f950: 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f  ion */.  unixClo
f960: 73 65 2c 0a 20 20 75 6e 69 78 52 65 61 64 2c 0a  se,.  unixRead,.
f970: 20 20 75 6e 69 78 57 72 69 74 65 2c 0a 20 20 75    unixWrite,.  u
f980: 6e 69 78 54 72 75 6e 63 61 74 65 2c 0a 20 20 75  nixTruncate,.  u
f990: 6e 69 78 53 79 6e 63 2c 0a 20 20 75 6e 69 78 46  nixSync,.  unixF
f9a0: 69 6c 65 53 69 7a 65 2c 0a 20 20 61 66 70 55 6e  ileSize,.  afpUn
f9b0: 69 78 4c 6f 63 6b 2c 0a 20 20 61 66 70 55 6e 69  ixLock,.  afpUni
f9c0: 78 55 6e 6c 6f 63 6b 2c 0a 20 20 61 66 70 55 6e  xUnlock,.  afpUn
f9d0: 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
f9e0: 6f 63 6b 2c 0a 20 20 75 6e 69 78 46 69 6c 65 43  ock,.  unixFileC
f9f0: 6f 6e 74 72 6f 6c 2c 0a 20 20 75 6e 69 78 53 65  ontrol,.  unixSe
fa00: 63 74 6f 72 53 69 7a 65 2c 0a 20 20 75 6e 69 78  ctorSize,.  unix
fa10: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
fa20: 73 74 69 63 73 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  stics.};../*.** 
fa30: 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69  This vector defi
fa40: 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68  nes all the meth
fa50: 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65  ods that can ope
fa60: 72 61 74 65 20 6f 6e 20 61 6e 20 73 71 6c 69 74  rate on an sqlit
fa70: 65 33 5f 66 69 6c 65 0a 2a 2a 20 66 6f 72 20 75  e3_file.** for u
fa80: 6e 69 78 20 77 69 74 68 20 66 6c 6f 63 6b 28 29  nix with flock()
fa90: 20 73 74 79 6c 65 20 66 69 6c 65 20 6c 6f 63 6b   style file lock
faa0: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ing..*/.static c
fab0: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
fac0: 6d 65 74 68 6f 64 73 20 73 71 6c 69 74 65 33 46  methods sqlite3F
fad0: 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78 49  lockLockingUnixI
fae0: 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20 31 2c  oMethod = {.  1,
faf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb00: 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
fb10: 69 6f 6e 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e  ion */.  flockUn
fb20: 69 78 43 6c 6f 73 65 2c 0a 20 20 75 6e 69 78 52  ixClose,.  unixR
fb30: 65 61 64 2c 0a 20 20 75 6e 69 78 57 72 69 74 65  ead,.  unixWrite
fb40: 2c 0a 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65  ,.  unixTruncate
fb50: 2c 0a 20 20 75 6e 69 78 53 79 6e 63 2c 0a 20 20  ,.  unixSync,.  
fb60: 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 0a 20 20  unixFileSize,.  
fb70: 66 6c 6f 63 6b 55 6e 69 78 4c 6f 63 6b 2c 0a 20  flockUnixLock,. 
fb80: 20 66 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b   flockUnixUnlock
fb90: 2c 0a 20 20 66 6c 6f 63 6b 55 6e 69 78 43 68 65  ,.  flockUnixChe
fba0: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a  ckReservedLock,.
fbb0: 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f    unixFileContro
fbc0: 6c 2c 0a 20 20 75 6e 69 78 53 65 63 74 6f 72 53  l,.  unixSectorS
fbd0: 69 7a 65 2c 0a 20 20 75 6e 69 78 44 65 76 69 63  ize,.  unixDevic
fbe0: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
fbf0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .};../*.** This 
fc00: 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61  vector defines a
fc10: 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74  ll the methods t
fc20: 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20  hat can operate 
fc30: 6f 6e 20 61 6e 20 73 71 6c 69 74 65 33 5f 66 69  on an sqlite3_fi
fc40: 6c 65 0a 2a 2a 20 66 6f 72 20 75 6e 69 78 20 77  le.** for unix w
fc50: 69 74 68 20 64 6f 74 6c 6f 63 6b 20 73 74 79 6c  ith dotlock styl
fc60: 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a  e file locking..
fc70: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
fc80: 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
fc90: 64 73 20 73 71 6c 69 74 65 33 44 6f 74 6c 6f 63  ds sqlite3Dotloc
fca0: 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65  kLockingUnixIoMe
fcb0: 74 68 6f 64 20 3d 20 7b 0a 20 20 31 2c 20 20 20  thod = {.  1,   
fcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcd0: 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
fce0: 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 69   */.  dotlockUni
fcf0: 78 43 6c 6f 73 65 2c 0a 20 20 75 6e 69 78 52 65  xClose,.  unixRe
fd00: 61 64 2c 0a 20 20 75 6e 69 78 57 72 69 74 65 2c  ad,.  unixWrite,
fd10: 0a 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65 2c  .  unixTruncate,
fd20: 0a 20 20 75 6e 69 78 53 79 6e 63 2c 0a 20 20 75  .  unixSync,.  u
fd30: 6e 69 78 46 69 6c 65 53 69 7a 65 2c 0a 20 20 64  nixFileSize,.  d
fd40: 6f 74 6c 6f 63 6b 55 6e 69 78 4c 6f 63 6b 2c 0a  otlockUnixLock,.
fd50: 20 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 55 6e 6c    dotlockUnixUnl
fd60: 6f 63 6b 2c 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e  ock,.  dotlockUn
fd70: 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
fd80: 6f 63 6b 2c 0a 20 20 75 6e 69 78 46 69 6c 65 43  ock,.  unixFileC
fd90: 6f 6e 74 72 6f 6c 2c 0a 20 20 75 6e 69 78 53 65  ontrol,.  unixSe
fda0: 63 74 6f 72 53 69 7a 65 2c 0a 20 20 75 6e 69 78  ctorSize,.  unix
fdb0: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
fdc0: 73 74 69 63 73 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  stics.};../*.** 
fdd0: 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69  This vector defi
fde0: 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68  nes all the meth
fdf0: 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65  ods that can ope
fe00: 72 61 74 65 20 6f 6e 20 61 6e 20 73 71 6c 69 74  rate on an sqlit
fe10: 65 33 5f 66 69 6c 65 0a 2a 2a 20 66 6f 72 20 75  e3_file.** for u
fe20: 6e 69 78 20 77 69 74 68 20 64 6f 74 6c 6f 63 6b  nix with dotlock
fe30: 20 73 74 79 6c 65 20 66 69 6c 65 20 6c 6f 63 6b   style file lock
fe40: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ing..*/.static c
fe50: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
fe60: 6d 65 74 68 6f 64 73 20 73 71 6c 69 74 65 33 4e  methods sqlite3N
fe70: 6f 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78  olockLockingUnix
fe80: 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20 31  IoMethod = {.  1
fe90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
fea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
feb0: 73 69 6f 6e 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  sion */.  nolock
fec0: 55 6e 69 78 43 6c 6f 73 65 2c 0a 20 20 75 6e 69  UnixClose,.  uni
fed0: 78 52 65 61 64 2c 0a 20 20 75 6e 69 78 57 72 69  xRead,.  unixWri
fee0: 74 65 2c 0a 20 20 75 6e 69 78 54 72 75 6e 63 61  te,.  unixTrunca
fef0: 74 65 2c 0a 20 20 75 6e 69 78 53 79 6e 63 2c 0a  te,.  unixSync,.
ff00: 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 0a    unixFileSize,.
ff10: 20 20 6e 6f 6c 6f 63 6b 55 6e 69 78 4c 6f 63 6b    nolockUnixLock
ff20: 2c 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 69 78 55 6e  ,.  nolockUnixUn
ff30: 6c 6f 63 6b 2c 0a 20 20 6e 6f 6c 6f 63 6b 55 6e  lock,.  nolockUn
ff40: 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
ff50: 6f 63 6b 2c 0a 20 20 75 6e 69 78 46 69 6c 65 43  ock,.  unixFileC
ff60: 6f 6e 74 72 6f 6c 2c 0a 20 20 75 6e 69 78 53 65  ontrol,.  unixSe
ff70: 63 74 6f 72 53 69 7a 65 2c 0a 20 20 75 6e 69 78  ctorSize,.  unix
ff80: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
ff90: 73 74 69 63 73 0a 7d 3b 0a 0a 23 65 6e 64 69 66  stics.};..#endif
ffa0: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
ffb0: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
ffc0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  */../*.** Alloca
ffd0: 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20  te memory for a 
ffe0: 6e 65 77 20 75 6e 69 78 46 69 6c 65 20 61 6e 64  new unixFile and
fff0: 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 61 74   initialize that
10000 20 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20 57 72   unixFile..** Wr
10010 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ite a pointer to
10020 20 74 68 65 20 6e 65 77 20 75 6e 69 78 46 69 6c   the new unixFil
10030 65 20 69 6e 74 6f 20 2a 70 49 64 2e 0a 2a 2a 20  e into *pId..** 
10040 49 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66  If we run out of
10050 20 6d 65 6d 6f 72 79 2c 20 63 6c 6f 73 65 20 74   memory, close t
10060 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65 74 75  he file and retu
10070 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a  rn an error..*/.
10080 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
10090 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
100a0 4c 45 0a 2f 2a 20 0a 2a 2a 20 57 68 65 6e 20 6c  LE./* .** When l
100b0 6f 63 6b 69 6e 67 20 65 78 74 65 6e 73 69 6f 6e  ocking extension
100c0 73 20 61 72 65 20 65 6e 61 62 6c 65 64 2c 20 74  s are enabled, t
100d0 68 65 20 66 69 6c 65 70 61 74 68 20 61 6e 64 20  he filepath and 
100e0 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 0a 2a  locking style .*
100f0 2a 20 61 72 65 20 6e 65 65 64 65 64 20 74 6f 20  * are needed to 
10100 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 75 6e  determine the un
10110 69 78 46 69 6c 65 20 70 4d 65 74 68 6f 64 20 74  ixFile pMethod t
10120 6f 20 75 73 65 20 66 6f 72 20 6c 6f 63 6b 69 6e  o use for lockin
10130 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a  g operations..**
10140 20 54 68 65 20 6c 6f 63 6b 69 6e 67 2d 73 74 79   The locking-sty
10150 6c 65 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b  le specific lock
10160 69 6e 67 43 6f 6e 74 65 78 74 20 64 61 74 61 20  ingContext data 
10170 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65  structure is cre
10180 61 74 65 64 20 0a 2a 2a 20 61 6e 64 20 61 73 73  ated .** and ass
10190 69 67 6e 65 64 20 68 65 72 65 20 61 6c 73 6f 2e  igned here also.
101a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
101b0 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20  illInUnixFile(. 
101c0 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20   int h,         
101d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
101e0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
101f0 20 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f   of file being o
10200 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64  pened */.  int d
10210 69 72 66 64 2c 20 20 20 20 20 20 20 20 20 20 20  irfd,           
10220 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20     /* Directory 
10230 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
10240 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
10250 65 20 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a 20  e *pId,      /* 
10260 57 72 69 74 65 20 63 6f 6d 70 6c 65 74 65 64 20  Write completed 
10270 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68  initialization h
10280 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
10290 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
102a0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
102b0 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
102c0 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  d */.){.  sqlite
102d0 33 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 6c 6f  3LockingStyle lo
102e0 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e  ckingStyle;.  un
102f0 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28  ixFile *pNew = (
10300 75 6e 69 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a  unixFile *)pId;.
10310 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 6d 65 6d    int rc;..  mem
10320 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a  set(pNew, 0, siz
10330 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
10340 20 20 6c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d    lockingStyle =
10350 20 73 71 6c 69 74 65 33 44 65 74 65 63 74 4c 6f   sqlite3DetectLo
10360 63 6b 69 6e 67 53 74 79 6c 65 28 7a 46 69 6c 65  ckingStyle(zFile
10370 6e 61 6d 65 2c 20 68 29 3b 0a 20 20 69 66 20 28  name, h);.  if (
10380 20 6c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d   lockingStyle ==
10390 20 70 6f 73 69 78 4c 6f 63 6b 69 6e 67 53 74 79   posixLockingSty
103a0 6c 65 20 29 20 7b 0a 20 20 20 20 65 6e 74 65 72  le ) {.    enter
103b0 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20  Mutex();.    rc 
103c0 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 68  = findLockInfo(h
103d0 2c 20 26 70 4e 65 77 2d 3e 70 4c 6f 63 6b 2c 20  , &pNew->pLock, 
103e0 26 70 4e 65 77 2d 3e 70 4f 70 65 6e 29 3b 0a 20  &pNew->pOpen);. 
103f0 20 20 20 6c 65 61 76 65 4d 75 74 65 78 28 29 3b     leaveMutex();
10400 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
10410 20 20 20 20 20 63 6c 6f 73 65 28 68 29 3b 0a 20       close(h);. 
10420 20 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c       unlink(zFil
10430 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  ename);.      re
10440 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
10450 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73  M;.    }.  } els
10460 65 20 7b 0a 20 20 20 20 2f 2a 20 20 70 4c 6f 63  e {.    /*  pLoc
10470 6b 20 61 6e 64 20 70 4f 70 65 6e 20 61 72 65 20  k and pOpen are 
10480 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 70 6f  only used for po
10490 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  six advisory loc
104a0 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 70 4e 65 77  king */.    pNew
104b0 2d 3e 70 4c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a  ->pLock = NULL;.
104c0 20 20 20 20 70 4e 65 77 2d 3e 70 4f 70 65 6e 20      pNew->pOpen 
104d0 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 70 4e  = NULL;.  }.  pN
104e0 65 77 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a  ew->dirfd = -1;.
104f0 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20    pNew->h = h;. 
10500 20 53 45 54 5f 54 48 52 45 41 44 49 44 28 70 4e   SET_THREADID(pN
10510 65 77 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  ew);.  pNew = sq
10520 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
10530 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 20 29  zeof(unixFile) )
10540 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
10550 29 7b 0a 20 20 20 20 63 6c 6f 73 65 28 68 29 3b  ){.    close(h);
10560 0a 20 20 20 20 65 6e 74 65 72 4d 75 74 65 78 28  .    enterMutex(
10570 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f  );.    releaseLo
10580 63 6b 49 6e 66 6f 28 70 4e 65 77 2d 3e 70 4c 6f  ckInfo(pNew->pLo
10590 63 6b 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  ck);.    release
105a0 4f 70 65 6e 43 6e 74 28 70 4e 65 77 2d 3e 70 4f  OpenCnt(pNew->pO
105b0 70 65 6e 29 3b 0a 20 20 20 20 6c 65 61 76 65 4d  pen);.    leaveM
105c0 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 74 75  utex();.    retu
105d0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
105e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 77  .  }else{.    sw
105f0 69 74 63 68 28 6c 6f 63 6b 69 6e 67 53 74 79 6c  itch(lockingStyl
10600 65 29 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e) {.      case 
10610 61 66 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3a  afpLockingStyle:
10620 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 61 66   {.        /* af
10630 70 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74  p locking uses t
10640 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20  he file path so 
10650 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69  it needs to be i
10660 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 20  ncluded in.     
10670 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63     ** the afpLoc
10680 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 2f 0a 20  kingContext */. 
10690 20 20 20 20 20 20 20 69 6e 74 20 6e 46 69 6c 65         int nFile
106a0 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70 4e  name;.        pN
106b0 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 73  ew->pMethod = &s
106c0 71 6c 69 74 65 33 41 46 50 4c 6f 63 6b 69 6e 67  qlite3AFPLocking
106d0 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a 20 20  UnixIoMethod;.  
106e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b        pNew->lock
106f0 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 0a 20 20  ingContext = .  
10700 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
10710 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 61 66  malloc(sizeof(af
10720 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  pLockingContext)
10730 29 3b 0a 20 20 20 20 20 20 20 20 6e 46 69 6c 65  );.        nFile
10740 6e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 46  name = strlen(zF
10750 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20 20  ilename)+1;.    
10760 20 20 20 20 28 28 61 66 70 4c 6f 63 6b 69 6e 67      ((afpLocking
10770 43 6f 6e 74 65 78 74 20 2a 29 70 4e 65 77 2d 3e  Context *)pNew->
10780 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d  lockingContext)-
10790 3e 66 69 6c 65 50 61 74 68 20 3d 20 0a 20 20 20  >filePath = .   
107a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
107b0 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d 65 29  alloc(nFilename)
107c0 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
107d0 28 28 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  (((afpLockingCon
107e0 74 65 78 74 20 2a 29 70 4e 65 77 2d 3e 6c 6f 63  text *)pNew->loc
107f0 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 66 69  kingContext)->fi
10800 6c 65 50 61 74 68 2c 20 0a 20 20 20 20 20 20 20  lePath, .       
10810 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d          zFilenam
10820 65 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e, nFilename);. 
10830 20 20 20 20 20 20 20 73 72 61 6e 64 6f 6d 64 65         srandomde
10840 76 28 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  v();.        bre
10850 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
10860 20 20 63 61 73 65 20 66 6c 6f 63 6b 4c 6f 63 6b    case flockLock
10870 69 6e 67 53 74 79 6c 65 3a 0a 20 20 20 20 20 20  ingStyle:.      
10880 20 20 2f 2a 20 66 6c 6f 63 6b 20 6c 6f 63 6b 69    /* flock locki
10890 6e 67 20 64 6f 65 73 6e 27 74 20 6e 65 65 64 20  ng doesn't need 
108a0 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69  additional locki
108b0 6e 67 43 6f 6e 74 65 78 74 20 69 6e 66 6f 72 6d  ngContext inform
108c0 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ation */.       
108d0 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d   pNew->pMethod =
108e0 20 26 73 71 6c 69 74 65 33 46 6c 6f 63 6b 4c 6f   &sqlite3FlockLo
108f0 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f  ckingUnixIoMetho
10900 64 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  d;.        break
10910 3b 0a 20 20 20 20 20 20 63 61 73 65 20 64 6f 74  ;.      case dot
10920 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  lockLockingStyle
10930 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 64  : {.        /* d
10940 6f 74 6c 6f 63 6b 20 6c 6f 63 6b 69 6e 67 20 75  otlock locking u
10950 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
10960 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
10970 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a   be included in.
10980 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
10990 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  dotlockLockingCo
109a0 6e 74 65 78 74 20 2a 2f 0a 20 20 20 20 20 20 20  ntext */.       
109b0 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a   int nFilename;.
109c0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4d          pNew->pM
109d0 65 74 68 6f 64 20 3d 20 26 73 71 6c 69 74 65 33  ethod = &sqlite3
109e0 44 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 55 6e  DotlockLockingUn
109f0 69 78 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 20 20  ixIoMethod;.    
10a00 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e      pNew->lockin
10a10 67 43 6f 6e 74 65 78 74 20 3d 20 73 71 6c 69 74  gContext = sqlit
10a20 65 33 5f 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20  e3_malloc(.     
10a30 20 20 20 20 20 73 69 7a 65 6f 66 28 64 6f 74 6c       sizeof(dotl
10a40 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
10a50 74 29 29 3b 0a 20 20 20 20 20 20 20 20 6e 46 69  t));.        nFi
10a60 6c 65 6e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28  lename = strlen(
10a70 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a  zFilename) + 6;.
10a80 20 20 20 20 20 20 20 20 28 28 64 6f 74 6c 6f 63          ((dotloc
10a90 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  kLockingContext 
10aa0 2a 29 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43  *)pNew->lockingC
10ab0 6f 6e 74 65 78 74 29 2d 3e 6c 6f 63 6b 50 61 74  ontext)->lockPat
10ac0 68 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20  h = .           
10ad0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
10ae0 20 6e 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20   nFilename );.  
10af0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
10b00 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65  printf(nFilename
10b10 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
10b20 20 20 20 28 28 64 6f 74 6c 6f 63 6b 4c 6f 63 6b     ((dotlockLock
10b30 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 4e 65  ingContext *)pNe
10b40 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
10b50 74 29 2d 3e 6c 6f 63 6b 50 61 74 68 2c 20 0a 20  t)->lockPath, . 
10b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
10b70 25 73 2e 6c 6f 63 6b 22 2c 20 7a 46 69 6c 65 6e  %s.lock", zFilen
10b80 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ame);.        br
10b90 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
10ba0 20 20 20 63 61 73 65 20 70 6f 73 69 78 4c 6f 63     case posixLoc
10bb0 6b 69 6e 67 53 74 79 6c 65 3a 0a 20 20 20 20 20  kingStyle:.     
10bc0 20 20 20 2f 2a 20 70 6f 73 69 78 20 6c 6f 63 6b     /* posix lock
10bd0 69 6e 67 20 64 6f 65 73 6e 27 74 20 6e 65 65 64  ing doesn't need
10be0 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
10bf0 69 6e 67 43 6f 6e 74 65 78 74 20 69 6e 66 6f 72  ingContext infor
10c00 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  mation */.      
10c10 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20    pNew->pMethod 
10c20 3d 20 26 73 71 6c 69 74 65 33 55 6e 69 78 49 6f  = &sqlite3UnixIo
10c30 4d 65 74 68 6f 64 3b 0a 20 20 20 20 20 20 20 20  Method;.        
10c40 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
10c50 65 20 6e 6f 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  e noLockingStyle
10c60 3a 0a 20 20 20 20 20 20 63 61 73 65 20 75 6e 73  :.      case uns
10c70 75 70 70 6f 72 74 65 64 4c 6f 63 6b 69 6e 67 53  upportedLockingS
10c80 74 79 6c 65 3a 0a 20 20 20 20 20 20 64 65 66 61  tyle:.      defa
10c90 75 6c 74 3a 20 0a 20 20 20 20 20 20 20 20 70 4e  ult: .        pN
10ca0 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 73  ew->pMethod = &s
10cb0 71 6c 69 74 65 33 4e 6f 6c 6f 63 6b 4c 6f 63 6b  qlite3NolockLock
10cc0 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b  ingUnixIoMethod;
10cd0 0a 20 20 20 20 7d 0a 20 20 20 20 4f 70 65 6e 43  .    }.    OpenC
10ce0 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 20 20  ounter(+1);.    
10cf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10d00 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 20 2f 2a  ;.  }.}.#else /*
10d10 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
10d20 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
10d30 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49  static int fillI
10d40 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20 69 6e 74  nUnixFile(.  int
10d50 20 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   h,             
10d60 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65      /* Open file
10d70 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 66   descriptor on f
10d80 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ile being opened
10d90 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64 2c   */.  int dirfd,
10da0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
10db0 2a 70 49 64 2c 20 20 20 20 20 2f 2a 20 57 72 69  *pId,     /* Wri
10dc0 74 65 20 74 6f 20 74 68 65 20 75 6e 69 78 46 69  te to the unixFi
10dd0 6c 65 20 73 74 72 75 63 74 75 72 65 20 68 65 72  le structure her
10de0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
10df0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 20 20 2f 2a  r *zFilename  /*
10e00 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
10e10 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a  e being opened *
10e20 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  /.){.  unixFile 
10e30 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c  *pNew = (unixFil
10e40 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20 72  e *)pId;.  int r
10e50 63 3b 0a 0a 23 69 66 64 65 66 20 46 44 5f 43 4c  c;..#ifdef FD_CL
10e60 4f 45 58 45 43 0a 20 20 66 63 6e 74 6c 28 68 2c  OEXEC.  fcntl(h,
10e70 20 46 5f 53 45 54 46 44 2c 20 66 63 6e 74 6c 28   F_SETFD, fcntl(
10e80 68 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c  h, F_GETFD, 0) |
10e90 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65   FD_CLOEXEC);.#e
10ea0 6e 64 69 66 0a 0a 20 20 65 6e 74 65 72 4d 75 74  ndif..  enterMut
10eb0 65 78 28 29 3b 0a 20 20 72 63 20 3d 20 66 69 6e  ex();.  rc = fin
10ec0 64 4c 6f 63 6b 49 6e 66 6f 28 68 2c 20 26 70 4e  dLockInfo(h, &pN
10ed0 65 77 2d 3e 70 4c 6f 63 6b 2c 20 26 70 4e 65 77  ew->pLock, &pNew
10ee0 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 6c 65 61 76  ->pOpen);.  leav
10ef0 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20  eMutex();.  if( 
10f00 72 63 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 28  rc ){.    close(
10f10 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  h);.    return S
10f20 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
10f30 0a 0a 20 20 4f 53 54 52 41 43 45 33 28 22 4f 50  ..  OSTRACE3("OP
10f40 45 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22  EN    %-3d %s\n"
10f50 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  , h, zFilename);
10f60 0a 20 20 70 4e 65 77 2d 3e 64 69 72 66 64 20 3d  .  pNew->dirfd =
10f70 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d   -1;.  pNew->h =
10f80 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 72 66   h;.  pNew->dirf
10f90 64 20 3d 20 64 69 72 66 64 3b 0a 20 20 53 45 54  d = dirfd;.  SET
10fa0 5f 54 48 52 45 41 44 49 44 28 70 4e 65 77 29 3b  _THREADID(pNew);
10fb0 0a 0a 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f  ..  pNew->pMetho
10fc0 64 20 3d 20 26 73 71 6c 69 74 65 33 55 6e 69 78  d = &sqlite3Unix
10fd0 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 4f 70 65 6e  IoMethod;.  Open
10fe0 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 72  Counter(+1);.  r
10ff0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11000 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
11010 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
11020 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a  NG_STYLE */../*.
11030 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 64  ** Open a file d
11040 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
11050 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
11060 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65  ining file zFile
11070 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63  name..** If succ
11080 65 73 73 66 75 6c 2c 20 2a 70 46 64 20 69 73 20  essful, *pFd is 
11090 73 65 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 65  set to the opene
110a0 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
110b0 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  r and.** SQLITE_
110c0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
110d0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
110e0 72 73 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54  rs, either SQLIT
110f0 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51  E_NOMEM.** or SQ
11100 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73  LITE_CANTOPEN is
11110 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
11120 46 64 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20  Fd is set to an 
11130 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c  undefined.** val
11140 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  ue..**.** If SQL
11150 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
11160 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 69  ed, the caller i
11170 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
11180 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65  r closing.** the
11190 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
111a0 20 2a 70 46 64 20 75 73 69 6e 67 20 63 6c 6f 73   *pFd using clos
111b0 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
111c0 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79  nt openDirectory
111d0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
111e0 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64  lename, int *pFd
111f0 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69  ){.  int ii;.  i
11200 6e 74 20 66 64 3b 0a 20 20 63 68 61 72 20 7a 44  nt fd;.  char zD
11210 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e  irname[MAX_PATHN
11220 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69 74  AME+1];..  sqlit
11230 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f  e3_snprintf(MAX_
11240 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72 6e 61  PATHNAME, zDirna
11250 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e  me, "%s", zFilen
11260 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 73  ame);.  for(ii=s
11270 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b  trlen(zDirname);
11280 20 69 69 3e 3d 30 20 26 26 20 7a 44 69 72 6e 61   ii>=0 && zDirna
11290 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d  me[ii]!='/'; ii-
112a0 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20 29  -);.  if( ii>0 )
112b0 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69  {.    zDirname[i
112c0 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66  i] = '\0';.    f
112d0 64 20 3d 20 6f 70 65 6e 28 7a 44 69 72 6e 61 6d  d = open(zDirnam
112e0 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49  e, O_RDONLY|O_BI
112f0 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20 20 69 66  NARY, 0);.    if
11300 28 20 66 64 3e 30 20 29 7b 0a 23 69 66 64 65 66  ( fd>0 ){.#ifdef
11310 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20 20 20 20   FD_CLOEXEC.    
11320 20 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45    fcntl(fd, F_SE
11330 54 46 44 2c 20 66 63 6e 74 6c 28 66 64 2c 20 46  TFD, fcntl(fd, F
11340 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f  _GETFD, 0) | FD_
11350 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66  CLOEXEC);.#endif
11360 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 33 28  .      OSTRACE3(
11370 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25 73  "OPENDIR %-3d %s
11380 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d  \n", fd, zDirnam
11390 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
113a0 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20 72 65 74  *pFd = fd;.  ret
113b0 75 72 6e 20 28 66 64 3e 30 3f 53 51 4c 49 54 45  urn (fd>0?SQLITE
113c0 5f 4f 4b 3a 53 51 4c 49 54 45 5f 43 41 4e 54 4f  _OK:SQLITE_CANTO
113d0 50 45 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  PEN);.}../*.** O
113e0 70 65 6e 20 74 68 65 20 66 69 6c 65 20 7a 50 61  pen the file zPa
113f0 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76 69  th..** .** Previ
11400 6f 75 73 6c 79 2c 20 74 68 65 20 53 51 4c 69 74  ously, the SQLit
11410 65 20 4f 53 20 6c 61 79 65 72 20 75 73 65 64 20  e OS layer used 
11420 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 20  three functions 
11430 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 69 73  in place of this
11440 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20  .** one:.**.**  
11450 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e     sqlite3OsOpen
11460 52 65 61 64 57 72 69 74 65 28 29 3b 0a 2a 2a 20  ReadWrite();.** 
11470 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65      sqlite3OsOpe
11480 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20  nReadOnly();.** 
11490 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65      sqlite3OsOpe
114a0 6e 45 78 63 6c 75 73 69 76 65 28 29 3b 0a 2a 2a  nExclusive();.**
114b0 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 73 20  .** These calls 
114c0 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68  correspond to th
114d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62  e following comb
114e0 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67  inations of flag
114f0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 61  s:.**.**     Rea
11500 64 57 72 69 74 65 28 29 20 2d 3e 20 20 20 20 20  dWrite() ->     
11510 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45  (READWRITE | CRE
11520 41 54 45 29 0a 2a 2a 20 20 20 20 20 52 65 61 64  ATE).**     Read
11530 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20 20 28  Only()  ->     (
11540 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20  READONLY) .**   
11550 20 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28    OpenExclusive(
11560 29 20 2d 3e 20 28 52 45 41 44 57 52 49 54 45 20  ) -> (READWRITE 
11570 7c 20 43 52 45 41 54 45 20 7c 20 45 58 43 4c 55  | CREATE | EXCLU
11580 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20  SIVE).**.** The 
11590 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73 69 76  old OpenExclusiv
115a0 65 28 29 20 61 63 63 65 70 74 65 64 20 61 20 62  e() accepted a b
115b0 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74 20  oolean argument 
115c0 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20 49 66 0a  - "delFlag". If.
115d0 2a 2a 20 74 72 75 65 2c 20 74 68 65 20 66 69 6c  ** true, the fil
115e0 65 20 77 61 73 20 63 6f 6e 66 69 67 75 72 65 64  e was configured
115f0 20 74 6f 20 62 65 20 61 75 74 6f 6d 61 74 69 63   to be automatic
11600 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65  ally deleted whe
11610 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 68 61  n the.** file ha
11620 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54 6f 20  ndle closed. To 
11630 61 63 68 69 65 76 65 20 74 68 65 20 73 61 6d 65  achieve the same
11640 20 65 66 66 65 63 74 20 75 73 69 6e 67 20 74 68   effect using th
11650 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74 65 72  is new .** inter
11660 66 61 63 65 2c 20 61 64 64 20 74 68 65 20 44 45  face, add the DE
11670 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c 61 67  LETEONCLOSE flag
11680 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66   to those specif
11690 69 65 64 20 61 62 6f 76 65 20 66 6f 72 20 0a 2a  ied above for .*
116a0 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  * OpenExclusive(
116b0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
116c0 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73 71 6c   unixOpen(.  sql
116d0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
116e0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
116f0 50 61 74 68 2c 20 0a 20 20 73 71 6c 69 74 65 33  Path, .  sqlite3
11700 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 0a 20 20  _file *pFile,.  
11710 69 6e 74 20 66 6c 61 67 73 2c 0a 20 20 69 6e 74  int flags,.  int
11720 20 2a 70 4f 75 74 46 6c 61 67 73 0a 29 7b 0a 20   *pOutFlags.){. 
11730 20 69 6e 74 20 66 64 20 3d 20 30 3b 20 20 20 20   int fd = 0;    
11740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11750 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
11760 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 6f  or returned by o
11770 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 64  pen() */.  int d
11780 69 72 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20  irfd = -1;      
11790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72            /* Dir
117a0 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63  ectory file desc
117b0 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  riptor */.  int 
117c0 6f 66 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20  oflags = 0;     
117d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
117e0 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6f  ags to pass to o
117f0 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65  pen() */.  int e
11800 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46  Type = flags&0xF
11810 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70  FFFFF00;  /* Typ
11820 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65  e of file to ope
11830 6e 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78  n */..  int isEx
11840 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67  clusive  = (flag
11850 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
11860 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e  EXCLUSIVE);.  in
11870 74 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d  t isDelete     =
11880 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
11890 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
118a0 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72  OSE);.  int isCr
118b0 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67  eate     = (flag
118c0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
118d0 43 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69  CREATE);.  int i
118e0 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66  sReadonly   = (f
118f0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
11900 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20  EN_READONLY);.  
11910 69 6e 74 20 69 73 52 65 61 64 57 72 69 74 65 20  int isReadWrite 
11920 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
11930 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
11940 45 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65  E);..  /* If cre
11950 61 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6f  ating a master o
11960 72 20 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72  r main-file jour
11970 6e 61 6c 2c 20 74 68 69 73 20 66 75 6e 63 74 69  nal, this functi
11980 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a  on will open.  *
11990 2a 20 61 20 66 69 6c 65 2d 64 65 73 63 72 69 70  * a file-descrip
119a0 74 6f 72 20 6f 6e 20 74 68 65 20 64 69 72 65 63  tor on the direc
119b0 74 6f 72 79 20 74 6f 6f 2e 20 54 68 65 20 66 69  tory too. The fi
119c0 72 73 74 20 74 69 6d 65 20 75 6e 69 78 53 79 6e  rst time unixSyn
119d0 63 28 29 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c  c().  ** is call
119e0 65 64 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ed the directory
119f0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
11a00 20 77 69 6c 6c 20 62 65 20 66 73 79 6e 63 28 29   will be fsync()
11a10 65 64 20 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e  ed and close()d.
11a20 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 70  .  */.  int isOp
11a30 65 6e 44 69 72 65 63 74 6f 72 79 20 3d 20 28 69  enDirectory = (i
11a40 73 43 72 65 61 74 65 20 26 26 20 0a 20 20 20 20  sCreate && .    
11a50 20 20 28 65 54 79 70 65 3d 3d 53 51 4c 49 54 45    (eType==SQLITE
11a60 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
11a70 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53  RNAL || eType==S
11a80 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
11a90 4a 4f 55 52 4e 41 4c 29 0a 20 20 29 3b 0a 0a 20  JOURNAL).  );.. 
11aa0 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f   /* Check the fo
11ab0 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e  llowing statemen
11ac0 74 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20  ts are true: .  
11ad0 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78  **.  **   (a) Ex
11ae0 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65  actly one of the
11af0 20 52 45 41 44 57 52 49 54 45 20 61 6e 64 20 52   READWRITE and R
11b00 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75  EADONLY flags mu
11b10 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a  st be set, and .
11b20 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52    **   (b) if CR
11b30 45 41 54 45 20 69 73 20 73 65 74 2c 20 74 68 65  EATE is set, the
11b40 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75 73 74  n READWRITE must
11b50 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e   also be set, an
11b60 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20  d.  **   (c) if 
11b70 45 58 43 4c 55 53 49 56 45 20 69 73 20 73 65 74  EXCLUSIVE is set
11b80 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75  , then CREATE mu
11b90 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a  st also be set..
11ba0 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45    **   (d) if DE
11bb0 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73  LETEONCLOSE is s
11bc0 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20  et, then CREATE 
11bd0 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
11be0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
11bf0 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c  (isReadonly==0 |
11c00 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30  | isReadWrite==0
11c10 29 20 26 26 20 28 69 73 52 65 61 64 57 72 69 74  ) && (isReadWrit
11c20 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29  e || isReadonly)
11c30 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43 72  );.  assert(isCr
11c40 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61  eate==0 || isRea
11c50 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72  dWrite);.  asser
11c60 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30  t(isExclusive==0
11c70 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20   || isCreate);. 
11c80 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65   assert(isDelete
11c90 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29  ==0 || isCreate)
11ca0 3b 0a 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69  ;...  /* The mai
11cb0 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e  n DB, main journ
11cc0 61 6c 2c 20 61 6e 64 20 6d 61 73 74 65 72 20 6a  al, and master j
11cd0 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72  ournal are never
11ce0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20   automatically. 
11cf0 20 2a 2a 20 64 65 6c 65 74 65 64 0a 20 20 2a 2f   ** deleted.  */
11d00 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
11d10 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
11d20 49 4e 5f 44 42 20 7c 7c 20 21 69 73 44 65 6c 65  IN_DB || !isDele
11d30 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
11d40 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
11d50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
11d60 7c 7c 20 21 69 73 44 65 6c 65 74 65 20 29 3b 0a  || !isDelete );.
11d70 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21    assert( eType!
11d80 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
11d90 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 21  TER_JOURNAL || !
11da0 69 73 44 65 6c 65 74 65 20 29 3b 0a 0a 20 20 2f  isDelete );..  /
11db0 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  * Assert that th
11dc0 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61  e upper layer ha
11dd0 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65  s set one of the
11de0 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61   "file-type" fla
11df0 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  gs. */.  assert(
11e00 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
11e10 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20  PEN_MAIN_DB     
11e20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
11e30 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a  E_OPEN_TEMP_DB .
11e40 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
11e50 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
11e60 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79  N_JOURNAL || eTy
11e70 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
11e80 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  TEMP_JOURNAL .  
11e90 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
11ea0 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
11eb0 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65  URNAL   || eType
11ec0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
11ed0 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  STER_JOURNAL .  
11ee0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
11ef0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53  QLITE_OPEN_TRANS
11f00 49 45 4e 54 5f 44 42 0a 20 20 29 3b 0a 0a 20 20  IENT_DB.  );..  
11f10 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29  if( isReadonly )
11f20 20 20 6f 66 6c 61 67 73 20 7c 3d 20 4f 5f 52 44    oflags |= O_RD
11f30 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73 52 65  ONLY;.  if( isRe
11f40 61 64 57 72 69 74 65 20 29 20 6f 66 6c 61 67 73  adWrite ) oflags
11f50 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66   |= O_RDWR;.  if
11f60 28 20 69 73 43 72 65 61 74 65 20 29 20 20 20 20  ( isCreate )    
11f70 6f 66 6c 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41  oflags |= O_CREA
11f80 54 3b 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75  T;.  if( isExclu
11f90 73 69 76 65 20 29 20 6f 66 6c 61 67 73 20 7c 3d  sive ) oflags |=
11fa0 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c   (O_EXCL|O_NOFOL
11fb0 4c 4f 57 29 3b 0a 20 20 6f 66 6c 61 67 73 20 7c  LOW);.  oflags |
11fc0 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f  = (O_LARGEFILE|O
11fd0 5f 42 49 4e 41 52 59 29 3b 0a 0a 20 20 6d 65 6d  _BINARY);..  mem
11fe0 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69  set(pFile, 0, si
11ff0 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b  zeof(unixFile));
12000 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a 50 61  .  fd = open(zPa
12010 74 68 2c 20 6f 66 6c 61 67 73 2c 20 69 73 44 65  th, oflags, isDe
12020 6c 65 74 65 3f 30 36 30 30 3a 53 51 4c 49 54 45  lete?0600:SQLITE
12030 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
12040 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 69 66  RMISSIONS);.  if
12050 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 21  ( fd<0 && errno!
12060 3d 45 49 53 44 49 52 20 26 26 20 69 73 52 65 61  =EISDIR && isRea
12070 64 57 72 69 74 65 20 26 26 20 21 69 73 45 78 63  dWrite && !isExc
12080 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 2f 2a  lusive ){.    /*
12090 20 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20   Failed to open 
120a0 74 68 65 20 66 69 6c 65 20 66 6f 72 20 72 65 61  the file for rea
120b0 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20  d/write access. 
120c0 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a  Try read-only. *
120d0 2f 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e  /.    flags &= ~
120e0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
120f0 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
12100 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20 20  EN_CREATE);.    
12110 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
12120 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
12130 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4f 70     return unixOp
12140 65 6e 28 70 56 66 73 2c 20 7a 50 61 74 68 2c 20  en(pVfs, zPath, 
12150 70 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 70 4f  pFile, flags, pO
12160 75 74 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20  utFlags);.  }.  
12170 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
12180 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
12190 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 69 66  NTOPEN;.  }.  if
121a0 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 20 20  ( isDelete ){.  
121b0 20 20 75 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3b    unlink(zPath);
121c0 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 75 74 46  .  }.  if( pOutF
121d0 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a 70 4f 75  lags ){.    *pOu
121e0 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  tFlags = flags;.
121f0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 66 64    }..  assert(fd
12200 21 3d 30 29 3b 0a 20 20 69 66 28 20 69 73 4f 70  !=0);.  if( isOp
12210 65 6e 44 69 72 65 63 74 6f 72 79 20 29 7b 0a 20  enDirectory ){. 
12220 20 20 20 69 6e 74 20 72 63 20 3d 20 6f 70 65 6e     int rc = open
12230 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c  Directory(zPath,
12240 20 26 64 69 72 66 64 29 3b 0a 20 20 20 20 69 66   &dirfd);.    if
12250 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12260 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 66  ){.      close(f
12270 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  d);.      return
12280 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   rc;.    }.  }. 
12290 20 72 65 74 75 72 6e 20 66 69 6c 6c 49 6e 55 6e   return fillInUn
122a0 69 78 46 69 6c 65 28 66 64 2c 20 64 69 72 66 64  ixFile(fd, dirfd
122b0 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 29 3b  , pFile, zPath);
122c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
122d0 20 74 68 65 20 66 69 6c 65 20 61 74 20 7a 50 61   the file at zPa
122e0 74 68 2e 20 49 66 20 74 68 65 20 64 69 72 53 79  th. If the dirSy
122f0 6e 63 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  nc argument is t
12300 72 75 65 2c 20 66 73 79 6e 63 28 29 0a 2a 2a 20  rue, fsync().** 
12310 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 61 66  the directory af
12320 74 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65  ter deleting the
12330 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
12340 20 69 6e 74 20 75 6e 69 78 44 65 6c 65 74 65 28   int unixDelete(
12350 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
12360 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  s, const char *z
12370 50 61 74 68 2c 20 69 6e 74 20 64 69 72 53 79 6e  Path, int dirSyn
12380 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  c){.  int rc = S
12390 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 53 69 6d 75  QLITE_OK;.  Simu
123a0 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
123b0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
123c0 44 45 4c 45 54 45 29 3b 0a 20 20 75 6e 6c 69 6e  DELETE);.  unlin
123d0 6b 28 7a 50 61 74 68 29 3b 0a 20 20 69 66 28 20  k(zPath);.  if( 
123e0 64 69 72 53 79 6e 63 20 29 7b 0a 20 20 20 20 69  dirSync ){.    i
123f0 6e 74 20 66 64 3b 0a 20 20 20 20 72 63 20 3d 20  nt fd;.    rc = 
12400 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 7a 50  openDirectory(zP
12410 61 74 68 2c 20 26 66 64 29 3b 0a 20 20 20 20 69  ath, &fd);.    i
12420 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12430 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66 73   ){.      if( fs
12440 79 6e 63 28 66 64 29 20 29 7b 0a 20 20 20 20 20  ync(fd) ){.     
12450 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
12460 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 3b 0a  OERR_DIR_FSYNC;.
12470 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c        }.      cl
12480 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 20  ose(fd);.    }. 
12490 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
124a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68  }../*.** Test th
124b0 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 6f  e existance of o
124c0 72 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73  r access permiss
124d0 69 6f 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50 61  ions of file zPa
124e0 74 68 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74 20  th. The.** test 
124f0 70 65 72 66 6f 72 6d 65 64 20 64 65 70 65 6e 64  performed depend
12500 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  s on the value o
12510 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20  f flags:.**.**  
12520 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53     SQLITE_ACCESS
12530 5f 45 58 49 53 54 53 3a 20 52 65 74 75 72 6e 20  _EXISTS: Return 
12540 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 65 78  1 if the file ex
12550 69 73 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49  ists.**     SQLI
12560 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52  TE_ACCESS_READWR
12570 49 54 45 3a 20 52 65 74 75 72 6e 20 31 20 69 66  ITE: Return 1 if
12580 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61   the file is rea
12590 64 20 61 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a  d and writable..
125a0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43  **     SQLITE_AC
125b0 43 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52  CESS_READONLY: R
125c0 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66  eturn 1 if the f
125d0 69 6c 65 20 69 73 20 72 65 61 64 61 62 6c 65 2e  ile is readable.
125e0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
125f0 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74   return 0..*/.st
12600 61 74 69 63 20 69 6e 74 20 75 6e 69 78 41 63 63  atic int unixAcc
12610 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ess(sqlite3_vfs 
12620 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61  *pVfs, const cha
12630 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c  r *zPath, int fl
12640 61 67 73 29 7b 0a 20 20 69 6e 74 20 61 6d 6f 64  ags){.  int amod
12650 65 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61  e;.  switch( fla
12660 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  gs ){.    case S
12670 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
12680 53 54 53 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65  STS:.      amode
12690 20 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20 20 20 62   = F_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 57 52 49 54 45 3a 0a 20 20 20 20 20 20 61 6d  DWRITE:.      am
126d0 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b  ode = W_OK|R_OK;
126e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
126f0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
12700 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 20  CESS_READ:.     
12710 20 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b 0a 20   amode = R_OK;. 
12720 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
12730 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
12740 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64  assert(!"Invalid
12750 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22   flags argument"
12760 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
12770 28 61 63 63 65 73 73 28 7a 50 61 74 68 2c 20 61  (access(zPath, a
12780 6d 6f 64 65 29 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a  mode)==0);.}../*
12790 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d  .** Create a tem
127a0 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
127b0 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20   in zBuf.  zBuf 
127c0 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
127d0 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c  d.** by the call
127e0 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20  ing process and 
127f0 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75  must be big enou
12800 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65  gh to hold at le
12810 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50  ast.** pVfs->mxP
12820 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a  athname bytes..*
12830 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
12840 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 73 71 6c  xGetTempname(sql
12850 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
12860 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
12870 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20  zBuf){.  static 
12880 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69  const char *azDi
12890 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c  rs[] = {.     0,
128a0 0a 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70 22  .     "/var/tmp"
128b0 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f 74 6d 70  ,.     "/usr/tmp
128c0 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a  ",.     "/tmp",.
128d0 20 20 20 20 20 22 2e 22 2c 0a 20 20 7d 3b 0a 20       ".",.  };. 
128e0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e   static const un
128f0 73 69 67 6e 65 64 20 63 68 61 72 20 7a 43 68 61  signed char zCha
12900 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64  rs[] =.    "abcd
12910 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
12920 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43  uvwxyz".    "ABC
12930 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53  DEFGHIJKLMNOPQRS
12940 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31  TUVWXYZ".    "01
12950 32 33 34 35 36 37 38 39 22 3b 0a 20 20 69 6e 74  23456789";.  int
12960 20 69 2c 20 6a 3b 0a 20 20 73 74 72 75 63 74 20   i, j;.  struct 
12970 73 74 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73  stat buf;.  cons
12980 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 22  t char *zDir = "
12990 2e 22 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f  .";..  /* It's o
129a0 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  dd to simulate a
129b0 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c  n io-error here,
129c0 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73   but really this
129d0 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73   is just.  ** us
129e0 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72  ing the io-error
129f0 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
12a00 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
12a10 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73  ite handles this
12a20 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  .  ** function f
12a30 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20  ailing. .  */.  
12a40 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
12a50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
12a60 52 52 4f 52 20 29 3b 0a 0a 20 20 61 7a 44 69 72  RROR );..  azDir
12a70 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 74  s[0] = sqlite3_t
12a80 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20  emp_directory;. 
12a90 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
12aa0 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f  of(azDirs)/sizeo
12ab0 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 69 2b  f(azDirs[0]); i+
12ac0 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 7a 44 69  +){.    if( azDi
12ad0 72 73 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69  rs[i]==0 ) conti
12ae0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 74 61  nue;.    if( sta
12af0 74 28 61 7a 44 69 72 73 5b 69 5d 2c 20 26 62 75  t(azDirs[i], &bu
12b00 66 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  f) ) continue;. 
12b10 20 20 20 69 66 28 20 21 53 5f 49 53 44 49 52 28     if( !S_ISDIR(
12b20 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63  buf.st_mode) ) c
12b30 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
12b40 20 61 63 63 65 73 73 28 61 7a 44 69 72 73 5b 69   access(azDirs[i
12b50 5d 2c 20 30 37 29 20 29 20 63 6f 6e 74 69 6e 75  ], 07) ) continu
12b60 65 3b 0a 20 20 20 20 7a 44 69 72 20 3d 20 61 7a  e;.    zDir = az
12b70 44 69 72 73 5b 69 5d 3b 0a 20 20 20 20 62 72 65  Dirs[i];.    bre
12b80 61 6b 3b 0a 20 20 7d 0a 20 20 64 6f 7b 0a 20 20  ak;.  }.  do{.  
12b90 20 20 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e    assert( pVfs->
12ba0 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f  mxPathname==MAX_
12bb0 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20 20 20  PATHNAME );.    
12bc0 61 73 73 65 72 74 28 20 6e 42 75 66 3e 3d 4d 41  assert( nBuf>=MA
12bd0 58 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20  X_PATHNAME );.  
12be0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
12bf0 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2d  tf(MAX_PATHNAME-
12c00 31 37 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53  17, zBuf, "%s/"S
12c10 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
12c20 50 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20  PREFIX, zDir);. 
12c30 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e 28 7a 42     j = strlen(zB
12c40 75 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  uf);.    sqlite3
12c50 52 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26  Randomness(15, &
12c60 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f  zBuf[j]);.    fo
12c70 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b  r(i=0; i<15; i++
12c80 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42  , j++){.      zB
12c90 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43  uf[j] = (char)zC
12ca0 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64  hars[ ((unsigned
12cb0 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28   char)zBuf[j])%(
12cc0 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31  sizeof(zChars)-1
12cd0 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  ) ];.    }.    z
12ce0 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 77  Buf[j] = 0;.  }w
12cf0 68 69 6c 65 28 20 61 63 63 65 73 73 28 7a 42 75  hile( access(zBu
12d00 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  f,0)==0 );.  ret
12d10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
12d20 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20  .../*.** Turn a 
12d30 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
12d40 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61  e into a full pa
12d50 74 68 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c 61  thname. The rela
12d60 74 69 76 65 20 70 61 74 68 0a 2a 2a 20 69 73 20  tive path.** is 
12d70 73 74 6f 72 65 64 20 61 73 20 61 20 6e 75 6c 2d  stored as a nul-
12d80 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
12d90 67 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20  g in the buffer 
12da0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a  pointed to by.**
12db0 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a   zPath. .**.** z
12dc0 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  Out points to a 
12dd0 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61  buffer of at lea
12de0 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d  st sqlite3_vfs.m
12df0 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 20  xPathname bytes 
12e00 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20 63 61 73  .** (in this cas
12e10 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20  e, MAX_PATHNAME 
12e20 62 79 74 65 73 29 2e 20 54 68 65 20 66 75 6c 6c  bytes). The full
12e30 2d 70 61 74 68 20 69 73 20 77 72 69 74 74 65 6e  -path is written
12e40 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66 66   to.** this buff
12e50 65 72 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  er before return
12e60 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
12e70 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e  nt unixFullPathn
12e80 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ame(.  sqlite3_v
12e90 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
12ea0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
12eb0 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f  to vfs object */
12ec0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
12ed0 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  Path,           
12ee0 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c   /* Possibly rel
12ef0 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 68  ative input path
12f00 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20   */.  int nOut, 
12f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f      /* Size of o
12f30 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20  utput buffer in 
12f40 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  bytes */.  char 
12f50 2a 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  *zOut           
12f60 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
12f70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a  ut buffer */.){.
12f80 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74  .  /* It's odd t
12f90 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f  o simulate an io
12fa0 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74  -error here, but
12fb0 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20   really this is 
12fc0 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20  just.  ** using 
12fd0 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66  the io-error inf
12fe0 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74  rastructure to t
12ff0 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
13000 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a  handles this.  *
13010 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69  * function faili
13020 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ng. This functio
13030 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c  n could fail if,
13040 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   for example, th
13050 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77  e.  ** current w
13060 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6c 79 20  orking directly 
13070 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65  has been unlinke
13080 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  d..  */.  Simula
13090 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
130a0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  n SQLITE_ERROR )
130b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 56 66  ;..  assert( pVf
130c0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d  s->mxPathname==M
130d0 41 58 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20  AX_PATHNAME );. 
130e0 20 7a 4f 75 74 5b 4d 41 58 5f 50 41 54 48 4e 41   zOut[MAX_PATHNA
130f0 4d 45 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  ME-1] = '\0';.  
13100 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f  if( zPath[0]=='/
13110 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ' ){.    sqlite3
13120 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41  _snprintf(MAX_PA
13130 54 48 4e 41 4d 45 2c 20 7a 4f 75 74 2c 20 22 25  THNAME, zOut, "%
13140 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 65  s", zPath);.  }e
13150 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 77  lse{.    int nCw
13160 64 3b 0a 20 20 20 20 69 66 28 20 67 65 74 63 77  d;.    if( getcw
13170 64 28 7a 4f 75 74 2c 20 4d 41 58 5f 50 41 54 48  d(zOut, MAX_PATH
13180 4e 41 4d 45 2d 31 29 3d 3d 30 20 29 7b 0a 20 20  NAME-1)==0 ){.  
13190 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
131a0 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20  E_CANTOPEN;.    
131b0 7d 0a 20 20 20 20 6e 43 77 64 20 3d 20 73 74 72  }.    nCwd = str
131c0 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20 20 20 20 73  len(zOut);.    s
131d0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
131e0 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2d 6e 43 77  MAX_PATHNAME-nCw
131f0 64 2c 20 26 7a 4f 75 74 5b 6e 43 77 64 5d 2c 20  d, &zOut[nCwd], 
13200 22 2f 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20  "/%s", zPath);. 
13210 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
13220 54 45 5f 4f 4b 3b 0a 0a 23 69 66 20 30 0a 20 20  TE_OK;..#if 0.  
13230 2f 2a 0a 20 20 2a 2a 20 52 65 6d 6f 76 65 20 22  /*.  ** Remove "
13240 2f 2e 2f 22 20 70 61 74 68 20 65 6c 65 6d 65 6e  /./" path elemen
13250 74 73 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 22  ts and convert "
13260 2f 41 2f 2e 2f 22 20 70 61 74 68 20 65 6c 65 6d  /A/./" path elem
13270 65 6e 74 73 0a 20 20 2a 2a 20 74 6f 20 6a 75 73  ents.  ** to jus
13280 74 20 22 2f 22 2e 0a 20 20 2a 2f 0a 20 20 69 66  t "/"..  */.  if
13290 28 20 7a 46 75 6c 6c 20 29 7b 0a 20 20 20 20 69  ( zFull ){.    i
132a0 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f 72  nt i, j;.    for
132b0 28 69 3d 6a 3d 30 3b 20 7a 46 75 6c 6c 5b 69 5d  (i=j=0; zFull[i]
132c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
132d0 28 20 7a 46 75 6c 6c 5b 69 5d 3d 3d 27 2f 27 20  ( zFull[i]=='/' 
132e0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ){.        if( z
132f0 46 75 6c 6c 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29  Full[i+1]=='/' )
13300 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
13310 20 20 20 69 66 28 20 7a 46 75 6c 6c 5b 69 2b 31     if( zFull[i+1
13320 5d 3d 3d 27 2e 27 20 26 26 20 7a 46 75 6c 6c 5b  ]=='.' && zFull[
13330 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  i+2]=='/' ){.   
13340 20 20 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20         i += 1;. 
13350 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
13360 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
13370 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 5b 69       if( zFull[i
13380 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 7a 46 75 6c  +1]=='.' && zFul
13390 6c 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a  l[i+2]=='.' && z
133a0 46 75 6c 6c 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29  Full[i+3]=='/' )
133b0 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
133c0 65 28 20 6a 3e 30 20 26 26 20 7a 46 75 6c 6c 5b  e( j>0 && zFull[
133d0 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d  j-1]!='/' ){ j--
133e0 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 20  ; }.          i 
133f0 2b 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20  += 3;.          
13400 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
13410 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
13420 20 20 7a 46 75 6c 6c 5b 6a 2b 2b 5d 20 3d 20 7a    zFull[j++] = z
13430 46 75 6c 6c 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  Full[i];.    }. 
13440 20 20 20 7a 46 75 6c 6c 5b 6a 5d 20 3d 20 30 3b     zFull[j] = 0;
13450 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a  .  }.#endif.}...
13460 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13470 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
13480 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61  ON./*.** Interfa
13490 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20  ces for opening 
134a0 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  a shared library
134b0 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20  , finding entry 
134c0 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e  points.** within
134d0 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
134e0 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67  ary, and closing
134f0 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
13500 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ary..*/.#include
13510 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74 69   <dlfcn.h>.stati
13520 63 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f 70  c void *unixDlOp
13530 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  en(sqlite3_vfs *
13540 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72  pVfs, const char
13550 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
13560 72 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46  return dlopen(zF
13570 69 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f  ilename, RTLD_NO
13580 57 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29  W | RTLD_GLOBAL)
13590 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74  ;.}../*.** SQLit
135a0 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e  e calls this fun
135b0 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c  ction immediatel
135c0 79 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74  y after a call t
135d0 6f 20 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f 72  o unixDlSym() or
135e0 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28 29  .** unixDlOpen()
135f0 20 66 61 69 6c 73 20 28 72 65 74 75 72 6e 73 20   fails (returns 
13600 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29 2e  a null pointer).
13610 20 49 66 20 61 20 6d 6f 72 65 20 64 65 74 61 69   If a more detai
13620 6c 65 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73  led error.** mes
13630 73 61 67 65 20 69 73 20 61 76 61 69 6c 61 62 6c  sage is availabl
13640 65 2c 20 69 74 20 69 73 20 77 72 69 74 74 65 6e  e, it is written
13650 20 74 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66 20   to zBufOut. If 
13660 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  no error message
13670 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65  .** is available
13680 2c 20 7a 42 75 66 4f 75 74 20 69 73 20 6c 65 66  , zBufOut is lef
13690 74 20 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e 64  t unmodified and
136a0 20 53 51 4c 69 74 65 20 75 73 65 73 20 61 20 64   SQLite uses a d
136b0 65 66 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72 20  efault.** error 
136c0 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  message..*/.stat
136d0 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 45 72  ic void unixDlEr
136e0 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
136f0 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c  *pVfs, int nBuf,
13700 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b   char *zBufOut){
13710 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20  .  char *zErr;. 
13720 20 65 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20   enterMutex();. 
13730 20 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f 72 28   zErr = dlerror(
13740 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b  );.  if( zErr ){
13750 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
13760 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66  rintf(nBuf, zBuf
13770 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45 72 72 29  Out, "%s", zErr)
13780 3b 0a 20 20 7d 0a 20 20 6c 65 61 76 65 4d 75 74  ;.  }.  leaveMut
13790 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ex();.}.static v
137a0 6f 69 64 20 2a 75 6e 69 78 44 6c 53 79 6d 28 73  oid *unixDlSym(s
137b0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
137c0 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 2c  , void *pHandle,
137d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79   const char *zSy
137e0 6d 62 6f 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20  mbol){.  return 
137f0 64 6c 73 79 6d 28 70 48 61 6e 64 6c 65 2c 20 7a  dlsym(pHandle, z
13800 53 79 6d 62 6f 6c 29 3b 0a 7d 0a 73 74 61 74 69  Symbol);.}.stati
13810 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 43 6c 6f  c void unixDlClo
13820 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  se(sqlite3_vfs *
13830 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e  pVfs, void *pHan
13840 64 6c 65 29 7b 0a 20 20 64 6c 63 6c 6f 73 65 28  dle){.  dlclose(
13850 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73  pHandle);.}.#els
13860 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f  e /* if SQLITE_O
13870 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
13880 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a  ON is defined: *
13890 2f 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78  /.  #define unix
138a0 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66  DlOpen  0.  #def
138b0 69 6e 65 20 75 6e 69 78 44 6c 45 72 72 6f 72 20  ine unixDlError 
138c0 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78  0.  #define unix
138d0 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66  DlSym   0.  #def
138e0 69 6e 65 20 75 6e 69 78 44 6c 43 6c 6f 73 65 20  ine unixDlClose 
138f0 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
13900 57 72 69 74 65 20 6e 42 75 66 20 62 79 74 65 73  Write nBuf bytes
13910 20 6f 66 20 72 61 6e 64 6f 6d 20 64 61 74 61 20   of random data 
13920 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
13930 62 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a  buffer zBuf..*/.
13940 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52  static int unixR
13950 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65  andomness(sqlite
13960 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
13970 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
13980 66 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 6e 42  f){..  assert(nB
13990 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65  uf>=(sizeof(time
139a0 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29  _t)+sizeof(int))
139b0 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65  );..  /* We have
139c0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a   to initialize z
139d0 42 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76  Buf to prevent v
139e0 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70  algrind from rep
139f0 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f  orting.  ** erro
13a00 72 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73  rs.  The reports
13a10 20 69 73 73 75 65 64 20 62 79 20 76 61 6c 67 72   issued by valgr
13a20 69 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63  ind are incorrec
13a30 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a  t - we would.  *
13a40 2a 20 70 72 65 66 65 72 20 74 68 61 74 20 74 68  * prefer that th
13a50 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20  e randomness be 
13a60 69 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b  increased by mak
13a70 69 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20  ing use of the. 
13a80 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   ** uninitialize
13a90 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20  d space in zBuf 
13aa0 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65  - but valgrind e
13ab0 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f  rrors tend to wo
13ac0 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73  rry.  ** some us
13ad0 65 72 73 2e 20 20 52 61 74 68 65 72 20 74 68 61  ers.  Rather tha
13ae0 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d  n argue, it seem
13af0 73 20 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f  s easier just to
13b00 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a   initialize.  **
13b10 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79   the whole array
13b20 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c   and silence val
13b30 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74  grind, even if t
13b40 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72  hat means less r
13b50 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69  andomness.  ** i
13b60 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65  n the random see
13b70 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  d..  **.  ** Whe
13b80 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69  n testing, initi
13b90 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74  alizing zBuf[] t
13ba0 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65  o zero is all we
13bb0 20 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73   do.  That means
13bc0 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c  .  ** that we al
13bd0 77 61 79 73 20 75 73 65 20 74 68 65 20 73 61 6d  ways use the sam
13be0 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  e random number 
13bf0 73 65 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20  sequence.  This 
13c00 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74  makes the.  ** t
13c10 65 73 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e  ests repeatable.
13c20 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a  .  */.  memset(z
13c30 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23  Buf, 0, nBuf);.#
13c40 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
13c50 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20 20  TE_TEST).  {.   
13c60 20 69 6e 74 20 70 69 64 2c 20 66 64 3b 0a 20 20   int pid, fd;.  
13c70 20 20 66 64 20 3d 20 6f 70 65 6e 28 22 2f 64 65    fd = open("/de
13c80 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44  v/urandom", O_RD
13c90 4f 4e 4c 59 29 3b 0a 20 20 20 20 69 66 28 20 66  ONLY);.    if( f
13ca0 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 74 69 6d  d<0 ){.      tim
13cb0 65 5f 74 20 74 3b 0a 20 20 20 20 20 20 74 69 6d  e_t t;.      tim
13cc0 65 28 26 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d  e(&t);.      mem
13cd0 63 70 79 28 7a 42 75 66 2c 20 26 74 2c 20 73 69  cpy(zBuf, &t, si
13ce0 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20 20 20 20  zeof(t));.      
13cf0 70 69 64 20 3d 20 67 65 74 70 69 64 28 29 3b 0a  pid = getpid();.
13d00 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42        memcpy(&zB
13d10 75 66 5b 73 69 7a 65 6f 66 28 74 29 5d 2c 20 26  uf[sizeof(t)], &
13d20 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29  pid, sizeof(pid)
13d30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
13d40 20 20 20 20 72 65 61 64 28 66 64 2c 20 7a 42 75      read(fd, zBu
13d50 66 2c 20 6e 42 75 66 29 3b 0a 20 20 20 20 20 20  f, nBuf);.      
13d60 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d  close(fd);.    }
13d70 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
13d80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13d90 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20  }.../*.** Sleep 
13da0 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69  for a little whi
13db0 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  le.  Return the 
13dc0 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73  amount of time s
13dd0 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61 72 67  lept..** The arg
13de0 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 75 6d  ument is the num
13df0 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f  ber of microseco
13e00 6e 64 73 20 77 65 20 77 61 6e 74 20 74 6f 20 73  nds we want to s
13e10 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72 65 74  leep..** The ret
13e20 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
13e30 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f   number of micro
13e40 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65 65 70  seconds of sleep
13e50 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 71   actually.** req
13e60 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 20  uested from the 
13e70 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61  underlying opera
13e80 74 69 6e 67 20 73 79 73 74 65 6d 2c 20 61 20 6e  ting system, a n
13e90 75 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a 20 6d  umber which.** m
13ea0 69 67 68 74 20 62 65 20 67 72 65 61 74 65 72 20  ight be greater 
13eb0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
13ec0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 62   the argument, b
13ed0 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20 74  ut not less.** t
13ee0 68 61 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74  han the argument
13ef0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13f00 75 6e 69 78 53 6c 65 65 70 28 73 71 6c 69 74 65  unixSleep(sqlite
13f10 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
13f20 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0a   microseconds){.
13f30 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  #if defined(HAVE
13f40 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41 56 45  _USLEEP) && HAVE
13f50 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c 65 65 70  _USLEEP.  usleep
13f60 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a  (microseconds);.
13f70 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65    return microse
13f80 63 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69  conds;.#else.  i
13f90 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69  nt seconds = (mi
13fa0 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39 39  croseconds+99999
13fb0 39 29 2f 31 30 30 30 30 30 30 3b 0a 20 20 73 6c  9)/1000000;.  sl
13fc0 65 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20  eep(seconds);.  
13fd0 72 65 74 75 72 6e 20 73 65 63 6f 6e 64 73 2a 31  return seconds*1
13fe0 30 30 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a 7d  000000;.#endif.}
13ff0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
14000 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20  owing variable, 
14010 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d  if set to a non-
14020 7a 65 72 6f 20 76 61 6c 75 65 2c 20 62 65 63 6f  zero value, beco
14030 6d 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  mes the result.*
14040 2a 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20  * returned from 
14050 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74  sqlite3OsCurrent
14060 54 69 6d 65 28 29 2e 20 20 54 68 69 73 20 69 73  Time().  This is
14070 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
14080 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  g..*/.#ifdef SQL
14090 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
140a0 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
140b0 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  e = 0;.#endif../
140c0 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
140d0 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
140e0 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
140f0 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
14100 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  te the.** curren
14110 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
14120 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
14130 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e  number into *prN
14140 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  ow and.** return
14150 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66   0.  Return 1 if
14160 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
14170 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  te cannot be fou
14180 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
14190 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d  t unixCurrentTim
141a0 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  e(sqlite3_vfs *p
141b0 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e  Vfs, double *prN
141c0 6f 77 29 7b 0a 23 69 66 64 65 66 20 4e 4f 5f 47  ow){.#ifdef NO_G
141d0 45 54 54 4f 44 0a 20 20 74 69 6d 65 5f 74 20 74  ETTOD.  time_t t
141e0 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20  ;.  time(&t);.  
141f0 2a 70 72 4e 6f 77 20 3d 20 74 2f 38 36 34 30 30  *prNow = t/86400
14200 2e 30 20 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a  .0 + 2440587.5;.
14210 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 74  #else.  struct t
14220 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20 20 67  imeval sNow;.  g
14230 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f  ettimeofday(&sNo
14240 77 2c 20 30 29 3b 0a 20 20 2a 70 72 4e 6f 77 20  w, 0);.  *prNow 
14250 3d 20 32 34 34 30 35 38 37 2e 35 20 2b 20 73 4e  = 2440587.5 + sN
14260 6f 77 2e 74 76 5f 73 65 63 2f 38 36 34 30 30 2e  ow.tv_sec/86400.
14270 30 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63  0 + sNow.tv_usec
14280 2f 38 36 34 30 30 30 30 30 30 30 30 2e 30 3b 0a  /86400000000.0;.
14290 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
142a0 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
142b0 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
142c0 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 72 4e  time ){.    *prN
142d0 6f 77 20 3d 20 73 71 6c 69 74 65 33 5f 63 75 72  ow = sqlite3_cur
142e0 72 65 6e 74 5f 74 69 6d 65 2f 38 36 34 30 30 2e  rent_time/86400.
142f0 30 20 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a 20  0 + 2440587.5;. 
14300 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
14310 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
14320 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
14330 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 44 65  to the sqlite3De
14340 66 61 75 6c 74 56 66 73 20 73 74 72 75 63 74 75  faultVfs structu
14350 72 65 2e 20 20 20 57 65 20 75 73 65 0a 2a 2a 20  re.   We use.** 
14360 61 20 66 75 6e 63 74 69 6f 6e 20 72 61 74 68 65  a function rathe
14370 72 20 74 68 61 6e 20 67 69 76 65 20 74 68 65 20  r than give the 
14380 73 74 72 75 63 74 75 72 65 20 67 6c 6f 62 61 6c  structure global
14390 20 73 63 6f 70 65 20 62 65 63 61 75 73 65 0a 2a   scope because.*
143a0 2a 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73  * some compilers
143b0 20 28 4d 53 56 43 29 20 64 6f 20 6e 6f 74 20 61   (MSVC) do not a
143c0 6c 6c 6f 77 20 66 6f 72 77 61 72 64 20 64 65 63  llow forward dec
143d0 6c 61 72 61 74 69 6f 6e 73 20 6f 66 0a 2a 2a 20  larations of.** 
143e0 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 74 72 75  initialized stru
143f0 63 74 75 72 65 73 2e 0a 2a 2f 0a 73 71 6c 69 74  ctures..*/.sqlit
14400 65 33 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 4f  e3_vfs *sqlite3O
14410 73 44 65 66 61 75 6c 74 56 66 73 28 76 6f 69 64  sDefaultVfs(void
14420 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69  ){.  static sqli
14430 74 65 33 5f 76 66 73 20 75 6e 69 78 56 66 73 20  te3_vfs unixVfs 
14440 3d 20 7b 0a 20 20 20 20 31 2c 20 20 20 20 20 20  = {.    1,      
14450 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
14460 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73  Version */.    s
14470 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 2c  izeof(unixFile),
14480 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a     /* szOsFile *
14490 2f 0a 20 20 20 20 4d 41 58 5f 50 41 54 48 4e 41  /.    MAX_PATHNA
144a0 4d 45 2c 20 20 20 20 20 20 20 2f 2a 20 6d 78 50  ME,       /* mxP
144b0 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30  athname */.    0
144c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
144d0 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20     /* pNext */. 
144e0 20 20 20 22 75 6e 69 78 22 2c 20 20 20 20 20 20     "unix",      
144f0 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20         /* zName 
14500 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
14510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41             /* pA
14520 70 70 44 61 74 61 20 2a 2f 0a 20 20 0a 20 20 20  ppData */.  .   
14530 20 75 6e 69 78 4f 70 65 6e 2c 20 20 20 20 20 20   unixOpen,      
14540 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f       /* xOpen */
14550 0a 20 20 20 20 75 6e 69 78 44 65 6c 65 74 65 2c  .    unixDelete,
14560 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c           /* xDel
14570 65 74 65 20 2a 2f 0a 20 20 20 20 75 6e 69 78 41  ete */.    unixA
14580 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 2f  ccess,         /
14590 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20  * xAccess */.   
145a0 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65   unixGetTempname
145b0 2c 20 20 20 20 2f 2a 20 78 47 65 74 54 65 6d 70  ,    /* xGetTemp
145c0 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 75 6e 69 78  Name */.    unix
145d0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20  FullPathname,   
145e0 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  /* xFullPathname
145f0 20 2a 2f 0a 20 20 20 20 75 6e 69 78 44 6c 4f 70   */.    unixDlOp
14600 65 6e 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78  en,         /* x
14610 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 75 6e  DlOpen */.    un
14620 69 78 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20  ixDlError,      
14630 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f    /* xDlError */
14640 0a 20 20 20 20 75 6e 69 78 44 6c 53 79 6d 2c 20  .    unixDlSym, 
14650 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53           /* xDlS
14660 79 6d 20 2a 2f 0a 20 20 20 20 75 6e 69 78 44 6c  ym */.    unixDl
14670 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Close,        /*
14680 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20   xDlClose */.   
14690 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 2c   unixRandomness,
146a0 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e       /* xRandomn
146b0 65 73 73 20 2a 2f 0a 20 20 20 20 75 6e 69 78 53  ess */.    unixS
146c0 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 2f  leep,          /
146d0 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20  * xSleep */.    
146e0 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 20  unixCurrentTime 
146f0 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54      /* xCurrentT
14700 69 6d 65 20 2a 2f 0a 20 20 7d 3b 0a 20 20 0a 20  ime */.  };.  . 
14710 20 72 65 74 75 72 6e 20 26 75 6e 69 78 56 66 73   return &unixVfs
14720 3b 0a 7d 0a 20 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.}. .#endif /* 
14730 4f 53 5f 55 4e 49 58 20 2a 2f 0a                 OS_UNIX */.